core: Preserve user provided credentials when being redirected

This PR fixes an issue where user credentials were lost when connecting
to a farm that redirects the client.

During a redirect the connection settings were overriden by the settings
stored in `rdp->originalSettings`. However these settings miss any
credentials the user provides during the connection phase, thus causing
another authentication prompt to appear.
This commit is contained in:
Martin Fleisz 2022-11-18 11:38:55 +01:00 committed by akallabeth
parent 3053543068
commit eb7adaec46

View File

@ -47,14 +47,18 @@ BOOL utils_str_copy(const char* value, char** dst)
auth_status utils_authenticate_gateway(freerdp* instance, rdp_auth_reason reason)
{
rdpSettings* settings;
rdpSettings* origSettings;
BOOL prompt = FALSE;
BOOL proceed;
WINPR_ASSERT(instance);
WINPR_ASSERT(instance->context);
WINPR_ASSERT(instance->context->settings);
WINPR_ASSERT(instance->context->rdp);
WINPR_ASSERT(instance->context->rdp->originalSettings);
settings = instance->context->settings;
origSettings = instance->context->rdp->originalSettings;
if (freerdp_shall_disconnect_context(instance->context))
return AUTH_FAILED;
@ -84,20 +88,35 @@ auth_status utils_authenticate_gateway(freerdp* instance, rdp_auth_reason reason
if (!utils_sync_credentials(settings, FALSE))
return AUTH_FAILED;
/* update original settings with provided user credentials */
if (!utils_str_copy(settings->GatewayUsername, &origSettings->GatewayUsername))
return AUTH_FAILED;
if (!utils_str_copy(settings->GatewayDomain, &origSettings->GatewayDomain))
return AUTH_FAILED;
if (!utils_str_copy(settings->GatewayPassword, &origSettings->GatewayPassword))
return AUTH_FAILED;
if (!utils_sync_credentials(origSettings, FALSE))
return AUTH_FAILED;
return AUTH_SUCCESS;
}
auth_status utils_authenticate(freerdp* instance, rdp_auth_reason reason, BOOL override)
{
rdpSettings* settings;
rdpSettings* origSettings;
BOOL prompt = !override;
BOOL proceed;
WINPR_ASSERT(instance);
WINPR_ASSERT(instance->context);
WINPR_ASSERT(instance->context->settings);
WINPR_ASSERT(instance->context->rdp);
WINPR_ASSERT(instance->context->rdp->originalSettings);
settings = instance->context->settings;
origSettings = instance->context->rdp->originalSettings;
if (freerdp_shall_disconnect_context(instance->context))
return AUTH_FAILED;
@ -148,6 +167,17 @@ auth_status utils_authenticate(freerdp* instance, rdp_auth_reason reason, BOOL o
if (!utils_sync_credentials(settings, TRUE))
return AUTH_FAILED;
/* update original settings with provided user credentials */
if (!utils_str_copy(settings->Username, &origSettings->Username))
return AUTH_FAILED;
if (!utils_str_copy(settings->Domain, &origSettings->Domain))
return AUTH_FAILED;
if (!utils_str_copy(settings->Password, &origSettings->Password))
return AUTH_FAILED;
if (!utils_sync_credentials(origSettings, TRUE))
return AUTH_FAILED;
return AUTH_SUCCESS;
}