Merge pull request #62940 from gotnospirit/prevent-leading-dot

[3.x] Prevent creating folders or files starting with a dot
This commit is contained in:
Rémi Verschelde 2024-01-10 13:36:31 +01:00
commit 3fa0c97158
No known key found for this signature in database
GPG key ID: C3336907360768E1
7 changed files with 47 additions and 6 deletions

View file

@ -51,15 +51,22 @@ String DirectoryCreateDialog::_validate_path(const String &p_path) const {
return TTR("Folder name cannot be 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) {
return TTR("Folder name contains invalid characters.");
}
const Vector<String> parts = p_path.split("/"); const Vector<String> parts = p_path.split("/");
for (int i = 0; i < parts.size(); i++) { for (int i = 0; i < parts.size(); i++) {
const String part = parts[i]; const String part = parts[i];
if (part.empty()) { if (part.empty()) {
return TTR("Folder name cannot be empty."); return TTR("Folder name cannot be empty.");
} }
if (p_path.find("\\") != -1 || p_path.find(":") != -1 || p_path.find("*") != -1 || if (part.ends_with(" ") || part[0] == ' ') {
p_path.find("|") != -1 || p_path.find(">") != -1 || p_path.ends_with(".") || p_path.ends_with(" ")) { return TTR("Folder name cannot begin or end with a space.");
return TTR("Folder name contains invalid characters."); }
if (part[0] == '.') {
return TTR("Folder name cannot begin with a dot.");
} }
} }

View file

@ -150,7 +150,15 @@ void EditorDirDialog::_make_dir_confirm() {
DirAccessRef d = DirAccess::open(dir); DirAccessRef d = DirAccess::open(dir);
ERR_FAIL_COND_MSG(!d, "Cannot open directory '" + 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) { if (err != OK) {
mkdirerr->popup_centered_minsize(Size2(250, 80) * EDSCALE); mkdirerr->popup_centered_minsize(Size2(250, 80) * EDSCALE);

View file

@ -1083,9 +1083,16 @@ EditorFileDialog::Access EditorFileDialog::get_access() const {
} }
void EditorFileDialog::_make_dir_confirm() { 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) { if (err == OK) {
dir_access->change_dir(makedirname->get_text().strip_edges()); dir_access->change_dir(dir_name);
invalidate(); invalidate();
update_filters(); update_filters();
update_dir(); update_dir();

View file

@ -1797,6 +1797,11 @@ void EditorNode::_dialog_action(String p_file) {
case RESOURCE_SAVE: case RESOURCE_SAVE:
case RESOURCE_SAVE_AS: { case RESOURCE_SAVE_AS: {
ERR_FAIL_COND(saving_resource.is_null()); 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); save_resource_in_path(saving_resource, p_file);
saving_resource = Ref<Resource>(); saving_resource = Ref<Resource>();
ObjectID current = editor_history.get_current(); ObjectID current = editor_history.get_current();

View file

@ -1394,6 +1394,9 @@ void FileSystemDock::_rename_operation_confirm() {
} else if (new_name.find("/") != -1 || new_name.find("\\") != -1 || new_name.find(":") != -1) { } else if (new_name.find("/") != -1 || new_name.find("\\") != -1 || new_name.find(":") != -1) {
EditorNode::get_singleton()->show_warning(TTR("Name contains invalid characters.")); EditorNode::get_singleton()->show_warning(TTR("Name contains invalid characters."));
return; 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()) { } 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())) { 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.")); 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) { } else if (new_name.find("/") != -1 || new_name.find("\\") != -1 || new_name.find(":") != -1) {
EditorNode::get_singleton()->show_warning(TTR("Name contains invalid characters.")); EditorNode::get_singleton()->show_warning(TTR("Name contains invalid characters."));
return; 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(); String base_dir = to_duplicate.path.get_base_dir();

View file

@ -110,6 +110,11 @@ void SceneCreateDialog::update_dialog(Variant p_discard) {
is_valid = false; 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) { if (is_valid) {
scene_name = directory.plus_file(scene_name); scene_name = directory.plus_file(scene_name);
DirAccessRef da = DirAccess::create(DirAccess::ACCESS_RESOURCES); DirAccessRef da = DirAccess::create(DirAccess::ACCESS_RESOURCES);

View file

@ -169,6 +169,9 @@ String ScriptCreateDialog::_validate_path(const String &p_path, bool p_file_must
if (p.get_file().get_basename() == "") { if (p.get_file().get_basename() == "") {
return TTR("Filename is empty."); 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); p = ProjectSettings::get_singleton()->localize_path(p);
if (!p.begins_with("res://")) { if (!p.begins_with("res://")) {