1
0
mirror of https://github.com/bitwarden/jslib synced 2025-12-21 18:53:32 +00:00

[refactor] Expand StateService into a full coverage storage proxy

* Expand StateService to allow it to manage all data points of the application state regardless of memory.
* Expand StateService to allow for storing and managing multiple accounts
This commit is contained in:
addison
2021-11-01 12:45:57 -04:00
parent 4f71c1832c
commit 7e59fdc899
5 changed files with 1745 additions and 18 deletions

View File

@@ -1,6 +1,241 @@
import { BehaviorSubject } from 'rxjs';
import { KdfType } from '../enums/kdfType';
import { UriMatchType } from '../enums/uriMatchType';
import { CipherData } from '../models/data/cipherData';
import { CollectionData } from '../models/data/collectionData';
import { EventData } from '../models/data/eventData';
import { FolderData } from '../models/data/folderData';
import { OrganizationData } from '../models/data/organizationData';
import { PolicyData } from '../models/data/policyData';
import { ProviderData } from '../models/data/providerData';
import { SendData } from '../models/data/sendData';
import { Account } from '../models/domain/account';
import { EncString } from '../models/domain/encString';
import { GeneratedPasswordHistory } from '../models/domain/generatedPasswordHistory';
import { Policy } from '../models/domain/policy';
import { StorageOptions } from '../models/domain/storageOptions';
import { SymmetricCryptoKey } from '../models/domain/symmetricCryptoKey';
import { CipherView } from '../models/view/cipherView';
import { CollectionView } from '../models/view/collectionView';
import { FolderView } from '../models/view/folderView';
import { SendView } from '../models/view/sendView';
export abstract class StateService {
get: <T>(key: string) => Promise<T>;
save: (key: string, obj: any) => Promise<any>;
remove: (key: string) => Promise<any>;
purge: () => Promise<any>;
accounts: BehaviorSubject<{ [userId: string]: Account }>;
setActiveUser: (userId: string) => Promise<void>;
addAccount: (account: Account) => Promise<void>;
purge: (options?: StorageOptions) => Promise<void>;
getAccessToken: (options?: StorageOptions) => Promise<string>;
getAddEditCipherInfo: (options?: StorageOptions) => Promise<any>;
getAlwaysShowDock: (options?: StorageOptions) => Promise<boolean>;
getApiKeyClientId: (options?: StorageOptions) => Promise<string>;
getApiKeyClientSecret: (options?: StorageOptions) => Promise<string>;
getAutoFillOnPageLoadDefault: (options?: StorageOptions) => Promise<boolean>;
getBiometricAwaitingAcceptance: (options?: StorageOptions) => Promise<boolean>;
getBiometricFingerprintValidated: (options?: StorageOptions) => Promise<boolean>;
getBiometricLocked: (options?: StorageOptions) => Promise<boolean>;
getBiometricText: (options?: StorageOptions) => Promise<string>;
getBiometricUnlock: (options?: StorageOptions) => Promise<boolean>;
getCanAccessPremium: (options?: StorageOptions) => Promise<boolean>;
getClearClipboard: (options?: StorageOptions) => Promise<number>;
getCollapsedGroupings: (options?: StorageOptions) => Promise<Set<string>>;
getCryptoMasterKey: (options?: StorageOptions) => Promise<SymmetricCryptoKey>;
getCryptoMasterKeyB64: (options: StorageOptions) => Promise<string>;
getDecodedToken: (options?: StorageOptions) => Promise<any>;
getDecryptedCiphers: (options?: StorageOptions) => Promise<CipherView[]>;
getDecryptedCollections: (options?: StorageOptions) => Promise<CollectionView[]>;
getDecryptedCryptoSymmetricKey: (options?: StorageOptions) => Promise<SymmetricCryptoKey>;
getDecryptedFolders: (options?: StorageOptions) => Promise<FolderView[]>;
getDecryptedOrganizationKeys: (options?: StorageOptions) => Promise<Map<string, SymmetricCryptoKey>>;
getDecryptedPasswordGenerationHistory: (options?: StorageOptions) => Promise<GeneratedPasswordHistory[]>;
getDecryptedPinProtected: (options?: StorageOptions) => Promise<EncString>;
getDecryptedPolicies: (options?: StorageOptions) => Promise<Policy[]>;
getDecryptedPrivateKey: (options?: StorageOptions) => Promise<ArrayBuffer>;
getDecryptedProviderKeys: (options?: StorageOptions) => Promise<Map<string, SymmetricCryptoKey>>;
getDecryptedSends: (options?: StorageOptions) => Promise<SendView[]>;
getDefaultUriMatch: (options?: StorageOptions) => Promise<UriMatchType>;
getDisableAddLoginNotification: (options?: StorageOptions) => Promise<boolean>;
getDisableAutoBiometricsPrompt: (options?: StorageOptions) => Promise<boolean>;
getDisableAutoTotpCopy: (options?: StorageOptions) => Promise<boolean>;
getDisableBadgeCounter: (options?: StorageOptions) => Promise<boolean>;
getDisableChangedPasswordNotification: (options?: StorageOptions) => Promise<boolean>;
getDisableContextMenuItem: (options?: StorageOptions) => Promise<boolean>;
getDisableFavicon: (options?: StorageOptions) => Promise<boolean>;
getDisableGa: (options?: StorageOptions) => Promise<boolean>;
getDontShowCardsCurrentTab: (options?: StorageOptions) => Promise<boolean>;
getDontShowIdentitiesCurrentTab: (options?: StorageOptions) => Promise<boolean>;
getEmail: (options?: StorageOptions) => Promise<string>;
getEmailVerified: (options?: StorageOptions) => Promise<boolean>;
getEnableAlwaysOnTop: (options?: StorageOptions) => Promise<boolean>;
getEnableAutoFillOnPageLoad: (options?: StorageOptions) => Promise<boolean>;
getEnableBiometric: (options?: StorageOptions) => Promise<boolean>;
getEnableBrowserIntegration: (options?: StorageOptions) => Promise<boolean>;
getEnableBrowserIntegrationFingerprint: (options?: StorageOptions) => Promise<boolean>;
getEnableCloseToTray: (options?: StorageOptions) => Promise<boolean>;
getEnableGravitars: (options?: StorageOptions) => Promise<boolean>;
getEnableMinimizeToTray: (options?: StorageOptions) => Promise<boolean>;
getEnableStartToTray: (options?: StorageOptions) => Promise<boolean>;
getEnableTray: (options?: StorageOptions) => Promise<boolean>;
getEncryptedCiphers: (options?: StorageOptions) => Promise<{ [id: string]: CipherData }>;
getEncryptedCollections: (options?: StorageOptions) => Promise<{ [id: string]: CollectionData }>;
getEncryptedCryptoSymmetricKey: (options?: StorageOptions) => Promise<string>;
getEncryptedFolders: (options?: StorageOptions) => Promise<{ [id: string]: FolderData }>;
getEncryptedOrganizationKeys: (options?: StorageOptions) => Promise<any>;
getEncryptedPasswordGenerationHistory: (options?: StorageOptions) => Promise<GeneratedPasswordHistory[]>;
getEncryptedPinProtected: (options?: StorageOptions) => Promise<string>;
getEncryptedPolicies: (options?: StorageOptions) => Promise<{ [id: string]: PolicyData }>;
getEncryptedPrivateKey: (options?: StorageOptions) => Promise<string>;
getEncryptedProviderKeys: (options?: StorageOptions) => Promise<any>;
getEncryptedSends: (options?: StorageOptions) => Promise<{ [id: string]: SendData }>;
getEntityId: (options?: StorageOptions) => Promise<string>;
getEntityType: (options?: StorageOptions) => Promise<any>;
getEnvironmentUrls: (options?: StorageOptions) => Promise<any>;
getEquivalentDomains: (options?: StorageOptions) => Promise<any>;
getEventCollection: (options?: StorageOptions) => Promise<EventData[]>;
getEverBeenUnlocked: (options?: StorageOptions) => Promise<boolean>;
getForcePasswordReset: (options?: StorageOptions) => Promise<boolean>;
getInstalledVersion: (options?: StorageOptions) => Promise<string>;
getIsAuthenticated: (options?: StorageOptions) => Promise<boolean>;
getKdfIterations: (options?: StorageOptions) => Promise<number>;
getKdfType: (options?: StorageOptions) => Promise<KdfType>;
getKeyHash: (options?: StorageOptions) => Promise<string>;
getLastActive: (options?: StorageOptions) => Promise<number>;
getLastSync: (options?: StorageOptions) => Promise<string>;
getLegacyEtmKey: (options?: StorageOptions) => Promise<SymmetricCryptoKey>;
getLocalData: (options?: StorageOptions) => Promise<any>;
getLocale: (options?: StorageOptions) => Promise<string>;
getMainWindowSize: (options?: StorageOptions) => Promise<number>;
getMinimizeOnCopyToClipboard: (options?: StorageOptions) => Promise<boolean>;
getNeverDomains: (options?: StorageOptions) => Promise<{ [id: string]: any }>;
getNoAutoPromptBiometrics: (options?: StorageOptions) => Promise<boolean>;
getNoAutoPromptBiometricsText: (options?: StorageOptions) => Promise<string>;
getOpenAtLogin: (options?: StorageOptions) => Promise<boolean>;
getOrganizationInvitation: (options?: StorageOptions) => Promise<any>;
getOrganizations: (options?: StorageOptions) => Promise<{ [id: string]: OrganizationData }>;
getPasswordGenerationOptions: (options?: StorageOptions) => Promise<any>;
getProtectedPin: (options?: StorageOptions) => Promise<string>;
getProviders: (options?: StorageOptions) => Promise<{ [id: string]: ProviderData }>;
getPublicKey: (options?: StorageOptions) => Promise<ArrayBuffer>;
getRefreshToken: (options?: StorageOptions) => Promise<string>;
getRememberEmail: (options?: StorageOptions) => Promise<boolean>;
getRememberedEmail: (options?: StorageOptions) => Promise<string>;
getSecurityStamp: (options?: StorageOptions) => Promise<string>;
getSettings: (options?: StorageOptions) => Promise<any>;
getSsoCodeVerifier: (options?: StorageOptions) => Promise<string>;
getSsoOrgIdentifier: (options?: StorageOptions) => Promise<string>;
getSsoState: (options?: StorageOptions) => Promise<string>;
getTheme: (options?: StorageOptions) => Promise<string>;
getTwoFactorToken: (options?: StorageOptions) => Promise<string>;
getUserId: (options?: StorageOptions) => Promise<string>;
getVaultTimeout: (options?: StorageOptions) => Promise<number>;
getVaultTimeoutAction: (options?: StorageOptions) => Promise<string>;
getWindow: () => Promise<Map<string, any>>;
setAccessToken: (value: string, options?: StorageOptions) => Promise<void>;
setAddEditCipherInfo: (value: any, options?: StorageOptions) => Promise<void>;
setAlwaysShowDock: (value: boolean, options?: StorageOptions) => Promise<void>;
setApiKeyClientId: (value: string, options?: StorageOptions) => Promise<void>;
setApiKeyClientSecret: (value: string, options?: StorageOptions) => Promise<void>;
setAutoFillOnPageLoadDefault: (value: boolean, options?: StorageOptions) => Promise<void>;
setBiometricAwaitingAcceptance: (value: boolean, options?: StorageOptions) => Promise<void>;
setBiometricFingerprintValidated: (value: boolean, options?: StorageOptions) => Promise<void>;
setBiometricLocked: (value: boolean, options?: StorageOptions) => Promise<void>;
setBiometricText: (value: string, options?: StorageOptions) => Promise<void>;
setBiometricUnlock: (value: boolean, options?: StorageOptions) => Promise<void>;
setClearClipboard: (value: number, options?: StorageOptions) => Promise<void>;
setCollapsedGroupings: (value: Set<string>, options?: StorageOptions) => Promise<void>;
setCryptoMasterKey: (value: SymmetricCryptoKey, options?: StorageOptions) => Promise<void>;
setCryptoMasterKeyB64: (value: string, options: StorageOptions) => Promise<void>;
setDecodedToken: (value: any, options?: StorageOptions) => Promise<void>;
setDecryptedCiphers: (value: CipherView[], options?: StorageOptions) => Promise<void>;
setDecryptedCollections: (value: CollectionView[], options?: StorageOptions) => Promise<void>;
setDecryptedCryptoSymmetricKey: (value: SymmetricCryptoKey, options?: StorageOptions) => Promise<void>;
setDecryptedFolders: (value: FolderView[], options?: StorageOptions) => Promise<void>;
setDecryptedOrganizationKeys: (value: Map<string, SymmetricCryptoKey>, options?: StorageOptions) => Promise<void>;
setDecryptedPasswordGenerationHistory: (value: GeneratedPasswordHistory[], options?: StorageOptions) => Promise<void>;
setDecryptedPinProtected: (value: EncString, options?: StorageOptions) => Promise<void>;
setDecryptedPolicies: (value: Policy[], options?: StorageOptions) => Promise<void>;
setDecryptedPrivateKey: (value: ArrayBuffer, options?: StorageOptions) => Promise<void>;
setDecryptedProviderKeys: (value: Map<string, SymmetricCryptoKey>, options?: StorageOptions) => Promise<void>;
setDecryptedSends: (value: SendView[], options?: StorageOptions) => Promise<void>;
setDefaultUriMatch: (value: UriMatchType, options?: StorageOptions) => Promise<void>;
setDisableAddLoginNotification: (value: boolean, options?: StorageOptions) => Promise<void>;
setDisableAutoBiometricsPrompt: (value: boolean, options?: StorageOptions) => Promise<void>;
setDisableAutoTotpCopy: (value: boolean, options?: StorageOptions) => Promise<void>;
setDisableBadgeCounter: (value: boolean, options?: StorageOptions) => Promise<void>;
setDisableChangedPasswordNotification: (value: boolean, options?: StorageOptions) => Promise<void>;
setDisableContextMenuItem: (value: boolean, options?: StorageOptions) => Promise<void>;
setDisableFavicon: (value: boolean, options?: StorageOptions) => Promise<void>;
setDisableGa: (value: boolean, options?: StorageOptions) => Promise<void>;
setDontShowCardsCurrentTab: (value: boolean, options?: StorageOptions) => Promise<void>;
setDontShowIdentitiesCurrentTab: (value: boolean, options?: StorageOptions) => Promise<void>;
setEmail: (value: string, options?: StorageOptions) => Promise<void>;
setEmailVerified: (value: boolean, options?: StorageOptions) => Promise<void>;
setEnableAlwaysOnTop: (value: boolean, options?: StorageOptions) => Promise<void>;
setEnableAutoFillOnPageLoad: (value: boolean, options?: StorageOptions) => Promise<void>;
setEnableBiometric: (value: boolean, options?: StorageOptions) => Promise<void>;
setEnableBrowserIntegration: (value: boolean, options?: StorageOptions) => Promise<void>;
setEnableBrowserIntegrationFingerprint: (value: boolean, options?: StorageOptions) => Promise<void>;
setEnableCloseToTray: (value: boolean, options?: StorageOptions) => Promise<void>;
setEnableGravitars: (value: boolean, options?: StorageOptions) => Promise<void>;
setEnableMinimizeToTray: (value: boolean, options?: StorageOptions) => Promise<void>;
setEnableStartToTray: (value: boolean, options?: StorageOptions) => Promise<void>;
setEnableTray: (value: boolean, options?: StorageOptions) => Promise<void>;
setEncryptedCiphers: (value: { [id: string]: CipherData }, options?: StorageOptions) => Promise<void>;
setEncryptedCollections: (value: { [id: string]: CollectionData }, options?: StorageOptions) => Promise<void>;
setEncryptedCryptoSymmetricKey: (value: string, options?: StorageOptions) => Promise<void>;
setEncryptedFolders: (value: { [id: string]: FolderData }, options?: StorageOptions) => Promise<void>;
setEncryptedOrganizationKeys: (value: Map<string, SymmetricCryptoKey>, options?: StorageOptions) => Promise<void>;
setEncryptedPasswordGenerationHistory: (value: GeneratedPasswordHistory[], options?: StorageOptions) => Promise<void>;
setEncryptedPinProtected: (value: string, options?: StorageOptions) => Promise<void>;
setEncryptedPolicies: (value: { [id: string]: PolicyData }, options?: StorageOptions) => Promise<void>;
setEncryptedPrivateKey: (value: string, options?: StorageOptions) => Promise<void>;
setEncryptedProviderKeys: (value: any, options?: StorageOptions) => Promise<void>;
setEncryptedSends: (value: { [id: string]: SendData }, options?: StorageOptions) => Promise<void>;
setEntityId: (value: string, options?: StorageOptions) => Promise<void>;
setEntityType: (value: string, options?: StorageOptions) => Promise<void>;
setEnvironmentUrls: (value: any, options?: StorageOptions) => Promise<void>;
setEquivalentDomains: (value: string, options?: StorageOptions) => Promise<void>;
setEventCollection: (value: EventData[], options?: StorageOptions) => Promise<void>;
setEverBeenUnlocked: (value: boolean, options?: StorageOptions) => Promise<void>;
setForcePasswordReset: (value: boolean, options?: StorageOptions) => Promise<void>;
setInstalledVersion: (value: string, options?: StorageOptions) => Promise<void>;
setKdfIterations: (value: number, options?: StorageOptions) => Promise<void>;
setKdfType: (value: KdfType, options?: StorageOptions) => Promise<void>;
setKeyHash: (value: string, options?: StorageOptions) => Promise<void>;
setLastActive: (value: number, options?: StorageOptions) => Promise<void>;
setLastSync: (value: string, options?: StorageOptions) => Promise<void>;
setLegacyEtmKey: (value: SymmetricCryptoKey, options?: StorageOptions) => Promise<void>;
setLocalData: (value: string, options?: StorageOptions) => Promise<void>;
setLocale: (value: string, options?: StorageOptions) => Promise<void>;
setMainWindowSize: (value: number, options?: StorageOptions) => Promise<void>;
setMinimizeOnCopyToClipboard: (value: boolean, options?: StorageOptions) => Promise<void>;
setNeverDomains: (value: { [id: string]: any }, options?: StorageOptions) => Promise<void>;
setNoAutoPromptBiometrics: (value: boolean, options?: StorageOptions) => Promise<void>;
setNoAutoPromptBiometricsText: (value: string, options?: StorageOptions) => Promise<void>;
setOpenAtLogin: (value: boolean, options?: StorageOptions) => Promise<void>;
setOrganizationInvitation: (value: any, options?: StorageOptions) => Promise<void>;
setOrganizations: (value: { [id: string]: OrganizationData }, options?: StorageOptions) => Promise<void>;
setPasswordGenerationOptions: (value: any, options?: StorageOptions) => Promise<void>;
setProtectedPin: (value: string, options?: StorageOptions) => Promise<void>;
setProviders: (value: { [id: string]: ProviderData }, options?: StorageOptions) => Promise<void>;
setPublicKey: (value: ArrayBuffer, options?: StorageOptions) => Promise<void>;
setRefreshToken: (value: string, options?: StorageOptions) => Promise<void>;
setRememberedEmail: (value: string, options?: StorageOptions) => Promise<void>;
setSecurityStamp: (value: string, options?: StorageOptions) => Promise<void>;
setSettings: (value: string, options?: StorageOptions) => Promise<void>;
setSsoCodeVerifier: (value: string, options?: StorageOptions) => Promise<void>;
setSsoOrganizationIdentifier: (value: string, options?: StorageOptions) => Promise<void>;
setSsoState: (value: string, options?: StorageOptions) => Promise<void>;
setTheme: (value: string, options?: StorageOptions) => Promise<void>;
setTwoFactorToken: (value: string, options?: StorageOptions) => Promise<void>;
setVaultTimeout: (value: number, options?: StorageOptions) => Promise<void>;
setVaultTimeoutAction: (value: string, options?: StorageOptions) => Promise<void>;
setWindow: (value: Map<string, any>) => Promise<void>;
}

View File

@@ -0,0 +1,192 @@
import { OrganizationData } from '../data/organizationData';
import { KdfType } from '../../enums/kdfType';
import { UriMatchType } from '../../enums/uriMatchType';
import { CipherView } from '../view/cipherView';
import { CollectionView } from '../view/collectionView';
import { FolderView } from '../view/folderView';
import { SendView } from '../view/sendView';
import { EncString } from './encString';
import { GeneratedPasswordHistory } from './generatedPasswordHistory';
import { Policy } from './policy';
import { SymmetricCryptoKey } from './symmetricCryptoKey';
import { CipherData } from '../data/cipherData';
import { CollectionData } from '../data/collectionData';
import { EventData } from '../data/eventData';
import { FolderData } from '../data/folderData';
import { PolicyData } from '../data/policyData';
import { ProviderData } from '../data/providerData';
import { SendData } from '../data/sendData';
export enum AuthenticationStatus {
Locked = 'locked',
Unlocked = 'unlocked',
LoggedOut = 'loggedOut',
Active = 'active',
}
export class Account {
userId: string;
email: string;
accessToken: string;
decodedToken: any;
apiKeyClientId: string;
apiKeyClientSecret: string;
alwaysShowDock: boolean;
autoFillOnPageLoadDefault: boolean;
biometricAwaitingAcceptance: boolean;
biometricFingerprintValidated: boolean;
biometricText: string;
biometricUnlock: boolean;
encryptedCiphers: { [id: string]: CipherData };
decryptedCiphers: CipherView[];
cryptoMasterKey: SymmetricCryptoKey;
cryptoMasterKeyB64: string;
encryptedCryptoSymmetricKey: string;
decryptedCryptoSymmetricKey: SymmetricCryptoKey;
defaultUriMatch: UriMatchType;
disableAddLoginNotification: boolean;
disableAutoBiometricsPrompt: boolean;
disableAutoTotpCopy: boolean;
disableBadgeCounter: boolean;
disableChangedPasswordNotification: boolean;
disableContextMenuItem: boolean;
disableFavicon: boolean;
disableGa: boolean;
dontShowCardsCurrentTab: boolean;
dontShowIdentitiesCurrentTab: boolean;
emailVerified: boolean;
enableAlwaysOnTop: boolean;
enableAutoFillOnPageLoad: boolean;
enableBiometric: boolean;
enableBrowserIntegration: boolean;
enableBrowserIntegrationFingerprint: boolean;
enableCloseToTray: boolean;
enableMinimizeToTray: boolean;
enableStartToTray: boolean;
enableTray: boolean;
decryptedOrganizationKeys: Map<string, SymmetricCryptoKey>;
encryptedOrganizationKeys: any;
decryptedProviderKeys: Map<string, SymmetricCryptoKey>;
encryptedProviderKeys: any;
entityId: string;
entityType: string;
environmentUrls: any;
equivalentDomains: any;
eventCollection: EventData[];
encryptedFolders: { [id: string]: FolderData };
decryptedFolders: FolderView[];
forcePasswordReset: boolean;
installedVersion: string;
kdfIterations: number;
kdfType: KdfType;
keyHash: string;
lastActive: number;
lastSync: string;
legacyEtmKey: SymmetricCryptoKey;
localData: any;
mainWindowSize: number;
minimizeOnCopyToClipboard: boolean;
neverDomains: string[];
noAutoPromptBiometrics: boolean;
noAutoPromptBiometricsText: string;
openAtLogin: boolean;
encryptedPasswordGenerationHistory: GeneratedPasswordHistory[];
decryptedPasswordGenerationHistory: GeneratedPasswordHistory[];
passwordGenerationOptions: any;
encryptedPinProtected: string;
decryptedPinProtected: EncString;
protectedPin: string;
encryptedPolicies: { [id: string]: PolicyData };
decryptedPolicies: Policy[];
providers: { [id: string]: ProviderData };
publicKey: ArrayBuffer;
refreshToken: string;
rememberEmail: boolean;
rememberedEmail: string;
securityStamp: string;
encryptedSends: { [id: string]: SendData };
decryptedSends: SendView[];
settings: any;
ssoCodeVerifier: string;
ssoState: string;
ssoOrganizationIdentifier: string;
theme: string;
twoFactorToken: string;
vaultTimeout: number;
vaultTimeoutAction: string;
clearClipboard: number;
collapsedGroupings: Set<string>;
encryptedCollections: { [id: string]: CollectionData };
decryptedCollections: CollectionView[];
encryptedPrivateKey: string;
decryptedPrivateKey: ArrayBuffer;
locale: string;
organizations: { [id: string]: OrganizationData };
everBeenUnlocked: boolean;
biometricLocked: boolean;
enableGravitars: boolean;
addEditCipherInfo: any;
authenticationStatus: AuthenticationStatus;
private hasPremiumPersonally: boolean;
constructor(userId: string, userEmail: string,
kdfType: KdfType, kdfIterations: number,
clientId: string, clientSecret: string,
accessToken: string, refreshToken: string,
hasPremium: boolean) {
this.userId = userId;
this.email = userEmail;
this.kdfType = kdfType;
this.kdfIterations = kdfIterations;
this.apiKeyClientId = clientId;
this.apiKeyClientSecret = clientSecret;
this.accessToken = accessToken;
this.refreshToken = refreshToken;
this.hasPremiumPersonally = hasPremium;
}
get isAuthenticated(): boolean {
if (!this.accessToken) {
return false;
}
return this.userId != null;
}
get canAccessPremium(): boolean {
if (!this.isAuthenticated) {
return false;
}
return this.hasPremiumPersonally || this.hasPremiumThroughOrganization;
}
private get hasPremiumThroughOrganization(): boolean {
if (this.organizations == null) {
return false;
}
for (const id of Object.keys(this.organizations)) {
const o = this.organizations[id];
if (o.enabled && o.usersGetPremium && !o.isProviderUser) {
return true;
}
}
return false;
}
private get hasMasterKey(): boolean {
return this.cryptoMasterKey != null;
}
private get isActive(): boolean {
const diffSeconds = ((new Date()).getTime() - this.lastActive) / 1000;
return diffSeconds < (this.vaultTimeout * 60);
}
}

View File

@@ -0,0 +1,16 @@
export class Globals {
biometricText: string;
decodedToken: any;
enableAlwaysOnTop: boolean;
enableBiometrics: boolean;
installedVersion: string;
lastActive: number;
locale: string;
noAutoPromptBiometricsText: string;
openAtLogin: boolean;
organizationInvitation: any;
rememberEmail: boolean;
rememberedEmail: string;
theme: string;
window: Map<string, any> = new Map<string, any>();
}

View File

@@ -0,0 +1,9 @@
import { Account } from './account';
import { Globals } from './globals';
export class State {
accounts: { [userId: string]: Account } = {};
globals: Globals;
activeUserId: string;
}

File diff suppressed because it is too large Load Diff