From 4870920918742e3d2a69b0992651a7dcc9e5a1a9 Mon Sep 17 00:00:00 2001 From: Marc-Roig Date: Wed, 17 May 2023 18:08:02 +0200 Subject: [PATCH 1/2] fix: improve path match on check if folder is movable --- .../server/controllers/validation/admin/folder-file.js | 6 +++++- .../upload/server/controllers/validation/admin/folder.js | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/core/upload/server/controllers/validation/admin/folder-file.js b/packages/core/upload/server/controllers/validation/admin/folder-file.js index 67bb8e823e..8efbb999a5 100644 --- a/packages/core/upload/server/controllers/validation/admin/folder-file.js +++ b/packages/core/upload/server/controllers/validation/admin/folder-file.js @@ -75,7 +75,11 @@ const validateMoveFoldersNotInsideThemselvesSchema = yup }); const unmovableFoldersNames = folders - .filter((folder) => destinationFolder.path.startsWith(folder.path)) + .filter( + (folder) => + destinationFolder.path === folder.path || + destinationFolder.path.startsWith(`${folder.path}/`) + ) .map((f) => f.name); if (unmovableFoldersNames.length > 0) { return this.createError({ diff --git a/packages/core/upload/server/controllers/validation/admin/folder.js b/packages/core/upload/server/controllers/validation/admin/folder.js index 540740e8cc..9dfb0edbea 100644 --- a/packages/core/upload/server/controllers/validation/admin/folder.js +++ b/packages/core/upload/server/controllers/validation/admin/folder.js @@ -78,7 +78,11 @@ const validateUpdateFolderSchema = (id) => if (!destinationFolder || !currentFolder) return true; - return !destinationFolder.path.startsWith(currentFolder.path); + const isUnMovable = + destinationFolder.path === currentFolder.path || + destinationFolder.path.startsWith(`${currentFolder.path}/`); + + return !isUnMovable; } ), }) From 087ff3765bdc0e63c7365b01ad8541c0e31eb0c1 Mon Sep 17 00:00:00 2001 From: Marc-Roig Date: Mon, 22 May 2023 10:06:37 +0200 Subject: [PATCH 2/2] chore: create util to check if folder is the same as another one or a child one --- packages/core/upload/server/controllers/utils/folders.js | 8 ++++++++ .../server/controllers/validation/admin/folder-file.js | 7 ++----- .../upload/server/controllers/validation/admin/folder.js | 7 ++----- 3 files changed, 12 insertions(+), 10 deletions(-) create mode 100644 packages/core/upload/server/controllers/utils/folders.js diff --git a/packages/core/upload/server/controllers/utils/folders.js b/packages/core/upload/server/controllers/utils/folders.js new file mode 100644 index 0000000000..52b63b477c --- /dev/null +++ b/packages/core/upload/server/controllers/utils/folders.js @@ -0,0 +1,8 @@ +'use strict'; + +const isFolderOrChild = (folderOrChild, folder) => + folderOrChild.path === folder.path || folderOrChild.path.startsWith(`${folder.path}/`); + +module.exports = { + isFolderOrChild, +}; diff --git a/packages/core/upload/server/controllers/validation/admin/folder-file.js b/packages/core/upload/server/controllers/validation/admin/folder-file.js index 8efbb999a5..d28df91c05 100644 --- a/packages/core/upload/server/controllers/validation/admin/folder-file.js +++ b/packages/core/upload/server/controllers/validation/admin/folder-file.js @@ -4,6 +4,7 @@ const { intersection, map, isEmpty } = require('lodash/fp'); const { yup, validateYupSchema } = require('@strapi/utils'); const { FOLDER_MODEL_UID } = require('../../../constants'); const { folderExists } = require('./utils'); +const { isFolderOrChild } = require('../../utils/folders'); const validateDeleteManyFoldersFilesSchema = yup .object() @@ -75,11 +76,7 @@ const validateMoveFoldersNotInsideThemselvesSchema = yup }); const unmovableFoldersNames = folders - .filter( - (folder) => - destinationFolder.path === folder.path || - destinationFolder.path.startsWith(`${folder.path}/`) - ) + .filter((folder) => isFolderOrChild(destinationFolder, folder)) .map((f) => f.name); if (unmovableFoldersNames.length > 0) { return this.createError({ diff --git a/packages/core/upload/server/controllers/validation/admin/folder.js b/packages/core/upload/server/controllers/validation/admin/folder.js index 9dfb0edbea..a457edd7b5 100644 --- a/packages/core/upload/server/controllers/validation/admin/folder.js +++ b/packages/core/upload/server/controllers/validation/admin/folder.js @@ -5,6 +5,7 @@ const { yup, validateYupSchema } = require('@strapi/utils'); const { getService } = require('../../../utils'); const { FOLDER_MODEL_UID } = require('../../../constants'); const { folderExists } = require('./utils'); +const { isFolderOrChild } = require('../../utils/folders'); const NO_SLASH_REGEX = /^[^/]+$/; const NO_SPACES_AROUND = /^(?! ).+(? if (!destinationFolder || !currentFolder) return true; - const isUnMovable = - destinationFolder.path === currentFolder.path || - destinationFolder.path.startsWith(`${currentFolder.path}/`); - - return !isUnMovable; + return !isFolderOrChild(destinationFolder, currentFolder); } ), })