GUAC-744: Generate and store connection ID within guac_client.
This commit is contained in:
parent
8cc6c987a9
commit
a44539b108
@ -62,6 +62,10 @@ AC_CHECK_LIB([pthread], [pthread_create], [PTHREAD_LIBS=-lpthread
|
||||
AC_DEFINE([HAVE_LIBPTHREAD],,
|
||||
[Whether libpthread was found])])
|
||||
|
||||
# libossp-uuid
|
||||
AC_CHECK_LIB([ossp-uuid], [uuid_create], [UUID_LIBS=-lossp-uuid],
|
||||
AC_MSG_ERROR("The OSSP UUID library is required"))
|
||||
|
||||
# cunit
|
||||
AC_CHECK_LIB([cunit], [CU_run_test], [CUNIT_LIBS=-lcunit])
|
||||
|
||||
@ -73,6 +77,7 @@ AC_SUBST(MATH_LIBS)
|
||||
AC_SUBST(PNG_LIBS)
|
||||
AC_SUBST(CAIRO_LIBS)
|
||||
AC_SUBST(PTHREAD_LIBS)
|
||||
AC_SUBST(UUID_LIBS)
|
||||
AC_SUBST(CUNIT_LIBS)
|
||||
|
||||
# Library functions
|
||||
|
@ -182,6 +182,12 @@ void guacd_handle_connection(guac_socket* socket) {
|
||||
|
||||
/* Get client */
|
||||
client = guac_client_alloc();
|
||||
if (client == NULL) {
|
||||
guacd_log_guac_error("Client could not be allocated");
|
||||
guac_socket_free(socket);
|
||||
return;
|
||||
}
|
||||
|
||||
client->socket = socket;
|
||||
client->log_info_handler = guacd_client_log_info;
|
||||
client->log_error_handler = guacd_client_log_error;
|
||||
@ -230,6 +236,8 @@ void guacd_handle_connection(guac_socket* socket) {
|
||||
return;
|
||||
}
|
||||
|
||||
guacd_log_info("Connection ID is \"%s\"", client->connection_id);
|
||||
|
||||
/* Start client threads */
|
||||
guacd_log_info("Starting client");
|
||||
if (guacd_client_start(client))
|
||||
|
@ -88,6 +88,6 @@ noinst_HEADERS += ogg_encoder.h
|
||||
endif
|
||||
|
||||
lib_LTLIBRARIES = libguac.la
|
||||
libguac_la_LDFLAGS = -version-info 7:0:0 @PTHREAD_LIBS@ @CAIRO_LIBS@ @PNG_LIBS@ @VORBIS_LIBS@
|
||||
libguac_la_LIBADD = @LIBADD_DLOPEN@
|
||||
libguac_la_LDFLAGS = -version-info 7:0:0 @PTHREAD_LIBS@ @CAIRO_LIBS@ @PNG_LIBS@ @VORBIS_LIBS@ @UUID_LIBS@
|
||||
libguac_la_LIBADD = @LIBADD_DLOPEN@
|
||||
|
||||
|
@ -33,6 +33,8 @@
|
||||
#include "stream.h"
|
||||
#include "timestamp.h"
|
||||
|
||||
#include <ossp/uuid.h>
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
@ -115,6 +117,64 @@ void guac_client_free_stream(guac_client* client, guac_stream* stream) {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a newly allocated string containing a guaranteed-unique connection
|
||||
* identifier string which is 37 characters long and begins with a '$'
|
||||
* character. If an error occurs, NULL is returned, and no memory is
|
||||
* allocated.
|
||||
*/
|
||||
static char* __guac_generate_connection_id() {
|
||||
|
||||
char* buffer;
|
||||
char* identifier;
|
||||
size_t identifier_length;
|
||||
|
||||
uuid_t* uuid;
|
||||
|
||||
/* Attempt to create UUID object */
|
||||
if (uuid_create(&uuid) != UUID_RC_OK) {
|
||||
guac_error = GUAC_STATUS_NO_MEMORY;
|
||||
guac_error_message = "Could not allocate memory for UUID";
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Generate random UUID */
|
||||
if (uuid_make(uuid, UUID_MAKE_V4) != UUID_RC_OK) {
|
||||
uuid_destroy(uuid);
|
||||
guac_error = GUAC_STATUS_NO_MEMORY;
|
||||
guac_error_message = "UUID generation failed";
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Allocate buffer for future formatted ID */
|
||||
buffer = malloc(UUID_LEN_STR + 2);
|
||||
if (buffer == NULL) {
|
||||
uuid_destroy(uuid);
|
||||
guac_error = GUAC_STATUS_NO_MEMORY;
|
||||
guac_error_message = "Could not allocate memory for connection ID";
|
||||
return NULL;
|
||||
}
|
||||
|
||||
identifier = &(buffer[1]);
|
||||
identifier_length = UUID_LEN_STR + 1;
|
||||
|
||||
/* Build connection ID from UUID */
|
||||
if (uuid_export(uuid, UUID_FMT_STR, &identifier, &identifier_length) != UUID_RC_OK) {
|
||||
free(buffer);
|
||||
uuid_destroy(uuid);
|
||||
guac_error = GUAC_STATUS_BAD_STATE;
|
||||
guac_error_message = "Conversion of UUID to connection ID failed";
|
||||
return NULL;
|
||||
}
|
||||
|
||||
uuid_destroy(uuid);
|
||||
|
||||
buffer[0] = '$';
|
||||
buffer[UUID_LEN_STR + 1] = '\0';
|
||||
return buffer;
|
||||
|
||||
}
|
||||
|
||||
guac_client* guac_client_alloc() {
|
||||
|
||||
int i;
|
||||
@ -135,6 +195,13 @@ guac_client* guac_client_alloc() {
|
||||
|
||||
client->state = GUAC_CLIENT_RUNNING;
|
||||
|
||||
/* Generate ID */
|
||||
client->connection_id = __guac_generate_connection_id();
|
||||
if (client->connection_id == NULL) {
|
||||
free(client);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Allocate buffer and layer pools */
|
||||
client->__buffer_pool = guac_pool_alloc(GUAC_BUFFER_POOL_INITIAL_SIZE);
|
||||
client->__layer_pool = guac_pool_alloc(GUAC_BUFFER_POOL_INITIAL_SIZE);
|
||||
|
@ -419,6 +419,15 @@ struct guac_client {
|
||||
*/
|
||||
guac_stream* __input_streams;
|
||||
|
||||
/**
|
||||
* The unique identifier allocated for the connection, which may
|
||||
* be used within the Guacamole protocol to refer to this connection.
|
||||
* This identifier is guaranteed to be unique from all existing
|
||||
* connections and will not collide with any available protocol
|
||||
* names.
|
||||
*/
|
||||
char* connection_id;
|
||||
|
||||
};
|
||||
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user