* 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)
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);