diff --git a/src/app/+bitstream-page/bitstream-page-routing.module.ts b/src/app/+bitstream-page/bitstream-page-routing.module.ts index 0856dd00cb..14d688064c 100644 --- a/src/app/+bitstream-page/bitstream-page-routing.module.ts +++ b/src/app/+bitstream-page/bitstream-page-routing.module.ts @@ -3,7 +3,6 @@ import { RouterModule } from '@angular/router'; import { EditBitstreamPageComponent } from './edit-bitstream-page/edit-bitstream-page.component'; import { AuthenticatedGuard } from '../core/auth/authenticated.guard'; import { BitstreamPageResolver } from './bitstream-page.resolver'; -import { EndUserAgreementGuard } from '../core/end-user-agreement/end-user-agreement.guard'; const EDIT_BITSTREAM_PATH = ':id/edit'; @@ -19,7 +18,7 @@ const EDIT_BITSTREAM_PATH = ':id/edit'; resolve: { bitstream: BitstreamPageResolver }, - canActivate: [AuthenticatedGuard, EndUserAgreementGuard] + canActivate: [AuthenticatedGuard] } ]) ], diff --git a/src/app/+collection-page/collection-page-routing.module.ts b/src/app/+collection-page/collection-page-routing.module.ts index 13898055f9..479a136140 100644 --- a/src/app/+collection-page/collection-page-routing.module.ts +++ b/src/app/+collection-page/collection-page-routing.module.ts @@ -14,7 +14,6 @@ import { CollectionBreadcrumbResolver } from '../core/breadcrumbs/collection-bre import { DSOBreadcrumbsService } from '../core/breadcrumbs/dso-breadcrumbs.service'; import { LinkService } from '../core/cache/builders/link.service'; import { I18nBreadcrumbResolver } from '../core/breadcrumbs/i18n-breadcrumb.resolver'; -import { EndUserAgreementGuard } from '../core/end-user-agreement/end-user-agreement.guard'; import { ITEMTEMPLATE_PATH, COLLECTION_EDIT_PATH, @@ -27,7 +26,7 @@ import { { path: COLLECTION_CREATE_PATH, component: CreateCollectionPageComponent, - canActivate: [AuthenticatedGuard, CreateCollectionPageGuard, EndUserAgreementGuard] + canActivate: [AuthenticatedGuard, CreateCollectionPageGuard] }, { path: ':id', @@ -40,18 +39,18 @@ import { { path: COLLECTION_EDIT_PATH, loadChildren: './edit-collection-page/edit-collection-page.module#EditCollectionPageModule', - canActivate: [AuthenticatedGuard, EndUserAgreementGuard] + canActivate: [AuthenticatedGuard] }, { path: 'delete', pathMatch: 'full', component: DeleteCollectionPageComponent, - canActivate: [AuthenticatedGuard, EndUserAgreementGuard], + canActivate: [AuthenticatedGuard], }, { path: ITEMTEMPLATE_PATH, component: EditItemTemplatePageComponent, - canActivate: [AuthenticatedGuard, EndUserAgreementGuard], + canActivate: [AuthenticatedGuard], resolve: { item: ItemTemplatePageResolver, breadcrumb: I18nBreadcrumbResolver @@ -67,7 +66,7 @@ import { path: '/edit/mapper', component: CollectionItemMapperComponent, pathMatch: 'full', - canActivate: [AuthenticatedGuard, EndUserAgreementGuard] + canActivate: [AuthenticatedGuard] } ] }, diff --git a/src/app/+community-page/community-page-routing.module.ts b/src/app/+community-page/community-page-routing.module.ts index 050d24e9b4..08520ab8d4 100644 --- a/src/app/+community-page/community-page-routing.module.ts +++ b/src/app/+community-page/community-page-routing.module.ts @@ -10,7 +10,6 @@ import { DeleteCommunityPageComponent } from './delete-community-page/delete-com import { CommunityBreadcrumbResolver } from '../core/breadcrumbs/community-breadcrumb.resolver'; import { DSOBreadcrumbsService } from '../core/breadcrumbs/dso-breadcrumbs.service'; import { LinkService } from '../core/cache/builders/link.service'; -import { EndUserAgreementGuard } from '../core/end-user-agreement/end-user-agreement.guard'; import { COMMUNITY_EDIT_PATH, COMMUNITY_CREATE_PATH } from './community-page-routing-paths'; @NgModule({ @@ -19,7 +18,7 @@ import { COMMUNITY_EDIT_PATH, COMMUNITY_CREATE_PATH } from './community-page-rou { path: COMMUNITY_CREATE_PATH, component: CreateCommunityPageComponent, - canActivate: [AuthenticatedGuard, CreateCommunityPageGuard, EndUserAgreementGuard] + canActivate: [AuthenticatedGuard, CreateCommunityPageGuard] }, { path: ':id', @@ -32,13 +31,13 @@ import { COMMUNITY_EDIT_PATH, COMMUNITY_CREATE_PATH } from './community-page-rou { path: COMMUNITY_EDIT_PATH, loadChildren: './edit-community-page/edit-community-page.module#EditCommunityPageModule', - canActivate: [AuthenticatedGuard, EndUserAgreementGuard] + canActivate: [AuthenticatedGuard] }, { path: 'delete', pathMatch: 'full', component: DeleteCommunityPageComponent, - canActivate: [AuthenticatedGuard, EndUserAgreementGuard], + canActivate: [AuthenticatedGuard], }, { path: '', diff --git a/src/app/+item-page/item-page-routing.module.ts b/src/app/+item-page/item-page-routing.module.ts index 5b8a3cb293..088aab326d 100644 --- a/src/app/+item-page/item-page-routing.module.ts +++ b/src/app/+item-page/item-page-routing.module.ts @@ -9,7 +9,6 @@ import { ItemBreadcrumbResolver } from '../core/breadcrumbs/item-breadcrumb.reso import { DSOBreadcrumbsService } from '../core/breadcrumbs/dso-breadcrumbs.service'; import { LinkService } from '../core/cache/builders/link.service'; import { UploadBitstreamComponent } from './bitstreams/upload/upload-bitstream.component'; -import { EndUserAgreementGuard } from '../core/end-user-agreement/end-user-agreement.guard'; import { UPLOAD_BITSTREAM_PATH, ITEM_EDIT_PATH } from './item-page-routing-paths'; @NgModule({ @@ -35,12 +34,12 @@ import { UPLOAD_BITSTREAM_PATH, ITEM_EDIT_PATH } from './item-page-routing-paths { path: ITEM_EDIT_PATH, loadChildren: './edit-item-page/edit-item-page.module#EditItemPageModule', - canActivate: [AuthenticatedGuard, EndUserAgreementGuard] + canActivate: [AuthenticatedGuard] }, { path: UPLOAD_BITSTREAM_PATH, component: UploadBitstreamComponent, - canActivate: [AuthenticatedGuard, EndUserAgreementGuard] + canActivate: [AuthenticatedGuard] } ], } diff --git a/src/app/+submit-page/submit-page-routing.module.ts b/src/app/+submit-page/submit-page-routing.module.ts index a66e2636a1..7a123bfc31 100644 --- a/src/app/+submit-page/submit-page-routing.module.ts +++ b/src/app/+submit-page/submit-page-routing.module.ts @@ -3,13 +3,12 @@ import { RouterModule } from '@angular/router'; import { AuthenticatedGuard } from '../core/auth/authenticated.guard'; import { SubmissionSubmitComponent } from '../submission/submit/submission-submit.component'; -import { EndUserAgreementGuard } from '../core/end-user-agreement/end-user-agreement.guard'; @NgModule({ imports: [ RouterModule.forChild([ { - canActivate: [AuthenticatedGuard, EndUserAgreementGuard], + canActivate: [AuthenticatedGuard], path: '', pathMatch: 'full', component: SubmissionSubmitComponent, diff --git a/src/app/+workflowitems-edit-page/workflowitems-edit-page-routing.module.ts b/src/app/+workflowitems-edit-page/workflowitems-edit-page-routing.module.ts index 7f3b9026f2..27b7fe1199 100644 --- a/src/app/+workflowitems-edit-page/workflowitems-edit-page-routing.module.ts +++ b/src/app/+workflowitems-edit-page/workflowitems-edit-page-routing.module.ts @@ -6,7 +6,6 @@ import { SubmissionEditComponent } from '../submission/edit/submission-edit.comp import { WorkflowItemDeleteComponent } from './workflow-item-delete/workflow-item-delete.component'; import { WorkflowItemPageResolver } from './workflow-item-page.resolver'; import { WorkflowItemSendBackComponent } from './workflow-item-send-back/workflow-item-send-back.component'; -import { EndUserAgreementGuard } from '../core/end-user-agreement/end-user-agreement.guard'; import { WORKFLOW_ITEM_SEND_BACK_PATH, WORKFLOW_ITEM_DELETE_PATH, @@ -21,19 +20,19 @@ import { resolve: { wfi: WorkflowItemPageResolver }, children: [ { - canActivate: [AuthenticatedGuard, EndUserAgreementGuard], + canActivate: [AuthenticatedGuard], path: WORKFLOW_ITEM_EDIT_PATH, component: SubmissionEditComponent, data: { title: 'submission.edit.title' } }, { - canActivate: [AuthenticatedGuard, EndUserAgreementGuard], + canActivate: [AuthenticatedGuard], path: WORKFLOW_ITEM_DELETE_PATH, component: WorkflowItemDeleteComponent, data: { title: 'workflow-item.delete.title' } }, { - canActivate: [AuthenticatedGuard, EndUserAgreementGuard], + canActivate: [AuthenticatedGuard], path: WORKFLOW_ITEM_SEND_BACK_PATH, component: WorkflowItemSendBackComponent, data: { title: 'workflow-item.send-back.title' } diff --git a/src/app/+workspaceitems-edit-page/workspaceitems-edit-page-routing.module.ts b/src/app/+workspaceitems-edit-page/workspaceitems-edit-page-routing.module.ts index 0548b488c4..d10c53e138 100644 --- a/src/app/+workspaceitems-edit-page/workspaceitems-edit-page-routing.module.ts +++ b/src/app/+workspaceitems-edit-page/workspaceitems-edit-page-routing.module.ts @@ -3,14 +3,13 @@ import { RouterModule } from '@angular/router'; import { AuthenticatedGuard } from '../core/auth/authenticated.guard'; import { SubmissionEditComponent } from '../submission/edit/submission-edit.component'; -import { EndUserAgreementGuard } from '../core/end-user-agreement/end-user-agreement.guard'; @NgModule({ imports: [ RouterModule.forChild([ { path: '', redirectTo: '/home', pathMatch: 'full' }, { - canActivate: [AuthenticatedGuard, EndUserAgreementGuard], + canActivate: [AuthenticatedGuard], path: ':id/edit', component: SubmissionEditComponent, data: { title: 'submission.edit.title' } diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index 13afd0423e..0851b1e1f8 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -20,7 +20,7 @@ import { COLLECTION_MODULE_PATH } from './+collection-page/collection-page-routi import { COMMUNITY_MODULE_PATH } from './+community-page/community-page-routing-paths'; import { ITEM_MODULE_PATH } from './+item-page/item-page-routing-paths'; import { ReloadGuard } from './core/reload/reload.guard'; -import { EndUserAgreementGuard } from './core/end-user-agreement/end-user-agreement.guard'; +import { EndUserAgreementCurrentUserGuard } from './core/end-user-agreement/end-user-agreement-current-user.guard'; @NgModule({ imports: [ @@ -29,40 +29,42 @@ import { EndUserAgreementGuard } from './core/end-user-agreement/end-user-agreem children: [ { path: '', redirectTo: '/home', pathMatch: 'full' }, { path: 'reload/:rnd', component: PageNotFoundComponent, pathMatch: 'full', canActivate: [ReloadGuard] }, - { path: 'home', loadChildren: './+home-page/home-page.module#HomePageModule', data: { showBreadcrumbs: false } }, - { path: 'community-list', loadChildren: './community-list-page/community-list-page.module#CommunityListPageModule' }, - { path: 'id', loadChildren: './+lookup-by-id/lookup-by-id.module#LookupIdModule' }, - { path: 'handle', loadChildren: './+lookup-by-id/lookup-by-id.module#LookupIdModule' }, + { path: 'home', loadChildren: './+home-page/home-page.module#HomePageModule', data: { showBreadcrumbs: false }, canActivate: [EndUserAgreementCurrentUserGuard] }, + { path: 'community-list', loadChildren: './community-list-page/community-list-page.module#CommunityListPageModule', canActivate: [EndUserAgreementCurrentUserGuard] }, + { path: 'id', loadChildren: './+lookup-by-id/lookup-by-id.module#LookupIdModule', canActivate: [EndUserAgreementCurrentUserGuard] }, + { path: 'handle', loadChildren: './+lookup-by-id/lookup-by-id.module#LookupIdModule', canActivate: [EndUserAgreementCurrentUserGuard] }, { path: REGISTER_PATH, loadChildren: './register-page/register-page.module#RegisterPageModule' }, - { path: FORGOT_PASSWORD_PATH, loadChildren: './forgot-password/forgot-password.module#ForgotPasswordModule' }, - { path: COMMUNITY_MODULE_PATH, loadChildren: './+community-page/community-page.module#CommunityPageModule' }, - { path: COLLECTION_MODULE_PATH, loadChildren: './+collection-page/collection-page.module#CollectionPageModule' }, - { path: ITEM_MODULE_PATH, loadChildren: './+item-page/item-page.module#ItemPageModule' }, - { path: BITSTREAM_MODULE_PATH, loadChildren: './+bitstream-page/bitstream-page.module#BitstreamPageModule' }, + { path: FORGOT_PASSWORD_PATH, loadChildren: './forgot-password/forgot-password.module#ForgotPasswordModule', canActivate: [EndUserAgreementCurrentUserGuard] }, + { path: COMMUNITY_MODULE_PATH, loadChildren: './+community-page/community-page.module#CommunityPageModule', canActivate: [EndUserAgreementCurrentUserGuard] }, + { path: COLLECTION_MODULE_PATH, loadChildren: './+collection-page/collection-page.module#CollectionPageModule', canActivate: [EndUserAgreementCurrentUserGuard] }, + { path: ITEM_MODULE_PATH, loadChildren: './+item-page/item-page.module#ItemPageModule', canActivate: [EndUserAgreementCurrentUserGuard] }, + { path: BITSTREAM_MODULE_PATH, loadChildren: './+bitstream-page/bitstream-page.module#BitstreamPageModule', canActivate: [EndUserAgreementCurrentUserGuard] }, { path: 'mydspace', loadChildren: './+my-dspace-page/my-dspace-page.module#MyDSpacePageModule', - canActivate: [AuthenticatedGuard, EndUserAgreementGuard] + canActivate: [AuthenticatedGuard, EndUserAgreementCurrentUserGuard] }, - { path: 'search', loadChildren: './+search-page/search-page-routing.module#SearchPageRoutingModule' }, - { path: 'browse', loadChildren: './+browse-by/browse-by.module#BrowseByModule'}, - { path: ADMIN_MODULE_PATH, loadChildren: './+admin/admin.module#AdminModule', canActivate: [SiteAdministratorGuard, EndUserAgreementGuard] }, + { path: 'search', loadChildren: './+search-page/search-page-routing.module#SearchPageRoutingModule', canActivate: [EndUserAgreementCurrentUserGuard] }, + { path: 'browse', loadChildren: './+browse-by/browse-by.module#BrowseByModule', canActivate: [EndUserAgreementCurrentUserGuard] }, + { path: ADMIN_MODULE_PATH, loadChildren: './+admin/admin.module#AdminModule', canActivate: [SiteAdministratorGuard, EndUserAgreementCurrentUserGuard] }, { path: 'login', loadChildren: './+login-page/login-page.module#LoginPageModule' }, { path: 'logout', loadChildren: './+logout-page/logout-page.module#LogoutPageModule' }, - { path: 'submit', loadChildren: './+submit-page/submit-page.module#SubmitPageModule' }, + { path: 'submit', loadChildren: './+submit-page/submit-page.module#SubmitPageModule', canActivate: [EndUserAgreementCurrentUserGuard] }, { path: 'workspaceitems', - loadChildren: './+workspaceitems-edit-page/workspaceitems-edit-page.module#WorkspaceitemsEditPageModule' + loadChildren: './+workspaceitems-edit-page/workspaceitems-edit-page.module#WorkspaceitemsEditPageModule', + canActivate: [EndUserAgreementCurrentUserGuard] }, { path: WORKFLOW_ITEM_MODULE_PATH, - loadChildren: './+workflowitems-edit-page/workflowitems-edit-page.module#WorkflowItemsEditPageModule' + loadChildren: './+workflowitems-edit-page/workflowitems-edit-page.module#WorkflowItemsEditPageModule', + canActivate: [EndUserAgreementCurrentUserGuard] }, { path: PROFILE_MODULE_PATH, - loadChildren: './profile-page/profile-page.module#ProfilePageModule', canActivate: [AuthenticatedGuard, EndUserAgreementGuard] + loadChildren: './profile-page/profile-page.module#ProfilePageModule', canActivate: [AuthenticatedGuard, EndUserAgreementCurrentUserGuard] }, - { path: 'processes', loadChildren: './process-page/process-page.module#ProcessPageModule', canActivate: [AuthenticatedGuard, EndUserAgreementGuard] }, + { path: 'processes', loadChildren: './process-page/process-page.module#ProcessPageModule', canActivate: [AuthenticatedGuard, EndUserAgreementCurrentUserGuard] }, { path: INFO_MODULE_PATH, loadChildren: './info/info.module#InfoModule' }, { path: UNAUTHORIZED_PATH, component: UnauthorizedComponent }, { path: '**', pathMatch: 'full', component: PageNotFoundComponent }, diff --git a/src/app/core/core.module.ts b/src/app/core/core.module.ts index 7eed3baf91..e35f2c9b88 100644 --- a/src/app/core/core.module.ts +++ b/src/app/core/core.module.ts @@ -163,7 +163,8 @@ import { SubmissionCcLicenseUrlDataService } from './submission/submission-cc-li import { ConfigurationDataService } from './data/configuration-data.service'; import { ConfigurationProperty } from './shared/configuration-property.model'; import { ReloadGuard } from './reload/reload.guard'; -import { EndUserAgreementGuard } from './end-user-agreement/end-user-agreement.guard'; +import { EndUserAgreementCurrentUserGuard } from './end-user-agreement/end-user-agreement-current-user.guard'; +import { EndUserAgreementCookieGuard } from './end-user-agreement/end-user-agreement-cookie.guard'; import { EndUserAgreementService } from './end-user-agreement/end-user-agreement.service'; /** @@ -293,7 +294,8 @@ const PROVIDERS = [ MetadataFieldDataService, TokenResponseParsingService, ReloadGuard, - EndUserAgreementGuard, + EndUserAgreementCurrentUserGuard, + EndUserAgreementCookieGuard, EndUserAgreementService, // register AuthInterceptor as HttpInterceptor { diff --git a/src/app/core/end-user-agreement/end-user-agreement.guard.ts b/src/app/core/end-user-agreement/abstract-end-user-agreement.guard.ts similarity index 64% rename from src/app/core/end-user-agreement/end-user-agreement.guard.ts rename to src/app/core/end-user-agreement/abstract-end-user-agreement.guard.ts index e42d885133..2f6bde11b9 100644 --- a/src/app/core/end-user-agreement/end-user-agreement.guard.ts +++ b/src/app/core/end-user-agreement/abstract-end-user-agreement.guard.ts @@ -1,30 +1,27 @@ -import { Injectable } from '@angular/core'; import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot, UrlTree } from '@angular/router'; import { Observable } from 'rxjs/internal/Observable'; -import { returnEndUserAgreementUrlTreeOnFalse } from '../shared/operators'; -import { EndUserAgreementService } from './end-user-agreement.service'; -import { tap } from 'rxjs/operators'; import { AuthService } from '../auth/auth.service'; +import { returnEndUserAgreementUrlTreeOnFalse } from '../shared/operators'; +import { tap } from 'rxjs/operators'; /** - * A guard redirecting users to the end agreement page when they haven't accepted the latest user agreement + * An abstract guard for redirecting users to the user agreement page if a certain condition is met + * That condition is defined by abstract method hasAccepted */ -@Injectable() -export class EndUserAgreementGuard implements CanActivate { +export abstract class AbstractEndUserAgreementGuard implements CanActivate { - constructor(protected endUserAgreementService: EndUserAgreementService, - protected authService: AuthService, + constructor(protected authService: AuthService, protected router: Router) { } /** - * True when the user has accepted the agreements + * True when the user agreement has been accepted * The user will be redirected to the End User Agreement page if they haven't accepted it before * A redirect URL will be provided with the navigation so the component can redirect the user back to the blocked route * when they're finished accepting the agreement */ canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { - return this.endUserAgreementService.hasCurrentUserAcceptedAgreement().pipe( + return this.hasAccepted().pipe( returnEndUserAgreementUrlTreeOnFalse(this.router), tap((result) => { if (result instanceof UrlTree) { @@ -34,4 +31,11 @@ export class EndUserAgreementGuard implements CanActivate { }) ); } + + /** + * This abstract method determines how the User Agreement has to be accepted before the user is allowed to visit + * the desired route + */ + abstract hasAccepted(): Observable; + } diff --git a/src/app/core/end-user-agreement/end-user-agreement-cookie.guard.ts b/src/app/core/end-user-agreement/end-user-agreement-cookie.guard.ts new file mode 100644 index 0000000000..a7bdd6b320 --- /dev/null +++ b/src/app/core/end-user-agreement/end-user-agreement-cookie.guard.ts @@ -0,0 +1,28 @@ +import { Injectable } from '@angular/core'; +import { AbstractEndUserAgreementGuard } from './abstract-end-user-agreement.guard'; +import { Observable } from 'rxjs/internal/Observable'; +import { of as observableOf } from 'rxjs'; +import { EndUserAgreementService } from './end-user-agreement.service'; +import { AuthService } from '../auth/auth.service'; +import { Router } from '@angular/router'; + +/** + * A guard redirecting users to the end agreement page when the user agreement cookie hasn't been accepted + */ +@Injectable() +export class EndUserAgreementCookieGuard extends AbstractEndUserAgreementGuard { + + constructor(protected endUserAgreementService: EndUserAgreementService, + protected authService: AuthService, + protected router: Router) { + super(authService, router); + } + + /** + * True when the user agreement cookie has been accepted + */ + hasAccepted(): Observable { + return observableOf(this.endUserAgreementService.isCookieAccepted()); + } + +} diff --git a/src/app/core/end-user-agreement/end-user-agreement.guard.spec.ts b/src/app/core/end-user-agreement/end-user-agreement-current-user.guard.spec.ts similarity index 87% rename from src/app/core/end-user-agreement/end-user-agreement.guard.spec.ts rename to src/app/core/end-user-agreement/end-user-agreement-current-user.guard.spec.ts index a7f3f32a6b..09cb236b3f 100644 --- a/src/app/core/end-user-agreement/end-user-agreement.guard.spec.ts +++ b/src/app/core/end-user-agreement/end-user-agreement-current-user.guard.spec.ts @@ -1,11 +1,11 @@ -import { EndUserAgreementGuard } from './end-user-agreement.guard'; +import { EndUserAgreementCurrentUserGuard } from './end-user-agreement-current-user.guard'; import { EndUserAgreementService } from './end-user-agreement.service'; import { Router, UrlTree } from '@angular/router'; import { of as observableOf } from 'rxjs'; import { AuthService } from '../auth/auth.service'; describe('EndUserAgreementGuard', () => { - let guard: EndUserAgreementGuard; + let guard: EndUserAgreementCurrentUserGuard; let endUserAgreementService: EndUserAgreementService; let authService: AuthService; @@ -21,7 +21,7 @@ describe('EndUserAgreementGuard', () => { parseUrl: new UrlTree() }); - guard = new EndUserAgreementGuard(endUserAgreementService, authService, router); + guard = new EndUserAgreementCurrentUserGuard(endUserAgreementService, authService, router); }); describe('canActivate', () => { diff --git a/src/app/core/end-user-agreement/end-user-agreement-current-user.guard.ts b/src/app/core/end-user-agreement/end-user-agreement-current-user.guard.ts new file mode 100644 index 0000000000..e48d4361c6 --- /dev/null +++ b/src/app/core/end-user-agreement/end-user-agreement-current-user.guard.ts @@ -0,0 +1,27 @@ +import { Injectable } from '@angular/core'; +import { Observable } from 'rxjs/internal/Observable'; +import { AbstractEndUserAgreementGuard } from './abstract-end-user-agreement.guard'; +import { EndUserAgreementService } from './end-user-agreement.service'; +import { AuthService } from '../auth/auth.service'; +import { Router } from '@angular/router'; + +/** + * A guard redirecting logged in users to the end agreement page when they haven't accepted the latest user agreement + */ +@Injectable() +export class EndUserAgreementCurrentUserGuard extends AbstractEndUserAgreementGuard { + + constructor(protected endUserAgreementService: EndUserAgreementService, + protected authService: AuthService, + protected router: Router) { + super(authService, router); + } + + /** + * True when the currently logged in user has accepted the agreements or when the user is not currently authenticated + */ + hasAccepted(): Observable { + return this.endUserAgreementService.hasCurrentUserAcceptedAgreement(true); + } + +} diff --git a/src/app/core/end-user-agreement/end-user-agreement.service.ts b/src/app/core/end-user-agreement/end-user-agreement.service.ts index 025fc6fc32..31b606cfb4 100644 --- a/src/app/core/end-user-agreement/end-user-agreement.service.ts +++ b/src/app/core/end-user-agreement/end-user-agreement.service.ts @@ -25,26 +25,37 @@ export class EndUserAgreementService { } /** - * Whether or not the current user has accepted the End User Agreement + * Whether or not either the cookie was accepted or the current user has accepted the End User Agreement + * @param acceptedWhenAnonymous Whether or not the user agreement should be considered accepted if the user is + * currently not authenticated (anonymous) */ - hasCurrentUserAcceptedAgreement(): Observable { + hasCurrentUserOrCookieAcceptedAgreement(acceptedWhenAnonymous: boolean): Observable { if (this.isCookieAccepted()) { return observableOf(true); } else { - return this.authService.isAuthenticated().pipe( - switchMap((authenticated) => { - if (authenticated) { - return this.authService.getAuthenticatedUserFromStore().pipe( - map((user) => hasValue(user) && user.hasMetadata(END_USER_AGREEMENT_METADATA_FIELD) && user.firstMetadata(END_USER_AGREEMENT_METADATA_FIELD).value === 'true') - ); - } else { - return observableOf(false); - } - }) - ); + return this.hasCurrentUserAcceptedAgreement(acceptedWhenAnonymous); } } + /** + * Whether or not the current user has accepted the End User Agreement + * @param acceptedWhenAnonymous Whether or not the user agreement should be considered accepted if the user is + * currently not authenticated (anonymous) + */ + hasCurrentUserAcceptedAgreement(acceptedWhenAnonymous: boolean): Observable { + return this.authService.isAuthenticated().pipe( + switchMap((authenticated) => { + if (authenticated) { + return this.authService.getAuthenticatedUserFromStore().pipe( + map((user) => hasValue(user) && user.hasMetadata(END_USER_AGREEMENT_METADATA_FIELD) && user.firstMetadata(END_USER_AGREEMENT_METADATA_FIELD).value === 'true') + ); + } else { + return observableOf(acceptedWhenAnonymous); + } + }) + ); + } + /** * Set the current user's accepted agreement status * When a user is authenticated, set his/her metadata to the provided value diff --git a/src/app/info/end-user-agreement/end-user-agreement.component.ts b/src/app/info/end-user-agreement/end-user-agreement.component.ts index a60db6a496..e258ba8878 100644 --- a/src/app/info/end-user-agreement/end-user-agreement.component.ts +++ b/src/app/info/end-user-agreement/end-user-agreement.component.ts @@ -45,7 +45,7 @@ export class EndUserAgreementComponent implements OnInit { * Initialize the "accepted" property of this component by checking if the current user has accepted it before */ initAccepted() { - this.endUserAgreementService.hasCurrentUserAcceptedAgreement().subscribe((accepted) => { + this.endUserAgreementService.hasCurrentUserOrCookieAcceptedAgreement(false).subscribe((accepted) => { this.accepted = accepted; }); } diff --git a/src/app/process-page/process-page-routing.module.ts b/src/app/process-page/process-page-routing.module.ts index 6e9ecc4b29..881ca0e853 100644 --- a/src/app/process-page/process-page-routing.module.ts +++ b/src/app/process-page/process-page-routing.module.ts @@ -7,7 +7,6 @@ import { ProcessDetailComponent } from './detail/process-detail.component'; import { I18nBreadcrumbResolver } from '../core/breadcrumbs/i18n-breadcrumb.resolver'; import { ProcessBreadcrumbResolver } from './process-breadcrumb.resolver'; import { AuthenticatedGuard } from '../core/auth/authenticated.guard'; -import { EndUserAgreementGuard } from '../core/end-user-agreement/end-user-agreement.guard'; @NgModule({ imports: [ @@ -16,7 +15,7 @@ import { EndUserAgreementGuard } from '../core/end-user-agreement/end-user-agree path: '', resolve: { breadcrumb: I18nBreadcrumbResolver }, data: { breadcrumbKey: 'process.overview' }, - canActivate: [AuthenticatedGuard, EndUserAgreementGuard], + canActivate: [AuthenticatedGuard], children: [ { path: '', diff --git a/src/app/register-page/register-page-routing.module.ts b/src/app/register-page/register-page-routing.module.ts index a57450a329..7954d7963a 100644 --- a/src/app/register-page/register-page-routing.module.ts +++ b/src/app/register-page/register-page-routing.module.ts @@ -4,7 +4,7 @@ import { RegisterEmailComponent } from './register-email/register-email.componen import { CreateProfileComponent } from './create-profile/create-profile.component'; import { ItemPageResolver } from '../+item-page/item-page.resolver'; import { RegistrationResolver } from '../register-email-form/registration.resolver'; -import { EndUserAgreementGuard } from '../core/end-user-agreement/end-user-agreement.guard'; +import { EndUserAgreementCookieGuard } from '../core/end-user-agreement/end-user-agreement-cookie.guard'; @NgModule({ imports: [ @@ -18,7 +18,7 @@ import { EndUserAgreementGuard } from '../core/end-user-agreement/end-user-agree path: ':token', component: CreateProfileComponent, resolve: {registration: RegistrationResolver}, - canActivate: [EndUserAgreementGuard] + canActivate: [EndUserAgreementCookieGuard] } ]) ],