import { GlobalState } from "@bitwarden/common/models/domain/globalState"; import { StorageOptions } from "@bitwarden/common/models/domain/storageOptions"; import { StateService as BaseStateService } from "@bitwarden/common/services/state.service"; import { Account } from "../models/account"; import { BrowserComponentState } from "../models/browserComponentState"; import { BrowserGroupingsComponentState } from "../models/browserGroupingsComponentState"; import { BrowserSendComponentState } from "../models/browserSendComponentState"; import { StateService as StateServiceAbstraction } from "./abstractions/state.service"; export class StateService extends BaseStateService implements StateServiceAbstraction { async addAccount(account: Account) { // Apply browser overrides to default account values account = new Account(account); await super.addAccount(account); } async getIsAuthenticated(options?: StorageOptions): Promise { // Firefox Private Mode can clash with non-Private Mode because they both read from the same onDiskOptions // Check that there is an account in memory before considering the user authenticated return ( (await super.getIsAuthenticated(options)) && (await this.getAccount(this.defaultInMemoryOptions)) != null ); } async getBrowserGroupingComponentState( options?: StorageOptions ): Promise { return (await this.getAccount(this.reconcileOptions(options, this.defaultInMemoryOptions))) ?.groupings; } async setBrowserGroupingComponentState( value: BrowserGroupingsComponentState, options?: StorageOptions ): Promise { const account = await this.getAccount( this.reconcileOptions(options, this.defaultInMemoryOptions) ); account.groupings = value; await this.saveAccount(account, this.reconcileOptions(options, this.defaultInMemoryOptions)); } async getBrowserCipherComponentState(options?: StorageOptions): Promise { return (await this.getAccount(this.reconcileOptions(options, this.defaultInMemoryOptions))) ?.ciphers; } async setBrowserCipherComponentState( value: BrowserComponentState, options?: StorageOptions ): Promise { const account = await this.getAccount( this.reconcileOptions(options, this.defaultInMemoryOptions) ); account.ciphers = value; await this.saveAccount(account, this.reconcileOptions(options, this.defaultInMemoryOptions)); } async getBrowserSendComponentState(options?: StorageOptions): Promise { return (await this.getAccount(this.reconcileOptions(options, this.defaultInMemoryOptions))) ?.send; } async setBrowserSendComponentState( value: BrowserSendComponentState, options?: StorageOptions ): Promise { const account = await this.getAccount( this.reconcileOptions(options, this.defaultInMemoryOptions) ); account.send = value; await this.saveAccount(account, this.reconcileOptions(options, this.defaultInMemoryOptions)); } async getBrowserSendTypeComponentState(options?: StorageOptions): Promise { return (await this.getAccount(this.reconcileOptions(options, this.defaultInMemoryOptions))) ?.sendType; } async setBrowserSendTypeComponentState( value: BrowserComponentState, options?: StorageOptions ): Promise { const account = await this.getAccount( this.reconcileOptions(options, this.defaultInMemoryOptions) ); account.sendType = value; await this.saveAccount(account, this.reconcileOptions(options, this.defaultInMemoryOptions)); } }