Only allow absolute paths in XDG environment variables

The XDG Base Directory specification does not allow using relative paths
(which broke things in Godot anyway). If a relative path is detected,
it should be ignored.

(cherry picked from commits 011a99316a
and 0e1d45b210)
This commit is contained in:
Hugo Locurcio 2021-05-07 19:02:35 +02:00 committed by Rémi Verschelde
parent 3f89287ddb
commit 12236d2868
No known key found for this signature in database
GPG key ID: C3336907360768E1
3 changed files with 82 additions and 42 deletions

View file

@ -2238,31 +2238,45 @@ MainLoop *OS_OSX::get_main_loop() const {
} }
String OS_OSX::get_config_path() const { String OS_OSX::get_config_path() const {
// The XDG Base Directory specification technically only applies on Linux/*BSD, but it doesn't hurt to support it on macOS as well.
if (has_environment("XDG_CONFIG_HOME")) { if (has_environment("XDG_CONFIG_HOME")) {
return get_environment("XDG_CONFIG_HOME"); if (get_environment("XDG_CONFIG_HOME").is_abs_path()) {
} else if (has_environment("HOME")) { return get_environment("XDG_CONFIG_HOME");
return get_environment("HOME").plus_file("Library/Application Support"); } else {
} else { WARN_PRINT_ONCE("`XDG_CONFIG_HOME` is a relative path. Ignoring its value and falling back to `$HOME/Library/Application Support` or `.` per the XDG Base Directory specification.");
return "."; }
} }
if (has_environment("HOME")) {
return get_environment("HOME").plus_file("Library/Application Support");
}
return ".";
} }
String OS_OSX::get_data_path() const { String OS_OSX::get_data_path() const {
// The XDG Base Directory specification technically only applies on Linux/*BSD, but it doesn't hurt to support it on macOS as well.
if (has_environment("XDG_DATA_HOME")) { if (has_environment("XDG_DATA_HOME")) {
return get_environment("XDG_DATA_HOME"); if (get_environment("XDG_DATA_HOME").is_abs_path()) {
} else { return get_environment("XDG_DATA_HOME");
return get_config_path(); } else {
WARN_PRINT_ONCE("`XDG_DATA_HOME` is a relative path. Ignoring its value and falling back to `get_config_path()` per the XDG Base Directory specification.");
}
} }
return get_config_path();
} }
String OS_OSX::get_cache_path() const { String OS_OSX::get_cache_path() const {
// The XDG Base Directory specification technically only applies on Linux/*BSD, but it doesn't hurt to support it on macOS as well.
if (has_environment("XDG_CACHE_HOME")) { if (has_environment("XDG_CACHE_HOME")) {
return get_environment("XDG_CACHE_HOME"); if (get_environment("XDG_CACHE_HOME").is_abs_path()) {
} else if (has_environment("HOME")) { return get_environment("XDG_CACHE_HOME");
return get_environment("HOME").plus_file("Library/Caches"); } else {
} else { WARN_PRINT_ONCE("`XDG_CACHE_HOME` is a relative path. Ignoring its value and falling back to `$HOME/Libary/Caches` or `get_config_path()` per the XDG Base Directory specification.");
return get_config_path(); }
} }
if (has_environment("HOME")) {
return get_environment("HOME").plus_file("Library/Caches");
}
return get_config_path();
} }
String OS_OSX::get_bundle_resource_dir() const { String OS_OSX::get_bundle_resource_dir() const {

View file

@ -3316,31 +3316,45 @@ MainLoop *OS_Windows::get_main_loop() const {
} }
String OS_Windows::get_config_path() const { String OS_Windows::get_config_path() const {
if (has_environment("XDG_CONFIG_HOME")) { // unlikely, but after all why not? // The XDG Base Directory specification technically only applies on Linux/*BSD, but it doesn't hurt to support it on Windows as well.
return get_environment("XDG_CONFIG_HOME"); if (has_environment("XDG_CONFIG_HOME")) {
} else if (has_environment("APPDATA")) { if (get_environment("XDG_CONFIG_HOME").is_abs_path()) {
return get_environment("APPDATA"); return get_environment("XDG_CONFIG_HOME");
} else { } else {
return "."; WARN_PRINT_ONCE("`XDG_CONFIG_HOME` is a relative path. Ignoring its value and falling back to `%APPDATA%` or `.` per the XDG Base Directory specification.");
}
} }
if (has_environment("APPDATA")) {
return get_environment("APPDATA");
}
return ".";
} }
String OS_Windows::get_data_path() const { String OS_Windows::get_data_path() const {
// The XDG Base Directory specification technically only applies on Linux/*BSD, but it doesn't hurt to support it on Windows as well.
if (has_environment("XDG_DATA_HOME")) { if (has_environment("XDG_DATA_HOME")) {
return get_environment("XDG_DATA_HOME"); if (get_environment("XDG_DATA_HOME").is_abs_path()) {
} else { return get_environment("XDG_DATA_HOME");
return get_config_path(); } else {
WARN_PRINT_ONCE("`XDG_DATA_HOME` is a relative path. Ignoring its value and falling back to `get_config_path()` per the XDG Base Directory specification.");
}
} }
return get_config_path();
} }
String OS_Windows::get_cache_path() const { String OS_Windows::get_cache_path() const {
// The XDG Base Directory specification technically only applies on Linux/*BSD, but it doesn't hurt to support it on Windows as well.
if (has_environment("XDG_CACHE_HOME")) { if (has_environment("XDG_CACHE_HOME")) {
return get_environment("XDG_CACHE_HOME"); if (get_environment("XDG_CACHE_HOME").is_abs_path()) {
} else if (has_environment("TEMP")) { return get_environment("XDG_CACHE_HOME");
return get_environment("TEMP"); } else {
} else { WARN_PRINT_ONCE("`XDG_CACHE_HOME` is a relative path. Ignoring its value and falling back to `%TEMP%` or `get_config_path()` per the XDG Base Directory specification.");
return get_config_path(); }
} }
if (has_environment("TEMP")) {
return get_environment("TEMP");
}
return get_config_path();
} }
// Get properly capitalized engine name for system paths // Get properly capitalized engine name for system paths

View file

@ -3208,32 +3208,44 @@ bool OS_X11::_check_internal_feature_support(const String &p_feature) {
String OS_X11::get_config_path() const { String OS_X11::get_config_path() const {
if (has_environment("XDG_CONFIG_HOME")) { if (has_environment("XDG_CONFIG_HOME")) {
return get_environment("XDG_CONFIG_HOME"); if (get_environment("XDG_CONFIG_HOME").is_abs_path()) {
} else if (has_environment("HOME")) { return get_environment("XDG_CONFIG_HOME");
return get_environment("HOME").plus_file(".config"); } else {
} else { WARN_PRINT_ONCE("`XDG_CONFIG_HOME` is a relative path. Ignoring its value and falling back to `$HOME/.config` or `.` per the XDG Base Directory specification.");
return "."; }
} }
if (has_environment("HOME")) {
return get_environment("HOME").plus_file(".config");
}
return ".";
} }
String OS_X11::get_data_path() const { String OS_X11::get_data_path() const {
if (has_environment("XDG_DATA_HOME")) { if (has_environment("XDG_DATA_HOME")) {
return get_environment("XDG_DATA_HOME"); if (get_environment("XDG_DATA_HOME").is_abs_path()) {
} else if (has_environment("HOME")) { return get_environment("XDG_DATA_HOME");
return get_environment("HOME").plus_file(".local/share"); } else {
} else { WARN_PRINT_ONCE("`XDG_DATA_HOME` is a relative path. Ignoring its value and falling back to `$HOME/.local/share` or `get_config_path()` per the XDG Base Directory specification.");
return get_config_path(); }
} }
if (has_environment("HOME")) {
return get_environment("HOME").plus_file(".local/share");
}
return get_config_path();
} }
String OS_X11::get_cache_path() const { String OS_X11::get_cache_path() const {
if (has_environment("XDG_CACHE_HOME")) { if (has_environment("XDG_CACHE_HOME")) {
return get_environment("XDG_CACHE_HOME"); if (get_environment("XDG_CACHE_HOME").is_abs_path()) {
} else if (has_environment("HOME")) { return get_environment("XDG_CACHE_HOME");
return get_environment("HOME").plus_file(".cache"); } else {
} else { WARN_PRINT_ONCE("`XDG_CACHE_HOME` is a relative path. Ignoring its value and falling back to `$HOME/.cache` or `get_config_path()` per the XDG Base Directory specification.");
return get_config_path(); }
} }
if (has_environment("HOME")) {
return get_environment("HOME").plus_file(".cache");
}
return get_config_path();
} }
String OS_X11::get_system_dir(SystemDir p_dir) const { String OS_X11::get_system_dir(SystemDir p_dir) const {