diff --git a/src/protocols/rdp/settings.c b/src/protocols/rdp/settings.c index 57760d93..44dba71a 100644 --- a/src/protocols/rdp/settings.c +++ b/src/protocols/rdp/settings.c @@ -112,6 +112,7 @@ const char* GUAC_RDP_CLIENT_ARGS[] = { "gateway-hostname", "gateway-port", + "gateway-type", "gateway-domain", "gateway-username", "gateway-password", @@ -548,6 +549,13 @@ enum RDP_ARGS_IDX { * effect. FreeRDP instead uses a hard-coded value of 443. */ IDX_GATEWAY_PORT, + + /** + * Explicitly set the mode for the RDP gateway. This can either be set to + * auto, in which case the RDP client will attempt to auto-detect the mode, + * or can be forced to either HTTP or RPC. + */ + IDX_GATEWAY_TYPE, /** * The domain of the user authenticating with the remote desktop gateway, @@ -1078,6 +1086,20 @@ guac_rdp_settings* guac_rdp_parse_args(guac_user* user, settings->gateway_port = guac_user_parse_args_int(user, GUAC_RDP_CLIENT_ARGS, argv, IDX_GATEWAY_PORT, 443); + + char* gateway_type = guac_user_parse_args_string(user, GUAC_RDP_CLIENT_ARGS, + argv, IDX_GATEWAY_TYPE, NULL); + + if (strcmp(gateway_type, "auto") == 0) + settings->gateway_type = GUAC_RDP_GATEWAY_AUTO; + + else if (strcmp(gateway_type, "http") == 0) + settings->gateway_type = GUAC_RDP_GATEWAY_HTTP; + + else if (strcmp(gateway_type, "rpc") == 0) + settings->gateway_type = GUAC_RDP_GATEWAY_RPC; + + free(gateway_type); /* Set gateway domain */ settings->gateway_domain = @@ -1195,6 +1217,7 @@ void guac_rdp_settings_free(guac_rdp_settings* settings) { /* Free RD gateway information */ free(settings->gateway_hostname); + free(settings->gateway_type); free(settings->gateway_domain); free(settings->gateway_username); free(settings->gateway_password); @@ -1437,7 +1460,29 @@ void guac_rdp_push_settings(guac_client* client, rdp_settings->GatewayDomain = guac_strdup(guac_settings->gateway_domain); rdp_settings->GatewayUsername = guac_strdup(guac_settings->gateway_username); rdp_settings->GatewayPassword = guac_strdup(guac_settings->gateway_password); - + + /* Check RD gateway type setting and set options appropriately. */ + switch(guac_settings->gateway_type) { + + /* Gateway is set to auto, so enable either transport. */ + case GUAC_RDP_GATEWAY_AUTO: + rdp_settings->GatewayHttpTransport = TRUE; + rdp_settings->GatewayRpcTransport = TRUE; + break; + + /* Gateway is forced to HTTP, so only enable HTTP transport. */ + case GUAC_RDP_GATEWAY_HTTP: + rdp_settings->GatewayHttpTransport = TRUE; + rdp_settings->GatewayRpcTransport = FALSE; + break; + + /* Gateway is forced to RPC, so only enable RPC transport. */ + case GUAC_RDP_GATEWAY_RPC: + rdp_settings->GatewayHttpTransport = FALSE; + rdp_settings->GatewayRpcTransport = TRUE; + break; + } + } /* Store load balance info (and calculate length) if provided */ diff --git a/src/protocols/rdp/settings.h b/src/protocols/rdp/settings.h index d8092216..dd1bbf37 100644 --- a/src/protocols/rdp/settings.h +++ b/src/protocols/rdp/settings.h @@ -110,6 +110,28 @@ typedef enum guac_rdp_security { } guac_rdp_security; +/** + * Supported modes of the RDP gateway. + */ +typedef enum guac_rdp_gateway_type { + + /** + * Automatically detect the type of gateway in use. + */ + GUAC_RDP_GATEWAY_AUTO, + + /** + * Set the mode of the RDP gateway to HTTP. + */ + GUAC_RDP_GATEWAY_HTTP, + + /** + * Set the mode of the RDP gateway to RPC. + */ + GUAC_RDP_GATEWAY_RPC + +} guac_rdp_gateway_type; + /** * All supported combinations screen resize methods. */ @@ -539,6 +561,12 @@ typedef struct guac_rdp_settings { * instead use a hard-coded value of 443. */ int gateway_port; + + /** + * Set the mode of the RDP gateway. The gateway can either be auto-detected, + * or can be forced to HTTP or RPC mode. + */ + guac_rdp_gateway_type gateway_type; /** * The domain of the user authenticating with the remote desktop gateway,