From: kubistika Date: Sun, 26 May 2019 12:33:28 +0000 (+0300) Subject: server/proxy: Code refactor X-Git-Tag: 2.0.0~455^2~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=52e4baa949c53c064fbf0f32f4f6f8f067b918af;p=platform%2Fupstream%2Ffreerdp.git server/proxy: Code refactor --- diff --git a/server/proxy/filters/filter_demo.c b/server/proxy/filters/filter_demo.c index fd3a310..2653fec 100644 --- a/server/proxy/filters/filter_demo.c +++ b/server/proxy/filters/filter_demo.c @@ -31,10 +31,10 @@ static PF_FILTER_RESULT demo_filter_mouse_event(connectionInfo* info, void* para { proxyMouseEventInfo* event_data = (proxyMouseEventInfo*) param; - if (event_data->x % 100 == 0) - { - return FILTER_DROP; - } + if (event_data->x % 100 == 0) + { + return FILTER_DROP; + } return FILTER_PASS; } diff --git a/server/proxy/pf_context.c b/server/proxy/pf_context.c index c64c80e..90afd1c 100644 --- a/server/proxy/pf_context.c +++ b/server/proxy/pf_context.c @@ -56,8 +56,7 @@ BOOL init_p_server_context(freerdp_peer* client) return freerdp_peer_context_new(client); } -rdpContext* p_client_context_create(rdpSettings* clientSettings, - char* host, DWORD port) +rdpContext* p_client_context_create(rdpSettings* clientSettings) { RDP_CLIENT_ENTRY_POINTS clientEntryPoints; rdpContext* context; @@ -73,14 +72,12 @@ rdpContext* p_client_context_create(rdpSettings* clientSettings, settings->Username = _strdup(clientSettings->Username); settings->Password = _strdup(clientSettings->Password); settings->Domain = _strdup(clientSettings->Domain); - settings->ServerHostname = host; - settings->ServerPort = port; settings->SoftwareGdi = FALSE; settings->RedirectClipboard = FALSE; return context; } -static void pf_context_connection_info_free(connectionInfo* info) +static void connection_info_free(connectionInfo* info) { free(info->TargetHostname); free(info->ClientHostname); @@ -88,7 +85,7 @@ static void pf_context_connection_info_free(connectionInfo* info) free(info); } -proxyData* pf_context_proxy_data_new() +proxyData* proxy_data_new() { proxyData* pdata = calloc(1, sizeof(proxyData)); @@ -105,11 +102,35 @@ proxyData* pf_context_proxy_data_new() return NULL; } + if (!(pdata->connectionClosed = CreateEvent(NULL, TRUE, FALSE, NULL))) + { + proxy_data_free(pdata); + return NULL; + } + return pdata; } -void pf_context_proxy_data_free(proxyData* pdata) +BOOL proxy_data_set_connection_info(proxyData* pdata, rdpSettings* clientSettings, + const char* target) +{ + if (!(pdata->info->TargetHostname = _strdup(target))) + goto out_fail; + + if (!(pdata->info->ClientHostname = _strdup(clientSettings->ClientHostname))) + goto out_fail; + + if (!(pdata->info->Username = _strdup(clientSettings->Username))) + goto out_fail; + + return TRUE; +out_fail: + proxy_data_free(pdata); + return FALSE; +} + +void proxy_data_free(proxyData* pdata) { - pf_context_connection_info_free(pdata->info); + connection_info_free(pdata->info); free(pdata); } diff --git a/server/proxy/pf_context.h b/server/proxy/pf_context.h index 92d32bb..b63da7d 100644 --- a/server/proxy/pf_context.h +++ b/server/proxy/pf_context.h @@ -31,7 +31,6 @@ #include "pf_server.h" #include "pf_filters.h" - typedef struct proxy_data proxyData; /** @@ -82,8 +81,10 @@ struct proxy_data }; BOOL init_p_server_context(freerdp_peer* client); -rdpContext* p_client_context_create(rdpSettings* clientSettings, char* host, DWORD port); -proxyData* pf_context_proxy_data_new(); -void pf_context_proxy_data_free(proxyData* pdata); +rdpContext* p_client_context_create(rdpSettings* clientSettings); +proxyData* proxy_data_new(); +BOOL proxy_data_set_connection_info(proxyData* pdata, rdpSettings* clientSettings, + const char* target); +void proxy_data_free(proxyData* pdata); #endif /* FREERDP_SERVER_PROXY_PFCONTEXT_H */ diff --git a/server/proxy/pf_filters.c b/server/proxy/pf_filters.c index 92d53d2..41bad3e 100644 --- a/server/proxy/pf_filters.c +++ b/server/proxy/pf_filters.c @@ -153,12 +153,7 @@ BOOL pf_filters_register_new(filters_list* list, const char* module_path, const HMODULE handle = NULL; filterInitFn fn; - if (list == NULL) - { - WLog_ERR(TAG, "pf_filters_register_new(): list == NULL"); - goto error; - } - + assert(list != NULL); handle = LoadLibraryA(module_path); if (handle == NULL) diff --git a/server/proxy/pf_server.c b/server/proxy/pf_server.c index eb7fb04..2a7558f 100644 --- a/server/proxy/pf_server.c +++ b/server/proxy/pf_server.c @@ -71,7 +71,7 @@ static void pf_server_handle_client_disconnection(freerdp_peer* client) CloseHandle(ps->thread); } -static BOOL pf_server_parse_target_from_routing_token(freerdp_peer* client, +static BOOL pf_server_parse_target_from_routing_token(rdpContext* context, char** target, DWORD* port) { #define TARGET_MAX (100) @@ -80,7 +80,7 @@ static BOOL pf_server_parse_target_from_routing_token(freerdp_peer* client, size_t len; const size_t prefix_len = strlen(ROUTING_TOKEN_PREFIX); DWORD routing_token_length; - const char* routing_token = freerdp_nego_get_routing_token(client->context, &routing_token_length); + const char* routing_token = freerdp_nego_get_routing_token(context, &routing_token_length); if (routing_token == NULL) { @@ -124,6 +124,28 @@ static BOOL pf_server_parse_target_from_routing_token(freerdp_peer* client, return TRUE; } +static BOOL pf_server_get_target_info(rdpContext* context, rdpSettings* settings, + proxyConfig* config) +{ + WLog_INFO(TAG, "pf_server_get_target_info: UseLoadBalanceInfo = %d", config->UseLoadBalanceInfo); + + if (config->UseLoadBalanceInfo) + return pf_server_parse_target_from_routing_token(context, &settings->ServerHostname, + &settings->ServerPort); + + /* use hardcoded target info from configuration */ + if (!(settings->ServerHostname = _strdup(config->TargetHost))) + { + WLog_DBG(TAG, "pf_server_get_target_info(): strdup failed!"); + return FALSE; + } + + settings->ServerPort = config->TargetPort > 0 ? 3389 : settings->ServerPort; + WLog_INFO(TAG, "Using target host from config: %s:%i", settings->ServerHostname, + settings->ServerPort); + return TRUE; +} + /* Event callbacks */ /** * This callback is called when the entire connection sequence is done (as @@ -134,45 +156,35 @@ static BOOL pf_server_parse_target_from_routing_token(freerdp_peer* client, */ static BOOL pf_server_post_connect(freerdp_peer* client) { - proxyConfig* config; pServerContext* ps; - pClientContext* pc; + rdpContext* pc; proxyData* pdata; - char* host = NULL; - DWORD port = 3389; /* default port */ + ps = (pServerContext*)client->context; pdata = ps->pdata; - config = pdata->config; - if (config->UseLoadBalanceInfo) + pc = p_client_context_create(client->settings); + + /* keep both sides of the connection in pdata */ + ((pClientContext*)pc)->pdata = ps->pdata; + pdata->pc = (pClientContext*)pc; + + if (!pf_server_get_target_info(client->context, pc->settings, pdata->config)) { - if (!pf_server_parse_target_from_routing_token(client, &host, &port)) - { - WLog_ERR(TAG, "pf_server_parse_target_from_routing_token failed!"); - return FALSE; - } + WLog_ERR(TAG, "pf_server_post_connect(): pf_server_get_target_info failed!"); + return FALSE; } - else + + if (!proxy_data_set_connection_info(pdata, client->settings, pc->settings->ServerHostname)) { - /* use hardcoded target info from configuration */ - host = _strdup(config->TargetHost); - port = config->TargetPort > 0 ? config->TargetPort : port; - WLog_DBG(TAG, "Using hardcoded target host: %s:%i", host, port); + WLog_ERR(TAG, "proxy_data_set_connection_info failed!"); + return FALSE; } - pc = (pClientContext*) p_client_context_create(client->settings, host, port); - /* keep both sides of the connection in pdata */ - pc->pdata = ps->pdata; - pdata->info->TargetHostname = _strdup(host); - pdata->info->Username = _strdup(client->settings->Username); - pdata->pc = pc; - pdata->ps = ps; - pdata->connectionClosed = CreateEvent(NULL, TRUE, FALSE, NULL); pf_server_rdpgfx_init(ps); /* Start a proxy's client in it's own thread */ - if (!(ps->thread = CreateThread(NULL, 0, pf_client_start, (rdpContext*) pc, 0, - NULL))) + if (!(ps->thread = CreateThread(NULL, 0, pf_client_start, pc, 0, NULL))) { WLog_ERR(TAG, "CreateThread failed!"); return FALSE; @@ -203,26 +215,25 @@ static DWORD WINAPI pf_server_handle_client(LPVOID arg) rdpContext* pc; proxyData* pdata; proxyConfig* config; - freerdp_peer* client = (freerdp_peer*) arg; + freerdp_peer* client = (freerdp_peer*)arg; if (!init_p_server_context(client)) + goto out_free_peer; + + ps = (pServerContext*)client->context; + if (!(ps->dynvcReady = CreateEvent(NULL, TRUE, FALSE, NULL))) { - freerdp_peer_free(client); - return 0; + WLog_ERR(TAG, "pf_server_post_connect(): CreateEvent failed!"); + goto out_free_peer; } - ps = (pServerContext*) client->context; - ps->dynvcReady = CreateEvent(NULL, TRUE, FALSE, NULL); - pdata = pf_context_proxy_data_new(); - - if (pdata == NULL) + if (!(pdata = ps->pdata = proxy_data_new())) { - WLog_ERR(TAG, "pf_context_proxy_data_new failed!"); - return 0; + WLog_ERR(TAG, "pf_server_post_connect(): proxy_data_new failed!"); + goto out_free_peer; } - pdata->info->ClientHostname = _strdup(client->hostname); - ps->pdata = pdata; + pdata->ps = ps; /* keep configuration in proxyData */ pdata->config = client->ContextExtra; config = pdata->config; @@ -232,12 +243,11 @@ static DWORD WINAPI pf_server_handle_client(LPVOID arg) client->settings->PrivateKeyFile = _strdup("server.key"); client->settings->RdpKeyFile = _strdup("server.key"); - if (!client->settings->CertificateFile || !client->settings->PrivateKeyFile - || !client->settings->RdpKeyFile) + if (!client->settings->CertificateFile || !client->settings->PrivateKeyFile || + !client->settings->RdpKeyFile) { WLog_ERR(TAG, "Memory allocation failed (strdup)"); - freerdp_peer_free(client); - return 0; + goto out_free_peer; } client->settings->RdpSecurity = config->RdpSecurity; @@ -253,8 +263,7 @@ static DWORD WINAPI pf_server_handle_client(LPVOID arg) pf_server_register_update_callbacks(client->update); client->settings->MultifragMaxRequestSize = 0xFFFFFF; /* FIXME */ client->Initialize(client); - WLog_INFO(TAG, "Client connected: %s", - client->local ? "(local)" : client->hostname); + WLog_INFO(TAG, "Client connected: %s", client->local ? "(local)" : client->hostname); /* Main client event handling loop */ ChannelEvent = WTSVirtualChannelManagerGetEventHandle(ps->vcm); @@ -262,8 +271,7 @@ static DWORD WINAPI pf_server_handle_client(LPVOID arg) { eventCount = 0; { - tmp = client->GetEventHandles(client, &eventHandles[eventCount], - 32 - eventCount); + tmp = client->GetEventHandles(client, &eventHandles[eventCount], 32 - eventCount); if (tmp == 0) { @@ -301,28 +309,28 @@ static DWORD WINAPI pf_server_handle_client(LPVOID arg) switch (WTSVirtualChannelManagerGetDrdynvcState(ps->vcm)) { - /* Dynamic channel status may have been changed after processing */ - case DRDYNVC_STATE_NONE: + /* Dynamic channel status may have been changed after processing */ + case DRDYNVC_STATE_NONE: - /* Initialize drdynvc channel */ - if (!WTSVirtualChannelManagerCheckFileDescriptor(ps->vcm)) - { - WLog_ERR(TAG, "Failed to initialize drdynvc channel"); - goto fail; - } + /* Initialize drdynvc channel */ + if (!WTSVirtualChannelManagerCheckFileDescriptor(ps->vcm)) + { + WLog_ERR(TAG, "Failed to initialize drdynvc channel"); + goto fail; + } - break; + break; - case DRDYNVC_STATE_READY: - if (WaitForSingleObject(ps->dynvcReady, 0) == WAIT_TIMEOUT) - { - SetEvent(ps->dynvcReady); - } + case DRDYNVC_STATE_READY: + if (WaitForSingleObject(ps->dynvcReady, 0) == WAIT_TIMEOUT) + { + SetEvent(ps->dynvcReady); + } - break; + break; - default: - break; + default: + break; } } @@ -333,24 +341,23 @@ fail: pf_server_handle_client_disconnection(client); } - pc = (rdpContext*) pdata->pc; + pc = (rdpContext*)pdata->pc; freerdp_client_stop(pc); - pf_context_proxy_data_free(pdata); + proxy_data_free(pdata); freerdp_client_context_free(pc); client->Disconnect(client); +out_free_peer: freerdp_peer_context_free(client); freerdp_peer_free(client); return 0; } -static BOOL pf_server_client_connected(freerdp_listener* listener, - freerdp_peer* client) +static BOOL pf_server_client_connected(freerdp_listener* listener, freerdp_peer* client) { HANDLE hThread; client->ContextExtra = listener->info; - if (!(hThread = CreateThread(NULL, 0, pf_server_handle_client, - (void*) client, 0, NULL))) + if (!(hThread = CreateThread(NULL, 0, pf_server_handle_client, (void*)client, 0, NULL))) return FALSE; CloseHandle(hThread); @@ -414,7 +421,7 @@ int pf_server_start(proxyConfig* config) } /* Determine filepath for local socket */ - sprintf_s(localSockName, sizeof(localSockName), "proxy.%"PRIu16"", config->Port); + sprintf_s(localSockName, sizeof(localSockName), "proxy.%" PRIu16 "", config->Port); localSockPath = GetKnownSubPath(KNOWN_PATH_TEMP, localSockName); if (!localSockPath)