From 6782738a8591e403e04633a508273ded4c79ea4e Mon Sep 17 00:00:00 2001 From: James Date: Tue, 12 Jul 2022 15:51:18 +0800 Subject: [PATCH] Prevent using name with leading dot when create/rename/duplicate scene/folder/script/resource Fixes #62497 --- editor/directory_create_dialog.cpp | 13 ++++++++++--- editor/editor_dir_dialog.cpp | 10 +++++++++- editor/editor_file_dialog.cpp | 11 +++++++++-- editor/editor_node.cpp | 5 +++++ editor/filesystem_dock.cpp | 6 ++++++ editor/scene_create_dialog.cpp | 5 +++++ editor/script_create_dialog.cpp | 3 +++ 7 files changed, 47 insertions(+), 6 deletions(-) diff --git a/editor/directory_create_dialog.cpp b/editor/directory_create_dialog.cpp index 7b918ea5530a5..931171875a5e9 100644 --- a/editor/directory_create_dialog.cpp +++ b/editor/directory_create_dialog.cpp @@ -51,15 +51,22 @@ String DirectoryCreateDialog::_validate_path(const String &p_path) const { return TTR("Folder name cannot be empty."); } + if (p_path.find("\\") != -1 || p_path.find(":") != -1 || p_path.find("*") != -1 || + p_path.find("|") != -1 || p_path.find(">") != -1) { + return TTR("Folder name contains invalid characters."); + } + const Vector parts = p_path.split("/"); for (int i = 0; i < parts.size(); i++) { const String part = parts[i]; if (part.empty()) { return TTR("Folder name cannot be empty."); } - if (p_path.find("\\") != -1 || p_path.find(":") != -1 || p_path.find("*") != -1 || - p_path.find("|") != -1 || p_path.find(">") != -1 || p_path.ends_with(".") || p_path.ends_with(" ")) { - return TTR("Folder name contains invalid characters."); + if (part.ends_with(" ") || part[0] == ' ') { + return TTR("Folder name cannot begin or end with a space."); + } + if (part[0] == '.') { + return TTR("Folder name cannot begin with a dot."); } } diff --git a/editor/editor_dir_dialog.cpp b/editor/editor_dir_dialog.cpp index 4648365d34838..d54c9ad559448 100644 --- a/editor/editor_dir_dialog.cpp +++ b/editor/editor_dir_dialog.cpp @@ -150,7 +150,15 @@ void EditorDirDialog::_make_dir_confirm() { DirAccessRef d = DirAccess::open(dir); ERR_FAIL_COND_MSG(!d, "Cannot open directory '" + dir + "'."); - Error err = d->make_dir(makedirname->get_text()); + + String dir_name = makedirname->get_text(); + if (dir_name.begins_with(".")) { + mkdirerr->set_text(TTR("Could not use a name with a leading dot.")); + mkdirerr->popup_centered_minsize(Size2(250, 80) * EDSCALE); + return; + } + + Error err = d->make_dir(dir_name); if (err != OK) { mkdirerr->popup_centered_minsize(Size2(250, 80) * EDSCALE); diff --git a/editor/editor_file_dialog.cpp b/editor/editor_file_dialog.cpp index 4317411299358..13d4df025cc67 100644 --- a/editor/editor_file_dialog.cpp +++ b/editor/editor_file_dialog.cpp @@ -1083,9 +1083,16 @@ EditorFileDialog::Access EditorFileDialog::get_access() const { } void EditorFileDialog::_make_dir_confirm() { - Error err = dir_access->make_dir(makedirname->get_text().strip_edges()); + String dir_name = makedirname->get_text().strip_edges(); + if (dir_name.begins_with(".")) { + mkdirerr->set_text(TTR("Could not use a name with a leading dot.")); + mkdirerr->popup_centered_minsize(Size2(250, 50) * EDSCALE); + return; + } + + Error err = dir_access->make_dir(dir_name); if (err == OK) { - dir_access->change_dir(makedirname->get_text().strip_edges()); + dir_access->change_dir(dir_name); invalidate(); update_filters(); update_dir(); diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp index 965adf4269185..19957e315cf05 100644 --- a/editor/editor_node.cpp +++ b/editor/editor_node.cpp @@ -1797,6 +1797,11 @@ void EditorNode::_dialog_action(String p_file) { case RESOURCE_SAVE: case RESOURCE_SAVE_AS: { ERR_FAIL_COND(saving_resource.is_null()); + if (p_file.get_file().begins_with(".")) { + show_accept(TTR("Could not use a name with a leading dot."), TTR("OK")); + return; + } + save_resource_in_path(saving_resource, p_file); saving_resource = Ref(); ObjectID current = editor_history.get_current(); diff --git a/editor/filesystem_dock.cpp b/editor/filesystem_dock.cpp index 566206f83c0c7..26d5f457005dc 100644 --- a/editor/filesystem_dock.cpp +++ b/editor/filesystem_dock.cpp @@ -1394,6 +1394,9 @@ void FileSystemDock::_rename_operation_confirm() { } else if (new_name.find("/") != -1 || new_name.find("\\") != -1 || new_name.find(":") != -1) { EditorNode::get_singleton()->show_warning(TTR("Name contains invalid characters.")); return; + } else if (new_name[0] == '.') { + EditorNode::get_singleton()->show_warning(TTR("This filename begins with a dot rendering the file invisible to the editor.\nIf you want to rename it anyway, use your operating system's file manager.")); + return; } else if (to_rename.is_file && to_rename.path.get_extension() != new_name.get_extension()) { if (!EditorFileSystem::get_singleton()->get_valid_extensions().find(new_name.get_extension())) { EditorNode::get_singleton()->show_warning(TTR("This file extension is not recognized by the editor.\nIf you want to rename it anyway, use your operating system's file manager.\nAfter renaming to an unknown extension, the file won't be shown in the editor anymore.")); @@ -1456,6 +1459,9 @@ void FileSystemDock::_duplicate_operation_confirm() { } else if (new_name.find("/") != -1 || new_name.find("\\") != -1 || new_name.find(":") != -1) { EditorNode::get_singleton()->show_warning(TTR("Name contains invalid characters.")); return; + } else if (new_name[0] == '.') { + EditorNode::get_singleton()->show_warning(TTR("Name begins with a dot.")); + return; } String base_dir = to_duplicate.path.get_base_dir(); diff --git a/editor/scene_create_dialog.cpp b/editor/scene_create_dialog.cpp index e97ae5082b3d7..42445a29c0530 100644 --- a/editor/scene_create_dialog.cpp +++ b/editor/scene_create_dialog.cpp @@ -110,6 +110,11 @@ void SceneCreateDialog::update_dialog(Variant p_discard) { is_valid = false; } + if (is_valid && scene_name[0] == '.') { + update_error(file_error_label, MSG_ERROR, TTR("File name begins with a dot.")); + is_valid = false; + } + if (is_valid) { scene_name = directory.plus_file(scene_name); DirAccessRef da = DirAccess::create(DirAccess::ACCESS_RESOURCES); diff --git a/editor/script_create_dialog.cpp b/editor/script_create_dialog.cpp index ec39db04f7b0e..ae49f6243d4e9 100644 --- a/editor/script_create_dialog.cpp +++ b/editor/script_create_dialog.cpp @@ -169,6 +169,9 @@ String ScriptCreateDialog::_validate_path(const String &p_path, bool p_file_must if (p.get_file().get_basename() == "") { return TTR("Filename is empty."); } + if (p.get_file().begins_with(".")) { + return TTR("Name begins with a dot."); + } p = ProjectSettings::get_singleton()->localize_path(p); if (!p.begins_with("res://")) {