1
0
mirror of https://github.com/bitwarden/browser.git synced 2025-01-30 22:41:33 +01:00

[PM-17213] - allow changing of item owner from personal to org (#13034)

* allow changing of item owner from personal to org

* avoid unecessary api calls when updating item parent

* move comment up a line

* add localData to cipher instance
This commit is contained in:
Jordan Aasen 2025-01-23 15:43:42 -08:00 committed by GitHub
parent 382a2a0f24
commit dbb1639e72
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 21 additions and 7 deletions

View File

@ -93,7 +93,7 @@ export abstract class CipherService implements UserKeyRotationDataProvider<Ciphe
organizationId: string,
collectionIds: string[],
userId: UserId,
) => Promise<any>;
) => Promise<Cipher>;
shareManyWithServer: (
ciphers: CipherView[],
organizationId: string,

View File

@ -786,7 +786,7 @@ export class CipherService implements CipherServiceAbstraction {
organizationId: string,
collectionIds: string[],
userId: UserId,
): Promise<any> {
): Promise<Cipher> {
const attachmentPromises: Promise<any>[] = [];
if (cipher.attachments != null) {
cipher.attachments.forEach((attachment) => {
@ -806,6 +806,7 @@ export class CipherService implements CipherServiceAbstraction {
const response = await this.apiService.putShareCipher(cipher.id, request);
const data = new CipherData(response, collectionIds);
await this.upsert(data);
return new Cipher(data, cipher.localData);
}
async shareManyWithServer(

View File

@ -157,8 +157,11 @@ describe("ItemDetailsSectionComponent", () => {
});
describe("allowOwnershipChange", () => {
it("should not allow ownership change in edit mode", () => {
it("should not allow ownership change if in edit mode and the cipher is owned by an organization", () => {
component.config.mode = "edit";
component.originalCipherView = {
organizationId: "org1",
} as CipherView;
expect(component.allowOwnershipChange).toBe(false);
});
@ -195,6 +198,7 @@ describe("ItemDetailsSectionComponent", () => {
it("should show personal ownership when the configuration allows", () => {
component.config.mode = "edit";
component.config.allowPersonalOwnership = true;
component.originalCipherView = {} as CipherView;
component.config.organizations = [{ id: "134-433-22" } as Organization];
fixture.detectChanges();
@ -208,6 +212,7 @@ describe("ItemDetailsSectionComponent", () => {
it("should show personal ownership when the control is disabled", async () => {
component.config.mode = "edit";
component.config.allowPersonalOwnership = false;
component.originalCipherView = {} as CipherView;
component.config.organizations = [{ id: "134-433-22" } as Organization];
await component.ngOnInit();
fixture.detectChanges();

View File

@ -150,8 +150,8 @@ export class ItemDetailsSectionComponent implements OnInit {
}
get allowOwnershipChange() {
// Do not allow ownership change in edit mode.
if (this.config.mode === "edit") {
// Do not allow ownership change in edit mode and the cipher is owned by an organization
if (this.config.mode === "edit" && this.originalCipherView.organizationId != null) {
return false;
}

View File

@ -63,8 +63,16 @@ export class DefaultCipherFormService implements CipherFormService {
const originalCollectionIds = new Set(config.originalCipher.collectionIds ?? []);
const newCollectionIds = new Set(cipher.collectionIds ?? []);
// If the collectionIds are the same, update the cipher normally
if (isSetEqual(originalCollectionIds, newCollectionIds)) {
// Call shareWithServer if the owner is changing from a user to an organization
if (config.originalCipher.organizationId === null && cipher.organizationId != null) {
savedCipher = await this.cipherService.shareWithServer(
cipher,
cipher.organizationId,
cipher.collectionIds,
activeUserId,
);
// If the collectionIds are the same, update the cipher normally
} else if (isSetEqual(originalCollectionIds, newCollectionIds)) {
savedCipher = await this.cipherService.updateWithServer(encryptedCipher, config.admin);
} else {
// Updating a cipher with collection changes is not supported with a single request currently