Skip to content

Commit

Permalink
GUACAMOLE-1167: Add server settings for RD gateway type.
Browse files Browse the repository at this point in the history
  • Loading branch information
necouchman committed Oct 17, 2024
1 parent 1c1bcc8 commit 35ccf99
Show file tree
Hide file tree
Showing 2 changed files with 73 additions and 1 deletion.
46 changes: 45 additions & 1 deletion src/protocols/rdp/settings.c
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,7 @@ const char* GUAC_RDP_CLIENT_ARGS[] = {

"gateway-hostname",
"gateway-port",
"gateway-type",
"gateway-domain",
"gateway-username",
"gateway-password",
Expand Down Expand Up @@ -632,6 +633,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,
Expand Down Expand Up @@ -1263,6 +1271,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 =
Expand Down Expand Up @@ -1960,7 +1982,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 */
Expand Down
28 changes: 28 additions & 0 deletions src/protocols/rdp/settings.h
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,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.
*/
Expand Down Expand Up @@ -625,6 +647,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,
Expand Down

0 comments on commit 35ccf99

Please sign in to comment.