From a56a7207acfa54bea90404e34e890ed46262a972 Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Sat, 10 Jun 2017 14:14:42 -0700 Subject: [PATCH 01/12] GUACAMOLE-337: Remove unnecessary link to libguac-common for libguacd. --- src/libguacd/Makefile.am | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/libguacd/Makefile.am b/src/libguacd/Makefile.am index 23cab3b9..82c08882 100644 --- a/src/libguacd/Makefile.am +++ b/src/libguacd/Makefile.am @@ -31,11 +31,9 @@ libguacd_la_SOURCES = \ libguacd_la_CFLAGS = \ -Werror -Wall -pedantic \ - @COMMON_INCLUDE@ \ @LIBGUAC_INCLUDE@ libguacd_la_LIBADD = \ - @COMMON_LTLIB@ \ @LIBGUAC_LTLIB@ libguacd_la_LDFLAGS = \ From 69d8d87ec9a8525957df37ee264558b685ccabc2 Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Sat, 10 Jun 2017 14:14:57 -0700 Subject: [PATCH 02/12] GUACAMOLE-337: Remove unnecessary include of syslog.h by libguacd. --- src/libguacd/log.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/libguacd/log.c b/src/libguacd/log.c index e746373b..76d49749 100644 --- a/src/libguacd/log.c +++ b/src/libguacd/log.c @@ -25,7 +25,6 @@ #include #include -#include #include void guacd_client_log_guac_error(guac_client* client, From 7f3b985cc6597d60507a74e33efd197e1c27c283 Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Sat, 10 Jun 2017 19:11:52 -0700 Subject: [PATCH 03/12] GUACAMOLE-337: Install libguacd as a normal library. --- src/libguacd/Makefile.am | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/libguacd/Makefile.am b/src/libguacd/Makefile.am index 82c08882..a8d2a9f5 100644 --- a/src/libguacd/Makefile.am +++ b/src/libguacd/Makefile.am @@ -19,10 +19,12 @@ AUTOMAKE_OPTIONS = foreign -noinst_LTLIBRARIES = libguacd.la +lib_LTLIBRARIES = libguacd.la -noinst_HEADERS = \ - libguacd/log.h \ +libguacdincdir = $(includedir)/libguacd + +libguacdinc_HEADERS = \ + libguacd/log.h \ libguacd/user.h libguacd_la_SOURCES = \ @@ -42,7 +44,7 @@ libguacd_la_LDFLAGS = \ # SSL support if ENABLE_SSL -noinst_HEADERS += libguacd/socket-ssl.h +libguacdinc_HEADERS += libguacd/socket-ssl.h libguacd_la_SOURCES += socket-ssl.c endif From 6c484c1efdcf525e97d4b7167123cbbb4e7471f6 Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Sat, 10 Jun 2017 19:16:22 -0700 Subject: [PATCH 04/12] GUACAMOLE-337: Limit public libguacd API to simply user handshake handling and SSL/TLS sockets. --- src/libguacd/Makefile.am | 6 ++-- src/libguacd/libguacd/user.h | 48 ----------------------------- src/libguacd/log.c | 2 +- src/libguacd/{libguacd => }/log.h | 0 src/libguacd/user.c | 50 +++++++++++++++++++++++++++++-- 5 files changed, 52 insertions(+), 54 deletions(-) rename src/libguacd/{libguacd => }/log.h (100%) diff --git a/src/libguacd/Makefile.am b/src/libguacd/Makefile.am index a8d2a9f5..6018b97a 100644 --- a/src/libguacd/Makefile.am +++ b/src/libguacd/Makefile.am @@ -23,10 +23,12 @@ lib_LTLIBRARIES = libguacd.la libguacdincdir = $(includedir)/libguacd -libguacdinc_HEADERS = \ - libguacd/log.h \ +libguacdinc_HEADERS = \ libguacd/user.h +noinst_HEADERS = \ + log.h + libguacd_la_SOURCES = \ log.c \ user.c diff --git a/src/libguacd/libguacd/user.h b/src/libguacd/libguacd/user.h index cb2a8b3e..8c1db687 100644 --- a/src/libguacd/libguacd/user.h +++ b/src/libguacd/libguacd/user.h @@ -46,40 +46,6 @@ */ #define GUACD_CLIENT_MAX_CONNECTIONS 65536 -/** - * Parameters required by the user input thread. - */ -typedef struct guacd_user_input_thread_params { - - /** - * The parser which will be used throughout the user's session. - */ - guac_parser* parser; - - /** - * A reference to the connected user. - */ - guac_user* user; - -} guacd_user_input_thread_params; - -/** - * Starts the input/output threads of a new user. This function will block - * until the user disconnects. If an error prevents the input/output threads - * from starting, guac_user_stop() will be invoked on the given user. - * - * @param parser - * The guac_parser to use to handle all input from the given user. - * - * @param user - * The user whose associated I/O transfer threads should be started. - * - * @return - * Zero if the I/O threads started successfully and user has disconnected, - * or non-zero if the I/O threads could not be started. - */ -int guacd_user_start(guac_parser* parser, guac_user* user); - /** * Handles the initial handshake of a user and all subsequent I/O. This * function blocks until the user disconnects. @@ -95,19 +61,5 @@ int guacd_user_start(guac_parser* parser, guac_user* user); */ int guacd_handle_user(guac_user* user); -/** - * The thread which handles all user input, calling event handlers for received - * instructions. - * - * @param data - * A pointer to a guacd_user_input_thread_params structure describing the - * user whose input is being handled and the guac_parser with which to - * handle it. - * - * @return - * Always NULL. - */ -void* guacd_user_input_thread(void* data); - #endif diff --git a/src/libguacd/log.c b/src/libguacd/log.c index 76d49749..180cc977 100644 --- a/src/libguacd/log.c +++ b/src/libguacd/log.c @@ -18,7 +18,7 @@ */ #include "config.h" -#include "libguacd/log.h" +#include "log.h" #include #include diff --git a/src/libguacd/libguacd/log.h b/src/libguacd/log.h similarity index 100% rename from src/libguacd/libguacd/log.h rename to src/libguacd/log.h diff --git a/src/libguacd/user.c b/src/libguacd/user.c index db39fce7..a0c17595 100644 --- a/src/libguacd/user.c +++ b/src/libguacd/user.c @@ -19,8 +19,8 @@ #include "config.h" -#include "libguacd/log.h" #include "libguacd/user.h" +#include "log.h" #include #include @@ -33,6 +33,23 @@ #include #include +/** + * Parameters required by the user input thread. + */ +typedef struct guacd_user_input_thread_params { + + /** + * The parser which will be used throughout the user's session. + */ + guac_parser* parser; + + /** + * A reference to the connected user. + */ + guac_user* user; + +} guacd_user_input_thread_params; + /** * Copies the given array of mimetypes (strings) into a newly-allocated NULL- * terminated array of strings. Both the array and the strings within the array @@ -91,7 +108,19 @@ static void guacd_free_mimetypes(char** mimetypes) { } -void* guacd_user_input_thread(void* data) { +/** + * The thread which handles all user input, calling event handlers for received + * instructions. + * + * @param data + * A pointer to a guacd_user_input_thread_params structure describing the + * user whose input is being handled and the guac_parser with which to + * handle it. + * + * @return + * Always NULL. + */ +static void* guacd_user_input_thread(void* data) { guacd_user_input_thread_params* params = (guacd_user_input_thread_params*) data; guac_user* user = params->user; @@ -143,7 +172,22 @@ void* guacd_user_input_thread(void* data) { } -int guacd_user_start(guac_parser* parser, guac_user* user) { +/** + * Starts the input/output threads of a new user. This function will block + * until the user disconnects. If an error prevents the input/output threads + * from starting, guac_user_stop() will be invoked on the given user. + * + * @param parser + * The guac_parser to use to handle all input from the given user. + * + * @param user + * The user whose associated I/O transfer threads should be started. + * + * @return + * Zero if the I/O threads started successfully and user has disconnected, + * or non-zero if the I/O threads could not be started. + */ +static int guacd_user_start(guac_parser* parser, guac_user* user) { guacd_user_input_thread_params params = { .parser = parser, From 3a46fffe444a04af2f14c74f3cfe9b7195cb5696 Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Sat, 10 Jun 2017 19:17:57 -0700 Subject: [PATCH 05/12] GUACAMOLE-337: Do not include config.h in libguacd public headers. --- src/libguacd/libguacd/socket-ssl.h | 2 -- src/libguacd/libguacd/user.h | 2 -- 2 files changed, 4 deletions(-) diff --git a/src/libguacd/libguacd/socket-ssl.h b/src/libguacd/libguacd/socket-ssl.h index e1a341ee..715db5b9 100644 --- a/src/libguacd/libguacd/socket-ssl.h +++ b/src/libguacd/libguacd/socket-ssl.h @@ -21,8 +21,6 @@ #ifndef __GUACD_SOCKET_SSL_H #define __GUACD_SOCKET_SSL_H -#include "config.h" - #include #include diff --git a/src/libguacd/libguacd/user.h b/src/libguacd/libguacd/user.h index 8c1db687..805cef5a 100644 --- a/src/libguacd/libguacd/user.h +++ b/src/libguacd/libguacd/user.h @@ -21,8 +21,6 @@ #ifndef LIBGUACD_USER_H #define LIBGUACD_USER_H -#include "config.h" - #include #include #include From 78dbf64416d6a8fc44ccfceb4bf4f3ba62eea8c3 Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Sat, 10 Jun 2017 19:19:43 -0700 Subject: [PATCH 06/12] GUACAMOLE-337: Add missing libtool flags for libguacd. --- src/libguacd/Makefile.am | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/libguacd/Makefile.am b/src/libguacd/Makefile.am index 6018b97a..35eeaf91 100644 --- a/src/libguacd/Makefile.am +++ b/src/libguacd/Makefile.am @@ -40,8 +40,10 @@ libguacd_la_CFLAGS = \ libguacd_la_LIBADD = \ @LIBGUAC_LTLIB@ -libguacd_la_LDFLAGS = \ - @PTHREAD_LIBS@ \ +libguacd_la_LDFLAGS = \ + -version-info 0:0:0 \ + -no-undefined \ + @PTHREAD_LIBS@ \ @SSL_LIBS@ # SSL support From f311c23ffa4f8a015ddfe55866a27204d389075d Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Mon, 12 Jun 2017 14:06:47 -0700 Subject: [PATCH 07/12] GUACAMOLE-337: Move SSL socket into libguac. --- src/guacd/connection.c | 2 +- src/libguac/Makefile.am | 6 ++++++ .../libguacd => libguac/guacamole}/socket-ssl.h | 0 src/{libguacd => libguac}/socket-ssl.c | 8 ++++---- src/libguacd/Makefile.am | 9 +-------- 5 files changed, 12 insertions(+), 13 deletions(-) rename src/{libguacd/libguacd => libguac/guacamole}/socket-ssl.h (100%) rename src/{libguacd => libguac}/socket-ssl.c (97%) diff --git a/src/guacd/connection.c b/src/guacd/connection.c index 87efc5a7..6c517bfa 100644 --- a/src/guacd/connection.c +++ b/src/guacd/connection.c @@ -36,7 +36,7 @@ #ifdef ENABLE_SSL #include -#include "libguacd/socket-ssl.h" +#include #endif #include diff --git a/src/libguac/Makefile.am b/src/libguac/Makefile.am index 4590e9fc..0bfa4094 100644 --- a/src/libguac/Makefile.am +++ b/src/libguac/Makefile.am @@ -99,6 +99,11 @@ libguac_la_SOURCES += encode-webp.c noinst_HEADERS += encode-webp.h endif +# SSL support +if ENABLE_SSL +libguac_la_SOURCES += socket-ssl.c +libguacinc_HEADERS += guacamole/socket-ssl.h +endif libguac_la_CFLAGS = \ -Werror -Wall -pedantic -Iguacamole @@ -109,6 +114,7 @@ libguac_la_LDFLAGS = \ @JPEG_LIBS@ \ @PNG_LIBS@ \ @PTHREAD_LIBS@ \ + @SSL_LIBS@ \ @UUID_LIBS@ \ @VORBIS_LIBS@ \ @WEBP_LIBS@ diff --git a/src/libguacd/libguacd/socket-ssl.h b/src/libguac/guacamole/socket-ssl.h similarity index 100% rename from src/libguacd/libguacd/socket-ssl.h rename to src/libguac/guacamole/socket-ssl.h diff --git a/src/libguacd/socket-ssl.c b/src/libguac/socket-ssl.c similarity index 97% rename from src/libguacd/socket-ssl.c rename to src/libguac/socket-ssl.c index cfd2f667..f8f3f87b 100644 --- a/src/libguacd/socket-ssl.c +++ b/src/libguac/socket-ssl.c @@ -19,13 +19,13 @@ #include "config.h" -#include "libguacd/socket-ssl.h" +#include "error.h" +#include "socket-ssl.h" +#include "socket.h" #include #include -#include -#include #include static ssize_t __guac_socket_ssl_read_handler(guac_socket* socket, @@ -93,7 +93,7 @@ static int __guac_socket_ssl_select_handler(guac_socket* socket, int usec_timeou guac_error_message = "Error while waiting for data on secure socket"; } - if (retval == 0) { + else if (retval == 0) { guac_error = GUAC_STATUS_TIMEOUT; guac_error_message = "Timeout while waiting for data on secure socket"; } diff --git a/src/libguacd/Makefile.am b/src/libguacd/Makefile.am index 35eeaf91..c0373f1c 100644 --- a/src/libguacd/Makefile.am +++ b/src/libguacd/Makefile.am @@ -43,12 +43,5 @@ libguacd_la_LIBADD = \ libguacd_la_LDFLAGS = \ -version-info 0:0:0 \ -no-undefined \ - @PTHREAD_LIBS@ \ - @SSL_LIBS@ - -# SSL support -if ENABLE_SSL -libguacdinc_HEADERS += libguacd/socket-ssl.h -libguacd_la_SOURCES += socket-ssl.c -endif + @PTHREAD_LIBS@ From 06a5043442ee71a7e289169967aa6526bf202d70 Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Mon, 12 Jun 2017 14:36:20 -0700 Subject: [PATCH 08/12] GUACAMOLE-337: Include only *-types.h headers when only types are needed. --- src/libguac/guacamole/socket-ssl.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/libguac/guacamole/socket-ssl.h b/src/libguac/guacamole/socket-ssl.h index 715db5b9..c7a14df9 100644 --- a/src/libguac/guacamole/socket-ssl.h +++ b/src/libguac/guacamole/socket-ssl.h @@ -21,7 +21,8 @@ #ifndef __GUACD_SOCKET_SSL_H #define __GUACD_SOCKET_SSL_H -#include +#include "socket-types.h" + #include /** From 5b748a4b4267afe9d6ca38467abcc03a2df7acc9 Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Sat, 1 Jul 2017 15:24:20 -0700 Subject: [PATCH 09/12] GUACAMOLE-337: Separate definition of guacd read timeout from libguacd. --- src/guacd/proc-map.h | 6 ++++++ src/guacd/proc.c | 2 +- src/guacd/proc.h | 13 +++++++++++++ src/libguacd/libguacd/user.h | 25 +++++------------------- src/libguacd/user.c | 37 +++++++++++++++++++++++++----------- 5 files changed, 51 insertions(+), 32 deletions(-) diff --git a/src/guacd/proc-map.h b/src/guacd/proc-map.h index 73132441..5d8ce972 100644 --- a/src/guacd/proc-map.h +++ b/src/guacd/proc-map.h @@ -28,6 +28,12 @@ #include +/** + * The maximum number of concurrent connections to a single instance + * of guacd. + */ +#define GUACD_CLIENT_MAX_CONNECTIONS 65536 + /** * The number of hash buckets in each process map. */ diff --git a/src/guacd/proc.c b/src/guacd/proc.c index 74ba1465..e5e95866 100644 --- a/src/guacd/proc.c +++ b/src/guacd/proc.c @@ -92,7 +92,7 @@ static void* guacd_user_thread(void* data) { user->owner = params->owner; /* Handle user connection from handshake until disconnect/completion */ - guacd_handle_user(user); + guacd_handle_user(user, GUACD_USEC_TIMEOUT); /* Stop client and prevent future users if all users are disconnected */ if (client->connected_users == 0) { diff --git a/src/guacd/proc.h b/src/guacd/proc.h index 23eaa319..13bd9f81 100644 --- a/src/guacd/proc.h +++ b/src/guacd/proc.h @@ -27,6 +27,19 @@ #include +/** + * The number of milliseconds to wait for messages in any phase before + * timing out and closing the connection with an error. + */ +#define GUACD_TIMEOUT 15000 + +/** + * The number of microseconds to wait for messages in any phase before + * timing out and closing the conncetion with an error. This is always + * equal to GUACD_TIMEOUT * 1000. + */ +#define GUACD_USEC_TIMEOUT (GUACD_TIMEOUT*1000) + /** * Process information of the internal remote desktop client. */ diff --git a/src/libguacd/libguacd/user.h b/src/libguacd/libguacd/user.h index 805cef5a..4404a6cc 100644 --- a/src/libguacd/libguacd/user.h +++ b/src/libguacd/libguacd/user.h @@ -25,25 +25,6 @@ #include #include -/** - * The number of milliseconds to wait for messages in any phase before - * timing out and closing the connection with an error. - */ -#define GUACD_TIMEOUT 15000 - -/** - * The number of microseconds to wait for messages in any phase before - * timing out and closing the conncetion with an error. This is always - * equal to GUACD_TIMEOUT * 1000. - */ -#define GUACD_USEC_TIMEOUT (GUACD_TIMEOUT*1000) - -/** - * The maximum number of concurrent connections to a single instance - * of guacd. - */ -#define GUACD_CLIENT_MAX_CONNECTIONS 65536 - /** * Handles the initial handshake of a user and all subsequent I/O. This * function blocks until the user disconnects. @@ -52,12 +33,16 @@ * The user whose handshake and entire Guacamole protocol exchange should * be handled. * + * @param usec_timeout + * The number of microseconds to wait for instructions from the given + * user before closing the connection with an error. + * * @return * Zero if the user's Guacamole connection was successfully handled and * the user has disconnected, or non-zero if an error prevented the user's * connection from being handled properly. */ -int guacd_handle_user(guac_user* user); +int guacd_handle_user(guac_user* user, int usec_timeout); #endif diff --git a/src/libguacd/user.c b/src/libguacd/user.c index a0c17595..04f0f491 100644 --- a/src/libguacd/user.c +++ b/src/libguacd/user.c @@ -48,6 +48,12 @@ typedef struct guacd_user_input_thread_params { */ guac_user* user; + /** + * The number of microseconds to wait for instructions from a connected + * user before closing the connection with an error. + */ + int usec_timeout; + } guacd_user_input_thread_params; /** @@ -122,7 +128,10 @@ static void guacd_free_mimetypes(char** mimetypes) { */ static void* guacd_user_input_thread(void* data) { - guacd_user_input_thread_params* params = (guacd_user_input_thread_params*) data; + guacd_user_input_thread_params* params = + (guacd_user_input_thread_params*) data; + + int usec_timeout = params->usec_timeout; guac_user* user = params->user; guac_parser* parser = params->parser; guac_client* client = user->client; @@ -132,7 +141,7 @@ static void* guacd_user_input_thread(void* data) { while (client->state == GUAC_CLIENT_RUNNING && user->active) { /* Read instruction, stop on error */ - if (guac_parser_read(parser, socket, GUACD_USEC_TIMEOUT)) { + if (guac_parser_read(parser, socket, usec_timeout)) { if (guac_error == GUAC_STATUS_TIMEOUT) guac_user_abort(user, GUAC_PROTOCOL_STATUS_CLIENT_TIMEOUT, "User is not responding."); @@ -183,15 +192,21 @@ static void* guacd_user_input_thread(void* data) { * @param user * The user whose associated I/O transfer threads should be started. * + * @param usec_timeout + * The number of microseconds to wait for instructions from the given + * user before closing the connection with an error. + * * @return * Zero if the I/O threads started successfully and user has disconnected, * or non-zero if the I/O threads could not be started. */ -static int guacd_user_start(guac_parser* parser, guac_user* user) { +static int guacd_user_start(guac_parser* parser, guac_user* user, + int usec_timeout) { guacd_user_input_thread_params params = { .parser = parser, - .user = user + .user = user, + .usec_timeout = usec_timeout }; pthread_t input_thread; @@ -214,7 +229,7 @@ static int guacd_user_start(guac_parser* parser, guac_user* user) { } -int guacd_handle_user(guac_user* user) { +int guacd_handle_user(guac_user* user, int usec_timeout) { guac_socket* socket = user->socket; guac_client* client = user->client; @@ -234,7 +249,7 @@ int guacd_handle_user(guac_user* user) { guac_parser* parser = guac_parser_alloc(); /* Get optimal screen size */ - if (guac_parser_expect(parser, socket, GUACD_USEC_TIMEOUT, "size")) { + if (guac_parser_expect(parser, socket, usec_timeout, "size")) { /* Log error */ guacd_client_log_handshake_failure(client); @@ -266,7 +281,7 @@ int guacd_handle_user(guac_user* user) { user->info.optimal_resolution = 96; /* Get supported audio formats */ - if (guac_parser_expect(parser, socket, GUACD_USEC_TIMEOUT, "audio")) { + if (guac_parser_expect(parser, socket, usec_timeout, "audio")) { /* Log error */ guacd_client_log_handshake_failure(client); @@ -282,7 +297,7 @@ int guacd_handle_user(guac_user* user) { user->info.audio_mimetypes = (const char**) audio_mimetypes; /* Get supported video formats */ - if (guac_parser_expect(parser, socket, GUACD_USEC_TIMEOUT, "video")) { + if (guac_parser_expect(parser, socket, usec_timeout, "video")) { /* Log error */ guacd_client_log_handshake_failure(client); @@ -298,7 +313,7 @@ int guacd_handle_user(guac_user* user) { user->info.video_mimetypes = (const char**) video_mimetypes; /* Get supported image formats */ - if (guac_parser_expect(parser, socket, GUACD_USEC_TIMEOUT, "image")) { + if (guac_parser_expect(parser, socket, usec_timeout, "image")) { /* Log error */ guacd_client_log_handshake_failure(client); @@ -314,7 +329,7 @@ int guacd_handle_user(guac_user* user) { user->info.image_mimetypes = (const char**) image_mimetypes; /* Get args from connect instruction */ - if (guac_parser_expect(parser, socket, GUACD_USEC_TIMEOUT, "connect")) { + if (guac_parser_expect(parser, socket, usec_timeout, "connect")) { /* Log error */ guacd_client_log_handshake_failure(client); @@ -342,7 +357,7 @@ int guacd_handle_user(guac_user* user) { client->connection_id, client->connected_users); /* Handle user I/O, wait for connection to terminate */ - guacd_user_start(parser, user); + guacd_user_start(parser, user, usec_timeout); /* Remove/free user */ guac_client_remove_user(client, user); From f504b1a5e883ac99a6c3f4058a150fb8c2b59c52 Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Sat, 1 Jul 2017 15:51:15 -0700 Subject: [PATCH 10/12] GUACAMOLE-337: Move libguacd functionality into libguac. --- Makefile.am | 2 - configure.ac | 5 - src/guacd/Makefile.am | 2 - src/guacd/connection.c | 1 - src/guacd/daemon.c | 1 - src/guacd/proc-map.c | 1 - src/guacd/proc-map.h | 1 - src/guacd/proc.c | 3 +- src/libguac/Makefile.am | 3 +- src/libguac/guacamole/user.h | 24 +++ .../user.c => libguac/user-handshake.c} | 151 ++++++++++++------ src/libguacd/Makefile.am | 47 ------ src/libguacd/libguacd/user.h | 48 ------ src/libguacd/log.c | 71 -------- src/libguacd/log.h | 42 ----- 15 files changed, 131 insertions(+), 271 deletions(-) rename src/{libguacd/user.c => libguac/user-handshake.c} (69%) delete mode 100644 src/libguacd/Makefile.am delete mode 100644 src/libguacd/libguacd/user.h delete mode 100644 src/libguacd/log.c delete mode 100644 src/libguacd/log.h diff --git a/Makefile.am b/Makefile.am index d67db2a3..3ba1e34e 100644 --- a/Makefile.am +++ b/Makefile.am @@ -22,7 +22,6 @@ ACLOCAL_AMFLAGS = -I m4 # Subprojects DIST_SUBDIRS = \ src/libguac \ - src/libguacd \ src/common \ src/common-ssh \ src/terminal \ @@ -38,7 +37,6 @@ DIST_SUBDIRS = \ SUBDIRS = \ src/libguac \ src/common \ - src/libguacd \ tests if ENABLE_COMMON_SSH diff --git a/configure.ac b/configure.ac index b4cc2d37..08002509 100644 --- a/configure.ac +++ b/configure.ac @@ -123,10 +123,6 @@ AC_SUBST([COMMON_INCLUDE], '-I$(top_srcdir)/src/common') AC_SUBST([PULSE_LTLIB], '$(top_builddir)/src/pulse/libguac_pulse.la') AC_SUBST([PULSE_INCLUDE], '-I$(top_srcdir)/src/pulse') -# Common utility library for guacd implementations -AC_SUBST([LIBGUACD_LTLIB], '$(top_builddir)/src/libguacd/libguacd.la') -AC_SUBST([LIBGUACD_INCLUDE], '-I$(top_srcdir)/src/libguacd') - # Common base SSH client AC_SUBST([COMMON_SSH_LTLIB], '$(top_builddir)/src/common-ssh/libguac_common_ssh.la') AC_SUBST([COMMON_SSH_INCLUDE], '-I$(top_srcdir)/src/common-ssh') @@ -1172,7 +1168,6 @@ AC_CONFIG_FILES([Makefile src/common-ssh/Makefile src/terminal/Makefile src/libguac/Makefile - src/libguacd/Makefile src/guacd/Makefile src/guacenc/Makefile src/pulse/Makefile diff --git a/src/guacd/Makefile.am b/src/guacd/Makefile.am index b9433e8c..14ab5db6 100644 --- a/src/guacd/Makefile.am +++ b/src/guacd/Makefile.am @@ -49,12 +49,10 @@ guacd_SOURCES = \ guacd_CFLAGS = \ -Werror -Wall -pedantic \ @COMMON_INCLUDE@ \ - @LIBGUACD_INCLUDE@ \ @LIBGUAC_INCLUDE@ guacd_LDADD = \ @COMMON_LTLIB@ \ - @LIBGUACD_LTLIB@ \ @LIBGUAC_LTLIB@ guacd_LDFLAGS = \ diff --git a/src/guacd/connection.c b/src/guacd/connection.c index 6c517bfa..ef767acb 100644 --- a/src/guacd/connection.c +++ b/src/guacd/connection.c @@ -22,7 +22,6 @@ #include "connection.h" #include "log.h" #include "move-fd.h" -#include "libguacd/user.h" #include "proc.h" #include "proc-map.h" diff --git a/src/guacd/daemon.c b/src/guacd/daemon.c index 3adf4332..2e80ef38 100644 --- a/src/guacd/daemon.c +++ b/src/guacd/daemon.c @@ -22,7 +22,6 @@ #include "connection.h" #include "conf-args.h" #include "conf-file.h" -#include "libguacd/user.h" #include "log.h" #include "proc-map.h" diff --git a/src/guacd/proc-map.c b/src/guacd/proc-map.c index bbe50b3a..ac87196a 100644 --- a/src/guacd/proc-map.c +++ b/src/guacd/proc-map.c @@ -19,7 +19,6 @@ #include "config.h" #include "common/list.h" -#include "libguacd/user.h" #include "proc.h" #include "proc-map.h" diff --git a/src/guacd/proc-map.h b/src/guacd/proc-map.h index 5d8ce972..a2421885 100644 --- a/src/guacd/proc-map.h +++ b/src/guacd/proc-map.h @@ -23,7 +23,6 @@ #include "config.h" #include "common/list.h" -#include "libguacd/user.h" #include "proc.h" #include diff --git a/src/guacd/proc.c b/src/guacd/proc.c index e5e95866..0a359103 100644 --- a/src/guacd/proc.c +++ b/src/guacd/proc.c @@ -19,7 +19,6 @@ #include "config.h" -#include "libguacd/user.h" #include "log.h" #include "move-fd.h" #include "proc.h" @@ -92,7 +91,7 @@ static void* guacd_user_thread(void* data) { user->owner = params->owner; /* Handle user connection from handshake until disconnect/completion */ - guacd_handle_user(user, GUACD_USEC_TIMEOUT); + guac_user_handle_connection(user, GUACD_USEC_TIMEOUT); /* Stop client and prevent future users if all users are disconnected */ if (client->connected_users == 0) { diff --git a/src/libguac/Makefile.am b/src/libguac/Makefile.am index 0bfa4094..a1f47edc 100644 --- a/src/libguac/Makefile.am +++ b/src/libguac/Makefile.am @@ -91,7 +91,8 @@ libguac_la_SOURCES = \ timestamp.c \ unicode.c \ user.c \ - user-handlers.c + user-handlers.c \ + user-handshake.c # Compile WebP support if available if ENABLE_WEBP diff --git a/src/libguac/guacamole/user.h b/src/libguac/guacamole/user.h index c791c2d4..b445f625 100644 --- a/src/libguac/guacamole/user.h +++ b/src/libguac/guacamole/user.h @@ -492,6 +492,30 @@ guac_user* guac_user_alloc(); */ void guac_user_free(guac_user* user); +/** + * Handles the portion of a user's Guacamole protocol handshake following the + * "select" instruction all subsequent I/O, automatically populating the + * handshake-related properties of the given guac_user and invoking + * guac_user_handle_instruction() for received instructions after the handshake + * has completed. This function blocks until the connection/user is aborted or + * the user disconnects. + * + * @param user + * The user whose handshake and entire Guacamole protocol exchange should + * be handled. The user must already be associated with a guac_socket and + * guac_client, and the guac_client must already be fully initialized. + * + * @param usec_timeout + * The number of microseconds to wait for instructions from the given + * user before closing the connection with an error. + * + * @return + * Zero if the user's Guacamole connection was successfully handled and + * the user has disconnected, or non-zero if an error prevented the user's + * connection from being handled properly. + */ +int guac_user_handle_connection(guac_user* user, int usec_timeout); + /** * Call the appropriate handler defined by the given user for the given * instruction. A comparison is made between the instruction opcode and the diff --git a/src/libguacd/user.c b/src/libguac/user-handshake.c similarity index 69% rename from src/libguacd/user.c rename to src/libguac/user-handshake.c index 04f0f491..b6018888 100644 --- a/src/libguacd/user.c +++ b/src/libguac/user-handshake.c @@ -19,15 +19,12 @@ #include "config.h" -#include "libguacd/user.h" -#include "log.h" - -#include -#include -#include -#include -#include -#include +#include "client.h" +#include "error.h" +#include "parser.h" +#include "protocol.h" +#include "socket.h" +#include "user.h" #include #include @@ -36,7 +33,7 @@ /** * Parameters required by the user input thread. */ -typedef struct guacd_user_input_thread_params { +typedef struct guac_user_input_thread_params { /** * The parser which will be used throughout the user's session. @@ -54,12 +51,72 @@ typedef struct guacd_user_input_thread_params { */ int usec_timeout; -} guacd_user_input_thread_params; +} guac_user_input_thread_params; + +/** + * Prints an error message using the logging facilities of the given user, + * automatically including any information present in guac_error. + * + * @param user + * The guac_user associated with the error that occurred. + * + * @param level + * The level at which to log this message. + * + * @param message + * The message to log. + */ +static void guac_user_log_guac_error(guac_user* user, + guac_client_log_level level, const char* message) { + + if (guac_error != GUAC_STATUS_SUCCESS) { + + /* If error message provided, include in log */ + if (guac_error_message != NULL) + guac_user_log(user, level, "%s: %s", message, + guac_error_message); + + /* Otherwise just log with standard status string */ + else + guac_user_log(user, level, "%s: %s", message, + guac_status_string(guac_error)); + + } + + /* Just log message if no status code */ + else + guac_user_log(user, level, "%s", message); + +} + +/** + * Logs a reasonable explanatory message regarding handshake failure based on + * the current value of guac_error. + * + * @param user + * The guac_user associated with the failed Guacamole protocol handshake. + */ +static void guac_user_log_handshake_failure(guac_user* user) { + + if (guac_error == GUAC_STATUS_CLOSED) + guac_user_log(user, GUAC_LOG_INFO, + "Guacamole connection closed during handshake"); + else if (guac_error == GUAC_STATUS_PROTOCOL_ERROR) + guac_user_log(user, GUAC_LOG_ERROR, + "Guacamole protocol violation. Perhaps the version of " + "guacamole-client is incompatible with this version of " + "libguac?"); + else + guac_user_log(user, GUAC_LOG_WARNING, + "Guacamole handshake failed: %s", + guac_status_string(guac_error)); + +} /** * Copies the given array of mimetypes (strings) into a newly-allocated NULL- * terminated array of strings. Both the array and the strings within the array - * are newly-allocated and must be later freed via guacd_free_mimetypes(). + * are newly-allocated and must be later freed via guac_free_mimetypes(). * * @param mimetypes * The array of mimetypes to copy. @@ -72,7 +129,7 @@ typedef struct guacd_user_input_thread_params { * copies of each of the mimetypes provided in the original mimetypes * array. */ -static char** guacd_copy_mimetypes(char** mimetypes, int count) { +static char** guac_copy_mimetypes(char** mimetypes, int count) { int i; @@ -93,13 +150,13 @@ static char** guacd_copy_mimetypes(char** mimetypes, int count) { /** * Frees the given array of mimetypes, including the space allocated to each * mimetype string within the array. The provided array of mimetypes MUST have - * been allocated with guacd_copy_mimetypes(). + * been allocated with guac_copy_mimetypes(). * * @param mimetypes * The NULL-terminated array of mimetypes to free. This array MUST have - * been previously allocated with guacd_copy_mimetypes(). + * been previously allocated with guac_copy_mimetypes(). */ -static void guacd_free_mimetypes(char** mimetypes) { +static void guac_free_mimetypes(char** mimetypes) { char** current_mimetype = mimetypes; @@ -119,17 +176,17 @@ static void guacd_free_mimetypes(char** mimetypes) { * instructions. * * @param data - * A pointer to a guacd_user_input_thread_params structure describing the + * A pointer to a guac_user_input_thread_params structure describing the * user whose input is being handled and the guac_parser with which to * handle it. * * @return * Always NULL. */ -static void* guacd_user_input_thread(void* data) { +static void* guac_user_input_thread(void* data) { - guacd_user_input_thread_params* params = - (guacd_user_input_thread_params*) data; + guac_user_input_thread_params* params = + (guac_user_input_thread_params*) data; int usec_timeout = params->usec_timeout; guac_user* user = params->user; @@ -148,7 +205,7 @@ static void* guacd_user_input_thread(void* data) { else { if (guac_error != GUAC_STATUS_CLOSED) - guacd_client_log_guac_error(client, GUAC_LOG_WARNING, + guac_user_log_guac_error(user, GUAC_LOG_WARNING, "Guacamole connection failure"); guac_user_stop(user); } @@ -165,7 +222,7 @@ static void* guacd_user_input_thread(void* data) { if (guac_user_handle_instruction(user, parser->opcode, parser->argc, parser->argv) < 0) { /* Log error */ - guacd_client_log_guac_error(client, GUAC_LOG_WARNING, + guac_user_log_guac_error(user, GUAC_LOG_WARNING, "User connection aborted"); /* Log handler details */ @@ -200,10 +257,10 @@ static void* guacd_user_input_thread(void* data) { * Zero if the I/O threads started successfully and user has disconnected, * or non-zero if the I/O threads could not be started. */ -static int guacd_user_start(guac_parser* parser, guac_user* user, +static int guac_user_start(guac_parser* parser, guac_user* user, int usec_timeout) { - guacd_user_input_thread_params params = { + guac_user_input_thread_params params = { .parser = parser, .user = user, .usec_timeout = usec_timeout @@ -211,7 +268,7 @@ static int guacd_user_start(guac_parser* parser, guac_user* user, pthread_t input_thread; - if (pthread_create(&input_thread, NULL, guacd_user_input_thread, (void*) ¶ms)) { + if (pthread_create(&input_thread, NULL, guac_user_input_thread, (void*) ¶ms)) { guac_user_log(user, GUAC_LOG_ERROR, "Unable to start input thread"); guac_user_stop(user); return -1; @@ -229,7 +286,7 @@ static int guacd_user_start(guac_parser* parser, guac_user* user, } -int guacd_handle_user(guac_user* user, int usec_timeout) { +int guac_user_handle_connection(guac_user* user, int usec_timeout) { guac_socket* socket = user->socket; guac_client* client = user->client; @@ -239,8 +296,8 @@ int guacd_handle_user(guac_user* user, int usec_timeout) { || guac_socket_flush(socket)) { /* Log error */ - guacd_client_log_handshake_failure(client); - guacd_client_log_guac_error(client, GUAC_LOG_DEBUG, + guac_user_log_handshake_failure(user); + guac_user_log_guac_error(user, GUAC_LOG_DEBUG, "Error sending \"args\" to new user"); return 1; @@ -252,8 +309,8 @@ int guacd_handle_user(guac_user* user, int usec_timeout) { if (guac_parser_expect(parser, socket, usec_timeout, "size")) { /* Log error */ - guacd_client_log_handshake_failure(client); - guacd_client_log_guac_error(client, GUAC_LOG_DEBUG, + guac_user_log_handshake_failure(user); + guac_user_log_guac_error(user, GUAC_LOG_DEBUG, "Error reading \"size\""); guac_parser_free(parser); @@ -262,7 +319,7 @@ int guacd_handle_user(guac_user* user, int usec_timeout) { /* Validate content of size instruction */ if (parser->argc < 2) { - guac_client_log(client, GUAC_LOG_ERROR, "Received \"size\" " + guac_user_log(user, GUAC_LOG_ERROR, "Received \"size\" " "instruction lacked required arguments."); guac_parser_free(parser); return 1; @@ -272,7 +329,7 @@ int guacd_handle_user(guac_user* user, int usec_timeout) { user->info.optimal_width = atoi(parser->argv[0]); user->info.optimal_height = atoi(parser->argv[1]); - /* If DPI given, set the client resolution */ + /* If DPI given, set the user resolution */ if (parser->argc >= 3) user->info.optimal_resolution = atoi(parser->argv[2]); @@ -284,8 +341,8 @@ int guacd_handle_user(guac_user* user, int usec_timeout) { if (guac_parser_expect(parser, socket, usec_timeout, "audio")) { /* Log error */ - guacd_client_log_handshake_failure(client); - guacd_client_log_guac_error(client, GUAC_LOG_DEBUG, + guac_user_log_handshake_failure(user); + guac_user_log_guac_error(user, GUAC_LOG_DEBUG, "Error reading \"audio\""); guac_parser_free(parser); @@ -293,15 +350,15 @@ int guacd_handle_user(guac_user* user, int usec_timeout) { } /* Store audio mimetypes */ - char** audio_mimetypes = guacd_copy_mimetypes(parser->argv, parser->argc); + char** audio_mimetypes = guac_copy_mimetypes(parser->argv, parser->argc); user->info.audio_mimetypes = (const char**) audio_mimetypes; /* Get supported video formats */ if (guac_parser_expect(parser, socket, usec_timeout, "video")) { /* Log error */ - guacd_client_log_handshake_failure(client); - guacd_client_log_guac_error(client, GUAC_LOG_DEBUG, + guac_user_log_handshake_failure(user); + guac_user_log_guac_error(user, GUAC_LOG_DEBUG, "Error reading \"video\""); guac_parser_free(parser); @@ -309,15 +366,15 @@ int guacd_handle_user(guac_user* user, int usec_timeout) { } /* Store video mimetypes */ - char** video_mimetypes = guacd_copy_mimetypes(parser->argv, parser->argc); + char** video_mimetypes = guac_copy_mimetypes(parser->argv, parser->argc); user->info.video_mimetypes = (const char**) video_mimetypes; /* Get supported image formats */ if (guac_parser_expect(parser, socket, usec_timeout, "image")) { /* Log error */ - guacd_client_log_handshake_failure(client); - guacd_client_log_guac_error(client, GUAC_LOG_DEBUG, + guac_user_log_handshake_failure(user); + guac_user_log_guac_error(user, GUAC_LOG_DEBUG, "Error reading \"image\""); guac_parser_free(parser); @@ -325,15 +382,15 @@ int guacd_handle_user(guac_user* user, int usec_timeout) { } /* Store image mimetypes */ - char** image_mimetypes = guacd_copy_mimetypes(parser->argv, parser->argc); + char** image_mimetypes = guac_copy_mimetypes(parser->argv, parser->argc); user->info.image_mimetypes = (const char**) image_mimetypes; /* Get args from connect instruction */ if (guac_parser_expect(parser, socket, usec_timeout, "connect")) { /* Log error */ - guacd_client_log_handshake_failure(client); - guacd_client_log_guac_error(client, GUAC_LOG_DEBUG, + guac_user_log_handshake_failure(user); + guac_user_log_guac_error(user, GUAC_LOG_DEBUG, "Error reading \"connect\""); guac_parser_free(parser); @@ -357,7 +414,7 @@ int guacd_handle_user(guac_user* user, int usec_timeout) { client->connection_id, client->connected_users); /* Handle user I/O, wait for connection to terminate */ - guacd_user_start(parser, user, usec_timeout); + guac_user_start(parser, user, usec_timeout); /* Remove/free user */ guac_client_remove_user(client, user); @@ -367,9 +424,9 @@ int guacd_handle_user(guac_user* user, int usec_timeout) { } /* Free mimetype lists */ - guacd_free_mimetypes(audio_mimetypes); - guacd_free_mimetypes(video_mimetypes); - guacd_free_mimetypes(image_mimetypes); + guac_free_mimetypes(audio_mimetypes); + guac_free_mimetypes(video_mimetypes); + guac_free_mimetypes(image_mimetypes); guac_parser_free(parser); diff --git a/src/libguacd/Makefile.am b/src/libguacd/Makefile.am deleted file mode 100644 index c0373f1c..00000000 --- a/src/libguacd/Makefile.am +++ /dev/null @@ -1,47 +0,0 @@ -# -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -# - -AUTOMAKE_OPTIONS = foreign - -lib_LTLIBRARIES = libguacd.la - -libguacdincdir = $(includedir)/libguacd - -libguacdinc_HEADERS = \ - libguacd/user.h - -noinst_HEADERS = \ - log.h - -libguacd_la_SOURCES = \ - log.c \ - user.c - -libguacd_la_CFLAGS = \ - -Werror -Wall -pedantic \ - @LIBGUAC_INCLUDE@ - -libguacd_la_LIBADD = \ - @LIBGUAC_LTLIB@ - -libguacd_la_LDFLAGS = \ - -version-info 0:0:0 \ - -no-undefined \ - @PTHREAD_LIBS@ - diff --git a/src/libguacd/libguacd/user.h b/src/libguacd/libguacd/user.h deleted file mode 100644 index 4404a6cc..00000000 --- a/src/libguacd/libguacd/user.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - - -#ifndef LIBGUACD_USER_H -#define LIBGUACD_USER_H - -#include -#include -#include - -/** - * Handles the initial handshake of a user and all subsequent I/O. This - * function blocks until the user disconnects. - * - * @param user - * The user whose handshake and entire Guacamole protocol exchange should - * be handled. - * - * @param usec_timeout - * The number of microseconds to wait for instructions from the given - * user before closing the connection with an error. - * - * @return - * Zero if the user's Guacamole connection was successfully handled and - * the user has disconnected, or non-zero if an error prevented the user's - * connection from being handled properly. - */ -int guacd_handle_user(guac_user* user, int usec_timeout); - -#endif - diff --git a/src/libguacd/log.c b/src/libguacd/log.c deleted file mode 100644 index 180cc977..00000000 --- a/src/libguacd/log.c +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -#include "config.h" -#include "log.h" - -#include -#include - -#include -#include -#include - -void guacd_client_log_guac_error(guac_client* client, - guac_client_log_level level, const char* message) { - - if (guac_error != GUAC_STATUS_SUCCESS) { - - /* If error message provided, include in log */ - if (guac_error_message != NULL) - guac_client_log(client, level, "%s: %s", - message, - guac_error_message); - - /* Otherwise just log with standard status string */ - else - guac_client_log(client, level, "%s: %s", - message, - guac_status_string(guac_error)); - - } - - /* Just log message if no status code */ - else - guac_client_log(client, level, "%s", message); - -} - -void guacd_client_log_handshake_failure(guac_client* client) { - - if (guac_error == GUAC_STATUS_CLOSED) - guac_client_log(client, GUAC_LOG_INFO, - "Guacamole connection closed during handshake"); - else if (guac_error == GUAC_STATUS_PROTOCOL_ERROR) - guac_client_log(client, GUAC_LOG_ERROR, - "Guacamole protocol violation. Perhaps the version of " - "guacamole-client is incompatible with this version of " - "guacd?"); - else - guac_client_log(client, GUAC_LOG_WARNING, - "Guacamole handshake failed: %s", - guac_status_string(guac_error)); - -} - diff --git a/src/libguacd/log.h b/src/libguacd/log.h deleted file mode 100644 index 76509e32..00000000 --- a/src/libguacd/log.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -#ifndef LIBGUACD_LOG_H -#define LIBGUACD_LOG_H - -#include "config.h" - -#include - -/** - * Prints an error message using the logging facilities of the given client, - * automatically including any information present in guac_error. This function - * accepts parameters identically to printf. - */ -void guacd_client_log_guac_error(guac_client* client, - guac_client_log_level level, const char* message); - -/** - * Logs a reasonable explanatory message regarding handshake failure based on - * the current value of guac_error. - */ -void guacd_client_log_handshake_failure(guac_client* client); - -#endif - From 60141175ddb2a7ced91a154232eca314efdf8a2d Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Sat, 1 Jul 2017 18:55:20 -0700 Subject: [PATCH 11/12] GUACAMOLE-337: Document that socket-ssl.h is not guaranteed to be present. --- src/libguac/guacamole/socket-ssl.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/libguac/guacamole/socket-ssl.h b/src/libguac/guacamole/socket-ssl.h index c7a14df9..7c726956 100644 --- a/src/libguac/guacamole/socket-ssl.h +++ b/src/libguac/guacamole/socket-ssl.h @@ -21,6 +21,13 @@ #ifndef __GUACD_SOCKET_SSL_H #define __GUACD_SOCKET_SSL_H +/** + * Provides an SSL/TLS implementation of guac_socket. This header will only be + * available if libguac was built with SSL support. + * + * @file socket-ssl.h + */ + #include "socket-types.h" #include From b608d2266b35e20dc603dd2abbb7d676fcf50305 Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Wed, 5 Jul 2017 19:54:06 -0700 Subject: [PATCH 12/12] GUACAMOLE-337: Clarify behavior of guac_user_handle_connection(). --- src/libguac/guacamole/user.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/libguac/guacamole/user.h b/src/libguac/guacamole/user.h index b445f625..f89f8077 100644 --- a/src/libguac/guacamole/user.h +++ b/src/libguac/guacamole/user.h @@ -493,12 +493,12 @@ guac_user* guac_user_alloc(); void guac_user_free(guac_user* user); /** - * Handles the portion of a user's Guacamole protocol handshake following the - * "select" instruction all subsequent I/O, automatically populating the - * handshake-related properties of the given guac_user and invoking - * guac_user_handle_instruction() for received instructions after the handshake - * has completed. This function blocks until the connection/user is aborted or - * the user disconnects. + * Handles all I/O for the portion of a user's Guacamole connection following + * the initial "select" instruction, including the rest of the handshake. The + * handshake-related properties of the given guac_user are automatically + * populated, and guac_user_handle_instruction() is invoked for all + * instructions received after the handshake has completed. This function + * blocks until the connection/user is aborted or the user disconnects. * * @param user * The user whose handshake and entire Guacamole protocol exchange should