server: proxy: use freerdp_settings_copy

This commit is contained in:
kubistika
2019-07-16 13:28:14 +03:00
committed by akallabeth
parent c1aa6f2584
commit 1b4371ed22
3 changed files with 60 additions and 45 deletions

View File

@@ -57,13 +57,14 @@
* Re-negotiate with original client after negotiation between the proxy
* and the target has finished.
*/
static void proxy_server_reactivate(rdpContext* client, rdpContext* target)
static void proxy_server_reactivate(rdpContext* ps, const rdpContext* target)
{
pf_common_copy_settings(client->settings, target->settings);
pf_context_copy_settings(ps->settings, target->settings, TRUE);
/* DesktopResize causes internal function rdp_server_reactivate to be called,
* which causes the reactivation.
*/
client->update->DesktopResize(client);
ps->update->DesktopResize(ps);
}
static void pf_OnErrorInfo(void* ctx, ErrorInfoEventArgs* e)

View File

@@ -64,61 +64,73 @@ BOOL init_p_server_context(freerdp_peer* client)
return freerdp_peer_context_new(client);
}
void pf_context_copy_settings(rdpSettings* dst, const rdpSettings* src, BOOL is_server)
{
rdpSettings* before_copy = freerdp_settings_clone(dst);
if (!before_copy)
return;
if (!freerdp_settings_copy(dst, src))
{
freerdp_settings_free(before_copy);
return;
}
free(dst->ConfigPath);
free(dst->PrivateKeyContent);
free(dst->RdpKeyContent);
free(dst->RdpKeyFile);
free(dst->PrivateKeyFile);
free(dst->CertificateFile);
free(dst->CertificateName);
free(dst->CertificateContent);
free(dst->ClientRandom);
/* adjust pointer to instance pointer */
dst->ServerMode = is_server;
dst->ConfigPath = _strdup(before_copy->ConfigPath);
dst->PrivateKeyContent = _strdup(before_copy->PrivateKeyContent);
dst->RdpKeyContent = _strdup(before_copy->RdpKeyContent);
dst->RdpKeyFile = _strdup(before_copy->RdpKeyFile);
dst->PrivateKeyFile = _strdup(before_copy->PrivateKeyFile);
dst->CertificateFile = _strdup(before_copy->CertificateFile);
dst->CertificateName = _strdup(before_copy->CertificateName);
dst->CertificateContent = _strdup(before_copy->CertificateContent);
dst->ClientRandomLength = before_copy->ClientRandomLength;
CopyMemory(dst->ClientRandom, before_copy->ClientRandom, before_copy->ClientRandomLength);
if (is_server)
{
free(dst->ServerCertificate);
dst->ServerCertificateLength = before_copy->ServerCertificateLength;
}
else
{
/* adjust instance pointer for client's context */
dst->instance = before_copy->instance;
/* RdpServerRsaKey must be set to NULL if `dst` is client's context */
dst->RdpServerRsaKey = NULL;
}
freerdp_settings_free(before_copy);
}
rdpContext* p_client_context_create(rdpSettings* clientSettings)
{
RDP_CLIENT_ENTRY_POINTS clientEntryPoints;
rdpContext* context;
rdpSettings* settings;
RdpClientEntry(&clientEntryPoints);
context = freerdp_client_context_new(&clientEntryPoints);
if (!context)
return NULL;
settings = context->settings;
pf_common_copy_settings(settings, clientSettings);
settings->Username = _strdup(clientSettings->Username);
settings->Password = _strdup(clientSettings->Password);
settings->Domain = _strdup(clientSettings->Domain);
settings->SoftwareGdi = FALSE;
settings->RedirectClipboard = FALSE;
/* Client Monitor Data */
settings->MonitorCount = clientSettings->MonitorCount;
settings->SpanMonitors = clientSettings->SpanMonitors;
settings->UseMultimon = clientSettings->UseMultimon;
settings->ForceMultimon = clientSettings->ForceMultimon;
settings->DesktopPosX = clientSettings->DesktopPosX;
settings->DesktopPosY = clientSettings->DesktopPosY;
settings->ListMonitors = clientSettings->ListMonitors;
settings->NumMonitorIds = clientSettings->NumMonitorIds;
settings->MonitorLocalShiftX = clientSettings->MonitorLocalShiftX;
settings->MonitorLocalShiftY = clientSettings->MonitorLocalShiftY;
settings->HasMonitorAttributes = clientSettings->HasMonitorAttributes;
settings->MonitorCount = clientSettings->MonitorCount;
settings->MonitorDefArraySize = clientSettings->MonitorDefArraySize;
pf_context_copy_settings(context->settings, clientSettings, FALSE);
if (clientSettings->MonitorDefArraySize > 0)
{
settings->MonitorDefArray = (rdpMonitor*) calloc(clientSettings->MonitorDefArraySize,
sizeof(rdpMonitor));
if (!settings->MonitorDefArray)
{
goto error;
}
CopyMemory(settings->MonitorDefArray, clientSettings->MonitorDefArray,
sizeof(rdpMonitor) * clientSettings->MonitorDefArraySize);
}
else
settings->MonitorDefArray = NULL;
settings->MonitorIds = (UINT32*) calloc(16, sizeof(UINT32));
if (!settings->MonitorIds)
if (!context->settings)
goto error;
CopyMemory(settings->MonitorIds, clientSettings->MonitorIds, 16 * sizeof(UINT32));
return context;
error:
freerdp_client_context_free(context);

View File

@@ -70,6 +70,7 @@ struct p_client_context
DispClientContext* disp;
/*
* In a case when freerdp_connect fails,
* Used for NLA fallback feature, to check if the server should close the connection.
* When it is set to TRUE, proxy's client knows it shouldn't signal the server thread to closed
* the connection when pf_client_post_disconnect is called, because it is trying to connect reconnect without NLA.
@@ -101,5 +102,6 @@ rdpContext* p_client_context_create(rdpSettings* clientSettings);
proxyData* proxy_data_new();
BOOL proxy_data_set_connection_info(proxyData* pdata, rdpSettings* ps, rdpSettings* pc);
void proxy_data_free(proxyData* pdata);
void pf_context_copy_settings(rdpSettings* dst, const rdpSettings* src, BOOL is_server);
#endif /* FREERDP_SERVER_PROXY_PFCONTEXT_H */