FreeRDP/libfreerdp/common/settings.c

2694 lines
59 KiB
C
Raw Normal View History

/**
* FreeRDP: A Remote Desktop Protocol Implementation
* Settings Management
*
* Copyright 2012 Marc-Andre Moreau <marcandre.moreau@gmail.com>
* Copyright 2016 Armin Novak <armin.novak@gmail.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winpr/crt.h>
#include <freerdp/settings.h>
#include <freerdp/freerdp.h>
#include <freerdp/log.h>
#define TAG FREERDP_TAG("common")
int freerdp_addin_set_argument(ADDIN_ARGV* args, char* argument)
{
int i;
char **new_argv;
for (i = 0; i < args->argc; i++)
{
if (strcmp(args->argv[i], argument) == 0)
{
return 1;
}
}
new_argv = (char**) realloc(args->argv, sizeof(char*) * (args->argc + 1));
if (!new_argv)
return -1;
args->argv = new_argv;
args->argc++;
if (!(args->argv[args->argc - 1] = _strdup(argument)))
return -1;
return 0;
}
int freerdp_addin_replace_argument(ADDIN_ARGV* args, char* previous, char* argument)
{
int i;
char **new_argv;
for (i = 0; i < args->argc; i++)
{
if (strcmp(args->argv[i], previous) == 0)
{
free(args->argv[i]);
if (!(args->argv[i] = _strdup(argument)))
return -1;
return 1;
}
}
new_argv = (char**) realloc(args->argv, sizeof(char*) * (args->argc + 1));
if (!new_argv)
return -1;
args->argv = new_argv;
args->argc++;
if (!(args->argv[args->argc - 1] = _strdup(argument)))
return -1;
return 0;
}
int freerdp_addin_set_argument_value(ADDIN_ARGV* args, char* option, char* value)
{
int i;
char* p;
char* str;
int length;
char **new_argv;
length = strlen(option) + strlen(value) + 1;
str = (char*) malloc(length + 1);
if (!str)
return -1;
sprintf_s(str, length + 1, "%s:%s", option, value);
for (i = 0; i < args->argc; i++)
{
p = strchr(args->argv[i], ':');
if (p)
{
if (strncmp(args->argv[i], option, p - args->argv[i]) == 0)
{
free(args->argv[i]);
args->argv[i] = str;
return 1;
}
}
}
new_argv = (char**) realloc(args->argv, sizeof(char*) * (args->argc + 1));
if (!new_argv)
{
free(str);
return -1;
}
args->argv = new_argv;
args->argc++;
args->argv[args->argc - 1] = str;
return 0;
}
int freerdp_addin_replace_argument_value(ADDIN_ARGV* args, char* previous, char* option, char* value)
{
int i;
char* str;
int length;
char **new_argv;
length = strlen(option) + strlen(value) + 1;
str = (char*) malloc(length + 1);
if (!str)
return -1;
sprintf_s(str, length + 1, "%s:%s", option, value);
for (i = 0; i < args->argc; i++)
{
if (strcmp(args->argv[i], previous) == 0)
{
free(args->argv[i]);
args->argv[i] = str;
return 1;
}
}
new_argv = (char**) realloc(args->argv, sizeof(char*) * (args->argc + 1));
if (!new_argv)
{
free(str);
return -1;
}
args->argv = new_argv;
args->argc++;
args->argv[args->argc - 1] = str;
return 0;
}
BOOL freerdp_device_collection_add(rdpSettings* settings, RDPDR_DEVICE* device)
{
if (!settings->DeviceArray)
return FALSE;
if (settings->DeviceArraySize < (settings->DeviceCount + 1))
{
UINT32 new_size;
RDPDR_DEVICE **new_array;
new_size = settings->DeviceArraySize * 2;
new_array = (RDPDR_DEVICE**)
realloc(settings->DeviceArray, new_size * sizeof(RDPDR_DEVICE*));
if (!new_array)
return FALSE;
settings->DeviceArray = new_array;
settings->DeviceArraySize = new_size;
}
settings->DeviceArray[settings->DeviceCount++] = device;
return TRUE;
}
RDPDR_DEVICE* freerdp_device_collection_find(rdpSettings* settings, const char* name)
{
2014-02-11 07:12:13 +04:00
UINT32 index;
RDPDR_DEVICE* device;
for (index = 0; index < settings->DeviceCount; index++)
{
device = (RDPDR_DEVICE*) settings->DeviceArray[index];
if (!device->Name)
continue;
if (strcmp(device->Name, name) == 0)
return device;
}
return NULL;
}
RDPDR_DEVICE* freerdp_device_collection_find_type(rdpSettings* settings, UINT32 type)
{
UINT32 index;
RDPDR_DEVICE* device;
for (index = 0; index < settings->DeviceCount; index++)
{
device = (RDPDR_DEVICE*) settings->DeviceArray[index];
if (device->Type == type)
return device;
}
return NULL;
}
RDPDR_DEVICE* freerdp_device_clone(RDPDR_DEVICE* device)
{
if (device->Type == RDPDR_DTYP_FILESYSTEM)
{
RDPDR_DRIVE* drive = (RDPDR_DRIVE*) device;
RDPDR_DRIVE* _drive = (RDPDR_DRIVE*) calloc(1, sizeof(RDPDR_DRIVE));
if (!_drive)
return NULL;
_drive->Id = drive->Id;
_drive->Type = drive->Type;
_drive->Name = _strdup(drive->Name);
if (!_drive->Name)
goto out_fs_name_error;
_drive->Path = _strdup(drive->Path);
if (!_drive->Path)
goto out_fs_path_error;
return (RDPDR_DEVICE*) _drive;
out_fs_path_error:
free(_drive->Name);
out_fs_name_error:
free(_drive);
return NULL;
}
if (device->Type == RDPDR_DTYP_PRINT)
{
RDPDR_PRINTER* printer = (RDPDR_PRINTER*) device;
RDPDR_PRINTER* _printer = (RDPDR_PRINTER*) calloc(1, sizeof(RDPDR_PRINTER));
if (!_printer)
return NULL;
_printer->Id = printer->Id;
_printer->Type = printer->Type;
if (printer->Name)
{
_printer->Name = _strdup(printer->Name);
if (!_printer->Name)
goto out_print_name_error;
}
if (printer->DriverName)
{
_printer->DriverName = _strdup(printer->DriverName);
if (!_printer->DriverName)
goto out_print_path_error;
}
return (RDPDR_DEVICE*) _printer;
out_print_path_error:
free(_printer->Name);
out_print_name_error:
free(_printer);
return NULL;
}
if (device->Type == RDPDR_DTYP_SMARTCARD)
{
RDPDR_SMARTCARD* smartcard = (RDPDR_SMARTCARD*) device;
RDPDR_SMARTCARD* _smartcard = (RDPDR_SMARTCARD*) calloc(1, sizeof(RDPDR_SMARTCARD));
if (!_smartcard)
return NULL;
_smartcard->Id = smartcard->Id;
_smartcard->Type = smartcard->Type;
if (smartcard->Name)
{
_smartcard->Name = _strdup(smartcard->Name);
if (!_smartcard->Name)
goto out_smartc_name_error;
}
if (smartcard->Path)
{
_smartcard->Path = _strdup(smartcard->Path);
if (!_smartcard->Path)
goto out_smartc_path_error;
}
return (RDPDR_DEVICE*) _smartcard;
out_smartc_path_error:
free(_smartcard->Name);
out_smartc_name_error:
free(_smartcard);
return NULL;
}
if (device->Type == RDPDR_DTYP_SERIAL)
{
RDPDR_SERIAL* serial = (RDPDR_SERIAL*) device;
RDPDR_SERIAL* _serial = (RDPDR_SERIAL*) calloc(1, sizeof(RDPDR_SERIAL));
if (!_serial)
return NULL;
_serial->Id = serial->Id;
_serial->Type = serial->Type;
if (serial->Name)
{
_serial->Name = _strdup(serial->Name);
if (!_serial->Name)
goto out_serial_name_error;
}
if (serial->Path)
{
_serial->Path = _strdup(serial->Path);
if (!_serial->Path)
goto out_serial_path_error;
}
if (serial->Driver)
{
_serial->Driver = _strdup(serial->Driver);
if (!_serial->Driver)
goto out_serial_driver_error;
}
return (RDPDR_DEVICE*) _serial;
out_serial_driver_error:
free(_serial->Path);
out_serial_path_error:
free(_serial->Name);
out_serial_name_error:
free(_serial);
return NULL;
}
if (device->Type == RDPDR_DTYP_PARALLEL)
{
RDPDR_PARALLEL* parallel = (RDPDR_PARALLEL*) device;
RDPDR_PARALLEL* _parallel = (RDPDR_PARALLEL*) calloc(1, sizeof(RDPDR_PARALLEL));
if (!_parallel)
return NULL;
_parallel->Id = parallel->Id;
_parallel->Type = parallel->Type;
if (parallel->Name)
{
_parallel->Name = _strdup(parallel->Name);
if (!_parallel->Name)
goto out_parallel_name_error;
}
if (parallel->Path)
{
_parallel->Path = _strdup(parallel->Path);
if (!_parallel->Path)
goto out_parallel_path_error;
}
return (RDPDR_DEVICE*) _parallel;
out_parallel_path_error:
free(_parallel->Name);
out_parallel_name_error:
free(_parallel);
return NULL;
}
WLog_ERR(TAG, "unknown device type %d", device->Type);
return NULL;
}
void freerdp_device_collection_free(rdpSettings* settings)
{
2014-02-11 07:12:13 +04:00
UINT32 index;
RDPDR_DEVICE* device;
for (index = 0; index < settings->DeviceCount; index++)
{
device = (RDPDR_DEVICE*) settings->DeviceArray[index];
if (!device)
continue;
free(device->Name);
if (settings->DeviceArray[index]->Type == RDPDR_DTYP_FILESYSTEM)
{
free(((RDPDR_DRIVE*) device)->Path);
}
else if (settings->DeviceArray[index]->Type == RDPDR_DTYP_PRINT)
{
}
else if (settings->DeviceArray[index]->Type == RDPDR_DTYP_SMARTCARD)
{
free(((RDPDR_SMARTCARD*) device)->Path);
}
else if (settings->DeviceArray[index]->Type == RDPDR_DTYP_SERIAL)
{
free(((RDPDR_SERIAL*) device)->Path);
free(((RDPDR_SERIAL*) device)->Driver);
}
else if (settings->DeviceArray[index]->Type == RDPDR_DTYP_PARALLEL)
{
free(((RDPDR_PARALLEL*) device)->Path);
}
free(device);
}
free(settings->DeviceArray);
settings->DeviceArraySize = 0;
settings->DeviceArray = NULL;
settings->DeviceCount = 0;
}
BOOL freerdp_static_channel_collection_add(rdpSettings* settings, ADDIN_ARGV* channel)
{
if (!settings->StaticChannelArray)
return FALSE;
if (settings->StaticChannelArraySize < (settings->StaticChannelCount + 1))
{
UINT32 new_size;
ADDIN_ARGV **new_array;
new_size = settings->StaticChannelArraySize * 2;
new_array = (ADDIN_ARGV**)
realloc(settings->StaticChannelArray, new_size * sizeof(ADDIN_ARGV*));
if (!new_array)
return FALSE;
settings->StaticChannelArray = new_array;
settings->StaticChannelArraySize = new_size;
}
settings->StaticChannelArray[settings->StaticChannelCount++] = channel;
return TRUE;
}
ADDIN_ARGV* freerdp_static_channel_collection_find(rdpSettings* settings, const char* name)
{
2014-02-11 07:12:13 +04:00
UINT32 index;
ADDIN_ARGV* channel;
for (index = 0; index < settings->StaticChannelCount; index++)
{
channel = settings->StaticChannelArray[index];
if (strcmp(channel->argv[0], name) == 0)
return channel;
}
return NULL;
}
ADDIN_ARGV* freerdp_static_channel_clone(ADDIN_ARGV* channel)
{
int index;
ADDIN_ARGV* _channel = NULL;
_channel = (ADDIN_ARGV*) malloc(sizeof(ADDIN_ARGV));
if (!_channel)
return NULL;
_channel->argc = channel->argc;
_channel->argv = (char**) calloc(channel->argc, sizeof(char*));
if (!_channel->argv)
goto out_free;
for (index = 0; index < _channel->argc; index++)
{
_channel->argv[index] = _strdup(channel->argv[index]);
if (!_channel->argv[index])
goto out_release_args;
}
return _channel;
out_release_args:
for (index = 0; _channel->argv[index]; index++)
free(_channel->argv[index]);
out_free:
free(_channel);
return NULL;
}
void freerdp_static_channel_collection_free(rdpSettings* settings)
{
2014-02-11 07:12:13 +04:00
int j;
UINT32 i;
for (i = 0; i < settings->StaticChannelCount; i++)
{
if (!settings->StaticChannelArray[i])
continue;
for (j = 0; j < settings->StaticChannelArray[i]->argc; j++)
free(settings->StaticChannelArray[i]->argv[j]);
free(settings->StaticChannelArray[i]->argv);
free(settings->StaticChannelArray[i]);
}
free(settings->StaticChannelArray);
settings->StaticChannelArraySize = 0;
settings->StaticChannelArray = NULL;
settings->StaticChannelCount = 0;
}
BOOL freerdp_dynamic_channel_collection_add(rdpSettings* settings, ADDIN_ARGV* channel)
{
if (!settings->DynamicChannelArray)
return FALSE;
if (settings->DynamicChannelArraySize < (settings->DynamicChannelCount + 1))
{
ADDIN_ARGV **new_array;
new_array = realloc(settings->DynamicChannelArray, settings->DynamicChannelArraySize * sizeof(ADDIN_ARGV*) * 2);
if (!new_array)
return FALSE;
settings->DynamicChannelArraySize *= 2;
settings->DynamicChannelArray = new_array;
}
settings->DynamicChannelArray[settings->DynamicChannelCount++] = channel;
return TRUE;
}
ADDIN_ARGV* freerdp_dynamic_channel_collection_find(rdpSettings* settings, const char* name)
{
2014-02-11 07:12:13 +04:00
UINT32 index;
ADDIN_ARGV* channel;
for (index = 0; index < settings->DynamicChannelCount; index++)
{
channel = settings->DynamicChannelArray[index];
if (strcmp(channel->argv[0], name) == 0)
return channel;
}
return NULL;
}
ADDIN_ARGV* freerdp_dynamic_channel_clone(ADDIN_ARGV* channel)
{
int index;
ADDIN_ARGV* _channel = NULL;
_channel = (ADDIN_ARGV*) malloc(sizeof(ADDIN_ARGV));
2015-02-07 01:35:14 +03:00
if (!_channel)
return NULL;
_channel->argc = channel->argc;
_channel->argv = (char**) malloc(sizeof(char*) * channel->argc);
2015-02-07 01:35:14 +03:00
if (!_channel->argv)
goto out_free;
for (index = 0; index < _channel->argc; index++)
{
_channel->argv[index] = _strdup(channel->argv[index]);
2015-02-07 01:35:14 +03:00
if (!_channel->argv[index])
goto out_release_args;
}
return _channel;
out_release_args:
for (index = 0; _channel->argv[index]; index++)
free(_channel->argv[index]);
out_free:
free(_channel);
return NULL;
}
void freerdp_dynamic_channel_collection_free(rdpSettings* settings)
{
int j;
UINT32 i;
for (i = 0; i < settings->DynamicChannelCount; i++)
{
if (!settings->DynamicChannelArray[i])
continue;
for (j = 0; j < settings->DynamicChannelArray[i]->argc; j++)
free(settings->DynamicChannelArray[i]->argv[j]);
free(settings->DynamicChannelArray[i]->argv);
free(settings->DynamicChannelArray[i]);
}
free(settings->DynamicChannelArray);
settings->DynamicChannelArraySize = 0;
settings->DynamicChannelArray = NULL;
settings->DynamicChannelCount = 0;
}
void freerdp_target_net_addresses_free(rdpSettings* settings)
{
UINT32 index;
for (index = 0; index < settings->TargetNetAddressCount; index++)
free(settings->TargetNetAddresses[index]);
free(settings->TargetNetAddresses);
free(settings->TargetNetPorts);
settings->TargetNetAddressCount = 0;
settings->TargetNetAddresses = NULL;
settings->TargetNetPorts = NULL;
}
void freerdp_performance_flags_make(rdpSettings* settings)
{
settings->PerformanceFlags = PERF_FLAG_NONE;
if (settings->AllowFontSmoothing)
settings->PerformanceFlags |= PERF_ENABLE_FONT_SMOOTHING;
if (settings->AllowDesktopComposition)
settings->PerformanceFlags |= PERF_ENABLE_DESKTOP_COMPOSITION;
if (settings->DisableWallpaper)
settings->PerformanceFlags |= PERF_DISABLE_WALLPAPER;
if (settings->DisableFullWindowDrag)
settings->PerformanceFlags |= PERF_DISABLE_FULLWINDOWDRAG;
if (settings->DisableMenuAnims)
settings->PerformanceFlags |= PERF_DISABLE_MENUANIMATIONS;
if (settings->DisableThemes)
settings->PerformanceFlags |= PERF_DISABLE_THEMING;
}
void freerdp_performance_flags_split(rdpSettings* settings)
{
settings->AllowFontSmoothing = (settings->PerformanceFlags & PERF_ENABLE_FONT_SMOOTHING) ? TRUE : FALSE;
settings->AllowDesktopComposition = (settings->PerformanceFlags & PERF_ENABLE_DESKTOP_COMPOSITION) ? TRUE : FALSE;
settings->DisableWallpaper = (settings->PerformanceFlags & PERF_DISABLE_WALLPAPER) ? TRUE : FALSE;
settings->DisableFullWindowDrag = (settings->PerformanceFlags & PERF_DISABLE_FULLWINDOWDRAG) ? TRUE : FALSE;
settings->DisableMenuAnims = (settings->PerformanceFlags & PERF_DISABLE_MENUANIMATIONS) ? TRUE : FALSE;
settings->DisableThemes = (settings->PerformanceFlags & PERF_DISABLE_THEMING) ? TRUE : FALSE;
}
void freerdp_set_gateway_usage_method(rdpSettings* settings, UINT32 GatewayUsageMethod)
{
freerdp_set_param_uint32(settings, FreeRDP_GatewayUsageMethod, GatewayUsageMethod);
if (GatewayUsageMethod == TSC_PROXY_MODE_NONE_DIRECT)
{
freerdp_set_param_bool(settings, FreeRDP_GatewayEnabled, FALSE);
freerdp_set_param_bool(settings, FreeRDP_GatewayBypassLocal, FALSE);
}
else if (GatewayUsageMethod == TSC_PROXY_MODE_DIRECT)
{
freerdp_set_param_bool(settings, FreeRDP_GatewayEnabled, TRUE);
freerdp_set_param_bool(settings, FreeRDP_GatewayBypassLocal, FALSE);
}
else if (GatewayUsageMethod == TSC_PROXY_MODE_DETECT)
{
freerdp_set_param_bool(settings, FreeRDP_GatewayEnabled, TRUE);
freerdp_set_param_bool(settings, FreeRDP_GatewayBypassLocal, TRUE);
}
else if (GatewayUsageMethod == TSC_PROXY_MODE_DEFAULT)
{
/**
* This corresponds to "Automatically detect RD Gateway server settings",
* which means the client attempts to use gateway group policy settings
* http://technet.microsoft.com/en-us/library/cc770601.aspx
*/
freerdp_set_param_bool(settings, FreeRDP_GatewayEnabled, FALSE);
freerdp_set_param_bool(settings, FreeRDP_GatewayBypassLocal, FALSE);
}
else if (GatewayUsageMethod == TSC_PROXY_MODE_NONE_DETECT)
{
freerdp_set_param_bool(settings, FreeRDP_GatewayEnabled, FALSE);
freerdp_set_param_bool(settings, FreeRDP_GatewayBypassLocal, FALSE);
}
}
void freerdp_update_gateway_usage_method(rdpSettings* settings, UINT32 GatewayEnabled, UINT32 GatewayBypassLocal)
{
UINT32 GatewayUsageMethod = 0;
if (!GatewayEnabled && !GatewayBypassLocal)
GatewayUsageMethod = TSC_PROXY_MODE_NONE_DIRECT;
else if (GatewayEnabled && !GatewayBypassLocal)
GatewayUsageMethod = TSC_PROXY_MODE_DIRECT;
else if (GatewayEnabled && GatewayBypassLocal)
GatewayUsageMethod = TSC_PROXY_MODE_DETECT;
freerdp_set_gateway_usage_method(settings, GatewayUsageMethod);
}
/**
* Partially Generated Code
*/
BOOL freerdp_get_param_bool(rdpSettings* settings, int id)
{
switch (id)
{
case FreeRDP_ServerMode:
return settings->ServerMode;
case FreeRDP_NetworkAutoDetect:
return settings->NetworkAutoDetect;
case FreeRDP_SupportAsymetricKeys:
return settings->SupportAsymetricKeys;
case FreeRDP_SupportErrorInfoPdu:
return settings->SupportErrorInfoPdu;
case FreeRDP_SupportStatusInfoPdu:
return settings->SupportStatusInfoPdu;
case FreeRDP_SupportMonitorLayoutPdu:
return settings->SupportMonitorLayoutPdu;
case FreeRDP_SupportGraphicsPipeline:
return settings->SupportGraphicsPipeline;
case FreeRDP_SupportDynamicTimeZone:
return settings->SupportDynamicTimeZone;
Standard RDP Security Layer Levels/Method Overhaul [MS-RDPBCGR] Section 5.3 describes the encryption level and method values for standard RDP security. Looking at the current usage of these values in the FreeRDP code gives me reason to believe that there is a certain lack of understanding of how these values should be handled. The encryption level is only configured on the server side in the "Encryption Level" setting found in the Remote Desktop Session Host Configuration RDP-Tcp properties dialog and this value is never transferred from the client to the server over the wire. The possible options are "None", "Low", "Client Compatible", "High" and "FIPS Compliant". The client receices this value in the Server Security Data block (TS_UD_SC_SEC1), probably only for informational purposes and maybe to give the client the possibility to verify if the server's decision for the encryption method confirms to the server's encryption level. The possible encryption methods are "NONE", "40BIT", "56BIT", "128BIT" and "FIPS" and the RDP client advertises the ones it supports to the server in the Client Security Data block (TS_UD_CS_SEC). The server's configured encryption level value restricts the possible final encryption method. Something that I was not able to find in the documentation is the priority level of the individual encryption methods based on which the server makes its final method decision if there are several options. My analysis with Windows Servers reveiled that the order is 128, 56, 40, FIPS. The server only chooses FIPS if the level is "FIPS Comliant" or if it is the only method advertised by the client. Bottom line: * FreeRDP's client side does not need to set settings->EncryptionLevel (which was done quite frequently). * FreeRDP's server side does not have to set the supported encryption methods list in settings->EncryptionMethods Changes in this commit: Removed unnecessary/confusing changes of EncryptionLevel/Methods settings Refactor settings->DisableEncryption * This value actually means "Advanced RDP Encryption (NLA/TLS) is NOT used" * The old name caused lots of confusion among developers * Renamed it to "UseRdpSecurityLayer" (the compare logic stays untouched) Any client's setting of settings->EncryptionMethods were annihilated * All clients "want" to set all supported methods * Some clients forgot 56bit because 56bit was not supported at the time the code was written * settings->EncryptionMethods was overwritten anyways in nego_connect() * Removed all client side settings of settings->EncryptionMethods The default is "None" (0) * Changed nego_connect() to advertise all supported methods if settings->EncryptionMethods is 0 (None) * Added a commandline option /encryption-methods:comma separated list of the values "40", "56", "128", "FIPS". E.g. /encryption-methods:56,128 * Print warning if server chooses non-advertised method Verify received level and method in client's gcc_read_server_security_data * Only accept valid/known encryption methods * Verify encryption level/method combinations according to MS-RDPBCGR 5.3.2 Server implementations can now set settings->EncryptionLevel * The default for settings->EncryptionLevel is 0 (None) * nego_send_negotiation_response() changes it to ClientCompatible in that case * default to ClientCompatible if the server implementation set an invalid level Fix server's gcc_write_server_security_data * Verify server encryption level value set by server implementations * Choose rdp encryption method based on level and supported client methods * Moved FIPS to the lowest priority (only used if other methods are possible) Updated sample server * Support RDP Security (RdpKeyFile was not set) * Added commented sample code for setting the security level
2014-12-12 04:17:12 +03:00
case FreeRDP_UseRdpSecurityLayer:
return settings->UseRdpSecurityLayer;
case FreeRDP_ConsoleSession:
return settings->ConsoleSession;
case FreeRDP_SpanMonitors:
return settings->SpanMonitors;
case FreeRDP_UseMultimon:
return settings->UseMultimon;
case FreeRDP_ForceMultimon:
return settings->ForceMultimon;
case FreeRDP_AutoLogonEnabled:
return settings->AutoLogonEnabled;
case FreeRDP_CompressionEnabled:
return settings->CompressionEnabled;
case FreeRDP_DisableCtrlAltDel:
return settings->DisableCtrlAltDel;
case FreeRDP_EnableWindowsKey:
return settings->EnableWindowsKey;
case FreeRDP_MaximizeShell:
return settings->MaximizeShell;
case FreeRDP_LogonNotify:
return settings->LogonNotify;
case FreeRDP_LogonErrors:
return settings->LogonErrors;
case FreeRDP_MouseAttached:
return settings->MouseAttached;
case FreeRDP_MouseHasWheel:
return settings->MouseHasWheel;
case FreeRDP_RemoteConsoleAudio:
return settings->RemoteConsoleAudio;
case FreeRDP_AudioPlayback:
return settings->AudioPlayback;
case FreeRDP_AudioCapture:
return settings->AudioCapture;
case FreeRDP_VideoDisable:
return settings->VideoDisable;
case FreeRDP_PasswordIsSmartcardPin:
return settings->PasswordIsSmartcardPin;
case FreeRDP_UsingSavedCredentials:
return settings->UsingSavedCredentials;
case FreeRDP_ForceEncryptedCsPdu:
return settings->ForceEncryptedCsPdu;
2013-10-10 06:38:26 +04:00
case FreeRDP_HiDefRemoteApp:
return settings->HiDefRemoteApp;
case FreeRDP_IPv6Enabled:
return settings->IPv6Enabled;
case FreeRDP_AutoReconnectionEnabled:
return settings->AutoReconnectionEnabled;
case FreeRDP_DynamicDaylightTimeDisabled:
return settings->DynamicDaylightTimeDisabled;
case FreeRDP_AllowFontSmoothing:
return settings->AllowFontSmoothing;
case FreeRDP_DisableWallpaper:
return settings->DisableWallpaper;
case FreeRDP_DisableFullWindowDrag:
return settings->DisableFullWindowDrag;
case FreeRDP_DisableMenuAnims:
return settings->DisableMenuAnims;
case FreeRDP_DisableThemes:
return settings->DisableThemes;
case FreeRDP_DisableCursorShadow:
return settings->DisableCursorShadow;
case FreeRDP_DisableCursorBlinking:
return settings->DisableCursorBlinking;
case FreeRDP_AllowDesktopComposition:
return settings->AllowDesktopComposition;
case FreeRDP_RemoteAssistanceMode:
return settings->RemoteAssistanceMode;
case FreeRDP_TlsSecurity:
return settings->TlsSecurity;
case FreeRDP_NlaSecurity:
return settings->NlaSecurity;
case FreeRDP_RdpSecurity:
return settings->RdpSecurity;
case FreeRDP_ExtSecurity:
return settings->ExtSecurity;
case FreeRDP_Authentication:
return settings->Authentication;
case FreeRDP_NegotiateSecurityLayer:
return settings->NegotiateSecurityLayer;
2013-11-06 10:51:55 +04:00
case FreeRDP_RestrictedAdminModeRequired:
return settings->RestrictedAdminModeRequired;
case FreeRDP_DisableCredentialsDelegation:
return settings->DisableCredentialsDelegation;
case FreeRDP_AuthenticationLevel:
return settings->AuthenticationLevel;
case FreeRDP_MstscCookieMode:
return settings->MstscCookieMode;
case FreeRDP_SendPreconnectionPdu:
return settings->SendPreconnectionPdu;
case FreeRDP_IgnoreCertificate:
return settings->IgnoreCertificate;
case FreeRDP_ExternalCertificateManagement:
return settings->ExternalCertificateManagement;
case FreeRDP_Workarea:
return settings->Workarea;
case FreeRDP_Fullscreen:
return settings->Fullscreen;
case FreeRDP_GrabKeyboard:
return settings->GrabKeyboard;
case FreeRDP_Decorations:
return settings->Decorations;
case FreeRDP_SmartSizing:
return settings->SmartSizing;
case FreeRDP_MouseMotion:
return settings->MouseMotion;
case FreeRDP_AsyncInput:
return settings->AsyncInput;
case FreeRDP_AsyncUpdate:
return settings->AsyncUpdate;
case FreeRDP_AsyncChannels:
return settings->AsyncChannels;
case FreeRDP_AsyncTransport:
return settings->AsyncTransport;
case FreeRDP_ToggleFullscreen:
return settings->ToggleFullscreen;
case FreeRDP_SoftwareGdi:
return settings->SoftwareGdi;
case FreeRDP_LocalConnection:
return settings->LocalConnection;
case FreeRDP_AuthenticationOnly:
return settings->AuthenticationOnly;
case FreeRDP_CredentialsFromStdin:
return settings->CredentialsFromStdin;
case FreeRDP_DumpRemoteFx:
return settings->DumpRemoteFx;
case FreeRDP_PlayRemoteFx:
return settings->PlayRemoteFx;
case FreeRDP_GatewayUseSameCredentials:
return settings->GatewayUseSameCredentials;
case FreeRDP_GatewayEnabled:
return settings->GatewayEnabled;
case FreeRDP_GatewayBypassLocal:
return settings->GatewayBypassLocal;
case FreeRDP_GatewayRpcTransport:
return settings->GatewayRpcTransport;
case FreeRDP_GatewayHttpTransport:
return settings->GatewayHttpTransport;
case FreeRDP_GatewayUdpTransport:
return settings->GatewayUdpTransport;
case FreeRDP_RemoteApplicationMode:
return settings->RemoteApplicationMode;
case FreeRDP_DisableRemoteAppCapsCheck:
return settings->DisableRemoteAppCapsCheck;
case FreeRDP_RemoteAppLanguageBarSupported:
return settings->RemoteAppLanguageBarSupported;
case FreeRDP_RefreshRect:
return settings->RefreshRect;
case FreeRDP_SuppressOutput:
return settings->SuppressOutput;
case FreeRDP_FastPathOutput:
return settings->FastPathOutput;
case FreeRDP_SaltedChecksum:
return settings->SaltedChecksum;
case FreeRDP_LongCredentialsSupported:
return settings->LongCredentialsSupported;
case FreeRDP_NoBitmapCompressionHeader:
return settings->NoBitmapCompressionHeader;
case FreeRDP_BitmapCompressionDisabled:
return settings->BitmapCompressionDisabled;
case FreeRDP_DesktopResize:
return settings->DesktopResize;
case FreeRDP_DrawAllowDynamicColorFidelity:
return settings->DrawAllowDynamicColorFidelity;
case FreeRDP_DrawAllowColorSubsampling:
return settings->DrawAllowColorSubsampling;
case FreeRDP_DrawAllowSkipAlpha:
return settings->DrawAllowSkipAlpha;
case FreeRDP_BitmapCacheV3Enabled:
return settings->BitmapCacheV3Enabled;
case FreeRDP_AltSecFrameMarkerSupport:
return settings->AltSecFrameMarkerSupport;
case FreeRDP_BitmapCacheEnabled:
return settings->BitmapCacheEnabled;
case FreeRDP_AllowCacheWaitingList:
return settings->AllowCacheWaitingList;
case FreeRDP_BitmapCachePersistEnabled:
return settings->BitmapCachePersistEnabled;
case FreeRDP_ColorPointerFlag:
return settings->ColorPointerFlag;
case FreeRDP_UnicodeInput:
return settings->UnicodeInput;
case FreeRDP_FastPathInput:
return settings->FastPathInput;
2013-05-09 06:14:16 +04:00
case FreeRDP_MultiTouchInput:
return settings->MultiTouchInput;
case FreeRDP_MultiTouchGestures:
return settings->MultiTouchGestures;
case FreeRDP_SoundBeepsEnabled:
return settings->SoundBeepsEnabled;
case FreeRDP_SurfaceCommandsEnabled:
return settings->SurfaceCommandsEnabled;
case FreeRDP_FrameMarkerCommandEnabled:
return settings->FrameMarkerCommandEnabled;
case FreeRDP_RemoteFxOnly:
return settings->RemoteFxOnly;
case FreeRDP_RemoteFxCodec:
return settings->RemoteFxCodec;
case FreeRDP_RemoteFxImageCodec:
return settings->RemoteFxImageCodec;
case FreeRDP_NSCodec:
return settings->NSCodec;
case FreeRDP_NSCodecAllowSubsampling:
return settings->NSCodecAllowSubsampling;
case FreeRDP_NSCodecAllowDynamicColorFidelity:
return settings->NSCodecAllowDynamicColorFidelity;
case FreeRDP_JpegCodec:
return settings->JpegCodec;
case FreeRDP_GfxThinClient:
return settings->GfxThinClient;
case FreeRDP_GfxSmallCache:
return settings->GfxSmallCache;
case FreeRDP_GfxProgressive:
return settings->GfxProgressive;
case FreeRDP_GfxProgressiveV2:
return settings->GfxProgressiveV2;
case FreeRDP_GfxH264:
return settings->GfxH264;
case FreeRDP_DrawNineGridEnabled:
return settings->DrawNineGridEnabled;
case FreeRDP_DrawGdiPlusEnabled:
return settings->DrawGdiPlusEnabled;
case FreeRDP_DrawGdiPlusCacheEnabled:
return settings->DrawGdiPlusCacheEnabled;
case FreeRDP_DeviceRedirection:
return settings->DeviceRedirection;
case FreeRDP_RedirectDrives:
return settings->RedirectDrives;
case FreeRDP_RedirectHomeDrive:
return settings->RedirectHomeDrive;
case FreeRDP_RedirectSmartCards:
return settings->RedirectSmartCards;
case FreeRDP_RedirectPrinters:
return settings->RedirectPrinters;
case FreeRDP_RedirectSerialPorts:
return settings->RedirectSerialPorts;
case FreeRDP_RedirectParallelPorts:
return settings->RedirectParallelPorts;
case FreeRDP_RedirectClipboard:
return settings->RedirectClipboard;
default:
WLog_ERR(TAG, "freerdp_get_param_bool: unknown id: %d", id);
return -1;
}
}
int freerdp_set_param_bool(rdpSettings* settings, int id, BOOL param)
{
switch (id)
{
case FreeRDP_ServerMode:
settings->ServerMode = param;
break;
case FreeRDP_NetworkAutoDetect:
settings->NetworkAutoDetect = param;
break;
case FreeRDP_SupportAsymetricKeys:
settings->SupportAsymetricKeys = param;
break;
case FreeRDP_SupportErrorInfoPdu:
settings->SupportErrorInfoPdu = param;
break;
case FreeRDP_SupportStatusInfoPdu:
settings->SupportStatusInfoPdu = param;
break;
case FreeRDP_SupportMonitorLayoutPdu:
settings->SupportMonitorLayoutPdu = param;
break;
case FreeRDP_SupportGraphicsPipeline:
settings->SupportGraphicsPipeline = param;
break;
case FreeRDP_SupportDynamicTimeZone:
settings->SupportDynamicTimeZone = param;
break;
Standard RDP Security Layer Levels/Method Overhaul [MS-RDPBCGR] Section 5.3 describes the encryption level and method values for standard RDP security. Looking at the current usage of these values in the FreeRDP code gives me reason to believe that there is a certain lack of understanding of how these values should be handled. The encryption level is only configured on the server side in the "Encryption Level" setting found in the Remote Desktop Session Host Configuration RDP-Tcp properties dialog and this value is never transferred from the client to the server over the wire. The possible options are "None", "Low", "Client Compatible", "High" and "FIPS Compliant". The client receices this value in the Server Security Data block (TS_UD_SC_SEC1), probably only for informational purposes and maybe to give the client the possibility to verify if the server's decision for the encryption method confirms to the server's encryption level. The possible encryption methods are "NONE", "40BIT", "56BIT", "128BIT" and "FIPS" and the RDP client advertises the ones it supports to the server in the Client Security Data block (TS_UD_CS_SEC). The server's configured encryption level value restricts the possible final encryption method. Something that I was not able to find in the documentation is the priority level of the individual encryption methods based on which the server makes its final method decision if there are several options. My analysis with Windows Servers reveiled that the order is 128, 56, 40, FIPS. The server only chooses FIPS if the level is "FIPS Comliant" or if it is the only method advertised by the client. Bottom line: * FreeRDP's client side does not need to set settings->EncryptionLevel (which was done quite frequently). * FreeRDP's server side does not have to set the supported encryption methods list in settings->EncryptionMethods Changes in this commit: Removed unnecessary/confusing changes of EncryptionLevel/Methods settings Refactor settings->DisableEncryption * This value actually means "Advanced RDP Encryption (NLA/TLS) is NOT used" * The old name caused lots of confusion among developers * Renamed it to "UseRdpSecurityLayer" (the compare logic stays untouched) Any client's setting of settings->EncryptionMethods were annihilated * All clients "want" to set all supported methods * Some clients forgot 56bit because 56bit was not supported at the time the code was written * settings->EncryptionMethods was overwritten anyways in nego_connect() * Removed all client side settings of settings->EncryptionMethods The default is "None" (0) * Changed nego_connect() to advertise all supported methods if settings->EncryptionMethods is 0 (None) * Added a commandline option /encryption-methods:comma separated list of the values "40", "56", "128", "FIPS". E.g. /encryption-methods:56,128 * Print warning if server chooses non-advertised method Verify received level and method in client's gcc_read_server_security_data * Only accept valid/known encryption methods * Verify encryption level/method combinations according to MS-RDPBCGR 5.3.2 Server implementations can now set settings->EncryptionLevel * The default for settings->EncryptionLevel is 0 (None) * nego_send_negotiation_response() changes it to ClientCompatible in that case * default to ClientCompatible if the server implementation set an invalid level Fix server's gcc_write_server_security_data * Verify server encryption level value set by server implementations * Choose rdp encryption method based on level and supported client methods * Moved FIPS to the lowest priority (only used if other methods are possible) Updated sample server * Support RDP Security (RdpKeyFile was not set) * Added commented sample code for setting the security level
2014-12-12 04:17:12 +03:00
case FreeRDP_UseRdpSecurityLayer:
settings->UseRdpSecurityLayer = param;
break;
case FreeRDP_ConsoleSession:
settings->ConsoleSession = param;
break;
case FreeRDP_SpanMonitors:
settings->SpanMonitors = param;
break;
case FreeRDP_UseMultimon:
settings->UseMultimon = param;
break;
case FreeRDP_ForceMultimon:
settings->ForceMultimon = param;
break;
case FreeRDP_AutoLogonEnabled:
settings->AutoLogonEnabled = param;
break;
case FreeRDP_CompressionEnabled:
settings->CompressionEnabled = param;
break;
case FreeRDP_DisableCtrlAltDel:
settings->DisableCtrlAltDel = param;
break;
case FreeRDP_EnableWindowsKey:
settings->EnableWindowsKey = param;
break;
case FreeRDP_MaximizeShell:
settings->MaximizeShell = param;
break;
case FreeRDP_LogonNotify:
settings->LogonNotify = param;
break;
case FreeRDP_LogonErrors:
settings->LogonErrors = param;
break;
case FreeRDP_MouseAttached:
settings->MouseAttached = param;
break;
case FreeRDP_MouseHasWheel:
settings->MouseHasWheel = param;
break;
case FreeRDP_RemoteConsoleAudio:
settings->RemoteConsoleAudio = param;
break;
case FreeRDP_AudioPlayback:
settings->AudioPlayback = param;
break;
case FreeRDP_AudioCapture:
settings->AudioCapture = param;
break;
case FreeRDP_VideoDisable:
settings->VideoDisable = param;
break;
case FreeRDP_PasswordIsSmartcardPin:
settings->PasswordIsSmartcardPin = param;
break;
case FreeRDP_UsingSavedCredentials:
settings->UsingSavedCredentials = param;
break;
case FreeRDP_ForceEncryptedCsPdu:
settings->ForceEncryptedCsPdu = param;
break;
2013-10-10 06:38:26 +04:00
case FreeRDP_HiDefRemoteApp:
settings->HiDefRemoteApp = param;
break;
case FreeRDP_IPv6Enabled:
settings->IPv6Enabled = param;
break;
case FreeRDP_AutoReconnectionEnabled:
settings->AutoReconnectionEnabled = param;
break;
case FreeRDP_DynamicDaylightTimeDisabled:
settings->DynamicDaylightTimeDisabled = param;
break;
case FreeRDP_AllowFontSmoothing:
settings->AllowFontSmoothing = param;
break;
case FreeRDP_DisableWallpaper:
settings->DisableWallpaper = param;
break;
case FreeRDP_DisableFullWindowDrag:
settings->DisableFullWindowDrag = param;
break;
case FreeRDP_DisableMenuAnims:
settings->DisableMenuAnims = param;
break;
case FreeRDP_DisableThemes:
settings->DisableThemes = param;
break;
case FreeRDP_DisableCursorShadow:
settings->DisableCursorShadow = param;
break;
case FreeRDP_DisableCursorBlinking:
settings->DisableCursorBlinking = param;
break;
case FreeRDP_AllowDesktopComposition:
settings->AllowDesktopComposition = param;
break;
case FreeRDP_RemoteAssistanceMode:
settings->RemoteAssistanceMode = param;
break;
case FreeRDP_TlsSecurity:
settings->TlsSecurity = param;
break;
case FreeRDP_NlaSecurity:
settings->NlaSecurity = param;
break;
case FreeRDP_RdpSecurity:
settings->RdpSecurity = param;
break;
case FreeRDP_ExtSecurity:
settings->ExtSecurity = param;
break;
case FreeRDP_Authentication:
settings->Authentication = param;
break;
case FreeRDP_NegotiateSecurityLayer:
settings->NegotiateSecurityLayer = param;
break;
2013-11-06 10:51:55 +04:00
case FreeRDP_RestrictedAdminModeRequired:
settings->RestrictedAdminModeRequired = param;
break;
case FreeRDP_DisableCredentialsDelegation:
settings->DisableCredentialsDelegation = param;
break;
case FreeRDP_AuthenticationLevel:
settings->AuthenticationLevel = param;
break;
case FreeRDP_MstscCookieMode:
settings->MstscCookieMode = param;
break;
case FreeRDP_SendPreconnectionPdu:
settings->SendPreconnectionPdu = param;
break;
case FreeRDP_IgnoreCertificate:
settings->IgnoreCertificate = param;
break;
case FreeRDP_ExternalCertificateManagement:
settings->ExternalCertificateManagement = param;
break;
case FreeRDP_Workarea:
settings->Workarea = param;
break;
case FreeRDP_Fullscreen:
settings->Fullscreen = param;
break;
case FreeRDP_GrabKeyboard:
settings->GrabKeyboard = param;
break;
case FreeRDP_Decorations:
settings->Decorations = param;
break;
case FreeRDP_SmartSizing:
settings->SmartSizing = param;
break;
case FreeRDP_MouseMotion:
settings->MouseMotion = param;
break;
case FreeRDP_AsyncInput:
settings->AsyncInput = param;
break;
case FreeRDP_AsyncUpdate:
settings->AsyncUpdate = param;
break;
case FreeRDP_AsyncChannels:
settings->AsyncChannels = param;
break;
case FreeRDP_AsyncTransport:
settings->AsyncTransport = param;
break;
case FreeRDP_ToggleFullscreen:
settings->ToggleFullscreen = param;
break;
case FreeRDP_SoftwareGdi:
settings->SoftwareGdi = param;
break;
case FreeRDP_LocalConnection:
settings->LocalConnection = param;
break;
case FreeRDP_AuthenticationOnly:
settings->AuthenticationOnly = param;
break;
case FreeRDP_CredentialsFromStdin:
settings->CredentialsFromStdin = param;
break;
case FreeRDP_DumpRemoteFx:
settings->DumpRemoteFx = param;
break;
case FreeRDP_PlayRemoteFx:
settings->PlayRemoteFx = param;
break;
case FreeRDP_GatewayUseSameCredentials:
settings->GatewayUseSameCredentials = param;
break;
case FreeRDP_GatewayEnabled:
settings->GatewayEnabled = param;
break;
case FreeRDP_GatewayBypassLocal:
settings->GatewayBypassLocal = param;
break;
case FreeRDP_GatewayRpcTransport:
settings->GatewayRpcTransport = param;
break;
case FreeRDP_GatewayHttpTransport:
settings->GatewayHttpTransport = param;
break;
case FreeRDP_GatewayUdpTransport:
settings->GatewayUdpTransport = param;
break;
case FreeRDP_RemoteApplicationMode:
settings->RemoteApplicationMode = param;
break;
case FreeRDP_DisableRemoteAppCapsCheck:
settings->DisableRemoteAppCapsCheck = param;
break;
case FreeRDP_RemoteAppLanguageBarSupported:
settings->RemoteAppLanguageBarSupported = param;
break;
case FreeRDP_RefreshRect:
settings->RefreshRect = param;
break;
case FreeRDP_SuppressOutput:
settings->SuppressOutput = param;
break;
case FreeRDP_FastPathOutput:
settings->FastPathOutput = param;
break;
case FreeRDP_SaltedChecksum:
settings->SaltedChecksum = param;
break;
case FreeRDP_LongCredentialsSupported:
settings->LongCredentialsSupported = param;
break;
case FreeRDP_NoBitmapCompressionHeader:
settings->NoBitmapCompressionHeader = param;
break;
case FreeRDP_BitmapCompressionDisabled:
settings->BitmapCompressionDisabled = param;
break;
case FreeRDP_DesktopResize:
settings->DesktopResize = param;
break;
case FreeRDP_DrawAllowDynamicColorFidelity:
settings->DrawAllowDynamicColorFidelity = param;
break;
case FreeRDP_DrawAllowColorSubsampling:
settings->DrawAllowColorSubsampling = param;
break;
case FreeRDP_DrawAllowSkipAlpha:
settings->DrawAllowSkipAlpha = param;
break;
case FreeRDP_BitmapCacheV3Enabled:
settings->BitmapCacheV3Enabled = param;
break;
case FreeRDP_AltSecFrameMarkerSupport:
settings->AltSecFrameMarkerSupport = param;
break;
case FreeRDP_BitmapCacheEnabled:
settings->BitmapCacheEnabled = param;
break;
case FreeRDP_AllowCacheWaitingList:
settings->AllowCacheWaitingList = param;
break;
case FreeRDP_BitmapCachePersistEnabled:
settings->BitmapCachePersistEnabled = param;
break;
case FreeRDP_ColorPointerFlag:
settings->ColorPointerFlag = param;
break;
case FreeRDP_UnicodeInput:
settings->UnicodeInput = param;
break;
case FreeRDP_FastPathInput:
settings->FastPathInput = param;
break;
2013-05-09 06:14:16 +04:00
case FreeRDP_MultiTouchInput:
settings->MultiTouchInput = param;
break;
case FreeRDP_MultiTouchGestures:
settings->MultiTouchGestures = param;
break;
case FreeRDP_SoundBeepsEnabled:
settings->SoundBeepsEnabled = param;
break;
case FreeRDP_SurfaceCommandsEnabled:
settings->SurfaceCommandsEnabled = param;
break;
case FreeRDP_FrameMarkerCommandEnabled:
settings->FrameMarkerCommandEnabled = param;
break;
case FreeRDP_RemoteFxOnly:
settings->RemoteFxOnly = param;
break;
case FreeRDP_RemoteFxCodec:
settings->RemoteFxCodec = param;
break;
case FreeRDP_RemoteFxImageCodec:
settings->RemoteFxImageCodec = param;
break;
case FreeRDP_NSCodec:
settings->NSCodec = param;
break;
case FreeRDP_NSCodecAllowSubsampling:
settings->NSCodecAllowSubsampling = param;
break;
case FreeRDP_NSCodecAllowDynamicColorFidelity:
settings->NSCodecAllowDynamicColorFidelity = param;
break;
case FreeRDP_JpegCodec:
settings->JpegCodec = param;
break;
case FreeRDP_GfxThinClient:
settings->GfxThinClient = param;
break;
case FreeRDP_GfxSmallCache:
settings->GfxSmallCache = param;
break;
case FreeRDP_GfxProgressive:
settings->GfxProgressive = param;
break;
case FreeRDP_GfxProgressiveV2:
settings->GfxProgressiveV2 = param;
break;
case FreeRDP_GfxH264:
settings->GfxH264 = param;
break;
case FreeRDP_DrawNineGridEnabled:
settings->DrawNineGridEnabled = param;
break;
case FreeRDP_DrawGdiPlusEnabled:
settings->DrawGdiPlusEnabled = param;
break;
case FreeRDP_DrawGdiPlusCacheEnabled:
settings->DrawGdiPlusCacheEnabled = param;
break;
case FreeRDP_DeviceRedirection:
settings->DeviceRedirection = param;
break;
case FreeRDP_RedirectDrives:
settings->RedirectDrives = param;
break;
case FreeRDP_RedirectHomeDrive:
settings->RedirectHomeDrive = param;
break;
case FreeRDP_RedirectSmartCards:
settings->RedirectSmartCards = param;
break;
case FreeRDP_RedirectPrinters:
settings->RedirectPrinters = param;
break;
case FreeRDP_RedirectSerialPorts:
settings->RedirectSerialPorts = param;
break;
case FreeRDP_RedirectParallelPorts:
settings->RedirectParallelPorts = param;
break;
case FreeRDP_RedirectClipboard:
settings->RedirectClipboard = param;
break;
default:
WLog_ERR(TAG, "freerdp_set_param_bool: unknown id %d (param = %d)", id, param);
return -1;
}
/* Mark field as modified */
settings->SettingsModified[id] = 1;
return -1;
}
int freerdp_get_param_int(rdpSettings* settings, int id)
{
switch (id)
{
case FreeRDP_XPan:
return settings->XPan;
case FreeRDP_YPan:
return settings->YPan;
default:
WLog_ERR(TAG, "freerdp_get_param_int: unknown id: %d", id);
return 0;
}
}
int freerdp_set_param_int(rdpSettings* settings, int id, int param)
{
switch (id)
{
case FreeRDP_XPan:
settings->XPan = param;
break;
case FreeRDP_YPan:
settings->YPan = param;
break;
default:
WLog_ERR(TAG, "freerdp_set_param_int: unknown id %d (param = %d)", id, param);
return -1;
}
settings->SettingsModified[id] = 1;
return 0;
}
UINT32 freerdp_get_param_uint32(rdpSettings* settings, int id)
{
switch (id)
{
case FreeRDP_ShareId:
return settings->ShareId;
case FreeRDP_PduSource:
return settings->PduSource;
case FreeRDP_ServerPort:
return settings->ServerPort;
case FreeRDP_RdpVersion:
return settings->RdpVersion;
case FreeRDP_DesktopWidth:
return settings->DesktopWidth;
case FreeRDP_DesktopHeight:
return settings->DesktopHeight;
case FreeRDP_ColorDepth:
return settings->ColorDepth;
case FreeRDP_ConnectionType:
return settings->ConnectionType;
case FreeRDP_ClientBuild:
return settings->ClientBuild;
case FreeRDP_EarlyCapabilityFlags:
return settings->EarlyCapabilityFlags;
case FreeRDP_EncryptionMethods:
return settings->EncryptionMethods;
case FreeRDP_ExtEncryptionMethods:
return settings->ExtEncryptionMethods;
case FreeRDP_EncryptionLevel:
return settings->EncryptionLevel;
case FreeRDP_ServerRandomLength:
return settings->ServerRandomLength;
case FreeRDP_ClientRandomLength:
return settings->ClientRandomLength;
case FreeRDP_ChannelCount:
return settings->ChannelCount;
case FreeRDP_ChannelDefArraySize:
return settings->ChannelDefArraySize;
case FreeRDP_ClusterInfoFlags:
return settings->ClusterInfoFlags;
case FreeRDP_RedirectedSessionId:
return settings->RedirectedSessionId;
case FreeRDP_MonitorDefArraySize:
return settings->MonitorDefArraySize;
case FreeRDP_DesktopPosX:
return settings->DesktopPosX;
case FreeRDP_DesktopPosY:
return settings->DesktopPosY;
case FreeRDP_MultitransportFlags:
return settings->MultitransportFlags;
case FreeRDP_CompressionLevel:
return settings->CompressionLevel;
case FreeRDP_AutoReconnectMaxRetries:
return settings->AutoReconnectMaxRetries;
case FreeRDP_PerformanceFlags:
return settings->PerformanceFlags;
case FreeRDP_RequestedProtocols:
return settings->RequestedProtocols;
case FreeRDP_SelectedProtocol:
return settings->SelectedProtocol;
case FreeRDP_NegotiationFlags:
return settings->NegotiationFlags;
case FreeRDP_CookieMaxLength:
return settings->CookieMaxLength;
case FreeRDP_PreconnectionId:
return settings->PreconnectionId;
case FreeRDP_RedirectionFlags:
return settings->RedirectionFlags;
case FreeRDP_LoadBalanceInfoLength:
return settings->LoadBalanceInfoLength;
case FreeRDP_RedirectionPasswordLength:
return settings->RedirectionPasswordLength;
case FreeRDP_RedirectionTsvUrlLength:
return settings->RedirectionTsvUrlLength;
case FreeRDP_TargetNetAddressCount:
return settings->TargetNetAddressCount;
case FreeRDP_PercentScreen:
return settings->PercentScreen;
case FreeRDP_GatewayUsageMethod:
return settings->GatewayUsageMethod;
case FreeRDP_GatewayPort:
return settings->GatewayPort;
case FreeRDP_GatewayCredentialsSource:
return settings->GatewayCredentialsSource;
case FreeRDP_RemoteAppNumIconCaches:
return settings->RemoteAppNumIconCaches;
case FreeRDP_RemoteAppNumIconCacheEntries:
return settings->RemoteAppNumIconCacheEntries;
case FreeRDP_ReceivedCapabilitiesSize:
return settings->ReceivedCapabilitiesSize;
case FreeRDP_OsMajorType:
return settings->OsMajorType;
case FreeRDP_OsMinorType:
return settings->OsMinorType;
case FreeRDP_BitmapCacheVersion:
return settings->BitmapCacheVersion;
case FreeRDP_BitmapCacheV2NumCells:
return settings->BitmapCacheV2NumCells;
case FreeRDP_PointerCacheSize:
return settings->PointerCacheSize;
case FreeRDP_KeyboardLayout:
return settings->KeyboardLayout;
case FreeRDP_KeyboardType:
return settings->KeyboardType;
case FreeRDP_KeyboardSubType:
return settings->KeyboardSubType;
case FreeRDP_KeyboardFunctionKey:
return settings->KeyboardFunctionKey;
2014-07-09 00:32:28 +04:00
case FreeRDP_KeyboardHook:
return settings->KeyboardHook;
break;
case FreeRDP_BrushSupportLevel:
return settings->BrushSupportLevel;
case FreeRDP_GlyphSupportLevel:
return settings->GlyphSupportLevel;
case FreeRDP_OffscreenSupportLevel:
return settings->OffscreenSupportLevel;
case FreeRDP_OffscreenCacheSize:
return settings->OffscreenCacheSize;
case FreeRDP_OffscreenCacheEntries:
return settings->OffscreenCacheEntries;
case FreeRDP_VirtualChannelCompressionFlags:
return settings->VirtualChannelCompressionFlags;
case FreeRDP_VirtualChannelChunkSize:
return settings->VirtualChannelChunkSize;
case FreeRDP_MultifragMaxRequestSize:
return settings->MultifragMaxRequestSize;
case FreeRDP_LargePointerFlag:
return settings->LargePointerFlag;
case FreeRDP_CompDeskSupportLevel:
return settings->CompDeskSupportLevel;
case FreeRDP_RemoteFxCodecId:
return settings->RemoteFxCodecId;
case FreeRDP_RemoteFxCodecMode:
return settings->RemoteFxCodecMode;
case FreeRDP_NSCodecId:
return settings->NSCodecId;
case FreeRDP_FrameAcknowledge:
return settings->FrameAcknowledge;
case FreeRDP_NSCodecColorLossLevel:
return settings->NSCodecColorLossLevel;
case FreeRDP_JpegCodecId:
return settings->JpegCodecId;
case FreeRDP_JpegQuality:
return settings->JpegQuality;
case FreeRDP_BitmapCacheV3CodecId:
return settings->BitmapCacheV3CodecId;
case FreeRDP_DrawNineGridCacheSize:
return settings->DrawNineGridCacheSize;
case FreeRDP_DrawNineGridCacheEntries:
return settings->DrawNineGridCacheEntries;
case FreeRDP_DeviceCount:
return settings->DeviceCount;
case FreeRDP_DeviceArraySize:
return settings->DeviceArraySize;
case FreeRDP_StaticChannelCount:
return settings->StaticChannelCount;
case FreeRDP_StaticChannelArraySize:
return settings->StaticChannelArraySize;
case FreeRDP_DynamicChannelCount:
return settings->DynamicChannelCount;
case FreeRDP_DynamicChannelArraySize:
return settings->DynamicChannelArraySize;
case FreeRDP_SmartSizingWidth:
return settings->SmartSizingWidth;
case FreeRDP_SmartSizingHeight:
return settings->SmartSizingHeight;
default:
WLog_ERR(TAG, "freerdp_get_param_uint32: unknown id: %d", id);
return 0;
}
}
int freerdp_set_param_uint32(rdpSettings* settings, int id, UINT32 param)
{
switch (id)
{
case FreeRDP_ShareId:
settings->ShareId = param;
break;
case FreeRDP_PduSource:
settings->PduSource = param;
break;
case FreeRDP_ServerPort:
settings->ServerPort = param;
break;
case FreeRDP_RdpVersion:
settings->RdpVersion = param;
break;
case FreeRDP_DesktopWidth:
settings->DesktopWidth = param;
break;
case FreeRDP_DesktopHeight:
settings->DesktopHeight = param;
break;
case FreeRDP_ColorDepth:
settings->ColorDepth = param;
break;
case FreeRDP_ConnectionType:
settings->ConnectionType = param;
break;
case FreeRDP_ClientBuild:
settings->ClientBuild = param;
break;
case FreeRDP_EarlyCapabilityFlags:
settings->EarlyCapabilityFlags = param;
break;
case FreeRDP_EncryptionMethods:
settings->EncryptionMethods = param;
break;
case FreeRDP_ExtEncryptionMethods:
settings->ExtEncryptionMethods = param;
break;
case FreeRDP_EncryptionLevel:
settings->EncryptionLevel = param;
break;
case FreeRDP_ServerRandomLength:
settings->ServerRandomLength = param;
break;
case FreeRDP_ClientRandomLength:
settings->ClientRandomLength = param;
break;
case FreeRDP_ChannelCount:
settings->ChannelCount = param;
break;
case FreeRDP_ChannelDefArraySize:
settings->ChannelDefArraySize = param;
break;
case FreeRDP_ClusterInfoFlags:
settings->ClusterInfoFlags = param;
break;
case FreeRDP_RedirectedSessionId:
settings->RedirectedSessionId = param;
break;
case FreeRDP_MonitorDefArraySize:
settings->MonitorDefArraySize = param;
break;
case FreeRDP_DesktopPosX:
settings->DesktopPosX = param;
break;
case FreeRDP_DesktopPosY:
settings->DesktopPosY = param;
break;
case FreeRDP_MultitransportFlags:
settings->MultitransportFlags = param;
break;
case FreeRDP_CompressionLevel:
settings->CompressionLevel = param;
break;
case FreeRDP_AutoReconnectMaxRetries:
settings->AutoReconnectMaxRetries = param;
break;
case FreeRDP_PerformanceFlags:
settings->PerformanceFlags = param;
break;
case FreeRDP_RequestedProtocols:
settings->RequestedProtocols = param;
break;
case FreeRDP_SelectedProtocol:
settings->SelectedProtocol = param;
break;
case FreeRDP_NegotiationFlags:
settings->NegotiationFlags = param;
break;
case FreeRDP_CookieMaxLength:
settings->CookieMaxLength = param;
break;
case FreeRDP_PreconnectionId:
settings->PreconnectionId = param;
break;
case FreeRDP_RedirectionFlags:
settings->RedirectionFlags = param;
break;
case FreeRDP_LoadBalanceInfoLength:
settings->LoadBalanceInfoLength = param;
break;
case FreeRDP_RedirectionPasswordLength:
settings->RedirectionPasswordLength = param;
break;
case FreeRDP_RedirectionTsvUrlLength:
settings->RedirectionTsvUrlLength = param;
break;
case FreeRDP_TargetNetAddressCount:
settings->TargetNetAddressCount = param;
break;
case FreeRDP_PercentScreen:
settings->PercentScreen = param;
break;
case FreeRDP_GatewayUsageMethod:
settings->GatewayUsageMethod = param;
break;
case FreeRDP_GatewayPort:
settings->GatewayPort = param;
break;
case FreeRDP_GatewayCredentialsSource:
settings->GatewayCredentialsSource = param;
break;
case FreeRDP_RemoteAppNumIconCaches:
settings->RemoteAppNumIconCaches = param;
break;
case FreeRDP_RemoteAppNumIconCacheEntries:
settings->RemoteAppNumIconCacheEntries = param;
break;
case FreeRDP_ReceivedCapabilitiesSize:
settings->ReceivedCapabilitiesSize = param;
break;
case FreeRDP_OsMajorType:
settings->OsMajorType = param;
break;
case FreeRDP_OsMinorType:
settings->OsMinorType = param;
break;
case FreeRDP_BitmapCacheVersion:
settings->BitmapCacheVersion = param;
break;
case FreeRDP_BitmapCacheV2NumCells:
settings->BitmapCacheV2NumCells = param;
break;
case FreeRDP_PointerCacheSize:
settings->PointerCacheSize = param;
break;
case FreeRDP_KeyboardLayout:
settings->KeyboardLayout = param;
break;
case FreeRDP_KeyboardType:
settings->KeyboardType = param;
break;
case FreeRDP_KeyboardSubType:
settings->KeyboardSubType = param;
break;
case FreeRDP_KeyboardFunctionKey:
settings->KeyboardFunctionKey = param;
break;
2014-07-09 00:32:28 +04:00
case FreeRDP_KeyboardHook:
settings->KeyboardHook = param;
break;
case FreeRDP_BrushSupportLevel:
settings->BrushSupportLevel = param;
break;
case FreeRDP_GlyphSupportLevel:
settings->GlyphSupportLevel = param;
break;
case FreeRDP_OffscreenSupportLevel:
settings->OffscreenSupportLevel = param;
break;
case FreeRDP_OffscreenCacheSize:
settings->OffscreenCacheSize = param;
break;
case FreeRDP_OffscreenCacheEntries:
settings->OffscreenCacheEntries = param;
break;
case FreeRDP_VirtualChannelCompressionFlags:
settings->VirtualChannelCompressionFlags = param;
break;
case FreeRDP_VirtualChannelChunkSize:
settings->VirtualChannelChunkSize = param;
break;
case FreeRDP_MultifragMaxRequestSize:
settings->MultifragMaxRequestSize = param;
break;
case FreeRDP_LargePointerFlag:
settings->LargePointerFlag = param;
break;
case FreeRDP_CompDeskSupportLevel:
settings->CompDeskSupportLevel = param;
break;
case FreeRDP_RemoteFxCodecId:
settings->RemoteFxCodecId = param;
break;
case FreeRDP_RemoteFxCodecMode:
settings->RemoteFxCodecMode = param;
break;
case FreeRDP_NSCodecId:
settings->NSCodecId = param;
break;
case FreeRDP_FrameAcknowledge:
settings->FrameAcknowledge = param;
break;
case FreeRDP_NSCodecColorLossLevel:
settings->NSCodecColorLossLevel = param;
break;
case FreeRDP_JpegCodecId:
settings->JpegCodecId = param;
break;
case FreeRDP_JpegQuality:
settings->JpegQuality = param;
break;
case FreeRDP_BitmapCacheV3CodecId:
settings->BitmapCacheV3CodecId = param;
break;
case FreeRDP_DrawNineGridCacheSize:
settings->DrawNineGridCacheSize = param;
break;
case FreeRDP_DrawNineGridCacheEntries:
settings->DrawNineGridCacheEntries = param;
break;
case FreeRDP_DeviceCount:
settings->DeviceCount = param;
break;
case FreeRDP_DeviceArraySize:
settings->DeviceArraySize = param;
break;
case FreeRDP_StaticChannelCount:
settings->StaticChannelCount = param;
break;
case FreeRDP_StaticChannelArraySize:
settings->StaticChannelArraySize = param;
break;
case FreeRDP_DynamicChannelCount:
settings->DynamicChannelCount = param;
break;
case FreeRDP_DynamicChannelArraySize:
settings->DynamicChannelArraySize = param;
break;
default:
WLog_ERR(TAG, "freerdp_set_param_uint32: unknown id %d (param = %u)", id, param);
return -1;
}
/* Mark field as modified */
settings->SettingsModified[id] = 1;
return 0;
}
2013-04-06 03:08:37 +04:00
UINT64 freerdp_get_param_uint64(rdpSettings* settings, int id)
{
switch (id)
{
case FreeRDP_ParentWindowId:
return settings->ParentWindowId;
default:
WLog_ERR(TAG, "freerdp_get_param_uint64: unknown id: %d", id);
2013-04-06 03:08:37 +04:00
return -1;
}
}
int freerdp_set_param_uint64(rdpSettings* settings, int id, UINT64 param)
{
switch (id)
{
case FreeRDP_ParentWindowId:
settings->ParentWindowId = param;
break;
default:
WLog_ERR(TAG, "freerdp_set_param_uint64: unknown id %d (param = %u)", id, (UINT32) param);
2013-04-06 03:08:37 +04:00
return -1;
}
/* Mark field as modified */
settings->SettingsModified[id] = 1;
2013-04-06 03:08:37 +04:00
return 0;
}
char* freerdp_get_param_string(rdpSettings* settings, int id)
{
switch (id)
{
case FreeRDP_ServerHostname:
return settings->ServerHostname;
case FreeRDP_Username:
return settings->Username;
case FreeRDP_Password:
return settings->Password;
case FreeRDP_Domain:
return settings->Domain;
case FreeRDP_PasswordHash:
return settings->PasswordHash;
case FreeRDP_ClientHostname:
return settings->ClientHostname;
case FreeRDP_ClientProductId:
return settings->ClientProductId;
case FreeRDP_AlternateShell:
return settings->AlternateShell;
case FreeRDP_ShellWorkingDirectory:
return settings->ShellWorkingDirectory;
case FreeRDP_ClientAddress:
return settings->ClientAddress;
case FreeRDP_ClientDir:
return settings->ClientDir;
case FreeRDP_DynamicDSTTimeZoneKeyName:
return settings->DynamicDSTTimeZoneKeyName;
case FreeRDP_RemoteAssistanceSessionId:
return settings->RemoteAssistanceSessionId;
case FreeRDP_RemoteAssistancePassStub:
return settings->RemoteAssistancePassStub;
case FreeRDP_RemoteAssistancePassword:
return settings->RemoteAssistancePassword;
case FreeRDP_RemoteAssistanceRCTicket:
return settings->RemoteAssistanceRCTicket;
2014-02-12 09:43:02 +04:00
case FreeRDP_AuthenticationServiceClass:
return settings->AuthenticationServiceClass;
case FreeRDP_PreconnectionBlob:
return settings->PreconnectionBlob;
case FreeRDP_KerberosKdc:
return settings->KerberosKdc;
case FreeRDP_KerberosRealm:
return settings->KerberosRealm;
case FreeRDP_CertificateName:
return settings->CertificateName;
case FreeRDP_CertificateFile:
return settings->CertificateFile;
case FreeRDP_PrivateKeyFile:
return settings->PrivateKeyFile;
case FreeRDP_RdpKeyFile:
return settings->RdpKeyFile;
case FreeRDP_CertificateContent:
return settings->CertificateContent;
case FreeRDP_PrivateKeyContent:
return settings->PrivateKeyContent;
case FreeRDP_RdpKeyContent:
return settings->RdpKeyContent;
case FreeRDP_WindowTitle:
return settings->WindowTitle;
case FreeRDP_ComputerName:
return settings->ComputerName;
case FreeRDP_ConnectionFile:
return settings->ConnectionFile;
case FreeRDP_AssistanceFile:
return settings->AssistanceFile;
case FreeRDP_HomePath:
return settings->HomePath;
case FreeRDP_ConfigPath:
return settings->ConfigPath;
case FreeRDP_CurrentPath:
return settings->CurrentPath;
case FreeRDP_DumpRemoteFxFile:
return settings->DumpRemoteFxFile;
case FreeRDP_PlayRemoteFxFile:
return settings->PlayRemoteFxFile;
case FreeRDP_GatewayHostname:
return settings->GatewayHostname;
case FreeRDP_GatewayUsername:
return settings->GatewayUsername;
case FreeRDP_GatewayPassword:
return settings->GatewayPassword;
case FreeRDP_GatewayDomain:
return settings->GatewayDomain;
case FreeRDP_RemoteApplicationName:
return settings->RemoteApplicationName;
case FreeRDP_RemoteApplicationIcon:
return settings->RemoteApplicationIcon;
case FreeRDP_RemoteApplicationProgram:
return settings->RemoteApplicationProgram;
case FreeRDP_RemoteApplicationFile:
return settings->RemoteApplicationFile;
case FreeRDP_RemoteApplicationGuid:
return settings->RemoteApplicationGuid;
case FreeRDP_RemoteApplicationCmdLine:
return settings->RemoteApplicationCmdLine;
case FreeRDP_ImeFileName:
return settings->ImeFileName;
case FreeRDP_DrivesToRedirect:
return settings->DrivesToRedirect;
default:
WLog_ERR(TAG, "freerdp_get_param_string: unknown id: %d", id);
return NULL;
}
}
int freerdp_set_param_string(rdpSettings* settings, int id, const char* param)
{
2015-06-22 19:52:13 +03:00
char **tmp = NULL;
if (!param)
return -1;
switch (id)
{
case FreeRDP_ServerHostname:
2015-06-22 19:52:13 +03:00
tmp = &settings->ServerHostname;
break;
case FreeRDP_Username:
2015-06-22 19:52:13 +03:00
tmp = &settings->Username;
break;
case FreeRDP_Password:
2015-06-22 19:52:13 +03:00
tmp = &settings->Password;
break;
case FreeRDP_Domain:
2015-06-22 19:52:13 +03:00
tmp = &settings->Domain;
break;
case FreeRDP_PasswordHash:
2015-06-22 19:52:13 +03:00
tmp = &settings->PasswordHash;
break;
case FreeRDP_ClientHostname:
2015-06-22 19:52:13 +03:00
tmp = &settings->ClientHostname;
break;
case FreeRDP_ClientProductId:
2015-06-22 19:52:13 +03:00
tmp = &settings->ClientProductId;
break;
case FreeRDP_AlternateShell:
2015-06-22 19:52:13 +03:00
tmp = &settings->AlternateShell;
break;
case FreeRDP_ShellWorkingDirectory:
2015-06-22 19:52:13 +03:00
tmp = &settings->ShellWorkingDirectory;
break;
case FreeRDP_ClientAddress:
2015-06-22 19:52:13 +03:00
tmp = &settings->ClientAddress;
break;
case FreeRDP_ClientDir:
2015-06-22 19:52:13 +03:00
tmp = &settings->ClientDir;
break;
case FreeRDP_DynamicDSTTimeZoneKeyName:
2015-06-22 19:52:13 +03:00
tmp = &settings->DynamicDSTTimeZoneKeyName;
break;
case FreeRDP_RemoteAssistanceSessionId:
2015-06-22 19:52:13 +03:00
tmp = &settings->RemoteAssistanceSessionId;
break;
case FreeRDP_RemoteAssistancePassStub:
2015-06-22 19:52:13 +03:00
tmp = &settings->RemoteAssistancePassStub;
break;
case FreeRDP_RemoteAssistancePassword:
2015-06-22 19:52:13 +03:00
tmp = &settings->RemoteAssistancePassword;
break;
case FreeRDP_RemoteAssistanceRCTicket:
2015-06-22 19:52:13 +03:00
tmp = &settings->RemoteAssistanceRCTicket;
break;
2014-02-12 09:43:02 +04:00
case FreeRDP_AuthenticationServiceClass:
2015-06-22 19:52:13 +03:00
tmp = &settings->AuthenticationServiceClass;
2014-02-12 09:43:02 +04:00
break;
case FreeRDP_PreconnectionBlob:
2015-06-22 19:52:13 +03:00
tmp = &settings->PreconnectionBlob;
break;
case FreeRDP_KerberosKdc:
2015-06-22 19:52:13 +03:00
tmp = &settings->KerberosKdc;
break;
case FreeRDP_KerberosRealm:
2015-06-22 19:52:13 +03:00
tmp = &settings->KerberosRealm;
break;
case FreeRDP_CertificateName:
2015-06-22 19:52:13 +03:00
tmp = &settings->CertificateName;
break;
case FreeRDP_CertificateFile:
2015-06-22 19:52:13 +03:00
tmp = &settings->CertificateFile;
break;
case FreeRDP_PrivateKeyFile:
2015-06-22 19:52:13 +03:00
tmp = &settings->PrivateKeyFile;
break;
case FreeRDP_CertificateContent:
tmp = &settings->CertificateContent;
break;
case FreeRDP_PrivateKeyContent:
tmp = &settings->PrivateKeyContent;
break;
case FreeRDP_RdpKeyContent:
tmp = &settings->RdpKeyContent;
break;
case FreeRDP_RdpKeyFile:
2015-06-22 19:52:13 +03:00
tmp = &settings->RdpKeyFile;
break;
case FreeRDP_WindowTitle:
2015-06-22 19:52:13 +03:00
tmp = &settings->WindowTitle;
break;
case FreeRDP_ComputerName:
2015-06-22 19:52:13 +03:00
tmp = &settings->ComputerName;
break;
case FreeRDP_ConnectionFile:
2015-06-22 19:52:13 +03:00
tmp = &settings->ConnectionFile;
break;
case FreeRDP_AssistanceFile:
2015-06-22 19:52:13 +03:00
tmp = &settings->AssistanceFile;
break;
case FreeRDP_HomePath:
2015-06-22 19:52:13 +03:00
tmp = &settings->HomePath;
break;
case FreeRDP_ConfigPath:
2015-06-22 19:52:13 +03:00
tmp = &settings->ConfigPath;
break;
case FreeRDP_CurrentPath:
2015-06-22 19:52:13 +03:00
tmp = &settings->CurrentPath;
break;
case FreeRDP_DumpRemoteFxFile:
2015-06-22 19:52:13 +03:00
tmp = &settings->DumpRemoteFxFile;
break;
case FreeRDP_PlayRemoteFxFile:
2015-06-22 19:52:13 +03:00
tmp = &settings->PlayRemoteFxFile;
break;
case FreeRDP_GatewayHostname:
2015-06-22 19:52:13 +03:00
tmp = &settings->GatewayHostname;
break;
case FreeRDP_GatewayUsername:
2015-06-22 19:52:13 +03:00
tmp = &settings->GatewayUsername;
break;
case FreeRDP_GatewayPassword:
2015-06-22 19:52:13 +03:00
tmp = &settings->GatewayPassword;
break;
case FreeRDP_GatewayDomain:
2015-06-22 19:52:13 +03:00
tmp = &settings->GatewayDomain;
break;
case FreeRDP_RemoteApplicationName:
2015-06-22 19:52:13 +03:00
tmp = &settings->RemoteApplicationName;
break;
case FreeRDP_RemoteApplicationIcon:
2015-06-22 19:52:13 +03:00
tmp = &settings->RemoteApplicationIcon;
break;
case FreeRDP_RemoteApplicationProgram:
2015-06-22 19:52:13 +03:00
tmp = &settings->RemoteApplicationProgram;
break;
case FreeRDP_RemoteApplicationFile:
2015-06-22 19:52:13 +03:00
tmp = &settings->RemoteApplicationFile;
break;
case FreeRDP_RemoteApplicationGuid:
2015-06-22 19:52:13 +03:00
tmp = &settings->RemoteApplicationGuid;
break;
case FreeRDP_RemoteApplicationCmdLine:
2015-06-22 19:52:13 +03:00
tmp = &settings->RemoteApplicationCmdLine;
break;
case FreeRDP_ImeFileName:
2015-06-22 19:52:13 +03:00
tmp = &settings->ImeFileName;
break;
case FreeRDP_DrivesToRedirect:
2015-06-22 19:52:13 +03:00
tmp = &settings->DrivesToRedirect;
break;
default:
WLog_ERR(TAG, "unknown id %d (param = %s)", id, param);
return -1;
}
2015-06-22 19:52:13 +03:00
free(*tmp);
if (!(*tmp = _strdup(param)))
return -1;
/* Mark field as modified */
settings->SettingsModified[id] = 1;
return 0;
}