From cdc5e9404c1d46c59ae7d9b900d39205d00ef831 Mon Sep 17 00:00:00 2001 From: knht <43456808+knht@users.noreply.github.com> Date: Wed, 13 Apr 2022 15:27:33 +0200 Subject: [PATCH] TSK-1848: Fixed a bug where the UI would freeze with insufficient user permissions (#1903) --- web/src/app/app-routing.module.ts | 3 +++ .../app/shared/guards/business-admin.guard.ts | 10 +++------- web/src/app/shared/guards/history.guard.ts | 16 ++++------------ web/src/app/shared/guards/monitor.guard.ts | 11 ++++------- web/src/app/shared/guards/task-routing.guard.ts | 16 ++++------------ web/src/app/shared/guards/user.guard.ts | 12 +++++------- 6 files changed, 23 insertions(+), 45 deletions(-) diff --git a/web/src/app/app-routing.module.ts b/web/src/app/app-routing.module.ts index a60edc1f8..c4da77e2f 100644 --- a/web/src/app/app-routing.module.ts +++ b/web/src/app/app-routing.module.ts @@ -45,6 +45,7 @@ const appRoutes: Routes = [ loadChildren: () => import('./settings/settings.module').then((m) => m.SettingsModule) }, { + canActivate: [BusinessAdminGuard], path: '**', redirectTo: 'administration/workbaskets' } @@ -55,10 +56,12 @@ const appRoutes: Routes = [ component: NoAccessComponent }, { + canActivate: [BusinessAdminGuard], path: '**', redirectTo: 'taskana/administration/workbaskets' } ]; + @NgModule({ imports: [RouterModule.forRoot(appRoutes, { useHash: true })], exports: [RouterModule] diff --git a/web/src/app/shared/guards/business-admin.guard.ts b/web/src/app/shared/guards/business-admin.guard.ts index 9e42cda78..424e140fd 100644 --- a/web/src/app/shared/guards/business-admin.guard.ts +++ b/web/src/app/shared/guards/business-admin.guard.ts @@ -1,4 +1,4 @@ -import { CanActivate, Router } from '@angular/router'; +import { CanActivate, Router, UrlTree } from '@angular/router'; import { Injectable } from '@angular/core'; import { TaskanaEngineService } from 'app/shared/services/taskana-engine/taskana-engine.service'; @@ -8,15 +8,11 @@ export class BusinessAdminGuard implements CanActivate { constructor(private taskanaEngineService: TaskanaEngineService, public router: Router) {} - canActivate() { + canActivate(): boolean | UrlTree { if (this.taskanaEngineService.hasRole(BusinessAdminGuard.roles)) { return true; } - return this.navigateToWorkplace(); - } - navigateToWorkplace(): boolean { - this.router.navigate(['workplace']); - return false; + return this.router.parseUrl('/taskana/workplace'); } } diff --git a/web/src/app/shared/guards/history.guard.ts b/web/src/app/shared/guards/history.guard.ts index c3789b6db..75cf97a9c 100644 --- a/web/src/app/shared/guards/history.guard.ts +++ b/web/src/app/shared/guards/history.guard.ts @@ -1,5 +1,5 @@ import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot } from '@angular/router'; +import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot, UrlTree } from '@angular/router'; import { Observable, of } from 'rxjs'; import { TaskanaEngineService } from 'app/shared/services/taskana-engine/taskana-engine.service'; import { catchError, map } from 'rxjs/operators'; @@ -10,25 +10,17 @@ import { catchError, map } from 'rxjs/operators'; export class HistoryGuard implements CanActivate { constructor(private taskanaEngineService: TaskanaEngineService, public router: Router) {} - canActivate( - next: ActivatedRouteSnapshot, - state: RouterStateSnapshot - ): Observable | Promise | boolean { + canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { return this.taskanaEngineService.isHistoryProviderEnabled().pipe( map((value) => { if (value) { return value; } - return this.navigateToWorkplace(); + return this.router.parseUrl('/taskana/workplace'); }), catchError(() => { - return of(this.navigateToWorkplace()); + return of(this.router.parseUrl('/taskana/workplace')); }) ); } - - navigateToWorkplace(): boolean { - this.router.navigate(['workplace']); - return false; - } } diff --git a/web/src/app/shared/guards/monitor.guard.ts b/web/src/app/shared/guards/monitor.guard.ts index 0633401d9..d132caf62 100644 --- a/web/src/app/shared/guards/monitor.guard.ts +++ b/web/src/app/shared/guards/monitor.guard.ts @@ -1,21 +1,18 @@ -import { CanActivate, Router } from '@angular/router'; +import { CanActivate, Router, UrlTree } from '@angular/router'; import { Injectable } from '@angular/core'; import { TaskanaEngineService } from 'app/shared/services/taskana-engine/taskana-engine.service'; @Injectable() export class MonitorGuard implements CanActivate { static roles = ['ADMIN', 'MONITOR']; + constructor(private taskanaEngineService: TaskanaEngineService, public router: Router) {} - canActivate() { + canActivate(): boolean | UrlTree { if (this.taskanaEngineService.hasRole(MonitorGuard.roles)) { return true; } - return this.navigateToWorkplace(); - } - navigateToWorkplace(): boolean { - this.router.navigate(['workplace']); - return false; + return this.router.parseUrl('/taskana/workplace'); } } diff --git a/web/src/app/shared/guards/task-routing.guard.ts b/web/src/app/shared/guards/task-routing.guard.ts index 38570a4eb..82a3fe54f 100644 --- a/web/src/app/shared/guards/task-routing.guard.ts +++ b/web/src/app/shared/guards/task-routing.guard.ts @@ -1,5 +1,5 @@ import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot } from '@angular/router'; +import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot, UrlTree } from '@angular/router'; import { Observable, of } from 'rxjs'; import { TaskanaEngineService } from '../services/taskana-engine/taskana-engine.service'; import { catchError, map } from 'rxjs/operators'; @@ -10,25 +10,17 @@ import { catchError, map } from 'rxjs/operators'; export class TaskRoutingGuard implements CanActivate { constructor(private taskanaEngineService: TaskanaEngineService, public router: Router) {} - canActivate( - next: ActivatedRouteSnapshot, - state: RouterStateSnapshot - ): Observable | Promise | boolean { + canActivate(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { return this.taskanaEngineService.isCustomRoutingRulesEnabled().pipe( map((value) => { if (value) { return value; } - return this.navigateToWorkplace(); + return this.router.parseUrl('/taskana/workplace'); }), catchError(() => { - return of(this.navigateToWorkplace()); + return of(this.router.parseUrl('/taskana/workplace')); }) ); } - - navigateToWorkplace(): boolean { - this.router.navigate(['workplace']); - return false; - } } diff --git a/web/src/app/shared/guards/user.guard.ts b/web/src/app/shared/guards/user.guard.ts index b55ce28d5..797cf9768 100644 --- a/web/src/app/shared/guards/user.guard.ts +++ b/web/src/app/shared/guards/user.guard.ts @@ -1,20 +1,18 @@ -import { CanActivate, Router } from '@angular/router'; +import { CanActivate, Router, UrlTree } from '@angular/router'; import { Injectable } from '@angular/core'; import { TaskanaEngineService } from 'app/shared/services/taskana-engine/taskana-engine.service'; @Injectable() export class UserGuard implements CanActivate { static roles = ['ADMIN', 'USER']; + constructor(private taskanaEngineService: TaskanaEngineService, private router: Router) {} - canActivate() { + + canActivate(): boolean | UrlTree { if (this.taskanaEngineService.hasRole(UserGuard.roles)) { return true; } - return this.navigateToNoRole(); - } - navigateToNoRole(): boolean { - this.router.navigate(['no-role']); - return false; + return this.router.parseUrl('/taskana/no-role'); } }