mirror of
https://github.com/bitwarden/browser.git
synced 2024-12-01 13:13:36 +01:00
399b8c2b34
* Use abstract methods and generics in StorageService * Prepend `Abstract` to abstract classes * Create session browser storage service * Use memory storage service for state memory * Inject memory storage service * Maintain filename extensions to help ide formatting * Preserve state if it's still in memory * Use jslib's memory storage service * linter * Create prototypes on stored objects * standardize package scripts * Add type safety to `withPrototype` decorators * webpack notify manifest version * Fix desktop * linter * Fix script * Improve prototye application * do not change prototype if it already matches desired * fix error with object values prototype application * Handle null state * Apply prototypes to browser-specific state * Add angular language server to recommended extensions * Improve browser state service tests * Start testing state Service * Fix abstract returns * Move test setup files to not be picked up by default glob matchers * Add key generation service * Add low-dependency encrypt service * Back crypto service with encrypt service. We'll want to work items that don't require state over to encrypt service * Add new storage service and tests * Properly init more stored values * Fix reload issues when state service is recovering state from session storage Co-authored-by: Thomas Avery <Thomas-Avery@users.noreply.github.com> Co-authored-by: Justin Baur <admin@justinbaur.com> * Simplify encrypt service * Do not log mac failures for local-backed session storage * `content` changed to `main` in #2245 * Fix CLI * Remove loggin * PR feedback * Merge remote-tracking branch 'origin/master' into add-memory-storage-to-state-service * Fix desktop * Fix decrypt method signature * Minify if not development * Key is required Co-authored-by: Thomas Avery <Thomas-Avery@users.noreply.github.com> Co-authored-by: Justin Baur <admin@justinbaur.com>
85 lines
2.7 KiB
TypeScript
85 lines
2.7 KiB
TypeScript
import { Arg, Substitute, SubstituteOf } from "@fluffy-spoon/substitute";
|
|
|
|
import { AbstractStorageService } from "@bitwarden/common/abstractions/storage.service";
|
|
import { StateVersion } from "@bitwarden/common/enums/stateVersion";
|
|
import { StateFactory } from "@bitwarden/common/factories/stateFactory";
|
|
import { Account } from "@bitwarden/common/models/domain/account";
|
|
import { GlobalState } from "@bitwarden/common/models/domain/globalState";
|
|
import { StateMigrationService } from "@bitwarden/common/services/stateMigration.service";
|
|
|
|
const userId = "USER_ID";
|
|
|
|
describe("State Migration Service", () => {
|
|
let storageService: SubstituteOf<AbstractStorageService>;
|
|
let secureStorageService: SubstituteOf<AbstractStorageService>;
|
|
let stateFactory: SubstituteOf<StateFactory>;
|
|
|
|
let stateMigrationService: StateMigrationService;
|
|
|
|
beforeEach(() => {
|
|
storageService = Substitute.for<AbstractStorageService>();
|
|
secureStorageService = Substitute.for<AbstractStorageService>();
|
|
stateFactory = Substitute.for<StateFactory>();
|
|
|
|
stateMigrationService = new StateMigrationService(
|
|
storageService,
|
|
secureStorageService,
|
|
stateFactory
|
|
);
|
|
});
|
|
|
|
describe("StateVersion 3 to 4 migration", () => {
|
|
beforeEach(() => {
|
|
const globalVersion3: Partial<GlobalState> = {
|
|
stateVersion: StateVersion.Three,
|
|
};
|
|
|
|
storageService.get("global", Arg.any()).resolves(globalVersion3);
|
|
storageService.get("authenticatedAccounts", Arg.any()).resolves([userId]);
|
|
});
|
|
|
|
it("clears everBeenUnlocked", async () => {
|
|
const accountVersion3: Account = {
|
|
profile: {
|
|
apiKeyClientId: null,
|
|
convertAccountToKeyConnector: null,
|
|
email: "EMAIL",
|
|
emailVerified: true,
|
|
everBeenUnlocked: true,
|
|
hasPremiumPersonally: false,
|
|
kdfIterations: 100000,
|
|
kdfType: 0,
|
|
keyHash: "KEY_HASH",
|
|
lastSync: "LAST_SYNC",
|
|
userId: userId,
|
|
usesKeyConnector: false,
|
|
forcePasswordReset: false,
|
|
},
|
|
};
|
|
|
|
const expectedAccountVersion4: Account = {
|
|
profile: {
|
|
...accountVersion3.profile,
|
|
},
|
|
};
|
|
delete expectedAccountVersion4.profile.everBeenUnlocked;
|
|
|
|
storageService.get(userId, Arg.any()).resolves(accountVersion3);
|
|
|
|
await stateMigrationService.migrate();
|
|
|
|
storageService.received(1).save(userId, expectedAccountVersion4, Arg.any());
|
|
});
|
|
|
|
it("updates StateVersion number", async () => {
|
|
await stateMigrationService.migrate();
|
|
|
|
storageService.received(1).save(
|
|
"global",
|
|
Arg.is((globals: GlobalState) => globals.stateVersion === StateVersion.Four),
|
|
Arg.any()
|
|
);
|
|
});
|
|
});
|
|
});
|