From 233ee09efe2639e3d00e956f5f43911935cd23a6 Mon Sep 17 00:00:00 2001 From: gbrodman Date: Tue, 23 Jul 2024 15:04:35 -0400 Subject: [PATCH] Add simple registry-lock-verification page (#2499) This is a fairly simple page that solely exists to display the result from the action, and to link the user back to the domain list. --- console-webapp/src/app/app-routing.module.ts | 5 ++ console-webapp/src/app/app.module.ts | 2 + .../lock/registryLockVerify.component.html | 28 ++++++++ .../lock/registryLockVerify.component.scss | 9 +++ .../app/lock/registryLockVerify.component.ts | 65 ++++++++++++++++++ .../app/lock/registryLockVerify.service.ts | 31 +++++++++ .../app/shared/services/backend.service.ts | 9 +++ .../registry/tools/DomainLockUtils.java | 2 +- .../ui/server/console/ConsoleApiAction.java | 2 +- .../ConsoleRegistryLockVerifyActionTest.java | 2 +- ...st_registryLockVerify_unknownLock_page.png | Bin 31152 -> 31211 bytes 11 files changed, 152 insertions(+), 3 deletions(-) create mode 100644 console-webapp/src/app/lock/registryLockVerify.component.html create mode 100644 console-webapp/src/app/lock/registryLockVerify.component.scss create mode 100644 console-webapp/src/app/lock/registryLockVerify.component.ts create mode 100644 console-webapp/src/app/lock/registryLockVerify.service.ts diff --git a/console-webapp/src/app/app-routing.module.ts b/console-webapp/src/app/app-routing.module.ts index 3b0265666..d14bc2cd5 100644 --- a/console-webapp/src/app/app-routing.module.ts +++ b/console-webapp/src/app/app-routing.module.ts @@ -26,6 +26,7 @@ import { SettingsComponent } from './settings/settings.component'; import UsersComponent from './settings/users/users.component'; import WhoisComponent from './settings/whois/whois.component'; import { SupportComponent } from './support/support.component'; +import { RegistryLockVerifyComponent } from './lock/registryLockVerify.component'; export interface RouteWithIcon extends Route { iconName?: string; @@ -33,6 +34,10 @@ export interface RouteWithIcon extends Route { export const routes: RouteWithIcon[] = [ { path: '', redirectTo: '/home', pathMatch: 'full' }, + { + path: RegistryLockVerifyComponent.PATH, + component: RegistryLockVerifyComponent, + }, { path: 'registrars', component: RegistrarComponent }, { path: 'home', diff --git a/console-webapp/src/app/app.module.ts b/console-webapp/src/app/app.module.ts index 50776868b..40ddeeee7 100644 --- a/console-webapp/src/app/app.module.ts +++ b/console-webapp/src/app/app.module.ts @@ -53,6 +53,7 @@ import { UserDataService } from './shared/services/userData.service'; import { SnackBarModule } from './snackbar.module'; import { SupportComponent } from './support/support.component'; import { TldsComponent } from './tlds/tlds.component'; +import { RegistryLockVerifyComponent } from './lock/registryLockVerify.component'; @NgModule({ declarations: [ @@ -71,6 +72,7 @@ import { TldsComponent } from './tlds/tlds.component'; RegistrarComponent, RegistrarDetailsComponent, RegistrarSelectorComponent, + RegistryLockVerifyComponent, ResourcesComponent, SecurityComponent, SecurityEditComponent, diff --git a/console-webapp/src/app/lock/registryLockVerify.component.html b/console-webapp/src/app/lock/registryLockVerify.component.html new file mode 100644 index 000000000..dcad70b0e --- /dev/null +++ b/console-webapp/src/app/lock/registryLockVerify.component.html @@ -0,0 +1,28 @@ +@if (isLoading) { +
+ +
+} @else if (domainName) { +

Success!

+
+
+ The domain {{ domainName }} has been successfully {{ action }}ed. +
+
+
+ Return to the list of domains +
+} @else { +

Failure

+
+
+ An error occurred: {{ errorMessage }}.

Please double-check the + verification code and try again. +
+
+} diff --git a/console-webapp/src/app/lock/registryLockVerify.component.scss b/console-webapp/src/app/lock/registryLockVerify.component.scss new file mode 100644 index 000000000..064823060 --- /dev/null +++ b/console-webapp/src/app/lock/registryLockVerify.component.scss @@ -0,0 +1,9 @@ +.console-app__registry-lock { + &-content { + margin-top: 30px; + } + &-subhead { + font-size: 20px; + margin-bottom: 20px; + } +} diff --git a/console-webapp/src/app/lock/registryLockVerify.component.ts b/console-webapp/src/app/lock/registryLockVerify.component.ts new file mode 100644 index 000000000..192383897 --- /dev/null +++ b/console-webapp/src/app/lock/registryLockVerify.component.ts @@ -0,0 +1,65 @@ +// Copyright 2024 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. + +import { Component } from '@angular/core'; +import { RegistrarService } from '../registrar/registrar.service'; +import { ActivatedRoute, ParamMap } from '@angular/router'; +import { RegistryLockVerifyService } from './registryLockVerify.service'; +import { HttpErrorResponse } from '@angular/common/http'; +import { take } from 'rxjs'; +import { DomainListComponent } from '../domains/domainList.component'; + +@Component({ + selector: 'app-registry-lock-verify', + templateUrl: './registryLockVerify.component.html', + styleUrls: ['./registryLockVerify.component.scss'], + providers: [RegistryLockVerifyService], +}) +export class RegistryLockVerifyComponent { + public static PATH = 'registry-lock-verify'; + + readonly DOMAIN_LIST_COMPONENT_PATH = `/${DomainListComponent.PATH}`; + + isLoading = true; + domainName?: string; + action?: string; + errorMessage?: string; + + constructor( + protected registrarService: RegistrarService, + protected registryLockVerifyService: RegistryLockVerifyService, + private route: ActivatedRoute + ) {} + + ngOnInit() { + this.route.queryParamMap.pipe(take(1)).subscribe((params: ParamMap) => { + this.registryLockVerifyService + .verifyRequest(params.get('lockVerificationCode') || '') + .subscribe({ + error: (err: HttpErrorResponse) => { + this.isLoading = false; + this.errorMessage = err.error; + }, + next: (verificationResponse) => { + this.domainName = verificationResponse.domainName; + this.action = verificationResponse.action; + this.registrarService.registrarId.set( + verificationResponse.registrarId + ); + this.isLoading = false; + }, + }); + }); + } +} diff --git a/console-webapp/src/app/lock/registryLockVerify.service.ts b/console-webapp/src/app/lock/registryLockVerify.service.ts new file mode 100644 index 000000000..3b34258de --- /dev/null +++ b/console-webapp/src/app/lock/registryLockVerify.service.ts @@ -0,0 +1,31 @@ +// Copyright 2024 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. + +import { Injectable } from '@angular/core'; +import { BackendService } from '../shared/services/backend.service'; + +export interface RegistryLockVerificationResponse { + action: string; + domainName: string; + registrarId: string; +} + +@Injectable() +export class RegistryLockVerifyService { + constructor(private backendService: BackendService) {} + + verifyRequest(lockVerificationCode: string) { + return this.backendService.verifyRegistryLockRequest(lockVerificationCode); + } +} diff --git a/console-webapp/src/app/shared/services/backend.service.ts b/console-webapp/src/app/shared/services/backend.service.ts index 698cbbb04..26bbeb895 100644 --- a/console-webapp/src/app/shared/services/backend.service.ts +++ b/console-webapp/src/app/shared/services/backend.service.ts @@ -25,6 +25,7 @@ import { import { Contact } from '../../settings/contact/contact.service'; import { EppPasswordBackendModel } from '../../settings/security/security.service'; import { UserData } from './userData.service'; +import { RegistryLockVerificationResponse } from 'src/app/lock/registryLockVerify.service'; @Injectable() export class BackendService { @@ -169,4 +170,12 @@ export class BackendService { whoisRegistrarFields ); } + + verifyRegistryLockRequest( + lockVerificationCode: string + ): Observable { + return this.http.get( + `/console-api/registry-lock-verify?lockVerificationCode=${lockVerificationCode}` + ); + } } diff --git a/core/src/main/java/google/registry/tools/DomainLockUtils.java b/core/src/main/java/google/registry/tools/DomainLockUtils.java index 6c34ac94c..76ddff8db 100644 --- a/core/src/main/java/google/registry/tools/DomainLockUtils.java +++ b/core/src/main/java/google/registry/tools/DomainLockUtils.java @@ -343,7 +343,7 @@ public final class DomainLockUtils { .orElseThrow( () -> new IllegalArgumentException( - String.format("Invalid verification code %s", verificationCode))); + String.format("Invalid verification code \"%s\"", verificationCode))); } private void applyLockStatuses(RegistryLock lock, DateTime lockTime, boolean isAdmin) { 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 d4d3a3bc6..53d2725d6 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 @@ -161,7 +161,7 @@ public abstract class ConsoleApiAction implements Runnable { Map registrarDiffMap = registrar.toDiffableFieldMap(); Stream.of("passwordHash", "salt") // fields to remove from final diff - .forEach(fieldToBeRemoved -> registrarDiffMap.remove(fieldToBeRemoved)); + .forEach(registrarDiffMap::remove); // Use LinkedHashMap here to preserve ordering; null values mean we can't use ImmutableMap. LinkedHashMap result = new LinkedHashMap<>(registrarDiffMap); 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 8ff207bb7..803083731 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 @@ -156,7 +156,7 @@ public class ConsoleRegistryLockVerifyActionTest { action.run(); assertThat(response.getStatus()).isEqualTo(HttpServletResponse.SC_BAD_REQUEST); assertThat(response.getPayload()) - .isEqualTo("Invalid verification code 123456789ABCDEFGHJKLMNPQRSTUUUUU"); + .isEqualTo("Invalid verification code \"123456789ABCDEFGHJKLMNPQRSTUUUUU\""); assertThat(loadByEntity(defaultDomain).getStatusValues()).containsExactly(StatusValue.INACTIVE); } diff --git a/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_registryLockVerify_unknownLock_page.png b/core/src/test/resources/google/registry/webdriver/goldens/chrome-linux/RegistrarConsoleScreenshotTest_registryLockVerify_unknownLock_page.png index 765127351c8ac84b0f95d075710027c5b0eec23a..725c4249c96f238671692429b2a05377782d87c5 100644 GIT binary patch literal 31211 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

=$%{jZ?f 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 D$yZuG literal 31152 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 NJYD@<);T3K0RXu&PyGM@