GUACAMOLE-649: Add support for setting LANG environment variable via SSH.

This commit is contained in:
Michael Jumper 2018-10-21 23:30:53 -07:00
parent 6f49194640
commit 454682979e
3 changed files with 34 additions and 0 deletions

View File

@ -60,6 +60,7 @@ const char* GUAC_SSH_CLIENT_ARGS[] = {
"backspace", "backspace",
"terminal-type", "terminal-type",
"scrollback", "scrollback",
"locale",
NULL NULL
}; };
@ -238,6 +239,14 @@ enum SSH_ARGS_IDX {
*/ */
IDX_SCROLLBACK, IDX_SCROLLBACK,
/**
* The locale that should be forwarded to the remote system via the LANG
* environment variable. By default, no locale is forwarded. This setting
* will only have an effect if the SSH server allows the LANG environment
* variable to be set.
*/
IDX_LOCALE,
SSH_ARGS_COUNT SSH_ARGS_COUNT
}; };
@ -396,6 +405,11 @@ guac_ssh_settings* guac_ssh_parse_args(guac_user* user,
guac_user_parse_args_string(user, GUAC_SSH_CLIENT_ARGS, argv, guac_user_parse_args_string(user, GUAC_SSH_CLIENT_ARGS, argv,
IDX_TERMINAL_TYPE, "linux"); IDX_TERMINAL_TYPE, "linux");
/* Read locale */
settings->locale =
guac_user_parse_args_string(user, GUAC_SSH_CLIENT_ARGS, argv,
IDX_LOCALE, NULL);
/* Parsing was successful */ /* Parsing was successful */
return settings; return settings;
@ -435,6 +449,9 @@ void guac_ssh_settings_free(guac_ssh_settings* settings) {
/* Free terminal emulator type. */ /* Free terminal emulator type. */
free(settings->terminal_type); free(settings->terminal_type);
/* Free locale */
free(settings->locale);
/* Free overall structure */ /* Free overall structure */
free(settings); free(settings);

View File

@ -248,6 +248,12 @@ typedef struct guac_ssh_settings {
*/ */
char* terminal_type; char* terminal_type;
/**
* The locale that should be forwarded to the remote system via the LANG
* environment variable.
*/
char* locale;
} guac_ssh_settings; } guac_ssh_settings;
/** /**

View File

@ -320,6 +320,17 @@ void* ssh_client_thread(void* data) {
return NULL; return NULL;
} }
/* Forward specified locale */
if (settings->locale != NULL) {
if (libssh2_channel_setenv(ssh_client->term_channel, "LANG",
settings->locale)) {
guac_client_abort(client, GUAC_PROTOCOL_STATUS_UPSTREAM_ERROR,
"Unable to forward locale: SSH server refused to set "
"\"LANG\" environment variable.");
return NULL;
}
}
/* If a command is specified, run that instead of a shell */ /* If a command is specified, run that instead of a shell */
if (settings->command != NULL) { if (settings->command != NULL) {
if (libssh2_channel_exec(ssh_client->term_channel, settings->command)) { if (libssh2_channel_exec(ssh_client->term_channel, settings->command)) {