GUACAMOLE-446: Merge changes adding support for overriding default RDP virtual drive name.
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 74e27fd..c107295 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 <freerdp/utils/svc_plugin.h>
+#include <guacamole/unicode.h>
#ifdef ENABLE_WINPR
#include <winpr/stream.h>
@@ -100,22 +101,23 @@
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 85787db..e064d4d 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 @@
}
-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 @@
/* 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 ca3dd30..f990806 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 8f27652..1e48924 100644
--- a/src/protocols/rdp/guac_rdpdr/rdpdr_messages.h
+++ b/src/protocols/rdp/guac_rdpdr/rdpdr_messages.h
@@ -77,12 +77,6 @@
#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.
*/
#define GUAC_FILESYSTEM_LABEL "G\0U\0A\0C\0F\0I\0L\0E\0"
diff --git a/src/protocols/rdp/guac_rdpdr/rdpdr_service.c b/src/protocols/rdp/guac_rdpdr/rdpdr_service.c
index 611d21a..4901dec 100644
--- a/src/protocols/rdp/guac_rdpdr/rdpdr_service.c
+++ b/src/protocols/rdp/guac_rdpdr/rdpdr_service.c
@@ -100,7 +100,7 @@
/* 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.");
diff --git a/src/protocols/rdp/rdp_settings.c b/src/protocols/rdp/rdp_settings.c
index 62fa1e2..a3bd348 100644
--- a/src/protocols/rdp/rdp_settings.c
+++ b/src/protocols/rdp/rdp_settings.c
@@ -54,6 +54,7 @@
"enable-printing",
"printer-name",
"enable-drive",
+ "drive-name",
"drive-path",
"create-drive-path",
"console",
@@ -198,6 +199,12 @@
* 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 @@
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, "Guacamole Filesystem");
settings->drive_path =
guac_user_parse_args_string(user, GUAC_RDP_CLIENT_ARGS, argv,
@@ -990,6 +1002,7 @@
/* 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 5caffe9..d521a87 100644
--- a/src/protocols/rdp/rdp_settings.h
+++ b/src/protocols/rdp/rdp_settings.h
@@ -186,6 +186,11 @@
* 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