[core,freerdp] New API freerdp_presist_credentials

A new function that allows persisting runtime changes to credential
settings so reconnect/redirect/... does not lose current values.
This commit is contained in:
akallabeth
2025-02-11 12:07:21 +01:00
parent f0fa8662e8
commit 0c0e45c6d0
4 changed files with 46 additions and 0 deletions

View File

@@ -736,6 +736,20 @@ owned by rdpRdp */
FREERDP_API BOOL freerdp_is_valid_mcs_create_request(const BYTE* data, size_t size);
FREERDP_API BOOL freerdp_is_valid_mcs_create_response(const BYTE* data, size_t size);
/** \brief Persist the current credentials (gateway, target server, ...)
*
* FreeRDP internally keeps a backup of connection settings to revert to whenever a reconnect
* is required. If a client modifies settings during runtime after pre-connect call this
* function or the credentials will be lost on any reconnect, redirect, ...
*
* \param context The RDP context to use, must not be \b NULL
*
* \return \b TRUE if successful, \b FALSE if settings could not be applied (wrong session
* state, ...)
* \since version 3.12.0
*/
FREERDP_API BOOL freerdp_presist_credentials(rdpContext* context);
#ifdef __cplusplus
}
#endif

View File

@@ -1459,3 +1459,11 @@ BOOL freerdp_is_valid_mcs_create_response(const BYTE* data, size_t size)
test_mcs_free(mcs);
return result;
}
BOOL freerdp_presist_credentials(rdpContext* context)
{
if (!context)
return FALSE;
WINPR_ASSERT(context->rdp);
return utils_persist_credentials(context->rdp->originalSettings, context->rdp->settings);
}

View File

@@ -253,6 +253,29 @@ BOOL utils_sync_credentials(rdpSettings* settings, BOOL toGateway)
return TRUE;
}
BOOL utils_persist_credentials(rdpSettings* settings, const rdpSettings* current)
{
if (!settings || !current)
return FALSE;
const SSIZE_T keys[] = { FreeRDP_GatewayUsername, FreeRDP_GatewayDomain,
FreeRDP_GatewayPassword, FreeRDP_Username,
FreeRDP_Domain, FreeRDP_Password };
for (size_t x = 0; x < ARRAYSIZE(keys); x++)
{
const SSIZE_T key = keys[x];
if (!freerdp_settings_copy_item(settings, current, key))
{
WLog_ERR(TAG, "Failed to copy %s from current to backup settings",
freerdp_settings_get_name_for_key(key));
return FALSE;
}
}
return TRUE;
}
BOOL utils_str_is_empty(const char* str)
{
if (!str)

View File

@@ -50,6 +50,7 @@ BOOL utils_abort_event_is_set(const rdpRdp* rdp);
BOOL utils_reset_abort(rdpRdp* rdp);
BOOL utils_abort_connect(rdpRdp* rdp);
BOOL utils_sync_credentials(rdpSettings* settings, BOOL toGateway);
BOOL utils_persist_credentials(rdpSettings* settings, const rdpSettings* current);
BOOL utils_str_is_empty(const char* str);
BOOL utils_str_copy(const char* value, char** dst);