From cfcfe8866cc1ab8e2ece21e4f8b56eca6c165d1d Mon Sep 17 00:00:00 2001 From: Nick Couchman Date: Tue, 3 Jul 2018 22:59:30 -0400 Subject: [PATCH 1/3] GUACAMOLE-446: Add settings for drive name. --- src/protocols/rdp/rdp_settings.c | 13 +++++++++++++ src/protocols/rdp/rdp_settings.h | 5 +++++ 2 files changed, 18 insertions(+) diff --git a/src/protocols/rdp/rdp_settings.c b/src/protocols/rdp/rdp_settings.c index 62fa1e25..258ca62b 100644 --- a/src/protocols/rdp/rdp_settings.c +++ b/src/protocols/rdp/rdp_settings.c @@ -54,6 +54,7 @@ const char* GUAC_RDP_CLIENT_ARGS[] = { "enable-printing", "printer-name", "enable-drive", + "drive-name", "drive-path", "create-drive-path", "console", @@ -198,6 +199,12 @@ enum RDP_ARGS_IDX { * otherwise. */ IDX_ENABLE_DRIVE, + + /** + * The name of the virtual driver that will be passed through to the + * RDP connection. + */ + IDX_DRIVE_NAME, /** * The local system path which will be used to persist the @@ -809,6 +816,11 @@ guac_rdp_settings* guac_rdp_parse_args(guac_user* user, settings->drive_enabled = guac_user_parse_args_boolean(user, GUAC_RDP_CLIENT_ARGS, argv, IDX_ENABLE_DRIVE, 0); + + /* Name of the drive being passed through */ + settings->drive_name = + guac_user_parse_args_string(user, GUAC_RDP_CLIENT_ARGS, argv, + IDX_DRIVE_NAME, 0); settings->drive_path = guac_user_parse_args_string(user, GUAC_RDP_CLIENT_ARGS, argv, @@ -990,6 +1002,7 @@ void guac_rdp_settings_free(guac_rdp_settings* settings) { /* Free settings strings */ free(settings->client_name); free(settings->domain); + free(settings->drive_name); free(settings->drive_path); free(settings->hostname); free(settings->initial_program); diff --git a/src/protocols/rdp/rdp_settings.h b/src/protocols/rdp/rdp_settings.h index 5caffe98..d521a87c 100644 --- a/src/protocols/rdp/rdp_settings.h +++ b/src/protocols/rdp/rdp_settings.h @@ -186,6 +186,11 @@ typedef struct guac_rdp_settings { * Whether the virtual drive is enabled. */ int drive_enabled; + + /** + * The name of the virtual drive to pass through to the RDP connection. + */ + char* drive_name; /** * The local system path which will be used to persist the From 958fb4c8e0747fe91935d0885b43de484fe198df Mon Sep 17 00:00:00 2001 From: Nick Couchman Date: Tue, 3 Jul 2018 23:10:05 -0400 Subject: [PATCH 2/3] GUACAMOLE-446: Pass through drive name to RDPDR stream. --- .../rdp/guac_rdpdr/rdpdr_fs_messages_vol_info.c | 12 +++++++----- src/protocols/rdp/guac_rdpdr/rdpdr_fs_service.c | 4 ++-- src/protocols/rdp/guac_rdpdr/rdpdr_fs_service.h | 8 +++++++- src/protocols/rdp/guac_rdpdr/rdpdr_messages.h | 6 ------ src/protocols/rdp/guac_rdpdr/rdpdr_service.c | 2 +- 5 files changed, 17 insertions(+), 15 deletions(-) diff --git a/src/protocols/rdp/guac_rdpdr/rdpdr_fs_messages_vol_info.c b/src/protocols/rdp/guac_rdpdr/rdpdr_fs_messages_vol_info.c index 74e27fd1..c1072957 100644 --- a/src/protocols/rdp/guac_rdpdr/rdpdr_fs_messages_vol_info.c +++ b/src/protocols/rdp/guac_rdpdr/rdpdr_fs_messages_vol_info.c @@ -25,6 +25,7 @@ #include "rdp_status.h" #include +#include #ifdef ENABLE_WINPR #include @@ -100,22 +101,23 @@ void guac_rdpdr_fs_process_query_device_info(guac_rdpdr_device* device, wStream* void guac_rdpdr_fs_process_query_attribute_info(guac_rdpdr_device* device, wStream* input_stream, int file_id, int completion_id) { + int name_len = guac_utf8_strlen(device->device_name); + wStream* output_stream = guac_rdpdr_new_io_completion(device, - completion_id, STATUS_SUCCESS, 16 + GUAC_FILESYSTEM_NAME_LENGTH); + completion_id, STATUS_SUCCESS, 16 + name_len); guac_client_log(device->rdpdr->client, GUAC_LOG_DEBUG, "%s: [file_id=%i]", __func__, file_id); - Stream_Write_UINT32(output_stream, 12 + GUAC_FILESYSTEM_NAME_LENGTH); + Stream_Write_UINT32(output_stream, 12 + name_len); Stream_Write_UINT32(output_stream, FILE_UNICODE_ON_DISK | FILE_CASE_SENSITIVE_SEARCH | FILE_CASE_PRESERVED_NAMES); /* FileSystemAttributes */ Stream_Write_UINT32(output_stream, GUAC_RDP_FS_MAX_PATH ); /* MaximumComponentNameLength */ - Stream_Write_UINT32(output_stream, GUAC_FILESYSTEM_NAME_LENGTH); - Stream_Write(output_stream, GUAC_FILESYSTEM_NAME, - GUAC_FILESYSTEM_NAME_LENGTH); + Stream_Write_UINT32(output_stream, name_len); + Stream_Write(output_stream, device->device_name, name_len); svc_plugin_send((rdpSvcPlugin*) device->rdpdr, output_stream); diff --git a/src/protocols/rdp/guac_rdpdr/rdpdr_fs_service.c b/src/protocols/rdp/guac_rdpdr/rdpdr_fs_service.c index 85787db2..e064d4de 100644 --- a/src/protocols/rdp/guac_rdpdr/rdpdr_fs_service.c +++ b/src/protocols/rdp/guac_rdpdr/rdpdr_fs_service.c @@ -119,7 +119,7 @@ static void guac_rdpdr_device_fs_free_handler(guac_rdpdr_device* device) { } -void guac_rdpdr_register_fs(guac_rdpdrPlugin* rdpdr) { +void guac_rdpdr_register_fs(guac_rdpdrPlugin* rdpdr, char* drive_name) { guac_client* client = rdpdr->client; guac_rdp_client* rdp_client = (guac_rdp_client*) client->data; @@ -131,7 +131,7 @@ void guac_rdpdr_register_fs(guac_rdpdrPlugin* rdpdr) { /* Init device */ device->rdpdr = rdpdr; device->device_id = id; - device->device_name = "Guacamole Filesystem"; + device->device_name = drive_name; int device_name_len = guac_utf8_strlen(device->device_name); device->device_type = RDPDR_DTYP_FILESYSTEM; device->dos_name = "GUACFS\0\0"; diff --git a/src/protocols/rdp/guac_rdpdr/rdpdr_fs_service.h b/src/protocols/rdp/guac_rdpdr/rdpdr_fs_service.h index ca3dd303..f990806b 100644 --- a/src/protocols/rdp/guac_rdpdr/rdpdr_fs_service.h +++ b/src/protocols/rdp/guac_rdpdr/rdpdr_fs_service.h @@ -41,8 +41,14 @@ /** * Registers a new filesystem device within the RDPDR plugin. This must be done * before RDPDR connection finishes. + * + * @param rdpdr + * The RDP device redirection plugin with which to register the device. + * + * @param drive_name + * The name of the redirected drive to display in the RDP connection. */ -void guac_rdpdr_register_fs(guac_rdpdrPlugin* rdpdr); +void guac_rdpdr_register_fs(guac_rdpdrPlugin* rdpdr, char* drive_name); #endif diff --git a/src/protocols/rdp/guac_rdpdr/rdpdr_messages.h b/src/protocols/rdp/guac_rdpdr/rdpdr_messages.h index 8f276524..1e489245 100644 --- a/src/protocols/rdp/guac_rdpdr/rdpdr_messages.h +++ b/src/protocols/rdp/guac_rdpdr/rdpdr_messages.h @@ -76,12 +76,6 @@ #define GUAC_PRINTER_DRIVER "M\0S\0 \0P\0u\0b\0l\0i\0s\0h\0e\0r\0 \0I\0m\0a\0g\0e\0s\0e\0t\0t\0e\0r\0\0\0" #define GUAC_PRINTER_DRIVER_LENGTH 50 -/** - * Name of the filesystem. - */ -#define GUAC_FILESYSTEM_NAME "G\0u\0a\0c\0a\0m\0o\0l\0e\0\0\0" -#define GUAC_FILESYSTEM_NAME_LENGTH 20 - /** * Label of the filesystem. */ diff --git a/src/protocols/rdp/guac_rdpdr/rdpdr_service.c b/src/protocols/rdp/guac_rdpdr/rdpdr_service.c index 611d21a5..4901deca 100644 --- a/src/protocols/rdp/guac_rdpdr/rdpdr_service.c +++ b/src/protocols/rdp/guac_rdpdr/rdpdr_service.c @@ -100,7 +100,7 @@ void guac_rdpdr_process_connect(rdpSvcPlugin* plugin) { /* Register drive if enabled */ if (rdp_client->settings->drive_enabled) - guac_rdpdr_register_fs(rdpdr); + guac_rdpdr_register_fs(rdpdr, rdp_client->settings->drive_name); /* Log that printing, etc. has been loaded */ guac_client_log(client, GUAC_LOG_INFO, "guacdr connected."); From 5e942c9a67eba87c1b77e8c04db0433b13d5773b Mon Sep 17 00:00:00 2001 From: Nick Couchman Date: Tue, 3 Jul 2018 23:23:38 -0400 Subject: [PATCH 3/3] GUACAMOLE-446: Valid default value for the filesystem name. --- src/protocols/rdp/rdp_settings.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/protocols/rdp/rdp_settings.c b/src/protocols/rdp/rdp_settings.c index 258ca62b..a3bd3482 100644 --- a/src/protocols/rdp/rdp_settings.c +++ b/src/protocols/rdp/rdp_settings.c @@ -820,7 +820,7 @@ guac_rdp_settings* guac_rdp_parse_args(guac_user* user, /* Name of the drive being passed through */ settings->drive_name = guac_user_parse_args_string(user, GUAC_RDP_CLIENT_ARGS, argv, - IDX_DRIVE_NAME, 0); + IDX_DRIVE_NAME, "Guacamole Filesystem"); settings->drive_path = guac_user_parse_args_string(user, GUAC_RDP_CLIENT_ARGS, argv,