server: proxy: use freerdp_settings_copy
authorkubistika <kmizrachi18@gmail.com>
Tue, 16 Jul 2019 10:28:14 +0000 (13:28 +0300)
committerakallabeth <akallabeth@users.noreply.github.com>
Tue, 16 Jul 2019 11:47:35 +0000 (13:47 +0200)
server/proxy/pf_client.c
server/proxy/pf_context.c
server/proxy/pf_context.h

index 31ea8aa..8c9cb53 100644 (file)
  * 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)
index 4817d17..2d29c54 100644 (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;
-
-       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);
index b8ef9c8..015a88b 100644 (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 */