mirror of
https://github.com/morgan9e/FreeRDP
synced 2026-04-15 00:44:19 +09:00
server: proxy: use freerdp_settings_copy
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 */
|
||||
|
||||
Reference in New Issue
Block a user