Improve detection of folder move into subfolder (#15422)

GitOrigin-RevId: 200d6e10a6e92ca85de24cae6d20f50c697ca584
This commit is contained in:
Alf Eaton 2023-10-30 10:13:05 +00:00 committed by Copybot
parent 8980666921
commit 1314f9082c
2 changed files with 42 additions and 8 deletions

View file

@ -634,6 +634,26 @@ function _confirmFolder(project, folderId) {
}
}
function _checkValidFolderPath(folderPath, destinationFolderPath) {
if (!folderPath.endsWith('/')) {
folderPath += '/'
}
if (!destinationFolderPath.endsWith('/')) {
destinationFolderPath += '/'
}
if (destinationFolderPath === folderPath) {
throw new Errors.InvalidNameError('destination folder is the same as me')
}
if (destinationFolderPath.startsWith(folderPath)) {
throw new Errors.InvalidNameError(
'destination folder is a child folder of me'
)
}
}
async function _checkValidMove(
project,
entityType,
@ -647,18 +667,14 @@ async function _checkValidMove(
element_id: destFolderId,
type: 'folder',
})
// check if there is already a doc/file/folder with the same name
// in the destination folder
_checkValidElementName(destEntity, entity.name)
// check if the folder being moved is a parent of the destination folder
if (/folder/.test(entityType)) {
const isNestedFolder =
destFolderPath.fileSystem.slice(0, entityPath.fileSystem.length) ===
entityPath.fileSystem
if (isNestedFolder) {
throw new Errors.InvalidNameError(
'destination folder is a child folder of me'
)
}
_checkValidFolderPath(entityPath.fileSystem, destFolderPath.fileSystem)
}
}

View file

@ -37,6 +37,11 @@ describe('ProjectEntityMongoUpdateHandler', function () {
fileSystem: '/test-folder/test-subfolder',
mongo: 'rootFolder.0.folders.0.folders.0',
}
this.notSubfolder = { _id: ObjectId(), name: 'test-folder-2' }
this.notSubfolderPath = {
fileSystem: '/test-folder-2/test-subfolder',
mongo: 'rootFolder.0.folders.0.folders.0',
}
this.folder = {
_id: ObjectId(),
name: 'test-folder',
@ -748,6 +753,19 @@ describe('ProjectEntityMongoUpdateHandler', function () {
).to.be.rejectedWith(Errors.InvalidNameError)
})
})
describe('when moving a folder to a subfolder which starts with the same characters', function () {
it('does not throw an error', async function () {
await expect(
this.subject.promises.moveEntity(
this.project._id,
this.folder._id,
this.notSubfolder._id,
'folder'
)
).not.to.be.rejectedWith(Errors.InvalidNameError)
})
})
})
describe('deleteEntity', function () {