From 1b4371ed228b626b5c824f00e1b31091c7d44ad9 Mon Sep 17 00:00:00 2001 From: kubistika Date: Tue, 16 Jul 2019 13:28:14 +0300 Subject: [PATCH] server: proxy: use freerdp_settings_copy --- server/proxy/pf_client.c | 7 ++-- server/proxy/pf_context.c | 96 ++++++++++++++++++++++++++--------------------- server/proxy/pf_context.h | 2 + 3 files changed, 60 insertions(+), 45 deletions(-) diff --git a/server/proxy/pf_client.c b/server/proxy/pf_client.c index 31ea8aa..8c9cb53 100644 --- a/server/proxy/pf_client.c +++ b/server/proxy/pf_client.c @@ -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) diff --git a/server/proxy/pf_context.c b/server/proxy/pf_context.c index 4817d17..2d29c54 100644 --- a/server/proxy/pf_context.c +++ b/server/proxy/pf_context.c @@ -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; - - 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)); + pf_context_copy_settings(context->settings, clientSettings, FALSE); - if (!settings->MonitorIds) + if (!context->settings) goto error; - CopyMemory(settings->MonitorIds, clientSettings->MonitorIds, 16 * sizeof(UINT32)); return context; error: freerdp_client_context_free(context); diff --git a/server/proxy/pf_context.h b/server/proxy/pf_context.h index b8ef9c8..015a88b 100644 --- a/server/proxy/pf_context.h +++ b/server/proxy/pf_context.h @@ -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 */ -- 2.7.4