[libsoup] soup-session: cope with the dummy TLS backend better



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]