[Libdexter-commits] SF.net SVN: libdexter: [370] libdexter/trunk/dexter
Brought to you by:
pkovacs
|
From: <pk...@us...> - 2007-06-09 22:29:30
|
Revision: 370
http://svn.sourceforge.net/libdexter/?rev=370&view=rev
Author: pkovacs
Date: 2007-06-09 15:29:28 -0700 (Sat, 09 Jun 2007)
Log Message:
-----------
Committing intermediate work on TLS.
Modified Paths:
--------------
libdexter/trunk/dexter/dexter-channel.c
libdexter/trunk/dexter/dexter-network.c
libdexter/trunk/dexter/dexter-server-internal.h
libdexter/trunk/dexter/dexter-server.c
libdexter/trunk/dexter/dexter-servercomm.c
libdexter/trunk/dexter/dexter-servercomm.h
Modified: libdexter/trunk/dexter/dexter-channel.c
===================================================================
--- libdexter/trunk/dexter/dexter-channel.c 2007-06-09 07:17:19 UTC (rev 369)
+++ libdexter/trunk/dexter/dexter-channel.c 2007-06-09 22:29:28 UTC (rev 370)
@@ -103,12 +103,14 @@
static GError *dexter_channel_convert_network_error (GError **network_error);
#ifdef HAVE_TLS
static DexterChannelTLSParameters
- *dexter_channel_tls_parameters_new0 (void);
-
-static void dexter_channel_tls_parameters_copy (DexterChannelTLSParameters *dest,
- const DexterChannelTLSParameters *source);
+ *dexter_channel_tls_parameters_new (const gchar *cert_file,
+ const gchar *key_file,
+ const gchar *trust_file,
+ const gchar *crl_file);
+static DexterChannelTLSParameters
+ *dexter_channel_tls_parameters_dup (const DexterChannelTLSParameters *source);
static void dexter_channel_tls_parameters_free (DexterChannelTLSParameters *tls_parameters);
-#endif
+#endif /* HAVE_TLS */
/* GDestroyNotify to destroy channel hash entries */
static void _destroy_object_hash_entry (ChannelObjectHashEntry *hash_entry);
@@ -242,7 +244,7 @@
channel->object_hash = dexter_hash_table_new_full (g_int_hash, g_int_equal,
NULL, (GDestroyNotify) _destroy_object_hash_entry);
#ifdef HAVE_TLS
- channel->tls_parameters = dexter_channel_tls_parameters_new0 ();
+ channel->tls_parameters = dexter_channel_tls_parameters_new (NULL, NULL, NULL, NULL);
/* fetch TLS parameters from config file */
if (!dexter_config_get_string (__ICONFIG,
@@ -708,23 +710,32 @@
#ifdef HAVE_TLS
static DexterChannelTLSParameters *
-dexter_channel_tls_parameters_new0 (void)
+dexter_channel_tls_parameters_new (const gchar *cert_file,
+ const gchar *key_file,
+ const gchar *trust_file,
+ const gchar *crl_file)
{
- return g_slice_new0 (DexterChannelTLSParameters);
+ DexterChannelTLSParameters *tls_parameters = g_slice_new0 (DexterChannelTLSParameters);
+
+ tls_parameters->cert_file = g_strdup (cert_file);
+ tls_parameters->key_file = g_strdup (key_file);
+ tls_parameters->trust_file = g_strdup (trust_file);
+ tls_parameters->crl_file = g_strdup (crl_file);
+
+ return tls_parameters;
}
-static void
-dexter_channel_tls_parameters_copy (DexterChannelTLSParameters *dest,
- const DexterChannelTLSParameters *source)
+static DexterChannelTLSParameters *
+dexter_channel_tls_parameters_dup (const DexterChannelTLSParameters *source)
{
- g_return_if_fail (dest != NULL);
- g_return_if_fail (source != NULL);
+ if (!source)
+ return NULL;
- dest->cert_file = g_strdup (source->cert_file);
- dest->key_file = g_strdup (source->key_file);
- dest->trust_file = g_strdup (source->trust_file);
- dest->crl_file = g_strdup (source->crl_file);
+ return dexter_channel_tls_parameters_new (source->cert_file,
+ source->key_file,
+ source->trust_file,
+ source->crl_file);
}
@@ -1243,9 +1254,8 @@
GError **error)
{
#ifdef HAVE_TLS
- DexterChannelObject *channel_object;
- DexterChannelTLSParameters *tls_parameters;
- GError *local_error = NULL;
+ DexterChannelObject *channel_object;
+ GError *local_error = NULL;
#endif
#ifdef G_ENABLE_DEBUG
@@ -1255,17 +1265,17 @@
g_return_val_if_fail (DEXTER_IS_CHANNEL (channel), FALSE);
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
- g_object_ref (channel);
-
#ifndef HAVE_TLS
/* TLS not enabled */
g_set_error (error,
DEXTER_CHANNEL_ERROR, DEXTER_CHANNEL_ERROR_TLS_NOT_ENABLED,
"%s: TLS not enabled", G_STRFUNC);
- g_object_unref (channel);
return FALSE;
#else
/* TLS enabled, continue */
+
+ g_object_ref (channel);
+
channel_object = DEXTER_CHANNEL_OBJECT (channel);
/* check if channel not open */
@@ -1288,7 +1298,7 @@
return FALSE;
}
- /* send starttls command */
+ /* send starttls command to server */
dexter_channel_object_send_wait_process (channel_object, COMMAND_STARTTLS, 0, NULL, &local_error);
if (local_error)
{
@@ -1297,35 +1307,45 @@
return FALSE;
}
- /* get default TLS parameters */
- tls_parameters = dexter_channel_tls_parameters_new0 ();
- dexter_channel_tls_parameters_copy (tls_parameters, channel->tls_parameters);
-
/* if specified, issue callback to finalize TLS parameters */
if (starttls_callback)
{
+ /* copy default TLS parameters */
+ DexterChannelTLSParameters *tls_parameters =
+ dexter_channel_tls_parameters_dup (channel->tls_parameters);
+
+ /* perform the callback */
(*starttls_callback) (channel,
dexter_network_session_peer_addr (channel->session),
dexter_network_session_peer_addrlen (channel->session),
tls_parameters);
+
+ /* start TLS handshake, with adjusted parameters */
+ dexter_network_session_client_starttls (channel->session,
+ tls_parameters->cert_file,
+ tls_parameters->key_file,
+ tls_parameters->trust_file,
+ tls_parameters->crl_file,
+ &local_error);
+ dexter_channel_tls_parameters_free (tls_parameters);
}
-
- /* start TLS handshake */
- dexter_network_session_client_starttls (channel->session,
- tls_parameters->cert_file,
- tls_parameters->key_file,
- tls_parameters->trust_file,
- tls_parameters->crl_file,
- &local_error);
+ else
+ {
+ /* start TLS handshake, with default parameters */
+ dexter_network_session_client_starttls (channel->session,
+ channel->tls_parameters->cert_file,
+ channel->tls_parameters->key_file,
+ channel->tls_parameters->trust_file,
+ channel->tls_parameters->crl_file,
+ &local_error);
+ }
if (local_error)
{
- dexter_channel_tls_parameters_free (tls_parameters);
g_propagate_error (error, local_error);
g_object_unref (channel);
return FALSE;
}
- dexter_channel_tls_parameters_free (tls_parameters);
g_object_unref (channel);
return TRUE;
Modified: libdexter/trunk/dexter/dexter-network.c
===================================================================
--- libdexter/trunk/dexter/dexter-network.c 2007-06-09 07:17:19 UTC (rev 369)
+++ libdexter/trunk/dexter/dexter-network.c 2007-06-09 22:29:28 UTC (rev 370)
@@ -339,6 +339,7 @@
g_message ("TLS key file = %s", key_file);
g_message ("TLS trust file = %s", trust_file);
g_message ("TLS crl file = %s", crl_file);
+ g_message ("TLS flags = %d", flags);
#endif
return TRUE;
Modified: libdexter/trunk/dexter/dexter-server-internal.h
===================================================================
--- libdexter/trunk/dexter/dexter-server-internal.h 2007-06-09 07:17:19 UTC (rev 369)
+++ libdexter/trunk/dexter/dexter-server-internal.h 2007-06-09 22:29:28 UTC (rev 370)
@@ -55,11 +55,6 @@
gboolean dexter_server_hosts_access (int) G_GNUC_INTERNAL;
#endif
-#ifdef HAVE_TLS
-const DexterServerTLSSettings
- *dexter_server_tls_settings (DexterServer *server) G_GNUC_INTERNAL;
-#endif
-
G_END_DECLS
#endif /* __DEXTER_SERVER_INTERNAL_H__ */
Modified: libdexter/trunk/dexter/dexter-server.c
===================================================================
--- libdexter/trunk/dexter/dexter-server.c 2007-06-09 07:17:19 UTC (rev 369)
+++ libdexter/trunk/dexter/dexter-server.c 2007-06-09 22:29:28 UTC (rev 370)
@@ -87,9 +87,10 @@
static GError *dexter_server_convert_network_error (GError **network_error);
#ifdef HAVE_TLS
static DexterServerTLSSettings
- *dexter_server_tls_settings_new0 (void);
-static void dexter_server_tls_settings_copy (DexterServerTLSSettings *dest,
- const DexterServerTLSSettings *source);
+ *dexter_server_tls_settings_new (DexterServerTLSSupportFlag support_flag,
+ DexterServerTLSStartCallback starttls_callback);
+static DexterServerTLSSettings
+ *dexter_server_tls_settings_dup (const DexterServerTLSSettings *source);
static void dexter_server_tls_settings_free (DexterServerTLSSettings *tls_settings);
#endif
@@ -148,12 +149,15 @@
struct _service_data
{
- DexterServer *server; /* server */
- int connfd; /* connection fd */
- int recvbufsize; /* receive buffer size for service socket */
- struct sockaddr_storage addr; /* socket address struct */
- socklen_t addrlen; /* socket address length (family-dependent) */
- ClientCounter *client_counter; /* total number of active clients, plus one */
+ DexterServer *server; /* server */
+ int connfd; /* connection fd */
+ int recvbufsize; /* receive buffer size for service socket */
+ struct sockaddr_storage addr; /* socket address struct */
+ socklen_t addrlen; /* socket address length (family-dependent) */
+ ClientCounter *client_counter; /* total number of active clients, plus one */
+#ifdef HAVE_TLS
+ DexterServerTLSSettings *tls_settings; /* copy of server's tls settings */
+#endif
};
@@ -229,7 +233,7 @@
}
#ifdef HAVE_TLS
- server->tls_settings = dexter_server_tls_settings_new0 ();
+ server->tls_settings = NULL;
#endif
}
@@ -282,17 +286,6 @@
#endif
-#ifdef HAVE_TLS
-const DexterServerTLSSettings *
-dexter_server_tls_settings (DexterServer *server)
-{
- g_return_val_if_fail (DEXTER_IS_SERVER (server), NULL);
-
- return server->tls_settings;
-}
-#endif
-
-
/**
* dexter_server_get_state:
* @server: a #DexterServer.
@@ -398,21 +391,32 @@
#ifdef HAVE_TLS
static DexterServerTLSSettings *
-dexter_server_tls_settings_new0 (void)
+dexter_server_tls_settings_new (DexterServerTLSSupportFlag support_flag,
+ DexterServerTLSStartCallback starttls_callback)
{
- return g_slice_new0 (DexterServerTLSSettings);
+ DexterServerTLSSettings *tls_settings;
+
+ g_return_val_if_fail (support_flag == DEXTER_SERVER_TLS_SUPPORT_NONE ||
+ support_flag == DEXTER_SERVER_TLS_SUPPORT_AVAILABLE ||
+ support_flag == DEXTER_SERVER_TLS_SUPPORT_REQUIRED, NULL);
+
+ tls_settings = g_slice_new0 (DexterServerTLSSettings);
+
+ tls_settings->support_flag = support_flag;
+ tls_settings->starttls_callback = starttls_callback;
+
+ return tls_settings;
}
-static void
-dexter_server_tls_settings_copy (DexterServerTLSSettings *dest,
- const DexterServerTLSSettings *source)
+static DexterServerTLSSettings *
+dexter_server_tls_settings_dup (const DexterServerTLSSettings *source)
{
- g_return_if_fail (dest != NULL);
- g_return_if_fail (source != NULL);
+ if (!source)
+ return NULL;
- dest->support_flag = source->support_flag;
- dest->starttls_callback = source->starttls_callback;
+ return dexter_server_tls_settings_new (source->support_flag,
+ source->starttls_callback);
}
@@ -482,6 +486,9 @@
service_data->recvbufsize = server->recvbufsize;
/* each thread sees the same atomic client counter */
service_data->client_counter = client_counter;
+#ifdef HAVE_TLS
+ service_data->tls_settings = dexter_server_tls_settings_dup (server->tls_settings);
+#endif
do
{
@@ -583,6 +590,10 @@
service_data->server = server;
service_data->recvbufsize = server->recvbufsize;
service_data->client_counter = client_counter;
+#ifdef HAVE_TLS
+ service_data->tls_settings = dexter_server_tls_settings_dup (server->tls_settings);
+#endif
+
}
}
while (dexter_server_is_runnable (server) && (dexter_get_state () == DEXTER_STATE_UP));
@@ -600,7 +611,12 @@
server->host_numeric, server->serv_numeric);
if (service_data)
+ {
+#ifdef HAVE_TLS
+ dexter_server_tls_settings_free (service_data->tls_settings);
+#endif
g_slice_free (ServiceData, service_data);
+ }
g_object_unref (server);
@@ -640,6 +656,9 @@
dexter_network_session_open (session, sd->connfd, &sd->addr, sd->addrlen);
servercomm->server = sd->server;
servercomm->session = session;
+#ifdef HAVE_TLS
+ servercomm->tls_settings = sd->tls_settings;
+#endif
do
{
@@ -721,6 +740,9 @@
g_object_unref (servercomm);
g_object_unref (sd->server);
g_slice_free1 (sd->recvbufsize, recvbuf);
+#ifdef HAVE_TLS
+ dexter_server_tls_settings_free (sd->tls_settings);
+#endif
g_slice_free (ServiceData, sd);
#ifdef G_ENABLE_DEBUG
@@ -857,12 +879,11 @@
g_return_val_if_fail (tls_settings == NULL, FALSE);
#endif
- g_object_ref (server);
-
if (tls_settings)
#ifdef HAVE_TLS
{
- dexter_server_tls_settings_copy (server->tls_settings, tls_settings);
+ dexter_server_tls_settings_free (server->tls_settings);
+ server->tls_settings = dexter_server_tls_settings_dup (tls_settings);
}
#else
{
@@ -870,11 +891,12 @@
DEXTER_SERVER_ERROR,
DEXTER_SERVER_ERROR_TLS_NOT_ENABLED,
"%s: TLS not enabled", G_STRFUNC);
- g_object_unref (server);
return FALSE;
}
#endif /* HAVE_TLS */
+ g_object_ref (server);
+
/* check if server started */
if (dexter_server_get_state (server) == DEXTER_SERVER_STATE_STARTED)
{
Modified: libdexter/trunk/dexter/dexter-servercomm.c
===================================================================
--- libdexter/trunk/dexter/dexter-servercomm.c 2007-06-09 07:17:19 UTC (rev 369)
+++ libdexter/trunk/dexter/dexter-servercomm.c 2007-06-09 22:29:28 UTC (rev 370)
@@ -70,11 +70,14 @@
GString *payload,
GError **error);
#ifdef HAVE_TLS
-static DexterServerTLSParameters *
- dexter_servercomm_tls_parameters_new0 (void);
-
-static void dexter_servercomm_tls_parameters_copy (DexterServerTLSParameters *dest,
- const DexterServerTLSParameters *source);
+static DexterServerTLSParameters
+ *dexter_servercomm_tls_parameters_new (const gchar *cert_file,
+ const gchar *key_file,
+ const gchar *trust_file,
+ const gchar *crl_file,
+ DexterServerTLSClientCertFlag client_cert_flag);
+static DexterServerTLSParameters
+ *dexter_servercomm_tls_parameters_dup (const DexterServerTLSParameters *source);
static void dexter_servercomm_tls_parameters_free (DexterServerTLSParameters *tls_parameters);
static void dexter_servercomm_starttls (DexterServerComm *servercomm,
const DexterChannelMessage *msg,
@@ -138,7 +141,8 @@
servercomm->cur_dat_backlog = 0;
#ifdef HAVE_TLS
- servercomm->tls_parameters = dexter_servercomm_tls_parameters_new0 ();
+ servercomm->tls_parameters =
+ dexter_servercomm_tls_parameters_new (NULL, NULL, NULL, NULL, DEXTER_SERVER_TLS_CLIENT_CERT_NONE);
/* fetch TLS parameters from config file */
if (!dexter_config_get_string (__ICONFIG,
@@ -195,6 +199,8 @@
servercomm->tls_parameters->client_cert_flag = (DexterServerTLSClientCertFlag) tmp_client_cert_flag;
}
}
+
+ servercomm->tls_settings = NULL;
#endif /* HAVE_TLS */
}
@@ -226,6 +232,7 @@
#ifdef HAVE_TLS
dexter_servercomm_tls_parameters_free (servercomm->tls_parameters);
+ /* servercomm->tls_settings is freed in service thread function */
#endif
/* chain up */
@@ -267,24 +274,40 @@
#ifdef HAVE_TLS
static DexterServerTLSParameters *
-dexter_servercomm_tls_parameters_new0 (void)
+dexter_servercomm_tls_parameters_new (const gchar *cert_file,
+ const gchar *key_file,
+ const gchar *trust_file,
+ const gchar *crl_file,
+ DexterServerTLSClientCertFlag client_cert_flag)
{
- return g_slice_new0 (DexterServerTLSParameters);
+ DexterServerTLSParameters *tls_parameters;
+
+ g_return_val_if_fail (client_cert_flag == DEXTER_SERVER_TLS_CLIENT_CERT_NONE ||
+ client_cert_flag == DEXTER_SERVER_TLS_CLIENT_CERT_REQUESTED ||
+ client_cert_flag == DEXTER_SERVER_TLS_CLIENT_CERT_REQUIRED, NULL);
+
+ tls_parameters = g_slice_new0 (DexterServerTLSParameters);
+ tls_parameters->cert_file = g_strdup (cert_file);
+ tls_parameters->key_file = g_strdup (key_file);
+ tls_parameters->trust_file = g_strdup (trust_file);
+ tls_parameters->crl_file = g_strdup (crl_file);
+ tls_parameters->client_cert_flag = client_cert_flag;
+
+ return tls_parameters;
}
-static void
-dexter_servercomm_tls_parameters_copy (DexterServerTLSParameters *dest,
- const DexterServerTLSParameters *source)
+static DexterServerTLSParameters *
+dexter_servercomm_tls_parameters_dup (const DexterServerTLSParameters *source)
{
- g_return_if_fail (dest != NULL);
- g_return_if_fail (source != NULL);
+ if (!source)
+ return NULL;
- dest->cert_file = g_strdup (source->cert_file);
- dest->key_file = g_strdup (source->key_file);
- dest->trust_file = g_strdup (source->trust_file);
- dest->crl_file = g_strdup (source->crl_file);
- dest->client_cert_flag = source->client_cert_flag;
+ return dexter_servercomm_tls_parameters_new (source->cert_file,
+ source->key_file,
+ source->trust_file,
+ source->crl_file,
+ source->client_cert_flag);
}
@@ -307,8 +330,6 @@
const DexterChannelMessage *msg,
GError **error)
{
- DexterServerTLSParameters *tls_parameters;
- const DexterServerTLSSettings *tls_settings;
GError *local_error = NULL;
g_return_if_fail (DEXTER_IS_SERVERCOMM (servercomm));
@@ -317,10 +338,9 @@
g_object_ref (servercomm);
- tls_settings = dexter_server_tls_settings (servercomm->server);
-
/* check if server supports TLS */
- if (tls_settings->support_flag == DEXTER_SERVER_TLS_SUPPORT_NONE)
+ if (!servercomm->tls_settings ||
+ servercomm->tls_settings->support_flag == DEXTER_SERVER_TLS_SUPPORT_NONE)
{
dexter_servercomm_reply (servercomm, msg->cmd.command, msg->peer_id, ERROR_TLS_NOT_AVAILABLE, NULL, error);
g_object_unref (servercomm);
@@ -335,39 +355,51 @@
return;
}
- /* get default TLS parameters */
- tls_parameters = dexter_servercomm_tls_parameters_new0 ();
- dexter_servercomm_tls_parameters_copy (tls_parameters, servercomm->tls_parameters);
+ /* tell client to proceed with TLS handshake */
+ dexter_servercomm_reply (servercomm, msg->cmd.command, msg->peer_id, STATUS_OK, NULL, error);
/* if specified, issue callback to finalize TLS parameters */
- if (tls_settings->starttls_callback)
+ if (servercomm->tls_settings && servercomm->tls_settings->starttls_callback)
{
- (tls_settings->starttls_callback) (servercomm->server,
- dexter_network_session_peer_addr (servercomm->session),
- dexter_network_session_peer_addrlen (servercomm->session),
- tls_parameters);
+ /* copy default TLS parameters */
+ DexterServerTLSParameters *tls_parameters =
+ dexter_servercomm_tls_parameters_dup (servercomm->tls_parameters);
+
+ /* perform the callback */
+ (*servercomm->tls_settings->starttls_callback) (servercomm->server,
+ dexter_network_session_peer_addr (servercomm->session),
+ dexter_network_session_peer_addrlen (servercomm->session),
+ tls_parameters);
+
+ /* start TLS handshake, with adjusted parameters */
+ dexter_network_session_server_starttls (servercomm->session,
+ tls_parameters->cert_file,
+ tls_parameters->key_file,
+ tls_parameters->trust_file,
+ tls_parameters->crl_file,
+ tls_parameters->client_cert_flag,
+ &local_error);
+ dexter_servercomm_tls_parameters_free (tls_parameters);
}
+ else
+ {
+ /* start TLS handshake, with default parameters */
+ dexter_network_session_server_starttls (servercomm->session,
+ servercomm->tls_parameters->cert_file,
+ servercomm->tls_parameters->key_file,
+ servercomm->tls_parameters->trust_file,
+ servercomm->tls_parameters->crl_file,
+ servercomm->tls_parameters->client_cert_flag,
+ &local_error);
+ }
- /* tell client to proceed with TLS handshake */
- dexter_servercomm_reply (servercomm, msg->cmd.command, msg->peer_id, STATUS_OK, NULL, error);
-
- /* start TLS handshake */
- dexter_network_session_server_starttls (servercomm->session,
- tls_parameters->cert_file,
- tls_parameters->key_file,
- tls_parameters->trust_file,
- tls_parameters->crl_file,
- tls_parameters->client_cert_flag,
- &local_error);
if (local_error)
{
- dexter_servercomm_tls_parameters_free (tls_parameters);
g_propagate_error (error, local_error);
g_object_unref (servercomm);
return;
}
- dexter_servercomm_tls_parameters_free (tls_parameters);
g_object_unref (servercomm);
}
#endif
Modified: libdexter/trunk/dexter/dexter-servercomm.h
===================================================================
--- libdexter/trunk/dexter/dexter-servercomm.h 2007-06-09 07:17:19 UTC (rev 369)
+++ libdexter/trunk/dexter/dexter-servercomm.h 2007-06-09 22:29:28 UTC (rev 370)
@@ -70,6 +70,7 @@
volatile gint cur_dat_backlog; /* current data delivery backlog */
#ifdef HAVE_TLS
DexterServerTLSParameters *tls_parameters; /* default TLS parameters from config file */
+ DexterServerTLSSettings *tls_settings; /* copy of server's TLS settings */
#endif
};
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|