From eafe87646a9b83d2e519bc20808636e0ea52e80a Mon Sep 17 00:00:00 2001 From: Thomas Rittson <31796059+eliykat@users.noreply.github.com> Date: Mon, 21 Mar 2022 20:39:12 +1000 Subject: [PATCH] [EndUserVaultRefresh] Add base routing guard (#732) * Add a base class for Angular routing guards * Update Guard naming convention --- .../auth.guard.ts} | 16 +++++++++------- angular/src/guards/base.guard.ts | 19 +++++++++++++++++++ .../lock.guard.ts} | 13 ++++++++----- .../unauth.guard.ts} | 15 +++++++++------ angular/src/services/jslib-services.module.ts | 13 +++++++------ 5 files changed, 52 insertions(+), 24 deletions(-) rename angular/src/{services/auth-guard.service.ts => guards/auth.guard.ts} (82%) create mode 100644 angular/src/guards/base.guard.ts rename angular/src/{services/lock-guard.service.ts => guards/lock.guard.ts} (77%) rename angular/src/{services/unauth-guard.service.ts => guards/unauth.guard.ts} (72%) diff --git a/angular/src/services/auth-guard.service.ts b/angular/src/guards/auth.guard.ts similarity index 82% rename from angular/src/services/auth-guard.service.ts rename to angular/src/guards/auth.guard.ts index 8c06e438..f5d9471a 100644 --- a/angular/src/services/auth-guard.service.ts +++ b/angular/src/guards/auth.guard.ts @@ -6,15 +6,19 @@ import { MessagingService } from "jslib-common/abstractions/messaging.service"; import { StateService } from "jslib-common/abstractions/state.service"; import { VaultTimeoutService } from "jslib-common/abstractions/vaultTimeout.service"; +import { BaseGuard } from "./base.guard"; + @Injectable() -export class AuthGuardService implements CanActivate { +export class AuthGuard extends BaseGuard implements CanActivate { constructor( + router: Router, private vaultTimeoutService: VaultTimeoutService, - private router: Router, private messagingService: MessagingService, private keyConnectorService: KeyConnectorService, private stateService: StateService - ) {} + ) { + super(router); + } async canActivate(route: ActivatedRouteSnapshot, routerState: RouterStateSnapshot) { const isAuthed = await this.stateService.getIsAuthenticated(); @@ -28,16 +32,14 @@ export class AuthGuardService implements CanActivate { if (routerState != null) { this.messagingService.send("lockedUrl", { url: routerState.url }); } - this.router.navigate(["lock"], { queryParams: { promptBiometric: true } }); - return false; + return this.redirect("lock", { queryParams: { promptBiometric: true } }); } if ( !routerState.url.includes("remove-password") && (await this.keyConnectorService.getConvertAccountRequired()) ) { - this.router.navigate(["/remove-password"]); - return false; + return this.redirect("/remove-password"); } return true; diff --git a/angular/src/guards/base.guard.ts b/angular/src/guards/base.guard.ts new file mode 100644 index 00000000..aa5afa00 --- /dev/null +++ b/angular/src/guards/base.guard.ts @@ -0,0 +1,19 @@ +import { NavigationExtras, Router } from "@angular/router"; + +const homeRoute = ["/"]; + +export class BaseGuard { + constructor(protected router: Router) {} + + /** + * Cancels the current navigation and redirects the user to the Url specified, or back to a default route if no + * route is specified. Arguments are the same as Router.navigate. + * You should return the result of this method from a CanActivate guard to cancel the current navigation. + */ + protected redirect(redirectUrl: string | any[] = homeRoute, extras?: NavigationExtras): false { + const command = Array.isArray(redirectUrl) ? redirectUrl : [redirectUrl]; + + this.router.navigate(command, extras); + return false; + } +} diff --git a/angular/src/services/lock-guard.service.ts b/angular/src/guards/lock.guard.ts similarity index 77% rename from angular/src/services/lock-guard.service.ts rename to angular/src/guards/lock.guard.ts index 992c6e5d..e553c875 100644 --- a/angular/src/services/lock-guard.service.ts +++ b/angular/src/guards/lock.guard.ts @@ -4,15 +4,19 @@ import { CanActivate, Router } from "@angular/router"; import { StateService } from "jslib-common/abstractions/state.service"; import { VaultTimeoutService } from "jslib-common/abstractions/vaultTimeout.service"; +import { BaseGuard } from "./base.guard"; + @Injectable() -export class LockGuardService implements CanActivate { +export class LockGuard extends BaseGuard implements CanActivate { protected homepage = "vault"; protected loginpage = "login"; constructor( + router: Router, private vaultTimeoutService: VaultTimeoutService, - private router: Router, private stateService: StateService - ) {} + ) { + super(router); + } async canActivate() { if (await this.vaultTimeoutService.isLocked()) { @@ -23,7 +27,6 @@ export class LockGuardService implements CanActivate { ? [this.homepage] : [this.loginpage]; - this.router.navigate(redirectUrl); - return false; + return this.redirect(redirectUrl); } } diff --git a/angular/src/services/unauth-guard.service.ts b/angular/src/guards/unauth.guard.ts similarity index 72% rename from angular/src/services/unauth-guard.service.ts rename to angular/src/guards/unauth.guard.ts index ee2da045..bba320f5 100644 --- a/angular/src/services/unauth-guard.service.ts +++ b/angular/src/guards/unauth.guard.ts @@ -4,25 +4,28 @@ import { CanActivate, Router } from "@angular/router"; import { StateService } from "jslib-common/abstractions/state.service"; import { VaultTimeoutService } from "jslib-common/abstractions/vaultTimeout.service"; +import { BaseGuard as BaseGuard } from "./base.guard"; + @Injectable() -export class UnauthGuardService implements CanActivate { +export class UnauthGuard extends BaseGuard implements CanActivate { protected homepage = "vault"; constructor( + router: Router, private vaultTimeoutService: VaultTimeoutService, - private router: Router, private stateService: StateService - ) {} + ) { + super(router); + } async canActivate() { const isAuthed = await this.stateService.getIsAuthenticated(); if (isAuthed) { const locked = await this.vaultTimeoutService.isLocked(); if (locked) { - this.router.navigate(["lock"]); + return this.redirect("lock"); } else { - this.router.navigate([this.homepage]); + return this.redirect(this.homepage); } - return false; } return true; } diff --git a/angular/src/services/jslib-services.module.ts b/angular/src/services/jslib-services.module.ts index f389b860..3c7b4943 100644 --- a/angular/src/services/jslib-services.module.ts +++ b/angular/src/services/jslib-services.module.ts @@ -72,12 +72,13 @@ import { UserVerificationService } from "jslib-common/services/userVerification. import { VaultTimeoutService } from "jslib-common/services/vaultTimeout.service"; import { WebCryptoFunctionService } from "jslib-common/services/webCryptoFunction.service"; -import { AuthGuardService } from "./auth-guard.service"; +import { AuthGuard } from "../guards/auth.guard"; +import { LockGuard } from "../guards/lock.guard"; +import { UnauthGuard } from "../guards/unauth.guard"; + import { BroadcasterService } from "./broadcaster.service"; -import { LockGuardService } from "./lock-guard.service"; import { ModalService } from "./modal.service"; import { PasswordRepromptService } from "./passwordReprompt.service"; -import { UnauthGuardService } from "./unauth-guard.service"; import { ValidationService } from "./validation.service"; @NgModule({ @@ -90,9 +91,9 @@ import { ValidationService } from "./validation.service"; deps: [I18nServiceAbstraction], }, ValidationService, - AuthGuardService, - UnauthGuardService, - LockGuardService, + AuthGuard, + UnauthGuard, + LockGuard, ModalService, { provide: AppIdServiceAbstraction,