diff --git a/src/modules/file/file.usecase.spec.ts b/src/modules/file/file.usecase.spec.ts index 510831d18..8dff85772 100644 --- a/src/modules/file/file.usecase.spec.ts +++ b/src/modules/file/file.usecase.spec.ts @@ -446,7 +446,7 @@ describe('FileUseCases', () => { const expectedFile = newFile({ attributes: { ...file, - name: 'newencrypted-' + file.name, + name: file.plainName, folderId: destinationFolder.id, folderUuid: destinationFolder.uuid, status: FileStatus.EXISTS, @@ -458,10 +458,6 @@ describe('FileUseCases', () => { .spyOn(folderUseCases, 'getFolderByUuid') .mockResolvedValueOnce(destinationFolder); - jest - .spyOn(cryptoService, 'encryptName') - .mockReturnValueOnce(expectedFile.name); - jest .spyOn(fileRepository, 'findByPlainNameAndFolderId') .mockResolvedValueOnce(null); @@ -482,7 +478,7 @@ describe('FileUseCases', () => { { folderId: destinationFolder.id, folderUuid: destinationFolder.uuid, - name: expectedFile.name, + name: expectedFile.plainName, status: FileStatus.EXISTS, plainName: expectedFile.plainName, type: expectedFile.type, @@ -545,7 +541,6 @@ describe('FileUseCases', () => { jest .spyOn(folderUseCases, 'getFolderByUuid') .mockResolvedValueOnce(destinationFolder); - jest.spyOn(cryptoService, 'encryptName').mockReturnValueOnce(file.name); jest .spyOn(fileRepository, 'findByPlainNameAndFolderId') .mockResolvedValueOnce(file); @@ -568,7 +563,6 @@ describe('FileUseCases', () => { jest .spyOn(folderUseCases, 'getFolderByUuid') .mockResolvedValueOnce(destinationFolder); - jest.spyOn(cryptoService, 'encryptName').mockReturnValueOnce(file.name); jest .spyOn(fileRepository, 'findByPlainNameAndFolderId') .mockResolvedValueOnce(conflictFile); @@ -606,6 +600,7 @@ describe('FileUseCases', () => { folderUuid: destinationFolder.uuid, status: FileStatus.EXISTS, plainName: newAttributes.name, + name: newAttributes.name, type: newAttributes.type, }, }); @@ -617,10 +612,6 @@ describe('FileUseCases', () => { .spyOn(folderUseCases, 'getFolderByUuid') .mockResolvedValueOnce(destinationFolder); - jest - .spyOn(cryptoService, 'encryptName') - .mockReturnValueOnce(fileToBeMovedAndRenamed.name); - jest .spyOn(fileRepository, 'findByPlainNameAndFolderId') .mockResolvedValueOnce(null); @@ -646,7 +637,7 @@ describe('FileUseCases', () => { { folderId: destinationFolder.id, folderUuid: destinationFolder.uuid, - name: expectedFile.name, + name: expectedFile.plainName, status: FileStatus.EXISTS, plainName: expectedFile.plainName, type: expectedFile.type, @@ -678,6 +669,7 @@ describe('FileUseCases', () => { folderUuid: destinationFolder.uuid, status: FileStatus.EXISTS, plainName: newAttributes.name, + name: newAttributes.name, type: newAttributes.type, }, }); @@ -689,10 +681,6 @@ describe('FileUseCases', () => { .spyOn(folderUseCases, 'getFolderByUuid') .mockResolvedValueOnce(destinationFolder); - jest - .spyOn(cryptoService, 'encryptName') - .mockReturnValueOnce(fileToBeRenamed.name); - jest .spyOn(fileRepository, 'findByPlainNameAndFolderId') .mockResolvedValueOnce(null); @@ -714,7 +702,7 @@ describe('FileUseCases', () => { { folderId: expectedFile.folderId, folderUuid: expectedFile.folderUuid, - name: expectedFile.name, + name: expectedFile.plainName, status: FileStatus.EXISTS, plainName: expectedFile.plainName, type: expectedFile.type, @@ -746,10 +734,6 @@ describe('FileUseCases', () => { .spyOn(folderUseCases, 'getFolderByUuid') .mockResolvedValueOnce(destinationFolder); - jest - .spyOn(cryptoService, 'encryptName') - .mockReturnValueOnce(fileToBeRenamed.name); - jest .spyOn(fileRepository, 'findByPlainNameAndFolderId') .mockResolvedValueOnce(null); @@ -1347,12 +1331,11 @@ describe('FileUseCases', () => { const newFileMeta: UpdateFileMetaDto = { plainName: 'new-name' }; const mockFile = newFile({ owner: userMocked }); - const encryptedName = 'encrypted-name'; const updatedFile = newFile({ attributes: { ...mockFile, plainName: newFileMeta.plainName, - name: encryptedName, + name: newFileMeta.plainName, }, }); @@ -1360,7 +1343,6 @@ describe('FileUseCases', () => { jest .spyOn(fileRepository, 'findByPlainNameAndFolderId') .mockResolvedValueOnce(null); - jest.spyOn(cryptoService, 'encryptName').mockReturnValue(encryptedName); const result = await service.updateFileMetaData( userMocked, @@ -1385,7 +1367,7 @@ describe('FileUseCases', () => { userMocked.id, expect.objectContaining({ plainName: newFileMeta.plainName, - name: encryptedName, + name: newFileMeta.plainName, }), ); const { @@ -1421,7 +1403,6 @@ describe('FileUseCases', () => { jest .spyOn(fileRepository, 'findByPlainNameAndFolderId') .mockResolvedValueOnce(null); - jest.spyOn(cryptoService, 'encryptName').mockReturnValue(mockFile.name); const result = await service.updateFileMetaData( userMocked, @@ -1844,7 +1825,7 @@ describe('FileUseCases', () => { const mockFile = newFile({ attributes: { fileId: testFileId, - name: 'encrypted-name', + name: 'name', type: 'jpg', size: BigInt(1000), bucket: testBucketId, diff --git a/src/modules/file/file.usecase.ts b/src/modules/file/file.usecase.ts index 827fad9ba..308d7c71f 100644 --- a/src/modules/file/file.usecase.ts +++ b/src/modules/file/file.usecase.ts @@ -50,7 +50,7 @@ import { } from '../feature-limit/limits.enum'; import { FeatureLimitUsecases } from '../feature-limit/feature-limit.usecase'; import { SequelizeFileVersionRepository } from './file-version.repository'; -import { FileVersion, FileVersionStatus } from './file-version.domain'; +import { FileVersionStatus } from './file-version.domain'; import { FileVersionDto } from './dto/responses/file-version.dto'; import { UserUseCases } from '../user/user.usecase'; import { RedisService } from '../../externals/redis/redis.service'; @@ -346,10 +346,7 @@ export class FileUseCases { throw new ForbiddenException('Folder is not yours'); } - const cryptoFileName = this.cryptoService.encryptName( - newFileDto.plainName, - folder.id, - ); + const cryptoFileName = newFileDto.plainName; const exists = await this.fileRepository.findByPlainNameAndFolderId( user.id, @@ -474,9 +471,7 @@ export class FileUseCases { newFileMetadata.plainName ?? file.plainName ?? this.cryptoService.decryptName(file.name, file.folderId); - const cryptoFileName = newFileMetadata.plainName - ? this.cryptoService.encryptName(newFileMetadata.plainName, file.folderId) - : file.name; + const cryptoFileName = newFileMetadata.plainName || file.name; const type = newFileMetadata.type ?? file.type; const updatedFile = File.build({ @@ -863,7 +858,7 @@ export class FileUseCases { if (shouldVersion) { await this.applyRetentionPolicy(fileUuid, user.uuid); - const { fileId, size, modificationTime } = newFileData; + const { size, modificationTime } = newFileData; await Promise.all([ this.fileVersionRepository.upsert({ @@ -996,15 +991,10 @@ export class FileUseCases { ); } - const destinationEncryptedName = this.cryptoService.encryptName( - file.plainName, - destinationFolder.id, - ); - const updateData: Partial = { folderId: destinationFolder.id, folderUuid: destinationFolder.uuid, - name: destinationEncryptedName, + name: file.plainName, status: FileStatus.EXISTS, plainName: file.plainName, type: file.type, diff --git a/src/modules/folder/folder.repository.spec.ts b/src/modules/folder/folder.repository.spec.ts index 664440c06..a936bfdd3 100644 --- a/src/modules/folder/folder.repository.spec.ts +++ b/src/modules/folder/folder.repository.spec.ts @@ -765,7 +765,7 @@ describe('SequelizeFolderRepository', () => { describe('create', () => { it('When creating a folder with basic parameters, then it should return the created folder', async () => { const userId = 1; - const name = 'encrypted-name'; + const name = 'folder-name'; const bucket = 'bucket-id'; const parentId = 2; const encryptVersion = '03-aes' as const; @@ -788,6 +788,7 @@ describe('SequelizeFolderRepository', () => { const result = await repository.create( userId, name, + name, bucket, parentId, encryptVersion, @@ -797,6 +798,7 @@ describe('SequelizeFolderRepository', () => { expect(folderModel.create).toHaveBeenCalledWith({ userId, name, + plainName: name, bucket, parentId, encryptVersion, @@ -834,6 +836,7 @@ describe('SequelizeFolderRepository', () => { { userId: 1, name: 'folder1', + plainName: 'folderPlainName1', bucket: 'bucket1', parentId: 1, encryptVersion: '03-aes' as const, @@ -842,6 +845,7 @@ describe('SequelizeFolderRepository', () => { { userId: 1, name: 'folder2', + plainName: 'folderPlainName2', bucket: 'bucket2', parentId: 1, encryptVersion: '03-aes' as const, diff --git a/src/modules/folder/folder.repository.ts b/src/modules/folder/folder.repository.ts index 6faf158c3..529cbe146 100644 --- a/src/modules/folder/folder.repository.ts +++ b/src/modules/folder/folder.repository.ts @@ -559,6 +559,7 @@ export class SequelizeFolderRepository implements FolderRepository { async create( userId: UserAttributes['id'], name: FolderAttributes['name'], + plainName: FolderAttributes['plainName'], bucket: FolderAttributes['bucket'], parentId: FolderAttributes['parentId'], encryptVersion: FolderAttributes['encryptVersion'], @@ -567,6 +568,7 @@ export class SequelizeFolderRepository implements FolderRepository { const folder = await this.folderModel.create({ userId, name, + plainName, bucket, parentId, encryptVersion, @@ -592,6 +594,7 @@ export class SequelizeFolderRepository implements FolderRepository { folders: { userId: UserAttributes['id']; name: FolderAttributes['name']; + plainName: FolderAttributes['plainName']; bucket: FolderAttributes['bucket']; parentId: FolderAttributes['parentId']; encryptVersion: FolderAttributes['encryptVersion']; diff --git a/src/modules/folder/folder.usecase.spec.ts b/src/modules/folder/folder.usecase.spec.ts index aa8b40715..2c52b441b 100644 --- a/src/modules/folder/folder.usecase.spec.ts +++ b/src/modules/folder/folder.usecase.spec.ts @@ -445,11 +445,7 @@ describe('FolderUseCases', () => { describe('decryptFolderName()', () => { it('When the name is encrypted, then the decrypting works', () => { const folder = newFolder(); - const encriptedName = cryptoService.encryptName( - folder.plainName, - folder.parentId, - ); - folder.name = encriptedName; + folder.name = folder.plainName; const result = service.decryptFolderName(folder); @@ -531,7 +527,7 @@ describe('FolderUseCases', () => { const expectedFolder = newFolder({ attributes: { ...folder, - name: 'newencrypted-' + folder.name, + name: folder.name, parentUuid: destinationFolder.uuid, parentId: destinationFolder.parentId, }, @@ -552,10 +548,6 @@ describe('FolderUseCases', () => { .spyOn(cryptoService, 'decryptName') .mockReturnValueOnce(folder.plainName); - jest - .spyOn(cryptoService, 'encryptName') - .mockReturnValueOnce(expectedFolder.name); - jest .spyOn(folderRepository, 'findByNameAndParentUuid') .mockResolvedValueOnce(null); @@ -575,7 +567,7 @@ describe('FolderUseCases', () => { { parentId: destinationFolder.id, parentUuid: destinationFolder.uuid, - name: expectedFolder.name, + name: expectedFolder.plainName, plainName: expectedFolder.plainName, deleted: false, deletedAt: null, @@ -705,7 +697,6 @@ describe('FolderUseCases', () => { jest .spyOn(cryptoService, 'decryptName') .mockReturnValueOnce(folder.plainName); - jest.spyOn(cryptoService, 'encryptName').mockReturnValueOnce(folder.name); jest .spyOn(folderRepository, 'findByNameAndParentUuid') .mockResolvedValueOnce(folder); @@ -741,7 +732,6 @@ describe('FolderUseCases', () => { jest .spyOn(cryptoService, 'decryptName') .mockReturnValueOnce(folder.plainName); - jest.spyOn(cryptoService, 'encryptName').mockReturnValueOnce(folder.name); jest .spyOn(folderRepository, 'findByNameAndParentUuid') .mockResolvedValueOnce(conflictFolder); @@ -760,7 +750,7 @@ describe('FolderUseCases', () => { const expectedFolder = newFolder({ attributes: { ...folder, - name: 'newencrypted-' + newName, + name: newName, plainName: newName, parentUuid: destinationFolder.uuid, parentId: destinationFolder.id, @@ -778,10 +768,6 @@ describe('FolderUseCases', () => { .spyOn(service, 'getFolderByUuid') .mockResolvedValueOnce(destinationFolder); - jest - .spyOn(cryptoService, 'encryptName') - .mockReturnValueOnce(expectedFolder.name); - jest .spyOn(folderRepository, 'findByNameAndParentUuid') .mockResolvedValueOnce(null); @@ -852,9 +838,6 @@ describe('FolderUseCases', () => { }, }); - jest - .spyOn(cryptoService, 'encryptName') - .mockReturnValueOnce(encryptedFolderName); jest .spyOn(folderRepository, 'findByNameAndParentUuid') .mockResolvedValue(null); @@ -947,10 +930,6 @@ describe('FolderUseCases', () => { .mockResolvedValueOnce(parentFolder); jest.spyOn(folderRepository, 'findOne').mockResolvedValueOnce(null); - jest - .spyOn(cryptoService, 'encryptName') - .mockReturnValueOnce(encryptedFolderName); - jest .spyOn(folderRepository, 'createWithAttributes') .mockResolvedValueOnce(newFolderCreated); @@ -1171,11 +1150,10 @@ describe('FolderUseCases', () => { }); it('When the folder metadata is updated successfully, then it should update and return the updated folder', async () => { - const encryptedName = 'encrypted-new-folder-name'; const mockFolder = newFolder({ owner: userMocked }); const updatedFolder = newFolder({ attributes: { - name: encryptedName, + name: newFolderMetadata.plainName, plainName: newFolderMetadata.plainName, modificationTime: new Date(), }, @@ -1184,7 +1162,6 @@ describe('FolderUseCases', () => { jest.spyOn(folderRepository, 'findOne').mockResolvedValueOnce(mockFolder); jest.spyOn(mockFolder, 'isOwnedBy').mockReturnValueOnce(true); jest.spyOn(folderRepository, 'findOne').mockResolvedValueOnce(null); - jest.spyOn(cryptoService, 'encryptName').mockReturnValue(encryptedName); jest .spyOn(folderRepository, 'updateByFolderId') .mockResolvedValue(updatedFolder); @@ -1199,7 +1176,7 @@ describe('FolderUseCases', () => { mockFolder.id, expect.objectContaining({ plainName: newFolderMetadata.plainName, - name: encryptedName, + name: newFolderMetadata.plainName, }), ); diff --git a/src/modules/folder/folder.usecase.ts b/src/modules/folder/folder.usecase.ts index 7156f2240..a4d9fde69 100644 --- a/src/modules/folder/folder.usecase.ts +++ b/src/modules/folder/folder.usecase.ts @@ -202,7 +202,8 @@ export class FolderUseCases { ): Promise { const folder = await this.folderRepository.findById(folderId, deleted); - return folder ? this.decryptFolderName(folder) : null; + if (folder.plainName) return folder; + else return this.decryptFolderName(folder); } async isFolderInsideFolder( @@ -257,6 +258,7 @@ export class FolderUseCases { async createRootFolder( creator: User, name: FolderAttributes['name'], + plainName: FolderAttributes['plainName'], bucketId: string, ): Promise { const isAGuestOnSharedWorkspace = creator.email !== creator.bridgeUser; @@ -275,11 +277,10 @@ export class FolderUseCases { throw new Error('Invalid folder name'); } - const encryptedFolderName = this.cryptoService.encryptName(name, null); - const folder = await this.folderRepository.create( user.id, - encryptedFolderName, + name, + plainName, bucketId, null, '03-aes', @@ -319,10 +320,7 @@ export class FolderUseCases { return { userId: user.id, plainName: folder.name, - name: this.cryptoService.encryptName( - folder.name, - folder.parentFolderId, - ), + name: folder.name, encryptVersion: '03-aes', bucket: null, parentId: folder.parentFolderId, @@ -362,13 +360,8 @@ export class FolderUseCases { throw new ForbiddenException('This folder is not yours'); } - const cryptoFileName = this.cryptoService.encryptName( - newFolderMetadata.plainName, - folder.parentId, - ); - const folderWithSameNameExists = await this.folderRepository.findOne({ - name: cryptoFileName, + plainName: newFolderMetadata.plainName, parentId: folder.parentId, deleted: false, removed: false, @@ -384,7 +377,7 @@ export class FolderUseCases { folder.id, { plainName: newFolderMetadata.plainName, - name: cryptoFileName, + name: newFolderMetadata.plainName, modificationTime: new Date(), }, ); @@ -436,15 +429,10 @@ export class FolderUseCases { ); } - const encryptedFolderName = this.cryptoService.encryptName( - newFolderDto.plainName, - parentFolder.id, - ); - const folder = await this.folderRepository.createWithAttributes({ uuid: v4(), userId: user.id, - name: encryptedFolderName, + name: newFolderDto.plainName, plainName: newFolderDto.plainName, parentId: parentFolder.id, parentUuid: parentFolder.uuid, @@ -884,13 +872,8 @@ export class FolderUseCases { const plainName = newName ?? this.cryptoService.decryptName(folder.name, folder.parentId); - const nameEncryptedWithDestination = this.cryptoService.encryptName( - plainName, - destinationFolder.id, - ); - const exists = await this.folderRepository.findByNameAndParentUuid( - nameEncryptedWithDestination, + plainName, plainName, destinationFolder.uuid, false, @@ -910,7 +893,7 @@ export class FolderUseCases { const updateData: Partial = { parentId: destinationFolder.id, parentUuid: destinationFolder.uuid, - name: nameEncryptedWithDestination, + name: plainName, plainName, deleted: false, deletedAt: null, @@ -938,13 +921,8 @@ export class FolderUseCases { throw new BadRequestException('Invalid folder name'); } - const newEncryptedName = this.cryptoService.encryptName( - newName, - folder.parentId, - ); - const exists = await this.folderRepository.findByNameAndParentUuid( - newEncryptedName, + newName, newName, folder.parentUuid, false, @@ -957,7 +935,7 @@ export class FolderUseCases { } return await this.folderRepository.updateByFolderId(folder.id, { - name: newEncryptedName, + name: newName, plainName: newName, }); } diff --git a/src/modules/user/user.usecase.spec.ts b/src/modules/user/user.usecase.spec.ts index 40ce1cbd3..36e7a44d8 100644 --- a/src/modules/user/user.usecase.spec.ts +++ b/src/modules/user/user.usecase.spec.ts @@ -3586,9 +3586,6 @@ describe('User use cases', () => { const familyFolder = newFolder({ attributes: { name: 'Family' } }); const personalFolder = newFolder({ attributes: { name: 'Personal' } }); - jest - .spyOn(cryptoService, 'encryptName') - .mockReturnValue('encrypted-name'); jest .spyOn(folderUseCases, 'createRootFolder') .mockResolvedValue(rootFolder); @@ -3601,7 +3598,8 @@ describe('User use cases', () => { expect(folderUseCases.createRootFolder).toHaveBeenCalledWith( user, - 'encrypted-name', + expect.any(String), + expect.any(String), bucketId, ); expect(userRepository.updateById).toHaveBeenCalledWith(user.id, { diff --git a/src/modules/user/user.usecase.ts b/src/modules/user/user.usecase.ts index 7a84db634..880577fe7 100644 --- a/src/modules/user/user.usecase.ts +++ b/src/modules/user/user.usecase.ts @@ -12,7 +12,6 @@ import { forwardRef, } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; -import { Environment } from '@internxt/inxt-js'; import { v4, validate } from 'uuid'; import { generateMnemonic } from 'bip39'; import * as speakeasy from 'speakeasy'; @@ -362,11 +361,12 @@ export class UserUseCases { user: User, bucketId: string, ): Promise<[Folder, Folder, Folder]> { - const rootFolderName = this.cryptoService.encryptName(`${v4()}`); + const rootFolderName = v4(); const rootFolder = await this.folderUseCases.createRootFolder( user, rootFolderName, + rootFolderName, bucketId, ); diff --git a/src/modules/workspaces/workspaces.usecase.spec.ts b/src/modules/workspaces/workspaces.usecase.spec.ts index 1a36471db..2f700f322 100644 --- a/src/modules/workspaces/workspaces.usecase.spec.ts +++ b/src/modules/workspaces/workspaces.usecase.spec.ts @@ -3923,6 +3923,7 @@ describe('WorkspacesUsecases', () => { expect(folderUseCases.createRootFolder).toHaveBeenCalledWith( workspaceUser, expect.any(String), + expect.any(String), bucket.id, ); expect(workspaceRepository.create).toHaveBeenCalledWith( diff --git a/src/modules/workspaces/workspaces.usecase.ts b/src/modules/workspaces/workspaces.usecase.ts index df902baed..cba425378 100644 --- a/src/modules/workspaces/workspaces.usecase.ts +++ b/src/modules/workspaces/workspaces.usecase.ts @@ -174,9 +174,11 @@ export class WorkspacesUsecases { workspaceEmail, networkUserId, ); + const name = v4(); const rootFolder = await this.folderUseCases.createRootFolder( workspaceUser, - v4(), + name, + name, bucket.id, ); newWorkspace.rootFolderId = rootFolder.uuid;