From d8f77d4cfeccbe8e0f68f45f87c0550382b9caaa Mon Sep 17 00:00:00 2001 From: Steve Reis <stevereis93@gmail.com> Date: Tue, 12 Apr 2022 14:33:03 +0200 Subject: [PATCH] feat(datashield): Add logout --- api/src/auth/auth.resolver.ts | 30 +++++++++++++++---- .../connectors/datashield/main.connector.ts | 15 ++++++++++ 2 files changed, 39 insertions(+), 6 deletions(-) diff --git a/api/src/auth/auth.resolver.ts b/api/src/auth/auth.resolver.ts index 228943e..ba028fe 100644 --- a/api/src/auth/auth.resolver.ts +++ b/api/src/auth/auth.resolver.ts @@ -6,11 +6,15 @@ import { } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; import { Args, Mutation, Resolver } from '@nestjs/graphql'; -import { Response } from 'express'; +import { Response, Request } from 'express'; +import { GQLRequest } from 'src/common/decorators/gql-request.decoractor'; import { GQLResponse } from '../common/decorators/gql-response.decoractor'; import { parseToBoolean } from '../common/utilities'; -import { ENGINE_SERVICE } from '../engine/engine.constants'; -import { IEngineService } from '../engine/engine.interfaces'; +import { + ENGINE_MODULE_OPTIONS, + ENGINE_SERVICE, +} from '../engine/engine.constants'; +import { IEngineOptions, IEngineService } from '../engine/engine.interfaces'; import { User } from '../users/models/user.model'; import { authConstants } from './auth-constants'; import { AuthService } from './auth.service'; @@ -29,6 +33,8 @@ export class AuthResolver { constructor( @Inject(ENGINE_SERVICE) private readonly engineService: IEngineService, + @Inject(ENGINE_MODULE_OPTIONS) + private readonly engineOptions: IEngineOptions, private readonly authService: AuthService, private readonly configService: ConfigService, ) {} @@ -68,11 +74,23 @@ export class AuthResolver { @Mutation(() => Boolean) @UseGuards(JwtAuthGuard) - logout(@GQLResponse() res: Response, @CurrentUser() user: User): boolean { - if (user) this.logger.verbose(`${user.username} logged out`); + logout( + @GQLRequest() req: Request, + @GQLResponse() res: Response, + @CurrentUser() user: User, + ): boolean { + if (user) { + this.logger.verbose(`${user.username} logged out`); + try { + this.engineService.logout?.(req); + } catch (e) { + this.logger.debug( + `Service ${this.engineOptions.type} produce an error when logging out ${user.username}`, + ); + } + } res.clearCookie(authConstants.cookie.name); - this.engineService.logout?.(); return true; } diff --git a/api/src/engine/connectors/datashield/main.connector.ts b/api/src/engine/connectors/datashield/main.connector.ts index 2079001..ad0e132 100644 --- a/api/src/engine/connectors/datashield/main.connector.ts +++ b/api/src/engine/connectors/datashield/main.connector.ts @@ -205,6 +205,21 @@ export default class DataShieldService implements IEngineService { throw new NotImplementedException(); } + async logout(request: Request): Promise<void> { + const user = request.user as User; + const cookie = [`sid=${user.extraFields['sid']}`, `user=${user.id}`].join( + ';', + ); + + const path = new URL('/logout', this.options.baseurl).href; + + this.httpService.get(path, { + headers: { + cookie, + }, + }); + } + async editExperient( id: string, expriment: ExperimentEditInput, -- GitLab