mirror of
https://github.com/bitwarden/browser
synced 2025-12-15 07:43:35 +00:00
[PM-5273] Migrate state in CipherService (#8314)
* PM-5273 Initial migration work for localData
* PM-5273 Encrypted and Decrypted ciphers migration to state provider
* pm-5273 Update references
* pm5273 Ensure prototype on cipher
* PM-5273 Add CipherId
* PM-5273 Remove migrated methods and updated references
* pm-5273 Fix versions
* PM-5273 Added missing options
* Conflict resolution
* Revert "Conflict resolution"
This reverts commit 0c0c2039ed.
* PM-5273 Fix PR comments
* Pm-5273 Fix comments
* PM-5273 Changed decryptedCiphers to use ActiveUserState
* PM-5273 Fix tests
* PM-5273 Fix pr comments
This commit is contained in:
@@ -720,7 +720,7 @@ describe("NotificationBackground", () => {
|
||||
);
|
||||
tabSendMessageSpy = jest.spyOn(BrowserApi, "tabSendMessage").mockImplementation();
|
||||
editItemSpy = jest.spyOn(notificationBackground as any, "editItem");
|
||||
setAddEditCipherInfoSpy = jest.spyOn(stateService, "setAddEditCipherInfo");
|
||||
setAddEditCipherInfoSpy = jest.spyOn(cipherService, "setAddEditCipherInfo");
|
||||
openAddEditVaultItemPopoutSpy = jest.spyOn(
|
||||
notificationBackground as any,
|
||||
"openAddEditVaultItemPopout",
|
||||
|
||||
@@ -600,14 +600,14 @@ export default class NotificationBackground {
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the add/edit cipher info in the state service
|
||||
* Sets the add/edit cipher info in the cipher service
|
||||
* and opens the add/edit vault item popout.
|
||||
*
|
||||
* @param cipherView - The cipher to edit
|
||||
* @param senderTab - The tab that the message was sent from
|
||||
*/
|
||||
private async editItem(cipherView: CipherView, senderTab: chrome.tabs.Tab) {
|
||||
await this.stateService.setAddEditCipherInfo({
|
||||
await this.cipherService.setAddEditCipherInfo({
|
||||
cipher: cipherView,
|
||||
collectionIds: cipherView.collectionIds,
|
||||
});
|
||||
|
||||
@@ -592,7 +592,7 @@ describe("OverlayBackground", () => {
|
||||
beforeEach(() => {
|
||||
sender = mock<chrome.runtime.MessageSender>({ tab: { id: 1 } });
|
||||
jest
|
||||
.spyOn(overlayBackground["stateService"], "setAddEditCipherInfo")
|
||||
.spyOn(overlayBackground["cipherService"], "setAddEditCipherInfo")
|
||||
.mockImplementation();
|
||||
jest.spyOn(overlayBackground as any, "openAddEditVaultItemPopout").mockImplementation();
|
||||
});
|
||||
@@ -600,7 +600,7 @@ describe("OverlayBackground", () => {
|
||||
it("will not open the add edit popout window if the message does not have a login cipher provided", () => {
|
||||
sendExtensionRuntimeMessage({ command: "autofillOverlayAddNewVaultItem" }, sender);
|
||||
|
||||
expect(overlayBackground["stateService"].setAddEditCipherInfo).not.toHaveBeenCalled();
|
||||
expect(overlayBackground["cipherService"].setAddEditCipherInfo).not.toHaveBeenCalled();
|
||||
expect(overlayBackground["openAddEditVaultItemPopout"]).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
@@ -621,7 +621,7 @@ describe("OverlayBackground", () => {
|
||||
);
|
||||
await flushPromises();
|
||||
|
||||
expect(overlayBackground["stateService"].setAddEditCipherInfo).toHaveBeenCalled();
|
||||
expect(overlayBackground["cipherService"].setAddEditCipherInfo).toHaveBeenCalled();
|
||||
expect(BrowserApi.sendMessage).toHaveBeenCalledWith(
|
||||
"inlineAutofillMenuRefreshAddEditCipher",
|
||||
);
|
||||
|
||||
@@ -636,7 +636,7 @@ class OverlayBackground implements OverlayBackgroundInterface {
|
||||
cipherView.type = CipherType.Login;
|
||||
cipherView.login = loginView;
|
||||
|
||||
await this.stateService.setAddEditCipherInfo({
|
||||
await this.cipherService.setAddEditCipherInfo({
|
||||
cipher: cipherView,
|
||||
collectionIds: cipherView.collectionIds,
|
||||
});
|
||||
|
||||
@@ -663,12 +663,12 @@ export default class MainBackground {
|
||||
this.encryptService,
|
||||
this.cipherFileUploadService,
|
||||
this.configService,
|
||||
this.stateProvider,
|
||||
);
|
||||
this.folderService = new FolderService(
|
||||
this.cryptoService,
|
||||
this.i18nService,
|
||||
this.cipherService,
|
||||
this.stateService,
|
||||
this.stateProvider,
|
||||
);
|
||||
this.folderApiService = new FolderApiService(this.folderService, this.apiService);
|
||||
|
||||
@@ -7,6 +7,7 @@ import { AuthService } from "@bitwarden/common/auth/abstractions/auth.service";
|
||||
import { AuthenticationStatus } from "@bitwarden/common/auth/enums/authentication-status";
|
||||
import { BroadcasterService } from "@bitwarden/common/platform/abstractions/broadcaster.service";
|
||||
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
|
||||
import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service";
|
||||
import { DialogService, SimpleDialogOptions } from "@bitwarden/components";
|
||||
|
||||
import { BrowserApi } from "../platform/browser/browser-api";
|
||||
@@ -42,6 +43,7 @@ export class AppComponent implements OnInit, OnDestroy {
|
||||
private stateService: BrowserStateService,
|
||||
private browserSendStateService: BrowserSendStateService,
|
||||
private vaultBrowserStateService: VaultBrowserStateService,
|
||||
private cipherService: CipherService,
|
||||
private changeDetectorRef: ChangeDetectorRef,
|
||||
private ngZone: NgZone,
|
||||
private platformUtilsService: ForegroundPlatformUtilsService,
|
||||
@@ -161,7 +163,7 @@ export class AppComponent implements OnInit, OnDestroy {
|
||||
await this.clearComponentStates();
|
||||
}
|
||||
if (url.startsWith("/tabs/")) {
|
||||
await this.stateService.setAddEditCipherInfo(null);
|
||||
await this.cipherService.setAddEditCipherInfo(null);
|
||||
}
|
||||
(window as any).previousPopupUrl = url;
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import { Location } from "@angular/common";
|
||||
import { Component } from "@angular/core";
|
||||
import { ActivatedRoute } from "@angular/router";
|
||||
import { firstValueFrom } from "rxjs";
|
||||
|
||||
import { GeneratorComponent as BaseGeneratorComponent } from "@bitwarden/angular/tools/generator/components/generator.component";
|
||||
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
|
||||
@@ -9,6 +10,7 @@ import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/pl
|
||||
import { StateService } from "@bitwarden/common/platform/abstractions/state.service";
|
||||
import { PasswordGenerationServiceAbstraction } from "@bitwarden/common/tools/generator/password";
|
||||
import { UsernameGenerationServiceAbstraction } from "@bitwarden/common/tools/generator/username";
|
||||
import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service";
|
||||
import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view";
|
||||
import { AddEditCipherInfo } from "@bitwarden/common/vault/types/add-edit-cipher-info";
|
||||
|
||||
@@ -19,6 +21,7 @@ import { AddEditCipherInfo } from "@bitwarden/common/vault/types/add-edit-cipher
|
||||
export class GeneratorComponent extends BaseGeneratorComponent {
|
||||
private addEditCipherInfo: AddEditCipherInfo;
|
||||
private cipherState: CipherView;
|
||||
private cipherService: CipherService;
|
||||
|
||||
constructor(
|
||||
passwordGenerationService: PasswordGenerationServiceAbstraction,
|
||||
@@ -26,6 +29,7 @@ export class GeneratorComponent extends BaseGeneratorComponent {
|
||||
platformUtilsService: PlatformUtilsService,
|
||||
i18nService: I18nService,
|
||||
stateService: StateService,
|
||||
cipherService: CipherService,
|
||||
route: ActivatedRoute,
|
||||
logService: LogService,
|
||||
private location: Location,
|
||||
@@ -40,10 +44,11 @@ export class GeneratorComponent extends BaseGeneratorComponent {
|
||||
route,
|
||||
window,
|
||||
);
|
||||
this.cipherService = cipherService;
|
||||
}
|
||||
|
||||
async ngOnInit() {
|
||||
this.addEditCipherInfo = await this.stateService.getAddEditCipherInfo();
|
||||
this.addEditCipherInfo = await firstValueFrom(this.cipherService.addEditCipherInfo$);
|
||||
if (this.addEditCipherInfo != null) {
|
||||
this.cipherState = this.addEditCipherInfo.cipher;
|
||||
}
|
||||
@@ -64,7 +69,7 @@ export class GeneratorComponent extends BaseGeneratorComponent {
|
||||
this.addEditCipherInfo.cipher = this.cipherState;
|
||||
// FIXME: Verify that this floating promise is intentional. If it is, add an explanatory comment and ensure there is proper error handling.
|
||||
// eslint-disable-next-line @typescript-eslint/no-floating-promises
|
||||
this.stateService.setAddEditCipherInfo(this.addEditCipherInfo);
|
||||
this.cipherService.setAddEditCipherInfo(this.addEditCipherInfo);
|
||||
this.close();
|
||||
}
|
||||
|
||||
|
||||
@@ -42,6 +42,7 @@ import {
|
||||
i18nServiceFactory,
|
||||
I18nServiceInitOptions,
|
||||
} from "../../../platform/background/service-factories/i18n-service.factory";
|
||||
import { stateProviderFactory } from "../../../platform/background/service-factories/state-provider.factory";
|
||||
import {
|
||||
stateServiceFactory,
|
||||
StateServiceInitOptions,
|
||||
@@ -81,6 +82,7 @@ export function cipherServiceFactory(
|
||||
await encryptServiceFactory(cache, opts),
|
||||
await cipherFileUploadServiceFactory(cache, opts),
|
||||
await configServiceFactory(cache, opts),
|
||||
await stateProviderFactory(cache, opts),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -14,11 +14,10 @@ import {
|
||||
i18nServiceFactory,
|
||||
I18nServiceInitOptions,
|
||||
} from "../../../platform/background/service-factories/i18n-service.factory";
|
||||
import { stateProviderFactory } from "../../../platform/background/service-factories/state-provider.factory";
|
||||
import {
|
||||
stateServiceFactory as stateServiceFactory,
|
||||
StateServiceInitOptions,
|
||||
} from "../../../platform/background/service-factories/state-service.factory";
|
||||
stateProviderFactory,
|
||||
StateProviderInitOptions,
|
||||
} from "../../../platform/background/service-factories/state-provider.factory";
|
||||
|
||||
import { cipherServiceFactory, CipherServiceInitOptions } from "./cipher-service.factory";
|
||||
|
||||
@@ -28,7 +27,7 @@ export type FolderServiceInitOptions = FolderServiceFactoryOptions &
|
||||
CryptoServiceInitOptions &
|
||||
CipherServiceInitOptions &
|
||||
I18nServiceInitOptions &
|
||||
StateServiceInitOptions;
|
||||
StateProviderInitOptions;
|
||||
|
||||
export function folderServiceFactory(
|
||||
cache: { folderService?: AbstractFolderService } & CachedServices,
|
||||
@@ -43,7 +42,6 @@ export function folderServiceFactory(
|
||||
await cryptoServiceFactory(cache, opts),
|
||||
await i18nServiceFactory(cache, opts),
|
||||
await cipherServiceFactory(cache, opts),
|
||||
await stateServiceFactory(cache, opts),
|
||||
await stateProviderFactory(cache, opts),
|
||||
),
|
||||
);
|
||||
|
||||
@@ -304,7 +304,7 @@ export class AddEditComponent extends BaseAddEditComponent {
|
||||
}
|
||||
|
||||
private saveCipherState() {
|
||||
return this.stateService.setAddEditCipherInfo({
|
||||
return this.cipherService.setAddEditCipherInfo({
|
||||
cipher: this.cipher,
|
||||
collectionIds:
|
||||
this.collections == null
|
||||
|
||||
@@ -544,13 +544,13 @@ export class Main {
|
||||
this.encryptService,
|
||||
this.cipherFileUploadService,
|
||||
this.configService,
|
||||
this.stateProvider,
|
||||
);
|
||||
|
||||
this.folderService = new FolderService(
|
||||
this.cryptoService,
|
||||
this.i18nService,
|
||||
this.cipherService,
|
||||
this.stateService,
|
||||
this.stateProvider,
|
||||
);
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@ import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/pl
|
||||
import { StateService } from "@bitwarden/common/platform/abstractions/state.service";
|
||||
import { PasswordGenerationServiceAbstraction } from "@bitwarden/common/tools/generator/password";
|
||||
import { UsernameGenerationServiceAbstraction } from "@bitwarden/common/tools/generator/username";
|
||||
import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service";
|
||||
|
||||
import { GeneratorComponent } from "./generator.component";
|
||||
|
||||
@@ -54,6 +55,10 @@ describe("GeneratorComponent", () => {
|
||||
provide: LogService,
|
||||
useValue: mock<LogService>(),
|
||||
},
|
||||
{
|
||||
provide: CipherService,
|
||||
useValue: mock<CipherService>(),
|
||||
},
|
||||
],
|
||||
schemas: [NO_ERRORS_SCHEMA],
|
||||
}).compileComponents();
|
||||
|
||||
@@ -18,7 +18,6 @@ import { StateFactory } from "@bitwarden/common/platform/factories/state-factory
|
||||
import { StorageOptions } from "@bitwarden/common/platform/models/domain/storage-options";
|
||||
import { MigrationRunner } from "@bitwarden/common/platform/services/migration-runner";
|
||||
import { StateService as BaseStateService } from "@bitwarden/common/platform/services/state.service";
|
||||
import { CipherData } from "@bitwarden/common/vault/models/data/cipher.data";
|
||||
|
||||
import { Account } from "./account";
|
||||
import { GlobalState } from "./global-state";
|
||||
@@ -57,19 +56,6 @@ export class StateService extends BaseStateService<GlobalState, Account> {
|
||||
await super.addAccount(account);
|
||||
}
|
||||
|
||||
async getEncryptedCiphers(options?: StorageOptions): Promise<{ [id: string]: CipherData }> {
|
||||
options = this.reconcileOptions(options, await this.defaultInMemoryOptions());
|
||||
return await super.getEncryptedCiphers(options);
|
||||
}
|
||||
|
||||
async setEncryptedCiphers(
|
||||
value: { [id: string]: CipherData },
|
||||
options?: StorageOptions,
|
||||
): Promise<void> {
|
||||
options = this.reconcileOptions(options, await this.defaultInMemoryOptions());
|
||||
return await super.setEncryptedCiphers(value, options);
|
||||
}
|
||||
|
||||
override async getLastSync(options?: StorageOptions): Promise<string> {
|
||||
options = this.reconcileOptions(options, await this.defaultInMemoryOptions());
|
||||
return await super.getLastSync(options);
|
||||
|
||||
Reference in New Issue
Block a user