From 20d128d990d26fb9f34b0a2e36fbc5609f4c78ed Mon Sep 17 00:00:00 2001 From: Anton Shepilov Date: Mon, 27 Jan 2025 16:40:47 +0100 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20Fixed=20problem=20with=20deletin?= =?UTF-8?q?g=20files=20uploaded=20by=20an=20application=20(#793)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../documents/services/access-check.ts | 4 ++-- .../src/services/documents/services/index.ts | 3 ++- .../node/test/e2e/documents/documents.spec.ts | 23 +++++++++++++++++++ tdrive/backend/node/test/e2e/setup/index.ts | 3 +++ 4 files changed, 30 insertions(+), 3 deletions(-) diff --git a/tdrive/backend/node/src/services/documents/services/access-check.ts b/tdrive/backend/node/src/services/documents/services/access-check.ts index 78096c52..f9476f32 100644 --- a/tdrive/backend/node/src/services/documents/services/access-check.ts +++ b/tdrive/backend/node/src/services/documents/services/access-check.ts @@ -419,9 +419,9 @@ export const getItemScope = async ( context: CompanyExecutionContext, ): Promise<"personal" | "shared"> => { let scope: "personal" | "shared"; - if (item.parent_id.startsWith("user_")) { + if (item.parent_id.startsWith("user_") || item.parent_id.startsWith("trash_")) { scope = "personal"; - } else if (item.parent_id === "root") { + } else if (item.parent_id === "root" || item.parent_id === "trash") { scope = "shared"; } else { const driveItemParent = await repository.findOne( diff --git a/tdrive/backend/node/src/services/documents/services/index.ts b/tdrive/backend/node/src/services/documents/services/index.ts index 40aa08b2..6d3c07f1 100644 --- a/tdrive/backend/node/src/services/documents/services/index.ts +++ b/tdrive/backend/node/src/services/documents/services/index.ts @@ -821,7 +821,8 @@ export class DocumentsService { // Check item belongs to someone if (item.creator !== context?.user?.id) { const creator = await this.userRepository.findOne({ id: item.creator }); - if (creator.type === "anonymous") { + //if the file was created by an application or anonymous user + if (creator == null || creator.type === "anonymous") { const loadedCreators = new Map(); let firstOwnedItem: DriveFile | undefined; for (let i = path.length - 1; i >= 0; i--) { diff --git a/tdrive/backend/node/test/e2e/documents/documents.spec.ts b/tdrive/backend/node/test/e2e/documents/documents.spec.ts index 56c106f5..3b6970c0 100644 --- a/tdrive/backend/node/test/e2e/documents/documents.spec.ts +++ b/tdrive/backend/node/test/e2e/documents/documents.spec.ts @@ -15,6 +15,7 @@ import { DriveItemDetailsMockClass, } from "../common/entities/mock_entities"; import { Open } from "unzipper"; +import { randomUUID } from "crypto"; describe("the Drive feature", () => { let platform: TestPlatform; @@ -121,6 +122,28 @@ describe("the Drive feature", () => { expect(zip.files.map(f => f.path).sort()).toEqual(fileNames.sort()) }); + + it("Delete document that was uploaded by an application", async () => { + const doc = await currentUser.uploadRandomFileAndCreateDocument(); + expect(doc.id).toBeDefined(); + + //update creator files + const update = await currentUser.platform.documentService.repository.findOne({id: doc.id}) + update.creator = randomUUID(); + await currentUser.platform.documentService.repository.save(update) + + const updated = await currentUser.getDocumentOKCheck(doc.id); + + expect(updated.item.creator).toBe(update.creator); + + let deleteResponse = await currentUser.delete(doc.id); + expect(deleteResponse.statusCode).toEqual(200); + + //delete from trash + deleteResponse = await currentUser.delete(doc.id); + expect(deleteResponse.statusCode).toEqual(200); + }); + it("did create a version for a drive item", async () => { const item = await currentUser.createDefaultDocument(); const fileUploadResponse = await e2e_createDocumentFile(platform); diff --git a/tdrive/backend/node/test/e2e/setup/index.ts b/tdrive/backend/node/test/e2e/setup/index.ts index be53770b..3ab99cfd 100644 --- a/tdrive/backend/node/test/e2e/setup/index.ts +++ b/tdrive/backend/node/test/e2e/setup/index.ts @@ -16,6 +16,7 @@ import StorageAPI from "../../../src/core/platform/services/storage/provider"; import {SearchServiceAPI} from "../../../src/core/platform/services/search/api"; import Session from "../../../src/services/console/entities/session"; import EmailPusherAPI from "../../../src/core/platform/services/email-pusher/provider"; +import { DocumentsService } from "../../../src/services/documents/services"; type TokenPayload = { sub: string; @@ -48,6 +49,7 @@ export interface TestPlatform { messageQueue: MessageQueueServiceAPI; authService: AuthServiceAPI; filesService: FileServiceImpl; + documentService: DocumentsService; auth: { getJWTToken(payload?: TokenPayload): Promise; }; @@ -102,6 +104,7 @@ export async function init( currentSession: uuidv1(), authService: auth, filesService: globalResolver.services.files, + documentService: globalResolver.services.documents.documents, auth: { getJWTToken, },