diff --git a/core/src/main/java/google/registry/ui/server/console/ConsoleApiAction.java b/core/src/main/java/google/registry/ui/server/console/ConsoleApiAction.java index 8ac5e94a9..306d22e5e 100644 --- a/core/src/main/java/google/registry/ui/server/console/ConsoleApiAction.java +++ b/core/src/main/java/google/registry/ui/server/console/ConsoleApiAction.java @@ -16,6 +16,7 @@ package google.registry.ui.server.console; import static com.google.common.collect.ImmutableList.toImmutableList; import static com.google.common.collect.ImmutableSet.toImmutableSet; +import static google.registry.persistence.transaction.TransactionManagerFactory.tm; import static google.registry.request.Action.Method.DELETE; import static google.registry.request.Action.Method.GET; import static google.registry.request.Action.Method.HEAD; @@ -36,6 +37,7 @@ import google.registry.batch.CloudTasksUtils; import google.registry.config.RegistryConfig; import google.registry.export.sheet.SyncRegistrarsSheetAction; import google.registry.model.console.ConsolePermission; +import google.registry.model.console.ConsoleUpdateHistory; import google.registry.model.console.User; import google.registry.model.registrar.Registrar; import google.registry.model.registrar.RegistrarPoc; @@ -260,6 +262,14 @@ public abstract class ConsoleApiAction implements Runnable { } } + protected void finishAndPersistConsoleUpdateHistory(ConsoleUpdateHistory.Builder builder) { + builder.setActingUser(consoleApiParams.authResult().user().get()); + builder.setUrl(consoleApiParams.request().getRequestURI()); + builder.setMethod(consoleApiParams.request().getMethod()); + builder.setModificationTime(tm().getTransactionTime()); + tm().put(builder.build()); + } + /** Specialized exception class used for failure when a user doesn't have the right permission. */ private static class ConsolePermissionForbiddenException extends RuntimeException { private ConsolePermissionForbiddenException(String message) { diff --git a/core/src/main/java/google/registry/ui/server/console/ConsoleApiParams.java b/core/src/main/java/google/registry/ui/server/console/ConsoleApiParams.java index 7a1599eca..71fd4c6e1 100644 --- a/core/src/main/java/google/registry/ui/server/console/ConsoleApiParams.java +++ b/core/src/main/java/google/registry/ui/server/console/ConsoleApiParams.java @@ -14,6 +14,7 @@ package google.registry.ui.server.console; +import com.google.gson.Gson; import google.registry.request.Response; import google.registry.request.auth.AuthResult; import google.registry.security.XsrfTokenManager; @@ -26,13 +27,16 @@ public record ConsoleApiParams( Response response, AuthResult authResult, SendEmailUtils sendEmailUtils, - XsrfTokenManager xsrfTokenManager) { + XsrfTokenManager xsrfTokenManager, + Gson gson) { public static ConsoleApiParams create( HttpServletRequest request, Response response, AuthResult authResult, SendEmailUtils sendEmailUtils, - XsrfTokenManager xsrfTokenManager) { - return new ConsoleApiParams(request, response, authResult, sendEmailUtils, xsrfTokenManager); + XsrfTokenManager xsrfTokenManager, + Gson gson) { + return new ConsoleApiParams( + request, response, authResult, sendEmailUtils, xsrfTokenManager, gson); } } diff --git a/core/src/main/java/google/registry/ui/server/console/ConsoleDomainGetAction.java b/core/src/main/java/google/registry/ui/server/console/ConsoleDomainGetAction.java index 0ce8c8075..216a4f512 100644 --- a/core/src/main/java/google/registry/ui/server/console/ConsoleDomainGetAction.java +++ b/core/src/main/java/google/registry/ui/server/console/ConsoleDomainGetAction.java @@ -18,7 +18,6 @@ import static google.registry.persistence.transaction.TransactionManagerFactory. import static jakarta.servlet.http.HttpServletResponse.SC_NOT_FOUND; import static jakarta.servlet.http.HttpServletResponse.SC_OK; -import com.google.gson.Gson; import google.registry.model.EppResourceUtils; import google.registry.model.console.ConsolePermission; import google.registry.model.console.User; @@ -41,17 +40,14 @@ public class ConsoleDomainGetAction extends ConsoleApiAction { public static final String PATH = "/console-api/domain"; - private final Gson gson; private final String paramDomain; @Inject public ConsoleDomainGetAction( ConsoleApiParams consoleApiParams, - Gson gson, @Parameter("consoleDomain") String paramDomain) { super(consoleApiParams); this.paramDomain = paramDomain; - this.gson = gson; } @Override @@ -72,6 +68,6 @@ public class ConsoleDomainGetAction extends ConsoleApiAction { return; } consoleApiParams.response().setStatus(SC_OK); - consoleApiParams.response().setPayload(gson.toJson(domain)); + consoleApiParams.response().setPayload(consoleApiParams.gson().toJson(domain)); } } diff --git a/core/src/main/java/google/registry/ui/server/console/ConsoleDomainListAction.java b/core/src/main/java/google/registry/ui/server/console/ConsoleDomainListAction.java index 1d852e4b0..3250f9ae2 100644 --- a/core/src/main/java/google/registry/ui/server/console/ConsoleDomainListAction.java +++ b/core/src/main/java/google/registry/ui/server/console/ConsoleDomainListAction.java @@ -21,7 +21,6 @@ import static jakarta.servlet.http.HttpServletResponse.SC_OK; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Ascii; -import com.google.gson.Gson; import com.google.gson.annotations.Expose; import google.registry.model.CreateAutoTimestamp; import google.registry.model.console.User; @@ -55,7 +54,6 @@ public class ConsoleDomainListAction extends ConsoleApiAction { private static final String SEARCH_TERM_QUERY = " AND LOWER(domainName) LIKE :searchTerm"; private static final String ORDER_BY_STATEMENT = " ORDER BY creationTime DESC"; - private final Gson gson; private final String registrarId; private final Optional checkpointTime; private final int pageNumber; @@ -66,7 +64,6 @@ public class ConsoleDomainListAction extends ConsoleApiAction { @Inject public ConsoleDomainListAction( ConsoleApiParams consoleApiParams, - Gson gson, @Parameter("registrarId") String registrarId, @Parameter("checkpointTime") Optional checkpointTime, @Parameter("pageNumber") Optional pageNumber, @@ -74,7 +71,6 @@ public class ConsoleDomainListAction extends ConsoleApiAction { @Parameter("totalResults") Optional totalResults, @Parameter("searchTerm") Optional searchTerm) { super(consoleApiParams); - this.gson = gson; this.registrarId = registrarId; this.checkpointTime = checkpointTime; this.pageNumber = pageNumber.orElse(0); @@ -120,7 +116,10 @@ public class ConsoleDomainListAction extends ConsoleApiAction { consoleApiParams .response() - .setPayload(gson.toJson(new DomainListResult(domains, checkpoint, actualTotalResults))); + .setPayload( + consoleApiParams + .gson() + .toJson(new DomainListResult(domains, checkpoint, actualTotalResults))); consoleApiParams.response().setStatus(SC_OK); } diff --git a/core/src/main/java/google/registry/ui/server/console/ConsoleEppPasswordAction.java b/core/src/main/java/google/registry/ui/server/console/ConsoleEppPasswordAction.java index a801d186e..08b96359e 100644 --- a/core/src/main/java/google/registry/ui/server/console/ConsoleEppPasswordAction.java +++ b/core/src/main/java/google/registry/ui/server/console/ConsoleEppPasswordAction.java @@ -27,6 +27,8 @@ import com.google.common.collect.ImmutableSet; import com.google.gson.annotations.Expose; import google.registry.flows.EppException.AuthenticationErrorException; import google.registry.flows.PasswordOnlyTransportCredentials; +import google.registry.model.console.ConsoleUpdateHistory; +import google.registry.model.console.RegistrarUpdateHistory; import google.registry.model.console.User; import google.registry.model.registrar.Registrar; import google.registry.request.Action; @@ -53,7 +55,6 @@ public class ConsoleEppPasswordAction extends ConsoleApiAction { private final PasswordOnlyTransportCredentials credentials = new PasswordOnlyTransportCredentials(); private final AuthenticatedRegistrarAccessor registrarAccessor; - private final Optional eppPasswordChangeRequest; @Inject @@ -106,6 +107,14 @@ public class ConsoleEppPasswordAction extends ConsoleApiAction { Registrar updatedRegistrar = registrar.asBuilder().setPassword(eppRequestBody.newPassword()).build(); tm().put(updatedRegistrar); + EppPasswordData sanitizedData = + new EppPasswordData( + eppRequestBody.registrarId, "********", "••••••••", "••••••••"); + finishAndPersistConsoleUpdateHistory( + new RegistrarUpdateHistory.Builder() + .setType(ConsoleUpdateHistory.Type.REGISTRAR_UPDATE) + .setRegistrar(updatedRegistrar) + .setRequestBody(consoleApiParams.gson().toJson(sanitizedData))); sendExternalUpdates( ImmutableMap.of("password", new DiffUtils.DiffPair("********", "••••••••")), registrar, diff --git a/core/src/main/java/google/registry/ui/server/console/ConsoleModule.java b/core/src/main/java/google/registry/ui/server/console/ConsoleModule.java index 737de470e..0a6257198 100644 --- a/core/src/main/java/google/registry/ui/server/console/ConsoleModule.java +++ b/core/src/main/java/google/registry/ui/server/console/ConsoleModule.java @@ -53,8 +53,10 @@ public final class ConsoleModule { Response response, AuthResult authResult, SendEmailUtils sendEmailUtils, - XsrfTokenManager xsrfTokenManager) { - return ConsoleApiParams.create(request, response, authResult, sendEmailUtils, xsrfTokenManager); + XsrfTokenManager xsrfTokenManager, + Gson gson) { + return ConsoleApiParams.create( + request, response, authResult, sendEmailUtils, xsrfTokenManager, gson); } @Provides diff --git a/core/src/main/java/google/registry/ui/server/console/ConsoleOteAction.java b/core/src/main/java/google/registry/ui/server/console/ConsoleOteAction.java index 799fa7c66..3edfe50d6 100644 --- a/core/src/main/java/google/registry/ui/server/console/ConsoleOteAction.java +++ b/core/src/main/java/google/registry/ui/server/console/ConsoleOteAction.java @@ -27,7 +27,6 @@ import static jakarta.servlet.http.HttpServletResponse.SC_OK; import com.google.common.base.Strings; import com.google.common.collect.ImmutableMap; -import com.google.gson.Gson; import com.google.gson.annotations.Expose; import google.registry.config.RegistryConfig.Config; import google.registry.model.OteAccountBuilder; @@ -62,7 +61,6 @@ public class ConsoleOteAction extends ConsoleApiAction { private static final String STAT_TYPE_DESCRIPTION_PARAM = "description"; private static final String STAT_TYPE_REQUIREMENT_PARAM = "requirement"; private static final String STAT_TYPE_TIMES_PERFORMED_PARAM = "timesPerformed"; - private final Gson gson; private final StringGenerator passwordGenerator; private final Optional oteCreateData; private final Optional maybeGroupEmailAddress; @@ -72,14 +70,12 @@ public class ConsoleOteAction extends ConsoleApiAction { @Inject public ConsoleOteAction( ConsoleApiParams consoleApiParams, - Gson gson, IamClient iamClient, @Parameter("registrarId") String registrarId, // Get request param @Config("gSuiteConsoleUserGroupEmailAddress") Optional maybeGroupEmailAddress, @Named("base58StringGenerator") StringGenerator passwordGenerator, @Parameter("oteCreateData") Optional oteCreateData) { super(consoleApiParams); - this.gson = gson; this.passwordGenerator = passwordGenerator; this.oteCreateData = oteCreateData; this.maybeGroupEmailAddress = maybeGroupEmailAddress; @@ -116,8 +112,13 @@ public class ConsoleOteAction extends ConsoleApiAction { consoleApiParams .response() .setPayload( - gson.toJson( - ImmutableMap.builder().putAll(registrarIdToTld).put("password", password).build())); + consoleApiParams + .gson() + .toJson( + ImmutableMap.builder() + .putAll(registrarIdToTld) + .put("password", password) + .build())); } @Override @@ -153,7 +154,7 @@ public class ConsoleOteAction extends ConsoleApiAction { convertSingleRequirement(statType, oteStats.getCount(statType))) .collect(toImmutableList()); consoleApiParams.response().setStatus(SC_OK); - consoleApiParams.response().setPayload(gson.toJson(stats)); + consoleApiParams.response().setPayload(consoleApiParams.gson().toJson(stats)); }); } 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 b5d3878d5..256f88899 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 @@ -23,7 +23,6 @@ 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; @@ -72,7 +71,6 @@ 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; @@ -81,14 +79,12 @@ public class ConsoleRegistryLockAction extends ConsoleApiAction { ConsoleApiParams consoleApiParams, 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; } @@ -96,7 +92,7 @@ public class ConsoleRegistryLockAction extends ConsoleApiAction { @Override protected void getHandler(User user) { checkPermission(user, registrarId, ConsolePermission.REGISTRY_LOCK); - consoleApiParams.response().setPayload(gson.toJson(getLockedDomains())); + consoleApiParams.response().setPayload(consoleApiParams.gson().toJson(getLockedDomains())); consoleApiParams.response().setStatus(SC_OK); } diff --git a/core/src/main/java/google/registry/ui/server/console/ConsoleRegistryLockVerifyAction.java b/core/src/main/java/google/registry/ui/server/console/ConsoleRegistryLockVerifyAction.java index c71d6b81e..1d0c4b855 100644 --- a/core/src/main/java/google/registry/ui/server/console/ConsoleRegistryLockVerifyAction.java +++ b/core/src/main/java/google/registry/ui/server/console/ConsoleRegistryLockVerifyAction.java @@ -17,7 +17,6 @@ package google.registry.ui.server.console; import static google.registry.request.Action.Method.GET; import com.google.common.base.Ascii; -import com.google.gson.Gson; import com.google.gson.annotations.Expose; import google.registry.model.console.User; import google.registry.model.domain.RegistryLock; @@ -42,18 +41,15 @@ public class ConsoleRegistryLockVerifyAction extends ConsoleApiAction { static final String PATH = "/console-api/registry-lock-verify"; private final DomainLockUtils domainLockUtils; - private final Gson gson; private final String lockVerificationCode; @Inject public ConsoleRegistryLockVerifyAction( ConsoleApiParams consoleApiParams, DomainLockUtils domainLockUtils, - Gson gson, @Parameter("lockVerificationCode") String lockVerificationCode) { super(consoleApiParams); this.domainLockUtils = domainLockUtils; - this.gson = gson; this.lockVerificationCode = lockVerificationCode; } @@ -68,7 +64,7 @@ public class ConsoleRegistryLockVerifyAction extends ConsoleApiAction { RegistryLockVerificationResponse lockResponse = new RegistryLockVerificationResponse( Ascii.toLowerCase(action.toString()), lock.getDomainName(), lock.getRegistrarId()); - consoleApiParams.response().setPayload(gson.toJson(lockResponse)); + consoleApiParams.response().setPayload(consoleApiParams.gson().toJson(lockResponse)); consoleApiParams.response().setStatus(HttpServletResponse.SC_OK); } diff --git a/core/src/main/java/google/registry/ui/server/console/ConsoleUpdateRegistrarAction.java b/core/src/main/java/google/registry/ui/server/console/ConsoleUpdateRegistrarAction.java index 1d25ef687..228837117 100644 --- a/core/src/main/java/google/registry/ui/server/console/ConsoleUpdateRegistrarAction.java +++ b/core/src/main/java/google/registry/ui/server/console/ConsoleUpdateRegistrarAction.java @@ -23,6 +23,8 @@ import static org.apache.http.HttpStatus.SC_OK; import com.google.common.base.Strings; import com.google.common.collect.ImmutableSet; import google.registry.model.console.ConsolePermission; +import google.registry.model.console.ConsoleUpdateHistory; +import google.registry.model.console.RegistrarUpdateHistory; import google.registry.model.console.User; import google.registry.model.registrar.Registrar; import google.registry.request.Action; @@ -99,6 +101,11 @@ public class ConsoleUpdateRegistrarAction extends ConsoleApiAction { .build(); tm().put(updatedRegistrar); + finishAndPersistConsoleUpdateHistory( + new RegistrarUpdateHistory.Builder() + .setType(ConsoleUpdateHistory.Type.REGISTRAR_UPDATE) + .setRegistrar(updatedRegistrar) + .setRequestBody(consoleApiParams.gson().toJson(registrarParam))); sendExternalUpdatesIfNecessary( EmailInfo.create( existingRegistrar.get(), diff --git a/core/src/main/java/google/registry/ui/server/console/ConsoleUsersAction.java b/core/src/main/java/google/registry/ui/server/console/ConsoleUsersAction.java index e4ff38dcd..d0f839a03 100644 --- a/core/src/main/java/google/registry/ui/server/console/ConsoleUsersAction.java +++ b/core/src/main/java/google/registry/ui/server/console/ConsoleUsersAction.java @@ -32,7 +32,6 @@ import com.google.api.services.directory.model.UserName; import com.google.common.base.Splitter; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; -import com.google.gson.Gson; import com.google.gson.annotations.Expose; import google.registry.config.RegistryConfig.Config; import google.registry.model.console.ConsolePermission; @@ -64,10 +63,10 @@ import javax.inject.Named; auth = Auth.AUTH_PUBLIC_LOGGED_IN) public class ConsoleUsersAction extends ConsoleApiAction { static final String PATH = "/console-api/users"; - private static final int PASSWORD_LENGTH = 16; + private static final int PASSWORD_LENGTH = 16; private static final Splitter EMAIL_SPLITTER = Splitter.on('@').trimResults(); - private final Gson gson; + private final String registrarId; private final Directory directory; private final StringGenerator passwordGenerator; @@ -79,7 +78,6 @@ public class ConsoleUsersAction extends ConsoleApiAction { @Inject public ConsoleUsersAction( ConsoleApiParams consoleApiParams, - Gson gson, Directory directory, IamClient iamClient, @Config("gSuiteDomainName") String gSuiteDomainName, @@ -88,7 +86,6 @@ public class ConsoleUsersAction extends ConsoleApiAction { @Parameter("userData") Optional userData, @Parameter("registrarId") String registrarId) { super(consoleApiParams); - this.gson = gson; this.registrarId = registrarId; this.directory = directory; this.passwordGenerator = passwordGenerator; @@ -103,7 +100,7 @@ public class ConsoleUsersAction extends ConsoleApiAction { // Temporary flag while testing if (user.getUserRoles().isAdmin()) { checkPermission(user, registrarId, ConsolePermission.MANAGE_USERS); - tm().transact(() -> runCreateInTransaction()); + tm().transact(this::runCreateInTransaction); } else { consoleApiParams.response().setStatus(SC_FORBIDDEN); } @@ -133,7 +130,7 @@ public class ConsoleUsersAction extends ConsoleApiAction { null)) .collect(Collectors.toList()); - consoleApiParams.response().setPayload(gson.toJson(users)); + consoleApiParams.response().setPayload(consoleApiParams.gson().toJson(users)); consoleApiParams.response().setStatus(SC_OK); } @@ -142,7 +139,7 @@ public class ConsoleUsersAction extends ConsoleApiAction { // Temporary flag while testing if (user.getUserRoles().isAdmin()) { checkPermission(user, registrarId, ConsolePermission.MANAGE_USERS); - tm().transact(() -> runDeleteInTransaction()); + tm().transact(this::runDeleteInTransaction); } else { consoleApiParams.response().setStatus(SC_FORBIDDEN); } @@ -213,9 +210,13 @@ public class ConsoleUsersAction extends ConsoleApiAction { consoleApiParams .response() .setPayload( - gson.toJson( - new UserData( - newUser.getPrimaryEmail(), ACCOUNT_MANAGER.toString(), newUser.getPassword()))); + consoleApiParams + .gson() + .toJson( + new UserData( + newUser.getPrimaryEmail(), + ACCOUNT_MANAGER.toString(), + newUser.getPassword()))); } private void runUpdateInTransaction() { diff --git a/core/src/main/java/google/registry/ui/server/console/RegistrarsAction.java b/core/src/main/java/google/registry/ui/server/console/RegistrarsAction.java index 854156495..c6b331779 100644 --- a/core/src/main/java/google/registry/ui/server/console/RegistrarsAction.java +++ b/core/src/main/java/google/registry/ui/server/console/RegistrarsAction.java @@ -26,8 +26,9 @@ import static jakarta.servlet.http.HttpServletResponse.SC_OK; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Streams; -import com.google.gson.Gson; import google.registry.model.console.ConsolePermission; +import google.registry.model.console.ConsoleUpdateHistory; +import google.registry.model.console.RegistrarUpdateHistory; import google.registry.model.console.User; import google.registry.model.registrar.Registrar; import google.registry.model.registrar.RegistrarBase; @@ -62,7 +63,6 @@ public class RegistrarsAction extends ConsoleApiAction { WHERE registrar_id in :registrarIds """; static final String PATH = "/console-api/registrars"; - private final Gson gson; private final Optional registrar; private final StringGenerator passwordGenerator; private final StringGenerator passcodeGenerator; @@ -70,12 +70,10 @@ public class RegistrarsAction extends ConsoleApiAction { @Inject public RegistrarsAction( ConsoleApiParams consoleApiParams, - Gson gson, @Parameter("registrar") Optional registrar, @Named("base58StringGenerator") StringGenerator passwordGenerator, @Named("digitOnlyStringGenerator") StringGenerator passcodeGenerator) { super(consoleApiParams); - this.gson = gson; this.registrar = registrar; this.passcodeGenerator = passcodeGenerator; this.passwordGenerator = passwordGenerator; @@ -88,7 +86,7 @@ public class RegistrarsAction extends ConsoleApiAction { Streams.stream(Registrar.loadAll()) .filter(r -> allowedRegistrarTypes.contains(r.getType())) .collect(ImmutableList.toImmutableList()); - consoleApiParams.response().setPayload(gson.toJson(registrars)); + consoleApiParams.response().setPayload(consoleApiParams.gson().toJson(registrars)); consoleApiParams.response().setStatus(SC_OK); } else if (user.getUserRoles().getRegistrarRoles().values().stream() .anyMatch(role -> role.hasPermission(ConsolePermission.VIEW_REGISTRAR_DETAILS))) { @@ -106,7 +104,7 @@ public class RegistrarsAction extends ConsoleApiAction { .setParameter("registrarIds", accessibleRegistrarIds) .getResultList()); - consoleApiParams.response().setPayload(gson.toJson(registrars)); + consoleApiParams.response().setPayload(consoleApiParams.gson().toJson(registrars)); consoleApiParams.response().setStatus(SC_OK); } else { consoleApiParams.response().setStatus(SC_FORBIDDEN); @@ -175,6 +173,11 @@ public class RegistrarsAction extends ConsoleApiAction { "Registrar with registrarId %s already exists", registrar.getRegistrarId()); tm().putAll(registrar, contact); + finishAndPersistConsoleUpdateHistory( + new RegistrarUpdateHistory.Builder() + .setType(ConsoleUpdateHistory.Type.REGISTRAR_UPDATE) + .setRegistrar(registrar) + .setRequestBody(consoleApiParams.gson().toJson(registrar))); }); } diff --git a/core/src/main/java/google/registry/ui/server/console/settings/ContactAction.java b/core/src/main/java/google/registry/ui/server/console/settings/ContactAction.java index 1a183aaa4..69652ceb6 100644 --- a/core/src/main/java/google/registry/ui/server/console/settings/ContactAction.java +++ b/core/src/main/java/google/registry/ui/server/console/settings/ContactAction.java @@ -28,7 +28,6 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Multimap; import com.google.common.flogger.FluentLogger; -import com.google.gson.Gson; import google.registry.model.console.ConsolePermission; import google.registry.model.console.User; import google.registry.model.registrar.Registrar; @@ -60,18 +59,15 @@ import javax.inject.Inject; public class ContactAction extends ConsoleApiAction { static final String PATH = "/console-api/settings/contacts"; private static final FluentLogger logger = FluentLogger.forEnclosingClass(); - private final Gson gson; private final Optional> contacts; private final String registrarId; @Inject public ContactAction( ConsoleApiParams consoleApiParams, - Gson gson, @Parameter("registrarId") String registrarId, @Parameter("contacts") Optional> contacts) { super(consoleApiParams); - this.gson = gson; this.registrarId = registrarId; this.contacts = contacts; } @@ -90,7 +86,7 @@ public class ContactAction extends ConsoleApiAction { .collect(toImmutableList())); consoleApiParams.response().setStatus(SC_OK); - consoleApiParams.response().setPayload(gson.toJson(am)); + consoleApiParams.response().setPayload(consoleApiParams.gson().toJson(am)); } @Override diff --git a/core/src/main/java/google/registry/ui/server/console/settings/SecurityAction.java b/core/src/main/java/google/registry/ui/server/console/settings/SecurityAction.java index 0f4c9ba48..511701e9c 100644 --- a/core/src/main/java/google/registry/ui/server/console/settings/SecurityAction.java +++ b/core/src/main/java/google/registry/ui/server/console/settings/SecurityAction.java @@ -25,6 +25,8 @@ import com.google.common.collect.ImmutableSet; import google.registry.flows.certs.CertificateChecker; import google.registry.flows.certs.CertificateChecker.InsecureCertificateException; import google.registry.model.console.ConsolePermission; +import google.registry.model.console.ConsoleUpdateHistory; +import google.registry.model.console.RegistrarUpdateHistory; import google.registry.model.console.User; import google.registry.model.registrar.Registrar; import google.registry.request.Action; @@ -117,6 +119,11 @@ public class SecurityAction extends ConsoleApiAction { Registrar updatedRegistrar = updatedRegistrarBuilder.build(); tm().put(updatedRegistrar); + finishAndPersistConsoleUpdateHistory( + new RegistrarUpdateHistory.Builder() + .setType(ConsoleUpdateHistory.Type.REGISTRAR_UPDATE) + .setRegistrar(updatedRegistrar) + .setRequestBody(consoleApiParams.gson().toJson(registrar.get()))); sendExternalUpdatesIfNecessary( EmailInfo.create(savedRegistrar, updatedRegistrar, ImmutableSet.of(), ImmutableSet.of())); diff --git a/core/src/main/java/google/registry/ui/server/console/settings/WhoisRegistrarFieldsAction.java b/core/src/main/java/google/registry/ui/server/console/settings/WhoisRegistrarFieldsAction.java index a96620268..c9f0b65b2 100644 --- a/core/src/main/java/google/registry/ui/server/console/settings/WhoisRegistrarFieldsAction.java +++ b/core/src/main/java/google/registry/ui/server/console/settings/WhoisRegistrarFieldsAction.java @@ -22,6 +22,8 @@ import static jakarta.servlet.http.HttpServletResponse.SC_FORBIDDEN; import static jakarta.servlet.http.HttpServletResponse.SC_OK; import google.registry.model.console.ConsolePermission; +import google.registry.model.console.ConsoleUpdateHistory; +import google.registry.model.console.RegistrarUpdateHistory; import google.registry.model.console.User; import google.registry.model.registrar.Registrar; import google.registry.request.Action; @@ -104,6 +106,11 @@ public class WhoisRegistrarFieldsAction extends ConsoleApiAction { .setEmailAddress(providedRegistrar.getEmailAddress()) .build(); tm().put(newRegistrar); + finishAndPersistConsoleUpdateHistory( + new RegistrarUpdateHistory.Builder() + .setType(ConsoleUpdateHistory.Type.REGISTRAR_UPDATE) + .setRegistrar(newRegistrar) + .setRequestBody(consoleApiParams.gson().toJson(registrar.get()))); sendExternalUpdatesIfNecessary( EmailInfo.create( savedRegistrar, diff --git a/core/src/test/java/google/registry/testing/ConsoleApiParamsUtils.java b/core/src/test/java/google/registry/testing/ConsoleApiParamsUtils.java index 0fb39fcc2..ece5a905e 100644 --- a/core/src/test/java/google/registry/testing/ConsoleApiParamsUtils.java +++ b/core/src/test/java/google/registry/testing/ConsoleApiParamsUtils.java @@ -20,6 +20,7 @@ import static org.mockito.Mockito.when; import com.google.common.collect.ImmutableList; import google.registry.groups.GmailClient; import google.registry.model.console.User; +import google.registry.request.RequestModule; import google.registry.request.auth.AuthResult; import google.registry.security.XsrfTokenManager; import google.registry.ui.server.SendEmailUtils; @@ -45,7 +46,13 @@ public final class ConsoleApiParamsUtils { xsrfTokenManager.generateToken( authResult.user().map(User::getEmailAddress).orElse(""))) }); + when(request.getRequestURI()).thenReturn("/console/fake-url"); return ConsoleApiParams.create( - request, new FakeResponse(), authResult, sendEmailUtils, xsrfTokenManager); + request, + new FakeResponse(), + authResult, + sendEmailUtils, + xsrfTokenManager, + RequestModule.provideGson()); } } diff --git a/core/src/test/java/google/registry/testing/DatabaseHelper.java b/core/src/test/java/google/registry/testing/DatabaseHelper.java index 6432c3630..28f28f0cc 100644 --- a/core/src/test/java/google/registry/testing/DatabaseHelper.java +++ b/core/src/test/java/google/registry/testing/DatabaseHelper.java @@ -1294,6 +1294,11 @@ public final class DatabaseHelper { return tm().transact(() -> tm().loadByEntitiesIfPresent(entities)); } + /** Loads the only instance of this particular class, or empty if none exists. */ + public static Optional loadSingleton(Class clazz) { + return tm().transact(() -> tm().loadSingleton(clazz)); + } + /** Returns whether or not the given entity exists in Cloud SQL. */ public static boolean existsInDb(ImmutableObject object) { return tm().transact(() -> tm().exists(object)); diff --git a/core/src/test/java/google/registry/ui/server/console/ConsoleDomainGetActionTest.java b/core/src/test/java/google/registry/ui/server/console/ConsoleDomainGetActionTest.java index 91e37a7c3..f5142f8e2 100644 --- a/core/src/test/java/google/registry/ui/server/console/ConsoleDomainGetActionTest.java +++ b/core/src/test/java/google/registry/ui/server/console/ConsoleDomainGetActionTest.java @@ -22,13 +22,11 @@ import static jakarta.servlet.http.HttpServletResponse.SC_UNAUTHORIZED; import static org.mockito.Mockito.when; import com.google.common.collect.ImmutableMap; -import com.google.gson.Gson; import google.registry.model.console.RegistrarRole; import google.registry.model.console.User; import google.registry.model.console.UserRoles; import google.registry.persistence.transaction.JpaTestExtensions; import google.registry.request.Action; -import google.registry.request.RequestModule; import google.registry.request.auth.AuthResult; import google.registry.testing.ConsoleApiParamsUtils; import google.registry.testing.DatabaseHelper; @@ -40,7 +38,6 @@ import org.junit.jupiter.api.extension.RegisterExtension; /** Tests for {@link google.registry.ui.server.console.ConsoleDomainGetAction}. */ public class ConsoleDomainGetActionTest { - private static final Gson GSON = RequestModule.provideGson(); private ConsoleApiParams consoleApiParams; @RegisterExtension @@ -124,6 +121,6 @@ public class ConsoleDomainGetActionTest { private ConsoleDomainGetAction createAction(AuthResult authResult, String domain) { consoleApiParams = ConsoleApiParamsUtils.createFake(authResult); when(consoleApiParams.request().getMethod()).thenReturn(Action.Method.GET.toString()); - return new ConsoleDomainGetAction(consoleApiParams, GSON, domain); + return new ConsoleDomainGetAction(consoleApiParams, domain); } } diff --git a/core/src/test/java/google/registry/ui/server/console/ConsoleDomainListActionTest.java b/core/src/test/java/google/registry/ui/server/console/ConsoleDomainListActionTest.java index 4754c4e3d..8ce60433b 100644 --- a/core/src/test/java/google/registry/ui/server/console/ConsoleDomainListActionTest.java +++ b/core/src/test/java/google/registry/ui/server/console/ConsoleDomainListActionTest.java @@ -264,7 +264,6 @@ public class ConsoleDomainListActionTest { when(consoleApiParams.request().getMethod()).thenReturn(Action.Method.GET.toString()); return new ConsoleDomainListAction( consoleApiParams, - GSON, registrarId, Optional.ofNullable(checkpointTime), Optional.ofNullable(pageNumber), diff --git a/core/src/test/java/google/registry/ui/server/console/ConsoleDumDownloadActionTest.java b/core/src/test/java/google/registry/ui/server/console/ConsoleDumDownloadActionTest.java index f9118becb..102eddeff 100644 --- a/core/src/test/java/google/registry/ui/server/console/ConsoleDumDownloadActionTest.java +++ b/core/src/test/java/google/registry/ui/server/console/ConsoleDumDownloadActionTest.java @@ -21,7 +21,6 @@ import static jakarta.servlet.http.HttpServletResponse.SC_OK; import static org.mockito.Mockito.when; import com.google.common.collect.ImmutableList; -import com.google.gson.Gson; import google.registry.model.console.GlobalRole; import google.registry.model.console.User; import google.registry.model.console.UserRoles; @@ -32,7 +31,6 @@ import google.registry.testing.ConsoleApiParamsUtils; import google.registry.testing.DatabaseHelper; import google.registry.testing.FakeClock; import google.registry.testing.FakeResponse; -import google.registry.tools.GsonUtils; import java.io.IOException; import org.joda.time.DateTime; import org.junit.jupiter.api.BeforeEach; @@ -41,8 +39,6 @@ import org.junit.jupiter.api.extension.RegisterExtension; class ConsoleDumDownloadActionTest { - private static final Gson GSON = GsonUtils.provideGson(); - private final FakeClock clock = new FakeClock(DateTime.parse("2024-04-15T00:00:00.000Z")); private ConsoleApiParams consoleApiParams; diff --git a/core/src/test/java/google/registry/ui/server/console/ConsoleEppPasswordActionTest.java b/core/src/test/java/google/registry/ui/server/console/ConsoleEppPasswordActionTest.java index e397a043b..89ed1fa63 100644 --- a/core/src/test/java/google/registry/ui/server/console/ConsoleEppPasswordActionTest.java +++ b/core/src/test/java/google/registry/ui/server/console/ConsoleEppPasswordActionTest.java @@ -17,6 +17,7 @@ package google.registry.ui.server.console; import static com.google.common.truth.Truth.assertThat; import static google.registry.request.auth.AuthenticatedRegistrarAccessor.Role.OWNER; import static google.registry.testing.DatabaseHelper.loadRegistrar; +import static google.registry.testing.DatabaseHelper.loadSingleton; import static google.registry.testing.DatabaseHelper.persistResource; import static jakarta.servlet.http.HttpServletResponse.SC_BAD_REQUEST; import static jakarta.servlet.http.HttpServletResponse.SC_FORBIDDEN; @@ -32,6 +33,7 @@ import com.google.common.collect.ImmutableSetMultimap; import com.google.gson.Gson; import google.registry.flows.PasswordOnlyTransportCredentials; import google.registry.model.console.GlobalRole; +import google.registry.model.console.RegistrarUpdateHistory; import google.registry.model.console.User; import google.registry.model.console.UserRoles; import google.registry.model.registrar.Registrar; @@ -41,6 +43,7 @@ import google.registry.request.RequestModule; import google.registry.request.auth.AuthResult; import google.registry.request.auth.AuthenticatedRegistrarAccessor; import google.registry.testing.ConsoleApiParamsUtils; +import google.registry.testing.DatabaseHelper; import google.registry.testing.FakeResponse; import google.registry.tools.GsonUtils; import google.registry.ui.server.console.ConsoleEppPasswordAction.EppPasswordData; @@ -139,6 +142,10 @@ class ConsoleEppPasswordActionTest { () -> { credentials.validate(loadRegistrar("TheRegistrar"), "randomPassword"); }); + assertThat(loadSingleton(RegistrarUpdateHistory.class).get().getRequestBody()) + .isEqualTo( + "{\"registrarId\":\"TheRegistrar\",\"oldPassword\":\"********\",\"newPassword\":" + + "\"••••••••\",\"newPasswordRepeat\":\"••••••••\"}"); } private ConsoleEppPasswordAction createAction( @@ -150,6 +157,7 @@ class ConsoleEppPasswordActionTest { .setEmailAddress("email@email.com") .setUserRoles(new UserRoles.Builder().setGlobalRole(GlobalRole.FTE).build()) .build(); + DatabaseHelper.putInDb(user); AuthResult authResult = AuthResult.createUser(user); consoleApiParams = ConsoleApiParamsUtils.createFake(authResult); diff --git a/core/src/test/java/google/registry/ui/server/console/ConsoleOteActionTest.java b/core/src/test/java/google/registry/ui/server/console/ConsoleOteActionTest.java index 6c5c0693f..f32b8ede0 100644 --- a/core/src/test/java/google/registry/ui/server/console/ConsoleOteActionTest.java +++ b/core/src/test/java/google/registry/ui/server/console/ConsoleOteActionTest.java @@ -245,7 +245,6 @@ class ConsoleOteActionTest { when(consoleApiParams.request().getMethod()).thenReturn(method.toString()); return new ConsoleOteAction( consoleApiParams, - GSON, iamClient, registrarId, maybeGroupEmailAddress, 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 dbb3cc7bc..fccf4d5f9 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 @@ -34,7 +34,6 @@ import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; import com.google.common.collect.ImmutableMap; -import com.google.gson.Gson; import google.registry.groups.GmailClient; import google.registry.model.console.GlobalRole; import google.registry.model.console.RegistrarRole; @@ -44,7 +43,6 @@ import google.registry.model.domain.Domain; import google.registry.model.domain.RegistryLock; import google.registry.model.eppcommon.StatusValue; import google.registry.persistence.transaction.JpaTestExtensions; -import google.registry.request.RequestModule; import google.registry.request.auth.AuthResult; import google.registry.testing.CloudTasksHelper; import google.registry.testing.ConsoleApiParamsUtils; @@ -83,8 +81,6 @@ public class ConsoleRegistryLockActionTest { https://registrarconsole.tld/console/#/registry-lock-verify?lockVerificationCode=\ 123456789ABCDEFGHJKLMNPQRSTUVWXY"""; - private static final Gson GSON = RequestModule.provideGson(); - private final FakeClock fakeClock = new FakeClock(DateTime.parse("2024-04-18T12:00:00.000Z")); @RegisterExtension @@ -128,10 +124,10 @@ public class ConsoleRegistryLockActionTest { assertThat(response.getPayload()) .isEqualTo( """ - [{"domainName":"example.test","registrarPocId":"johndoe@theregistrar.com","lockRequestTime":\ - {"creationTime":"2024-04-18T12:00:00.000Z"},"unlockRequestTime":"null","lockCompletionTime":\ - "2024-04-18T12:00:00.000Z","unlockCompletionTime":"null","isSuperuser":false}]\ - """); +[{"domainName":"example.test","registrarPocId":"johndoe@theregistrar.com","lockRequestTime":\ +{"creationTime":"2024-04-18T12:00:00.000Z"},"unlockRequestTime":"null","lockCompletionTime":\ +"2024-04-18T12:00:00.000Z","unlockCompletionTime":"null","isSuperuser":false}]\ +"""); } @Test @@ -222,25 +218,25 @@ public class ConsoleRegistryLockActionTest { assertThat(response.getPayload()) .isEqualTo( """ - [{"domainName":"adminexample.test","lockRequestTime":{"creationTime":"2024-04-19T12:00:00.001Z"},\ - "unlockRequestTime":"null","lockCompletionTime":"2024-04-19T12:00:00.001Z","unlockCompletionTime":\ - "null","isSuperuser":true},\ - \ - {"domainName":"example.test","registrarPocId":"johndoe@theregistrar.com","lockRequestTime":\ - {"creationTime":"2024-04-19T12:00:00.001Z"},"unlockRequestTime":"null","lockCompletionTime":\ - "2024-04-19T12:00:00.000Z","unlockCompletionTime":"null","isSuperuser":false},\ - \ - {"domainName":"expiredunlock.test","registrarPocId":"johndoe@theregistrar.com","lockRequestTime":\ - {"creationTime":"2024-04-18T12:00:00.000Z"},"unlockRequestTime":"2024-04-18T12:00:00.000Z",\ - "lockCompletionTime":"2024-04-18T12:00:00.000Z","unlockCompletionTime":"null","isSuperuser":false},\ - \ - {"domainName":"incompleteunlock.test","registrarPocId":"johndoe@theregistrar.com","lockRequestTime":\ - {"creationTime":"2024-04-19T12:00:00.001Z"},"unlockRequestTime":"2024-04-19T12:00:00.001Z",\ - "lockCompletionTime":"2024-04-19T12:00:00.001Z","unlockCompletionTime":"null","isSuperuser":false},\ - \ - {"domainName":"pending.test","registrarPocId":"johndoe@theregistrar.com","lockRequestTime":\ - {"creationTime":"2024-04-19T12:00:00.001Z"},"unlockRequestTime":"null","lockCompletionTime":"null",\ - "unlockCompletionTime":"null","isSuperuser":false}]"""); +[{"domainName":"adminexample.test","lockRequestTime":{"creationTime":"2024-04-19T12:00:00.001Z"},\ +"unlockRequestTime":"null","lockCompletionTime":"2024-04-19T12:00:00.001Z","unlockCompletionTime":\ +"null","isSuperuser":true},\ +\ +{"domainName":"example.test","registrarPocId":"johndoe@theregistrar.com","lockRequestTime":\ +{"creationTime":"2024-04-19T12:00:00.001Z"},"unlockRequestTime":"null","lockCompletionTime":\ +"2024-04-19T12:00:00.000Z","unlockCompletionTime":"null","isSuperuser":false},\ +\ +{"domainName":"expiredunlock.test","registrarPocId":"johndoe@theregistrar.com","lockRequestTime":\ +{"creationTime":"2024-04-18T12:00:00.000Z"},"unlockRequestTime":"2024-04-18T12:00:00.000Z",\ +"lockCompletionTime":"2024-04-18T12:00:00.000Z","unlockCompletionTime":"null","isSuperuser":false},\ +\ +{"domainName":"incompleteunlock.test","registrarPocId":"johndoe@theregistrar.com","lockRequestTime":\ +{"creationTime":"2024-04-19T12:00:00.001Z"},"unlockRequestTime":"2024-04-19T12:00:00.001Z",\ +"lockCompletionTime":"2024-04-19T12:00:00.001Z","unlockCompletionTime":"null","isSuperuser":false},\ +\ +{"domainName":"pending.test","registrarPocId":"johndoe@theregistrar.com","lockRequestTime":\ +{"creationTime":"2024-04-19T12:00:00.001Z"},"unlockRequestTime":"null","lockCompletionTime":"null",\ +"unlockCompletionTime":"null","isSuperuser":false}]"""); } @Test @@ -508,7 +504,7 @@ public class ConsoleRegistryLockActionTest { new CloudTasksHelper(fakeClock).getTestCloudTasksUtils()); response = (FakeResponse) params.response(); return new ConsoleRegistryLockAction( - params, domainLockUtils, gmailClient, GSON, optionalPostInput, "TheRegistrar"); + params, domainLockUtils, gmailClient, optionalPostInput, "TheRegistrar"); } private ConsoleApiParams createParams() { diff --git a/core/src/test/java/google/registry/ui/server/console/ConsoleRegistryLockVerifyActionTest.java b/core/src/test/java/google/registry/ui/server/console/ConsoleRegistryLockVerifyActionTest.java index 0640940bb..edf051132 100644 --- a/core/src/test/java/google/registry/ui/server/console/ConsoleRegistryLockVerifyActionTest.java +++ b/core/src/test/java/google/registry/ui/server/console/ConsoleRegistryLockVerifyActionTest.java @@ -24,7 +24,6 @@ import static google.registry.tools.LockOrUnlockDomainCommand.REGISTRY_LOCK_STAT import static org.mockito.Mockito.when; import com.google.common.collect.ImmutableMap; -import com.google.gson.Gson; import google.registry.model.console.RegistrarRole; import google.registry.model.console.User; import google.registry.model.console.UserRoles; @@ -32,7 +31,6 @@ import google.registry.model.domain.Domain; import google.registry.model.domain.RegistryLock; import google.registry.model.eppcommon.StatusValue; import google.registry.persistence.transaction.JpaTestExtensions; -import google.registry.request.RequestModule; import google.registry.request.auth.AuthResult; import google.registry.testing.CloudTasksHelper; import google.registry.testing.ConsoleApiParamsUtils; @@ -51,7 +49,6 @@ import org.junit.jupiter.api.extension.RegisterExtension; public class ConsoleRegistryLockVerifyActionTest { private static final String DEFAULT_CODE = "123456789ABCDEFGHJKLMNPQRSTUUUUU"; - private static final Gson GSON = RequestModule.provideGson(); private final FakeClock fakeClock = new FakeClock(); @RegisterExtension @@ -214,6 +211,6 @@ public class ConsoleRegistryLockVerifyActionTest { "adminreg", new CloudTasksHelper(fakeClock).getTestCloudTasksUtils()); response = (FakeResponse) params.response(); - return new ConsoleRegistryLockVerifyAction(params, domainLockUtils, GSON, verificationCode); + return new ConsoleRegistryLockVerifyAction(params, domainLockUtils, verificationCode); } } diff --git a/core/src/test/java/google/registry/ui/server/console/ConsoleUpdateRegistrarActionTest.java b/core/src/test/java/google/registry/ui/server/console/ConsoleUpdateRegistrarActionTest.java index 659db9f21..456e3d5f3 100644 --- a/core/src/test/java/google/registry/ui/server/console/ConsoleUpdateRegistrarActionTest.java +++ b/core/src/test/java/google/registry/ui/server/console/ConsoleUpdateRegistrarActionTest.java @@ -15,8 +15,10 @@ package google.registry.ui.server.console; import static com.google.common.truth.Truth.assertThat; +import static google.registry.model.ImmutableObjectSubject.assertAboutImmutableObjects; import static google.registry.model.registrar.RegistrarPocBase.Type.WHOIS; import static google.registry.testing.DatabaseHelper.createTlds; +import static google.registry.testing.DatabaseHelper.loadSingleton; import static google.registry.testing.DatabaseHelper.persistResource; import static jakarta.servlet.http.HttpServletResponse.SC_BAD_REQUEST; import static jakarta.servlet.http.HttpServletResponse.SC_OK; @@ -29,6 +31,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.gson.Gson; import google.registry.model.console.GlobalRole; +import google.registry.model.console.RegistrarUpdateHistory; import google.registry.model.console.User; import google.registry.model.console.UserRoles; import google.registry.model.registrar.Registrar; @@ -85,10 +88,11 @@ class ConsoleUpdateRegistrarActionTest { .setRegistryLockAllowed(false) .build()); user = - new User.Builder() - .setEmailAddress("user@registrarId.com") - .setUserRoles(new UserRoles.Builder().setGlobalRole(GlobalRole.FTE).build()) - .build(); + persistResource( + new User.Builder() + .setEmailAddress("user@registrarId.com") + .setUserRoles(new UserRoles.Builder().setGlobalRole(GlobalRole.FTE).build()) + .build()); consoleApiParams = createParams(); } @@ -104,6 +108,9 @@ class ConsoleUpdateRegistrarActionTest { assertThat(newRegistrar.getAllowedTlds()).containsExactly("app", "dev"); assertThat(newRegistrar.isRegistryLockAllowed()).isFalse(); assertThat(((FakeResponse) consoleApiParams.response()).getStatus()).isEqualTo(SC_OK); + assertAboutImmutableObjects() + .that(newRegistrar) + .hasFieldsEqualTo(loadSingleton(RegistrarUpdateHistory.class).get().getRegistrar()); } @Test diff --git a/core/src/test/java/google/registry/ui/server/console/ConsoleUsersActionTest.java b/core/src/test/java/google/registry/ui/server/console/ConsoleUsersActionTest.java index 811b12bdd..24c6767ce 100644 --- a/core/src/test/java/google/registry/ui/server/console/ConsoleUsersActionTest.java +++ b/core/src/test/java/google/registry/ui/server/console/ConsoleUsersActionTest.java @@ -352,7 +352,6 @@ class ConsoleUsersActionTest { when(consoleApiParams.request().getMethod()).thenReturn(method.orElse("GET")); return new ConsoleUsersAction( consoleApiParams, - GSON, directory, iamClient, "email.com", diff --git a/core/src/test/java/google/registry/ui/server/console/RegistrarsActionTest.java b/core/src/test/java/google/registry/ui/server/console/RegistrarsActionTest.java index d29591ee0..d5ae005d2 100644 --- a/core/src/test/java/google/registry/ui/server/console/RegistrarsActionTest.java +++ b/core/src/test/java/google/registry/ui/server/console/RegistrarsActionTest.java @@ -15,8 +15,10 @@ package google.registry.ui.server.console; import static com.google.common.truth.Truth.assertThat; +import static google.registry.model.ImmutableObjectSubject.assertAboutImmutableObjects; import static google.registry.testing.DatabaseHelper.loadAllOf; import static google.registry.testing.DatabaseHelper.loadRegistrar; +import static google.registry.testing.DatabaseHelper.loadSingleton; import static google.registry.testing.DatabaseHelper.persistNewRegistrar; import static google.registry.testing.DatabaseHelper.persistResource; import static google.registry.testing.SqlHelper.saveRegistrar; @@ -30,6 +32,7 @@ import com.google.common.collect.ImmutableMap; import com.google.gson.Gson; import google.registry.model.console.GlobalRole; import google.registry.model.console.RegistrarRole; +import google.registry.model.console.RegistrarUpdateHistory; import google.registry.model.console.User; import google.registry.model.console.UserRoles; import google.registry.model.registrar.Registrar; @@ -183,6 +186,9 @@ class RegistrarsActionTest { .findAny() .isPresent()) .isTrue(); + assertAboutImmutableObjects() + .that(r) + .isEqualExceptFields(loadSingleton(RegistrarUpdateHistory.class).get().getRegistrar()); } @Test @@ -225,10 +231,8 @@ class RegistrarsActionTest { } private User createUser(UserRoles userRoles) { - return new User.Builder() - .setEmailAddress("email@email.com") - .setUserRoles(userRoles) - .build(); + return persistResource( + new User.Builder().setEmailAddress("email@email.com").setUserRoles(userRoles).build()); } private RegistrarsAction createAction(Action.Method method, AuthResult authResult) { @@ -236,7 +240,7 @@ class RegistrarsActionTest { when(consoleApiParams.request().getMethod()).thenReturn(method.toString()); if (method.equals(Action.Method.GET)) { return new RegistrarsAction( - consoleApiParams, GSON, Optional.ofNullable(null), passwordGenerator, passcodeGenerator); + consoleApiParams, Optional.ofNullable(null), passwordGenerator, passcodeGenerator); } else { try { doReturn(new BufferedReader(new StringReader(registrarParamMap.toString()))) @@ -245,7 +249,6 @@ class RegistrarsActionTest { } catch (IOException e) { return new RegistrarsAction( consoleApiParams, - GSON, Optional.ofNullable(null), passwordGenerator, passcodeGenerator); @@ -254,7 +257,7 @@ class RegistrarsActionTest { ConsoleModule.provideRegistrar( GSON, RequestModule.provideJsonBody(consoleApiParams.request(), GSON)); return new RegistrarsAction( - consoleApiParams, GSON, maybeRegistrar, passwordGenerator, passcodeGenerator); + consoleApiParams, maybeRegistrar, passwordGenerator, passcodeGenerator); } } } diff --git a/core/src/test/java/google/registry/ui/server/console/settings/ContactActionTest.java b/core/src/test/java/google/registry/ui/server/console/settings/ContactActionTest.java index e58234c98..f49c77efe 100644 --- a/core/src/test/java/google/registry/ui/server/console/settings/ContactActionTest.java +++ b/core/src/test/java/google/registry/ui/server/console/settings/ContactActionTest.java @@ -480,10 +480,10 @@ class ContactActionTest { consoleApiParams = ConsoleApiParamsUtils.createFake(authResult); when(consoleApiParams.request().getMethod()).thenReturn(method.toString()); if (method.equals(Action.Method.GET)) { - return new ContactAction(consoleApiParams, GSON, registrarId, Optional.empty()); + return new ContactAction(consoleApiParams, registrarId, Optional.empty()); } else { return new ContactAction( - consoleApiParams, GSON, registrarId, Optional.of(ImmutableSet.copyOf(contacts))); + consoleApiParams, registrarId, Optional.of(ImmutableSet.copyOf(contacts))); } } } diff --git a/core/src/test/java/google/registry/ui/server/console/settings/SecurityActionTest.java b/core/src/test/java/google/registry/ui/server/console/settings/SecurityActionTest.java index 445829021..e7bda7b48 100644 --- a/core/src/test/java/google/registry/ui/server/console/settings/SecurityActionTest.java +++ b/core/src/test/java/google/registry/ui/server/console/settings/SecurityActionTest.java @@ -15,8 +15,10 @@ package google.registry.ui.server.console.settings; import static com.google.common.truth.Truth.assertThat; +import static google.registry.model.ImmutableObjectSubject.assertAboutImmutableObjects; import static google.registry.testing.CertificateSamples.SAMPLE_CERT2; import static google.registry.testing.DatabaseHelper.loadRegistrar; +import static google.registry.testing.DatabaseHelper.loadSingleton; import static google.registry.testing.SqlHelper.saveRegistrar; import static google.registry.util.DateTimeUtils.START_OF_TIME; import static jakarta.servlet.http.HttpServletResponse.SC_OK; @@ -28,6 +30,7 @@ import com.google.common.collect.ImmutableSetMultimap; import com.google.common.collect.ImmutableSortedMap; import com.google.gson.Gson; import google.registry.flows.certs.CertificateChecker; +import google.registry.model.console.RegistrarUpdateHistory; import google.registry.model.registrar.Registrar; import google.registry.persistence.transaction.JpaTestExtensions; import google.registry.request.Action; @@ -98,6 +101,9 @@ class SecurityActionTest { .isEqualTo("GNd6ZP8/n91t9UTnpxR8aH7aAW4+CpvufYx9ViGbcMY"); assertThat(r.getIpAddressAllowList().get(0).getIp()).isEqualTo("192.168.1.1"); assertThat(r.getIpAddressAllowList().get(0).getNetmask()).isEqualTo(32); + assertAboutImmutableObjects() + .that(loadSingleton(RegistrarUpdateHistory.class).get().getRegistrar()) + .hasFieldsEqualTo(r); } private SecurityAction createAction(AuthResult authResult, String registrarId) diff --git a/core/src/test/java/google/registry/ui/server/console/settings/WhoisRegistrarFieldsActionTest.java b/core/src/test/java/google/registry/ui/server/console/settings/WhoisRegistrarFieldsActionTest.java index 97d7bd43a..298f68cf9 100644 --- a/core/src/test/java/google/registry/ui/server/console/settings/WhoisRegistrarFieldsActionTest.java +++ b/core/src/test/java/google/registry/ui/server/console/settings/WhoisRegistrarFieldsActionTest.java @@ -16,6 +16,7 @@ package google.registry.ui.server.console.settings; import static com.google.common.truth.Truth.assertThat; import static google.registry.model.ImmutableObjectSubject.assertAboutImmutableObjects; +import static google.registry.testing.DatabaseHelper.loadSingleton; import static jakarta.servlet.http.HttpServletResponse.SC_FORBIDDEN; import static jakarta.servlet.http.HttpServletResponse.SC_OK; import static org.mockito.Mockito.doReturn; @@ -27,6 +28,7 @@ import com.google.common.collect.ImmutableSetMultimap; import com.google.common.collect.Maps; import com.google.gson.Gson; import google.registry.model.console.RegistrarRole; +import google.registry.model.console.RegistrarUpdateHistory; import google.registry.model.console.User; import google.registry.model.console.UserRoles; import google.registry.model.registrar.Registrar; @@ -129,6 +131,9 @@ public class WhoisRegistrarFieldsActionTest { .that(newRegistrar) .isEqualExceptFields( oldRegistrar, "whoisServer", "url", "localizedAddress", "phoneNumber", "faxNumber"); + assertAboutImmutableObjects() + .that(loadSingleton(RegistrarUpdateHistory.class).get().getRegistrar()) + .hasFieldsEqualTo(newRegistrar); } @Test