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],,
|
AC_DEFINE([HAVE_LIBPTHREAD],,
|
||||||
[Whether libpthread was found])])
|
[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
|
# cunit
|
||||||
AC_CHECK_LIB([cunit], [CU_run_test], [CUNIT_LIBS=-lcunit])
|
AC_CHECK_LIB([cunit], [CU_run_test], [CUNIT_LIBS=-lcunit])
|
||||||
|
|
||||||
@ -73,6 +77,7 @@ AC_SUBST(MATH_LIBS)
|
|||||||
AC_SUBST(PNG_LIBS)
|
AC_SUBST(PNG_LIBS)
|
||||||
AC_SUBST(CAIRO_LIBS)
|
AC_SUBST(CAIRO_LIBS)
|
||||||
AC_SUBST(PTHREAD_LIBS)
|
AC_SUBST(PTHREAD_LIBS)
|
||||||
|
AC_SUBST(UUID_LIBS)
|
||||||
AC_SUBST(CUNIT_LIBS)
|
AC_SUBST(CUNIT_LIBS)
|
||||||
|
|
||||||
# Library functions
|
# Library functions
|
||||||
|
@ -182,6 +182,12 @@ void guacd_handle_connection(guac_socket* socket) {
|
|||||||
|
|
||||||
/* Get client */
|
/* Get client */
|
||||||
client = guac_client_alloc();
|
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->socket = socket;
|
||||||
client->log_info_handler = guacd_client_log_info;
|
client->log_info_handler = guacd_client_log_info;
|
||||||
client->log_error_handler = guacd_client_log_error;
|
client->log_error_handler = guacd_client_log_error;
|
||||||
@ -230,6 +236,8 @@ void guacd_handle_connection(guac_socket* socket) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
guacd_log_info("Connection ID is \"%s\"", client->connection_id);
|
||||||
|
|
||||||
/* Start client threads */
|
/* Start client threads */
|
||||||
guacd_log_info("Starting client");
|
guacd_log_info("Starting client");
|
||||||
if (guacd_client_start(client))
|
if (guacd_client_start(client))
|
||||||
|
@ -88,6 +88,6 @@ noinst_HEADERS += ogg_encoder.h
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
lib_LTLIBRARIES = libguac.la
|
lib_LTLIBRARIES = libguac.la
|
||||||
libguac_la_LDFLAGS = -version-info 7:0:0 @PTHREAD_LIBS@ @CAIRO_LIBS@ @PNG_LIBS@ @VORBIS_LIBS@
|
libguac_la_LDFLAGS = -version-info 7:0:0 @PTHREAD_LIBS@ @CAIRO_LIBS@ @PNG_LIBS@ @VORBIS_LIBS@ @UUID_LIBS@
|
||||||
libguac_la_LIBADD = @LIBADD_DLOPEN@
|
libguac_la_LIBADD = @LIBADD_DLOPEN@
|
||||||
|
|
||||||
|
@ -33,6 +33,8 @@
|
|||||||
#include "stream.h"
|
#include "stream.h"
|
||||||
#include "timestamp.h"
|
#include "timestamp.h"
|
||||||
|
|
||||||
|
#include <ossp/uuid.h>
|
||||||
|
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.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() {
|
guac_client* guac_client_alloc() {
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
@ -135,6 +195,13 @@ guac_client* guac_client_alloc() {
|
|||||||
|
|
||||||
client->state = GUAC_CLIENT_RUNNING;
|
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 */
|
/* Allocate buffer and layer pools */
|
||||||
client->__buffer_pool = guac_pool_alloc(GUAC_BUFFER_POOL_INITIAL_SIZE);
|
client->__buffer_pool = guac_pool_alloc(GUAC_BUFFER_POOL_INITIAL_SIZE);
|
||||||
client->__layer_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;
|
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