From f6942dde74a16ed75d11ff9aff10245114e04c4f Mon Sep 17 00:00:00 2001 From: Bernd Schoolmann Date: Thu, 30 May 2024 11:10:03 +0200 Subject: [PATCH] [PM-3050] Add sync on unlock, logout when account is deleted (#9288) * Add sync on unlock, logout when account is deleted * Update libs/common/src/vault/services/sync/sync.service.ts Co-authored-by: SmithThe4th * Fix failing unit tests * Fix incorrect merge --------- Co-authored-by: SmithThe4th --- apps/browser/src/auth/popup/lock.component.ts | 3 +++ apps/desktop/src/auth/lock.component.spec.ts | 5 +++++ apps/desktop/src/auth/lock.component.ts | 3 +++ libs/angular/src/auth/components/lock.component.ts | 5 +++++ libs/common/src/vault/services/sync/sync.service.ts | 5 +++++ 5 files changed, 21 insertions(+) diff --git a/apps/browser/src/auth/popup/lock.component.ts b/apps/browser/src/auth/popup/lock.component.ts index 34bcbcf63a..5047889b8e 100644 --- a/apps/browser/src/auth/popup/lock.component.ts +++ b/apps/browser/src/auth/popup/lock.component.ts @@ -25,6 +25,7 @@ import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/pl import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; import { BiometricStateService } from "@bitwarden/common/platform/biometrics/biometric-state.service"; import { PasswordStrengthServiceAbstraction } from "@bitwarden/common/tools/password-strength"; +import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; import { DialogService } from "@bitwarden/components"; import { BiometricErrors, BiometricErrorTypes } from "../../models/biometricErrors"; @@ -68,6 +69,7 @@ export class LockComponent extends BaseLockComponent { biometricStateService: BiometricStateService, accountService: AccountService, kdfConfigService: KdfConfigService, + syncService: SyncService, ) { super( masterPasswordService, @@ -94,6 +96,7 @@ export class LockComponent extends BaseLockComponent { accountService, authService, kdfConfigService, + syncService, ); this.successRoute = "/tabs/current"; this.isInitialLockScreen = (window as any).previousPopupUrl == null; diff --git a/apps/desktop/src/auth/lock.component.spec.ts b/apps/desktop/src/auth/lock.component.spec.ts index 434d94bf5b..c46b791b1b 100644 --- a/apps/desktop/src/auth/lock.component.spec.ts +++ b/apps/desktop/src/auth/lock.component.spec.ts @@ -32,6 +32,7 @@ import { Utils } from "@bitwarden/common/platform/misc/utils"; import { FakeAccountService, mockAccountServiceWith } from "@bitwarden/common/spec"; import { PasswordStrengthServiceAbstraction } from "@bitwarden/common/tools/password-strength"; import { UserId } from "@bitwarden/common/types/guid"; +import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; import { DialogService } from "@bitwarden/components"; import { LockComponent } from "./lock.component"; @@ -174,6 +175,10 @@ describe("LockComponent", () => { provide: KdfConfigService, useValue: mock(), }, + { + provide: SyncService, + useValue: mock(), + }, ], schemas: [NO_ERRORS_SCHEMA], }).compileComponents(); diff --git a/apps/desktop/src/auth/lock.component.ts b/apps/desktop/src/auth/lock.component.ts index 1b18f9f75f..ad9f6e5d01 100644 --- a/apps/desktop/src/auth/lock.component.ts +++ b/apps/desktop/src/auth/lock.component.ts @@ -26,6 +26,7 @@ import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/pl import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; import { BiometricStateService } from "@bitwarden/common/platform/biometrics/biometric-state.service"; import { PasswordStrengthServiceAbstraction } from "@bitwarden/common/tools/password-strength"; +import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; import { DialogService } from "@bitwarden/components"; const BroadcasterSubscriptionId = "LockComponent"; @@ -67,6 +68,7 @@ export class LockComponent extends BaseLockComponent { accountService: AccountService, authService: AuthService, kdfConfigService: KdfConfigService, + syncService: SyncService, ) { super( masterPasswordService, @@ -93,6 +95,7 @@ export class LockComponent extends BaseLockComponent { accountService, authService, kdfConfigService, + syncService, ); } diff --git a/libs/angular/src/auth/components/lock.component.ts b/libs/angular/src/auth/components/lock.component.ts index a1c9e94fb0..64cd664f1f 100644 --- a/libs/angular/src/auth/components/lock.component.ts +++ b/libs/angular/src/auth/components/lock.component.ts @@ -33,6 +33,7 @@ import { HashPurpose, KeySuffixOptions } from "@bitwarden/common/platform/enums" import { PasswordStrengthServiceAbstraction } from "@bitwarden/common/tools/password-strength"; import { UserId } from "@bitwarden/common/types/guid"; import { UserKey } from "@bitwarden/common/types/key"; +import { SyncService } from "@bitwarden/common/vault/abstractions/sync/sync.service.abstraction"; import { DialogService } from "@bitwarden/components"; @Directive() @@ -85,6 +86,7 @@ export class LockComponent implements OnInit, OnDestroy { protected accountService: AccountService, protected authService: AuthService, protected kdfConfigService: KdfConfigService, + protected syncService: SyncService, ) {} async ngOnInit() { @@ -318,6 +320,9 @@ export class LockComponent implements OnInit, OnDestroy { } } + // Vault can be de-synced since notifications get ignored while locked. Need to check whether sync is required using the sync service. + await this.syncService.fullSync(false); + if (this.onSuccessfulSubmit != null) { await this.onSuccessfulSubmit(); } else if (this.router != null) { diff --git a/libs/common/src/vault/services/sync/sync.service.ts b/libs/common/src/vault/services/sync/sync.service.ts index 172891b08d..2c69f83b05 100644 --- a/libs/common/src/vault/services/sync/sync.service.ts +++ b/libs/common/src/vault/services/sync/sync.service.ts @@ -145,6 +145,11 @@ export class SyncService extends CoreSyncService { } const response = await this.apiService.getAccountRevisionDate(); + if (response < 0 && this.logoutCallback) { + // Account was deleted, log out now + await this.logoutCallback(false); + } + if (new Date(response) <= lastSync) { return false; }