From a0019ec79cc9c3a5c8fc2b4c0eda2da0f7d153f0 Mon Sep 17 00:00:00 2001 From: Pavel Pautov <37922380+p-pautov@users.noreply.github.com> Date: Tue, 17 Apr 2018 17:05:20 -0700 Subject: [PATCH] Fallback to RDG RPC transport only if server does not support RDG HTTP and error out in other cases - invalid RDG SSL cert, bad credentials, PAA failue, etc. --- libfreerdp/core/gateway/rdg.c | 16 ++++++++++++---- libfreerdp/core/gateway/rdg.h | 3 +-- libfreerdp/core/transport.c | 5 +++-- 3 files changed, 16 insertions(+), 8 deletions(-) mode change 100644 => 100755 libfreerdp/core/transport.c diff --git a/libfreerdp/core/gateway/rdg.c b/libfreerdp/core/gateway/rdg.c index 3dab0f4f1..2eac65609 100755 --- a/libfreerdp/core/gateway/rdg.c +++ b/libfreerdp/core/gateway/rdg.c @@ -733,7 +733,7 @@ static BOOL rdg_tls_connect(rdpRdg* rdg, rdpTls* tls, const char* peerAddress, i } static BOOL rdg_establish_data_connection(rdpRdg* rdg, rdpTls* tls, - const char* method, const char* peerAddress, int timeout) + const char* method, const char* peerAddress, int timeout, BOOL* rpcFallback) { HttpResponse* response = NULL; int statusCode; @@ -754,6 +754,14 @@ static BOOL rdg_establish_data_connection(rdpRdg* rdg, rdpTls* tls, if (!response) return FALSE; + if (response->StatusCode == HTTP_STATUS_NOT_FOUND) + { + WLog_INFO(TAG, "RD Gateway does not support HTTP transport."); + if (rpcFallback) *rpcFallback = TRUE; + http_response_free(response); + return FALSE; + } + if (!rdg_handle_ntlm_challenge(rdg->ntlm, response)) { http_response_free(response); @@ -824,7 +832,7 @@ static BOOL rdg_tunnel_connect(rdpRdg* rdg) return TRUE; } -BOOL rdg_connect(rdpRdg* rdg, const char* hostname, UINT16 port, int timeout) +BOOL rdg_connect(rdpRdg* rdg, int timeout, BOOL* rpcFallback) { BOOL status; int outConnSocket = 0; @@ -832,7 +840,7 @@ BOOL rdg_connect(rdpRdg* rdg, const char* hostname, UINT16 port, int timeout) assert(rdg != NULL); status = rdg_establish_data_connection( - rdg, rdg->tlsOut, "RDG_OUT_DATA", NULL, timeout); + rdg, rdg->tlsOut, "RDG_OUT_DATA", NULL, timeout, rpcFallback); if (status) { @@ -843,7 +851,7 @@ BOOL rdg_connect(rdpRdg* rdg, const char* hostname, UINT16 port, int timeout) peerAddress = freerdp_tcp_get_peer_address(outConnSocket); status = rdg_establish_data_connection( - rdg, rdg->tlsIn, "RDG_IN_DATA", peerAddress, timeout); + rdg, rdg->tlsIn, "RDG_IN_DATA", peerAddress, timeout, NULL); free(peerAddress); } diff --git a/libfreerdp/core/gateway/rdg.h b/libfreerdp/core/gateway/rdg.h index 2dfbbc5c5..f4fa95c11 100755 --- a/libfreerdp/core/gateway/rdg.h +++ b/libfreerdp/core/gateway/rdg.h @@ -138,8 +138,7 @@ struct rdp_rdg FREERDP_LOCAL rdpRdg* rdg_new(rdpTransport* transport); FREERDP_LOCAL void rdg_free(rdpRdg* rdg); -FREERDP_LOCAL BOOL rdg_connect(rdpRdg* rdg, const char* hostname, UINT16 port, - int timeout); +FREERDP_LOCAL BOOL rdg_connect(rdpRdg* rdg, int timeout, BOOL* rpcFallback); FREERDP_LOCAL DWORD rdg_get_event_handles(rdpRdg* rdg, HANDLE* events, DWORD count); diff --git a/libfreerdp/core/transport.c b/libfreerdp/core/transport.c old mode 100644 new mode 100755 index ad44e0a17..59ee8cf3d --- a/libfreerdp/core/transport.c +++ b/libfreerdp/core/transport.c @@ -354,6 +354,7 @@ BOOL transport_connect(rdpTransport* transport, const char* hostname, rdpSettings* settings = transport->settings; rdpContext* context = transport->context; transport->async = settings->AsyncTransport; + BOOL rpcFallback = !settings->GatewayHttpTransport; if (transport->GatewayEnabled) { @@ -364,7 +365,7 @@ BOOL transport_connect(rdpTransport* transport, const char* hostname, if (!transport->rdg) return FALSE; - status = rdg_connect(transport->rdg, hostname, port, timeout); + status = rdg_connect(transport->rdg, timeout, &rpcFallback); if (status) { @@ -380,7 +381,7 @@ BOOL transport_connect(rdpTransport* transport, const char* hostname, } } - if (!status && settings->GatewayRpcTransport) + if (!status && settings->GatewayRpcTransport && rpcFallback) { transport->tsg = tsg_new(transport);