Skip to content

Commit a7ab26c

Browse files
authored
Disallow folders to share the same name as existing files. (#1279)
1 parent 35855da commit a7ab26c

File tree

2 files changed

+33
-4
lines changed

2 files changed

+33
-4
lines changed

portal-ui/src/screens/Console/Buckets/ListBuckets/Objects/ListObjects/CreateFolderModal.tsx

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,18 @@ import { connect } from "react-redux";
2626
import { setFileModeEnabled } from "../../../../ObjectBrowser/actions";
2727
import history from "../../../../../../history";
2828
import { decodeFileName, encodeFileName } from "../../../../../../common/utils";
29+
import { setModalErrorSnackMessage } from "../../../../../../actions";
30+
import { BucketObject } from "./types";
2931

3032
interface ICreateFolder {
3133
classes: any;
3234
modalOpen: boolean;
3335
bucketName: string;
3436
folderName: string;
3537
setFileModeEnabled: typeof setFileModeEnabled;
38+
setModalErrorSnackMessage: typeof setModalErrorSnackMessage;
3639
onClose: () => any;
40+
existingFiles: BucketObject[];
3741
}
3842

3943
const styles = (theme: Theme) =>
@@ -54,7 +58,9 @@ const CreateFolderModal = ({
5458
bucketName,
5559
onClose,
5660
setFileModeEnabled,
61+
setModalErrorSnackMessage,
5762
classes,
63+
existingFiles,
5864
}: ICreateFolder) => {
5965
const [pathUrl, setPathUrl] = useState("");
6066
const [isFormValid, setIsFormValid] = useState<boolean>(false);
@@ -73,6 +79,15 @@ const CreateFolderModal = ({
7379
? decodedFolderName
7480
: `${decodedFolderName}/`;
7581
}
82+
const sharesName = (record: BucketObject) =>
83+
record.name === folderPath + pathUrl;
84+
if (existingFiles.findIndex(sharesName) !== -1) {
85+
setModalErrorSnackMessage({
86+
errorMessage: "Folder cannot have the same name as an existing file",
87+
detailedError: "",
88+
});
89+
return;
90+
}
7691
const newPath = `/buckets/${bucketName}/browse/${encodeFileName(
7792
`${folderPath}${pathUrl}`
7893
)}/`;
@@ -138,6 +153,7 @@ const CreateFolderModal = ({
138153

139154
const mapDispatchToProps = {
140155
setFileModeEnabled,
156+
setModalErrorSnackMessage,
141157
};
142158

143159
const connector = connect(null, mapDispatchToProps);

portal-ui/src/screens/Console/Buckets/ListBuckets/Objects/ListObjects/ListObjects.tsx

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -490,7 +490,6 @@ const ListObjects = ({
490490
? decodedPath
491491
: decodedPath + "/";
492492
}
493-
494493
api
495494
.invoke(
496495
"GET",
@@ -531,10 +530,23 @@ const ListObjects = ({
531530
setFileModeEnabled(false);
532531
setLoading(false);
533532
} else {
534-
// This is an empty folder.
533+
// This code prevents the program from opening a file when a substring of that file is entered as a new folder.
534+
// Previously, if there was a file test1.txt and the folder test was created with the same prefix, the program
535+
// would open test1.txt instead
536+
let found = false;
537+
let pathPrefixChopped = pathPrefix.slice(
538+
0,
539+
pathPrefix.length - 1
540+
);
541+
for (let i = 0; i < res.objects.length; i++) {
542+
if (res.objects[i].name === pathPrefixChopped) {
543+
found = true;
544+
}
545+
}
535546
if (
536-
res.objects.length === 1 &&
537-
res.objects[0].name.endsWith("/")
547+
(res.objects.length === 1 &&
548+
res.objects[0].name.endsWith("/")) ||
549+
!found
538550
) {
539551
setFileModeEnabled(false);
540552
} else {
@@ -1045,6 +1057,7 @@ const ListObjects = ({
10451057
bucketName={bucketName}
10461058
folderName={internalPaths}
10471059
onClose={closeAddFolderModal}
1060+
existingFiles={records}
10481061
/>
10491062
)}
10501063
{rewindSelect && (

0 commit comments

Comments
 (0)