diff --git a/core/src/main/java/google/registry/ui/server/registrar/RegistryLockGetAction.java b/core/src/main/java/google/registry/ui/server/registrar/RegistryLockGetAction.java index 545dd1930..8a15ba01d 100644 --- a/core/src/main/java/google/registry/ui/server/registrar/RegistryLockGetAction.java +++ b/core/src/main/java/google/registry/ui/server/registrar/RegistryLockGetAction.java @@ -67,13 +67,14 @@ public final class RegistryLockGetAction implements JsonGetAction { private static final String FULLY_QUALIFIED_DOMAIN_NAME_PARAM = "fullyQualifiedDomainName"; private static final String LOCKED_TIME_PARAM = "lockedTime"; private static final String LOCKED_BY_PARAM = "lockedBy"; + private static final String USER_CAN_UNLOCK_PARAM = "userCanUnlock"; private static final FluentLogger logger = FluentLogger.forEnclosingClass(); private static final Gson GSON = new Gson(); @VisibleForTesting Method method; private final Response response; - private final AuthenticatedRegistrarAccessor registrarAccessor; + @VisibleForTesting AuthenticatedRegistrarAccessor registrarAccessor; @VisibleForTesting AuthResult authResult; @VisibleForTesting Optional paramClientId; @@ -118,7 +119,7 @@ public final class RegistryLockGetAction implements JsonGetAction { // Note: admins always have access to the locks page checkArgument(authResult.userAuthInfo().isPresent(), "User auth info must be present"); UserAuthInfo userAuthInfo = authResult.userAuthInfo().get(); - boolean isAdmin = userAuthInfo.isUserAdmin(); + boolean isAdmin = registrarAccessor.isAdmin(); Registrar registrar = getRegistrarAndVerifyLockAccess(clientId, isAdmin); User user = userAuthInfo.user(); boolean isRegistryLockAllowed = @@ -136,7 +137,7 @@ public final class RegistryLockGetAction implements JsonGetAction { PARAM_CLIENT_ID, registrar.getClientId(), LOCKS_PARAM, - getLockedDomains(clientId)); + getLockedDomains(clientId, isAdmin)); } private Registrar getRegistrarAndVerifyLockAccess(String clientId, boolean isAdmin) @@ -148,19 +149,22 @@ public final class RegistryLockGetAction implements JsonGetAction { return registrar; } - private ImmutableList> getLockedDomains(String clientId) { + private ImmutableList> getLockedDomains( + String clientId, boolean isAdmin) { return RegistryLockDao.getLockedDomainsByRegistrarId(clientId).stream() - .map(this::lockToMap) + .map(lock -> lockToMap(lock, isAdmin)) .collect(toImmutableList()); } - private ImmutableMap lockToMap(RegistryLock lock) { + private ImmutableMap lockToMap(RegistryLock lock, boolean isAdmin) { return ImmutableMap.of( FULLY_QUALIFIED_DOMAIN_NAME_PARAM, lock.getDomainName(), LOCKED_TIME_PARAM, lock.getLockCompletionTimestamp().map(DateTime::toString).orElse(""), LOCKED_BY_PARAM, - lock.isSuperuser() ? "admin" : lock.getRegistrarPocId()); + lock.isSuperuser() ? "admin" : lock.getRegistrarPocId(), + USER_CAN_UNLOCK_PARAM, + isAdmin || !lock.isSuperuser()); } } diff --git a/core/src/main/java/google/registry/ui/server/registrar/RegistryLockPostAction.java b/core/src/main/java/google/registry/ui/server/registrar/RegistryLockPostAction.java index 1abe04a2f..087a882c7 100644 --- a/core/src/main/java/google/registry/ui/server/registrar/RegistryLockPostAction.java +++ b/core/src/main/java/google/registry/ui/server/registrar/RegistryLockPostAction.java @@ -151,7 +151,7 @@ public class RegistryLockPostAction implements Runnable, JsonActionRunner.JsonAc String action = postInput.isLock ? "lock" : "unlock"; return JsonResponseHelper.create(SUCCESS, String.format("Successful %s", action)); } catch (Throwable e) { - logger.atWarning().withCause(e).log("Failed to lock/unlock domain with input %s", input); + logger.atWarning().withCause(e).log("Failed to lock/unlock domain"); return JsonResponseHelper.create( ERROR, Optional.ofNullable(Throwables.getRootCause(e).getMessage()).orElse("Unspecified error")); diff --git a/core/src/main/javascript/google/registry/ui/css/registry-lock.css b/core/src/main/javascript/google/registry/ui/css/registry-lock.css new file mode 100644 index 000000000..b9f911b81 --- /dev/null +++ b/core/src/main/javascript/google/registry/ui/css/registry-lock.css @@ -0,0 +1,47 @@ +/** Registry Lock */ + + .new-registry-lock #lock-domain-input { + width: 50% + } + + .new-registry-lock #lock-domain-submit { + margin-left: 5px; + } + + .registry-locks-table { + width: 1000px; + } + + .registry-locks-table td { + padding: 0.5em 0; + vertical-align: middle; + } + + .lock-confirm-modal { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + background: rgba(0,0,0,0.8); + z-index: 99999; + } + + .lock-confirm-modal > div { + width: 400px; + position: relative; + margin: 10% auto; + padding: 5px 20px 13px 20px; + border-radius: 10px; + background: #fff; + } + + .lock-confirm-modal .buttons-div { + margin-top: 10px; + display: flex; + justify-content: flex-end; + } + + .lock-confirm-modal button { + margin-left: 10px + } diff --git a/core/src/main/javascript/google/registry/ui/externs/json.js b/core/src/main/javascript/google/registry/ui/externs/json.js index 475e3a654..d92f23231 100644 --- a/core/src/main/javascript/google/registry/ui/externs/json.js +++ b/core/src/main/javascript/google/registry/ui/externs/json.js @@ -30,6 +30,37 @@ var registry = {}; */ registry.json = {}; +registry.json.locks = {}; + +/** + * @typedef {{ + * fullyQualifiedDomainName: string, + * lockedTime: string, + * lockedBy: string, + * userCanUnlock: boolean + * }} + */ +registry.json.locks.ExistingLock; + +/** + * @typedef {{ + * clientId: string, + * email: string, + * details: !Array., + * lockEnabledForContact: boolean + * }} + */ +registry.json.locks.ExistingLocksResult; + +/** + * @typedef {{ + * status: string, + * message: string, + * results: !Array. + * }} + */ +registry.json.locks.ExistingLocksResponse; + registry.json.ote = {}; /** diff --git a/core/src/main/javascript/google/registry/ui/js/registrar/admin_settings.js b/core/src/main/javascript/google/registry/ui/js/registrar/admin_settings.js index 9121dab98..089a861f7 100644 --- a/core/src/main/javascript/google/registry/ui/js/registrar/admin_settings.js +++ b/core/src/main/javascript/google/registry/ui/js/registrar/admin_settings.js @@ -84,13 +84,6 @@ registry.registrar.AdminSettings.prototype.setupEditor = function(objArgs) { this.onTldAdd_, false, this); }; -/** - * JSON response prefix which prevents evaluation. - * @private {string} - * @const - */ -registry.registrar.AdminSettings.PARSER_BREAKER_ = ')]}\'\n'; - /** * Click handler for OT&E status checking button. * @param {string} xsrfToken @@ -102,8 +95,7 @@ registry.registrar.AdminSettings.prototype.oteStatusCheck_ = function( goog.net.XhrIo.send('/registrar-ote-status', function(e) { var response = /** @type {!registry.json.ote.OteStatusResponse} */ - (e.target.getResponseJson( - registry.registrar.AdminSettings.PARSER_BREAKER_)); + (e.target.getResponseJson(registry.Resource.PARSER_BREAKER_)); var oteResultParent = goog.dom.getRequiredElement('ote-status-area-parent'); if (response.status === 'SUCCESS') { var results = response.results[0]; diff --git a/core/src/main/javascript/google/registry/ui/js/registrar/console.js b/core/src/main/javascript/google/registry/ui/js/registrar/console.js index 2da01a153..d02cd884d 100644 --- a/core/src/main/javascript/google/registry/ui/js/registrar/console.js +++ b/core/src/main/javascript/google/registry/ui/js/registrar/console.js @@ -25,6 +25,7 @@ goog.require('registry.registrar.AdminSettings'); goog.require('registry.registrar.ContactSettings'); goog.require('registry.registrar.ContactUs'); goog.require('registry.registrar.Dashboard'); +goog.require('registry.registrar.RegistryLock'); goog.require('registry.registrar.Resources'); goog.require('registry.registrar.SecuritySettings'); goog.require('registry.registrar.WhoisSettings'); @@ -82,6 +83,10 @@ registry.registrar.Console = function(params) { this.pageMap['whois-settings'] = registry.registrar.WhoisSettings; this.pageMap['contact-us'] = registry.registrar.ContactUs; this.pageMap['resources'] = registry.registrar.Resources; + // Registry lock is enabled or not per registrar, but since we don't have the registrar object + // accessible here yet, show the link no matter what (the page will show an error message if + // registry lock isn't enabled for this registrar) + this.pageMap['registry-lock'] = registry.registrar.RegistryLock; // For admin use. The relevant tab is only shown in Console.soy for admins, // but we also need to remove it here, otherwise it'd still be accessible if // the user manually puts '#admin-settings' in the URL. diff --git a/core/src/main/javascript/google/registry/ui/js/registrar/registry_lock.js b/core/src/main/javascript/google/registry/ui/js/registrar/registry_lock.js new file mode 100644 index 000000000..fae7daa26 --- /dev/null +++ b/core/src/main/javascript/google/registry/ui/js/registrar/registry_lock.js @@ -0,0 +1,179 @@ +// Copyright 2020 The Nomulus Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +goog.provide('registry.registrar.RegistryLock'); + +goog.forwardDeclare('registry.registrar.Console'); +goog.require('goog.array'); +goog.require('goog.dom'); +goog.require('goog.dom.classlist'); +goog.require('goog.events'); +goog.require('goog.events.KeyCodes'); +goog.require('goog.events.EventType'); +goog.require('goog.json'); +goog.require('goog.net.XhrIo'); +goog.require('goog.soy'); +goog.require('registry.Resource'); +goog.require('registry.ResourceComponent'); +goog.require('registry.soy.registrar.registrylock'); + + +/** + * Registry Lock page, allowing the user to lock / unlock domains. + * @param {!registry.registrar.Console} console + * @param {!registry.Resource} resource the RESTful resource for the registrar. + * @constructor + * @extends {registry.ResourceComponent} + * @final + */ +registry.registrar.RegistryLock = function(console, resource) { + registry.registrar.RegistryLock.base( + this, 'constructor', console, resource, + registry.soy.registrar.registrylock.settings, false, null); +}; +goog.inherits(registry.registrar.RegistryLock, registry.ResourceComponent); + +registry.registrar.RegistryLock.prototype.runAfterRender = function(objArgs) { + this.clientId = objArgs.clientId; + this.xsrfToken = objArgs.xsrfToken; + + if (objArgs.registryLockAllowed) { + // Load the existing locks and display them in the table + goog.net.XhrIo.send( + '/registry-lock-get?clientId=' + objArgs.clientId, e => this.fillLocksPage_(e)); + } else { + goog.soy.renderElement( + goog.dom.getRequiredElement('locks-content'), + registry.soy.registrar.registrylock.lockNotAllowedOnRegistrar, + {supportEmail: objArgs.supportEmail}); + } +}; + +/** + * Removes the lock/unlock-confirmation modal if it exists + * @private + */ +const removeModalIfExists_ = function() { + var modalElement = goog.dom.getElement('lock-confirm-modal'); + if (modalElement != null) { + modalElement.parentElement.removeChild(modalElement); + } +} + +/** + * Clears the modal and displays the locks content (lock a new domain, existing locks) that was + * retrieved from the server. + * @private + */ +registry.registrar.RegistryLock.prototype.fillLocksPage_ = function(e) { + var response = + /** @type {!registry.json.locks.ExistingLocksResponse} */ + (e.target.getResponseJson(registry.Resource.PARSER_BREAKER_)); + if (response.status === 'SUCCESS') { + removeModalIfExists_(); + var locksDetails = response.results[0] + var locksContentDiv = goog.dom.getRequiredElement('locks-content'); + goog.soy.renderElement( + locksContentDiv, + registry.soy.registrar.registrylock.locksContent, + {locks: locksDetails.locks, + email: locksDetails.email, + lockEnabledForContact: locksDetails.lockEnabledForContact}); + + if (locksDetails.lockEnabledForContact) { + // Listen to the lock-domain 'submit' button click as well as the enter key + var lockButton = goog.dom.getRequiredElement('button-lock-domain'); + goog.events.listen(lockButton, goog.events.EventType.CLICK, this.onLockDomain_, false, this); + // For all unlock buttons, listen and perform the unlock action if they're clicked + var unlockButtons = goog.dom.getElementsByClass('domain-unlock-button', locksContentDiv); + unlockButtons.forEach(button => + goog.events.listen(button, goog.events.EventType.CLICK, this.onUnlockDomain_, false, this)); + } + } else { + var errorDiv = goog.dom.getRequiredElement('modal-error-message'); + errorDiv.textContent = response.message; + errorDiv.removeAttribute('hidden'); + } +} + +/** + * Shows the lock/unlock confirmation modal + * @private + */ +registry.registrar.RegistryLock.prototype.showModal_ = function(targetElement, domain, isLock) { + var parentElement = targetElement.parentElement; + // attach the modal to the parent element so focus remains correct if the user closes the modal + var modalElement = goog.soy.renderAsElement( + registry.soy.registrar.registrylock.confirmModal, {domain: domain, isLock: isLock}); + parentElement.prepend(modalElement); + goog.dom.getRequiredElement('domain-lock-password').focus(); + // delete the modal when the user clicks the cancel button + goog.events.listen( + goog.dom.getRequiredElement('domain-lock-cancel'), + goog.events.EventType.CLICK, + removeModalIfExists_, + false, + this); + + goog.events.listen( + goog.dom.getRequiredElement('domain-lock-submit'), + goog.events.EventType.CLICK, + e => this.lockOrUnlockDomain_(isLock, e), + false, + this); +} + +/** + * Locks or unlocks the specified domain + * @private + */ +registry.registrar.RegistryLock.prototype.lockOrUnlockDomain_ = function(isLock, e) { + var domain = goog.dom.getRequiredElement('domain-lock-input-value').value; + var password = goog.dom.getRequiredElement('domain-lock-password').value; + goog.net.XhrIo.send('/registry-lock-post', + e => this.fillLocksPage_(e), + 'POST', + goog.json.serialize({ + 'clientId': this.clientId, + 'fullyQualifiedDomainName': domain, + 'isLock': isLock, + 'password': password + }), { + 'X-CSRF-Token': this.xsrfToken, + 'Content-Type': 'application/json; charset=UTF-8' + }); +} + +/** + * Click handler for unlocking domains (button click). + * @private + */ +registry.registrar.RegistryLock.prototype.onUnlockDomain_ = function(e) { + // the domain is stored in the button ID if it's the right type of button + var idRegex = /button-unlock-(.*)/ + var targetId = e.target.id; + var match = targetId.match(idRegex); + if (match) { + var domain = match[1]; + this.showModal_(e.target, domain, false); + } +} + +/** + * Click handler for lock-domain button. + * @private + */ +registry.registrar.RegistryLock.prototype.onLockDomain_ = function(e) { + this.showModal_(e.target, null, true); +}; diff --git a/core/src/main/javascript/google/registry/ui/js/resource.js b/core/src/main/javascript/google/registry/ui/js/resource.js index 8dd040a98..7003a9b85 100644 --- a/core/src/main/javascript/google/registry/ui/js/resource.js +++ b/core/src/main/javascript/google/registry/ui/js/resource.js @@ -78,3 +78,9 @@ registry.Resource.prototype.send_ = req['id'] = this.id_; this.sendXhrIo(goog.json.serialize(req), callback); }; + +/** + * JSON response prefix which prevents evaluation. + * @const + */ +registry.Resource.PARSER_BREAKER_ = ')]}\'\n'; diff --git a/core/src/main/resources/google/registry/ui/soy/registrar/Console.soy b/core/src/main/resources/google/registry/ui/soy/registrar/Console.soy index 9fb8e8544..68dcbec38 100644 --- a/core/src/main/resources/google/registry/ui/soy/registrar/Console.soy +++ b/core/src/main/resources/google/registry/ui/soy/registrar/Console.soy @@ -111,6 +111,8 @@ Security
  • Contact +
  • + Registry lock {if $isAdmin}
  • Admin diff --git a/core/src/main/resources/google/registry/ui/soy/registrar/RegistryLock.soy b/core/src/main/resources/google/registry/ui/soy/registrar/RegistryLock.soy new file mode 100644 index 000000000..467c702e7 --- /dev/null +++ b/core/src/main/resources/google/registry/ui/soy/registrar/RegistryLock.soy @@ -0,0 +1,132 @@ +// Copyright 2020 The Nomulus Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +{namespace registry.soy.registrar.registrylock} + +/** Registry locks viewing, adding, and removing. */ +{template .settings} +

    Registry lock

    +
    +
    +{/template} + +{template .locksContent} + {@param email: string} + {@param locks: list<[fullyQualifiedDomainName: string, lockedTime: string, lockedBy: string, userCanUnlock: bool]>} + {@param lockEnabledForContact: bool} + + {call .newLock} + {param email: $email /} + {param lockEnabledForContact: $lockEnabledForContact /} + {/call} + {call .existingLocksTable} + {param locks: $locks /} + {param lockEnabledForContact: $lockEnabledForContact /} + {/call} +{/template} + +{template .newLock} + {@param email: string} + {@param lockEnabledForContact: bool} +
    + {if $lockEnabledForContact} +

    Lock a domain

    +
    +

    The lock will not take effect until you click the confirmation link that will be emailed to + you at {$email}. When it takes effect, you will be billed the standard server status change + billing cost.

    + + {else} +

    You are not permitted to change registry locks.

    + {/if} +

    +
    +{/template} + +/** Table that displays existing locks for this registrar. */ +{template .existingLocksTable} + {@param locks: list<[fullyQualifiedDomainName: string, lockedTime: string, lockedBy: string, userCanUnlock: bool]>} + {@param lockEnabledForContact: bool} +

    Existing locks

    +
    + + + + + + + + {for $lock in $locks} + + + + + + + {/for} + +
    Domain nameDate/time lockedLocked byActions
    {$lock.fullyQualifiedDomainName}{$lock.lockedTime}{$lock.lockedBy} + +
    +{/template} + +/** Modal that confirms that the user wishes to lock/unlock a domain. */ +{template .confirmModal} + {@param isLock: bool} + {@param? domain: string|null} +
    + +
    +{/template} + +/** Content if the registrar is not allowed to use registry lock. */ +{template .lockNotAllowedOnRegistrar} + {@param supportEmail: string} +

    Sorry, your registrar hasn't enrolled in registry lock yet. To do so, please + contact {$supportEmail}.

    +{/template} diff --git a/core/src/main/resources/google/registry/ui/soy/registrar/WhoisSettings.soy b/core/src/main/resources/google/registry/ui/soy/registrar/WhoisSettings.soy index 1c5a1fec9..aa922bf8e 100644 --- a/core/src/main/resources/google/registry/ui/soy/registrar/WhoisSettings.soy +++ b/core/src/main/resources/google/registry/ui/soy/registrar/WhoisSettings.soy @@ -32,7 +32,7 @@ {let $whoisServerNonNull: $whoisServer ?: 'None' /} {let $urlNonNull: $url ?: 'None' /}
    -

    WHOIS Settings

    +

    WHOIS settings

    {if $readonly}

    General registrar information for your WHOIS record. This information is always visible in WHOIS. diff --git a/core/src/test/java/google/registry/ui/server/registrar/RegistryLockGetActionTest.java b/core/src/test/java/google/registry/ui/server/registrar/RegistryLockGetActionTest.java index 1c6fb0304..96a1445b6 100644 --- a/core/src/test/java/google/registry/ui/server/registrar/RegistryLockGetActionTest.java +++ b/core/src/test/java/google/registry/ui/server/registrar/RegistryLockGetActionTest.java @@ -15,6 +15,7 @@ package google.registry.ui.server.registrar; import static com.google.common.truth.Truth.assertThat; +import static google.registry.request.auth.AuthenticatedRegistrarAccessor.Role.ADMIN; import static google.registry.request.auth.AuthenticatedRegistrarAccessor.Role.OWNER; import static google.registry.testing.AppEngineRule.makeRegistrar2; import static google.registry.testing.AppEngineRule.makeRegistrarContact3; @@ -156,11 +157,13 @@ public final class RegistryLockGetActionTest { ImmutableMap.of( "fullyQualifiedDomainName", "example.test", "lockedTime", "2000-06-08T22:00:00.000Z", - "lockedBy", "johndoe@theregistrar.com"), + "lockedBy", "johndoe@theregistrar.com", + "userCanUnlock", true), ImmutableMap.of( "fullyQualifiedDomainName", "adminexample.test", "lockedTime", "2000-06-08T22:00:00.001Z", - "lockedBy", "admin"))))); + "lockedBy", "admin", + "userCanUnlock", false))))); } @Test @@ -218,10 +221,15 @@ public final class RegistryLockGetActionTest { } @Test - public void testSuccess_lockAllowedForAdmin() throws Exception { + public void testSuccess_lockAllowedForAdmin() { // Locks are allowed for admins even when they're not enabled for the registrar persistResource(makeRegistrar2().asBuilder().setRegistryLockAllowed(false).build()); authResult = AuthResult.create(AuthLevel.USER, UserAuthInfo.create(user, true)); + accessor = + AuthenticatedRegistrarAccessor.createForTesting( + ImmutableSetMultimap.of( + "TheRegistrar", ADMIN, + "NewRegistrar", OWNER)); action = new RegistryLockGetAction( Method.GET, response, accessor, authResult, Optional.of("TheRegistrar")); diff --git a/core/src/test/java/google/registry/webdriver/RegistrarConsoleScreenshotTest.java b/core/src/test/java/google/registry/webdriver/RegistrarConsoleScreenshotTest.java index e2430d974..e10fc7366 100644 --- a/core/src/test/java/google/registry/webdriver/RegistrarConsoleScreenshotTest.java +++ b/core/src/test/java/google/registry/webdriver/RegistrarConsoleScreenshotTest.java @@ -21,18 +21,22 @@ import static google.registry.testing.AppEngineRule.makeRegistrarContact2; import static google.registry.testing.DatastoreHelper.createTld; import static google.registry.testing.DatastoreHelper.loadRegistrar; import static google.registry.testing.DatastoreHelper.newDomainBase; +import static google.registry.testing.DatastoreHelper.persistActiveDomain; import static google.registry.testing.DatastoreHelper.persistResource; import static google.registry.util.DateTimeUtils.START_OF_TIME; import com.google.common.collect.ImmutableMap; import com.googlecode.objectify.ObjectifyFilter; +import google.registry.model.domain.DomainBase; import google.registry.model.ofy.OfyFilter; import google.registry.model.registrar.Registrar.State; import google.registry.model.registry.RegistryLockDao; import google.registry.module.frontend.FrontendServlet; import google.registry.schema.domain.RegistryLock; import google.registry.server.RegistryTestServer; +import google.registry.testing.AppEngineRule; import google.registry.testing.CertificateSamples; +import java.util.UUID; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; @@ -51,10 +55,11 @@ public class RegistrarConsoleScreenshotTest extends WebDriverTestCase { route("/registrar", FrontendServlet.class), route("/registrar-ote-status", FrontendServlet.class), route("/registrar-settings", FrontendServlet.class), + route("/registry-lock-get", FrontendServlet.class), route("/registry-lock-verify", FrontendServlet.class)) .setFilters(ObjectifyFilter.class, OfyFilter.class) .setFixtures(BASIC) - .setEmail("Marla.Singer@google.com") + .setEmail("Marla.Singer@crr.com") .build(); @Test @@ -407,4 +412,119 @@ public class RegistrarConsoleScreenshotTest extends WebDriverTestCase { driver.waitForElement(By.id("reg-content")); driver.diffPage("page"); } + + @Test + public void registryLock_empty() throws Throwable { + driver.get(server.getUrl("/registrar?clientId=TheRegistrar#registry-lock")); + driver.waitForElement(By.tagName("h2")); + driver.diffPage("page"); + } + + @Test + public void registryLock_notAllowed() throws Throwable { + server.runInAppEngineEnvironment( + () -> { + persistResource(makeRegistrar2().asBuilder().setRegistryLockAllowed(false).build()); + return null; + }); + driver.get(server.getUrl("/registrar?clientId=TheRegistrar#registry-lock")); + driver.waitForElement(By.tagName("h2")); + driver.diffPage("page"); + } + + @Test + public void registryLock_nonEmpty() throws Throwable { + server.runInAppEngineEnvironment( + () -> { + saveRegistryLock(); + return null; + }); + driver.get(server.getUrl("/registrar#registry-lock")); + driver.waitForElement(By.tagName("h2")); + driver.diffPage("page"); + } + + @Test + public void registryLock_nonEmpty_admin() throws Throwable { + server.runInAppEngineEnvironment( + () -> { + createTld("tld"); + DomainBase domain = persistActiveDomain("example.tld"); + RegistryLockDao.save(createRegistryLock(domain).asBuilder().isSuperuser(true).build()); + DomainBase otherDomain = persistActiveDomain("otherexample.tld"); + RegistryLockDao.save(createRegistryLock(otherDomain)); + return null; + }); + driver.get(server.getUrl("/registrar#registry-lock")); + driver.waitForElement(By.tagName("h2")); + driver.diffPage("page"); + } + + @Test + public void registryLock_unlockModal() throws Throwable { + server.setIsAdmin(true); + server.runInAppEngineEnvironment( + () -> { + saveRegistryLock(); + return null; + }); + driver.get(server.getUrl("/registrar#registry-lock")); + driver.waitForElement(By.tagName("h2")); + driver.findElement(By.id("button-unlock-example.tld")).click(); + driver.waitForElement(By.className("modal-content")); + driver.findElement(By.id("domain-lock-password")).sendKeys("password"); + driver.diffPage("page"); + } + + @Test + public void registryLock_lockModal() throws Throwable { + server.setIsAdmin(true); + server.runInAppEngineEnvironment( + () -> { + createTld("tld"); + persistActiveDomain("example.tld"); + return null; + }); + driver.get(server.getUrl("/registrar#registry-lock")); + driver.waitForElement(By.tagName("h2")); + driver.findElement(By.id("button-lock-domain")).click(); + driver.waitForElement(By.className("modal-content")); + driver.findElement(By.id("domain-lock-input-value")).sendKeys("somedomain.tld"); + driver.findElement(By.id("domain-lock-password")).sendKeys("password"); + driver.diffPage("page"); + } + + @Test + public void registryLock_notAllowedForUser() throws Throwable { + server.runInAppEngineEnvironment( + () -> { + persistResource( + AppEngineRule.makeRegistrarContact3() + .asBuilder() + .setAllowedToSetRegistryLockPassword(true) + .build()); + return null; + }); + driver.get(server.getUrl("/registrar?clientId=TheRegistrar#registry-lock")); + driver.waitForElement(By.tagName("h2")); + driver.diffPage("page"); + } + + private void saveRegistryLock() { + createTld("tld"); + DomainBase domainBase = persistActiveDomain("example.tld"); + RegistryLockDao.save(createRegistryLock(domainBase)); + } + + private RegistryLock createRegistryLock(DomainBase domainBase) { + return new RegistryLock.Builder() + .setVerificationCode(UUID.randomUUID().toString()) + .isSuperuser(false) + .setRegistrarId("TheRegistrar") + .setRegistrarPocId("Marla.Singer@crr.com") + .setLockCompletionTimestamp(START_OF_TIME) + .setDomainName("example.tld") + .setRepoId(domainBase.getRepoId()) + .build(); + } } diff --git a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_contactUs_page.png b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_contactUs_page.png index efb0a0229..2ee6641d6 100644 Binary files a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_contactUs_page.png and b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_contactUs_page.png differ diff --git a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_getOteStatus_completed_before_click.png b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_getOteStatus_completed_before_click.png index a7450da5f..9ef513d1e 100644 Binary files a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_getOteStatus_completed_before_click.png and b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_getOteStatus_completed_before_click.png differ diff --git a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_getOteStatus_completed_result.png b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_getOteStatus_completed_result.png index 6ebd13473..0c3999662 100644 Binary files a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_getOteStatus_completed_result.png and b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_getOteStatus_completed_result.png differ diff --git a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_getOteStatus_noButtonWhenReal_result.png b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_getOteStatus_noButtonWhenReal_result.png index 5e1f61dc5..958f8792a 100644 Binary files a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_getOteStatus_noButtonWhenReal_result.png and b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_getOteStatus_noButtonWhenReal_result.png differ diff --git a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_getOteStatus_notCompleted_result.png b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_getOteStatus_notCompleted_result.png index c04c342a6..c65f46b1f 100644 Binary files a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_getOteStatus_notCompleted_result.png and b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_getOteStatus_notCompleted_result.png differ diff --git a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_index_adminAndOwner_page.png b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_index_adminAndOwner_page.png index be955380a..23f8c5d79 100644 Binary files a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_index_adminAndOwner_page.png and b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_index_adminAndOwner_page.png differ diff --git a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_index_admin_page.png b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_index_admin_page.png index 4a4564cd5..dfbf1f419 100644 Binary files a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_index_admin_page.png and b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_index_admin_page.png differ diff --git a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_index_owner_page.png b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_index_owner_page.png index 80139b1aa..6cf14c990 100644 Binary files a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_index_owner_page.png and b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_index_owner_page.png differ diff --git a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_registryLock_empty_page.png b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_registryLock_empty_page.png new file mode 100644 index 000000000..6be1c5d49 Binary files /dev/null and b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_registryLock_empty_page.png differ diff --git a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_registryLock_lockModal_page.png b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_registryLock_lockModal_page.png new file mode 100644 index 000000000..7340d4a7b Binary files /dev/null and b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_registryLock_lockModal_page.png differ diff --git a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_registryLock_nonEmpty_admin_page.png b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_registryLock_nonEmpty_admin_page.png new file mode 100644 index 000000000..26864434b Binary files /dev/null and b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_registryLock_nonEmpty_admin_page.png differ diff --git a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_registryLock_nonEmpty_page.png b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_registryLock_nonEmpty_page.png new file mode 100644 index 000000000..57db44a73 Binary files /dev/null and b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_registryLock_nonEmpty_page.png differ diff --git a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_registryLock_notAllowedForUser_page.png b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_registryLock_notAllowedForUser_page.png new file mode 100644 index 000000000..cb7c23669 Binary files /dev/null and b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_registryLock_notAllowedForUser_page.png differ diff --git a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_registryLock_notAllowed_page.png b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_registryLock_notAllowed_page.png new file mode 100644 index 000000000..570b4842b Binary files /dev/null and b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_registryLock_notAllowed_page.png differ diff --git a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_registryLock_unlockModal_page.png b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_registryLock_unlockModal_page.png new file mode 100644 index 000000000..127c2b65a Binary files /dev/null and b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_registryLock_unlockModal_page.png differ diff --git a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsAdmin_whenAdmin_edit.png b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsAdmin_whenAdmin_edit.png index 44da328a3..7d04602d9 100644 Binary files a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsAdmin_whenAdmin_edit.png and b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsAdmin_whenAdmin_edit.png differ diff --git a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsAdmin_whenAdmin_view.png b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsAdmin_whenAdmin_view.png index 839ec2b4d..e8202b4b3 100644 Binary files a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsAdmin_whenAdmin_view.png and b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsAdmin_whenAdmin_view.png differ diff --git a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsAdmin_whenNotAdmin_showsHome_view.png b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsAdmin_whenNotAdmin_showsHome_view.png index f796894e3..bcff7101e 100644 Binary files a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsAdmin_whenNotAdmin_showsHome_view.png and b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsAdmin_whenNotAdmin_showsHome_view.png differ diff --git a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsContactAdd_page.png b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsContactAdd_page.png index 8dc7785a8..e5f6121f7 100644 Binary files a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsContactAdd_page.png and b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsContactAdd_page.png differ diff --git a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsContactEdit_page.png b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsContactEdit_page.png index 479686a7b..477b79275 100644 Binary files a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsContactEdit_page.png and b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsContactEdit_page.png differ diff --git a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsContactEdit_setRegistryLockPassword_alreadySet_page.png b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsContactEdit_setRegistryLockPassword_alreadySet_page.png index 47c432a30..903d77657 100644 Binary files a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsContactEdit_setRegistryLockPassword_alreadySet_page.png and b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsContactEdit_setRegistryLockPassword_alreadySet_page.png differ diff --git a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsContactEdit_setRegistryLockPassword_notAllowedForContact_page.png b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsContactEdit_setRegistryLockPassword_notAllowedForContact_page.png index 479686a7b..477b79275 100644 Binary files a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsContactEdit_setRegistryLockPassword_notAllowedForContact_page.png and b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsContactEdit_setRegistryLockPassword_notAllowedForContact_page.png differ diff --git a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsContactEdit_setRegistryLockPassword_page.png b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsContactEdit_setRegistryLockPassword_page.png index f3b09aa24..4d74c0f30 100644 Binary files a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsContactEdit_setRegistryLockPassword_page.png and b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsContactEdit_setRegistryLockPassword_page.png differ diff --git a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsContactItem_asAdmin_page.png b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsContactItem_asAdmin_page.png index c8b4845eb..28c2c83ac 100644 Binary files a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsContactItem_asAdmin_page.png and b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsContactItem_asAdmin_page.png differ diff --git a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsContactItem_page.png b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsContactItem_page.png index cbe3a04fd..aceb76c8d 100644 Binary files a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsContactItem_page.png and b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsContactItem_page.png differ diff --git a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsContact_asAdmin_page.png b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsContact_asAdmin_page.png index 4aebe8fd5..ae4e0cff2 100644 Binary files a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsContact_asAdmin_page.png and b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsContact_asAdmin_page.png differ diff --git a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsContact_page.png b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsContact_page.png index 9f61d115f..9f1d2fa18 100644 Binary files a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsContact_page.png and b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsContact_page.png differ diff --git a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsSecurityWithCerts_edit.png b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsSecurityWithCerts_edit.png index 5164b9e73..1161ab7ec 100644 Binary files a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsSecurityWithCerts_edit.png and b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsSecurityWithCerts_edit.png differ diff --git a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsSecurityWithCerts_view.png b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsSecurityWithCerts_view.png index 050972a23..a5b01ba47 100644 Binary files a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsSecurityWithCerts_view.png and b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsSecurityWithCerts_view.png differ diff --git a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsSecurityWithHashOnly_edit.png b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsSecurityWithHashOnly_edit.png index e0cf3df64..5618ff6ee 100644 Binary files a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsSecurityWithHashOnly_edit.png and b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsSecurityWithHashOnly_edit.png differ diff --git a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsSecurityWithHashOnly_view.png b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsSecurityWithHashOnly_view.png index f66b9dd71..176cab8f7 100644 Binary files a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsSecurityWithHashOnly_view.png and b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsSecurityWithHashOnly_view.png differ diff --git a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsSecurity_asAdmin_view.png b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsSecurity_asAdmin_view.png index dfc1edddd..bc1a3787e 100644 Binary files a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsSecurity_asAdmin_view.png and b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsSecurity_asAdmin_view.png differ diff --git a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsSecurity_edit.png b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsSecurity_edit.png index 95bb7b4f3..ce7f09af8 100644 Binary files a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsSecurity_edit.png and b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsSecurity_edit.png differ diff --git a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsSecurity_view.png b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsSecurity_view.png index ad70f7f6d..5285c0b0f 100644 Binary files a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsSecurity_view.png and b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsSecurity_view.png differ diff --git a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsWhoisEditError_page.png b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsWhoisEditError_page.png index a3190f3c2..1cbc68eb5 100644 Binary files a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsWhoisEditError_page.png and b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsWhoisEditError_page.png differ diff --git a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsWhoisEdit_page.png b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsWhoisEdit_page.png index e39305fd6..6d6348efc 100644 Binary files a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsWhoisEdit_page.png and b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsWhoisEdit_page.png differ diff --git a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsWhois_page.png b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsWhois_page.png index f8c5e7a22..e76f03b54 100644 Binary files a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsWhois_page.png and b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_settingsWhois_page.png differ