From baca062321919864b40cb350398a416ac0a42c5d Mon Sep 17 00:00:00 2001 From: Martin Fleisz Date: Wed, 22 Jan 2020 13:13:51 +0100 Subject: [PATCH] core: Fix and extend populate rdp file from settings This PR contains the following changes: - Get rid of unused SettingsModified array (kept in the settings struct for ABI compatibility) - Fix and extend freerdp_client_populate_rdp_file_form_settings (wrote strings to the rdp file, missed a lot of settings) - Set KeyboardHook default value to 2 (hook in fullscreen) just as mstsc does --- client/common/file.c | 131 ++++++++++++++++++++----------------- include/freerdp/settings.h | 2 +- libfreerdp/core/settings.c | 11 +--- 3 files changed, 73 insertions(+), 71 deletions(-) diff --git a/client/common/file.c b/client/common/file.c index 3b7148ff4..9f4551d63 100644 --- a/client/common/file.c +++ b/client/common/file.c @@ -841,74 +841,85 @@ BOOL freerdp_client_parse_rdp_file_ex(rdpFile* file, const char* name, rdp_file_ return status; } -#define WRITE_ALL_SETTINGS TRUE -#define SETTING_MODIFIED(_settings, _field) \ - (WRITE_ALL_SETTINGS || _settings->SettingsModified[FreeRDP_##_field]) -#define SETTING_MODIFIED_SET(_target, _settings, _field) \ - if \ - SETTING_MODIFIED(_settings, _field) \ - _target = _settings->_field - -#define SETTING_MODIFIED_SET_BOOL(_target, _settings, _field) \ - if \ - SETTING_MODIFIED(_settings, _field) \ - _target = _settings->_field ? 1 : 0 - -#define SETTING_MODIFIED_SET_STRING(_target, _settings, _field) \ - do \ - { \ - if \ - SETTING_MODIFIED(_settings, _field) _target = _strdup(_settings->_field); \ - if (!_target && _settings->_field) \ - return FALSE; \ +#define FILE_POPULATE_STRING(_target, _setting) \ + do \ + { \ + if (_setting) \ + { \ + _target = _strdup(_setting); \ + if (!_target) \ + return FALSE; \ + } \ } while (0) BOOL freerdp_client_populate_rdp_file_from_settings(rdpFile* file, const rdpSettings* settings) { - SETTING_MODIFIED_SET_STRING(file->Domain, settings, Domain); - SETTING_MODIFIED_SET_STRING(file->Username, settings, Username); - SETTING_MODIFIED_SET_STRING(file->Password, settings, Password); - SETTING_MODIFIED_SET(file->ServerPort, settings, ServerPort); - SETTING_MODIFIED_SET_STRING(file->FullAddress, settings, ServerHostname); - SETTING_MODIFIED_SET_STRING(file->AlternateFullAddress, settings, ServerHostname); - SETTING_MODIFIED_SET(file->DesktopWidth, settings, DesktopWidth); - SETTING_MODIFIED_SET(file->DesktopHeight, settings, DesktopHeight); - SETTING_MODIFIED_SET(file->SessionBpp, settings, ColorDepth); - SETTING_MODIFIED_SET_BOOL(file->ConnectToConsole, settings, ConsoleSession); - SETTING_MODIFIED_SET_BOOL(file->AdministrativeSession, settings, ConsoleSession); - SETTING_MODIFIED_SET_BOOL(file->NegotiateSecurityLayer, settings, NegotiateSecurityLayer); - SETTING_MODIFIED_SET_BOOL(file->EnableCredSSPSupport, settings, NlaSecurity); - SETTING_MODIFIED_SET_STRING(file->AlternateShell, settings, AlternateShell); - SETTING_MODIFIED_SET_STRING(file->ShellWorkingDirectory, settings, ShellWorkingDirectory); - SETTING_MODIFIED_SET(file->ConnectionType, settings, ConnectionType); - SETTING_MODIFIED_SET_STRING(file->DrivesToRedirect, settings, DrivesToRedirect); + FILE_POPULATE_STRING(file->Domain, settings->Domain); + FILE_POPULATE_STRING(file->Username, settings->Username); + FILE_POPULATE_STRING(file->Password, settings->Password); + file->ServerPort = settings->ServerPort; + FILE_POPULATE_STRING(file->FullAddress, settings->ServerHostname); + FILE_POPULATE_STRING(file->AlternateFullAddress, settings->ServerHostname); + file->DesktopWidth = settings->DesktopWidth; + file->DesktopHeight = settings->DesktopHeight; + file->SessionBpp = settings->ColorDepth; + file->ConnectToConsole = settings->ConsoleSession; + file->NegotiateSecurityLayer = settings->NegotiateSecurityLayer; + file->EnableCredSSPSupport = settings->NlaSecurity; + FILE_POPULATE_STRING(file->AlternateShell, settings->AlternateShell); + FILE_POPULATE_STRING(file->ShellWorkingDirectory, settings->ShellWorkingDirectory); + file->ConnectionType = settings->ConnectionType; + FILE_POPULATE_STRING(file->DrivesToRedirect, settings->DrivesToRedirect); + file->ScreenModeId = settings->Fullscreen ? 2 : 1; - if (SETTING_MODIFIED(settings, AudioPlayback) || SETTING_MODIFIED(settings, RemoteConsoleAudio)) + if (settings->LoadBalanceInfoLength) { - if (settings->AudioPlayback) - file->AudioMode = AUDIO_MODE_REDIRECT; - else if (settings->RemoteConsoleAudio) - file->AudioMode = AUDIO_MODE_PLAY_ON_SERVER; - else - file->AudioMode = AUDIO_MODE_NONE; + file->LoadBalanceInfo = calloc(settings->LoadBalanceInfoLength + 1, 1); + if (!file->LoadBalanceInfo) + return FALSE; + strncpy(file->LoadBalanceInfo, settings->LoadBalanceInfo, settings->LoadBalanceInfoLength); } - SETTING_MODIFIED_SET_BOOL(file->AudioCaptureMode, settings, AudioCapture); - SETTING_MODIFIED_SET_STRING(file->GatewayHostname, settings, GatewayHostname); - SETTING_MODIFIED_SET_STRING(file->GatewayAccessToken, settings, GatewayAccessToken); - SETTING_MODIFIED_SET(file->GatewayUsageMethod, settings, GatewayUsageMethod); - SETTING_MODIFIED_SET_BOOL(file->PromptCredentialOnce, settings, GatewayUseSameCredentials); - SETTING_MODIFIED_SET_BOOL(file->PromptForCredentials, settings, PromptForCredentials); - SETTING_MODIFIED_SET_BOOL(file->RemoteApplicationMode, settings, RemoteApplicationMode); - SETTING_MODIFIED_SET_STRING(file->RemoteApplicationProgram, settings, RemoteApplicationProgram); - SETTING_MODIFIED_SET_STRING(file->RemoteApplicationName, settings, RemoteApplicationName); - SETTING_MODIFIED_SET_STRING(file->RemoteApplicationIcon, settings, RemoteApplicationIcon); - SETTING_MODIFIED_SET_STRING(file->RemoteApplicationFile, settings, RemoteApplicationFile); - SETTING_MODIFIED_SET_STRING(file->RemoteApplicationGuid, settings, RemoteApplicationGuid); - SETTING_MODIFIED_SET_STRING(file->RemoteApplicationCmdLine, settings, RemoteApplicationCmdLine); - SETTING_MODIFIED_SET_BOOL(file->SpanMonitors, settings, SpanMonitors); - SETTING_MODIFIED_SET_BOOL(file->UseMultiMon, settings, UseMultimon); - SETTING_MODIFIED_SET_STRING(file->PreconnectionBlob, settings, PreconnectionBlob); + if (settings->AudioPlayback) + file->AudioMode = AUDIO_MODE_REDIRECT; + else if (settings->RemoteConsoleAudio) + file->AudioMode = AUDIO_MODE_PLAY_ON_SERVER; + else + file->AudioMode = AUDIO_MODE_NONE; + + file->AudioCaptureMode = settings->AudioCapture; + file->Compression = settings->CompressionEnabled; + FILE_POPULATE_STRING(file->GatewayHostname, settings->GatewayHostname); + FILE_POPULATE_STRING(file->GatewayAccessToken, settings->GatewayAccessToken); + file->GatewayUsageMethod = settings->GatewayUsageMethod; + file->PromptCredentialOnce = settings->GatewayUseSameCredentials; + file->PromptForCredentials = settings->PromptForCredentials; + file->RemoteApplicationMode = settings->RemoteApplicationMode; + FILE_POPULATE_STRING(file->RemoteApplicationProgram, settings->RemoteApplicationProgram); + FILE_POPULATE_STRING(file->RemoteApplicationName, settings->RemoteApplicationName); + FILE_POPULATE_STRING(file->RemoteApplicationIcon, settings->RemoteApplicationIcon); + FILE_POPULATE_STRING(file->RemoteApplicationFile, settings->RemoteApplicationFile); + FILE_POPULATE_STRING(file->RemoteApplicationGuid, settings->RemoteApplicationGuid); + FILE_POPULATE_STRING(file->RemoteApplicationCmdLine, settings->RemoteApplicationCmdLine); + file->SpanMonitors = settings->SpanMonitors; + file->UseMultiMon = settings->UseMultimon; + file->AllowFontSmoothing = settings->AllowFontSmoothing; + file->DisableWallpaper = settings->DisableWallpaper; + file->DisableFullWindowDrag = settings->DisableFullWindowDrag; + file->DisableMenuAnims = settings->DisableMenuAnims; + file->DisableThemes = settings->DisableThemes; + file->BandwidthAutoDetect = (settings->ConnectionType >= 7) ? TRUE : FALSE; + file->NetworkAutoDetect = settings->NetworkAutoDetect; + file->AutoReconnectionEnabled = settings->AutoReconnectionEnabled; + file->RedirectSmartCards = settings->RedirectSmartCards; + file->RedirectClipboard = settings->RedirectClipboard; + file->RedirectPrinters = settings->RedirectPrinters; + file->RedirectDrives = settings->RedirectDrives; + file->RedirectComPorts = (settings->RedirectSerialPorts || settings->RedirectParallelPorts); + FILE_POPULATE_STRING(file->DrivesToRedirect, settings->DrivesToRedirect); + file->KeyboardHook = settings->KeyboardHook; + FILE_POPULATE_STRING(file->PreconnectionBlob, settings->PreconnectionBlob); + return TRUE; } diff --git a/include/freerdp/settings.h b/include/freerdp/settings.h index 1996867e6..a0c621f83 100644 --- a/include/freerdp/settings.h +++ b/include/freerdp/settings.h @@ -1551,7 +1551,7 @@ struct rdp_settings ALIGN64 struct rdp_ext_set extensions[16]; /* */ ALIGN64 BYTE* SettingsModified; /* byte array marking fields that have been modified from their - default value */ + default value - currently UNUSED! */ ALIGN64 char* ActionScript; ALIGN64 DWORD Floatbar; }; diff --git a/libfreerdp/core/settings.c b/libfreerdp/core/settings.c index d8e529d9a..e34ed10fa 100644 --- a/libfreerdp/core/settings.c +++ b/libfreerdp/core/settings.c @@ -346,6 +346,7 @@ rdpSettings* freerdp_settings_new(DWORD flags) settings->KeyboardSubType = 0; settings->KeyboardFunctionKey = 12; settings->KeyboardLayout = 0; + settings->KeyboardHook = 2; settings->UseRdpSecurityLayer = FALSE; settings->SaltedChecksum = TRUE; settings->ServerPort = 3389; @@ -605,10 +606,6 @@ rdpSettings* freerdp_settings_new(DWORD flags) } settings_load_hkey_local_machine(settings); - settings->SettingsModified = (BYTE*)calloc(1, sizeof(rdpSettings) / 8); - - if (!settings->SettingsModified) - goto out_fail; settings->ActionScript = _strdup("~/.config/freerdp/action.sh"); settings->SmartcardLogon = FALSE; @@ -713,7 +710,6 @@ static void freerdp_settings_free_internal(rdpSettings* settings) freerdp_device_collection_free(settings); freerdp_static_channel_collection_free(settings); freerdp_dynamic_channel_collection_free(settings); - free(settings->SettingsModified); memset(settings, 0, sizeof(rdpSettings)); } @@ -1111,11 +1107,6 @@ BOOL freerdp_settings_copy(rdpSettings* _settings, const rdpSettings* settings) goto out_fail; } - _settings->SettingsModified = (BYTE*)calloc(1, sizeof(rdpSettings) / 8); - - if (!_settings->SettingsModified) - goto out_fail; - return TRUE; out_fail: freerdp_settings_free_internal(_settings);