114858: Port to 8.0

This commit is contained in:
Zahraa Chreim
2024-05-08 15:48:55 +03:00
parent 17f6c5520a
commit 1ac3edc3f4
49 changed files with 438 additions and 565 deletions

View File

@@ -9,8 +9,6 @@ import {
} from '@ng-dynamic-forms/core'; } from '@ng-dynamic-forms/core';
import { i18nBreadcrumbResolver } from '../core/breadcrumbs/i18n-breadcrumb.resolver'; import { i18nBreadcrumbResolver } from '../core/breadcrumbs/i18n-breadcrumb.resolver';
import { GroupAdministratorGuard } from '../core/data/feature-authorization/feature-authorization-guard/group-administrator.guard';
import { SiteAdministratorGuard } from '../core/data/feature-authorization/feature-authorization-guard/site-administrator.guard';
import { import {
EPERSON_PATH, EPERSON_PATH,
GROUP_PATH, GROUP_PATH,
@@ -20,8 +18,10 @@ import { EPeopleRegistryComponent } from './epeople-registry/epeople-registry.co
import { EPersonFormComponent } from './epeople-registry/eperson-form/eperson-form.component'; import { EPersonFormComponent } from './epeople-registry/eperson-form/eperson-form.component';
import { EPersonResolver } from './epeople-registry/eperson-resolver.service'; import { EPersonResolver } from './epeople-registry/eperson-resolver.service';
import { GroupFormComponent } from './group-registry/group-form/group-form.component'; import { GroupFormComponent } from './group-registry/group-form/group-form.component';
import { GroupPageGuard } from './group-registry/group-page.guard';
import { GroupsRegistryComponent } from './group-registry/groups-registry.component'; import { GroupsRegistryComponent } from './group-registry/groups-registry.component';
import {
siteAdministratorGuard
} from '../core/data/feature-authorization/feature-authorization-guard/site-administrator.guard';
/** /**
* Condition for displaying error messages on email form field * Condition for displaying error messages on email form field
@@ -46,7 +46,7 @@ export const ROUTES: Route[] = [
}, },
providers, providers,
data: { title: 'admin.access-control.epeople.title', breadcrumbKey: 'admin.access-control.epeople' }, data: { title: 'admin.access-control.epeople.title', breadcrumbKey: 'admin.access-control.epeople' },
canActivate: mapToCanActivate([SiteAdministratorGuard]), canActivate: [siteAdministratorGuard],
}, },
{ {
path: `${EPERSON_PATH}/create`, path: `${EPERSON_PATH}/create`,
@@ -56,7 +56,7 @@ export const ROUTES: Route[] = [
}, },
providers, providers,
data: { title: 'admin.access-control.epeople.add.title', breadcrumbKey: 'admin.access-control.epeople.add' }, data: { title: 'admin.access-control.epeople.add.title', breadcrumbKey: 'admin.access-control.epeople.add' },
canActivate: mapToCanActivate([SiteAdministratorGuard]), canActivate: [siteAdministratorGuard],
}, },
{ {
path: `${EPERSON_PATH}/:id/edit`, path: `${EPERSON_PATH}/:id/edit`,
@@ -67,7 +67,7 @@ export const ROUTES: Route[] = [
}, },
providers, providers,
data: { title: 'admin.access-control.epeople.edit.title', breadcrumbKey: 'admin.access-control.epeople.edit' }, data: { title: 'admin.access-control.epeople.edit.title', breadcrumbKey: 'admin.access-control.epeople.edit' },
canActivate: mapToCanActivate([SiteAdministratorGuard]), canActivate: [siteAdministratorGuard],
}, },
{ {
path: GROUP_PATH, path: GROUP_PATH,
@@ -77,7 +77,7 @@ export const ROUTES: Route[] = [
}, },
providers, providers,
data: { title: 'admin.access-control.groups.title', breadcrumbKey: 'admin.access-control.groups' }, data: { title: 'admin.access-control.groups.title', breadcrumbKey: 'admin.access-control.groups' },
canActivate: mapToCanActivate([GroupAdministratorGuard]), canActivate: [siteAdministratorGuard],
}, },
{ {
path: `${GROUP_PATH}/create`, path: `${GROUP_PATH}/create`,
@@ -90,7 +90,7 @@ export const ROUTES: Route[] = [
title: 'admin.access-control.groups.title.addGroup', title: 'admin.access-control.groups.title.addGroup',
breadcrumbKey: 'admin.access-control.groups.addGroup', breadcrumbKey: 'admin.access-control.groups.addGroup',
}, },
canActivate: mapToCanActivate([GroupAdministratorGuard]), canActivate: [siteAdministratorGuard],
}, },
{ {
path: `${GROUP_PATH}/:groupId/edit`, path: `${GROUP_PATH}/:groupId/edit`,
@@ -103,7 +103,7 @@ export const ROUTES: Route[] = [
title: 'admin.access-control.groups.title.singleGroup', title: 'admin.access-control.groups.title.singleGroup',
breadcrumbKey: 'admin.access-control.groups.singleGroup', breadcrumbKey: 'admin.access-control.groups.singleGroup',
}, },
canActivate: mapToCanActivate([GroupPageGuard]), canActivate: [siteAdministratorGuard],
}, },
{ {
path: 'bulk-access', path: 'bulk-access',
@@ -112,6 +112,6 @@ export const ROUTES: Route[] = [
breadcrumb: i18nBreadcrumbResolver, breadcrumb: i18nBreadcrumbResolver,
}, },
data: { title: 'admin.access-control.bulk-access.title', breadcrumbKey: 'admin.access-control.bulk-access' }, data: { title: 'admin.access-control.bulk-access.title', breadcrumbKey: 'admin.access-control.bulk-access' },
canActivate: mapToCanActivate([SiteAdministratorGuard]), canActivate: [siteAdministratorGuard],
}, },
]; ];

View File

@@ -1,11 +1,23 @@
import { HALEndpointService } from '../../core/shared/hal-endpoint.service'; import {
import { AuthorizationDataService } from '../../core/data/feature-authorization/authorization-data.service'; TestBed,
import { ActivatedRouteSnapshot, Router, UrlTree } from '@angular/router'; waitForAsync,
import { of as observableOf, Observable } from 'rxjs'; } from '@angular/core/testing';
import {
ActivatedRouteSnapshot,
Router,
UrlTree,
} from '@angular/router';
import {
Observable,
of as observableOf,
} from 'rxjs';
import { AuthService } from '../../core/auth/auth.service'; import { AuthService } from '../../core/auth/auth.service';
import { TestBed, waitForAsync } from '@angular/core/testing'; import { AuthorizationDataService } from '../../core/data/feature-authorization/authorization-data.service';
import { groupPageGuard } from './group-page.guard';
import { FeatureID } from '../../core/data/feature-authorization/feature-id'; import { FeatureID } from '../../core/data/feature-authorization/feature-id';
import { HALEndpointService } from '../../core/shared/hal-endpoint.service';
import { groupPageGuard } from './group-page.guard';
jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000; // Increase timeout to 10 seconds jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000; // Increase timeout to 10 seconds
describe('GroupPageGuard', () => { describe('GroupPageGuard', () => {
@@ -15,7 +27,7 @@ describe('GroupPageGuard', () => {
const routeSnapshotWithGroupId = { const routeSnapshotWithGroupId = {
params: { params: {
groupId: groupUuid, groupId: groupUuid,
} },
} as unknown as ActivatedRouteSnapshot; } as unknown as ActivatedRouteSnapshot;
let halEndpointService: HALEndpointService; let halEndpointService: HALEndpointService;
@@ -42,7 +54,7 @@ describe('GroupPageGuard', () => {
{ provide: Router, useValue: router }, { provide: Router, useValue: router },
{ provide: AuthService, useValue: authService }, { provide: AuthService, useValue: authService },
{ provide: HALEndpointService, useValue: halEndpointService }, { provide: HALEndpointService, useValue: halEndpointService },
] ],
}); });
} }
@@ -67,7 +79,7 @@ describe('GroupPageGuard', () => {
result$.subscribe((result) => { result$.subscribe((result) => {
expect(authorizationService.isAuthorized).toHaveBeenCalledWith( expect(authorizationService.isAuthorized).toHaveBeenCalledWith(
FeatureID.CanManageGroup, groupEndpointUrl, undefined FeatureID.CanManageGroup, groupEndpointUrl, undefined,
); );
expect(result).toBeTrue(); expect(result).toBeTrue();
done(); done();
@@ -87,7 +99,7 @@ describe('GroupPageGuard', () => {
result$.subscribe((result) => { result$.subscribe((result) => {
expect(authorizationService.isAuthorized).toHaveBeenCalledWith( expect(authorizationService.isAuthorized).toHaveBeenCalledWith(
FeatureID.CanManageGroup, groupEndpointUrl, undefined FeatureID.CanManageGroup, groupEndpointUrl, undefined,
); );
expect(result).not.toBeTrue(); expect(result).not.toBeTrue();
done(); done();

View File

@@ -1,22 +1,31 @@
import { CanActivateFn, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import { Observable, of as observableOf } from 'rxjs';
import { inject } from '@angular/core'; import { inject } from '@angular/core';
import { map } from 'rxjs/operators';
import { HALEndpointService } from '../../core/shared/hal-endpoint.service';
import { import {
StringGuardParamFn, someFeatureAuthorizationGuard ActivatedRouteSnapshot,
CanActivateFn,
RouterStateSnapshot,
} from '@angular/router';
import {
Observable,
of as observableOf,
} from 'rxjs';
import { map } from 'rxjs/operators';
import {
someFeatureAuthorizationGuard,
StringGuardParamFn,
} from '../../core/data/feature-authorization/feature-authorization-guard/some-feature-authorization.guard'; } from '../../core/data/feature-authorization/feature-authorization-guard/some-feature-authorization.guard';
import { FeatureID } from '../../core/data/feature-authorization/feature-id'; import { FeatureID } from '../../core/data/feature-authorization/feature-id';
import { HALEndpointService } from '../../core/shared/hal-endpoint.service';
const defaultGroupPageGetObjectUrl: StringGuardParamFn = ( const defaultGroupPageGetObjectUrl: StringGuardParamFn = (
route: ActivatedRouteSnapshot, route: ActivatedRouteSnapshot,
state: RouterStateSnapshot state: RouterStateSnapshot,
): Observable<string> => { ): Observable<string> => {
const halEndpointService = inject(HALEndpointService); const halEndpointService = inject(HALEndpointService);
const groupsEndpoint = 'groups'; const groupsEndpoint = 'groups';
return halEndpointService.getEndpoint(groupsEndpoint).pipe( return halEndpointService.getEndpoint(groupsEndpoint).pipe(
map(groupsUrl => `${groupsUrl}/${route?.params?.groupId}`) map(groupsUrl => `${groupsUrl}/${route?.params?.groupId}`),
); );
}; };

View File

@@ -5,14 +5,16 @@ import {
import { i18nBreadcrumbResolver } from '../../core/breadcrumbs/i18n-breadcrumb.resolver'; import { i18nBreadcrumbResolver } from '../../core/breadcrumbs/i18n-breadcrumb.resolver';
import { notifyInfoGuard } from '../../core/coar-notify/notify-info/notify-info.guard'; import { notifyInfoGuard } from '../../core/coar-notify/notify-info/notify-info.guard';
import { SiteAdministratorGuard } from '../../core/data/feature-authorization/feature-authorization-guard/site-administrator.guard';
import { AdminNotifyDashboardComponent } from './admin-notify-dashboard.component'; import { AdminNotifyDashboardComponent } from './admin-notify-dashboard.component';
import { AdminNotifyIncomingComponent } from './admin-notify-logs/admin-notify-incoming/admin-notify-incoming.component'; import { AdminNotifyIncomingComponent } from './admin-notify-logs/admin-notify-incoming/admin-notify-incoming.component';
import { AdminNotifyOutgoingComponent } from './admin-notify-logs/admin-notify-outgoing/admin-notify-outgoing.component'; import { AdminNotifyOutgoingComponent } from './admin-notify-logs/admin-notify-outgoing/admin-notify-outgoing.component';
import {
siteAdministratorGuard
} from '../../core/data/feature-authorization/feature-authorization-guard/site-administrator.guard';
export const ROUTES: Route[] = [ export const ROUTES: Route[] = [
{ {
canActivate: [...mapToCanActivate([SiteAdministratorGuard]), notifyInfoGuard], canActivate: [siteAdministratorGuard, notifyInfoGuard],
path: '', path: '',
resolve: { resolve: {
breadcrumb: i18nBreadcrumbResolver, breadcrumb: i18nBreadcrumbResolver,
@@ -30,7 +32,7 @@ export const ROUTES: Route[] = [
breadcrumb: i18nBreadcrumbResolver, breadcrumb: i18nBreadcrumbResolver,
}, },
component: AdminNotifyIncomingComponent, component: AdminNotifyIncomingComponent,
canActivate: [...mapToCanActivate([SiteAdministratorGuard]), notifyInfoGuard], canActivate: [siteAdministratorGuard, notifyInfoGuard],
data: { data: {
title: 'admin.notify.dashboard.page.title', title: 'admin.notify.dashboard.page.title',
breadcrumbKey: 'admin.notify.dashboard', breadcrumbKey: 'admin.notify.dashboard',
@@ -42,7 +44,7 @@ export const ROUTES: Route[] = [
breadcrumb: i18nBreadcrumbResolver, breadcrumb: i18nBreadcrumbResolver,
}, },
component: AdminNotifyOutgoingComponent, component: AdminNotifyOutgoingComponent,
canActivate: [...mapToCanActivate([SiteAdministratorGuard]), notifyInfoGuard], canActivate: [siteAdministratorGuard, notifyInfoGuard],
data: { data: {
title: 'admin.notify.dashboard.page.title', title: 'admin.notify.dashboard.page.title',
breadcrumbKey: 'admin.notify.dashboard', breadcrumbKey: 'admin.notify.dashboard',

View File

@@ -26,12 +26,10 @@ import { COLLECTION_MODULE_PATH } from './collection-page/collection-page-routin
import { COMMUNITY_MODULE_PATH } from './community-page/community-page-routing-paths'; import { COMMUNITY_MODULE_PATH } from './community-page/community-page-routing-paths';
import { authBlockingGuard } from './core/auth/auth-blocking.guard'; import { authBlockingGuard } from './core/auth/auth-blocking.guard';
import { authenticatedGuard } from './core/auth/authenticated.guard'; import { authenticatedGuard } from './core/auth/authenticated.guard';
import { GroupAdministratorGuard } from './core/data/feature-authorization/feature-authorization-guard/group-administrator.guard'; import { siteRegisterGuard } from './core/data/feature-authorization/feature-authorization-guard/site-register.guard';
import { SiteAdministratorGuard } from './core/data/feature-authorization/feature-authorization-guard/site-administrator.guard';
import { SiteRegisterGuard } from './core/data/feature-authorization/feature-authorization-guard/site-register.guard';
import { EndUserAgreementCurrentUserGuard } from './core/end-user-agreement/end-user-agreement-current-user.guard'; import { EndUserAgreementCurrentUserGuard } from './core/end-user-agreement/end-user-agreement-current-user.guard';
import { reloadGuard } from './core/reload/reload.guard'; import { reloadGuard } from './core/reload/reload.guard';
import { ForgotPasswordCheckGuard } from './core/rest-property/forgot-password-check-guard.guard'; import { forgotPasswordCheckGuard } from './core/rest-property/forgot-password-check-guard.guard';
import { ServerCheckGuard } from './core/server-check/server-check.guard'; import { ServerCheckGuard } from './core/server-check/server-check.guard';
import { ThemedForbiddenComponent } from './forbidden/themed-forbidden.component'; import { ThemedForbiddenComponent } from './forbidden/themed-forbidden.component';
import { ITEM_MODULE_PATH } from './item-page/item-page-routing-paths'; import { ITEM_MODULE_PATH } from './item-page/item-page-routing-paths';
@@ -43,6 +41,12 @@ import { ThemedPageNotFoundComponent } from './pagenotfound/themed-pagenotfound.
import { PROCESS_MODULE_PATH } from './process-page/process-page-routing.paths'; import { PROCESS_MODULE_PATH } from './process-page/process-page-routing.paths';
import { provideSubmissionState } from './submission/provide-submission-state'; import { provideSubmissionState } from './submission/provide-submission-state';
import { SUGGESTION_MODULE_PATH } from './suggestions-page/suggestions-page-routing-paths'; import { SUGGESTION_MODULE_PATH } from './suggestions-page/suggestions-page-routing-paths';
import {
siteAdministratorGuard
} from './core/data/feature-authorization/feature-authorization-guard/site-administrator.guard';
import {
groupAdministratorGuard
} from './core/data/feature-authorization/feature-authorization-guard/group-administrator.guard';
export const APP_ROUTES: Route[] = [ export const APP_ROUTES: Route[] = [
{ path: INTERNAL_SERVER_ERROR, component: ThemedPageInternalServerErrorComponent }, { path: INTERNAL_SERVER_ERROR, component: ThemedPageInternalServerErrorComponent },
@@ -90,13 +94,13 @@ export const APP_ROUTES: Route[] = [
path: REGISTER_PATH, path: REGISTER_PATH,
loadChildren: () => import('./register-page/register-page-routes') loadChildren: () => import('./register-page/register-page-routes')
.then((m) => m.ROUTES), .then((m) => m.ROUTES),
canActivate: mapToCanActivate([SiteRegisterGuard]), canActivate: [siteRegisterGuard],
}, },
{ {
path: FORGOT_PASSWORD_PATH, path: FORGOT_PASSWORD_PATH,
loadChildren: () => import('./forgot-password/forgot-password-routes') loadChildren: () => import('./forgot-password/forgot-password-routes')
.then((m) => m.ROUTES), .then((m) => m.ROUTES),
canActivate: mapToCanActivate([EndUserAgreementCurrentUserGuard, ForgotPasswordCheckGuard]), canActivate: [EndUserAgreementCurrentUserGuard, forgotPasswordCheckGuard],
}, },
{ {
path: COMMUNITY_MODULE_PATH, path: COMMUNITY_MODULE_PATH,
@@ -157,7 +161,7 @@ export const APP_ROUTES: Route[] = [
path: ADMIN_MODULE_PATH, path: ADMIN_MODULE_PATH,
loadChildren: () => import('./admin/admin-routes') loadChildren: () => import('./admin/admin-routes')
.then((m) => m.ROUTES), .then((m) => m.ROUTES),
canActivate: mapToCanActivate([SiteAdministratorGuard, EndUserAgreementCurrentUserGuard]), canActivate: [siteAdministratorGuard, EndUserAgreementCurrentUserGuard],
}, },
{ {
path: NOTIFICATIONS_MODULE_PATH, path: NOTIFICATIONS_MODULE_PATH,
@@ -250,7 +254,7 @@ export const APP_ROUTES: Route[] = [
{ {
path: ACCESS_CONTROL_MODULE_PATH, path: ACCESS_CONTROL_MODULE_PATH,
loadChildren: () => import('./access-control/access-control-routes').then((m) => m.ROUTES), loadChildren: () => import('./access-control/access-control-routes').then((m) => m.ROUTES),
canActivate: mapToCanActivate([GroupAdministratorGuard, EndUserAgreementCurrentUserGuard]), canActivate: [groupAdministratorGuard, EndUserAgreementCurrentUserGuard],
}, },
{ {
path: 'subscriptions', path: 'subscriptions',

View File

@@ -1,11 +1,9 @@
import { inject } from '@angular/core'; import { CanActivateFn } from '@angular/router';
import { CanActivateFn, ResolveFn } from '@angular/router'; import { of as observableOf } from 'rxjs';
import { Observable, of as observableOf } from 'rxjs';
import { BitstreamPageResolver } from './bitstream-page.resolver';
import { Bitstream } from '../core/shared/bitstream.model';
import { dsoPageSingleFeatureGuard } from '../core/data/feature-authorization/feature-authorization-guard/dso-page-single-feature.guard'; import { dsoPageSingleFeatureGuard } from '../core/data/feature-authorization/feature-authorization-guard/dso-page-single-feature.guard';
import { FeatureID } from '../core/data/feature-authorization/feature-id'; import { FeatureID } from '../core/data/feature-authorization/feature-id';
import { RemoteData } from '../core/data/remote-data'; import { bitstreamPageResolver } from './bitstream-page.resolver';
/** /**
* Guard for preventing unauthorized access to certain {@link Bitstream} pages requiring specific authorizations. * Guard for preventing unauthorized access to certain {@link Bitstream} pages requiring specific authorizations.
@@ -13,9 +11,6 @@ import { RemoteData } from '../core/data/remote-data';
*/ */
export const bitstreamPageAuthorizationsGuard: CanActivateFn = export const bitstreamPageAuthorizationsGuard: CanActivateFn =
dsoPageSingleFeatureGuard( dsoPageSingleFeatureGuard(
() => { () => bitstreamPageResolver,
const bitstreamPageResolver = inject(BitstreamPageResolver); () => observableOf(FeatureID.CanManagePolicies),
return bitstreamPageResolver.resolve as ResolveFn<Observable<RemoteData<Bitstream>>>;
},
() => observableOf(FeatureID.CanManagePolicies)
); );

View File

@@ -1,13 +1,9 @@
import { inject } from '@angular/core'; import { CanActivateFn } from '@angular/router';
import { CanActivateFn, ResolveFn } from '@angular/router'; import { of as observableOf } from 'rxjs';
import { Observable, of as observableOf } from 'rxjs';
import { import { dsoPageSingleFeatureGuard } from '../core/data/feature-authorization/feature-authorization-guard/dso-page-single-feature.guard';
dsoPageSingleFeatureGuard
} from '../core/data/feature-authorization/feature-authorization-guard/dso-page-single-feature.guard';
import { FeatureID } from '../core/data/feature-authorization/feature-id'; import { FeatureID } from '../core/data/feature-authorization/feature-id';
import { RemoteData } from '../core/data/remote-data'; import { collectionPageResolver } from './collection-page.resolver';
import { CollectionPageResolver } from './collection-page.resolver';
import { Collection } from '../core/shared/collection.model';
/** /**
* Guard for preventing unauthorized access to certain {@link Collection} pages requiring administrator rights * Guard for preventing unauthorized access to certain {@link Collection} pages requiring administrator rights
@@ -15,9 +11,6 @@ import { Collection } from '../core/shared/collection.model';
*/ */
export const collectionPageAdministratorGuard: CanActivateFn = export const collectionPageAdministratorGuard: CanActivateFn =
dsoPageSingleFeatureGuard( dsoPageSingleFeatureGuard(
() => { () => collectionPageResolver,
const collectionPageResolver = inject(CollectionPageResolver); () => observableOf(FeatureID.AdministratorOf),
return collectionPageResolver.resolve as ResolveFn<Observable<RemoteData<Collection>>>;
},
() => observableOf(FeatureID.AdministratorOf)
); );

View File

@@ -1,7 +1,4 @@
import { import { Route } from '@angular/router';
mapToCanActivate,
Route,
} from '@angular/router';
import { browseByGuard } from '../browse-by/browse-by-guard'; import { browseByGuard } from '../browse-by/browse-by-guard';
import { browseByI18nBreadcrumbResolver } from '../browse-by/browse-by-i18n-breadcrumb.resolver'; import { browseByI18nBreadcrumbResolver } from '../browse-by/browse-by-i18n-breadcrumb.resolver';
@@ -15,7 +12,7 @@ import { dsoEditMenuResolver } from '../shared/dso-page/dso-edit-menu.resolver';
import { LinkMenuItemModel } from '../shared/menu/menu-item/models/link.model'; import { LinkMenuItemModel } from '../shared/menu/menu-item/models/link.model';
import { MenuItemType } from '../shared/menu/menu-item-type.model'; import { MenuItemType } from '../shared/menu/menu-item-type.model';
import { collectionPageResolver } from './collection-page.resolver'; import { collectionPageResolver } from './collection-page.resolver';
import { CollectionPageAdministratorGuard } from './collection-page-administrator.guard'; import { collectionPageAdministratorGuard } from './collection-page-administrator.guard';
import { import {
COLLECTION_CREATE_PATH, COLLECTION_CREATE_PATH,
COLLECTION_EDIT_PATH, COLLECTION_EDIT_PATH,
@@ -65,7 +62,7 @@ export const ROUTES: Route[] = [
path: COLLECTION_EDIT_PATH, path: COLLECTION_EDIT_PATH,
loadChildren: () => import('./edit-collection-page/edit-collection-page-routes') loadChildren: () => import('./edit-collection-page/edit-collection-page-routes')
.then((m) => m.ROUTES), .then((m) => m.ROUTES),
canActivate: mapToCanActivate([CollectionPageAdministratorGuard]), canActivate: [collectionPageAdministratorGuard],
}, },
{ {
path: 'delete', path: 'delete',

View File

@@ -1,10 +1,7 @@
import { import { Route } from '@angular/router';
mapToCanActivate,
Route,
} from '@angular/router';
import { i18nBreadcrumbResolver } from '../../core/breadcrumbs/i18n-breadcrumb.resolver'; import { i18nBreadcrumbResolver } from '../../core/breadcrumbs/i18n-breadcrumb.resolver';
import { CollectionAdministratorGuard } from '../../core/data/feature-authorization/feature-authorization-guard/collection-administrator.guard'; import { collectionAdministratorGuard } from '../../core/data/feature-authorization/feature-authorization-guard/collection-administrator.guard';
import { ResourcePolicyCreateComponent } from '../../shared/resource-policies/create/resource-policy-create.component'; import { ResourcePolicyCreateComponent } from '../../shared/resource-policies/create/resource-policy-create.component';
import { ResourcePolicyEditComponent } from '../../shared/resource-policies/edit/resource-policy-edit.component'; import { ResourcePolicyEditComponent } from '../../shared/resource-policies/edit/resource-policy-edit.component';
import { resourcePolicyResolver } from '../../shared/resource-policies/resolvers/resource-policy.resolver'; import { resourcePolicyResolver } from '../../shared/resource-policies/resolvers/resource-policy.resolver';
@@ -30,7 +27,7 @@ export const ROUTES: Route[] = [
}, },
data: { breadcrumbKey: 'collection.edit' }, data: { breadcrumbKey: 'collection.edit' },
component: EditCollectionPageComponent, component: EditCollectionPageComponent,
canActivate: mapToCanActivate([CollectionAdministratorGuard]), canActivate: [collectionAdministratorGuard],
children: [ children: [
{ {
path: '', path: '',

View File

@@ -1,13 +1,9 @@
import { inject } from '@angular/core'; import { CanActivateFn } from '@angular/router';
import { CanActivateFn, ResolveFn } from '@angular/router'; import { of as observableOf } from 'rxjs';
import { Observable, of as observableOf } from 'rxjs';
import { import { dsoPageSingleFeatureGuard } from '../core/data/feature-authorization/feature-authorization-guard/dso-page-single-feature.guard';
dsoPageSingleFeatureGuard
} from '../core/data/feature-authorization/feature-authorization-guard/dso-page-single-feature.guard';
import { FeatureID } from '../core/data/feature-authorization/feature-id'; import { FeatureID } from '../core/data/feature-authorization/feature-id';
import { RemoteData } from '../core/data/remote-data'; import { communityPageResolver } from './community-page.resolver';
import { Community } from '../core/shared/community.model';
import { CommunityPageResolver } from './community-page.resolver';
/** /**
* Guard for preventing unauthorized access to certain {@link Community} pages requiring administrator rights * Guard for preventing unauthorized access to certain {@link Community} pages requiring administrator rights
@@ -15,9 +11,6 @@ import { CommunityPageResolver } from './community-page.resolver';
*/ */
export const communityPageAdministratorGuard: CanActivateFn = export const communityPageAdministratorGuard: CanActivateFn =
dsoPageSingleFeatureGuard( dsoPageSingleFeatureGuard(
() => { () => communityPageResolver,
const communityPageResolver = inject(CommunityPageResolver); () => observableOf(FeatureID.AdministratorOf),
return communityPageResolver.resolve as ResolveFn<Observable<RemoteData<Community>>>;
},
() => observableOf(FeatureID.AdministratorOf)
); );

View File

@@ -1,7 +1,4 @@
import { import { Route } from '@angular/router';
mapToCanActivate,
Route,
} from '@angular/router';
import { browseByGuard } from '../browse-by/browse-by-guard'; import { browseByGuard } from '../browse-by/browse-by-guard';
import { browseByI18nBreadcrumbResolver } from '../browse-by/browse-by-i18n-breadcrumb.resolver'; import { browseByI18nBreadcrumbResolver } from '../browse-by/browse-by-i18n-breadcrumb.resolver';
@@ -14,7 +11,7 @@ import { dsoEditMenuResolver } from '../shared/dso-page/dso-edit-menu.resolver';
import { LinkMenuItemModel } from '../shared/menu/menu-item/models/link.model'; import { LinkMenuItemModel } from '../shared/menu/menu-item/models/link.model';
import { MenuItemType } from '../shared/menu/menu-item-type.model'; import { MenuItemType } from '../shared/menu/menu-item-type.model';
import { communityPageResolver } from './community-page.resolver'; import { communityPageResolver } from './community-page.resolver';
import { CommunityPageAdministratorGuard } from './community-page-administrator.guard'; import { communityPageAdministratorGuard } from './community-page-administrator.guard';
import { import {
COMMUNITY_CREATE_PATH, COMMUNITY_CREATE_PATH,
COMMUNITY_EDIT_PATH, COMMUNITY_EDIT_PATH,
@@ -62,7 +59,7 @@ export const ROUTES: Route[] = [
path: COMMUNITY_EDIT_PATH, path: COMMUNITY_EDIT_PATH,
loadChildren: () => import('./edit-community-page/edit-community-page-routes') loadChildren: () => import('./edit-community-page/edit-community-page-routes')
.then((m) => m.ROUTES), .then((m) => m.ROUTES),
canActivate: mapToCanActivate([CommunityPageAdministratorGuard]), canActivate: [communityPageAdministratorGuard],
}, },
{ {
path: 'delete', path: 'delete',

View File

@@ -1,10 +1,7 @@
import { import { Route } from '@angular/router';
mapToCanActivate,
Route,
} from '@angular/router';
import { i18nBreadcrumbResolver } from '../../core/breadcrumbs/i18n-breadcrumb.resolver'; import { i18nBreadcrumbResolver } from '../../core/breadcrumbs/i18n-breadcrumb.resolver';
import { CommunityAdministratorGuard } from '../../core/data/feature-authorization/feature-authorization-guard/community-administrator.guard'; import { communityAdministratorGuard } from '../../core/data/feature-authorization/feature-authorization-guard/community-administrator.guard';
import { ResourcePolicyCreateComponent } from '../../shared/resource-policies/create/resource-policy-create.component'; import { ResourcePolicyCreateComponent } from '../../shared/resource-policies/create/resource-policy-create.component';
import { ResourcePolicyEditComponent } from '../../shared/resource-policies/edit/resource-policy-edit.component'; import { ResourcePolicyEditComponent } from '../../shared/resource-policies/edit/resource-policy-edit.component';
import { resourcePolicyResolver } from '../../shared/resource-policies/resolvers/resource-policy.resolver'; import { resourcePolicyResolver } from '../../shared/resource-policies/resolvers/resource-policy.resolver';
@@ -28,7 +25,7 @@ export const ROUTES: Route[] = [
}, },
data: { breadcrumbKey: 'community.edit' }, data: { breadcrumbKey: 'community.edit' },
component: EditCommunityPageComponent, component: EditCommunityPageComponent,
canActivate: mapToCanActivate([CommunityAdministratorGuard]), canActivate: [communityAdministratorGuard],
children: [ children: [
{ {
path: '', path: '',

View File

@@ -1,7 +1,8 @@
import { CanActivateFn } from '@angular/router'; import { CanActivateFn } from '@angular/router';
import { singleFeatureAuthorizationGuard } from './single-feature-authorization.guard';
import { of as observableOf } from 'rxjs'; import { of as observableOf } from 'rxjs';
import { FeatureID } from '../feature-id'; import { FeatureID } from '../feature-id';
import { singleFeatureAuthorizationGuard } from './single-feature-authorization.guard';
/** /**
* Prevent unauthorized activating and loading of routes when the current authenticated user * Prevent unauthorized activating and loading of routes when the current authenticated user

View File

@@ -1,7 +1,8 @@
import { CanActivateFn } from '@angular/router'; import { CanActivateFn } from '@angular/router';
import { singleFeatureAuthorizationGuard } from './single-feature-authorization.guard';
import { of as observableOf } from 'rxjs'; import { of as observableOf } from 'rxjs';
import { FeatureID } from '../feature-id'; import { FeatureID } from '../feature-id';
import { singleFeatureAuthorizationGuard } from './single-feature-authorization.guard';
/** /**
* Prevent unauthorized activating and loading of routes when the current authenticated user * Prevent unauthorized activating and loading of routes when the current authenticated user

View File

@@ -1,21 +1,32 @@
import { AuthorizationDataService } from '../authorization-data.service';
import { Router, UrlTree, ResolveFn } from '@angular/router';
import { RemoteData } from '../../remote-data';
import { Observable, of as observableOf } from 'rxjs';
import { createSuccessfulRemoteDataObject$ } from '../../../../shared/remote-data.utils';
import { DSpaceObject } from '../../../shared/dspace-object.model';
import { AuthService } from '../../../auth/auth.service';
import { TestBed } from '@angular/core/testing'; import { TestBed } from '@angular/core/testing';
import { dsoPageSingleFeatureGuard } from './dso-page-single-feature.guard'; import {
ResolveFn,
Router,
UrlTree,
} from '@angular/router';
import {
Observable,
of as observableOf,
} from 'rxjs';
import { createSuccessfulRemoteDataObject$ } from '../../../../shared/remote-data.utils';
import { AuthService } from '../../../auth/auth.service';
import { DSpaceObject } from '../../../shared/dspace-object.model';
import { RemoteData } from '../../remote-data';
import { AuthorizationDataService } from '../authorization-data.service';
import { FeatureID } from '../feature-id'; import { FeatureID } from '../feature-id';
import { defaultDSOGetObjectUrl, getRouteWithDSOId } from './dso-page-some-feature.guard'; import { dsoPageSingleFeatureGuard } from './dso-page-single-feature.guard';
import {
defaultDSOGetObjectUrl,
getRouteWithDSOId,
} from './dso-page-some-feature.guard';
describe('DsoPageSingleFeatureGuard', () => { describe('DsoPageSingleFeatureGuard', () => {
let authorizationService: AuthorizationDataService; let authorizationService: AuthorizationDataService;
let router: Router; let router: Router;
let authService: AuthService; let authService: AuthService;
let resolver: ResolveFn<Observable<RemoteData<any>>>; let resolver: ResolveFn<RemoteData<any>>;
let object: DSpaceObject; let object: DSpaceObject;
let route; let route;
let parentRoute; let parentRoute;
@@ -24,28 +35,28 @@ describe('DsoPageSingleFeatureGuard', () => {
function init() { function init() {
object = { object = {
self: 'test-selflink' self: 'test-selflink',
} as DSpaceObject; } as DSpaceObject;
authorizationService = jasmine.createSpyObj('authorizationService', { authorizationService = jasmine.createSpyObj('authorizationService', {
isAuthorized: observableOf(true) isAuthorized: observableOf(true),
}); });
router = jasmine.createSpyObj('router', { router = jasmine.createSpyObj('router', {
parseUrl: {} parseUrl: {},
}); });
resolver = () => createSuccessfulRemoteDataObject$(object); resolver = () => createSuccessfulRemoteDataObject$(object);
authService = jasmine.createSpyObj('authService', { authService = jasmine.createSpyObj('authService', {
isAuthenticated: observableOf(true) isAuthenticated: observableOf(true),
}); });
parentRoute = { parentRoute = {
params: { params: {
id: '3e1a5327-dabb-41ff-af93-e6cab9d032f0' id: '3e1a5327-dabb-41ff-af93-e6cab9d032f0',
} },
}; };
route = { route = {
params: { params: {
}, },
parent: parentRoute parent: parentRoute,
}; };
featureId = FeatureID.LoginOnBehalfOf; featureId = FeatureID.LoginOnBehalfOf;
@@ -55,7 +66,7 @@ describe('DsoPageSingleFeatureGuard', () => {
{ provide: AuthorizationDataService, useValue: authorizationService }, { provide: AuthorizationDataService, useValue: authorizationService },
{ provide: Router, useValue: router }, { provide: Router, useValue: router },
{ provide: AuthService, useValue: authService }, { provide: AuthService, useValue: authService },
] ],
}); });
} }
@@ -83,7 +94,7 @@ describe('DsoPageSingleFeatureGuard', () => {
it('should call authorizationService.isAuthenticated with the appropriate arguments', (done) => { it('should call authorizationService.isAuthenticated with the appropriate arguments', (done) => {
const result$ = TestBed.runInInjectionContext(() => { const result$ = TestBed.runInInjectionContext(() => {
return dsoPageSingleFeatureGuard( return dsoPageSingleFeatureGuard(
() => resolver, () => observableOf(featureId) () => resolver, () => observableOf(featureId),
)(route, { url: 'current-url' } as any); )(route, { url: 'current-url' } as any);
}) as Observable<boolean | UrlTree>; }) as Observable<boolean | UrlTree>;

View File

@@ -1,21 +1,27 @@
import { CanActivateFn, ActivatedRouteSnapshot, RouterStateSnapshot, ResolveFn } from '@angular/router'; import {
import { SingleFeatureGuardParamFn } from './single-feature-authorization.guard'; ActivatedRouteSnapshot,
import { dsoPageSomeFeatureGuard } from './dso-page-some-feature.guard'; CanActivateFn,
ResolveFn,
RouterStateSnapshot,
} from '@angular/router';
import { Observable } from 'rxjs'; import { Observable } from 'rxjs';
import { FeatureID } from '../feature-id';
import { map } from 'rxjs/operators'; import { map } from 'rxjs/operators';
import { DSpaceObject } from '../../../shared/dspace-object.model'; import { DSpaceObject } from '../../../shared/dspace-object.model';
import { RemoteData } from '../../remote-data'; import { RemoteData } from '../../remote-data';
import { FeatureID } from '../feature-id';
import { dsoPageSomeFeatureGuard } from './dso-page-some-feature.guard';
import { SingleFeatureGuardParamFn } from './single-feature-authorization.guard';
/** /**
* Abstract Guard for preventing unauthorized access to {@link DSpaceObject} pages that require rights for a specific feature * Abstract Guard for preventing unauthorized access to {@link DSpaceObject} pages that require rights for a specific feature
* This guard utilizes a resolver to retrieve the relevant object to check authorizations for * This guard utilizes a resolver to retrieve the relevant object to check authorizations for
*/ */
export const dsoPageSingleFeatureGuard = <T extends DSpaceObject> ( export const dsoPageSingleFeatureGuard = <T extends DSpaceObject> (
getResolveFn: () => ResolveFn<Observable<RemoteData<T>>>, getResolveFn: () => ResolveFn<RemoteData<T>>,
getFeatureID: SingleFeatureGuardParamFn getFeatureID: SingleFeatureGuardParamFn,
): CanActivateFn => dsoPageSomeFeatureGuard( ): CanActivateFn => dsoPageSomeFeatureGuard(
getResolveFn, getResolveFn,
(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<FeatureID[]> => getFeatureID(route, state).pipe( (route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<FeatureID[]> => getFeatureID(route, state).pipe(
map((featureID: FeatureID) => [featureID]), map((featureID: FeatureID) => [featureID]),
)); ));

View File

@@ -1,24 +1,32 @@
import { AuthorizationDataService } from '../authorization-data.service';
import { Router, UrlTree, ResolveFn } from '@angular/router';
import { RemoteData } from '../../remote-data';
import { Observable, of as observableOf } from 'rxjs';
import { DSpaceObject } from '../../../shared/dspace-object.model';
import { AuthService } from '../../../auth/auth.service';
import {
dsoPageSomeFeatureGuard,
defaultDSOGetObjectUrl,
getRouteWithDSOId
} from './dso-page-some-feature.guard';
import { TestBed } from '@angular/core/testing'; import { TestBed } from '@angular/core/testing';
import { FeatureID } from '../feature-id'; import {
ResolveFn,
Router,
UrlTree,
} from '@angular/router';
import {
Observable,
of as observableOf,
} from 'rxjs';
import { createSuccessfulRemoteDataObject$ } from '../../../../shared/remote-data.utils'; import { createSuccessfulRemoteDataObject$ } from '../../../../shared/remote-data.utils';
import { AuthService } from '../../../auth/auth.service';
import { DSpaceObject } from '../../../shared/dspace-object.model';
import { RemoteData } from '../../remote-data';
import { AuthorizationDataService } from '../authorization-data.service';
import { FeatureID } from '../feature-id';
import {
defaultDSOGetObjectUrl,
dsoPageSomeFeatureGuard,
getRouteWithDSOId,
} from './dso-page-some-feature.guard';
describe('dsoPageSomeFeatureGuard and its functions', () => { describe('dsoPageSomeFeatureGuard and its functions', () => {
let authorizationService: AuthorizationDataService; let authorizationService: AuthorizationDataService;
let router: Router; let router: Router;
let authService: AuthService; let authService: AuthService;
let resolver: ResolveFn<Observable<RemoteData<any>>>; let resolver: ResolveFn<RemoteData<any>>;
let object: DSpaceObject; let object: DSpaceObject;
let route; let route;
let parentRoute; let parentRoute;
@@ -27,28 +35,28 @@ describe('dsoPageSomeFeatureGuard and its functions', () => {
function init() { function init() {
object = { object = {
self: 'test-selflink' self: 'test-selflink',
} as DSpaceObject; } as DSpaceObject;
featureIds = [FeatureID.LoginOnBehalfOf, FeatureID.CanDelete]; featureIds = [FeatureID.LoginOnBehalfOf, FeatureID.CanDelete];
authorizationService = jasmine.createSpyObj('authorizationService', { authorizationService = jasmine.createSpyObj('authorizationService', {
isAuthorized: observableOf(true) isAuthorized: observableOf(true),
}); });
router = jasmine.createSpyObj('router', { router = jasmine.createSpyObj('router', {
parseUrl: {} parseUrl: {},
}); });
resolver = () => createSuccessfulRemoteDataObject$(object); resolver = () => createSuccessfulRemoteDataObject$(object);
authService = jasmine.createSpyObj('authService', { authService = jasmine.createSpyObj('authService', {
isAuthenticated: observableOf(true) isAuthenticated: observableOf(true),
}); });
parentRoute = { parentRoute = {
params: { params: {
id: '3e1a5327-dabb-41ff-af93-e6cab9d032f0' id: '3e1a5327-dabb-41ff-af93-e6cab9d032f0',
} },
}; };
route = { route = {
params: { params: {
}, },
parent: parentRoute parent: parentRoute,
}; };
TestBed.configureTestingModule({ TestBed.configureTestingModule({
@@ -56,7 +64,7 @@ describe('dsoPageSomeFeatureGuard and its functions', () => {
{ provide: AuthorizationDataService, useValue: authorizationService }, { provide: AuthorizationDataService, useValue: authorizationService },
{ provide: Router, useValue: router }, { provide: Router, useValue: router },
{ provide: AuthService, useValue: authService }, { provide: AuthService, useValue: authService },
] ],
}); });
} }
@@ -87,7 +95,7 @@ describe('dsoPageSomeFeatureGuard and its functions', () => {
it('should call authorizationService.isAuthenticated with the appropriate arguments', (done) => { it('should call authorizationService.isAuthenticated with the appropriate arguments', (done) => {
const result$ = TestBed.runInInjectionContext(() => { const result$ = TestBed.runInInjectionContext(() => {
return dsoPageSomeFeatureGuard( return dsoPageSomeFeatureGuard(
() => resolver, () => observableOf(featureIds) () => resolver, () => observableOf(featureIds),
)(route, { url: 'current-url' } as any); )(route, { url: 'current-url' } as any);
}) as Observable<boolean | UrlTree>; }) as Observable<boolean | UrlTree>;

View File

@@ -1,18 +1,27 @@
import { DSpaceObject } from '../../../shared/dspace-object.model';
import { ResolveFn, ActivatedRouteSnapshot, RouterStateSnapshot, CanActivateFn } from '@angular/router';
import { Observable } from 'rxjs';
import { RemoteData } from '../../remote-data';
import { hasValue, hasNoValue } from '../../../../shared/empty.util';
import { getAllSucceededRemoteDataPayload } from '../../../shared/operators';
import { map } from 'rxjs/operators';
import { import {
StringGuardParamFn, ActivatedRouteSnapshot,
SomeFeatureGuardParamFn, CanActivateFn,
someFeatureAuthorizationGuard ResolveFn,
} from './some-feature-authorization.guard'; RouterStateSnapshot,
import { FeatureID } from '../feature-id'; } from '@angular/router';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
export declare type DSOGetObjectURlFn = <T extends DSpaceObject>(resolve: ResolveFn<Observable<RemoteData<T>>>) => StringGuardParamFn; import {
hasNoValue,
hasValue,
} from '../../../../shared/empty.util';
import { DSpaceObject } from '../../../shared/dspace-object.model';
import { getAllSucceededRemoteDataPayload } from '../../../shared/operators';
import { RemoteData } from '../../remote-data';
import { FeatureID } from '../feature-id';
import {
someFeatureAuthorizationGuard,
SomeFeatureGuardParamFn,
StringGuardParamFn,
} from './some-feature-authorization.guard';
export declare type DSOGetObjectURlFn = <T extends DSpaceObject>(resolve: ResolveFn<RemoteData<T>>) => StringGuardParamFn;
/** /**
@@ -29,12 +38,12 @@ export const getRouteWithDSOId = (route: ActivatedRouteSnapshot): ActivatedRoute
export const defaultDSOGetObjectUrl: DSOGetObjectURlFn = <T extends DSpaceObject>(resolve: ResolveFn<Observable<RemoteData<T>>>): StringGuardParamFn => { export const defaultDSOGetObjectUrl: DSOGetObjectURlFn = <T extends DSpaceObject>(resolve: ResolveFn<RemoteData<T>>): StringGuardParamFn => {
return (route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<string> => { return (route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<string> => {
const routeWithObjectID = getRouteWithDSOId(route); const routeWithObjectID = getRouteWithDSOId(route);
return (resolve(routeWithObjectID, state) as Observable<RemoteData<T>>).pipe( return (resolve(routeWithObjectID, state) as Observable<RemoteData<T>>).pipe(
getAllSucceededRemoteDataPayload(), getAllSucceededRemoteDataPayload(),
map((dso) => dso.self) map((dso) => dso.self),
); );
}; };
}; };
@@ -44,7 +53,7 @@ export const defaultDSOGetObjectUrl: DSOGetObjectURlFn = <T extends DSpaceObject
* This guard utilizes a resolver to retrieve the relevant object to check authorizations for * This guard utilizes a resolver to retrieve the relevant object to check authorizations for
*/ */
export const dsoPageSomeFeatureGuard = <T extends DSpaceObject>( export const dsoPageSomeFeatureGuard = <T extends DSpaceObject>(
getResolveFn: () => ResolveFn<Observable<RemoteData<T>>>, getResolveFn: () => ResolveFn<RemoteData<T>>,
getFeatureIDs: SomeFeatureGuardParamFn, getFeatureIDs: SomeFeatureGuardParamFn,
getObjectUrl: DSOGetObjectURlFn = defaultDSOGetObjectUrl, getObjectUrl: DSOGetObjectURlFn = defaultDSOGetObjectUrl,
getEPersonUuid?: StringGuardParamFn, getEPersonUuid?: StringGuardParamFn,

View File

@@ -1,7 +1,8 @@
import { CanActivateFn } from '@angular/router'; import { CanActivateFn } from '@angular/router';
import { singleFeatureAuthorizationGuard } from './single-feature-authorization.guard';
import { of as observableOf } from 'rxjs'; import { of as observableOf } from 'rxjs';
import { FeatureID } from '../feature-id'; import { FeatureID } from '../feature-id';
import { singleFeatureAuthorizationGuard } from './single-feature-authorization.guard';
/** /**
* Prevent unauthorized activating and loading of routes when the current authenticated user doesn't have group * Prevent unauthorized activating and loading of routes when the current authenticated user doesn't have group

View File

@@ -1,10 +1,20 @@
import {
TestBed,
waitForAsync,
} from '@angular/core/testing';
import {
Router,
UrlTree,
} from '@angular/router';
import {
Observable,
of as observableOf,
} from 'rxjs';
import { AuthService } from '../../../auth/auth.service';
import { AuthorizationDataService } from '../authorization-data.service'; import { AuthorizationDataService } from '../authorization-data.service';
import { FeatureID } from '../feature-id'; import { FeatureID } from '../feature-id';
import { of as observableOf, Observable } from 'rxjs';
import { Router, UrlTree } from '@angular/router';
import { AuthService } from '../../../auth/auth.service';
import { singleFeatureAuthorizationGuard } from './single-feature-authorization.guard'; import { singleFeatureAuthorizationGuard } from './single-feature-authorization.guard';
import { waitForAsync, TestBed } from '@angular/core/testing';
describe('singleFeatureAuthorizationGuard', () => { describe('singleFeatureAuthorizationGuard', () => {
let authorizationService: AuthorizationDataService; let authorizationService: AuthorizationDataService;
@@ -35,7 +45,7 @@ describe('singleFeatureAuthorizationGuard', () => {
{ provide: AuthorizationDataService, useValue: authorizationService }, { provide: AuthorizationDataService, useValue: authorizationService },
{ provide: Router, useValue: router }, { provide: Router, useValue: router },
{ provide: AuthService, useValue: authService }, { provide: AuthService, useValue: authService },
] ],
}); });
} }

View File

@@ -1,8 +1,16 @@
import { ActivatedRouteSnapshot, RouterStateSnapshot, CanActivateFn } from '@angular/router'; import {
ActivatedRouteSnapshot,
CanActivateFn,
RouterStateSnapshot,
} from '@angular/router';
import { Observable } from 'rxjs'; import { Observable } from 'rxjs';
import { FeatureID } from '../feature-id';
import { map } from 'rxjs/operators'; import { map } from 'rxjs/operators';
import { StringGuardParamFn, someFeatureAuthorizationGuard } from './some-feature-authorization.guard';
import { FeatureID } from '../feature-id';
import {
someFeatureAuthorizationGuard,
StringGuardParamFn,
} from './some-feature-authorization.guard';
export declare type SingleFeatureGuardParamFn = (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => Observable<FeatureID>; export declare type SingleFeatureGuardParamFn = (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => Observable<FeatureID>;
@@ -23,5 +31,5 @@ export const singleFeatureAuthorizationGuard = (
getEPersonUuid?: StringGuardParamFn, getEPersonUuid?: StringGuardParamFn,
): CanActivateFn => someFeatureAuthorizationGuard( ): CanActivateFn => someFeatureAuthorizationGuard(
(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<FeatureID[]> => getFeatureID(route, state).pipe( (route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<FeatureID[]> => getFeatureID(route, state).pipe(
map((featureID: FeatureID) => [featureID]), map((featureID: FeatureID) => [featureID]),
), getObjectUrl, getEPersonUuid); ), getObjectUrl, getEPersonUuid);

View File

@@ -1,7 +1,8 @@
import { CanActivateFn } from '@angular/router'; import { CanActivateFn } from '@angular/router';
import { of as observableOf } from 'rxjs';
import { FeatureID } from '../feature-id'; import { FeatureID } from '../feature-id';
import { singleFeatureAuthorizationGuard } from './single-feature-authorization.guard'; import { singleFeatureAuthorizationGuard } from './single-feature-authorization.guard';
import { of as observableOf } from 'rxjs';
/** /**
* Prevent unauthorized activating and loading of routes when the current authenticated user doesn't have administrator * Prevent unauthorized activating and loading of routes when the current authenticated user doesn't have administrator

View File

@@ -1,7 +1,8 @@
import { CanActivateFn } from '@angular/router'; import { CanActivateFn } from '@angular/router';
import { singleFeatureAuthorizationGuard } from './single-feature-authorization.guard';
import { of as observableOf } from 'rxjs'; import { of as observableOf } from 'rxjs';
import { FeatureID } from '../feature-id'; import { FeatureID } from '../feature-id';
import { singleFeatureAuthorizationGuard } from './single-feature-authorization.guard';
/** /**
* Prevent unauthorized activating and loading of routes when the current authenticated user doesn't have registration * Prevent unauthorized activating and loading of routes when the current authenticated user doesn't have registration

View File

@@ -1,10 +1,20 @@
import {
TestBed,
waitForAsync,
} from '@angular/core/testing';
import {
Router,
UrlTree,
} from '@angular/router';
import {
Observable,
of as observableOf,
} from 'rxjs';
import { AuthService } from '../../../auth/auth.service';
import { AuthorizationDataService } from '../authorization-data.service'; import { AuthorizationDataService } from '../authorization-data.service';
import { FeatureID } from '../feature-id'; import { FeatureID } from '../feature-id';
import { Observable, of as observableOf } from 'rxjs';
import { Router, UrlTree } from '@angular/router';
import { AuthService } from '../../../auth/auth.service';
import { someFeatureAuthorizationGuard } from './some-feature-authorization.guard'; import { someFeatureAuthorizationGuard } from './some-feature-authorization.guard';
import { TestBed, waitForAsync } from '@angular/core/testing';
describe('SomeFeatureAuthorizationGuard', () => { describe('SomeFeatureAuthorizationGuard', () => {
let authorizationService: AuthorizationDataService; let authorizationService: AuthorizationDataService;
@@ -25,15 +35,15 @@ describe('SomeFeatureAuthorizationGuard', () => {
authorizationService = Object.assign({ authorizationService = Object.assign({
isAuthorized(featureId?: FeatureID): Observable<boolean> { isAuthorized(featureId?: FeatureID): Observable<boolean> {
return observableOf(authorizedFeatureIds.indexOf(featureId) > -1); return observableOf(authorizedFeatureIds.indexOf(featureId) > -1);
} },
}); });
router = jasmine.createSpyObj('router', { router = jasmine.createSpyObj('router', {
parseUrl: {} parseUrl: {},
}); });
authService = jasmine.createSpyObj('authService', { authService = jasmine.createSpyObj('authService', {
isAuthenticated: observableOf(true) isAuthenticated: observableOf(true),
}); });
TestBed.configureTestingModule({ TestBed.configureTestingModule({
@@ -41,7 +51,7 @@ describe('SomeFeatureAuthorizationGuard', () => {
{ provide: AuthorizationDataService, useValue: authorizationService }, { provide: AuthorizationDataService, useValue: authorizationService },
{ provide: Router, useValue: router }, { provide: Router, useValue: router },
{ provide: AuthService, useValue: authService }, { provide: AuthService, useValue: authService },
] ],
}); });
} }

View File

@@ -1,11 +1,22 @@
import { ActivatedRouteSnapshot, RouterStateSnapshot, CanActivateFn, Router, UrlTree } from '@angular/router';
import { Observable, of as observableOf, combineLatest as observableCombineLatest } from 'rxjs';
import { FeatureID } from '../feature-id';
import { AuthorizationDataService } from '../authorization-data.service';
import { AuthService } from '../../../auth/auth.service';
import { inject } from '@angular/core'; import { inject } from '@angular/core';
import {
ActivatedRouteSnapshot,
CanActivateFn,
Router,
RouterStateSnapshot,
UrlTree,
} from '@angular/router';
import {
combineLatest as observableCombineLatest,
Observable,
of as observableOf,
} from 'rxjs';
import { switchMap } from 'rxjs/operators'; import { switchMap } from 'rxjs/operators';
import { AuthService } from '../../../auth/auth.service';
import { returnForbiddenUrlTreeOrLoginOnAllFalse } from '../../../shared/authorized.operators'; import { returnForbiddenUrlTreeOrLoginOnAllFalse } from '../../../shared/authorized.operators';
import { AuthorizationDataService } from '../authorization-data.service';
import { FeatureID } from '../feature-id';
export declare type SomeFeatureGuardParamFn = (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => Observable<FeatureID[]>; export declare type SomeFeatureGuardParamFn = (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => Observable<FeatureID[]>;
export declare type StringGuardParamFn = (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => Observable<string>; export declare type StringGuardParamFn = (route: ActivatedRouteSnapshot, state: RouterStateSnapshot) => Observable<string>;
@@ -33,7 +44,7 @@ export const someFeatureAuthorizationGuard = (
return observableCombineLatest([ return observableCombineLatest([
getFeatureIDs(route, state), getFeatureIDs(route, state),
getObjectUrl(route, state), getObjectUrl(route, state),
getEPersonUuid(route, state) getEPersonUuid(route, state),
]).pipe( ]).pipe(
switchMap(([featureIDs, objectUrl, ePersonUuid]: [FeatureID[], string, string]) => switchMap(([featureIDs, objectUrl, ePersonUuid]: [FeatureID[], string, string]) =>
observableCombineLatest(featureIDs.map((featureID) => authorizationService.isAuthorized(featureID, objectUrl, ePersonUuid))), observableCombineLatest(featureIDs.map((featureID) => authorizationService.isAuthorized(featureID, objectUrl, ePersonUuid))),

View File

@@ -1,7 +1,8 @@
import { CanActivateFn } from '@angular/router'; import { CanActivateFn } from '@angular/router';
import { singleFeatureAuthorizationGuard } from './single-feature-authorization.guard';
import { of as observableOf } from 'rxjs'; import { of as observableOf } from 'rxjs';
import { FeatureID } from '../feature-id'; import { FeatureID } from '../feature-id';
import { singleFeatureAuthorizationGuard } from './single-feature-authorization.guard';
/** /**
* Prevent unauthorized activating and loading of routes when the current authenticated user doesn't have group * Prevent unauthorized activating and loading of routes when the current authenticated user doesn't have group

View File

@@ -1,37 +1,11 @@
import { Injectable } from '@angular/core'; import { CanActivateFn } from '@angular/router';
import { import { of as observableOf } from 'rxjs';
ActivatedRouteSnapshot,
Router,
RouterStateSnapshot,
} from '@angular/router';
import {
Observable,
of,
} from 'rxjs';
import { AuthService } from '../auth/auth.service'; import { singleFeatureAuthorizationGuard } from '../data/feature-authorization/feature-authorization-guard/single-feature-authorization.guard';
import { AuthorizationDataService } from '../data/feature-authorization/authorization-data.service';
import { SingleFeatureAuthorizationGuard } from '../data/feature-authorization/feature-authorization-guard/single-feature-authorization.guard';
import { FeatureID } from '../data/feature-authorization/feature-id'; import { FeatureID } from '../data/feature-authorization/feature-id';
@Injectable({
providedIn: 'root',
})
/** /**
* Guard that checks if the forgot-password feature is enabled * Guard that checks if the forgot-password feature is enabled
*/ */
export class ForgotPasswordCheckGuard extends SingleFeatureAuthorizationGuard { export const forgotPasswordCheckGuard: CanActivateFn =
singleFeatureAuthorizationGuard(() => observableOf(FeatureID.EPersonForgotPassword));
constructor(
protected readonly authorizationService: AuthorizationDataService,
protected readonly router: Router,
protected readonly authService: AuthService,
) {
super(authorizationService, router, authService);
}
getFeatureID(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<FeatureID> {
return of(FeatureID.EPersonForgotPassword);
}
}

View File

@@ -1,10 +1,7 @@
import { import { Route } from '@angular/router';
mapToCanActivate,
Route,
} from '@angular/router';
import { i18nBreadcrumbResolver } from '../core/breadcrumbs/i18n-breadcrumb.resolver'; import { i18nBreadcrumbResolver } from '../core/breadcrumbs/i18n-breadcrumb.resolver';
import { SiteAdministratorGuard } from '../core/data/feature-authorization/feature-authorization-guard/site-administrator.guard'; import { siteAdministratorGuard } from '../core/data/feature-authorization/feature-authorization-guard/site-administrator.guard';
import { HealthPageComponent } from './health-page.component'; import { HealthPageComponent } from './health-page.component';
export const ROUTES: Route[] = [ export const ROUTES: Route[] = [
@@ -15,7 +12,7 @@ export const ROUTES: Route[] = [
breadcrumbKey: 'health', breadcrumbKey: 'health',
title: 'health-page.title', title: 'health-page.title',
}, },
canActivate: mapToCanActivate([SiteAdministratorGuard]), canActivate: [siteAdministratorGuard],
component: HealthPageComponent, component: HealthPageComponent,
}, },
]; ];

View File

@@ -1,7 +1,4 @@
import { import { Route } from '@angular/router';
mapToCanActivate,
Route,
} from '@angular/router';
import { i18nBreadcrumbResolver } from '../../core/breadcrumbs/i18n-breadcrumb.resolver'; import { i18nBreadcrumbResolver } from '../../core/breadcrumbs/i18n-breadcrumb.resolver';
import { ThemedDsoEditMetadataComponent } from '../../dso-shared/dso-edit-metadata/themed-dso-edit-metadata.component'; import { ThemedDsoEditMetadataComponent } from '../../dso-shared/dso-edit-metadata/themed-dso-edit-metadata.component';
@@ -27,17 +24,17 @@ import { ItemCollectionMapperComponent } from './item-collection-mapper/item-col
import { ItemCurateComponent } from './item-curate/item-curate.component'; import { ItemCurateComponent } from './item-curate/item-curate.component';
import { ItemDeleteComponent } from './item-delete/item-delete.component'; import { ItemDeleteComponent } from './item-delete/item-delete.component';
import { ItemMoveComponent } from './item-move/item-move.component'; import { ItemMoveComponent } from './item-move/item-move.component';
import { ItemPageAccessControlGuard } from './item-page-access-control.guard'; import { itemPageAccessControlGuard } from './item-page-access-control.guard';
import { ItemPageBitstreamsGuard } from './item-page-bitstreams.guard'; import { itemPageBitstreamsGuard } from './item-page-bitstreams.guard';
import { ItemPageCollectionMapperGuard } from './item-page-collection-mapper.guard'; import { itemPageCollectionMapperGuard } from './item-page-collection-mapper.guard';
import { ItemPageCurateGuard } from './item-page-curate.guard'; import { itemPageCurateGuard } from './item-page-curate.guard';
import { ItemPageMetadataGuard } from './item-page-metadata.guard'; import { itemPageMetadataGuard } from './item-page-metadata.guard';
import { ItemPageRegisterDoiGuard } from './item-page-register-doi.guard'; import { itemPageRegisterDoiGuard } from './item-page-register-doi.guard';
import { ItemPageReinstateGuard } from './item-page-reinstate.guard'; import { itemPageReinstateGuard } from './item-page-reinstate.guard';
import { ItemPageRelationshipsGuard } from './item-page-relationships.guard'; import { itemPageRelationshipsGuard } from './item-page-relationships.guard';
import { ItemPageStatusGuard } from './item-page-status.guard'; import { itemPageStatusGuard } from './item-page-status.guard';
import { ItemPageVersionHistoryGuard } from './item-page-version-history.guard'; import { itemPageVersionHistoryGuard } from './item-page-version-history.guard';
import { ItemPageWithdrawGuard } from './item-page-withdraw.guard'; import { itemPageWithdrawGuard } from './item-page-withdraw.guard';
import { ItemPrivateComponent } from './item-private/item-private.component'; import { ItemPrivateComponent } from './item-private/item-private.component';
import { ItemPublicComponent } from './item-public/item-public.component'; import { ItemPublicComponent } from './item-public/item-public.component';
import { ItemRegisterDoiComponent } from './item-register-doi/item-register-doi.component'; import { ItemRegisterDoiComponent } from './item-register-doi/item-register-doi.component';
@@ -72,31 +69,31 @@ export const ROUTES: Route[] = [
path: 'status', path: 'status',
component: ThemedItemStatusComponent, component: ThemedItemStatusComponent,
data: { title: 'item.edit.tabs.status.title', showBreadcrumbs: true }, data: { title: 'item.edit.tabs.status.title', showBreadcrumbs: true },
canActivate: mapToCanActivate([ItemPageStatusGuard]), canActivate: [itemPageStatusGuard],
}, },
{ {
path: 'bitstreams', path: 'bitstreams',
component: ItemBitstreamsComponent, component: ItemBitstreamsComponent,
data: { title: 'item.edit.tabs.bitstreams.title', showBreadcrumbs: true }, data: { title: 'item.edit.tabs.bitstreams.title', showBreadcrumbs: true },
canActivate: mapToCanActivate([ItemPageBitstreamsGuard]), canActivate: [itemPageBitstreamsGuard],
}, },
{ {
path: 'metadata', path: 'metadata',
component: ThemedDsoEditMetadataComponent, component: ThemedDsoEditMetadataComponent,
data: { title: 'item.edit.tabs.metadata.title', showBreadcrumbs: true }, data: { title: 'item.edit.tabs.metadata.title', showBreadcrumbs: true },
canActivate: mapToCanActivate([ItemPageMetadataGuard]), canActivate: [itemPageMetadataGuard],
}, },
{ {
path: 'curate', path: 'curate',
component: ItemCurateComponent, component: ItemCurateComponent,
data: { title: 'item.edit.tabs.curate.title', showBreadcrumbs: true }, data: { title: 'item.edit.tabs.curate.title', showBreadcrumbs: true },
canActivate: mapToCanActivate([ItemPageCurateGuard]), canActivate: [itemPageCurateGuard],
}, },
{ {
path: 'relationships', path: 'relationships',
component: ItemRelationshipsComponent, component: ItemRelationshipsComponent,
data: { title: 'item.edit.tabs.relationships.title', showBreadcrumbs: true }, data: { title: 'item.edit.tabs.relationships.title', showBreadcrumbs: true },
canActivate: mapToCanActivate([ItemPageRelationshipsGuard]), canActivate: [itemPageRelationshipsGuard],
}, },
/* TODO - uncomment & fix when view page exists /* TODO - uncomment & fix when view page exists
{ {
@@ -114,19 +111,19 @@ export const ROUTES: Route[] = [
path: 'versionhistory', path: 'versionhistory',
component: ItemVersionHistoryComponent, component: ItemVersionHistoryComponent,
data: { title: 'item.edit.tabs.versionhistory.title', showBreadcrumbs: true }, data: { title: 'item.edit.tabs.versionhistory.title', showBreadcrumbs: true },
canActivate: mapToCanActivate([ItemPageVersionHistoryGuard]), canActivate: [itemPageVersionHistoryGuard],
}, },
{ {
path: 'access-control', path: 'access-control',
component: ItemAccessControlComponent, component: ItemAccessControlComponent,
data: { title: 'item.edit.tabs.access-control.title', showBreadcrumbs: true }, data: { title: 'item.edit.tabs.access-control.title', showBreadcrumbs: true },
canActivate: mapToCanActivate([ItemPageAccessControlGuard]), canActivate: [itemPageAccessControlGuard],
}, },
{ {
path: 'mapper', path: 'mapper',
component: ItemCollectionMapperComponent, component: ItemCollectionMapperComponent,
data: { title: 'item.edit.tabs.item-mapper.title', showBreadcrumbs: true }, data: { title: 'item.edit.tabs.item-mapper.title', showBreadcrumbs: true },
canActivate: mapToCanActivate([ItemPageCollectionMapperGuard]), canActivate: [itemPageCollectionMapperGuard],
}, },
], ],
}, },
@@ -137,12 +134,12 @@ export const ROUTES: Route[] = [
{ {
path: ITEM_EDIT_WITHDRAW_PATH, path: ITEM_EDIT_WITHDRAW_PATH,
component: ItemWithdrawComponent, component: ItemWithdrawComponent,
canActivate: mapToCanActivate([ItemPageWithdrawGuard]), canActivate: [itemPageWithdrawGuard],
}, },
{ {
path: ITEM_EDIT_REINSTATE_PATH, path: ITEM_EDIT_REINSTATE_PATH,
component: ItemReinstateComponent, component: ItemReinstateComponent,
canActivate: mapToCanActivate([ItemPageReinstateGuard]), canActivate: [itemPageReinstateGuard],
}, },
{ {
path: ITEM_EDIT_PRIVATE_PATH, path: ITEM_EDIT_PRIVATE_PATH,
@@ -164,7 +161,7 @@ export const ROUTES: Route[] = [
{ {
path: ITEM_EDIT_REGISTER_DOI_PATH, path: ITEM_EDIT_REGISTER_DOI_PATH,
component: ItemRegisterDoiComponent, component: ItemRegisterDoiComponent,
canActivate: mapToCanActivate([ItemPageRegisterDoiGuard]), canActivate: [itemPageRegisterDoiGuard],
data: { title: 'item.edit.register-doi.title' }, data: { title: 'item.edit.register-doi.title' },
}, },
{ {

View File

@@ -1,43 +1,15 @@
import { Injectable } from '@angular/core'; import { CanActivateFn } from '@angular/router';
import { import { of as observableOf } from 'rxjs';
ActivatedRouteSnapshot,
ResolveFn,
Router,
RouterStateSnapshot,
} from '@angular/router';
import {
Observable,
of as observableOf,
} from 'rxjs';
import { AuthService } from '../../core/auth/auth.service'; import { dsoPageSingleFeatureGuard } from '../../core/data/feature-authorization/feature-authorization-guard/dso-page-single-feature.guard';
import { AuthorizationDataService } from '../../core/data/feature-authorization/authorization-data.service';
import { DsoPageSingleFeatureGuard } from '../../core/data/feature-authorization/feature-authorization-guard/dso-page-single-feature.guard';
import { FeatureID } from '../../core/data/feature-authorization/feature-id'; import { FeatureID } from '../../core/data/feature-authorization/feature-id';
import { RemoteData } from '../../core/data/remote-data';
import { Item } from '../../core/shared/item.model';
import { itemPageResolver } from '../item-page.resolver'; import { itemPageResolver } from '../item-page.resolver';
@Injectable({
providedIn: 'root',
})
/** /**
* Guard for preventing unauthorized access to certain {@link Item} pages requiring administrator rights * Guard for preventing unauthorized access to certain {@link Item} pages requiring administrator rights
*/ */
export class ItemPageAccessControlGuard extends DsoPageSingleFeatureGuard<Item> { export const itemPageAccessControlGuard: CanActivateFn =
dsoPageSingleFeatureGuard(
protected resolver: ResolveFn<RemoteData<Item>> = itemPageResolver; () => itemPageResolver,
() => observableOf(FeatureID.AdministratorOf),
constructor(protected authorizationService: AuthorizationDataService, );
protected router: Router,
protected authService: AuthService) {
super(authorizationService, router, authService);
}
/**
* Check administrator authorization rights
*/
getFeatureID(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<FeatureID> {
return observableOf(FeatureID.AdministratorOf);
}
}

View File

@@ -1,13 +1,9 @@
import { inject } from '@angular/core'; import { CanActivateFn } from '@angular/router';
import { import { of as observableOf } from 'rxjs';
dsoPageSingleFeatureGuard
} from '../../core/data/feature-authorization/feature-authorization-guard/dso-page-single-feature.guard'; import { dsoPageSingleFeatureGuard } from '../../core/data/feature-authorization/feature-authorization-guard/dso-page-single-feature.guard';
import { Item } from '../../core/shared/item.model';
import { ItemPageResolver } from '../item-page.resolver';
import { CanActivateFn, ResolveFn } from '@angular/router';
import { Observable, of as observableOf } from 'rxjs';
import { FeatureID } from '../../core/data/feature-authorization/feature-id'; import { FeatureID } from '../../core/data/feature-authorization/feature-id';
import { RemoteData } from '../../core/data/remote-data'; import { itemPageResolver } from '../item-page.resolver';
/** /**
* Guard for preventing unauthorized access to certain {@link Item} pages requiring manage bitstreams rights * Guard for preventing unauthorized access to certain {@link Item} pages requiring manage bitstreams rights
@@ -15,9 +11,6 @@ import { RemoteData } from '../../core/data/remote-data';
*/ */
export const itemPageBitstreamsGuard: CanActivateFn = export const itemPageBitstreamsGuard: CanActivateFn =
dsoPageSingleFeatureGuard( dsoPageSingleFeatureGuard(
() => { () => itemPageResolver,
const itemPageResolver = inject(ItemPageResolver); () => observableOf(FeatureID.CanManageBitstreamBundles),
return itemPageResolver.resolve as ResolveFn<Observable<RemoteData<Item>>>;
},
() => observableOf(FeatureID.CanManageBitstreamBundles)
); );

View File

@@ -1,13 +1,9 @@
import { inject } from '@angular/core'; import { CanActivateFn } from '@angular/router';
import { import { of as observableOf } from 'rxjs';
dsoPageSingleFeatureGuard
} from '../../core/data/feature-authorization/feature-authorization-guard/dso-page-single-feature.guard'; import { dsoPageSingleFeatureGuard } from '../../core/data/feature-authorization/feature-authorization-guard/dso-page-single-feature.guard';
import { Item } from '../../core/shared/item.model';
import { ItemPageResolver } from '../item-page.resolver';
import { CanActivateFn, ResolveFn } from '@angular/router';
import { Observable, of as observableOf } from 'rxjs';
import { FeatureID } from '../../core/data/feature-authorization/feature-id'; import { FeatureID } from '../../core/data/feature-authorization/feature-id';
import { RemoteData } from '../../core/data/remote-data'; import { itemPageResolver } from '../item-page.resolver';
/** /**
* Guard for preventing unauthorized access to certain {@link Item} pages requiring manage mappings rights * Guard for preventing unauthorized access to certain {@link Item} pages requiring manage mappings rights
@@ -15,9 +11,6 @@ import { RemoteData } from '../../core/data/remote-data';
*/ */
export const itemPageCollectionMapperGuard: CanActivateFn = export const itemPageCollectionMapperGuard: CanActivateFn =
dsoPageSingleFeatureGuard( dsoPageSingleFeatureGuard(
() => { () => itemPageResolver,
const itemPageResolver = inject(ItemPageResolver); () => observableOf(FeatureID.CanManageMappings),
return itemPageResolver.resolve as ResolveFn<Observable<RemoteData<Item>>>;
},
() => observableOf(FeatureID.CanManageMappings)
); );

View File

@@ -1,43 +1,15 @@
import { Injectable } from '@angular/core'; import { CanActivateFn } from '@angular/router';
import { import { of as observableOf } from 'rxjs';
ActivatedRouteSnapshot,
ResolveFn,
Router,
RouterStateSnapshot,
} from '@angular/router';
import {
Observable,
of as observableOf,
} from 'rxjs';
import { AuthService } from '../../core/auth/auth.service'; import { dsoPageSingleFeatureGuard } from '../../core/data/feature-authorization/feature-authorization-guard/dso-page-single-feature.guard';
import { AuthorizationDataService } from '../../core/data/feature-authorization/authorization-data.service';
import { DsoPageSingleFeatureGuard } from '../../core/data/feature-authorization/feature-authorization-guard/dso-page-single-feature.guard';
import { FeatureID } from '../../core/data/feature-authorization/feature-id'; import { FeatureID } from '../../core/data/feature-authorization/feature-id';
import { RemoteData } from '../../core/data/remote-data';
import { Item } from '../../core/shared/item.model';
import { itemPageResolver } from '../item-page.resolver'; import { itemPageResolver } from '../item-page.resolver';
@Injectable({
providedIn: 'root',
})
/** /**
* Guard for preventing unauthorized access to certain {@link Item} pages requiring administrator rights * Guard for preventing unauthorized access to certain {@link Item} pages requiring administrator rights
*/ */
export class ItemPageCurateGuard extends DsoPageSingleFeatureGuard<Item> { export const itemPageCurateGuard: CanActivateFn =
dsoPageSingleFeatureGuard(
protected resolver: ResolveFn<RemoteData<Item>> = itemPageResolver; () => itemPageResolver,
() => observableOf(FeatureID.AdministratorOf),
constructor(protected authorizationService: AuthorizationDataService, );
protected router: Router,
protected authService: AuthService) {
super(authorizationService, router, authService);
}
/**
* Check administrator authorization rights
*/
getFeatureID(next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<FeatureID> {
return observableOf(FeatureID.AdministratorOf);
}
}

View File

@@ -1,13 +1,9 @@
import { inject } from '@angular/core'; import { CanActivateFn } from '@angular/router';
import { import { of as observableOf } from 'rxjs';
dsoPageSingleFeatureGuard
} from '../../core/data/feature-authorization/feature-authorization-guard/dso-page-single-feature.guard'; import { dsoPageSingleFeatureGuard } from '../../core/data/feature-authorization/feature-authorization-guard/dso-page-single-feature.guard';
import { Item } from '../../core/shared/item.model';
import { ItemPageResolver } from '../item-page.resolver';
import { CanActivateFn, ResolveFn } from '@angular/router';
import { Observable, of as observableOf } from 'rxjs';
import { FeatureID } from '../../core/data/feature-authorization/feature-id'; import { FeatureID } from '../../core/data/feature-authorization/feature-id';
import { RemoteData } from '../../core/data/remote-data'; import { itemPageResolver } from '../item-page.resolver';
/** /**
* Guard for preventing unauthorized access to certain {@link Item} pages requiring specific authorizations. * Guard for preventing unauthorized access to certain {@link Item} pages requiring specific authorizations.
@@ -15,9 +11,6 @@ import { RemoteData } from '../../core/data/remote-data';
*/ */
export const itemPageDeleteGuard: CanActivateFn = export const itemPageDeleteGuard: CanActivateFn =
dsoPageSingleFeatureGuard( dsoPageSingleFeatureGuard(
() => { () => itemPageResolver,
const itemPageResolver = inject(ItemPageResolver); () => observableOf(FeatureID.CanDelete),
return itemPageResolver.resolve as ResolveFn<Observable<RemoteData<Item>>>;
},
() => observableOf(FeatureID.CanDelete)
); );

View File

@@ -1,13 +1,9 @@
import { inject } from '@angular/core'; import { CanActivateFn } from '@angular/router';
import { import { of as observableOf } from 'rxjs';
dsoPageSingleFeatureGuard
} from '../../core/data/feature-authorization/feature-authorization-guard/dso-page-single-feature.guard'; import { dsoPageSingleFeatureGuard } from '../../core/data/feature-authorization/feature-authorization-guard/dso-page-single-feature.guard';
import { Item } from '../../core/shared/item.model';
import { ItemPageResolver } from '../item-page.resolver';
import { CanActivateFn, ResolveFn } from '@angular/router';
import { Observable, of as observableOf } from 'rxjs';
import { FeatureID } from '../../core/data/feature-authorization/feature-id'; import { FeatureID } from '../../core/data/feature-authorization/feature-id';
import { RemoteData } from '../../core/data/remote-data'; import { itemPageResolver } from '../item-page.resolver';
/** /**
* Guard for preventing unauthorized access to certain {@link Item} pages requiring specific authorizations. * Guard for preventing unauthorized access to certain {@link Item} pages requiring specific authorizations.
@@ -15,9 +11,6 @@ import { RemoteData } from '../../core/data/remote-data';
*/ */
export const itemPageEditAuthorizationsGuard: CanActivateFn = export const itemPageEditAuthorizationsGuard: CanActivateFn =
dsoPageSingleFeatureGuard( dsoPageSingleFeatureGuard(
() => { () => itemPageResolver,
const itemPageResolver = inject(ItemPageResolver); () => observableOf(FeatureID.CanManagePolicies),
return itemPageResolver.resolve as ResolveFn<Observable<RemoteData<Item>>>;
},
() => observableOf(FeatureID.CanManagePolicies)
); );

View File

@@ -1,13 +1,9 @@
import { inject } from '@angular/core'; import { CanActivateFn } from '@angular/router';
import { import { of as observableOf } from 'rxjs';
dsoPageSingleFeatureGuard
} from '../../core/data/feature-authorization/feature-authorization-guard/dso-page-single-feature.guard'; import { dsoPageSingleFeatureGuard } from '../../core/data/feature-authorization/feature-authorization-guard/dso-page-single-feature.guard';
import { Item } from '../../core/shared/item.model';
import { ItemPageResolver } from '../item-page.resolver';
import { CanActivateFn, ResolveFn } from '@angular/router';
import { Observable, of as observableOf } from 'rxjs';
import { FeatureID } from '../../core/data/feature-authorization/feature-id'; import { FeatureID } from '../../core/data/feature-authorization/feature-id';
import { RemoteData } from '../../core/data/remote-data'; import { itemPageResolver } from '../item-page.resolver';
/** /**
* Guard for preventing unauthorized access to certain {@link Item} pages requiring edit metadata rights * Guard for preventing unauthorized access to certain {@link Item} pages requiring edit metadata rights
@@ -15,9 +11,6 @@ import { RemoteData } from '../../core/data/remote-data';
*/ */
export const itemPageMetadataGuard: CanActivateFn = export const itemPageMetadataGuard: CanActivateFn =
dsoPageSingleFeatureGuard( dsoPageSingleFeatureGuard(
() => { () => itemPageResolver,
const itemPageResolver = inject(ItemPageResolver); () => observableOf(FeatureID.CanEditMetadata),
return itemPageResolver.resolve as ResolveFn<Observable<RemoteData<Item>>>;
},
() => observableOf(FeatureID.CanEditMetadata)
); );

View File

@@ -1,13 +1,9 @@
import { inject } from '@angular/core'; import { CanActivateFn } from '@angular/router';
import { import { of as observableOf } from 'rxjs';
dsoPageSingleFeatureGuard
} from '../../core/data/feature-authorization/feature-authorization-guard/dso-page-single-feature.guard'; import { dsoPageSingleFeatureGuard } from '../../core/data/feature-authorization/feature-authorization-guard/dso-page-single-feature.guard';
import { Item } from '../../core/shared/item.model';
import { ItemPageResolver } from '../item-page.resolver';
import { CanActivateFn, ResolveFn } from '@angular/router';
import { Observable, of as observableOf } from 'rxjs';
import { FeatureID } from '../../core/data/feature-authorization/feature-id'; import { FeatureID } from '../../core/data/feature-authorization/feature-id';
import { RemoteData } from '../../core/data/remote-data'; import { itemPageResolver } from '../item-page.resolver';
/** /**
* Guard for preventing unauthorized access to certain {@link Item} pages requiring specific authorizations. * Guard for preventing unauthorized access to certain {@link Item} pages requiring specific authorizations.
@@ -15,9 +11,6 @@ import { RemoteData } from '../../core/data/remote-data';
*/ */
export const itemPageMoveGuard: CanActivateFn = export const itemPageMoveGuard: CanActivateFn =
dsoPageSingleFeatureGuard( dsoPageSingleFeatureGuard(
() => { () => itemPageResolver,
const itemPageResolver = inject(ItemPageResolver); () => observableOf(FeatureID.CanMove),
return itemPageResolver.resolve as ResolveFn<Observable<RemoteData<Item>>>;
},
() => observableOf(FeatureID.CanMove)
); );

View File

@@ -1,13 +1,9 @@
import { inject } from '@angular/core'; import { CanActivateFn } from '@angular/router';
import { import { of as observableOf } from 'rxjs';
dsoPageSingleFeatureGuard
} from '../../core/data/feature-authorization/feature-authorization-guard/dso-page-single-feature.guard'; import { dsoPageSingleFeatureGuard } from '../../core/data/feature-authorization/feature-authorization-guard/dso-page-single-feature.guard';
import { Item } from '../../core/shared/item.model';
import { ItemPageResolver } from '../item-page.resolver';
import { CanActivateFn, ResolveFn } from '@angular/router';
import { Observable, of as observableOf } from 'rxjs';
import { FeatureID } from '../../core/data/feature-authorization/feature-id'; import { FeatureID } from '../../core/data/feature-authorization/feature-id';
import { RemoteData } from '../../core/data/remote-data'; import { itemPageResolver } from '../item-page.resolver';
/** /**
* Guard for preventing unauthorized access to certain {@link Item} pages requiring specific authorizations. * Guard for preventing unauthorized access to certain {@link Item} pages requiring specific authorizations.
@@ -15,9 +11,6 @@ import { RemoteData } from '../../core/data/remote-data';
*/ */
export const itemPagePrivateGuard: CanActivateFn = export const itemPagePrivateGuard: CanActivateFn =
dsoPageSingleFeatureGuard( dsoPageSingleFeatureGuard(
() => { () => itemPageResolver,
const itemPageResolver = inject(ItemPageResolver); () => observableOf(FeatureID.CanMakePrivate),
return itemPageResolver.resolve as ResolveFn<Observable<RemoteData<Item>>>;
},
() => observableOf(FeatureID.CanMakePrivate)
); );

View File

@@ -1,13 +1,9 @@
import { inject } from '@angular/core'; import { CanActivateFn } from '@angular/router';
import { import { of as observableOf } from 'rxjs';
dsoPageSingleFeatureGuard
} from '../../core/data/feature-authorization/feature-authorization-guard/dso-page-single-feature.guard'; import { dsoPageSingleFeatureGuard } from '../../core/data/feature-authorization/feature-authorization-guard/dso-page-single-feature.guard';
import { Item } from '../../core/shared/item.model';
import { ItemPageResolver } from '../item-page.resolver';
import { CanActivateFn, ResolveFn } from '@angular/router';
import { Observable, of as observableOf } from 'rxjs';
import { FeatureID } from '../../core/data/feature-authorization/feature-id'; import { FeatureID } from '../../core/data/feature-authorization/feature-id';
import { RemoteData } from '../../core/data/remote-data'; import { itemPageResolver } from '../item-page.resolver';
/** /**
* Guard for preventing unauthorized access to certain {@link Item} pages requiring DOI registration rights * Guard for preventing unauthorized access to certain {@link Item} pages requiring DOI registration rights
@@ -15,9 +11,6 @@ import { RemoteData } from '../../core/data/remote-data';
*/ */
export const itemPageRegisterDoiGuard: CanActivateFn = export const itemPageRegisterDoiGuard: CanActivateFn =
dsoPageSingleFeatureGuard( dsoPageSingleFeatureGuard(
() => { () => itemPageResolver,
const itemPageResolver = inject(ItemPageResolver); () => observableOf(FeatureID.CanRegisterDOI),
return itemPageResolver.resolve as ResolveFn<Observable<RemoteData<Item>>>;
},
() => observableOf(FeatureID.CanRegisterDOI)
); );

View File

@@ -1,13 +1,9 @@
import { inject } from '@angular/core'; import { CanActivateFn } from '@angular/router';
import { import { of as observableOf } from 'rxjs';
dsoPageSingleFeatureGuard
} from '../../core/data/feature-authorization/feature-authorization-guard/dso-page-single-feature.guard'; import { dsoPageSingleFeatureGuard } from '../../core/data/feature-authorization/feature-authorization-guard/dso-page-single-feature.guard';
import { Item } from '../../core/shared/item.model';
import { ItemPageResolver } from '../item-page.resolver';
import { CanActivateFn, ResolveFn } from '@angular/router';
import { Observable, of as observableOf } from 'rxjs';
import { FeatureID } from '../../core/data/feature-authorization/feature-id'; import { FeatureID } from '../../core/data/feature-authorization/feature-id';
import { RemoteData } from '../../core/data/remote-data'; import { itemPageResolver } from '../item-page.resolver';
/** /**
* Guard for preventing unauthorized access to certain {@link Item} pages requiring reinstate rights * Guard for preventing unauthorized access to certain {@link Item} pages requiring reinstate rights
@@ -15,9 +11,6 @@ import { RemoteData } from '../../core/data/remote-data';
*/ */
export const itemPageReinstateGuard: CanActivateFn = export const itemPageReinstateGuard: CanActivateFn =
dsoPageSingleFeatureGuard( dsoPageSingleFeatureGuard(
() => { () => itemPageResolver,
const itemPageResolver = inject(ItemPageResolver); () => observableOf(FeatureID.ReinstateItem),
return itemPageResolver.resolve as ResolveFn<Observable<RemoteData<Item>>>;
},
() => observableOf(FeatureID.ReinstateItem)
); );

View File

@@ -1,13 +1,9 @@
import { inject } from '@angular/core'; import { CanActivateFn } from '@angular/router';
import { import { of as observableOf } from 'rxjs';
dsoPageSingleFeatureGuard
} from '../../core/data/feature-authorization/feature-authorization-guard/dso-page-single-feature.guard'; import { dsoPageSingleFeatureGuard } from '../../core/data/feature-authorization/feature-authorization-guard/dso-page-single-feature.guard';
import { Item } from '../../core/shared/item.model';
import { ItemPageResolver } from '../item-page.resolver';
import { CanActivateFn, ResolveFn } from '@angular/router';
import { Observable, of as observableOf } from 'rxjs';
import { FeatureID } from '../../core/data/feature-authorization/feature-id'; import { FeatureID } from '../../core/data/feature-authorization/feature-id';
import { RemoteData } from '../../core/data/remote-data'; import { itemPageResolver } from '../item-page.resolver';
/** /**
* Guard for preventing unauthorized access to certain {@link Item} pages requiring manage relationships rights * Guard for preventing unauthorized access to certain {@link Item} pages requiring manage relationships rights
@@ -15,9 +11,6 @@ import { RemoteData } from '../../core/data/remote-data';
*/ */
export const itemPageRelationshipsGuard: CanActivateFn = export const itemPageRelationshipsGuard: CanActivateFn =
dsoPageSingleFeatureGuard( dsoPageSingleFeatureGuard(
() => { () => itemPageResolver,
const itemPageResolver = inject(ItemPageResolver); () => observableOf(FeatureID.CanManageRelationships),
return itemPageResolver.resolve as ResolveFn<Observable<RemoteData<Item>>>;
},
() => observableOf(FeatureID.CanManageRelationships)
); );

View File

@@ -1,13 +1,9 @@
import { import { CanActivateFn } from '@angular/router';
dsoPageSomeFeatureGuard import { of as observableOf } from 'rxjs';
} from '../../core/data/feature-authorization/feature-authorization-guard/dso-page-some-feature.guard';
import { CanActivateFn, ResolveFn } from '@angular/router'; import { dsoPageSomeFeatureGuard } from '../../core/data/feature-authorization/feature-authorization-guard/dso-page-some-feature.guard';
import { inject } from '@angular/core';
import { ItemPageResolver } from '../item-page.resolver';
import { Observable, of as observableOf } from 'rxjs';
import { RemoteData } from '../../core/data/remote-data';
import { Item } from '../../core/shared/item.model';
import { FeatureID } from '../../core/data/feature-authorization/feature-id'; import { FeatureID } from '../../core/data/feature-authorization/feature-id';
import { itemPageResolver } from '../item-page.resolver';
/** /**
* Guard for preventing unauthorized access to certain {@link Item} pages requiring any of the rights required for * Guard for preventing unauthorized access to certain {@link Item} pages requiring any of the rights required for
@@ -16,9 +12,6 @@ import { FeatureID } from '../../core/data/feature-authorization/feature-id';
*/ */
export const itemPageStatusGuard: CanActivateFn = export const itemPageStatusGuard: CanActivateFn =
dsoPageSomeFeatureGuard( dsoPageSomeFeatureGuard(
() => { () => itemPageResolver,
const itemPageResolver = inject(ItemPageResolver); () => observableOf([FeatureID.CanManageMappings, FeatureID.WithdrawItem, FeatureID.ReinstateItem, FeatureID.CanManagePolicies, FeatureID.CanMakePrivate, FeatureID.CanDelete, FeatureID.CanMove, FeatureID.CanRegisterDOI]),
return itemPageResolver.resolve as ResolveFn<Observable<RemoteData<Item>>>;
},
() => observableOf([FeatureID.CanManageMappings, FeatureID.WithdrawItem, FeatureID.ReinstateItem, FeatureID.CanManagePolicies, FeatureID.CanMakePrivate, FeatureID.CanDelete, FeatureID.CanMove, FeatureID.CanRegisterDOI])
); );

View File

@@ -1,13 +1,9 @@
import { inject } from '@angular/core'; import { CanActivateFn } from '@angular/router';
import { import { of as observableOf } from 'rxjs';
dsoPageSingleFeatureGuard
} from '../../core/data/feature-authorization/feature-authorization-guard/dso-page-single-feature.guard'; import { dsoPageSingleFeatureGuard } from '../../core/data/feature-authorization/feature-authorization-guard/dso-page-single-feature.guard';
import { Item } from '../../core/shared/item.model';
import { ItemPageResolver } from '../item-page.resolver';
import { CanActivateFn, ResolveFn } from '@angular/router';
import { Observable, of as observableOf } from 'rxjs';
import { FeatureID } from '../../core/data/feature-authorization/feature-id'; import { FeatureID } from '../../core/data/feature-authorization/feature-id';
import { RemoteData } from '../../core/data/remote-data'; import { itemPageResolver } from '../item-page.resolver';
/** /**
* Guard for preventing unauthorized access to certain {@link Item} pages requiring manage versions rights * Guard for preventing unauthorized access to certain {@link Item} pages requiring manage versions rights
@@ -15,9 +11,6 @@ import { RemoteData } from '../../core/data/remote-data';
*/ */
export const itemPageVersionHistoryGuard: CanActivateFn = export const itemPageVersionHistoryGuard: CanActivateFn =
dsoPageSingleFeatureGuard( dsoPageSingleFeatureGuard(
() => { () => itemPageResolver,
const itemPageResolver = inject(ItemPageResolver); () => observableOf(FeatureID.CanManageVersions),
return itemPageResolver.resolve as ResolveFn<Observable<RemoteData<Item>>>;
},
() => observableOf(FeatureID.CanManageVersions)
); );

View File

@@ -1,13 +1,9 @@
import { inject } from '@angular/core'; import { CanActivateFn } from '@angular/router';
import { import { of as observableOf } from 'rxjs';
dsoPageSingleFeatureGuard
} from '../../core/data/feature-authorization/feature-authorization-guard/dso-page-single-feature.guard'; import { dsoPageSingleFeatureGuard } from '../../core/data/feature-authorization/feature-authorization-guard/dso-page-single-feature.guard';
import { Item } from '../../core/shared/item.model';
import { ItemPageResolver } from '../item-page.resolver';
import { CanActivateFn, ResolveFn } from '@angular/router';
import { Observable, of as observableOf } from 'rxjs';
import { FeatureID } from '../../core/data/feature-authorization/feature-id'; import { FeatureID } from '../../core/data/feature-authorization/feature-id';
import { RemoteData } from '../../core/data/remote-data'; import { itemPageResolver } from '../item-page.resolver';
/** /**
* Guard for preventing unauthorized access to certain {@link Item} pages requiring withdraw rights * Guard for preventing unauthorized access to certain {@link Item} pages requiring withdraw rights
@@ -15,9 +11,6 @@ import { RemoteData } from '../../core/data/remote-data';
*/ */
export const itemPageWithdrawGuard: CanActivateFn = export const itemPageWithdrawGuard: CanActivateFn =
dsoPageSingleFeatureGuard( dsoPageSingleFeatureGuard(
() => { () => itemPageResolver,
const itemPageResolver = inject(ItemPageResolver); () => observableOf(FeatureID.WithdrawItem),
return itemPageResolver.resolve as ResolveFn<Observable<RemoteData<Item>>>;
},
() => observableOf(FeatureID.WithdrawItem)
); );

View File

@@ -1,22 +1,15 @@
import { inject } from '@angular/core'; import { CanActivateFn } from '@angular/router';
import { CanActivateFn, ResolveFn } from '@angular/router'; import { of as observableOf } from 'rxjs';
import { Observable, of as observableOf } from 'rxjs';
import { ItemPageResolver } from './item-page.resolver'; import { dsoPageSingleFeatureGuard } from '../core/data/feature-authorization/feature-authorization-guard/dso-page-single-feature.guard';
import {
dsoPageSingleFeatureGuard
} from '../core/data/feature-authorization/feature-authorization-guard/dso-page-single-feature.guard';
import { FeatureID } from '../core/data/feature-authorization/feature-id'; import { FeatureID } from '../core/data/feature-authorization/feature-id';
import { RemoteData } from '../core/data/remote-data'; import { itemPageResolver } from './item-page.resolver';
import { Item } from '../core/shared/item.model';
/** /**
* Guard for preventing unauthorized access to certain {@link Item} pages requiring administrator rights * Guard for preventing unauthorized access to certain {@link Item} pages requiring administrator rights
*/ */
export const itemPageAdministratorGuard: CanActivateFn = export const itemPageAdministratorGuard: CanActivateFn =
dsoPageSingleFeatureGuard( dsoPageSingleFeatureGuard(
() => { () => itemPageResolver,
const itemPageResolver = inject(ItemPageResolver); () => observableOf(FeatureID.AdministratorOf),
return itemPageResolver.resolve as ResolveFn<Observable<RemoteData<Item>>>;
},
() => observableOf(FeatureID.AdministratorOf)
); );

View File

@@ -1,7 +1,4 @@
import { import { Route } from '@angular/router';
mapToCanActivate,
Route,
} from '@angular/router';
import { REQUEST_COPY_MODULE_PATH } from '../app-routing-paths'; import { REQUEST_COPY_MODULE_PATH } from '../app-routing-paths';
import { authenticatedGuard } from '../core/auth/authenticated.guard'; import { authenticatedGuard } from '../core/auth/authenticated.guard';
@@ -19,7 +16,7 @@ import {
UPLOAD_BITSTREAM_PATH, UPLOAD_BITSTREAM_PATH,
} from './item-page-routing-paths'; } from './item-page-routing-paths';
import { OrcidPageComponent } from './orcid-page/orcid-page.component'; import { OrcidPageComponent } from './orcid-page/orcid-page.component';
import { OrcidPageGuard } from './orcid-page/orcid-page.guard'; import { orcidPageGuard } from './orcid-page/orcid-page.guard';
import { ThemedItemPageComponent } from './simple/themed-item-page.component'; import { ThemedItemPageComponent } from './simple/themed-item-page.component';
import { versionResolver } from './version-page/version.resolver'; import { versionResolver } from './version-page/version.resolver';
import { VersionPageComponent } from './version-page/version-page/version-page.component'; import { VersionPageComponent } from './version-page/version-page/version-page.component';
@@ -60,7 +57,7 @@ export const ROUTES: Route[] = [
{ {
path: ORCID_PATH, path: ORCID_PATH,
component: OrcidPageComponent, component: OrcidPageComponent,
canActivate: [authenticatedGuard, ...mapToCanActivate([OrcidPageGuard])], canActivate: [authenticatedGuard, orcidPageGuard],
}, },
], ],
data: { data: {

View File

@@ -1,13 +1,9 @@
import { inject } from '@angular/core'; import { CanActivateFn } from '@angular/router';
import { import { of as observableOf } from 'rxjs';
dsoPageSingleFeatureGuard
} from '../../core/data/feature-authorization/feature-authorization-guard/dso-page-single-feature.guard'; import { dsoPageSingleFeatureGuard } from '../../core/data/feature-authorization/feature-authorization-guard/dso-page-single-feature.guard';
import { Item } from '../../core/shared/item.model';
import { ItemPageResolver } from '../item-page.resolver';
import { CanActivateFn, ResolveFn } from '@angular/router';
import { Observable, of as observableOf } from 'rxjs';
import { FeatureID } from '../../core/data/feature-authorization/feature-id'; import { FeatureID } from '../../core/data/feature-authorization/feature-id';
import { RemoteData } from '../../core/data/remote-data'; import { itemPageResolver } from '../item-page.resolver';
/** /**
* Guard for preventing unauthorized access to certain {@link Item} pages requiring administrator rights * Guard for preventing unauthorized access to certain {@link Item} pages requiring administrator rights
@@ -15,9 +11,6 @@ import { RemoteData } from '../../core/data/remote-data';
*/ */
export const orcidPageGuard: CanActivateFn = export const orcidPageGuard: CanActivateFn =
dsoPageSingleFeatureGuard( dsoPageSingleFeatureGuard(
() => { () => itemPageResolver,
const itemPageResolver = inject(ItemPageResolver); () => observableOf(FeatureID.CanSynchronizeWithORCID),
return itemPageResolver.resolve as ResolveFn<Observable<RemoteData<Item>>>;
},
() => observableOf(FeatureID.CanSynchronizeWithORCID)
); );

View File

@@ -1,12 +1,9 @@
import { import { Route } from '@angular/router';
mapToCanActivate,
Route,
} from '@angular/router';
import { collectionPageResolver } from '../collection-page/collection-page.resolver'; import { collectionPageResolver } from '../collection-page/collection-page.resolver';
import { communityPageResolver } from '../community-page/community-page.resolver'; import { communityPageResolver } from '../community-page/community-page.resolver';
import { i18nBreadcrumbResolver } from '../core/breadcrumbs/i18n-breadcrumb.resolver'; import { i18nBreadcrumbResolver } from '../core/breadcrumbs/i18n-breadcrumb.resolver';
import { StatisticsAdministratorGuard } from '../core/data/feature-authorization/feature-authorization-guard/statistics-administrator.guard'; import { statisticsAdministratorGuard } from '../core/data/feature-authorization/feature-authorization-guard/statistics-administrator.guard';
import { itemResolver } from '../item-page/item.resolver'; import { itemResolver } from '../item-page/item.resolver';
import { ThemedCollectionStatisticsPageComponent } from './collection-statistics-page/themed-collection-statistics-page.component'; import { ThemedCollectionStatisticsPageComponent } from './collection-statistics-page/themed-collection-statistics-page.component';
import { ThemedCommunityStatisticsPageComponent } from './community-statistics-page/themed-community-statistics-page.component'; import { ThemedCommunityStatisticsPageComponent } from './community-statistics-page/themed-community-statistics-page.component';
@@ -29,7 +26,7 @@ export const ROUTES: Route[] = [
component: ThemedSiteStatisticsPageComponent, component: ThemedSiteStatisticsPageComponent,
}, },
], ],
canActivate: mapToCanActivate([StatisticsAdministratorGuard]), canActivate: [statisticsAdministratorGuard],
}, },
{ {
path: `items/:id`, path: `items/:id`,
@@ -42,7 +39,7 @@ export const ROUTES: Route[] = [
breadcrumbKey: 'statistics', breadcrumbKey: 'statistics',
}, },
component: ThemedItemStatisticsPageComponent, component: ThemedItemStatisticsPageComponent,
canActivate: mapToCanActivate([StatisticsAdministratorGuard]), canActivate: [statisticsAdministratorGuard],
}, },
{ {
path: `collections/:id`, path: `collections/:id`,
@@ -55,7 +52,7 @@ export const ROUTES: Route[] = [
breadcrumbKey: 'statistics', breadcrumbKey: 'statistics',
}, },
component: ThemedCollectionStatisticsPageComponent, component: ThemedCollectionStatisticsPageComponent,
canActivate: mapToCanActivate([StatisticsAdministratorGuard]), canActivate: [statisticsAdministratorGuard],
}, },
{ {
path: `communities/:id`, path: `communities/:id`,
@@ -68,6 +65,6 @@ export const ROUTES: Route[] = [
breadcrumbKey: 'statistics', breadcrumbKey: 'statistics',
}, },
component: ThemedCommunityStatisticsPageComponent, component: ThemedCommunityStatisticsPageComponent,
canActivate: mapToCanActivate([StatisticsAdministratorGuard]), canActivate: [statisticsAdministratorGuard],
}, },
]; ];

View File

@@ -1,15 +1,12 @@
import { import { Route } from '@angular/router';
mapToCanActivate,
Route,
} from '@angular/router';
import { SiteAdministratorGuard } from '../core/data/feature-authorization/feature-authorization-guard/site-administrator.guard'; import { siteAdministratorGuard } from '../core/data/feature-authorization/feature-authorization-guard/site-administrator.guard';
import { SystemWideAlertFormComponent } from './alert-form/system-wide-alert-form.component'; import { SystemWideAlertFormComponent } from './alert-form/system-wide-alert-form.component';
export const ROUTES: Route[] = [ export const ROUTES: Route[] = [
{ {
path: '', path: '',
canActivate: mapToCanActivate([SiteAdministratorGuard]), canActivate: [siteAdministratorGuard],
component: SystemWideAlertFormComponent, component: SystemWideAlertFormComponent,
}, },