From 72e3893f8eee79f1e3678839aa194f1096c343ea Mon Sep 17 00:00:00 2001 From: Vincent Salucci <26154748+vincentsalucci@users.noreply.github.com> Date: Mon, 6 Apr 2020 11:06:32 -0500 Subject: [PATCH] [Auto-Logout] Update Token Service (#94) * Auto logout on restart * Updated setTokens function * Remove async deocrator from setTokens Co-authored-by: Vincent Salucci --- src/abstractions/token.service.ts | 1 + src/services/token.service.ts | 39 ++++++++++++++++++++++++++-- src/services/vaultTimeout.service.ts | 6 +++-- 3 files changed, 42 insertions(+), 4 deletions(-) diff --git a/src/abstractions/token.service.ts b/src/abstractions/token.service.ts index dbc446a41d..f55bed38d2 100644 --- a/src/abstractions/token.service.ts +++ b/src/abstractions/token.service.ts @@ -7,6 +7,7 @@ export abstract class TokenService { getToken: () => Promise; setRefreshToken: (refreshToken: string) => Promise; getRefreshToken: () => Promise; + toggleTokens: () => Promise; setTwoFactorToken: (token: string, email: string) => Promise; getTwoFactorToken: (email: string) => Promise; clearTwoFactorToken: (email: string) => Promise; diff --git a/src/services/token.service.ts b/src/services/token.service.ts index 4036d342ed..709556f7b6 100644 --- a/src/services/token.service.ts +++ b/src/services/token.service.ts @@ -26,9 +26,15 @@ export class TokenService implements TokenServiceAbstraction { ]); } - setToken(token: string): Promise { + async setToken(token: string): Promise { this.token = token; this.decodedToken = null; + + if (await this.skipTokenStorage()) { + // if we have a vault timeout and the action is log out, don't store token + return; + } + return this.storageService.save(Keys.accessToken, token); } @@ -41,8 +47,14 @@ export class TokenService implements TokenServiceAbstraction { return this.token; } - setRefreshToken(refreshToken: string): Promise { + async setRefreshToken(refreshToken: string): Promise { this.refreshToken = refreshToken; + + if (await this.skipTokenStorage()) { + // if we have a vault timeout and the action is log out, don't store token + return; + } + return this.storageService.save(Keys.refreshToken, refreshToken); } @@ -55,6 +67,23 @@ export class TokenService implements TokenServiceAbstraction { return this.refreshToken; } + async toggleTokens(): Promise { + const token = await this.getToken(); + const refreshToken = await this.getRefreshToken(); + const timeout = await this.storageService.get(ConstantsService.vaultTimeoutKey); + const action = await this.storageService.get(ConstantsService.vaultTimeoutActionKey); + if ((timeout != null || timeout === 0) && action === 'logOut') { + // if we have a vault timeout and the action is log out, reset tokens + await this.clearToken(); + this.token = token; + this.refreshToken = refreshToken; + return; + } + + await this.setToken(token); + await this.setRefreshToken(refreshToken); + } + setTwoFactorToken(token: string, email: string): Promise { return this.storageService.save(Keys.twoFactorTokenPrefix + email, token); } @@ -183,4 +212,10 @@ export class TokenService implements TokenServiceAbstraction { return decoded.iss as string; } + + private async skipTokenStorage(): Promise { + const timeout = await this.storageService.get(ConstantsService.vaultTimeoutKey); + const action = await this.storageService.get(ConstantsService.vaultTimeoutActionKey); + return timeout != null && action === 'logOut'; + } } diff --git a/src/services/vaultTimeout.service.ts b/src/services/vaultTimeout.service.ts index d6304df0df..bc13667f9b 100644 --- a/src/services/vaultTimeout.service.ts +++ b/src/services/vaultTimeout.service.ts @@ -8,6 +8,7 @@ import { MessagingService } from '../abstractions/messaging.service'; import { PlatformUtilsService } from '../abstractions/platformUtils.service'; import { SearchService } from '../abstractions/search.service'; import { StorageService } from '../abstractions/storage.service'; +import { TokenService } from '../abstractions/token.service'; import { UserService } from '../abstractions/user.service'; import { VaultTimeoutService as VaultTimeoutServiceAbstraction } from '../abstractions/vaultTimeout.service'; @@ -22,8 +23,8 @@ export class VaultTimeoutService implements VaultTimeoutServiceAbstraction { private collectionService: CollectionService, private cryptoService: CryptoService, private platformUtilsService: PlatformUtilsService, private storageService: StorageService, private messagingService: MessagingService, private searchService: SearchService, - private userService: UserService, private lockedCallback: () => Promise = null, - private loggedOutCallback: () => Promise = null) { + private userService: UserService, private tokenService: TokenService, + private lockedCallback: () => Promise = null, private loggedOutCallback: () => Promise = null) { } init(checkOnInterval: boolean) { @@ -117,6 +118,7 @@ export class VaultTimeoutService implements VaultTimeoutServiceAbstraction { await this.storageService.save(ConstantsService.vaultTimeoutKey, timeout); await this.storageService.save(ConstantsService.vaultTimeoutActionKey, action); await this.cryptoService.toggleKey(); + await this.tokenService.toggleTokens(); } async isPinLockSet(): Promise<[boolean, boolean]> {