From cfe80694da094d1057af3749b640feebb9f41dc6 Mon Sep 17 00:00:00 2001 From: David Fort Date: Thu, 9 Jun 2022 10:58:59 +0200 Subject: [PATCH] proxy: add fixed user/domain/passwd This adds a User, Domain and Password parameter in the Target section of the configuration to specify and use a fixed backend user, domain or password (overriding the one passed by the front user). --- include/freerdp/server/proxy/proxy_config.h | 3 ++ server/proxy/pf_config.c | 46 +++++++++++++++++---- server/proxy/pf_server.c | 19 ++++++--- 3 files changed, 56 insertions(+), 12 deletions(-) diff --git a/include/freerdp/server/proxy/proxy_config.h b/include/freerdp/server/proxy/proxy_config.h index 8d1b14429..8623f4582 100644 --- a/include/freerdp/server/proxy/proxy_config.h +++ b/include/freerdp/server/proxy/proxy_config.h @@ -38,6 +38,9 @@ struct proxy_config BOOL FixedTarget; char* TargetHost; UINT16 TargetPort; + char* TargetUser; + char* TargetDomain; + char* TargetPassword; /* input */ BOOL Keyboard; diff --git a/server/proxy/pf_config.c b/server/proxy/pf_config.c index 3aa058896..9875fb5d0 100644 --- a/server/proxy/pf_config.c +++ b/server/proxy/pf_config.c @@ -188,7 +188,7 @@ static BOOL pf_config_load_server(wIniFile* ini, proxyConfig* config) static BOOL pf_config_load_target(wIniFile* ini, proxyConfig* config) { - const char* target_host; + const char* target_value; WINPR_ASSERT(config); config->FixedTarget = pf_config_get_bool(ini, "Target", "FixedTarget", FALSE); @@ -196,14 +196,41 @@ static BOOL pf_config_load_target(wIniFile* ini, proxyConfig* config) if (!pf_config_get_uint16(ini, "Target", "Port", &config->TargetPort, config->FixedTarget)) return FALSE; - target_host = pf_config_get_str(ini, "Target", "Host", config->FixedTarget); - if (!target_host) - return FALSE; + if (config->FixedTarget) + { + target_value = pf_config_get_str(ini, "Target", "Host", TRUE); + if (!target_value) + return FALSE; - config->TargetHost = _strdup(target_host); - if (!config->TargetHost) - return FALSE; + config->TargetHost = _strdup(target_value); + if (!config->TargetHost) + return FALSE; + } + + target_value = pf_config_get_str(ini, "Target", "User", FALSE); + if (target_value) + { + config->TargetUser = _strdup(target_value); + if (!config->TargetUser) + return FALSE; + } + + target_value = pf_config_get_str(ini, "Target", "Password", FALSE); + if (target_value) + { + config->TargetPassword = _strdup(target_value); + if (!config->TargetPassword) + return FALSE; + } + + target_value = pf_config_get_str(ini, "Target", "Domain", FALSE); + if (target_value) + { + config->TargetDomain = _strdup(target_value); + if (!config->TargetDomain) + return FALSE; + } return TRUE; } @@ -636,6 +663,11 @@ void pf_server_config_print(const proxyConfig* config) CONFIG_PRINT_SECTION("Target"); CONFIG_PRINT_STR(config, TargetHost); CONFIG_PRINT_UINT16(config, TargetPort); + + if (config->TargetUser) + CONFIG_PRINT_STR(config, TargetUser); + if (config->TargetDomain) + CONFIG_PRINT_STR(config, TargetDomain); } CONFIG_PRINT_SECTION("Input"); diff --git a/server/proxy/pf_server.c b/server/proxy/pf_server.c index a5fd370bd..44215c7eb 100644 --- a/server/proxy/pf_server.c +++ b/server/proxy/pf_server.c @@ -151,6 +151,15 @@ static BOOL pf_server_get_target_info(rdpContext* context, rdpSettings* settings return FALSE; } + if (config->TargetUser) + freerdp_settings_set_string(settings, FreeRDP_Username, config->TargetUser); + + if (config->TargetDomain) + freerdp_settings_set_string(settings, FreeRDP_Domain, config->TargetDomain); + + if (config->TargetPassword) + freerdp_settings_set_string(settings, FreeRDP_Password, config->TargetPassword); + return TRUE; } case PROXY_FETCH_TARGET_USE_CUSTOM_ADDR: @@ -260,27 +269,27 @@ static BOOL pf_server_post_connect(freerdp_peer* peer) pClientContext* pc; rdpSettings* client_settings; proxyData* pdata; - rdpSettings* settings; + rdpSettings* frontSettings; WINPR_ASSERT(peer); ps = (pServerContext*)peer->context; WINPR_ASSERT(ps); - settings = peer->context->settings; - WINPR_ASSERT(settings); + frontSettings = peer->context->settings; + WINPR_ASSERT(frontSettings); pdata = ps->pdata; WINPR_ASSERT(pdata); - PROXY_LOG_INFO(TAG, ps, "Accepted client: %s", settings->ClientHostname); + PROXY_LOG_INFO(TAG, ps, "Accepted client: %s", frontSettings->ClientHostname); if (!pf_server_setup_channels(peer)) { PROXY_LOG_ERR(TAG, ps, "error setting up channels"); return FALSE; } - pc = pf_context_create_client_context(settings); + pc = pf_context_create_client_context(frontSettings); if (pc == NULL) { PROXY_LOG_ERR(TAG, ps, "failed to create client context!");