[libsoup] soup-session: cope with the dummy TLS backend better
- From: Dan Winship <danw src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libsoup] soup-session: cope with the dummy TLS backend better
- Date: Mon, 20 May 2013 17:55:32 +0000 (UTC)
commit 562f2b86f8070c3fe6b21c22fdb8bda76acf6e6b
Author: Dan Winship <danw gnome org>
Date: Mon May 20 14:54:02 2013 -0300
soup-session: cope with the dummy TLS backend better
Make SoupSession handle GDummyTlsBackend a little better (and add
a test for it).
https://bugzilla.gnome.org/show_bug.cgi?id=700518
libsoup/soup-session.c | 22 ++++--
tests/Makefile.am | 1 +
tests/no-ssl-test.c | 199 ++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 214 insertions(+), 8 deletions(-)
---
diff --git a/libsoup/soup-session.c b/libsoup/soup-session.c
index 186d57a..066cfde 100644
--- a/libsoup/soup-session.c
+++ b/libsoup/soup-session.c
@@ -439,10 +439,12 @@ set_tlsdb (SoupSession *session, GTlsDatabase *tlsdb)
g_object_freeze_notify (G_OBJECT (session));
system_default = g_tls_backend_get_default_database (g_tls_backend_get_default ());
- if (priv->tlsdb == system_default || tlsdb == system_default) {
- g_object_notify (G_OBJECT (session), "ssl-use-system-ca-file");
+ if (system_default) {
+ if (priv->tlsdb == system_default || tlsdb == system_default) {
+ g_object_notify (G_OBJECT (session), "ssl-use-system-ca-file");
+ }
+ g_object_unref (system_default);
}
- g_object_unref (system_default);
if (priv->ssl_ca_file) {
g_free (priv->ssl_ca_file);
@@ -473,7 +475,7 @@ set_use_system_ca_file (SoupSession *session, gboolean use_system_ca_file)
else if (priv->tlsdb == system_default)
set_tlsdb (session, NULL);
- g_object_unref (system_default);
+ g_clear_object (&system_default);
}
static void
@@ -510,11 +512,15 @@ set_ssl_ca_file (SoupSession *session, const char *ssl_ca_file)
}
set_tlsdb (session, tlsdb);
- if (tlsdb)
+ if (tlsdb) {
g_object_unref (tlsdb);
- priv->ssl_ca_file = g_strdup (ssl_ca_file);
- g_object_notify (G_OBJECT (session), "ssl-ca-file");
+ priv->ssl_ca_file = g_strdup (ssl_ca_file);
+ g_object_notify (G_OBJECT (session), "ssl-ca-file");
+ } else if (priv->ssl_ca_file) {
+ g_clear_pointer (&priv->ssl_ca_file, g_free);
+ g_object_notify (G_OBJECT (session), "ssl-ca-file");
+ }
g_object_thaw_notify (G_OBJECT (session));
}
@@ -730,7 +736,7 @@ soup_session_get_property (GObject *object, guint prop_id,
case PROP_SSL_USE_SYSTEM_CA_FILE:
tlsdb = g_tls_backend_get_default_database (g_tls_backend_get_default ());
g_value_set_boolean (value, priv->tlsdb == tlsdb);
- g_object_unref (tlsdb);
+ g_clear_object (&tlsdb);
break;
case PROP_TLS_DATABASE:
g_value_set_object (value, priv->tlsdb);
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 417b04c..6fa6d1c 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -22,6 +22,7 @@ TESTS = \
header-parsing \
misc-test \
multipart-test \
+ no-ssl-test \
ntlm-test \
proxy-test \
pull-api \
diff --git a/tests/no-ssl-test.c b/tests/no-ssl-test.c
new file mode 100644
index 0000000..89a7520
--- /dev/null
+++ b/tests/no-ssl-test.c
@@ -0,0 +1,199 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+
+#include "test-utils.h"
+
+static void
+do_ssl_test_for_session (SoupSession *session, char *uri)
+{
+ SoupMessage *msg;
+ GTlsCertificate *cert;
+ GTlsCertificateFlags flags;
+
+ msg = soup_message_new ("GET", uri);
+ soup_session_send_message (session, msg);
+ if (msg->status_code != SOUP_STATUS_SSL_FAILED) {
+ debug_printf (1, " Unexpected status: %d %s\n",
+ msg->status_code, msg->reason_phrase);
+ errors++;
+ }
+
+ if (soup_message_get_https_status (msg, &cert, &flags)) {
+ debug_printf (1, " get_http_status() returned TRUE? (flags %x)\n", flags);
+ errors++;
+ if (cert) {
+ debug_printf (1, " Got GTlsCertificate?\n");
+ errors++;
+ }
+ }
+ if (soup_message_get_flags (msg) & SOUP_MESSAGE_CERTIFICATE_TRUSTED) {
+ debug_printf (1, " CERTIFICATE_TRUSTED set?\n");
+ errors++;
+ }
+
+ g_object_unref (msg);
+}
+
+static void
+do_ssl_tests (char *uri)
+{
+ SoupSession *session;
+
+ debug_printf (1, "\nSoupSession without SSL support\n");
+
+ debug_printf (1, " plain\n");
+ session = soup_test_session_new (SOUP_TYPE_SESSION, NULL);
+ do_ssl_test_for_session (session, uri);
+ soup_test_session_abort_unref (session);
+
+ debug_printf (1, " async\n");
+ session = soup_test_session_new (SOUP_TYPE_SESSION_ASYNC, NULL);
+ do_ssl_test_for_session (session, uri);
+ soup_test_session_abort_unref (session);
+
+ debug_printf (1, " sync\n");
+ session = soup_test_session_new (SOUP_TYPE_SESSION_SYNC, NULL);
+ do_ssl_test_for_session (session, uri);
+ soup_test_session_abort_unref (session);
+}
+
+static void
+do_session_property_tests (void)
+{
+ gboolean use_system;
+ GTlsDatabase *tlsdb;
+ char *ca_file;
+ SoupSession *session;
+
+ debug_printf (1, "session properties\n");
+
+ session = soup_session_async_new ();
+
+ g_object_get (G_OBJECT (session),
+ "ssl-use-system-ca-file", &use_system,
+ "tls-database", &tlsdb,
+ "ssl-ca-file", &ca_file,
+ NULL);
+ if (use_system) {
+ debug_printf (1, " ssl-use-system-ca-file defaults to TRUE?\n");
+ errors++;
+ }
+ if (tlsdb) {
+ debug_printf (1, " tls-database set by default?\n");
+ errors++;
+ g_object_unref (tlsdb);
+ }
+ if (ca_file) {
+ debug_printf (1, " ca-file set by default?\n");
+ errors++;
+ g_free (ca_file);
+ }
+
+ g_object_set (G_OBJECT (session),
+ "ssl-use-system-ca-file", TRUE,
+ NULL);
+ g_object_get (G_OBJECT (session),
+ "ssl-use-system-ca-file", &use_system,
+ "ssl-ca-file", &ca_file,
+ NULL);
+ if (use_system) {
+ debug_printf (1, " setting ssl-use-system-ca-file did not fail\n");
+ errors++;
+ }
+ if (ca_file) {
+ debug_printf (1, " setting ssl-use-system-ca-file set ssl-ca-file\n");
+ errors++;
+ g_free (ca_file);
+ }
+
+ g_object_set (G_OBJECT (session),
+ "ssl-ca-file", SRCDIR "/test-cert.pem",
+ NULL);
+ g_object_get (G_OBJECT (session),
+ "ssl-use-system-ca-file", &use_system,
+ "tls-database", &tlsdb,
+ "ssl-ca-file", &ca_file,
+ NULL);
+ if (ca_file) {
+ debug_printf (1, " setting ssl-ca-file did not fail\n");
+ errors++;
+ g_free (ca_file);
+ }
+ if (use_system) {
+ debug_printf (1, " setting ssl-ca-file set ssl-use-system-ca-file\n");
+ errors++;
+ }
+ if (tlsdb) {
+ debug_printf (1, " setting ssl-ca-file set tls-database\n");
+ errors++;
+ g_object_unref (tlsdb);
+ }
+
+ g_object_set (G_OBJECT (session),
+ "tls-database", NULL,
+ NULL);
+ g_object_get (G_OBJECT (session),
+ "ssl-use-system-ca-file", &use_system,
+ "tls-database", &tlsdb,
+ "ssl-ca-file", &ca_file,
+ NULL);
+ if (tlsdb) {
+ debug_printf (1, " setting tls-database NULL failed\n");
+ errors++;
+ g_object_unref (tlsdb);
+ }
+ if (use_system) {
+ debug_printf (1, " setting tls-database NULL set ssl-use-system-ca-file\n");
+ errors++;
+ }
+ if (ca_file) {
+ debug_printf (1, " setting tls-database NULL set ssl-ca-file\n");
+ errors++;
+ g_free (ca_file);
+ }
+
+ soup_test_session_abort_unref (session);
+}
+
+static void
+server_handler (SoupServer *server,
+ SoupMessage *msg,
+ const char *path,
+ GHashTable *query,
+ SoupClientContext *client,
+ gpointer user_data)
+{
+ soup_message_set_status (msg, SOUP_STATUS_OK);
+ soup_message_set_response (msg, "text/plain",
+ SOUP_MEMORY_STATIC,
+ "ok\r\n", 4);
+}
+
+int
+main (int argc, char **argv)
+{
+ SoupServer *server;
+ char *uri;
+
+ /* Force this test to use the dummy TLS backend */
+ g_setenv ("GIO_USE_TLS", "dummy", TRUE);
+
+ test_init (argc, argv, NULL);
+
+ /* Make a non-SSL server and pretend that it's ssl, which is fine
+ * since we won't ever actually talk to it anyway. We don't
+ * currently test that failing to construct an SSL server works.
+ */
+ server = soup_test_server_new (TRUE);
+ soup_server_add_handler (server, NULL, server_handler, NULL, NULL);
+ uri = g_strdup_printf ("https://127.0.0.1:%u/",
+ soup_server_get_port (server));
+
+ do_session_property_tests ();
+ do_ssl_tests (uri);
+
+ g_free (uri);
+ soup_test_server_quit_unref (server);
+
+ test_cleanup ();
+ return errors != 0;
+}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]