1
0
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:
Justin Baur 2024-04-01 14:36:39 -05:00 committed by GitHub
parent bd7c10705d
commit 94843bdd8b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 58 additions and 97 deletions

View File

@ -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);
}
} }
} }

View File

@ -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);

View File

@ -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>;

View File

@ -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*/

View File

@ -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;

View File

@ -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 &&

View File

@ -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(

View File

@ -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: {},
});
});
});
});

View File

@ -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;
}
}