mirror of
https://github.com/bitwarden/browser.git
synced 2024-11-24 12:06:15 +01:00
[PM-5956] Delete Unused State (#8439)
* Delete Unused State * Delete One More * Add Migration to Delete InstalledVersion * Update Error
This commit is contained in:
parent
bd7c10705d
commit
94843bdd8b
@ -713,12 +713,6 @@ export class Main {
|
|||||||
this.containerService.attachToGlobal(global);
|
this.containerService.attachToGlobal(global);
|
||||||
await this.i18nService.init();
|
await this.i18nService.init();
|
||||||
this.twoFactorService.init();
|
this.twoFactorService.init();
|
||||||
|
|
||||||
const installedVersion = await this.stateService.getInstalledVersion();
|
|
||||||
const currentVersion = await this.platformUtilsService.getApplicationVersion();
|
|
||||||
if (installedVersion == null || installedVersion !== currentVersion) {
|
|
||||||
await this.stateService.setInstalledVersion(currentVersion);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -53,18 +53,6 @@ export class InitService {
|
|||||||
const htmlEl = this.win.document.documentElement;
|
const htmlEl = this.win.document.documentElement;
|
||||||
htmlEl.classList.add("os_" + this.platformUtilsService.getDeviceString());
|
htmlEl.classList.add("os_" + this.platformUtilsService.getDeviceString());
|
||||||
this.themingService.applyThemeChangesTo(this.document);
|
this.themingService.applyThemeChangesTo(this.document);
|
||||||
let installAction = null;
|
|
||||||
const installedVersion = await this.stateService.getInstalledVersion();
|
|
||||||
const currentVersion = await this.platformUtilsService.getApplicationVersion();
|
|
||||||
if (installedVersion == null) {
|
|
||||||
installAction = "install";
|
|
||||||
} else if (installedVersion !== currentVersion) {
|
|
||||||
installAction = "update";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (installAction != null) {
|
|
||||||
await this.stateService.setInstalledVersion(currentVersion);
|
|
||||||
}
|
|
||||||
|
|
||||||
const containerService = new ContainerService(this.cryptoService, this.encryptService);
|
const containerService = new ContainerService(this.cryptoService, this.encryptService);
|
||||||
containerService.attachToGlobal(this.win);
|
containerService.attachToGlobal(this.win);
|
||||||
|
@ -50,8 +50,6 @@ export abstract class StateService<T extends Account = Account> {
|
|||||||
|
|
||||||
getAddEditCipherInfo: (options?: StorageOptions) => Promise<AddEditCipherInfo>;
|
getAddEditCipherInfo: (options?: StorageOptions) => Promise<AddEditCipherInfo>;
|
||||||
setAddEditCipherInfo: (value: AddEditCipherInfo, options?: StorageOptions) => Promise<void>;
|
setAddEditCipherInfo: (value: AddEditCipherInfo, options?: StorageOptions) => Promise<void>;
|
||||||
getBiometricFingerprintValidated: (options?: StorageOptions) => Promise<boolean>;
|
|
||||||
setBiometricFingerprintValidated: (value: boolean, options?: StorageOptions) => Promise<void>;
|
|
||||||
/**
|
/**
|
||||||
* Gets the user's master key
|
* Gets the user's master key
|
||||||
*/
|
*/
|
||||||
@ -161,8 +159,6 @@ export abstract class StateService<T extends Account = Account> {
|
|||||||
* @deprecated Do not call this directly, use SendService
|
* @deprecated Do not call this directly, use SendService
|
||||||
*/
|
*/
|
||||||
setDecryptedSends: (value: SendView[], options?: StorageOptions) => Promise<void>;
|
setDecryptedSends: (value: SendView[], options?: StorageOptions) => Promise<void>;
|
||||||
getDisableGa: (options?: StorageOptions) => Promise<boolean>;
|
|
||||||
setDisableGa: (value: boolean, 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>;
|
||||||
getDeviceKey: (options?: StorageOptions) => Promise<DeviceKey | null>;
|
getDeviceKey: (options?: StorageOptions) => Promise<DeviceKey | null>;
|
||||||
@ -220,8 +216,6 @@ export abstract class StateService<T extends Account = Account> {
|
|||||||
value: ForceSetPasswordReason,
|
value: ForceSetPasswordReason,
|
||||||
options?: StorageOptions,
|
options?: StorageOptions,
|
||||||
) => Promise<void>;
|
) => Promise<void>;
|
||||||
getInstalledVersion: (options?: StorageOptions) => Promise<string>;
|
|
||||||
setInstalledVersion: (value: string, options?: StorageOptions) => Promise<void>;
|
|
||||||
getIsAuthenticated: (options?: StorageOptions) => Promise<boolean>;
|
getIsAuthenticated: (options?: StorageOptions) => Promise<boolean>;
|
||||||
getKdfConfig: (options?: StorageOptions) => Promise<KdfConfig>;
|
getKdfConfig: (options?: StorageOptions) => Promise<KdfConfig>;
|
||||||
setKdfConfig: (kdfConfig: KdfConfig, options?: StorageOptions) => Promise<void>;
|
setKdfConfig: (kdfConfig: KdfConfig, options?: StorageOptions) => Promise<void>;
|
||||||
|
@ -65,13 +65,6 @@ export class DataEncryptionPair<TEncrypted, TDecrypted> {
|
|||||||
decrypted?: TDecrypted[];
|
decrypted?: TDecrypted[];
|
||||||
}
|
}
|
||||||
|
|
||||||
// This is a temporary structure to handle migrated `DataEncryptionPair` to
|
|
||||||
// avoid needing a data migration at this stage. It should be replaced with
|
|
||||||
// proper data migrations when `DataEncryptionPair` is deprecated.
|
|
||||||
export class TemporaryDataEncryption<TEncrypted> {
|
|
||||||
encrypted?: { [id: string]: TEncrypted };
|
|
||||||
}
|
|
||||||
|
|
||||||
export class AccountData {
|
export class AccountData {
|
||||||
ciphers?: DataEncryptionPair<CipherData, CipherView> = new DataEncryptionPair<
|
ciphers?: DataEncryptionPair<CipherData, CipherView> = new DataEncryptionPair<
|
||||||
CipherData,
|
CipherData,
|
||||||
@ -182,8 +175,6 @@ export class AccountProfile {
|
|||||||
|
|
||||||
export class AccountSettings {
|
export class AccountSettings {
|
||||||
defaultUriMatch?: UriMatchStrategySetting;
|
defaultUriMatch?: UriMatchStrategySetting;
|
||||||
disableGa?: boolean;
|
|
||||||
enableBiometric?: boolean;
|
|
||||||
minimizeOnCopyToClipboard?: boolean;
|
minimizeOnCopyToClipboard?: boolean;
|
||||||
passwordGenerationOptions?: PasswordGeneratorOptions;
|
passwordGenerationOptions?: PasswordGeneratorOptions;
|
||||||
usernameGenerationOptions?: UsernameGeneratorOptions;
|
usernameGenerationOptions?: UsernameGeneratorOptions;
|
||||||
@ -194,7 +185,6 @@ export class AccountSettings {
|
|||||||
vaultTimeout?: number;
|
vaultTimeout?: number;
|
||||||
vaultTimeoutAction?: string = "lock";
|
vaultTimeoutAction?: string = "lock";
|
||||||
approveLoginRequests?: boolean;
|
approveLoginRequests?: boolean;
|
||||||
avatarColor?: string;
|
|
||||||
trustDeviceChoiceForDecryption?: boolean;
|
trustDeviceChoiceForDecryption?: boolean;
|
||||||
|
|
||||||
/** @deprecated July 2023, left for migration purposes*/
|
/** @deprecated July 2023, left for migration purposes*/
|
||||||
|
@ -1,15 +1,7 @@
|
|||||||
import { ThemeType } from "../../enums";
|
|
||||||
|
|
||||||
export class GlobalState {
|
export class GlobalState {
|
||||||
installedVersion?: string;
|
|
||||||
organizationInvitation?: any;
|
organizationInvitation?: any;
|
||||||
theme?: ThemeType = ThemeType.System;
|
|
||||||
twoFactorToken?: string;
|
|
||||||
biometricFingerprintValidated?: boolean;
|
|
||||||
vaultTimeout?: number;
|
vaultTimeout?: number;
|
||||||
vaultTimeoutAction?: string;
|
vaultTimeoutAction?: string;
|
||||||
loginRedirect?: any;
|
|
||||||
mainWindowSize?: number;
|
|
||||||
enableBrowserIntegration?: boolean;
|
enableBrowserIntegration?: boolean;
|
||||||
enableBrowserIntegrationFingerprint?: boolean;
|
enableBrowserIntegrationFingerprint?: boolean;
|
||||||
deepLinkRedirectUrl?: string;
|
deepLinkRedirectUrl?: string;
|
||||||
|
@ -275,24 +275,6 @@ export class StateService<
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
async getBiometricFingerprintValidated(options?: StorageOptions): Promise<boolean> {
|
|
||||||
return (
|
|
||||||
(await this.getGlobals(this.reconcileOptions(options, await this.defaultOnDiskOptions())))
|
|
||||||
?.biometricFingerprintValidated ?? false
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
async setBiometricFingerprintValidated(value: boolean, options?: StorageOptions): Promise<void> {
|
|
||||||
const globals = await this.getGlobals(
|
|
||||||
this.reconcileOptions(options, await this.defaultOnDiskOptions()),
|
|
||||||
);
|
|
||||||
globals.biometricFingerprintValidated = value;
|
|
||||||
await this.saveGlobals(
|
|
||||||
globals,
|
|
||||||
this.reconcileOptions(options, await this.defaultOnDiskOptions()),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @deprecated Do not save the Master Key. Use the User Symmetric Key instead
|
* @deprecated Do not save the Master Key. Use the User Symmetric Key instead
|
||||||
*/
|
*/
|
||||||
@ -650,24 +632,6 @@ export class StateService<
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
async getDisableGa(options?: StorageOptions): Promise<boolean> {
|
|
||||||
return (
|
|
||||||
(await this.getAccount(this.reconcileOptions(options, await this.defaultOnDiskOptions())))
|
|
||||||
?.settings?.disableGa ?? false
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
async setDisableGa(value: boolean, options?: StorageOptions): Promise<void> {
|
|
||||||
const account = await this.getAccount(
|
|
||||||
this.reconcileOptions(options, await this.defaultOnDiskOptions()),
|
|
||||||
);
|
|
||||||
account.settings.disableGa = value;
|
|
||||||
await this.saveAccount(
|
|
||||||
account,
|
|
||||||
this.reconcileOptions(options, await this.defaultOnDiskOptions()),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
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) {
|
||||||
@ -982,23 +946,6 @@ export class StateService<
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
async getInstalledVersion(options?: StorageOptions): Promise<string> {
|
|
||||||
return (
|
|
||||||
await this.getGlobals(this.reconcileOptions(options, await this.defaultOnDiskOptions()))
|
|
||||||
)?.installedVersion;
|
|
||||||
}
|
|
||||||
|
|
||||||
async setInstalledVersion(value: string, options?: StorageOptions): Promise<void> {
|
|
||||||
const globals = await this.getGlobals(
|
|
||||||
this.reconcileOptions(options, await this.defaultOnDiskOptions()),
|
|
||||||
);
|
|
||||||
globals.installedVersion = value;
|
|
||||||
await this.saveGlobals(
|
|
||||||
globals,
|
|
||||||
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 &&
|
||||||
|
@ -48,6 +48,7 @@ import { AccountServerConfigMigrator } from "./migrations/49-move-account-server
|
|||||||
import { AddKeyTypeToOrgKeysMigrator } from "./migrations/5-add-key-type-to-org-keys";
|
import { AddKeyTypeToOrgKeysMigrator } from "./migrations/5-add-key-type-to-org-keys";
|
||||||
import { KeyConnectorMigrator } from "./migrations/50-move-key-connector-to-state-provider";
|
import { KeyConnectorMigrator } from "./migrations/50-move-key-connector-to-state-provider";
|
||||||
import { RememberedEmailMigrator } from "./migrations/51-move-remembered-email-to-state-providers";
|
import { RememberedEmailMigrator } from "./migrations/51-move-remembered-email-to-state-providers";
|
||||||
|
import { DeleteInstalledVersion } from "./migrations/52-delete-installed-version";
|
||||||
import { RemoveLegacyEtmKeyMigrator } from "./migrations/6-remove-legacy-etm-key";
|
import { RemoveLegacyEtmKeyMigrator } from "./migrations/6-remove-legacy-etm-key";
|
||||||
import { MoveBiometricAutoPromptToAccount } from "./migrations/7-move-biometric-auto-prompt-to-account";
|
import { MoveBiometricAutoPromptToAccount } from "./migrations/7-move-biometric-auto-prompt-to-account";
|
||||||
import { MoveStateVersionMigrator } from "./migrations/8-move-state-version";
|
import { MoveStateVersionMigrator } from "./migrations/8-move-state-version";
|
||||||
@ -55,7 +56,7 @@ import { MoveBrowserSettingsToGlobal } from "./migrations/9-move-browser-setting
|
|||||||
import { MinVersionMigrator } from "./migrations/min-version";
|
import { MinVersionMigrator } from "./migrations/min-version";
|
||||||
|
|
||||||
export const MIN_VERSION = 3;
|
export const MIN_VERSION = 3;
|
||||||
export const CURRENT_VERSION = 51;
|
export const CURRENT_VERSION = 52;
|
||||||
|
|
||||||
export type MinVersion = typeof MIN_VERSION;
|
export type MinVersion = typeof MIN_VERSION;
|
||||||
|
|
||||||
@ -109,7 +110,8 @@ export function createMigrationBuilder() {
|
|||||||
.with(MoveDdgToStateProviderMigrator, 47, 48)
|
.with(MoveDdgToStateProviderMigrator, 47, 48)
|
||||||
.with(AccountServerConfigMigrator, 48, 49)
|
.with(AccountServerConfigMigrator, 48, 49)
|
||||||
.with(KeyConnectorMigrator, 49, 50)
|
.with(KeyConnectorMigrator, 49, 50)
|
||||||
.with(RememberedEmailMigrator, 50, CURRENT_VERSION);
|
.with(RememberedEmailMigrator, 50, 51)
|
||||||
|
.with(DeleteInstalledVersion, 51, CURRENT_VERSION);
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function currentVersion(
|
export async function currentVersion(
|
||||||
|
@ -0,0 +1,35 @@
|
|||||||
|
import { runMigrator } from "../migration-helper.spec";
|
||||||
|
|
||||||
|
import { DeleteInstalledVersion } from "./52-delete-installed-version";
|
||||||
|
|
||||||
|
describe("DeleteInstalledVersion", () => {
|
||||||
|
const sut = new DeleteInstalledVersion(51, 52);
|
||||||
|
|
||||||
|
describe("migrate", () => {
|
||||||
|
it("can delete data if there", async () => {
|
||||||
|
const output = await runMigrator(sut, {
|
||||||
|
authenticatedAccounts: ["user1"],
|
||||||
|
global: {
|
||||||
|
installedVersion: "2024.1.1",
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(output).toEqual({
|
||||||
|
authenticatedAccounts: ["user1"],
|
||||||
|
global: {},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it("will run if installed version is not there", async () => {
|
||||||
|
const output = await runMigrator(sut, {
|
||||||
|
authenticatedAccounts: ["user1"],
|
||||||
|
global: {},
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(output).toEqual({
|
||||||
|
authenticatedAccounts: ["user1"],
|
||||||
|
global: {},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -0,0 +1,19 @@
|
|||||||
|
import { MigrationHelper } from "../migration-helper";
|
||||||
|
import { IRREVERSIBLE, Migrator } from "../migrator";
|
||||||
|
|
||||||
|
type ExpectedGlobal = {
|
||||||
|
installedVersion?: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
export class DeleteInstalledVersion extends Migrator<51, 52> {
|
||||||
|
async migrate(helper: MigrationHelper): Promise<void> {
|
||||||
|
const legacyGlobal = await helper.get<ExpectedGlobal>("global");
|
||||||
|
if (legacyGlobal?.installedVersion != null) {
|
||||||
|
delete legacyGlobal.installedVersion;
|
||||||
|
await helper.set("global", legacyGlobal);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
rollback(helper: MigrationHelper): Promise<void> {
|
||||||
|
throw IRREVERSIBLE;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user