|
|
|
|
@@ -183,7 +183,7 @@ static BOOL settings_reg_query_bool(rdpSettings* settings, FreeRDP_Settings_Keys
|
|
|
|
|
if (!settings_reg_query_dword_val(hKey, sub, &dwValue))
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
|
|
return freerdp_settings_set_bool(settings, id, dwValue != 0 ? TRUE : FALSE);
|
|
|
|
|
return freerdp_settings_set_bool(settings, id, (dwValue != 0));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void settings_client_load_hkey_local_machine(rdpSettings* settings)
|
|
|
|
|
@@ -812,8 +812,8 @@ char* freerdp_settings_get_config_path(void)
|
|
|
|
|
|
|
|
|
|
rdpSettings* freerdp_settings_new(DWORD flags)
|
|
|
|
|
{
|
|
|
|
|
const BOOL server = (flags & FREERDP_SETTINGS_SERVER_MODE) != 0 ? TRUE : FALSE;
|
|
|
|
|
const BOOL remote = (flags & FREERDP_SETTINGS_REMOTE_MODE) != 0 ? TRUE : FALSE;
|
|
|
|
|
const BOOL server = ((flags & FREERDP_SETTINGS_SERVER_MODE) != 0);
|
|
|
|
|
const BOOL remote = ((flags & FREERDP_SETTINGS_REMOTE_MODE) != 0);
|
|
|
|
|
rdpSettings* settings = (rdpSettings*)calloc(1, sizeof(rdpSettings));
|
|
|
|
|
|
|
|
|
|
if (!settings)
|
|
|
|
|
@@ -1378,11 +1378,11 @@ void freerdp_settings_free(rdpSettings* settings)
|
|
|
|
|
free(settings);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static BOOL freerdp_settings_int_buffer_copy(rdpSettings* _settings, const rdpSettings* settings)
|
|
|
|
|
static BOOL freerdp_settings_int_buffer_copy(rdpSettings* dst, const rdpSettings* settings)
|
|
|
|
|
{
|
|
|
|
|
BOOL rc = FALSE;
|
|
|
|
|
|
|
|
|
|
if (!_settings || !settings)
|
|
|
|
|
if (!dst || !settings)
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
|
|
typedef struct
|
|
|
|
|
@@ -1412,11 +1412,11 @@ static BOOL freerdp_settings_int_buffer_copy(rdpSettings* _settings, const rdpSe
|
|
|
|
|
UINT32 n = freerdp_settings_get_uint32(settings, keys->lenKey);
|
|
|
|
|
|
|
|
|
|
const void* ptr = freerdp_settings_get_pointer(settings, keys->pointerKey);
|
|
|
|
|
if (!freerdp_settings_set_pointer_len(_settings, keys->pointerKey, ptr, n))
|
|
|
|
|
if (!freerdp_settings_set_pointer_len(dst, keys->pointerKey, ptr, n))
|
|
|
|
|
goto out_fail;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!freerdp_server_license_issuers_copy(_settings, settings->ServerLicenseProductIssuers,
|
|
|
|
|
if (!freerdp_server_license_issuers_copy(dst, settings->ServerLicenseProductIssuers,
|
|
|
|
|
settings->ServerLicenseProductIssuersCount))
|
|
|
|
|
goto out_fail;
|
|
|
|
|
|
|
|
|
|
@@ -1425,12 +1425,12 @@ static BOOL freerdp_settings_int_buffer_copy(rdpSettings* _settings, const rdpSe
|
|
|
|
|
rdpCertificate* cert = freerdp_certificate_clone(settings->RdpServerCertificate);
|
|
|
|
|
if (!cert)
|
|
|
|
|
goto out_fail;
|
|
|
|
|
if (!freerdp_settings_set_pointer_len(_settings, FreeRDP_RdpServerCertificate, cert, 1))
|
|
|
|
|
if (!freerdp_settings_set_pointer_len(dst, FreeRDP_RdpServerCertificate, cert, 1))
|
|
|
|
|
goto out_fail;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if (!freerdp_settings_set_pointer_len(_settings, FreeRDP_RdpServerCertificate, NULL, 0))
|
|
|
|
|
if (!freerdp_settings_set_pointer_len(dst, FreeRDP_RdpServerCertificate, NULL, 0))
|
|
|
|
|
goto out_fail;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -1439,37 +1439,36 @@ static BOOL freerdp_settings_int_buffer_copy(rdpSettings* _settings, const rdpSe
|
|
|
|
|
rdpPrivateKey* key = freerdp_key_clone(settings->RdpServerRsaKey);
|
|
|
|
|
if (!key)
|
|
|
|
|
goto out_fail;
|
|
|
|
|
if (!freerdp_settings_set_pointer_len(_settings, FreeRDP_RdpServerRsaKey, key, 1))
|
|
|
|
|
if (!freerdp_settings_set_pointer_len(dst, FreeRDP_RdpServerRsaKey, key, 1))
|
|
|
|
|
goto out_fail;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if (!freerdp_settings_set_pointer_len(_settings, FreeRDP_RdpServerRsaKey, NULL, 0))
|
|
|
|
|
if (!freerdp_settings_set_pointer_len(dst, FreeRDP_RdpServerRsaKey, NULL, 0))
|
|
|
|
|
goto out_fail;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!freerdp_settings_set_uint32(_settings, FreeRDP_ChannelCount,
|
|
|
|
|
if (!freerdp_settings_set_uint32(dst, FreeRDP_ChannelCount,
|
|
|
|
|
freerdp_settings_get_uint32(settings, FreeRDP_ChannelCount)))
|
|
|
|
|
goto out_fail;
|
|
|
|
|
|
|
|
|
|
if (settings->OrderSupport)
|
|
|
|
|
{
|
|
|
|
|
_settings->OrderSupport = calloc(32, sizeof(BYTE));
|
|
|
|
|
if (!_settings->OrderSupport)
|
|
|
|
|
dst->OrderSupport = calloc(32, sizeof(BYTE));
|
|
|
|
|
if (!dst->OrderSupport)
|
|
|
|
|
goto out_fail;
|
|
|
|
|
|
|
|
|
|
CopyMemory(_settings->OrderSupport, settings->OrderSupport, 32);
|
|
|
|
|
CopyMemory(dst->OrderSupport, settings->OrderSupport, 32);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!freerdp_capability_buffer_copy(_settings, settings))
|
|
|
|
|
if (!freerdp_capability_buffer_copy(dst, settings))
|
|
|
|
|
goto out_fail;
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
const UINT32 glyphCacheCount = 10;
|
|
|
|
|
const GLYPH_CACHE_DEFINITION* glyphCache =
|
|
|
|
|
freerdp_settings_get_pointer(settings, FreeRDP_GlyphCache);
|
|
|
|
|
if (!freerdp_settings_set_pointer_len(_settings, FreeRDP_GlyphCache, glyphCache,
|
|
|
|
|
glyphCacheCount))
|
|
|
|
|
if (!freerdp_settings_set_pointer_len(dst, FreeRDP_GlyphCache, glyphCache, glyphCacheCount))
|
|
|
|
|
goto out_fail;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -1477,30 +1476,29 @@ static BOOL freerdp_settings_int_buffer_copy(rdpSettings* _settings, const rdpSe
|
|
|
|
|
const UINT32 fragCacheCount = 1;
|
|
|
|
|
const GLYPH_CACHE_DEFINITION* fragCache =
|
|
|
|
|
freerdp_settings_get_pointer(settings, FreeRDP_FragCache);
|
|
|
|
|
if (!freerdp_settings_set_pointer_len(_settings, FreeRDP_FragCache, fragCache,
|
|
|
|
|
fragCacheCount))
|
|
|
|
|
if (!freerdp_settings_set_pointer_len(dst, FreeRDP_FragCache, fragCache, fragCacheCount))
|
|
|
|
|
goto out_fail;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!freerdp_settings_set_pointer_len(
|
|
|
|
|
_settings, FreeRDP_ClientAutoReconnectCookie,
|
|
|
|
|
dst, FreeRDP_ClientAutoReconnectCookie,
|
|
|
|
|
freerdp_settings_get_pointer(settings, FreeRDP_ClientAutoReconnectCookie), 1))
|
|
|
|
|
goto out_fail;
|
|
|
|
|
if (!freerdp_settings_set_pointer_len(
|
|
|
|
|
_settings, FreeRDP_ServerAutoReconnectCookie,
|
|
|
|
|
dst, FreeRDP_ServerAutoReconnectCookie,
|
|
|
|
|
freerdp_settings_get_pointer(settings, FreeRDP_ServerAutoReconnectCookie), 1))
|
|
|
|
|
goto out_fail;
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
const TIME_ZONE_INFORMATION* tz =
|
|
|
|
|
freerdp_settings_get_pointer(settings, FreeRDP_ClientTimeZone);
|
|
|
|
|
if (!freerdp_settings_set_pointer_len(_settings, FreeRDP_ClientTimeZone, tz, 1))
|
|
|
|
|
if (!freerdp_settings_set_pointer_len(dst, FreeRDP_ClientTimeZone, tz, 1))
|
|
|
|
|
goto out_fail;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
const UINT32 nrports = freerdp_settings_get_uint32(settings, FreeRDP_TargetNetAddressCount);
|
|
|
|
|
if (!freerdp_target_net_adresses_reset(_settings, nrports))
|
|
|
|
|
if (!freerdp_target_net_adresses_reset(dst, nrports))
|
|
|
|
|
goto out_fail;
|
|
|
|
|
|
|
|
|
|
for (UINT32 i = 0; i < nrports; i++)
|
|
|
|
|
@@ -1510,10 +1508,9 @@ static BOOL freerdp_settings_int_buffer_copy(rdpSettings* _settings, const rdpSe
|
|
|
|
|
const UINT32* port =
|
|
|
|
|
freerdp_settings_get_pointer_array(settings, FreeRDP_TargetNetPorts, i);
|
|
|
|
|
|
|
|
|
|
if (!freerdp_settings_set_pointer_array(_settings, FreeRDP_TargetNetAddresses, i,
|
|
|
|
|
address))
|
|
|
|
|
if (!freerdp_settings_set_pointer_array(dst, FreeRDP_TargetNetAddresses, i, address))
|
|
|
|
|
goto out_fail;
|
|
|
|
|
if (!freerdp_settings_set_pointer_array(_settings, FreeRDP_TargetNetPorts, i, port))
|
|
|
|
|
if (!freerdp_settings_set_pointer_array(dst, FreeRDP_TargetNetPorts, i, port))
|
|
|
|
|
goto out_fail;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@@ -1524,9 +1521,9 @@ static BOOL freerdp_settings_int_buffer_copy(rdpSettings* _settings, const rdpSe
|
|
|
|
|
|
|
|
|
|
if (len < count)
|
|
|
|
|
goto out_fail;
|
|
|
|
|
if (!freerdp_settings_set_pointer_len(_settings, FreeRDP_DeviceArray, NULL, len))
|
|
|
|
|
if (!freerdp_settings_set_pointer_len(dst, FreeRDP_DeviceArray, NULL, len))
|
|
|
|
|
goto out_fail;
|
|
|
|
|
if (!freerdp_settings_set_uint32(_settings, FreeRDP_DeviceCount, count))
|
|
|
|
|
if (!freerdp_settings_set_uint32(dst, FreeRDP_DeviceCount, count))
|
|
|
|
|
goto out_fail;
|
|
|
|
|
|
|
|
|
|
for (size_t index = 0; index < count; index++)
|
|
|
|
|
@@ -1534,21 +1531,21 @@ static BOOL freerdp_settings_int_buffer_copy(rdpSettings* _settings, const rdpSe
|
|
|
|
|
const RDPDR_DEVICE* argv =
|
|
|
|
|
freerdp_settings_get_pointer_array(settings, FreeRDP_DeviceArray, index);
|
|
|
|
|
WINPR_ASSERT(argv);
|
|
|
|
|
if (!freerdp_settings_set_pointer_array(_settings, FreeRDP_DeviceArray, index, argv))
|
|
|
|
|
if (!freerdp_settings_set_pointer_array(dst, FreeRDP_DeviceArray, index, argv))
|
|
|
|
|
goto out_fail;
|
|
|
|
|
}
|
|
|
|
|
WINPR_ASSERT(_settings->DeviceArray || (len == 0));
|
|
|
|
|
WINPR_ASSERT(dst->DeviceArray || (len == 0));
|
|
|
|
|
WINPR_ASSERT(len >= count);
|
|
|
|
|
}
|
|
|
|
|
{
|
|
|
|
|
const UINT32 len = freerdp_settings_get_uint32(_settings, FreeRDP_StaticChannelArraySize);
|
|
|
|
|
const UINT32 len = freerdp_settings_get_uint32(dst, FreeRDP_StaticChannelArraySize);
|
|
|
|
|
const UINT32 count = freerdp_settings_get_uint32(settings, FreeRDP_StaticChannelCount);
|
|
|
|
|
|
|
|
|
|
if (len < count)
|
|
|
|
|
goto out_fail;
|
|
|
|
|
if (!freerdp_settings_set_pointer_len(_settings, FreeRDP_StaticChannelArray, NULL, len))
|
|
|
|
|
if (!freerdp_settings_set_pointer_len(dst, FreeRDP_StaticChannelArray, NULL, len))
|
|
|
|
|
goto out_fail;
|
|
|
|
|
if (!freerdp_settings_set_uint32(_settings, FreeRDP_StaticChannelCount, count))
|
|
|
|
|
if (!freerdp_settings_set_uint32(dst, FreeRDP_StaticChannelCount, count))
|
|
|
|
|
goto out_fail;
|
|
|
|
|
|
|
|
|
|
for (size_t index = 0; index < count; index++)
|
|
|
|
|
@@ -1556,20 +1553,19 @@ static BOOL freerdp_settings_int_buffer_copy(rdpSettings* _settings, const rdpSe
|
|
|
|
|
const ADDIN_ARGV* argv =
|
|
|
|
|
freerdp_settings_get_pointer_array(settings, FreeRDP_StaticChannelArray, index);
|
|
|
|
|
WINPR_ASSERT(argv);
|
|
|
|
|
if (!freerdp_settings_set_pointer_array(_settings, FreeRDP_StaticChannelArray, index,
|
|
|
|
|
argv))
|
|
|
|
|
if (!freerdp_settings_set_pointer_array(dst, FreeRDP_StaticChannelArray, index, argv))
|
|
|
|
|
goto out_fail;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
{
|
|
|
|
|
const UINT32 len = freerdp_settings_get_uint32(_settings, FreeRDP_DynamicChannelArraySize);
|
|
|
|
|
const UINT32 len = freerdp_settings_get_uint32(dst, FreeRDP_DynamicChannelArraySize);
|
|
|
|
|
const UINT32 count = freerdp_settings_get_uint32(settings, FreeRDP_DynamicChannelCount);
|
|
|
|
|
|
|
|
|
|
if (len < count)
|
|
|
|
|
goto out_fail;
|
|
|
|
|
if (!freerdp_settings_set_pointer_len(_settings, FreeRDP_DynamicChannelArray, NULL, len))
|
|
|
|
|
if (!freerdp_settings_set_pointer_len(dst, FreeRDP_DynamicChannelArray, NULL, len))
|
|
|
|
|
goto out_fail;
|
|
|
|
|
if (!freerdp_settings_set_uint32(_settings, FreeRDP_DynamicChannelCount, count))
|
|
|
|
|
if (!freerdp_settings_set_uint32(dst, FreeRDP_DynamicChannelCount, count))
|
|
|
|
|
goto out_fail;
|
|
|
|
|
|
|
|
|
|
for (size_t index = 0; index < count; index++)
|
|
|
|
|
@@ -1577,57 +1573,56 @@ static BOOL freerdp_settings_int_buffer_copy(rdpSettings* _settings, const rdpSe
|
|
|
|
|
const ADDIN_ARGV* argv =
|
|
|
|
|
freerdp_settings_get_pointer_array(settings, FreeRDP_DynamicChannelArray, index);
|
|
|
|
|
WINPR_ASSERT(argv);
|
|
|
|
|
if (!freerdp_settings_set_pointer_array(_settings, FreeRDP_DynamicChannelArray, index,
|
|
|
|
|
argv))
|
|
|
|
|
if (!freerdp_settings_set_pointer_array(dst, FreeRDP_DynamicChannelArray, index, argv))
|
|
|
|
|
goto out_fail;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
rc = freerdp_settings_set_string(_settings, FreeRDP_ActionScript,
|
|
|
|
|
rc = freerdp_settings_set_string(dst, FreeRDP_ActionScript,
|
|
|
|
|
freerdp_settings_get_string(settings, FreeRDP_ActionScript));
|
|
|
|
|
|
|
|
|
|
out_fail:
|
|
|
|
|
return rc;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
BOOL freerdp_settings_copy(rdpSettings* _settings, const rdpSettings* settings)
|
|
|
|
|
BOOL freerdp_settings_copy(rdpSettings* dst, const rdpSettings* src)
|
|
|
|
|
{
|
|
|
|
|
BOOL rc = 0;
|
|
|
|
|
|
|
|
|
|
if (!settings || !_settings)
|
|
|
|
|
if (!dst || !src)
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
|
|
/* This is required to free all non string buffers */
|
|
|
|
|
freerdp_settings_free_internal(_settings);
|
|
|
|
|
freerdp_settings_free_internal(dst);
|
|
|
|
|
|
|
|
|
|
/* This copies everything except allocated non string buffers. reset all allocated buffers to
|
|
|
|
|
* NULL to fix issues during cleanup */
|
|
|
|
|
rc = freerdp_settings_clone_keys(_settings, settings);
|
|
|
|
|
rc = freerdp_settings_clone_keys(dst, src);
|
|
|
|
|
if (!rc)
|
|
|
|
|
goto out_fail;
|
|
|
|
|
freerdp_settings_free_internal_ensure_reset(_settings);
|
|
|
|
|
freerdp_settings_free_internal_ensure_reset(dst);
|
|
|
|
|
|
|
|
|
|
/* Begin copying */
|
|
|
|
|
if (!freerdp_settings_int_buffer_copy(_settings, settings))
|
|
|
|
|
if (!freerdp_settings_int_buffer_copy(dst, src))
|
|
|
|
|
goto out_fail;
|
|
|
|
|
return TRUE;
|
|
|
|
|
out_fail:
|
|
|
|
|
freerdp_settings_free_internal(_settings);
|
|
|
|
|
freerdp_settings_free_internal(dst);
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
rdpSettings* freerdp_settings_clone(const rdpSettings* settings)
|
|
|
|
|
{
|
|
|
|
|
rdpSettings* _settings = (rdpSettings*)calloc(1, sizeof(rdpSettings));
|
|
|
|
|
rdpSettings* dst = (rdpSettings*)calloc(1, sizeof(rdpSettings));
|
|
|
|
|
|
|
|
|
|
if (!freerdp_settings_copy(_settings, settings))
|
|
|
|
|
if (!freerdp_settings_copy(dst, settings))
|
|
|
|
|
goto out_fail;
|
|
|
|
|
|
|
|
|
|
return _settings;
|
|
|
|
|
return dst;
|
|
|
|
|
out_fail:
|
|
|
|
|
WINPR_PRAGMA_DIAG_PUSH
|
|
|
|
|
WINPR_PRAGMA_DIAG_IGNORED_MISMATCHED_DEALLOC
|
|
|
|
|
freerdp_settings_free(_settings);
|
|
|
|
|
freerdp_settings_free(dst);
|
|
|
|
|
WINPR_PRAGMA_DIAG_POP
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
@@ -1661,9 +1656,7 @@ BOOL identity_set_from_settings_with_pwd(SEC_WINNT_AUTH_IDENTITY* identity,
|
|
|
|
|
Password, pwdLen);
|
|
|
|
|
zfree(Username, UserLen);
|
|
|
|
|
zfree(Domain, DomainLen);
|
|
|
|
|
if (rc < 0)
|
|
|
|
|
return FALSE;
|
|
|
|
|
return TRUE;
|
|
|
|
|
return (rc >= 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
BOOL identity_set_from_settings(SEC_WINNT_AUTH_IDENTITY_W* identity, const rdpSettings* settings,
|
|
|
|
|
@@ -1710,14 +1703,10 @@ BOOL identity_set_from_smartcard_hash(SEC_WINNT_AUTH_IDENTITY_W* identity,
|
|
|
|
|
identity, marshalledCredentials, _wcslen(marshalledCredentials), NULL, 0, Password, pwdLen);
|
|
|
|
|
zfree(Password, pwdLen);
|
|
|
|
|
CredFree(marshalledCredentials);
|
|
|
|
|
if (rc < 0)
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
|
|
return (rc >= 0);
|
|
|
|
|
#else
|
|
|
|
|
if (!identity_set_from_settings(identity, settings, userId, domainId, pwdId))
|
|
|
|
|
return FALSE;
|
|
|
|
|
return identity_set_from_settings(identity, settings, userId, domainId, pwdId);
|
|
|
|
|
#endif /* _WIN32 */
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const char* freerdp_settings_glyph_level_string(UINT32 level, char* buffer, size_t size)
|
|
|
|
|
|