GUACAMOLE-422: Merge support for specifying the timezone of RDP and SSH sessions.
This commit is contained in:
commit
0d435e2435
@ -719,7 +719,7 @@ static int guac_rdp_handle_connection(guac_client* client) {
|
|||||||
guac_common_cursor_set_pointer(rdp_client->display->cursor);
|
guac_common_cursor_set_pointer(rdp_client->display->cursor);
|
||||||
|
|
||||||
/* Push desired settings to FreeRDP */
|
/* Push desired settings to FreeRDP */
|
||||||
guac_rdp_push_settings(settings, rdp_inst);
|
guac_rdp_push_settings(client, settings, rdp_inst);
|
||||||
|
|
||||||
/* Connect to RDP server */
|
/* Connect to RDP server */
|
||||||
if (!freerdp_connect(rdp_inst)) {
|
if (!freerdp_connect(rdp_inst)) {
|
||||||
|
@ -35,6 +35,7 @@
|
|||||||
#include "compat/winpr-wtypes.h"
|
#include "compat/winpr-wtypes.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
@ -79,6 +80,7 @@ const char* GUAC_RDP_CLIENT_ARGS[] = {
|
|||||||
"disable-glyph-caching",
|
"disable-glyph-caching",
|
||||||
"preconnection-id",
|
"preconnection-id",
|
||||||
"preconnection-blob",
|
"preconnection-blob",
|
||||||
|
"timezone",
|
||||||
|
|
||||||
#ifdef ENABLE_COMMON_SSH
|
#ifdef ENABLE_COMMON_SSH
|
||||||
"enable-sftp",
|
"enable-sftp",
|
||||||
@ -356,6 +358,14 @@ enum RDP_ARGS_IDX {
|
|||||||
*/
|
*/
|
||||||
IDX_PRECONNECTION_BLOB,
|
IDX_PRECONNECTION_BLOB,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The timezone to pass through to the RDP connection, in IANA format, which
|
||||||
|
* will be translated into Windows formats. See the following page for
|
||||||
|
* information and list of valid values:
|
||||||
|
* https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
|
||||||
|
*/
|
||||||
|
IDX_TIMEZONE,
|
||||||
|
|
||||||
#ifdef ENABLE_COMMON_SSH
|
#ifdef ENABLE_COMMON_SSH
|
||||||
/**
|
/**
|
||||||
* "true" if SFTP should be enabled for the RDP connection, "false" or
|
* "true" if SFTP should be enabled for the RDP connection, "false" or
|
||||||
@ -840,6 +850,11 @@ guac_rdp_settings* guac_rdp_parse_args(guac_user* user,
|
|||||||
if (settings->server_layout == NULL)
|
if (settings->server_layout == NULL)
|
||||||
settings->server_layout = guac_rdp_keymap_find(GUAC_DEFAULT_KEYMAP);
|
settings->server_layout = guac_rdp_keymap_find(GUAC_DEFAULT_KEYMAP);
|
||||||
|
|
||||||
|
/* Timezone if provied by client */
|
||||||
|
settings->timezone =
|
||||||
|
guac_user_parse_args_string(user, GUAC_RDP_CLIENT_ARGS, argv,
|
||||||
|
IDX_TIMEZONE, NULL);
|
||||||
|
|
||||||
#ifdef ENABLE_COMMON_SSH
|
#ifdef ENABLE_COMMON_SSH
|
||||||
/* SFTP enable/disable */
|
/* SFTP enable/disable */
|
||||||
settings->enable_sftp =
|
settings->enable_sftp =
|
||||||
@ -1013,6 +1028,7 @@ void guac_rdp_settings_free(guac_rdp_settings* settings) {
|
|||||||
free(settings->remote_app);
|
free(settings->remote_app);
|
||||||
free(settings->remote_app_args);
|
free(settings->remote_app_args);
|
||||||
free(settings->remote_app_dir);
|
free(settings->remote_app_dir);
|
||||||
|
free(settings->timezone);
|
||||||
free(settings->username);
|
free(settings->username);
|
||||||
free(settings->printer_name);
|
free(settings->printer_name);
|
||||||
|
|
||||||
@ -1153,7 +1169,8 @@ static char* guac_rdp_strdup(const char* str) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void guac_rdp_push_settings(guac_rdp_settings* guac_settings, freerdp* rdp) {
|
void guac_rdp_push_settings(guac_client* client,
|
||||||
|
guac_rdp_settings* guac_settings, freerdp* rdp) {
|
||||||
|
|
||||||
BOOL bitmap_cache = !guac_settings->disable_bitmap_caching;
|
BOOL bitmap_cache = !guac_settings->disable_bitmap_caching;
|
||||||
rdpSettings* rdp_settings = rdp->settings;
|
rdpSettings* rdp_settings = rdp->settings;
|
||||||
@ -1264,6 +1281,15 @@ void guac_rdp_push_settings(guac_rdp_settings* guac_settings, freerdp* rdp) {
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Timezone redirection */
|
||||||
|
if (guac_settings->timezone) {
|
||||||
|
if (setenv("TZ", guac_settings->timezone, 1)) {
|
||||||
|
guac_client_log(client, GUAC_LOG_WARNING,
|
||||||
|
"Unable to forward timezone: TZ environment variable "
|
||||||
|
"could not be set: %s", strerror(errno));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Device redirection */
|
/* Device redirection */
|
||||||
#ifdef LEGACY_RDPSETTINGS
|
#ifdef LEGACY_RDPSETTINGS
|
||||||
#ifdef HAVE_RDPSETTINGS_DEVICEREDIRECTION
|
#ifdef HAVE_RDPSETTINGS_DEVICEREDIRECTION
|
||||||
|
@ -341,6 +341,11 @@ typedef struct guac_rdp_settings {
|
|||||||
*/
|
*/
|
||||||
char* preconnection_blob;
|
char* preconnection_blob;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The timezone to pass through to the RDP connection.
|
||||||
|
*/
|
||||||
|
char* timezone;
|
||||||
|
|
||||||
#ifdef ENABLE_COMMON_SSH
|
#ifdef ENABLE_COMMON_SSH
|
||||||
/**
|
/**
|
||||||
* Whether SFTP should be enabled for the VNC connection.
|
* Whether SFTP should be enabled for the VNC connection.
|
||||||
@ -547,13 +552,17 @@ extern const char* GUAC_RDP_CLIENT_ARGS[];
|
|||||||
/**
|
/**
|
||||||
* Save all given settings to the given freerdp instance.
|
* Save all given settings to the given freerdp instance.
|
||||||
*
|
*
|
||||||
|
* @param client
|
||||||
|
* The guac_client object providing the settings.
|
||||||
|
*
|
||||||
* @param guac_settings
|
* @param guac_settings
|
||||||
* The guac_rdp_settings object to save.
|
* The guac_rdp_settings object to save.
|
||||||
*
|
*
|
||||||
* @param rdp
|
* @param rdp
|
||||||
* The RDP instance to save settings to.
|
* The RDP instance to save settings to.
|
||||||
*/
|
*/
|
||||||
void guac_rdp_push_settings(guac_rdp_settings* guac_settings, freerdp* rdp);
|
void guac_rdp_push_settings(guac_client* client,
|
||||||
|
guac_rdp_settings* guac_settings, freerdp* rdp);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the width of the RDP session display.
|
* Returns the width of the RDP session display.
|
||||||
|
@ -61,6 +61,7 @@ const char* GUAC_SSH_CLIENT_ARGS[] = {
|
|||||||
"terminal-type",
|
"terminal-type",
|
||||||
"scrollback",
|
"scrollback",
|
||||||
"locale",
|
"locale",
|
||||||
|
"timezone",
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -247,6 +248,16 @@ enum SSH_ARGS_IDX {
|
|||||||
*/
|
*/
|
||||||
IDX_LOCALE,
|
IDX_LOCALE,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The timezone that is to be passed to the remote system, via the
|
||||||
|
* TZ environment variable. By default, no timezone is forwarded
|
||||||
|
* and the timezone of the remote system will be used. This
|
||||||
|
* setting will only work if the SSH server allows the TZ variable
|
||||||
|
* to be set. Timezones should be in standard IANA format, see:
|
||||||
|
* https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
|
||||||
|
*/
|
||||||
|
IDX_TIMEZONE,
|
||||||
|
|
||||||
SSH_ARGS_COUNT
|
SSH_ARGS_COUNT
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -410,6 +421,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_LOCALE, NULL);
|
IDX_LOCALE, NULL);
|
||||||
|
|
||||||
|
/* Read the client timezone. */
|
||||||
|
settings->timezone =
|
||||||
|
guac_user_parse_args_string(user, GUAC_SSH_CLIENT_ARGS, argv,
|
||||||
|
IDX_TIMEZONE, NULL);
|
||||||
|
|
||||||
/* Parsing was successful */
|
/* Parsing was successful */
|
||||||
return settings;
|
return settings;
|
||||||
|
|
||||||
@ -452,6 +468,9 @@ void guac_ssh_settings_free(guac_ssh_settings* settings) {
|
|||||||
/* Free locale */
|
/* Free locale */
|
||||||
free(settings->locale);
|
free(settings->locale);
|
||||||
|
|
||||||
|
/* Free the client timezone. */
|
||||||
|
free(settings->timezone);
|
||||||
|
|
||||||
/* Free overall structure */
|
/* Free overall structure */
|
||||||
free(settings);
|
free(settings);
|
||||||
|
|
||||||
|
@ -254,6 +254,11 @@ typedef struct guac_ssh_settings {
|
|||||||
*/
|
*/
|
||||||
char* locale;
|
char* locale;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The client timezone to pass to the remote system.
|
||||||
|
*/
|
||||||
|
char* timezone;
|
||||||
|
|
||||||
} guac_ssh_settings;
|
} guac_ssh_settings;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -256,6 +256,17 @@ void* ssh_client_thread(void* data) {
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Set the client timezone */
|
||||||
|
if (settings->timezone != NULL) {
|
||||||
|
if (libssh2_channel_setenv(ssh_client->term_channel, "TZ",
|
||||||
|
settings->timezone)) {
|
||||||
|
guac_client_log(client, GUAC_LOG_WARNING,
|
||||||
|
"Unable to set the timezone: SSH server "
|
||||||
|
"refused to set \"TZ\" variable.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef ENABLE_SSH_AGENT
|
#ifdef ENABLE_SSH_AGENT
|
||||||
/* Start SSH agent forwarding, if enabled */
|
/* Start SSH agent forwarding, if enabled */
|
||||||
if (ssh_client->enable_agent) {
|
if (ssh_client->enable_agent) {
|
||||||
|
Loading…
Reference in New Issue
Block a user