Delete Unused Bits of StateService (#9858)
* Delete Unused Bits of StateService * Fix Tests
This commit is contained in:
parent
9b509cd329
commit
053e255a68
|
@ -17,7 +17,6 @@ import { CipherService } from "@bitwarden/common/vault/services/cipher.service";
|
||||||
import { FolderService } from "@bitwarden/common/vault/services/folder/folder.service";
|
import { FolderService } from "@bitwarden/common/vault/services/folder/folder.service";
|
||||||
|
|
||||||
import { BrowserApi } from "../../platform/browser/browser-api";
|
import { BrowserApi } from "../../platform/browser/browser-api";
|
||||||
import { DefaultBrowserStateService } from "../../platform/services/default-browser-state.service";
|
|
||||||
import { NotificationQueueMessageType } from "../enums/notification-queue-message-type.enum";
|
import { NotificationQueueMessageType } from "../enums/notification-queue-message-type.enum";
|
||||||
import { FormData } from "../services/abstractions/autofill.service";
|
import { FormData } from "../services/abstractions/autofill.service";
|
||||||
import AutofillService from "../services/autofill.service";
|
import AutofillService from "../services/autofill.service";
|
||||||
|
@ -49,7 +48,6 @@ describe("NotificationBackground", () => {
|
||||||
const authService = mock<AuthService>();
|
const authService = mock<AuthService>();
|
||||||
const policyService = mock<PolicyService>();
|
const policyService = mock<PolicyService>();
|
||||||
const folderService = mock<FolderService>();
|
const folderService = mock<FolderService>();
|
||||||
const stateService = mock<DefaultBrowserStateService>();
|
|
||||||
const userNotificationSettingsService = mock<UserNotificationSettingsService>();
|
const userNotificationSettingsService = mock<UserNotificationSettingsService>();
|
||||||
const domainSettingsService = mock<DomainSettingsService>();
|
const domainSettingsService = mock<DomainSettingsService>();
|
||||||
const environmentService = mock<EnvironmentService>();
|
const environmentService = mock<EnvironmentService>();
|
||||||
|
@ -64,7 +62,6 @@ describe("NotificationBackground", () => {
|
||||||
authService,
|
authService,
|
||||||
policyService,
|
policyService,
|
||||||
folderService,
|
folderService,
|
||||||
stateService,
|
|
||||||
userNotificationSettingsService,
|
userNotificationSettingsService,
|
||||||
domainSettingsService,
|
domainSettingsService,
|
||||||
environmentService,
|
environmentService,
|
||||||
|
|
|
@ -23,7 +23,6 @@ import { LoginView } from "@bitwarden/common/vault/models/view/login.view";
|
||||||
|
|
||||||
import { openUnlockPopout } from "../../auth/popup/utils/auth-popout-window";
|
import { openUnlockPopout } from "../../auth/popup/utils/auth-popout-window";
|
||||||
import { BrowserApi } from "../../platform/browser/browser-api";
|
import { BrowserApi } from "../../platform/browser/browser-api";
|
||||||
import { BrowserStateService } from "../../platform/services/abstractions/browser-state.service";
|
|
||||||
import { openAddEditVaultItemPopout } from "../../vault/popup/utils/vault-popout-window";
|
import { openAddEditVaultItemPopout } from "../../vault/popup/utils/vault-popout-window";
|
||||||
import { NotificationQueueMessageType } from "../enums/notification-queue-message-type.enum";
|
import { NotificationQueueMessageType } from "../enums/notification-queue-message-type.enum";
|
||||||
import { AutofillService } from "../services/abstractions/autofill.service";
|
import { AutofillService } from "../services/abstractions/autofill.service";
|
||||||
|
@ -76,7 +75,6 @@ export default class NotificationBackground {
|
||||||
private authService: AuthService,
|
private authService: AuthService,
|
||||||
private policyService: PolicyService,
|
private policyService: PolicyService,
|
||||||
private folderService: FolderService,
|
private folderService: FolderService,
|
||||||
private stateService: BrowserStateService,
|
|
||||||
private userNotificationSettingsService: UserNotificationSettingsServiceAbstraction,
|
private userNotificationSettingsService: UserNotificationSettingsServiceAbstraction,
|
||||||
private domainSettingsService: DomainSettingsService,
|
private domainSettingsService: DomainSettingsService,
|
||||||
private environmentService: EnvironmentService,
|
private environmentService: EnvironmentService,
|
||||||
|
|
|
@ -33,7 +33,6 @@ import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view";
|
||||||
import { CipherService } from "@bitwarden/common/vault/services/cipher.service";
|
import { CipherService } from "@bitwarden/common/vault/services/cipher.service";
|
||||||
|
|
||||||
import { BrowserApi } from "../../platform/browser/browser-api";
|
import { BrowserApi } from "../../platform/browser/browser-api";
|
||||||
import { DefaultBrowserStateService } from "../../platform/services/default-browser-state.service";
|
|
||||||
import { BrowserPlatformUtilsService } from "../../platform/services/platform-utils/browser-platform-utils.service";
|
import { BrowserPlatformUtilsService } from "../../platform/services/platform-utils/browser-platform-utils.service";
|
||||||
import { AutofillService } from "../services/abstractions/autofill.service";
|
import { AutofillService } from "../services/abstractions/autofill.service";
|
||||||
import {
|
import {
|
||||||
|
@ -73,7 +72,6 @@ describe("OverlayBackground", () => {
|
||||||
urls: { icons: "https://icons.bitwarden.com/" },
|
urls: { icons: "https://icons.bitwarden.com/" },
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
const stateService = mock<DefaultBrowserStateService>();
|
|
||||||
const autofillSettingsService = mock<AutofillSettingsService>();
|
const autofillSettingsService = mock<AutofillSettingsService>();
|
||||||
const i18nService = mock<I18nService>();
|
const i18nService = mock<I18nService>();
|
||||||
const platformUtilsService = mock<BrowserPlatformUtilsService>();
|
const platformUtilsService = mock<BrowserPlatformUtilsService>();
|
||||||
|
@ -104,7 +102,6 @@ describe("OverlayBackground", () => {
|
||||||
authService,
|
authService,
|
||||||
environmentService,
|
environmentService,
|
||||||
domainSettingsService,
|
domainSettingsService,
|
||||||
stateService,
|
|
||||||
autofillSettingsService,
|
autofillSettingsService,
|
||||||
i18nService,
|
i18nService,
|
||||||
platformUtilsService,
|
platformUtilsService,
|
||||||
|
|
|
@ -9,7 +9,6 @@ import { InlineMenuVisibilitySetting } from "@bitwarden/common/autofill/types";
|
||||||
import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service";
|
import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service";
|
||||||
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
|
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
|
||||||
import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service";
|
import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service";
|
||||||
import { StateService } from "@bitwarden/common/platform/abstractions/state.service";
|
|
||||||
import { Utils } from "@bitwarden/common/platform/misc/utils";
|
import { Utils } from "@bitwarden/common/platform/misc/utils";
|
||||||
import { ThemeStateService } from "@bitwarden/common/platform/theming/theme-state.service";
|
import { ThemeStateService } from "@bitwarden/common/platform/theming/theme-state.service";
|
||||||
import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service";
|
import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service";
|
||||||
|
@ -101,7 +100,6 @@ class OverlayBackground implements OverlayBackgroundInterface {
|
||||||
private authService: AuthService,
|
private authService: AuthService,
|
||||||
private environmentService: EnvironmentService,
|
private environmentService: EnvironmentService,
|
||||||
private domainSettingsService: DomainSettingsService,
|
private domainSettingsService: DomainSettingsService,
|
||||||
private stateService: StateService,
|
|
||||||
private autofillSettingsService: AutofillSettingsServiceAbstraction,
|
private autofillSettingsService: AutofillSettingsServiceAbstraction,
|
||||||
private i18nService: I18nService,
|
private i18nService: I18nService,
|
||||||
private platformUtilsService: PlatformUtilsService,
|
private platformUtilsService: PlatformUtilsService,
|
||||||
|
|
|
@ -6,16 +6,15 @@ import { AutofillSettingsServiceAbstraction } from "@bitwarden/common/autofill/s
|
||||||
import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service";
|
import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service";
|
||||||
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
|
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
|
||||||
import { LogService } from "@bitwarden/common/platform/abstractions/log.service";
|
import { LogService } from "@bitwarden/common/platform/abstractions/log.service";
|
||||||
|
import { StateService } from "@bitwarden/common/platform/abstractions/state.service";
|
||||||
import { CipherType } from "@bitwarden/common/vault/enums";
|
import { CipherType } from "@bitwarden/common/vault/enums";
|
||||||
import { Cipher } from "@bitwarden/common/vault/models/domain/cipher";
|
import { Cipher } from "@bitwarden/common/vault/models/domain/cipher";
|
||||||
import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view";
|
import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view";
|
||||||
|
|
||||||
import { BrowserStateService } from "../../platform/services/abstractions/browser-state.service";
|
|
||||||
|
|
||||||
import { MainContextMenuHandler } from "./main-context-menu-handler";
|
import { MainContextMenuHandler } from "./main-context-menu-handler";
|
||||||
|
|
||||||
describe("context-menu", () => {
|
describe("context-menu", () => {
|
||||||
let stateService: MockProxy<BrowserStateService>;
|
let stateService: MockProxy<StateService>;
|
||||||
let autofillSettingsService: MockProxy<AutofillSettingsServiceAbstraction>;
|
let autofillSettingsService: MockProxy<AutofillSettingsServiceAbstraction>;
|
||||||
let i18nService: MockProxy<I18nService>;
|
let i18nService: MockProxy<I18nService>;
|
||||||
let logService: MockProxy<LogService>;
|
let logService: MockProxy<LogService>;
|
||||||
|
|
|
@ -20,12 +20,11 @@ import { AutofillSettingsServiceAbstraction } from "@bitwarden/common/autofill/s
|
||||||
import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service";
|
import { BillingAccountProfileStateService } from "@bitwarden/common/billing/abstractions/account/billing-account-profile-state.service";
|
||||||
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
|
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
|
||||||
import { LogService } from "@bitwarden/common/platform/abstractions/log.service";
|
import { LogService } from "@bitwarden/common/platform/abstractions/log.service";
|
||||||
|
import { StateService } from "@bitwarden/common/platform/abstractions/state.service";
|
||||||
import { Utils } from "@bitwarden/common/platform/misc/utils";
|
import { Utils } from "@bitwarden/common/platform/misc/utils";
|
||||||
import { CipherType } from "@bitwarden/common/vault/enums";
|
import { CipherType } from "@bitwarden/common/vault/enums";
|
||||||
import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view";
|
import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view";
|
||||||
|
|
||||||
import { BrowserStateService } from "../../platform/services/abstractions/browser-state.service";
|
|
||||||
|
|
||||||
import { InitContextMenuItems } from "./abstractions/main-context-menu-handler";
|
import { InitContextMenuItems } from "./abstractions/main-context-menu-handler";
|
||||||
|
|
||||||
export class MainContextMenuHandler {
|
export class MainContextMenuHandler {
|
||||||
|
@ -143,7 +142,7 @@ export class MainContextMenuHandler {
|
||||||
];
|
];
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private stateService: BrowserStateService,
|
private stateService: StateService,
|
||||||
private autofillSettingsService: AutofillSettingsServiceAbstraction,
|
private autofillSettingsService: AutofillSettingsServiceAbstraction,
|
||||||
private i18nService: I18nService,
|
private i18nService: I18nService,
|
||||||
private logService: LogService,
|
private logService: LogService,
|
||||||
|
|
|
@ -7,8 +7,6 @@ import { AccountService } from "@bitwarden/common/auth/abstractions/account.serv
|
||||||
import { VaultTimeoutAction } from "@bitwarden/common/enums/vault-timeout-action.enum";
|
import { VaultTimeoutAction } from "@bitwarden/common/enums/vault-timeout-action.enum";
|
||||||
import { VaultTimeoutStringType } from "@bitwarden/common/types/vault-timeout.type";
|
import { VaultTimeoutStringType } from "@bitwarden/common/types/vault-timeout.type";
|
||||||
|
|
||||||
import { BrowserStateService } from "../platform/services/abstractions/browser-state.service";
|
|
||||||
|
|
||||||
const IdleInterval = 60 * 5; // 5 minutes
|
const IdleInterval = 60 * 5; // 5 minutes
|
||||||
|
|
||||||
export default class IdleBackground {
|
export default class IdleBackground {
|
||||||
|
@ -18,7 +16,6 @@ export default class IdleBackground {
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private vaultTimeoutService: VaultTimeoutService,
|
private vaultTimeoutService: VaultTimeoutService,
|
||||||
private stateService: BrowserStateService,
|
|
||||||
private notificationsService: NotificationsService,
|
private notificationsService: NotificationsService,
|
||||||
private accountService: AccountService,
|
private accountService: AccountService,
|
||||||
private vaultTimeoutSettingsService: VaultTimeoutSettingsService,
|
private vaultTimeoutSettingsService: VaultTimeoutSettingsService,
|
||||||
|
|
|
@ -86,6 +86,7 @@ import { I18nService as I18nServiceAbstraction } from "@bitwarden/common/platfor
|
||||||
import { KeyGenerationService as KeyGenerationServiceAbstraction } from "@bitwarden/common/platform/abstractions/key-generation.service";
|
import { KeyGenerationService as KeyGenerationServiceAbstraction } from "@bitwarden/common/platform/abstractions/key-generation.service";
|
||||||
import { LogService as LogServiceAbstraction } from "@bitwarden/common/platform/abstractions/log.service";
|
import { LogService as LogServiceAbstraction } from "@bitwarden/common/platform/abstractions/log.service";
|
||||||
import { PlatformUtilsService as PlatformUtilsServiceAbstraction } from "@bitwarden/common/platform/abstractions/platform-utils.service";
|
import { PlatformUtilsService as PlatformUtilsServiceAbstraction } from "@bitwarden/common/platform/abstractions/platform-utils.service";
|
||||||
|
import { StateService as StateServiceAbstraction } from "@bitwarden/common/platform/abstractions/state.service";
|
||||||
import {
|
import {
|
||||||
AbstractStorageService,
|
AbstractStorageService,
|
||||||
ObservableStorageService,
|
ObservableStorageService,
|
||||||
|
@ -101,6 +102,7 @@ import { Message, MessageListener, MessageSender } from "@bitwarden/common/platf
|
||||||
import { SubjectMessageSender } from "@bitwarden/common/platform/messaging/internal";
|
import { SubjectMessageSender } from "@bitwarden/common/platform/messaging/internal";
|
||||||
import { Lazy } from "@bitwarden/common/platform/misc/lazy";
|
import { Lazy } from "@bitwarden/common/platform/misc/lazy";
|
||||||
import { clearCaches } from "@bitwarden/common/platform/misc/sequentialize";
|
import { clearCaches } from "@bitwarden/common/platform/misc/sequentialize";
|
||||||
|
import { Account } from "@bitwarden/common/platform/models/domain/account";
|
||||||
import { GlobalState } from "@bitwarden/common/platform/models/domain/global-state";
|
import { GlobalState } from "@bitwarden/common/platform/models/domain/global-state";
|
||||||
import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key";
|
import { SymmetricCryptoKey } from "@bitwarden/common/platform/models/domain/symmetric-crypto-key";
|
||||||
import { AppIdService } from "@bitwarden/common/platform/services/app-id.service";
|
import { AppIdService } from "@bitwarden/common/platform/services/app-id.service";
|
||||||
|
@ -116,6 +118,7 @@ import { FileUploadService } from "@bitwarden/common/platform/services/file-uplo
|
||||||
import { KeyGenerationService } from "@bitwarden/common/platform/services/key-generation.service";
|
import { KeyGenerationService } from "@bitwarden/common/platform/services/key-generation.service";
|
||||||
import { MigrationBuilderService } from "@bitwarden/common/platform/services/migration-builder.service";
|
import { MigrationBuilderService } from "@bitwarden/common/platform/services/migration-builder.service";
|
||||||
import { MigrationRunner } from "@bitwarden/common/platform/services/migration-runner";
|
import { MigrationRunner } from "@bitwarden/common/platform/services/migration-runner";
|
||||||
|
import { StateService } from "@bitwarden/common/platform/services/state.service";
|
||||||
import { SystemService } from "@bitwarden/common/platform/services/system.service";
|
import { SystemService } from "@bitwarden/common/platform/services/system.service";
|
||||||
import { UserAutoUnlockKeyService } from "@bitwarden/common/platform/services/user-auto-unlock-key.service";
|
import { UserAutoUnlockKeyService } from "@bitwarden/common/platform/services/user-auto-unlock-key.service";
|
||||||
import { WebCryptoFunctionService } from "@bitwarden/common/platform/services/web-crypto-function.service";
|
import { WebCryptoFunctionService } from "@bitwarden/common/platform/services/web-crypto-function.service";
|
||||||
|
@ -206,7 +209,6 @@ import { Fido2Background } from "../autofill/fido2/background/fido2.background";
|
||||||
import { AutofillService as AutofillServiceAbstraction } from "../autofill/services/abstractions/autofill.service";
|
import { AutofillService as AutofillServiceAbstraction } from "../autofill/services/abstractions/autofill.service";
|
||||||
import AutofillService from "../autofill/services/autofill.service";
|
import AutofillService from "../autofill/services/autofill.service";
|
||||||
import { SafariApp } from "../browser/safariApp";
|
import { SafariApp } from "../browser/safariApp";
|
||||||
import { Account } from "../models/account";
|
|
||||||
import { BrowserApi } from "../platform/browser/browser-api";
|
import { BrowserApi } from "../platform/browser/browser-api";
|
||||||
import { flagEnabled } from "../platform/flags";
|
import { flagEnabled } from "../platform/flags";
|
||||||
import { UpdateBadge } from "../platform/listeners/update-badge";
|
import { UpdateBadge } from "../platform/listeners/update-badge";
|
||||||
|
@ -215,13 +217,11 @@ import { ChromeMessageSender } from "../platform/messaging/chrome-message.sender
|
||||||
/* eslint-enable no-restricted-imports */
|
/* eslint-enable no-restricted-imports */
|
||||||
import { OffscreenDocumentService } from "../platform/offscreen-document/abstractions/offscreen-document";
|
import { OffscreenDocumentService } from "../platform/offscreen-document/abstractions/offscreen-document";
|
||||||
import { DefaultOffscreenDocumentService } from "../platform/offscreen-document/offscreen-document.service";
|
import { DefaultOffscreenDocumentService } from "../platform/offscreen-document/offscreen-document.service";
|
||||||
import { BrowserStateService as StateServiceAbstraction } from "../platform/services/abstractions/browser-state.service";
|
|
||||||
import { BrowserCryptoService } from "../platform/services/browser-crypto.service";
|
import { BrowserCryptoService } from "../platform/services/browser-crypto.service";
|
||||||
import { BrowserEnvironmentService } from "../platform/services/browser-environment.service";
|
import { BrowserEnvironmentService } from "../platform/services/browser-environment.service";
|
||||||
import BrowserLocalStorageService from "../platform/services/browser-local-storage.service";
|
import BrowserLocalStorageService from "../platform/services/browser-local-storage.service";
|
||||||
import BrowserMemoryStorageService from "../platform/services/browser-memory-storage.service";
|
import BrowserMemoryStorageService from "../platform/services/browser-memory-storage.service";
|
||||||
import { BrowserScriptInjectorService } from "../platform/services/browser-script-injector.service";
|
import { BrowserScriptInjectorService } from "../platform/services/browser-script-injector.service";
|
||||||
import { DefaultBrowserStateService } from "../platform/services/default-browser-state.service";
|
|
||||||
import I18nService from "../platform/services/i18n.service";
|
import I18nService from "../platform/services/i18n.service";
|
||||||
import { LocalBackedSessionStorageService } from "../platform/services/local-backed-session-storage.service";
|
import { LocalBackedSessionStorageService } from "../platform/services/local-backed-session-storage.service";
|
||||||
import { BackgroundPlatformUtilsService } from "../platform/services/platform-utils/background-platform-utils.service";
|
import { BackgroundPlatformUtilsService } from "../platform/services/platform-utils/background-platform-utils.service";
|
||||||
|
@ -540,7 +540,7 @@ export default class MainBackground {
|
||||||
ClientType.Browser,
|
ClientType.Browser,
|
||||||
);
|
);
|
||||||
|
|
||||||
this.stateService = new DefaultBrowserStateService(
|
this.stateService = new StateService(
|
||||||
this.storageService,
|
this.storageService,
|
||||||
this.secureStorageService,
|
this.secureStorageService,
|
||||||
this.memoryStorageService,
|
this.memoryStorageService,
|
||||||
|
@ -968,7 +968,6 @@ export default class MainBackground {
|
||||||
this.messagingService,
|
this.messagingService,
|
||||||
this.platformUtilsService,
|
this.platformUtilsService,
|
||||||
systemUtilsServiceReloadCallback,
|
systemUtilsServiceReloadCallback,
|
||||||
this.stateService,
|
|
||||||
this.autofillSettingsService,
|
this.autofillSettingsService,
|
||||||
this.vaultTimeoutSettingsService,
|
this.vaultTimeoutSettingsService,
|
||||||
this.biometricStateService,
|
this.biometricStateService,
|
||||||
|
@ -1028,7 +1027,6 @@ export default class MainBackground {
|
||||||
this.authService,
|
this.authService,
|
||||||
this.policyService,
|
this.policyService,
|
||||||
this.folderService,
|
this.folderService,
|
||||||
this.stateService,
|
|
||||||
this.userNotificationSettingsService,
|
this.userNotificationSettingsService,
|
||||||
this.domainSettingsService,
|
this.domainSettingsService,
|
||||||
this.environmentService,
|
this.environmentService,
|
||||||
|
@ -1042,7 +1040,6 @@ export default class MainBackground {
|
||||||
this.authService,
|
this.authService,
|
||||||
this.environmentService,
|
this.environmentService,
|
||||||
this.domainSettingsService,
|
this.domainSettingsService,
|
||||||
this.stateService,
|
|
||||||
this.autofillSettingsService,
|
this.autofillSettingsService,
|
||||||
this.i18nService,
|
this.i18nService,
|
||||||
this.platformUtilsService,
|
this.platformUtilsService,
|
||||||
|
@ -1100,7 +1097,6 @@ export default class MainBackground {
|
||||||
|
|
||||||
this.idleBackground = new IdleBackground(
|
this.idleBackground = new IdleBackground(
|
||||||
this.vaultTimeoutService,
|
this.vaultTimeoutService,
|
||||||
this.stateService,
|
|
||||||
this.notificationsService,
|
this.notificationsService,
|
||||||
this.accountService,
|
this.accountService,
|
||||||
this.vaultTimeoutSettingsService,
|
this.vaultTimeoutSettingsService,
|
||||||
|
@ -1227,11 +1223,6 @@ export default class MainBackground {
|
||||||
async switchAccount(userId: UserId) {
|
async switchAccount(userId: UserId) {
|
||||||
let nextAccountStatus: AuthenticationStatus;
|
let nextAccountStatus: AuthenticationStatus;
|
||||||
try {
|
try {
|
||||||
const currentlyActiveAccount = await firstValueFrom(
|
|
||||||
this.accountService.activeAccount$.pipe(map((account) => account?.id)),
|
|
||||||
);
|
|
||||||
// can be removed once password generation history is migrated to state providers
|
|
||||||
await this.stateService.clearDecryptedData(currentlyActiveAccount);
|
|
||||||
// HACK to ensure account is switched before proceeding
|
// HACK to ensure account is switched before proceeding
|
||||||
const switchPromise = firstValueFrom(
|
const switchPromise = firstValueFrom(
|
||||||
this.accountService.activeAccount$.pipe(
|
this.accountService.activeAccount$.pipe(
|
||||||
|
|
|
@ -1,36 +0,0 @@
|
||||||
import { Jsonify } from "type-fest";
|
|
||||||
|
|
||||||
import { Account as BaseAccount } from "@bitwarden/common/platform/models/domain/account";
|
|
||||||
|
|
||||||
import { BrowserComponentState } from "./browserComponentState";
|
|
||||||
import { BrowserGroupingsComponentState } from "./browserGroupingsComponentState";
|
|
||||||
import { BrowserSendComponentState } from "./browserSendComponentState";
|
|
||||||
|
|
||||||
export class Account extends BaseAccount {
|
|
||||||
groupings?: BrowserGroupingsComponentState;
|
|
||||||
send?: BrowserSendComponentState;
|
|
||||||
ciphers?: BrowserComponentState;
|
|
||||||
sendType?: BrowserComponentState;
|
|
||||||
|
|
||||||
constructor(init: Partial<Account>) {
|
|
||||||
super(init);
|
|
||||||
|
|
||||||
this.groupings = init?.groupings ?? new BrowserGroupingsComponentState();
|
|
||||||
this.send = init?.send ?? new BrowserSendComponentState();
|
|
||||||
this.ciphers = init?.ciphers ?? new BrowserComponentState();
|
|
||||||
this.sendType = init?.sendType ?? new BrowserComponentState();
|
|
||||||
}
|
|
||||||
|
|
||||||
static fromJSON(json: Jsonify<Account>): Account {
|
|
||||||
if (json == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return Object.assign(new Account({}), json, super.fromJSON(json), {
|
|
||||||
groupings: BrowserGroupingsComponentState.fromJSON(json.groupings),
|
|
||||||
send: BrowserSendComponentState.fromJSON(json.send),
|
|
||||||
ciphers: BrowserComponentState.fromJSON(json.ciphers),
|
|
||||||
sendType: BrowserComponentState.fromJSON(json.sendType),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,5 +0,0 @@
|
||||||
import { StateService as BaseStateServiceAbstraction } from "@bitwarden/common/platform/abstractions/state.service";
|
|
||||||
|
|
||||||
import { Account } from "../../../models/account";
|
|
||||||
|
|
||||||
export abstract class BrowserStateService extends BaseStateServiceAbstraction<Account> {}
|
|
|
@ -1,77 +0,0 @@
|
||||||
import { mock, MockProxy } from "jest-mock-extended";
|
|
||||||
|
|
||||||
import { TokenService } from "@bitwarden/common/auth/abstractions/token.service";
|
|
||||||
import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service";
|
|
||||||
import { LogService } from "@bitwarden/common/platform/abstractions/log.service";
|
|
||||||
import { AbstractStorageService } from "@bitwarden/common/platform/abstractions/storage.service";
|
|
||||||
import { StateFactory } from "@bitwarden/common/platform/factories/state-factory";
|
|
||||||
import { GlobalState } from "@bitwarden/common/platform/models/domain/global-state";
|
|
||||||
import { State } from "@bitwarden/common/platform/models/domain/state";
|
|
||||||
import { MigrationRunner } from "@bitwarden/common/platform/services/migration-runner";
|
|
||||||
import { mockAccountServiceWith } from "@bitwarden/common/spec";
|
|
||||||
import { UserId } from "@bitwarden/common/types/guid";
|
|
||||||
|
|
||||||
import { Account } from "../../models/account";
|
|
||||||
|
|
||||||
import { DefaultBrowserStateService } from "./default-browser-state.service";
|
|
||||||
|
|
||||||
describe("Browser State Service", () => {
|
|
||||||
let secureStorageService: MockProxy<AbstractStorageService>;
|
|
||||||
let diskStorageService: MockProxy<AbstractStorageService>;
|
|
||||||
let logService: MockProxy<LogService>;
|
|
||||||
let stateFactory: MockProxy<StateFactory<GlobalState, Account>>;
|
|
||||||
let environmentService: MockProxy<EnvironmentService>;
|
|
||||||
let tokenService: MockProxy<TokenService>;
|
|
||||||
let migrationRunner: MockProxy<MigrationRunner>;
|
|
||||||
|
|
||||||
let state: State<GlobalState, Account>;
|
|
||||||
const userId = "userId" as UserId;
|
|
||||||
const accountService = mockAccountServiceWith(userId);
|
|
||||||
|
|
||||||
let sut: DefaultBrowserStateService;
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
secureStorageService = mock();
|
|
||||||
diskStorageService = mock();
|
|
||||||
logService = mock();
|
|
||||||
stateFactory = mock();
|
|
||||||
environmentService = mock();
|
|
||||||
tokenService = mock();
|
|
||||||
migrationRunner = mock();
|
|
||||||
|
|
||||||
state = new State(new GlobalState());
|
|
||||||
state.accounts[userId] = new Account({
|
|
||||||
profile: { userId: userId },
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
jest.resetAllMocks();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("state methods", () => {
|
|
||||||
let memoryStorageService: MockProxy<AbstractStorageService>;
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
memoryStorageService = mock();
|
|
||||||
const stateGetter = (key: string) => Promise.resolve(state);
|
|
||||||
memoryStorageService.get.mockImplementation(stateGetter);
|
|
||||||
|
|
||||||
sut = new DefaultBrowserStateService(
|
|
||||||
diskStorageService,
|
|
||||||
secureStorageService,
|
|
||||||
memoryStorageService,
|
|
||||||
logService,
|
|
||||||
stateFactory,
|
|
||||||
accountService,
|
|
||||||
environmentService,
|
|
||||||
tokenService,
|
|
||||||
migrationRunner,
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("exists", () => {
|
|
||||||
expect(sut).toBeDefined();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -1,64 +0,0 @@
|
||||||
import { AccountService } from "@bitwarden/common/auth/abstractions/account.service";
|
|
||||||
import { TokenService } from "@bitwarden/common/auth/abstractions/token.service";
|
|
||||||
import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service";
|
|
||||||
import { LogService } from "@bitwarden/common/platform/abstractions/log.service";
|
|
||||||
import { AbstractStorageService } from "@bitwarden/common/platform/abstractions/storage.service";
|
|
||||||
import { StateFactory } from "@bitwarden/common/platform/factories/state-factory";
|
|
||||||
import { GlobalState } from "@bitwarden/common/platform/models/domain/global-state";
|
|
||||||
import { StorageOptions } from "@bitwarden/common/platform/models/domain/storage-options";
|
|
||||||
import { MigrationRunner } from "@bitwarden/common/platform/services/migration-runner";
|
|
||||||
import { StateService as BaseStateService } from "@bitwarden/common/platform/services/state.service";
|
|
||||||
|
|
||||||
import { Account } from "../../models/account";
|
|
||||||
|
|
||||||
import { BrowserStateService } from "./abstractions/browser-state.service";
|
|
||||||
|
|
||||||
export class DefaultBrowserStateService
|
|
||||||
extends BaseStateService<GlobalState, Account>
|
|
||||||
implements BrowserStateService
|
|
||||||
{
|
|
||||||
protected accountDeserializer = Account.fromJSON;
|
|
||||||
|
|
||||||
constructor(
|
|
||||||
storageService: AbstractStorageService,
|
|
||||||
secureStorageService: AbstractStorageService,
|
|
||||||
memoryStorageService: AbstractStorageService,
|
|
||||||
logService: LogService,
|
|
||||||
stateFactory: StateFactory<GlobalState, Account>,
|
|
||||||
accountService: AccountService,
|
|
||||||
environmentService: EnvironmentService,
|
|
||||||
tokenService: TokenService,
|
|
||||||
migrationRunner: MigrationRunner,
|
|
||||||
) {
|
|
||||||
super(
|
|
||||||
storageService,
|
|
||||||
secureStorageService,
|
|
||||||
memoryStorageService,
|
|
||||||
logService,
|
|
||||||
stateFactory,
|
|
||||||
accountService,
|
|
||||||
environmentService,
|
|
||||||
tokenService,
|
|
||||||
migrationRunner,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
async addAccount(account: Account) {
|
|
||||||
// Apply browser overrides to default account values
|
|
||||||
account = new Account(account);
|
|
||||||
await super.addAccount(account);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Overriding the base class to prevent deleting the cache on save. We register a storage listener
|
|
||||||
// to delete the cache in the constructor above.
|
|
||||||
protected override async saveAccountToDisk(
|
|
||||||
account: Account,
|
|
||||||
options: StorageOptions,
|
|
||||||
): Promise<void> {
|
|
||||||
const storageLocation = options.useSecureStorage
|
|
||||||
? this.secureStorageService
|
|
||||||
: this.storageService;
|
|
||||||
|
|
||||||
await storageLocation.save(`${options.userId}`, account, options);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -8,6 +8,7 @@ import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service";
|
||||||
import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status";
|
import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status";
|
||||||
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
|
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
|
||||||
import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service";
|
import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service";
|
||||||
|
import { StateService } from "@bitwarden/common/platform/abstractions/state.service";
|
||||||
import { MessageListener } from "@bitwarden/common/platform/messaging";
|
import { MessageListener } from "@bitwarden/common/platform/messaging";
|
||||||
import { UserId } from "@bitwarden/common/types/guid";
|
import { UserId } from "@bitwarden/common/types/guid";
|
||||||
import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service";
|
import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service";
|
||||||
|
@ -19,7 +20,6 @@ import {
|
||||||
} from "@bitwarden/components";
|
} from "@bitwarden/components";
|
||||||
|
|
||||||
import { BrowserApi } from "../platform/browser/browser-api";
|
import { BrowserApi } from "../platform/browser/browser-api";
|
||||||
import { BrowserStateService } from "../platform/services/abstractions/browser-state.service";
|
|
||||||
import { BrowserSendStateService } from "../tools/popup/services/browser-send-state.service";
|
import { BrowserSendStateService } from "../tools/popup/services/browser-send-state.service";
|
||||||
import { VaultBrowserStateService } from "../vault/services/vault-browser-state.service";
|
import { VaultBrowserStateService } from "../vault/services/vault-browser-state.service";
|
||||||
|
|
||||||
|
@ -45,7 +45,7 @@ export class AppComponent implements OnInit, OnDestroy {
|
||||||
private authService: AuthService,
|
private authService: AuthService,
|
||||||
private i18nService: I18nService,
|
private i18nService: I18nService,
|
||||||
private router: Router,
|
private router: Router,
|
||||||
private stateService: BrowserStateService,
|
private stateService: StateService,
|
||||||
private browserSendStateService: BrowserSendStateService,
|
private browserSendStateService: BrowserSendStateService,
|
||||||
private vaultBrowserStateService: VaultBrowserStateService,
|
private vaultBrowserStateService: VaultBrowserStateService,
|
||||||
private cipherService: CipherService,
|
private cipherService: CipherService,
|
||||||
|
|
|
@ -6,16 +6,16 @@ import { TwoFactorService } from "@bitwarden/common/auth/abstractions/two-factor
|
||||||
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
|
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
|
||||||
import { LogService as LogServiceAbstraction } from "@bitwarden/common/platform/abstractions/log.service";
|
import { LogService as LogServiceAbstraction } from "@bitwarden/common/platform/abstractions/log.service";
|
||||||
import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service";
|
import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service";
|
||||||
|
import { StateService } from "@bitwarden/common/platform/abstractions/state.service";
|
||||||
|
|
||||||
import { BrowserApi } from "../../platform/browser/browser-api";
|
import { BrowserApi } from "../../platform/browser/browser-api";
|
||||||
import BrowserPopupUtils from "../../platform/popup/browser-popup-utils";
|
import BrowserPopupUtils from "../../platform/popup/browser-popup-utils";
|
||||||
import { BrowserStateService as StateServiceAbstraction } from "../../platform/services/abstractions/browser-state.service";
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class InitService {
|
export class InitService {
|
||||||
constructor(
|
constructor(
|
||||||
private platformUtilsService: PlatformUtilsService,
|
private platformUtilsService: PlatformUtilsService,
|
||||||
private i18nService: I18nService,
|
private i18nService: I18nService,
|
||||||
private stateService: StateServiceAbstraction,
|
private stateService: StateService,
|
||||||
private twoFactorService: TwoFactorService,
|
private twoFactorService: TwoFactorService,
|
||||||
private logService: LogServiceAbstraction,
|
private logService: LogServiceAbstraction,
|
||||||
private themingService: AbstractThemingService,
|
private themingService: AbstractThemingService,
|
||||||
|
|
|
@ -32,7 +32,6 @@ import { KdfConfigService } from "@bitwarden/common/auth/abstractions/kdf-config
|
||||||
import { KeyConnectorService } from "@bitwarden/common/auth/abstractions/key-connector.service";
|
import { KeyConnectorService } from "@bitwarden/common/auth/abstractions/key-connector.service";
|
||||||
import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/auth/abstractions/master-password.service.abstraction";
|
import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/auth/abstractions/master-password.service.abstraction";
|
||||||
import { SsoLoginServiceAbstraction } from "@bitwarden/common/auth/abstractions/sso-login.service.abstraction";
|
import { SsoLoginServiceAbstraction } from "@bitwarden/common/auth/abstractions/sso-login.service.abstraction";
|
||||||
import { TokenService } from "@bitwarden/common/auth/abstractions/token.service";
|
|
||||||
import { UserVerificationService } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction";
|
import { UserVerificationService } from "@bitwarden/common/auth/abstractions/user-verification/user-verification.service.abstraction";
|
||||||
import {
|
import {
|
||||||
AutofillSettingsService,
|
AutofillSettingsService,
|
||||||
|
@ -57,20 +56,17 @@ import { I18nService as I18nServiceAbstraction } from "@bitwarden/common/platfor
|
||||||
import { KeyGenerationService } from "@bitwarden/common/platform/abstractions/key-generation.service";
|
import { KeyGenerationService } from "@bitwarden/common/platform/abstractions/key-generation.service";
|
||||||
import { LogService } from "@bitwarden/common/platform/abstractions/log.service";
|
import { LogService } from "@bitwarden/common/platform/abstractions/log.service";
|
||||||
import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service";
|
import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service";
|
||||||
import { StateService as BaseStateServiceAbstraction } from "@bitwarden/common/platform/abstractions/state.service";
|
import { StateService } from "@bitwarden/common/platform/abstractions/state.service";
|
||||||
import {
|
import {
|
||||||
AbstractStorageService,
|
AbstractStorageService,
|
||||||
ObservableStorageService,
|
ObservableStorageService,
|
||||||
} from "@bitwarden/common/platform/abstractions/storage.service";
|
} from "@bitwarden/common/platform/abstractions/storage.service";
|
||||||
import { BiometricStateService } from "@bitwarden/common/platform/biometrics/biometric-state.service";
|
import { BiometricStateService } from "@bitwarden/common/platform/biometrics/biometric-state.service";
|
||||||
import { StateFactory } from "@bitwarden/common/platform/factories/state-factory";
|
|
||||||
import { Message, MessageListener, MessageSender } from "@bitwarden/common/platform/messaging";
|
import { Message, MessageListener, MessageSender } from "@bitwarden/common/platform/messaging";
|
||||||
// eslint-disable-next-line no-restricted-imports -- Used for dependency injection
|
// eslint-disable-next-line no-restricted-imports -- Used for dependency injection
|
||||||
import { SubjectMessageSender } from "@bitwarden/common/platform/messaging/internal";
|
import { SubjectMessageSender } from "@bitwarden/common/platform/messaging/internal";
|
||||||
import { GlobalState } from "@bitwarden/common/platform/models/domain/global-state";
|
|
||||||
import { ConsoleLogService } from "@bitwarden/common/platform/services/console-log.service";
|
import { ConsoleLogService } from "@bitwarden/common/platform/services/console-log.service";
|
||||||
import { ContainerService } from "@bitwarden/common/platform/services/container.service";
|
import { ContainerService } from "@bitwarden/common/platform/services/container.service";
|
||||||
import { MigrationRunner } from "@bitwarden/common/platform/services/migration-runner";
|
|
||||||
import { StorageServiceProvider } from "@bitwarden/common/platform/services/storage-service.provider";
|
import { StorageServiceProvider } from "@bitwarden/common/platform/services/storage-service.provider";
|
||||||
import { WebCryptoFunctionService } from "@bitwarden/common/platform/services/web-crypto-function.service";
|
import { WebCryptoFunctionService } from "@bitwarden/common/platform/services/web-crypto-function.service";
|
||||||
import {
|
import {
|
||||||
|
@ -94,7 +90,6 @@ import { UnauthGuardService } from "../../auth/popup/services";
|
||||||
import { AutofillService as AutofillServiceAbstraction } from "../../autofill/services/abstractions/autofill.service";
|
import { AutofillService as AutofillServiceAbstraction } from "../../autofill/services/abstractions/autofill.service";
|
||||||
import AutofillService from "../../autofill/services/autofill.service";
|
import AutofillService from "../../autofill/services/autofill.service";
|
||||||
import MainBackground from "../../background/main.background";
|
import MainBackground from "../../background/main.background";
|
||||||
import { Account } from "../../models/account";
|
|
||||||
import { BrowserApi } from "../../platform/browser/browser-api";
|
import { BrowserApi } from "../../platform/browser/browser-api";
|
||||||
import { runInsideAngular } from "../../platform/browser/run-inside-angular.operator";
|
import { runInsideAngular } from "../../platform/browser/run-inside-angular.operator";
|
||||||
/* eslint-disable no-restricted-imports */
|
/* eslint-disable no-restricted-imports */
|
||||||
|
@ -104,13 +99,11 @@ import { OffscreenDocumentService } from "../../platform/offscreen-document/abst
|
||||||
import { DefaultOffscreenDocumentService } from "../../platform/offscreen-document/offscreen-document.service";
|
import { DefaultOffscreenDocumentService } from "../../platform/offscreen-document/offscreen-document.service";
|
||||||
import BrowserPopupUtils from "../../platform/popup/browser-popup-utils";
|
import BrowserPopupUtils from "../../platform/popup/browser-popup-utils";
|
||||||
import { BrowserFileDownloadService } from "../../platform/popup/services/browser-file-download.service";
|
import { BrowserFileDownloadService } from "../../platform/popup/services/browser-file-download.service";
|
||||||
import { BrowserStateService as StateServiceAbstraction } from "../../platform/services/abstractions/browser-state.service";
|
|
||||||
import { ScriptInjectorService } from "../../platform/services/abstractions/script-injector.service";
|
import { ScriptInjectorService } from "../../platform/services/abstractions/script-injector.service";
|
||||||
import { BrowserCryptoService } from "../../platform/services/browser-crypto.service";
|
import { BrowserCryptoService } from "../../platform/services/browser-crypto.service";
|
||||||
import { BrowserEnvironmentService } from "../../platform/services/browser-environment.service";
|
import { BrowserEnvironmentService } from "../../platform/services/browser-environment.service";
|
||||||
import BrowserLocalStorageService from "../../platform/services/browser-local-storage.service";
|
import BrowserLocalStorageService from "../../platform/services/browser-local-storage.service";
|
||||||
import { BrowserScriptInjectorService } from "../../platform/services/browser-script-injector.service";
|
import { BrowserScriptInjectorService } from "../../platform/services/browser-script-injector.service";
|
||||||
import { DefaultBrowserStateService } from "../../platform/services/default-browser-state.service";
|
|
||||||
import I18nService from "../../platform/services/i18n.service";
|
import I18nService from "../../platform/services/i18n.service";
|
||||||
import { ForegroundPlatformUtilsService } from "../../platform/services/platform-utils/foreground-platform-utils.service";
|
import { ForegroundPlatformUtilsService } from "../../platform/services/platform-utils/foreground-platform-utils.service";
|
||||||
import { BrowserStorageServiceProvider } from "../../platform/storage/browser-storage-service.provider";
|
import { BrowserStorageServiceProvider } from "../../platform/storage/browser-storage-service.provider";
|
||||||
|
@ -219,7 +212,7 @@ const safeProviders: SafeProvider[] = [
|
||||||
encryptService: EncryptService,
|
encryptService: EncryptService,
|
||||||
platformUtilsService: PlatformUtilsService,
|
platformUtilsService: PlatformUtilsService,
|
||||||
logService: LogService,
|
logService: LogService,
|
||||||
stateService: StateServiceAbstraction,
|
stateService: StateService,
|
||||||
accountService: AccountServiceAbstraction,
|
accountService: AccountServiceAbstraction,
|
||||||
stateProvider: StateProvider,
|
stateProvider: StateProvider,
|
||||||
biometricStateService: BiometricStateService,
|
biometricStateService: BiometricStateService,
|
||||||
|
@ -250,7 +243,7 @@ const safeProviders: SafeProvider[] = [
|
||||||
EncryptService,
|
EncryptService,
|
||||||
PlatformUtilsService,
|
PlatformUtilsService,
|
||||||
LogService,
|
LogService,
|
||||||
StateServiceAbstraction,
|
StateService,
|
||||||
AccountServiceAbstraction,
|
AccountServiceAbstraction,
|
||||||
StateProvider,
|
StateProvider,
|
||||||
BiometricStateService,
|
BiometricStateService,
|
||||||
|
@ -436,46 +429,6 @@ const safeProviders: SafeProvider[] = [
|
||||||
},
|
},
|
||||||
deps: [StateProvider],
|
deps: [StateProvider],
|
||||||
}),
|
}),
|
||||||
safeProvider({
|
|
||||||
provide: StateServiceAbstraction,
|
|
||||||
useFactory: (
|
|
||||||
storageService: AbstractStorageService,
|
|
||||||
secureStorageService: AbstractStorageService,
|
|
||||||
memoryStorageService: AbstractStorageService,
|
|
||||||
logService: LogService,
|
|
||||||
accountService: AccountServiceAbstraction,
|
|
||||||
environmentService: EnvironmentService,
|
|
||||||
tokenService: TokenService,
|
|
||||||
migrationRunner: MigrationRunner,
|
|
||||||
) => {
|
|
||||||
return new DefaultBrowserStateService(
|
|
||||||
storageService,
|
|
||||||
secureStorageService,
|
|
||||||
memoryStorageService,
|
|
||||||
logService,
|
|
||||||
new StateFactory(GlobalState, Account),
|
|
||||||
accountService,
|
|
||||||
environmentService,
|
|
||||||
tokenService,
|
|
||||||
migrationRunner,
|
|
||||||
);
|
|
||||||
},
|
|
||||||
deps: [
|
|
||||||
AbstractStorageService,
|
|
||||||
SECURE_STORAGE,
|
|
||||||
MEMORY_STORAGE,
|
|
||||||
LogService,
|
|
||||||
AccountServiceAbstraction,
|
|
||||||
EnvironmentService,
|
|
||||||
TokenService,
|
|
||||||
MigrationRunner,
|
|
||||||
],
|
|
||||||
}),
|
|
||||||
safeProvider({
|
|
||||||
provide: BaseStateServiceAbstraction,
|
|
||||||
useExisting: StateServiceAbstraction,
|
|
||||||
deps: [],
|
|
||||||
}),
|
|
||||||
safeProvider({
|
safeProvider({
|
||||||
provide: FileDownloadService,
|
provide: FileDownloadService,
|
||||||
useClass: BrowserFileDownloadService,
|
useClass: BrowserFileDownloadService,
|
||||||
|
|
|
@ -13,12 +13,12 @@ import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.servic
|
||||||
import { LogService } from "@bitwarden/common/platform/abstractions/log.service";
|
import { LogService } from "@bitwarden/common/platform/abstractions/log.service";
|
||||||
import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service";
|
import { MessagingService } from "@bitwarden/common/platform/abstractions/messaging.service";
|
||||||
import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service";
|
import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service";
|
||||||
|
import { StateService } from "@bitwarden/common/platform/abstractions/state.service";
|
||||||
import { SendApiService } from "@bitwarden/common/tools/send/services/send-api.service.abstraction";
|
import { SendApiService } from "@bitwarden/common/tools/send/services/send-api.service.abstraction";
|
||||||
import { SendService } from "@bitwarden/common/tools/send/services/send.service.abstraction";
|
import { SendService } from "@bitwarden/common/tools/send/services/send.service.abstraction";
|
||||||
import { DialogService, ToastService } from "@bitwarden/components";
|
import { DialogService, ToastService } from "@bitwarden/components";
|
||||||
|
|
||||||
import BrowserPopupUtils from "../../../platform/popup/browser-popup-utils";
|
import BrowserPopupUtils from "../../../platform/popup/browser-popup-utils";
|
||||||
import { BrowserStateService } from "../../../platform/services/abstractions/browser-state.service";
|
|
||||||
import { FilePopoutUtilsService } from "../services/file-popout-utils.service";
|
import { FilePopoutUtilsService } from "../services/file-popout-utils.service";
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
|
@ -37,7 +37,7 @@ export class SendAddEditComponent extends BaseAddEditComponent {
|
||||||
constructor(
|
constructor(
|
||||||
i18nService: I18nService,
|
i18nService: I18nService,
|
||||||
platformUtilsService: PlatformUtilsService,
|
platformUtilsService: PlatformUtilsService,
|
||||||
stateService: BrowserStateService,
|
stateService: StateService,
|
||||||
messagingService: MessagingService,
|
messagingService: MessagingService,
|
||||||
policyService: PolicyService,
|
policyService: PolicyService,
|
||||||
environmentService: EnvironmentService,
|
environmentService: EnvironmentService,
|
||||||
|
|
|
@ -403,7 +403,6 @@ export class AppComponent implements OnInit, OnDestroy {
|
||||||
// Clear sequentialized caches
|
// Clear sequentialized caches
|
||||||
clearCaches();
|
clearCaches();
|
||||||
if (message.userId != null) {
|
if (message.userId != null) {
|
||||||
await this.stateService.clearDecryptedData(message.userId);
|
|
||||||
await this.accountService.switchAccount(message.userId);
|
await this.accountService.switchAccount(message.userId);
|
||||||
}
|
}
|
||||||
const locked =
|
const locked =
|
||||||
|
|
|
@ -165,8 +165,6 @@ export class AccountSwitcherComponent {
|
||||||
async addAccount() {
|
async addAccount() {
|
||||||
this.close();
|
this.close();
|
||||||
|
|
||||||
const activeAccount = await firstValueFrom(this.accountService.activeAccount$);
|
|
||||||
await this.stateService.clearDecryptedData(activeAccount?.id as UserId);
|
|
||||||
await this.accountService.switchAccount(null);
|
await this.accountService.switchAccount(null);
|
||||||
await this.router.navigate(["/login"]);
|
await this.router.navigate(["/login"]);
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,7 +13,6 @@ import {
|
||||||
SUPPORTS_SECURE_STORAGE,
|
SUPPORTS_SECURE_STORAGE,
|
||||||
SYSTEM_THEME_OBSERVABLE,
|
SYSTEM_THEME_OBSERVABLE,
|
||||||
SafeInjectionToken,
|
SafeInjectionToken,
|
||||||
STATE_FACTORY,
|
|
||||||
DEFAULT_VAULT_TIMEOUT,
|
DEFAULT_VAULT_TIMEOUT,
|
||||||
INTRAPROCESS_MESSAGING_SUBJECT,
|
INTRAPROCESS_MESSAGING_SUBJECT,
|
||||||
CLIENT_TYPE,
|
CLIENT_TYPE,
|
||||||
|
@ -25,13 +24,11 @@ import { AccountService as AccountServiceAbstraction } from "@bitwarden/common/a
|
||||||
import { AuthService as AuthServiceAbstraction } from "@bitwarden/common/auth/abstractions/auth.service";
|
import { AuthService as AuthServiceAbstraction } from "@bitwarden/common/auth/abstractions/auth.service";
|
||||||
import { KdfConfigService as KdfConfigServiceAbstraction } from "@bitwarden/common/auth/abstractions/kdf-config.service";
|
import { KdfConfigService as KdfConfigServiceAbstraction } from "@bitwarden/common/auth/abstractions/kdf-config.service";
|
||||||
import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/auth/abstractions/master-password.service.abstraction";
|
import { InternalMasterPasswordServiceAbstraction } from "@bitwarden/common/auth/abstractions/master-password.service.abstraction";
|
||||||
import { TokenService } from "@bitwarden/common/auth/abstractions/token.service";
|
|
||||||
import { AutofillSettingsServiceAbstraction } from "@bitwarden/common/autofill/services/autofill-settings.service";
|
import { AutofillSettingsServiceAbstraction } from "@bitwarden/common/autofill/services/autofill-settings.service";
|
||||||
import { ClientType } from "@bitwarden/common/enums";
|
import { ClientType } from "@bitwarden/common/enums";
|
||||||
import { CryptoFunctionService as CryptoFunctionServiceAbstraction } from "@bitwarden/common/platform/abstractions/crypto-function.service";
|
import { CryptoFunctionService as CryptoFunctionServiceAbstraction } from "@bitwarden/common/platform/abstractions/crypto-function.service";
|
||||||
import { CryptoService as CryptoServiceAbstraction } from "@bitwarden/common/platform/abstractions/crypto.service";
|
import { CryptoService as CryptoServiceAbstraction } from "@bitwarden/common/platform/abstractions/crypto.service";
|
||||||
import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service";
|
import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service";
|
||||||
import { EnvironmentService } from "@bitwarden/common/platform/abstractions/environment.service";
|
|
||||||
import { FileDownloadService } from "@bitwarden/common/platform/abstractions/file-download/file-download.service";
|
import { FileDownloadService } from "@bitwarden/common/platform/abstractions/file-download/file-download.service";
|
||||||
import { I18nService as I18nServiceAbstraction } from "@bitwarden/common/platform/abstractions/i18n.service";
|
import { I18nService as I18nServiceAbstraction } from "@bitwarden/common/platform/abstractions/i18n.service";
|
||||||
import { KeyGenerationService as KeyGenerationServiceAbstraction } from "@bitwarden/common/platform/abstractions/key-generation.service";
|
import { KeyGenerationService as KeyGenerationServiceAbstraction } from "@bitwarden/common/platform/abstractions/key-generation.service";
|
||||||
|
@ -45,13 +42,10 @@ import { StateService as StateServiceAbstraction } from "@bitwarden/common/platf
|
||||||
import { AbstractStorageService } from "@bitwarden/common/platform/abstractions/storage.service";
|
import { AbstractStorageService } from "@bitwarden/common/platform/abstractions/storage.service";
|
||||||
import { SystemService as SystemServiceAbstraction } from "@bitwarden/common/platform/abstractions/system.service";
|
import { SystemService as SystemServiceAbstraction } from "@bitwarden/common/platform/abstractions/system.service";
|
||||||
import { BiometricStateService } from "@bitwarden/common/platform/biometrics/biometric-state.service";
|
import { BiometricStateService } from "@bitwarden/common/platform/biometrics/biometric-state.service";
|
||||||
import { StateFactory } from "@bitwarden/common/platform/factories/state-factory";
|
|
||||||
import { Message, MessageListener, MessageSender } from "@bitwarden/common/platform/messaging";
|
import { Message, MessageListener, MessageSender } from "@bitwarden/common/platform/messaging";
|
||||||
// eslint-disable-next-line no-restricted-imports -- Used for dependency injection
|
// eslint-disable-next-line no-restricted-imports -- Used for dependency injection
|
||||||
import { SubjectMessageSender } from "@bitwarden/common/platform/messaging/internal";
|
import { SubjectMessageSender } from "@bitwarden/common/platform/messaging/internal";
|
||||||
import { GlobalState } from "@bitwarden/common/platform/models/domain/global-state";
|
|
||||||
import { MemoryStorageService } from "@bitwarden/common/platform/services/memory-storage.service";
|
import { MemoryStorageService } from "@bitwarden/common/platform/services/memory-storage.service";
|
||||||
import { MigrationRunner } from "@bitwarden/common/platform/services/migration-runner";
|
|
||||||
import { SystemService } from "@bitwarden/common/platform/services/system.service";
|
import { SystemService } from "@bitwarden/common/platform/services/system.service";
|
||||||
import { GlobalStateProvider, StateProvider } from "@bitwarden/common/platform/state";
|
import { GlobalStateProvider, StateProvider } from "@bitwarden/common/platform/state";
|
||||||
// eslint-disable-next-line import/no-restricted-paths -- Implementation for memory storage
|
// eslint-disable-next-line import/no-restricted-paths -- Implementation for memory storage
|
||||||
|
@ -63,7 +57,6 @@ import { PasswordGenerationServiceAbstraction } from "@bitwarden/generator-legac
|
||||||
|
|
||||||
import { PinServiceAbstraction } from "../../../../../libs/auth/src/common/abstractions";
|
import { PinServiceAbstraction } from "../../../../../libs/auth/src/common/abstractions";
|
||||||
import { DesktopAutofillSettingsService } from "../../autofill/services/desktop-autofill-settings.service";
|
import { DesktopAutofillSettingsService } from "../../autofill/services/desktop-autofill-settings.service";
|
||||||
import { Account } from "../../models/account";
|
|
||||||
import { DesktopSettingsService } from "../../platform/services/desktop-settings.service";
|
import { DesktopSettingsService } from "../../platform/services/desktop-settings.service";
|
||||||
import { ElectronCryptoService } from "../../platform/services/electron-crypto.service";
|
import { ElectronCryptoService } from "../../platform/services/electron-crypto.service";
|
||||||
import { ElectronLogRendererService } from "../../platform/services/electron-log.renderer.service";
|
import { ElectronLogRendererService } from "../../platform/services/electron-log.renderer.service";
|
||||||
|
@ -74,7 +67,6 @@ import {
|
||||||
import { ElectronRendererMessageSender } from "../../platform/services/electron-renderer-message.sender";
|
import { ElectronRendererMessageSender } from "../../platform/services/electron-renderer-message.sender";
|
||||||
import { ElectronRendererSecureStorageService } from "../../platform/services/electron-renderer-secure-storage.service";
|
import { ElectronRendererSecureStorageService } from "../../platform/services/electron-renderer-secure-storage.service";
|
||||||
import { ElectronRendererStorageService } from "../../platform/services/electron-renderer-storage.service";
|
import { ElectronRendererStorageService } from "../../platform/services/electron-renderer-storage.service";
|
||||||
import { ElectronStateService } from "../../platform/services/electron-state.service";
|
|
||||||
import { I18nRendererService } from "../../platform/services/i18n.renderer.service";
|
import { I18nRendererService } from "../../platform/services/i18n.renderer.service";
|
||||||
import { fromIpcMessaging } from "../../platform/utils/from-ipc-messaging";
|
import { fromIpcMessaging } from "../../platform/utils/from-ipc-messaging";
|
||||||
import { fromIpcSystemTheme } from "../../platform/utils/from-ipc-system-theme";
|
import { fromIpcSystemTheme } from "../../platform/utils/from-ipc-system-theme";
|
||||||
|
@ -90,11 +82,6 @@ import { RendererCryptoFunctionService } from "./renderer-crypto-function.servic
|
||||||
|
|
||||||
const RELOAD_CALLBACK = new SafeInjectionToken<() => any>("RELOAD_CALLBACK");
|
const RELOAD_CALLBACK = new SafeInjectionToken<() => any>("RELOAD_CALLBACK");
|
||||||
|
|
||||||
// Desktop has its own Account definition which must be used in its StateService
|
|
||||||
const DESKTOP_STATE_FACTORY = new SafeInjectionToken<StateFactory<GlobalState, Account>>(
|
|
||||||
"DESKTOP_STATE_FACTORY",
|
|
||||||
);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provider definitions used in the ngModule.
|
* Provider definitions used in the ngModule.
|
||||||
* Add your provider definition here using the safeProvider function as a wrapper. This will give you type safety.
|
* Add your provider definition here using the safeProvider function as a wrapper. This will give you type safety.
|
||||||
|
@ -111,14 +98,6 @@ const safeProviders: SafeProvider[] = [
|
||||||
deps: [InitService],
|
deps: [InitService],
|
||||||
multi: true,
|
multi: true,
|
||||||
}),
|
}),
|
||||||
safeProvider({
|
|
||||||
provide: DESKTOP_STATE_FACTORY,
|
|
||||||
useValue: new StateFactory(GlobalState, Account),
|
|
||||||
}),
|
|
||||||
safeProvider({
|
|
||||||
provide: STATE_FACTORY,
|
|
||||||
useValue: null,
|
|
||||||
}),
|
|
||||||
safeProvider({
|
safeProvider({
|
||||||
provide: RELOAD_CALLBACK,
|
provide: RELOAD_CALLBACK,
|
||||||
useValue: null,
|
useValue: null,
|
||||||
|
@ -194,28 +173,12 @@ const safeProviders: SafeProvider[] = [
|
||||||
MessagingServiceAbstraction,
|
MessagingServiceAbstraction,
|
||||||
PlatformUtilsServiceAbstraction,
|
PlatformUtilsServiceAbstraction,
|
||||||
RELOAD_CALLBACK,
|
RELOAD_CALLBACK,
|
||||||
StateServiceAbstraction,
|
|
||||||
AutofillSettingsServiceAbstraction,
|
AutofillSettingsServiceAbstraction,
|
||||||
VaultTimeoutSettingsService,
|
VaultTimeoutSettingsService,
|
||||||
BiometricStateService,
|
BiometricStateService,
|
||||||
AccountServiceAbstraction,
|
AccountServiceAbstraction,
|
||||||
],
|
],
|
||||||
}),
|
}),
|
||||||
safeProvider({
|
|
||||||
provide: StateServiceAbstraction,
|
|
||||||
useClass: ElectronStateService,
|
|
||||||
deps: [
|
|
||||||
AbstractStorageService,
|
|
||||||
SECURE_STORAGE,
|
|
||||||
MEMORY_STORAGE,
|
|
||||||
LogService,
|
|
||||||
DESKTOP_STATE_FACTORY,
|
|
||||||
AccountServiceAbstraction,
|
|
||||||
EnvironmentService,
|
|
||||||
TokenService,
|
|
||||||
MigrationRunner,
|
|
||||||
],
|
|
||||||
}),
|
|
||||||
safeProvider({
|
safeProvider({
|
||||||
provide: FileDownloadService,
|
provide: FileDownloadService,
|
||||||
useClass: DesktopFileDownloadService,
|
useClass: DesktopFileDownloadService,
|
||||||
|
|
|
@ -1,20 +0,0 @@
|
||||||
import {
|
|
||||||
Account as BaseAccount,
|
|
||||||
AccountSettings as BaseAccountSettings,
|
|
||||||
} from "@bitwarden/common/platform/models/domain/account";
|
|
||||||
|
|
||||||
export class AccountSettings extends BaseAccountSettings {
|
|
||||||
dismissedBiometricRequirePasswordOnStartCallout?: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
export class Account extends BaseAccount {
|
|
||||||
settings?: AccountSettings = new AccountSettings();
|
|
||||||
|
|
||||||
constructor(init: Partial<Account>) {
|
|
||||||
super(init);
|
|
||||||
Object.assign(this.settings, {
|
|
||||||
...new AccountSettings(),
|
|
||||||
...this.settings,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,12 +0,0 @@
|
||||||
import { GlobalState } from "@bitwarden/common/platform/models/domain/global-state";
|
|
||||||
import { StateService as BaseStateService } from "@bitwarden/common/platform/services/state.service";
|
|
||||||
|
|
||||||
import { Account } from "../../models/account";
|
|
||||||
|
|
||||||
export class ElectronStateService extends BaseStateService<GlobalState, Account> {
|
|
||||||
async addAccount(account: Account) {
|
|
||||||
// Apply desktop overides to default account values
|
|
||||||
account = new Account(account);
|
|
||||||
await super.addAccount(account);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -4,7 +4,6 @@ import { APP_INITIALIZER, NgModule, Optional, SkipSelf } from "@angular/core";
|
||||||
import { SafeProvider, safeProvider } from "@bitwarden/angular/platform/utils/safe-provider";
|
import { SafeProvider, safeProvider } from "@bitwarden/angular/platform/utils/safe-provider";
|
||||||
import {
|
import {
|
||||||
SECURE_STORAGE,
|
SECURE_STORAGE,
|
||||||
STATE_FACTORY,
|
|
||||||
LOCALES_DIRECTORY,
|
LOCALES_DIRECTORY,
|
||||||
SYSTEM_LANGUAGE,
|
SYSTEM_LANGUAGE,
|
||||||
MEMORY_STORAGE,
|
MEMORY_STORAGE,
|
||||||
|
@ -30,10 +29,9 @@ import { FileDownloadService } from "@bitwarden/common/platform/abstractions/fil
|
||||||
import { I18nService as I18nServiceAbstraction } from "@bitwarden/common/platform/abstractions/i18n.service";
|
import { I18nService as I18nServiceAbstraction } from "@bitwarden/common/platform/abstractions/i18n.service";
|
||||||
import { LogService } from "@bitwarden/common/platform/abstractions/log.service";
|
import { LogService } from "@bitwarden/common/platform/abstractions/log.service";
|
||||||
import { PlatformUtilsService as PlatformUtilsServiceAbstraction } from "@bitwarden/common/platform/abstractions/platform-utils.service";
|
import { PlatformUtilsService as PlatformUtilsServiceAbstraction } from "@bitwarden/common/platform/abstractions/platform-utils.service";
|
||||||
import { StateService as BaseStateServiceAbstraction } from "@bitwarden/common/platform/abstractions/state.service";
|
import { StateService } from "@bitwarden/common/platform/abstractions/state.service";
|
||||||
import { AbstractStorageService } from "@bitwarden/common/platform/abstractions/storage.service";
|
import { AbstractStorageService } from "@bitwarden/common/platform/abstractions/storage.service";
|
||||||
import { ThemeType } from "@bitwarden/common/platform/enums";
|
import { ThemeType } from "@bitwarden/common/platform/enums";
|
||||||
import { StateFactory } from "@bitwarden/common/platform/factories/state-factory";
|
|
||||||
import { MemoryStorageService } from "@bitwarden/common/platform/services/memory-storage.service";
|
import { MemoryStorageService } from "@bitwarden/common/platform/services/memory-storage.service";
|
||||||
// eslint-disable-next-line import/no-restricted-paths -- Implementation for memory storage
|
// eslint-disable-next-line import/no-restricted-paths -- Implementation for memory storage
|
||||||
import { MigrationBuilderService } from "@bitwarden/common/platform/services/migration-builder.service";
|
import { MigrationBuilderService } from "@bitwarden/common/platform/services/migration-builder.service";
|
||||||
|
@ -64,7 +62,7 @@ import { EventService } from "./event.service";
|
||||||
import { InitService } from "./init.service";
|
import { InitService } from "./init.service";
|
||||||
import { ModalService } from "./modal.service";
|
import { ModalService } from "./modal.service";
|
||||||
import { RouterService } from "./router.service";
|
import { RouterService } from "./router.service";
|
||||||
import { Account, GlobalState, StateService } from "./state";
|
import { StateService as WebStateService } from "./state";
|
||||||
import { WebFileDownloadService } from "./web-file-download.service";
|
import { WebFileDownloadService } from "./web-file-download.service";
|
||||||
import { WebPlatformUtilsService } from "./web-platform-utils.service";
|
import { WebPlatformUtilsService } from "./web-platform-utils.service";
|
||||||
|
|
||||||
|
@ -90,10 +88,6 @@ const safeProviders: SafeProvider[] = [
|
||||||
deps: [InitService],
|
deps: [InitService],
|
||||||
multi: true,
|
multi: true,
|
||||||
}),
|
}),
|
||||||
safeProvider({
|
|
||||||
provide: STATE_FACTORY,
|
|
||||||
useValue: new StateFactory(GlobalState, Account),
|
|
||||||
}),
|
|
||||||
safeProvider({
|
safeProvider({
|
||||||
provide: I18nServiceAbstraction,
|
provide: I18nServiceAbstraction,
|
||||||
useClass: I18nService,
|
useClass: I18nService,
|
||||||
|
@ -132,10 +126,10 @@ const safeProviders: SafeProvider[] = [
|
||||||
useClass: ModalService,
|
useClass: ModalService,
|
||||||
useAngularDecorators: true,
|
useAngularDecorators: true,
|
||||||
}),
|
}),
|
||||||
safeProvider(StateService),
|
safeProvider(WebStateService),
|
||||||
safeProvider({
|
safeProvider({
|
||||||
provide: BaseStateServiceAbstraction,
|
provide: StateService,
|
||||||
useExisting: StateService,
|
useExisting: WebStateService,
|
||||||
}),
|
}),
|
||||||
safeProvider({
|
safeProvider({
|
||||||
provide: FileDownloadService,
|
provide: FileDownloadService,
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
import { Account as BaseAccount } from "@bitwarden/common/platform/models/domain/account";
|
|
||||||
|
|
||||||
// TODO: platform to clean up accounts in later PR
|
|
||||||
export class Account extends BaseAccount {
|
|
||||||
constructor(init: Partial<Account>) {
|
|
||||||
super(init);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,5 +0,0 @@
|
||||||
import { GlobalState as BaseGlobalState } from "@bitwarden/common/platform/models/domain/global-state";
|
|
||||||
|
|
||||||
export class GlobalState extends BaseGlobalState {
|
|
||||||
rememberEmail = true;
|
|
||||||
}
|
|
|
@ -1,3 +1 @@
|
||||||
export * from "./account";
|
|
||||||
export * from "./global-state";
|
|
||||||
export * from "./state.service";
|
export * from "./state.service";
|
||||||
|
|
|
@ -11,13 +11,12 @@ import { EnvironmentService } from "@bitwarden/common/platform/abstractions/envi
|
||||||
import { LogService } from "@bitwarden/common/platform/abstractions/log.service";
|
import { LogService } from "@bitwarden/common/platform/abstractions/log.service";
|
||||||
import { AbstractStorageService } from "@bitwarden/common/platform/abstractions/storage.service";
|
import { AbstractStorageService } from "@bitwarden/common/platform/abstractions/storage.service";
|
||||||
import { StateFactory } from "@bitwarden/common/platform/factories/state-factory";
|
import { StateFactory } from "@bitwarden/common/platform/factories/state-factory";
|
||||||
|
import { Account } from "@bitwarden/common/platform/models/domain/account";
|
||||||
|
import { GlobalState } from "@bitwarden/common/platform/models/domain/global-state";
|
||||||
import { StorageOptions } from "@bitwarden/common/platform/models/domain/storage-options";
|
import { StorageOptions } from "@bitwarden/common/platform/models/domain/storage-options";
|
||||||
import { MigrationRunner } from "@bitwarden/common/platform/services/migration-runner";
|
import { MigrationRunner } from "@bitwarden/common/platform/services/migration-runner";
|
||||||
import { StateService as BaseStateService } from "@bitwarden/common/platform/services/state.service";
|
import { StateService as BaseStateService } from "@bitwarden/common/platform/services/state.service";
|
||||||
|
|
||||||
import { Account } from "./account";
|
|
||||||
import { GlobalState } from "./global-state";
|
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class StateService extends BaseStateService<GlobalState, Account> {
|
export class StateService extends BaseStateService<GlobalState, Account> {
|
||||||
constructor(
|
constructor(
|
||||||
|
@ -44,12 +43,6 @@ export class StateService extends BaseStateService<GlobalState, Account> {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
async addAccount(account: Account) {
|
|
||||||
// Apply web overrides to default account values
|
|
||||||
account = new Account(account);
|
|
||||||
await super.addAccount(account);
|
|
||||||
}
|
|
||||||
|
|
||||||
override async getLastSync(options?: StorageOptions): Promise<string> {
|
override async getLastSync(options?: StorageOptions): Promise<string> {
|
||||||
options = this.reconcileOptions(options, await this.defaultInMemoryOptions());
|
options = this.reconcileOptions(options, await this.defaultInMemoryOptions());
|
||||||
return await super.getLastSync(options);
|
return await super.getLastSync(options);
|
||||||
|
|
|
@ -728,6 +728,10 @@ const safeProviders: SafeProvider[] = [
|
||||||
useClass: SsoLoginService,
|
useClass: SsoLoginService,
|
||||||
deps: [StateProvider],
|
deps: [StateProvider],
|
||||||
}),
|
}),
|
||||||
|
safeProvider({
|
||||||
|
provide: STATE_FACTORY,
|
||||||
|
useValue: new StateFactory(GlobalState, Account),
|
||||||
|
}),
|
||||||
safeProvider({
|
safeProvider({
|
||||||
provide: StateServiceAbstraction,
|
provide: StateServiceAbstraction,
|
||||||
useClass: StateService,
|
useClass: StateService,
|
||||||
|
|
|
@ -1,8 +1,4 @@
|
||||||
import { BiometricKey } from "../../auth/types/biometric-key";
|
import { BiometricKey } from "../../auth/types/biometric-key";
|
||||||
import { GeneratorOptions } from "../../tools/generator/generator-options";
|
|
||||||
import { GeneratedPasswordHistory, PasswordGeneratorOptions } from "../../tools/generator/password";
|
|
||||||
import { UsernameGeneratorOptions } from "../../tools/generator/username";
|
|
||||||
import { UserId } from "../../types/guid";
|
|
||||||
import { Account } from "../models/domain/account";
|
import { Account } from "../models/domain/account";
|
||||||
import { StorageOptions } from "../models/domain/storage-options";
|
import { StorageOptions } from "../models/domain/storage-options";
|
||||||
|
|
||||||
|
@ -22,7 +18,6 @@ export type InitOptions = {
|
||||||
|
|
||||||
export abstract class StateService<T extends Account = Account> {
|
export abstract class StateService<T extends Account = Account> {
|
||||||
addAccount: (account: T) => Promise<void>;
|
addAccount: (account: T) => Promise<void>;
|
||||||
clearDecryptedData: (userId: UserId) => Promise<void>;
|
|
||||||
clean: (options?: StorageOptions) => Promise<void>;
|
clean: (options?: StorageOptions) => Promise<void>;
|
||||||
init: (initOptions?: InitOptions) => Promise<void>;
|
init: (initOptions?: InitOptions) => Promise<void>;
|
||||||
|
|
||||||
|
@ -73,36 +68,10 @@ export abstract class StateService<T extends Account = Account> {
|
||||||
* @deprecated For migration purposes only, use setUserKeyBiometric instead
|
* @deprecated For migration purposes only, use setUserKeyBiometric instead
|
||||||
*/
|
*/
|
||||||
setCryptoMasterKeyBiometric: (value: BiometricKey, options?: StorageOptions) => Promise<void>;
|
setCryptoMasterKeyBiometric: (value: BiometricKey, options?: StorageOptions) => Promise<void>;
|
||||||
getDecryptedPasswordGenerationHistory: (
|
|
||||||
options?: StorageOptions,
|
|
||||||
) => Promise<GeneratedPasswordHistory[]>;
|
|
||||||
setDecryptedPasswordGenerationHistory: (
|
|
||||||
value: GeneratedPasswordHistory[],
|
|
||||||
options?: StorageOptions,
|
|
||||||
) => Promise<void>;
|
|
||||||
getDuckDuckGoSharedKey: (options?: StorageOptions) => Promise<string>;
|
getDuckDuckGoSharedKey: (options?: StorageOptions) => Promise<string>;
|
||||||
setDuckDuckGoSharedKey: (value: string, options?: StorageOptions) => Promise<void>;
|
setDuckDuckGoSharedKey: (value: string, options?: StorageOptions) => Promise<void>;
|
||||||
getEncryptedPasswordGenerationHistory: (
|
|
||||||
options?: StorageOptions,
|
|
||||||
) => Promise<GeneratedPasswordHistory[]>;
|
|
||||||
setEncryptedPasswordGenerationHistory: (
|
|
||||||
value: GeneratedPasswordHistory[],
|
|
||||||
options?: StorageOptions,
|
|
||||||
) => Promise<void>;
|
|
||||||
getIsAuthenticated: (options?: StorageOptions) => Promise<boolean>;
|
getIsAuthenticated: (options?: StorageOptions) => Promise<boolean>;
|
||||||
getLastSync: (options?: StorageOptions) => Promise<string>;
|
getLastSync: (options?: StorageOptions) => Promise<string>;
|
||||||
setLastSync: (value: string, options?: StorageOptions) => Promise<void>;
|
setLastSync: (value: string, options?: StorageOptions) => Promise<void>;
|
||||||
getPasswordGenerationOptions: (options?: StorageOptions) => Promise<PasswordGeneratorOptions>;
|
|
||||||
setPasswordGenerationOptions: (
|
|
||||||
value: PasswordGeneratorOptions,
|
|
||||||
options?: StorageOptions,
|
|
||||||
) => Promise<void>;
|
|
||||||
getUsernameGenerationOptions: (options?: StorageOptions) => Promise<UsernameGeneratorOptions>;
|
|
||||||
setUsernameGenerationOptions: (
|
|
||||||
value: UsernameGeneratorOptions,
|
|
||||||
options?: StorageOptions,
|
|
||||||
) => Promise<void>;
|
|
||||||
getGeneratorOptions: (options?: StorageOptions) => Promise<GeneratorOptions>;
|
|
||||||
setGeneratorOptions: (value: GeneratorOptions, options?: StorageOptions) => Promise<void>;
|
|
||||||
getUserId: (options?: StorageOptions) => Promise<string>;
|
getUserId: (options?: StorageOptions) => Promise<string>;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +0,0 @@
|
||||||
import { AccountSettings } from "./account";
|
|
||||||
|
|
||||||
describe("AccountSettings", () => {
|
|
||||||
describe("fromJSON", () => {
|
|
||||||
it("should deserialize to an instance of itself", () => {
|
|
||||||
expect(AccountSettings.fromJSON(JSON.parse("{}"))).toBeInstanceOf(AccountSettings);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { Account, AccountKeys, AccountProfile, AccountSettings } from "./account";
|
import { Account, AccountKeys, AccountProfile } from "./account";
|
||||||
|
|
||||||
describe("Account", () => {
|
describe("Account", () => {
|
||||||
describe("fromJSON", () => {
|
describe("fromJSON", () => {
|
||||||
|
@ -9,13 +9,11 @@ describe("Account", () => {
|
||||||
it("should call all the sub-fromJSONs", () => {
|
it("should call all the sub-fromJSONs", () => {
|
||||||
const keysSpy = jest.spyOn(AccountKeys, "fromJSON");
|
const keysSpy = jest.spyOn(AccountKeys, "fromJSON");
|
||||||
const profileSpy = jest.spyOn(AccountProfile, "fromJSON");
|
const profileSpy = jest.spyOn(AccountProfile, "fromJSON");
|
||||||
const settingsSpy = jest.spyOn(AccountSettings, "fromJSON");
|
|
||||||
|
|
||||||
Account.fromJSON({});
|
Account.fromJSON({});
|
||||||
|
|
||||||
expect(keysSpy).toHaveBeenCalled();
|
expect(keysSpy).toHaveBeenCalled();
|
||||||
expect(profileSpy).toHaveBeenCalled();
|
expect(profileSpy).toHaveBeenCalled();
|
||||||
expect(settingsSpy).toHaveBeenCalled();
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,14 +1,6 @@
|
||||||
import { Jsonify } from "type-fest";
|
import { Jsonify } from "type-fest";
|
||||||
|
|
||||||
import { UriMatchStrategySetting } from "../../../models/domain/domain-service";
|
|
||||||
import { GeneratorOptions } from "../../../tools/generator/generator-options";
|
|
||||||
import {
|
|
||||||
GeneratedPasswordHistory,
|
|
||||||
PasswordGeneratorOptions,
|
|
||||||
} from "../../../tools/generator/password";
|
|
||||||
import { UsernameGeneratorOptions } from "../../../tools/generator/username/username-generation-options";
|
|
||||||
import { DeepJsonify } from "../../../types/deep-jsonify";
|
import { DeepJsonify } from "../../../types/deep-jsonify";
|
||||||
import { KdfType } from "../../enums";
|
|
||||||
import { Utils } from "../../misc/utils";
|
import { Utils } from "../../misc/utils";
|
||||||
|
|
||||||
import { SymmetricCryptoKey } from "./symmetric-crypto-key";
|
import { SymmetricCryptoKey } from "./symmetric-crypto-key";
|
||||||
|
@ -51,26 +43,6 @@ export class EncryptionPair<TEncrypted, TDecrypted> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export class DataEncryptionPair<TEncrypted, TDecrypted> {
|
|
||||||
encrypted?: Record<string, TEncrypted>;
|
|
||||||
decrypted?: TDecrypted[];
|
|
||||||
}
|
|
||||||
|
|
||||||
export class AccountData {
|
|
||||||
passwordGenerationHistory?: EncryptionPair<
|
|
||||||
GeneratedPasswordHistory[],
|
|
||||||
GeneratedPasswordHistory[]
|
|
||||||
> = new EncryptionPair<GeneratedPasswordHistory[], GeneratedPasswordHistory[]>();
|
|
||||||
|
|
||||||
static fromJSON(obj: DeepJsonify<AccountData>): AccountData {
|
|
||||||
if (obj == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return Object.assign(new AccountData(), obj);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export class AccountKeys {
|
export class AccountKeys {
|
||||||
publicKey?: Uint8Array;
|
publicKey?: Uint8Array;
|
||||||
|
|
||||||
|
@ -127,10 +99,6 @@ export class AccountProfile {
|
||||||
emailVerified?: boolean;
|
emailVerified?: boolean;
|
||||||
lastSync?: string;
|
lastSync?: string;
|
||||||
userId?: string;
|
userId?: string;
|
||||||
kdfIterations?: number;
|
|
||||||
kdfMemory?: number;
|
|
||||||
kdfParallelism?: number;
|
|
||||||
kdfType?: KdfType;
|
|
||||||
|
|
||||||
static fromJSON(obj: Jsonify<AccountProfile>): AccountProfile {
|
static fromJSON(obj: Jsonify<AccountProfile>): AccountProfile {
|
||||||
if (obj == null) {
|
if (obj == null) {
|
||||||
|
@ -141,33 +109,12 @@ export class AccountProfile {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export class AccountSettings {
|
|
||||||
defaultUriMatch?: UriMatchStrategySetting;
|
|
||||||
passwordGenerationOptions?: PasswordGeneratorOptions;
|
|
||||||
usernameGenerationOptions?: UsernameGeneratorOptions;
|
|
||||||
generatorOptions?: GeneratorOptions;
|
|
||||||
|
|
||||||
static fromJSON(obj: Jsonify<AccountSettings>): AccountSettings {
|
|
||||||
if (obj == null) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return Object.assign(new AccountSettings(), obj);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export class Account {
|
export class Account {
|
||||||
data?: AccountData = new AccountData();
|
|
||||||
keys?: AccountKeys = new AccountKeys();
|
keys?: AccountKeys = new AccountKeys();
|
||||||
profile?: AccountProfile = new AccountProfile();
|
profile?: AccountProfile = new AccountProfile();
|
||||||
settings?: AccountSettings = new AccountSettings();
|
|
||||||
|
|
||||||
constructor(init: Partial<Account>) {
|
constructor(init: Partial<Account>) {
|
||||||
Object.assign(this, {
|
Object.assign(this, {
|
||||||
data: {
|
|
||||||
...new AccountData(),
|
|
||||||
...init?.data,
|
|
||||||
},
|
|
||||||
keys: {
|
keys: {
|
||||||
...new AccountKeys(),
|
...new AccountKeys(),
|
||||||
...init?.keys,
|
...init?.keys,
|
||||||
|
@ -176,10 +123,6 @@ export class Account {
|
||||||
...new AccountProfile(),
|
...new AccountProfile(),
|
||||||
...init?.profile,
|
...init?.profile,
|
||||||
},
|
},
|
||||||
settings: {
|
|
||||||
...new AccountSettings(),
|
|
||||||
...init?.settings,
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -190,9 +133,7 @@ export class Account {
|
||||||
|
|
||||||
return Object.assign(new Account({}), json, {
|
return Object.assign(new Account({}), json, {
|
||||||
keys: AccountKeys.fromJSON(json?.keys),
|
keys: AccountKeys.fromJSON(json?.keys),
|
||||||
data: AccountData.fromJSON(json?.data),
|
|
||||||
profile: AccountProfile.fromJSON(json?.profile),
|
profile: AccountProfile.fromJSON(json?.profile),
|
||||||
settings: AccountSettings.fromJSON(json?.settings),
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,9 +4,6 @@ import { Jsonify, JsonValue } from "type-fest";
|
||||||
import { AccountService } from "../../auth/abstractions/account.service";
|
import { AccountService } from "../../auth/abstractions/account.service";
|
||||||
import { TokenService } from "../../auth/abstractions/token.service";
|
import { TokenService } from "../../auth/abstractions/token.service";
|
||||||
import { BiometricKey } from "../../auth/types/biometric-key";
|
import { BiometricKey } from "../../auth/types/biometric-key";
|
||||||
import { GeneratorOptions } from "../../tools/generator/generator-options";
|
|
||||||
import { GeneratedPasswordHistory, PasswordGeneratorOptions } from "../../tools/generator/password";
|
|
||||||
import { UsernameGeneratorOptions } from "../../tools/generator/username";
|
|
||||||
import { UserId } from "../../types/guid";
|
import { UserId } from "../../types/guid";
|
||||||
import { EnvironmentService } from "../abstractions/environment.service";
|
import { EnvironmentService } from "../abstractions/environment.service";
|
||||||
import { LogService } from "../abstractions/log.service";
|
import { LogService } from "../abstractions/log.service";
|
||||||
|
@ -17,8 +14,7 @@ import {
|
||||||
import { AbstractStorageService } from "../abstractions/storage.service";
|
import { AbstractStorageService } from "../abstractions/storage.service";
|
||||||
import { HtmlStorageLocation, StorageLocation } from "../enums";
|
import { HtmlStorageLocation, StorageLocation } from "../enums";
|
||||||
import { StateFactory } from "../factories/state-factory";
|
import { StateFactory } from "../factories/state-factory";
|
||||||
import { Utils } from "../misc/utils";
|
import { Account } from "../models/domain/account";
|
||||||
import { Account, AccountData, AccountSettings } from "../models/domain/account";
|
|
||||||
import { GlobalState } from "../models/domain/global-state";
|
import { GlobalState } from "../models/domain/global-state";
|
||||||
import { State } from "../models/domain/state";
|
import { State } from "../models/domain/state";
|
||||||
import { StorageOptions } from "../models/domain/storage-options";
|
import { StorageOptions } from "../models/domain/storage-options";
|
||||||
|
@ -306,29 +302,6 @@ export class StateService<
|
||||||
await this.saveSecureStorageKey(partialKeys.biometricKey, value, options);
|
await this.saveSecureStorageKey(partialKeys.biometricKey, value, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
@withPrototypeForArrayMembers(GeneratedPasswordHistory)
|
|
||||||
async getDecryptedPasswordGenerationHistory(
|
|
||||||
options?: StorageOptions,
|
|
||||||
): Promise<GeneratedPasswordHistory[]> {
|
|
||||||
return (
|
|
||||||
await this.getAccount(this.reconcileOptions(options, await this.defaultInMemoryOptions()))
|
|
||||||
)?.data?.passwordGenerationHistory?.decrypted;
|
|
||||||
}
|
|
||||||
|
|
||||||
async setDecryptedPasswordGenerationHistory(
|
|
||||||
value: GeneratedPasswordHistory[],
|
|
||||||
options?: StorageOptions,
|
|
||||||
): Promise<void> {
|
|
||||||
const account = await this.getAccount(
|
|
||||||
this.reconcileOptions(options, await this.defaultInMemoryOptions()),
|
|
||||||
);
|
|
||||||
account.data.passwordGenerationHistory.decrypted = value;
|
|
||||||
await this.saveAccount(
|
|
||||||
account,
|
|
||||||
this.reconcileOptions(options, await this.defaultInMemoryOptions()),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
async getDuckDuckGoSharedKey(options?: StorageOptions): Promise<string> {
|
async getDuckDuckGoSharedKey(options?: StorageOptions): Promise<string> {
|
||||||
options = this.reconcileOptions(options, await this.defaultSecureStorageOptions());
|
options = this.reconcileOptions(options, await this.defaultSecureStorageOptions());
|
||||||
if (options?.userId == null) {
|
if (options?.userId == null) {
|
||||||
|
@ -370,29 +343,6 @@ export class StateService<
|
||||||
)?.keys.cryptoSymmetricKey.encrypted;
|
)?.keys.cryptoSymmetricKey.encrypted;
|
||||||
}
|
}
|
||||||
|
|
||||||
@withPrototypeForArrayMembers(GeneratedPasswordHistory)
|
|
||||||
async getEncryptedPasswordGenerationHistory(
|
|
||||||
options?: StorageOptions,
|
|
||||||
): Promise<GeneratedPasswordHistory[]> {
|
|
||||||
return (
|
|
||||||
await this.getAccount(this.reconcileOptions(options, await this.defaultOnDiskOptions()))
|
|
||||||
)?.data?.passwordGenerationHistory?.encrypted;
|
|
||||||
}
|
|
||||||
|
|
||||||
async setEncryptedPasswordGenerationHistory(
|
|
||||||
value: GeneratedPasswordHistory[],
|
|
||||||
options?: StorageOptions,
|
|
||||||
): Promise<void> {
|
|
||||||
const account = await this.getAccount(
|
|
||||||
this.reconcileOptions(options, await this.defaultOnDiskOptions()),
|
|
||||||
);
|
|
||||||
account.data.passwordGenerationHistory.encrypted = value;
|
|
||||||
await this.saveAccount(
|
|
||||||
account,
|
|
||||||
this.reconcileOptions(options, await this.defaultOnDiskOptions()),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
async getIsAuthenticated(options?: StorageOptions): Promise<boolean> {
|
async getIsAuthenticated(options?: StorageOptions): Promise<boolean> {
|
||||||
return (
|
return (
|
||||||
(await this.tokenService.getAccessToken(options?.userId as UserId)) != null &&
|
(await this.tokenService.getAccessToken(options?.userId as UserId)) != null &&
|
||||||
|
@ -417,63 +367,6 @@ export class StateService<
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
async getPasswordGenerationOptions(options?: StorageOptions): Promise<PasswordGeneratorOptions> {
|
|
||||||
return (
|
|
||||||
await this.getAccount(this.reconcileOptions(options, await this.defaultOnDiskLocalOptions()))
|
|
||||||
)?.settings?.passwordGenerationOptions;
|
|
||||||
}
|
|
||||||
|
|
||||||
async setPasswordGenerationOptions(
|
|
||||||
value: PasswordGeneratorOptions,
|
|
||||||
options?: StorageOptions,
|
|
||||||
): Promise<void> {
|
|
||||||
const account = await this.getAccount(
|
|
||||||
this.reconcileOptions(options, await this.defaultOnDiskLocalOptions()),
|
|
||||||
);
|
|
||||||
account.settings.passwordGenerationOptions = value;
|
|
||||||
await this.saveAccount(
|
|
||||||
account,
|
|
||||||
this.reconcileOptions(options, await this.defaultOnDiskLocalOptions()),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
async getUsernameGenerationOptions(options?: StorageOptions): Promise<UsernameGeneratorOptions> {
|
|
||||||
return (
|
|
||||||
await this.getAccount(this.reconcileOptions(options, await this.defaultOnDiskLocalOptions()))
|
|
||||||
)?.settings?.usernameGenerationOptions;
|
|
||||||
}
|
|
||||||
|
|
||||||
async setUsernameGenerationOptions(
|
|
||||||
value: UsernameGeneratorOptions,
|
|
||||||
options?: StorageOptions,
|
|
||||||
): Promise<void> {
|
|
||||||
const account = await this.getAccount(
|
|
||||||
this.reconcileOptions(options, await this.defaultOnDiskLocalOptions()),
|
|
||||||
);
|
|
||||||
account.settings.usernameGenerationOptions = value;
|
|
||||||
await this.saveAccount(
|
|
||||||
account,
|
|
||||||
this.reconcileOptions(options, await this.defaultOnDiskLocalOptions()),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
async getGeneratorOptions(options?: StorageOptions): Promise<GeneratorOptions> {
|
|
||||||
return (
|
|
||||||
await this.getAccount(this.reconcileOptions(options, await this.defaultOnDiskLocalOptions()))
|
|
||||||
)?.settings?.generatorOptions;
|
|
||||||
}
|
|
||||||
|
|
||||||
async setGeneratorOptions(value: GeneratorOptions, options?: StorageOptions): Promise<void> {
|
|
||||||
const account = await this.getAccount(
|
|
||||||
this.reconcileOptions(options, await this.defaultOnDiskLocalOptions()),
|
|
||||||
);
|
|
||||||
account.settings.generatorOptions = value;
|
|
||||||
await this.saveAccount(
|
|
||||||
account,
|
|
||||||
this.reconcileOptions(options, await this.defaultOnDiskLocalOptions()),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
async getUserId(options?: StorageOptions): Promise<string> {
|
async getUserId(options?: StorageOptions): Promise<string> {
|
||||||
return (
|
return (
|
||||||
await this.getAccount(this.reconcileOptions(options, await this.defaultOnDiskOptions()))
|
await this.getAccount(this.reconcileOptions(options, await this.defaultOnDiskOptions()))
|
||||||
|
@ -629,19 +522,6 @@ export class StateService<
|
||||||
// TODO: There is a tech debt item for splitting up these methods - only Web uses multiple storage locations in its storageService.
|
// TODO: There is a tech debt item for splitting up these methods - only Web uses multiple storage locations in its storageService.
|
||||||
// For now these methods exist with some redundancy to facilitate this special web requirement.
|
// For now these methods exist with some redundancy to facilitate this special web requirement.
|
||||||
protected async scaffoldNewAccountLocalStorage(account: TAccount): Promise<void> {
|
protected async scaffoldNewAccountLocalStorage(account: TAccount): Promise<void> {
|
||||||
const storedAccount = await this.getAccount(
|
|
||||||
this.reconcileOptions(
|
|
||||||
{ userId: account.profile.userId },
|
|
||||||
await this.defaultOnDiskLocalOptions(),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
if (storedAccount?.settings != null) {
|
|
||||||
account.settings = storedAccount.settings;
|
|
||||||
} else if (await this.storageService.has(keys.tempAccountSettings)) {
|
|
||||||
account.settings = await this.storageService.get<AccountSettings>(keys.tempAccountSettings);
|
|
||||||
await this.storageService.remove(keys.tempAccountSettings);
|
|
||||||
}
|
|
||||||
|
|
||||||
await this.saveAccount(
|
await this.saveAccount(
|
||||||
account,
|
account,
|
||||||
this.reconcileOptions(
|
this.reconcileOptions(
|
||||||
|
@ -652,15 +532,6 @@ export class StateService<
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async scaffoldNewAccountMemoryStorage(account: TAccount): Promise<void> {
|
protected async scaffoldNewAccountMemoryStorage(account: TAccount): Promise<void> {
|
||||||
const storedAccount = await this.getAccount(
|
|
||||||
this.reconcileOptions(
|
|
||||||
{ userId: account.profile.userId },
|
|
||||||
await this.defaultOnDiskMemoryOptions(),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
if (storedAccount?.settings != null) {
|
|
||||||
account.settings = storedAccount.settings;
|
|
||||||
}
|
|
||||||
await this.storageService.save(
|
await this.storageService.save(
|
||||||
account.profile.userId,
|
account.profile.userId,
|
||||||
account,
|
account,
|
||||||
|
@ -676,12 +547,6 @@ export class StateService<
|
||||||
}
|
}
|
||||||
|
|
||||||
protected async scaffoldNewAccountSessionStorage(account: TAccount): Promise<void> {
|
protected async scaffoldNewAccountSessionStorage(account: TAccount): Promise<void> {
|
||||||
const storedAccount = await this.getAccount(
|
|
||||||
this.reconcileOptions({ userId: account.profile.userId }, await this.defaultOnDiskOptions()),
|
|
||||||
);
|
|
||||||
if (storedAccount?.settings != null) {
|
|
||||||
account.settings = storedAccount.settings;
|
|
||||||
}
|
|
||||||
await this.storageService.save(
|
await this.storageService.save(
|
||||||
account.profile.userId,
|
account.profile.userId,
|
||||||
account,
|
account,
|
||||||
|
@ -830,20 +695,8 @@ export class StateService<
|
||||||
|
|
||||||
// settings persist even on reset, and are not affected by this method
|
// settings persist even on reset, and are not affected by this method
|
||||||
protected resetAccount(account: TAccount) {
|
protected resetAccount(account: TAccount) {
|
||||||
const persistentAccountInformation = {
|
// All settings have been moved to StateProviders
|
||||||
settings: account.settings,
|
return this.createAccount();
|
||||||
};
|
|
||||||
return Object.assign(this.createAccount(), persistentAccountInformation);
|
|
||||||
}
|
|
||||||
|
|
||||||
async clearDecryptedData(userId: UserId): Promise<void> {
|
|
||||||
await this.updateState(async (state) => {
|
|
||||||
if (userId != null && state?.accounts[userId]?.data != null) {
|
|
||||||
state.accounts[userId].data = new AccountData();
|
|
||||||
}
|
|
||||||
|
|
||||||
return state;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected createAccount(init: Partial<TAccount> = null): TAccount {
|
protected createAccount(init: Partial<TAccount> = null): TAccount {
|
||||||
|
@ -904,51 +757,3 @@ export class StateService<
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function withPrototypeForArrayMembers<T>(
|
|
||||||
memberConstructor: new (...args: any[]) => T,
|
|
||||||
memberConverter: (input: any) => T = (i) => i,
|
|
||||||
): (
|
|
||||||
target: any,
|
|
||||||
propertyKey: string | symbol,
|
|
||||||
descriptor: PropertyDescriptor,
|
|
||||||
) => { value: (...args: any[]) => Promise<T[]> } {
|
|
||||||
return (target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {
|
|
||||||
const originalMethod = descriptor.value;
|
|
||||||
|
|
||||||
return {
|
|
||||||
value: function (...args: any[]) {
|
|
||||||
const originalResult: Promise<any[]> = originalMethod.apply(this, args);
|
|
||||||
|
|
||||||
if (!Utils.isPromise(originalResult)) {
|
|
||||||
throw new Error(
|
|
||||||
`Error applying prototype to stored value -- result is not a promise for method ${String(
|
|
||||||
propertyKey,
|
|
||||||
)}`,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return originalResult.then((result) => {
|
|
||||||
if (result == null) {
|
|
||||||
return null;
|
|
||||||
} else if (!(result instanceof Array)) {
|
|
||||||
throw new Error(
|
|
||||||
`Attempted to retrieve non array type from state as an array for method ${String(
|
|
||||||
propertyKey,
|
|
||||||
)}`,
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
return result.map((r) => {
|
|
||||||
return r == null ||
|
|
||||||
r.constructor.name === memberConstructor.prototype.constructor.name
|
|
||||||
? r
|
|
||||||
: memberConverter(
|
|
||||||
Object.create(memberConstructor.prototype, Object.getOwnPropertyDescriptors(r)),
|
|
||||||
);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
|
@ -10,7 +10,6 @@ import { VaultTimeoutAction } from "../../enums/vault-timeout-action.enum";
|
||||||
import { UserId } from "../../types/guid";
|
import { UserId } from "../../types/guid";
|
||||||
import { MessagingService } from "../abstractions/messaging.service";
|
import { MessagingService } from "../abstractions/messaging.service";
|
||||||
import { PlatformUtilsService } from "../abstractions/platform-utils.service";
|
import { PlatformUtilsService } from "../abstractions/platform-utils.service";
|
||||||
import { StateService } from "../abstractions/state.service";
|
|
||||||
import { SystemService as SystemServiceAbstraction } from "../abstractions/system.service";
|
import { SystemService as SystemServiceAbstraction } from "../abstractions/system.service";
|
||||||
import { BiometricStateService } from "../biometrics/biometric-state.service";
|
import { BiometricStateService } from "../biometrics/biometric-state.service";
|
||||||
import { Utils } from "../misc/utils";
|
import { Utils } from "../misc/utils";
|
||||||
|
@ -25,7 +24,6 @@ export class SystemService implements SystemServiceAbstraction {
|
||||||
private messagingService: MessagingService,
|
private messagingService: MessagingService,
|
||||||
private platformUtilsService: PlatformUtilsService,
|
private platformUtilsService: PlatformUtilsService,
|
||||||
private reloadCallback: () => Promise<void> = null,
|
private reloadCallback: () => Promise<void> = null,
|
||||||
private stateService: StateService,
|
|
||||||
private autofillSettingsService: AutofillSettingsServiceAbstraction,
|
private autofillSettingsService: AutofillSettingsServiceAbstraction,
|
||||||
private vaultTimeoutSettingsService: VaultTimeoutSettingsService,
|
private vaultTimeoutSettingsService: VaultTimeoutSettingsService,
|
||||||
private biometricStateService: BiometricStateService,
|
private biometricStateService: BiometricStateService,
|
||||||
|
@ -90,8 +88,6 @@ export class SystemService implements SystemServiceAbstraction {
|
||||||
const nextUser = await firstValueFrom(
|
const nextUser = await firstValueFrom(
|
||||||
this.accountService.nextUpAccount$.pipe(map((account) => account?.id ?? null)),
|
this.accountService.nextUpAccount$.pipe(map((account) => account?.id ?? null)),
|
||||||
);
|
);
|
||||||
// Can be removed once we migrate password generation history to state providers
|
|
||||||
await this.stateService.clearDecryptedData(activeUserId);
|
|
||||||
await this.accountService.switchAccount(nextUser);
|
await this.accountService.switchAccount(nextUser);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue