From 7aa72a75079d6aeab2c05acabd00640835b0ea3d Mon Sep 17 00:00:00 2001 From: akallabeth Date: Thu, 6 Jun 2024 11:17:55 +0200 Subject: [PATCH] [core,settings] unify configuration paths * Add new function freerdp_settings_get_config_path to get current user configuration directory * Add CMake option WITH_FULL_CONFIG_PATH (default OFF): If defined, use /Vendor/Product as config directory, otherwise use /vendor (lowercase, only if vendor equal to product) --- client/SDL/common/CMakeLists.txt | 2 +- client/SDL/common/sdl_prefs.cpp | 5 +-- cmake/ConfigOptions.cmake | 2 + include/freerdp/settings.h | 4 ++ libfreerdp/CMakeLists.txt | 4 ++ libfreerdp/core/settings.c | 74 ++++++++++++++++---------------- server/shadow/shadow_server.c | 54 +---------------------- 7 files changed, 51 insertions(+), 94 deletions(-) diff --git a/client/SDL/common/CMakeLists.txt b/client/SDL/common/CMakeLists.txt index 9102aaa1a..9da9feb8a 100644 --- a/client/SDL/common/CMakeLists.txt +++ b/client/SDL/common/CMakeLists.txt @@ -23,7 +23,7 @@ add_library(sdl-common-prefs STATIC sdl_prefs.hpp sdl_prefs.cpp ) -target_link_libraries(sdl-common-prefs winpr) +target_link_libraries(sdl-common-prefs winpr freerdp) if(BUILD_TESTING) add_subdirectory(test) diff --git a/client/SDL/common/sdl_prefs.cpp b/client/SDL/common/sdl_prefs.cpp index f73393906..751c818c5 100644 --- a/client/SDL/common/sdl_prefs.cpp +++ b/client/SDL/common/sdl_prefs.cpp @@ -34,6 +34,7 @@ namespace fs = std::experimental::filesystem; #include #include #include +#include SdlPref::WINPR_JSONPtr SdlPref::get() { @@ -108,13 +109,11 @@ SdlPref::SdlPref(const std::string& file) : _name(file), _config(get()) std::string SdlPref::get_pref_dir() { using CStringPtr = std::unique_ptr; - CStringPtr path(GetKnownPath(KNOWN_PATH_XDG_CONFIG_HOME), free); + CStringPtr path(freerdp_settings_get_config_path(), free); if (!path) return {}; fs::path config{ path.get() }; - config /= FREERDP_VENDOR; - config /= FREERDP_PRODUCT; return config.string(); } diff --git a/cmake/ConfigOptions.cmake b/cmake/ConfigOptions.cmake index 7f3ffb860..89008c2dc 100644 --- a/cmake/ConfigOptions.cmake +++ b/cmake/ConfigOptions.cmake @@ -237,3 +237,5 @@ if (BUILD_FUZZERS) > ) endif() + +option(WITH_FULL_CONFIG_PATH "Use /Vendor/Product instead of /product (lowercase, only if vendor equals product) as config directory" OFF) diff --git a/include/freerdp/settings.h b/include/freerdp/settings.h index 705ba45d3..c3fa6803b 100644 --- a/include/freerdp/settings.h +++ b/include/freerdp/settings.h @@ -713,6 +713,10 @@ typedef struct rdp_settings rdpSettings; FREERDP_API const char* freerdp_supported_color_depths_string(UINT16 mask, char* buffer, size_t size); + /** \brief return the configuration directory for the library + */ + FREERDP_API char* freerdp_settings_get_config_path(void); + #ifdef __cplusplus } #endif diff --git a/libfreerdp/CMakeLists.txt b/libfreerdp/CMakeLists.txt index 01ac8d892..12668c466 100644 --- a/libfreerdp/CMakeLists.txt +++ b/libfreerdp/CMakeLists.txt @@ -398,6 +398,10 @@ AddTargetWithResourceFile(${MODULE_NAME} FALSE "${FREERDP_VERSION}" LIBFREERDP_S add_definitions(${LIBFREERDP_DEFINITIONS}) +if (WITH_FULL_CONFIG_PATH) + add_definitions(-DWITH_FULL_CONFIG_PATH) +endif() + target_include_directories(${MODULE_NAME} INTERFACE $) target_link_libraries(${MODULE_NAME} PRIVATE ${LIBFREERDP_LIBS}) target_link_libraries(${MODULE_NAME} PUBLIC ${LIBFREERDP_PUB_LIBS}) diff --git a/libfreerdp/core/settings.c b/libfreerdp/core/settings.c index 3cfbecfdd..bade4af22 100644 --- a/libfreerdp/core/settings.c +++ b/libfreerdp/core/settings.c @@ -350,9 +350,39 @@ BOOL freerdp_capability_buffer_allocate(rdpSettings* settings, UINT32 count) settings->ReceivedCapabilityDataSizes); } +#if !defined(WITH_FULL_CONFIG_PATH) +static char* freerdp_settings_get_legacy_config_path(void) +{ + char product[sizeof(FREERDP_PRODUCT_STRING)] = { 0 }; + + for (size_t i = 0; i < sizeof(product); i++) + product[i] = tolower(FREERDP_PRODUCT_STRING[i]); + + return GetKnownSubPath(KNOWN_PATH_XDG_CONFIG_HOME, product); +} +#endif + +char* freerdp_settings_get_config_path(void) +{ + char* path = NULL; + /* For default FreeRDP continue using same config directory + * as in old releases. + * Custom builds use / as config folder. */ +#if !defined(WITH_FULL_CONFIG_PATH) + if (_stricmp(FREERDP_VENDOR_STRING, FREERDP_PRODUCT_STRING) == 0) + return freerdp_settings_get_legacy_config_path(); +#endif + + char* base = GetKnownSubPath(KNOWN_PATH_XDG_CONFIG_HOME, FREERDP_VENDOR_STRING); + if (base) + path = GetCombinedPath(base, FREERDP_PRODUCT_STRING); + free(base); + + return path; +} + rdpSettings* freerdp_settings_new(DWORD flags) { - char* base = NULL; char* issuers[] = { "FreeRDP", "FreeRDP-licenser" }; const BOOL server = (flags & FREERDP_SETTINGS_SERVER_MODE) != 0 ? TRUE : FALSE; const BOOL remote = (flags & FREERDP_SETTINGS_REMOTE_MODE) != 0 ? TRUE : FALSE; @@ -728,7 +758,7 @@ rdpSettings* freerdp_settings_new(DWORD flags) if (!freerdp_settings_get_bool(settings, FreeRDP_ServerMode)) { - BOOL rc = 0; + BOOL rc = FALSE; char* path = NULL; if (!freerdp_settings_set_bool(settings, FreeRDP_RedirectClipboard, TRUE)) goto out_fail; @@ -740,42 +770,10 @@ rdpSettings* freerdp_settings_new(DWORD flags) if (!rc || !freerdp_settings_get_string(settings, FreeRDP_HomePath)) goto out_fail; - /* For default FreeRDP continue using same config directory - * as in old releases. - * Custom builds use / as config folder. */ - if (_stricmp(FREERDP_VENDOR_STRING, FREERDP_PRODUCT_STRING)) - { - BOOL res = TRUE; - base = GetKnownSubPath(KNOWN_PATH_XDG_CONFIG_HOME, FREERDP_VENDOR_STRING); - - if (base) - { - char* combined = GetCombinedPath(base, FREERDP_PRODUCT_STRING); - res = freerdp_settings_set_string(settings, FreeRDP_ConfigPath, combined); - free(combined); - } - - free(base); - if (!res) - goto out_fail; - } - else - { - BOOL res = 0; - char* cpath = NULL; - char product[sizeof(FREERDP_PRODUCT_STRING)] = { 0 }; - - for (size_t i = 0; i < sizeof(product); i++) - product[i] = tolower(FREERDP_PRODUCT_STRING[i]); - - cpath = GetKnownSubPath(KNOWN_PATH_XDG_CONFIG_HOME, product); - res = freerdp_settings_set_string(settings, FreeRDP_ConfigPath, cpath); - free(cpath); - if (!res) - goto out_fail; - } - - if (!freerdp_settings_get_string(settings, FreeRDP_ConfigPath)) + char* config = freerdp_settings_get_config_path(); + rc = freerdp_settings_set_string(settings, FreeRDP_ConfigPath, config); + free(config); + if (!rc) goto out_fail; } diff --git a/server/shadow/shadow_server.c b/server/shadow/shadow_server.c index 751f4602e..242033bcb 100644 --- a/server/shadow/shadow_server.c +++ b/server/shadow/shadow_server.c @@ -734,58 +734,9 @@ int shadow_server_stop(rdpShadowServer* server) static int shadow_server_init_config_path(rdpShadowServer* server) { -#ifdef _WIN32 - if (!server->ConfigPath) { - server->ConfigPath = GetEnvironmentSubPath("LOCALAPPDATA", "freerdp"); - } - -#endif -#ifdef __APPLE__ - - if (!server->ConfigPath) - { - char* userLibraryPath; - char* userApplicationSupportPath; - userLibraryPath = GetKnownSubPath(KNOWN_PATH_HOME, "Library"); - - if (userLibraryPath) - { - if (!winpr_PathFileExists(userLibraryPath) && !winpr_PathMakePath(userLibraryPath, 0)) - { - WLog_ERR(TAG, "Failed to create directory '%s'", userLibraryPath); - free(userLibraryPath); - return -1; - } - - userApplicationSupportPath = GetCombinedPath(userLibraryPath, "Application Support"); - - if (userApplicationSupportPath) - { - if (!winpr_PathFileExists(userApplicationSupportPath) && - !winpr_PathMakePath(userApplicationSupportPath, 0)) - { - WLog_ERR(TAG, "Failed to create directory '%s'", userApplicationSupportPath); - free(userLibraryPath); - free(userApplicationSupportPath); - return -1; - } - - server->ConfigPath = GetCombinedPath(userApplicationSupportPath, "freerdp"); - } - - free(userLibraryPath); - free(userApplicationSupportPath); - } - } - -#endif - - if (!server->ConfigPath) - { - char* configHome = NULL; - configHome = GetKnownPath(KNOWN_PATH_XDG_CONFIG_HOME); + char* configHome = freerdp_settings_get_config_path(); if (configHome) { @@ -796,8 +747,7 @@ static int shadow_server_init_config_path(rdpShadowServer* server) return -1; } - server->ConfigPath = GetKnownSubPath(KNOWN_PATH_XDG_CONFIG_HOME, "freerdp"); - free(configHome); + server->ConfigPath = configHome; } }