From f13d8456c97d163a80a028d84b043b5c8d1aec80 Mon Sep 17 00:00:00 2001 From: Its-treason <39559178+Its-treason@users.noreply.github.com> Date: Wed, 4 Oct 2023 16:55:15 +0200 Subject: [PATCH] fix: Fix name validation consistency --- .../EnvironmentSettings/CreateEnvironment/index.js | 2 ++ .../EnvironmentSettings/RenameEnvironment/index.js | 2 ++ .../Collection/CollectionItem/RenameCollectionItem/index.js | 2 ++ .../src/components/Sidebar/CreateCollection/index.js | 3 ++- packages/bruno-app/src/components/Sidebar/NewFolder/index.js | 2 ++ .../bruno-app/src/components/Sidebar/NewRequest/index.js | 2 ++ packages/bruno-app/src/utils/common/regex.js | 3 +++ packages/bruno-electron/src/ipc/collection.js | 5 ----- 8 files changed, 15 insertions(+), 6 deletions(-) create mode 100644 packages/bruno-app/src/utils/common/regex.js diff --git a/packages/bruno-app/src/components/Environments/EnvironmentSettings/CreateEnvironment/index.js b/packages/bruno-app/src/components/Environments/EnvironmentSettings/CreateEnvironment/index.js index d412687e25..567ce9957e 100644 --- a/packages/bruno-app/src/components/Environments/EnvironmentSettings/CreateEnvironment/index.js +++ b/packages/bruno-app/src/components/Environments/EnvironmentSettings/CreateEnvironment/index.js @@ -6,6 +6,7 @@ import { useFormik } from 'formik'; import { addEnvironment } from 'providers/ReduxStore/slices/collections/actions'; import * as Yup from 'yup'; import { useDispatch } from 'react-redux'; +import { filenameRegex } from 'utils/common/regex'; const CreateEnvironment = ({ collection, onClose }) => { const dispatch = useDispatch(); @@ -19,6 +20,7 @@ const CreateEnvironment = ({ collection, onClose }) => { name: Yup.string() .min(1, 'must be atleast 1 characters') .max(50, 'must be 50 characters or less') + .matches(filenameRegex, 'Folder name contains invalid characters') .required('name is required') }), onSubmit: (values) => { diff --git a/packages/bruno-app/src/components/Environments/EnvironmentSettings/RenameEnvironment/index.js b/packages/bruno-app/src/components/Environments/EnvironmentSettings/RenameEnvironment/index.js index dc928d4c68..dd10b33651 100644 --- a/packages/bruno-app/src/components/Environments/EnvironmentSettings/RenameEnvironment/index.js +++ b/packages/bruno-app/src/components/Environments/EnvironmentSettings/RenameEnvironment/index.js @@ -6,6 +6,7 @@ import { useFormik } from 'formik'; import { renameEnvironment } from 'providers/ReduxStore/slices/collections/actions'; import * as Yup from 'yup'; import { useDispatch } from 'react-redux'; +import { filenameRegex } from 'utils/common/regex'; const RenameEnvironment = ({ onClose, environment, collection }) => { const dispatch = useDispatch(); @@ -19,6 +20,7 @@ const RenameEnvironment = ({ onClose, environment, collection }) => { name: Yup.string() .min(1, 'must be atleast 1 characters') .max(50, 'must be 50 characters or less') + .matches(filenameRegex, 'Folder name contains invalid characters') .required('name is required') }), onSubmit: (values) => { diff --git a/packages/bruno-app/src/components/Sidebar/Collections/Collection/CollectionItem/RenameCollectionItem/index.js b/packages/bruno-app/src/components/Sidebar/Collections/Collection/CollectionItem/RenameCollectionItem/index.js index 9b485e9928..8acfeb3b4f 100644 --- a/packages/bruno-app/src/components/Sidebar/Collections/Collection/CollectionItem/RenameCollectionItem/index.js +++ b/packages/bruno-app/src/components/Sidebar/Collections/Collection/CollectionItem/RenameCollectionItem/index.js @@ -5,6 +5,7 @@ import Modal from 'components/Modal'; import { useDispatch } from 'react-redux'; import { isItemAFolder } from 'utils/tabs'; import { renameItem } from 'providers/ReduxStore/slices/collections/actions'; +import { filenameRegex } from 'utils/common/regex'; const RenameCollectionItem = ({ collection, item, onClose }) => { const dispatch = useDispatch(); @@ -19,6 +20,7 @@ const RenameCollectionItem = ({ collection, item, onClose }) => { name: Yup.string() .min(1, 'must be atleast 1 characters') .max(50, 'must be 50 characters or less') + .matches(filenameRegex, `${isFolder ? 'folder' : 'request'} name contains invalid characters`) .required('name is required') }), onSubmit: (values) => { diff --git a/packages/bruno-app/src/components/Sidebar/CreateCollection/index.js b/packages/bruno-app/src/components/Sidebar/CreateCollection/index.js index 9b56ca1b87..0dcba27bab 100644 --- a/packages/bruno-app/src/components/Sidebar/CreateCollection/index.js +++ b/packages/bruno-app/src/components/Sidebar/CreateCollection/index.js @@ -7,6 +7,7 @@ import { createCollection } from 'providers/ReduxStore/slices/collections/action import toast from 'react-hot-toast'; import Tooltip from 'components/Tooltip'; import Modal from 'components/Modal'; +import { filenameRegex } from 'utils/common/regex'; const CreateCollection = ({ onClose }) => { const inputRef = useRef(); @@ -27,7 +28,7 @@ const CreateCollection = ({ onClose }) => { collectionFolderName: Yup.string() .min(1, 'must be atleast 1 characters') .max(50, 'must be 50 characters or less') - .matches(/^[\w\-. ]+$/, 'Folder name contains invalid characters') + .matches(filenameRegex, 'Folder name contains invalid characters') .required('folder name is required'), collectionLocation: Yup.string() .min(1, 'location is required') diff --git a/packages/bruno-app/src/components/Sidebar/NewFolder/index.js b/packages/bruno-app/src/components/Sidebar/NewFolder/index.js index 9245d7abc6..1513b811b6 100644 --- a/packages/bruno-app/src/components/Sidebar/NewFolder/index.js +++ b/packages/bruno-app/src/components/Sidebar/NewFolder/index.js @@ -5,6 +5,7 @@ import * as Yup from 'yup'; import Modal from 'components/Modal'; import { useDispatch } from 'react-redux'; import { newFolder } from 'providers/ReduxStore/slices/collections/actions'; +import { filenameRegex } from 'utils/common/regex'; const NewFolder = ({ collection, item, onClose }) => { const dispatch = useDispatch(); @@ -18,6 +19,7 @@ const NewFolder = ({ collection, item, onClose }) => { folderName: Yup.string() .min(1, 'must be atleast 1 characters') .required('name is required') + .matches(filenameRegex, 'Folder name contains invalid characters') .test({ name: 'folderName', message: 'The folder name "environments" at the root of the collection is reserved in bruno', diff --git a/packages/bruno-app/src/components/Sidebar/NewRequest/index.js b/packages/bruno-app/src/components/Sidebar/NewRequest/index.js index f5753aced0..764ee1e29d 100644 --- a/packages/bruno-app/src/components/Sidebar/NewRequest/index.js +++ b/packages/bruno-app/src/components/Sidebar/NewRequest/index.js @@ -11,6 +11,7 @@ import { addTab } from 'providers/ReduxStore/slices/tabs'; import HttpMethodSelector from 'components/RequestPane/QueryUrl/HttpMethodSelector'; import { getDefaultRequestPaneTab } from 'utils/collections'; import StyledWrapper from './StyledWrapper'; +import { filenameRegex } from 'utils/common/regex'; const NewRequest = ({ collection, item, isEphemeral, onClose }) => { const dispatch = useDispatch(); @@ -27,6 +28,7 @@ const NewRequest = ({ collection, item, isEphemeral, onClose }) => { requestName: Yup.string() .min(1, 'must be atleast 1 characters') .required('name is required') + .matches(filenameRegex, 'request name contains invalid characters') .test({ name: 'requestName', message: 'The request name "index" is reserved in bruno', diff --git a/packages/bruno-app/src/utils/common/regex.js b/packages/bruno-app/src/utils/common/regex.js new file mode 100644 index 0000000000..d070897105 --- /dev/null +++ b/packages/bruno-app/src/utils/common/regex.js @@ -0,0 +1,3 @@ +// Regex for validating filenames that covers most cases +// See TODO PULL LINK for more info +export const filenameRegex = /^(?!CON|PRN|AUX|NUL|COM\d|LPT\d|^ |^\-)[\w\-\. \(\)\[\]]+[^\. ]$/ diff --git a/packages/bruno-electron/src/ipc/collection.js b/packages/bruno-electron/src/ipc/collection.js index ae85558afe..5e7b4b55d2 100644 --- a/packages/bruno-electron/src/ipc/collection.js +++ b/packages/bruno-electron/src/ipc/collection.js @@ -5,7 +5,6 @@ const { ipcMain, shell } = require('electron'); const { envJsonToBru, bruToJson, jsonToBru } = require('../bru'); const { - isValidPathname, writeFile, hasBruExtension, isDirectory, @@ -51,10 +50,6 @@ const registerRendererEventHandlers = (mainWindow, watcher, lastOpenedCollection throw new Error(`collection: ${dirPath} already exists`); } - if (!isValidPathname(dirPath)) { - throw new Error(`collection: invalid pathname - ${dir}`); - } - await createDirectory(dirPath); const uid = generateUidBasedOnHash(dirPath);