mirror of
				https://gitlab.gnome.org/GNOME/glib.git
				synced 2025-11-04 10:08:56 +01:00 
			
		
		
		
	Otherwise the task never returned a value. See https://gitlab.gnome.org/GNOME/glib/-/merge_requests/385 Signed-off-by: Philip Withnall <pwithnall@endlessos.org>
		
			
				
	
	
		
			558 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			558 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						||
 * Copyright 2019 Collabora Ltd.
 | 
						||
 *
 | 
						||
 * SPDX-License-Identifier: LGPL-2.1-or-later
 | 
						||
 *
 | 
						||
 * This library is free software; you can redistribute it and/or
 | 
						||
 * modify it under the terms of the GNU Lesser General Public
 | 
						||
 * License as published by the Free Software Foundation; either
 | 
						||
 * version 2.1 of the License, or (at your option) any later version.
 | 
						||
 *
 | 
						||
 * This library is distributed in the hope that it will be useful,
 | 
						||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
						||
 * Lesser General Public License for more details.
 | 
						||
 *
 | 
						||
 * You should have received a copy of the GNU Lesser General
 | 
						||
 * Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
 | 
						||
 */
 | 
						||
 | 
						||
#include "config.h"
 | 
						||
 | 
						||
#include <errno.h>
 | 
						||
 | 
						||
#include <glib/gstdio.h>
 | 
						||
#include <gio/gio.h>
 | 
						||
 | 
						||
/* For G_CREDENTIALS_*_SUPPORTED */
 | 
						||
#include <gio/gcredentialsprivate.h>
 | 
						||
 | 
						||
#ifdef HAVE_DBUS1
 | 
						||
#include <dbus/dbus.h>
 | 
						||
#endif
 | 
						||
 | 
						||
typedef enum
 | 
						||
{
 | 
						||
  INTEROP_FLAGS_EXTERNAL = (1 << 0),
 | 
						||
  INTEROP_FLAGS_ANONYMOUS = (1 << 1),
 | 
						||
  INTEROP_FLAGS_SHA1 = (1 << 2),
 | 
						||
  INTEROP_FLAGS_TCP = (1 << 3),
 | 
						||
  INTEROP_FLAGS_LIBDBUS = (1 << 4),
 | 
						||
  INTEROP_FLAGS_ABSTRACT = (1 << 5),
 | 
						||
  INTEROP_FLAGS_REQUIRE_SAME_USER = (1 << 6),
 | 
						||
  INTEROP_FLAGS_NONE = 0
 | 
						||
} InteropFlags;
 | 
						||
 | 
						||
static gboolean
 | 
						||
allow_external_cb (G_GNUC_UNUSED GDBusAuthObserver *observer,
 | 
						||
                   const char *mechanism,
 | 
						||
                   G_GNUC_UNUSED gpointer user_data)
 | 
						||
{
 | 
						||
  if (g_strcmp0 (mechanism, "EXTERNAL") == 0)
 | 
						||
    {
 | 
						||
      g_debug ("Accepting EXTERNAL authentication");
 | 
						||
      return TRUE;
 | 
						||
    }
 | 
						||
  else
 | 
						||
    {
 | 
						||
      g_debug ("Rejecting \"%s\" authentication: not EXTERNAL", mechanism);
 | 
						||
      return FALSE;
 | 
						||
    }
 | 
						||
}
 | 
						||
 | 
						||
static gboolean
 | 
						||
allow_anonymous_cb (G_GNUC_UNUSED GDBusAuthObserver *observer,
 | 
						||
                    const char *mechanism,
 | 
						||
                    G_GNUC_UNUSED gpointer user_data)
 | 
						||
{
 | 
						||
  if (g_strcmp0 (mechanism, "ANONYMOUS") == 0)
 | 
						||
    {
 | 
						||
      g_debug ("Accepting ANONYMOUS authentication");
 | 
						||
      return TRUE;
 | 
						||
    }
 | 
						||
  else
 | 
						||
    {
 | 
						||
      g_debug ("Rejecting \"%s\" authentication: not ANONYMOUS", mechanism);
 | 
						||
      return FALSE;
 | 
						||
    }
 | 
						||
}
 | 
						||
 | 
						||
static gboolean
 | 
						||
allow_sha1_cb (G_GNUC_UNUSED GDBusAuthObserver *observer,
 | 
						||
               const char *mechanism,
 | 
						||
               G_GNUC_UNUSED gpointer user_data)
 | 
						||
{
 | 
						||
  if (g_strcmp0 (mechanism, "DBUS_COOKIE_SHA1") == 0)
 | 
						||
    {
 | 
						||
      g_debug ("Accepting DBUS_COOKIE_SHA1 authentication");
 | 
						||
      return TRUE;
 | 
						||
    }
 | 
						||
  else
 | 
						||
    {
 | 
						||
      g_debug ("Rejecting \"%s\" authentication: not DBUS_COOKIE_SHA1",
 | 
						||
               mechanism);
 | 
						||
      return FALSE;
 | 
						||
    }
 | 
						||
}
 | 
						||
 | 
						||
static gboolean
 | 
						||
allow_any_mechanism_cb (G_GNUC_UNUSED GDBusAuthObserver *observer,
 | 
						||
                        const char *mechanism,
 | 
						||
                        G_GNUC_UNUSED gpointer user_data)
 | 
						||
{
 | 
						||
  g_debug ("Accepting \"%s\" authentication", mechanism);
 | 
						||
  return TRUE;
 | 
						||
}
 | 
						||
 | 
						||
static gboolean
 | 
						||
authorize_any_authenticated_peer_cb (G_GNUC_UNUSED GDBusAuthObserver *observer,
 | 
						||
                                     G_GNUC_UNUSED GIOStream *stream,
 | 
						||
                                     GCredentials *credentials,
 | 
						||
                                     G_GNUC_UNUSED gpointer user_data)
 | 
						||
{
 | 
						||
  if (credentials == NULL)
 | 
						||
    {
 | 
						||
      g_debug ("Authorizing peer with no credentials");
 | 
						||
    }
 | 
						||
  else
 | 
						||
    {
 | 
						||
      gchar *str = g_credentials_to_string (credentials);
 | 
						||
 | 
						||
      g_debug ("Authorizing peer with credentials: %s", str);
 | 
						||
      g_free (str);
 | 
						||
    }
 | 
						||
 | 
						||
  return TRUE;
 | 
						||
}
 | 
						||
 | 
						||
static GDBusMessage *
 | 
						||
whoami_filter_cb (GDBusConnection *connection,
 | 
						||
                  GDBusMessage *message,
 | 
						||
                  gboolean incoming,
 | 
						||
                  G_GNUC_UNUSED gpointer user_data)
 | 
						||
{
 | 
						||
  if (!incoming)
 | 
						||
    return message;
 | 
						||
 | 
						||
  if (g_dbus_message_get_message_type (message) == G_DBUS_MESSAGE_TYPE_METHOD_CALL &&
 | 
						||
      g_strcmp0 (g_dbus_message_get_member (message), "WhoAmI") == 0)
 | 
						||
    {
 | 
						||
      GDBusMessage *reply = g_dbus_message_new_method_reply (message);
 | 
						||
      gint64 uid = -1;
 | 
						||
      gint64 pid = -1;
 | 
						||
#ifdef G_OS_UNIX
 | 
						||
      GCredentials *credentials = g_dbus_connection_get_peer_credentials (connection);
 | 
						||
 | 
						||
      if (credentials != NULL)
 | 
						||
        {
 | 
						||
          uid = (gint64) g_credentials_get_unix_user (credentials, NULL);
 | 
						||
          pid = (gint64) g_credentials_get_unix_pid (credentials, NULL);
 | 
						||
        }
 | 
						||
#endif
 | 
						||
 | 
						||
      g_dbus_message_set_body (reply,
 | 
						||
                               g_variant_new ("(xx)", uid, pid));
 | 
						||
      g_dbus_connection_send_message (connection, reply,
 | 
						||
                                      G_DBUS_SEND_MESSAGE_FLAGS_NONE,
 | 
						||
                                      NULL, NULL);
 | 
						||
      g_object_unref (reply);
 | 
						||
 | 
						||
      /* handled */
 | 
						||
      g_object_unref (message);
 | 
						||
      return NULL;
 | 
						||
    }
 | 
						||
 | 
						||
  return message;
 | 
						||
}
 | 
						||
 | 
						||
static gboolean
 | 
						||
new_connection_cb (G_GNUC_UNUSED GDBusServer *server,
 | 
						||
                   GDBusConnection *connection,
 | 
						||
                   G_GNUC_UNUSED gpointer user_data)
 | 
						||
{
 | 
						||
  GCredentials *credentials = g_dbus_connection_get_peer_credentials (connection);
 | 
						||
 | 
						||
  if (credentials == NULL)
 | 
						||
    {
 | 
						||
      g_debug ("New connection from peer with no credentials");
 | 
						||
    }
 | 
						||
  else
 | 
						||
    {
 | 
						||
      gchar *str = g_credentials_to_string (credentials);
 | 
						||
 | 
						||
      g_debug ("New connection from peer with credentials: %s", str);
 | 
						||
      g_free (str);
 | 
						||
    }
 | 
						||
 | 
						||
  g_object_ref (connection);
 | 
						||
  g_dbus_connection_add_filter (connection, whoami_filter_cb, NULL, NULL);
 | 
						||
  return TRUE;
 | 
						||
}
 | 
						||
 | 
						||
#ifdef HAVE_DBUS1
 | 
						||
typedef struct
 | 
						||
{
 | 
						||
  DBusError error;
 | 
						||
  DBusConnection *conn;
 | 
						||
  DBusMessage *call;
 | 
						||
  DBusMessage *reply;
 | 
						||
} LibdbusCall;
 | 
						||
 | 
						||
static void
 | 
						||
libdbus_call_task_cb (GTask *task,
 | 
						||
                      G_GNUC_UNUSED gpointer source_object,
 | 
						||
                      gpointer task_data,
 | 
						||
                      G_GNUC_UNUSED GCancellable *cancellable)
 | 
						||
{
 | 
						||
  LibdbusCall *libdbus_call = task_data;
 | 
						||
 | 
						||
  libdbus_call->reply = dbus_connection_send_with_reply_and_block (libdbus_call->conn,
 | 
						||
                                                                   libdbus_call->call,
 | 
						||
                                                                   -1,
 | 
						||
                                                                   &libdbus_call->error);
 | 
						||
  g_task_return_boolean (task, TRUE);
 | 
						||
}
 | 
						||
#endif /* HAVE_DBUS1 */
 | 
						||
 | 
						||
static void
 | 
						||
store_result_cb (G_GNUC_UNUSED GObject *source_object,
 | 
						||
                 GAsyncResult *res,
 | 
						||
                 gpointer user_data)
 | 
						||
{
 | 
						||
  GAsyncResult **result = user_data;
 | 
						||
 | 
						||
  g_assert_nonnull (result);
 | 
						||
  g_assert_null (*result);
 | 
						||
  *result = g_object_ref (res);
 | 
						||
}
 | 
						||
 | 
						||
static void
 | 
						||
assert_expected_uid_pid (InteropFlags flags,
 | 
						||
                         gint64 uid,
 | 
						||
                         gint64 pid)
 | 
						||
{
 | 
						||
#ifdef G_OS_UNIX
 | 
						||
  if (flags & (INTEROP_FLAGS_ANONYMOUS | INTEROP_FLAGS_SHA1 | INTEROP_FLAGS_TCP))
 | 
						||
    {
 | 
						||
      /* No assertion. There is no guarantee whether credentials will be
 | 
						||
       * passed even though we didn't send them. Conversely, if
 | 
						||
       * credentials were not passed,
 | 
						||
       * g_dbus_connection_get_peer_credentials() always returns the
 | 
						||
       * credentials of the socket, and not the uid that a
 | 
						||
       * client might have proved it has by using DBUS_COOKIE_SHA1. */
 | 
						||
    }
 | 
						||
  else    /* We should prefer EXTERNAL whenever it is allowed. */
 | 
						||
    {
 | 
						||
#ifdef __linux__
 | 
						||
      /* We know that both GDBus and libdbus support full credentials-passing
 | 
						||
       * on Linux. */
 | 
						||
      g_assert_cmpint (uid, ==, getuid ());
 | 
						||
      g_assert_cmpint (pid, ==, getpid ());
 | 
						||
#elif defined(__APPLE__)
 | 
						||
      /* We know (or at least suspect) that both GDBus and libdbus support
 | 
						||
       * passing the uid only on macOS. */
 | 
						||
      g_assert_cmpint (uid, ==, getuid ());
 | 
						||
      /* No pid here */
 | 
						||
#else
 | 
						||
      g_test_message ("Please open a merge request to add appropriate "
 | 
						||
                      "assertions for your platform");
 | 
						||
#endif
 | 
						||
    }
 | 
						||
#endif /* G_OS_UNIX */
 | 
						||
}
 | 
						||
 | 
						||
static void
 | 
						||
do_test_server_auth (InteropFlags flags)
 | 
						||
{
 | 
						||
  GError *error = NULL;
 | 
						||
  gchar *tmpdir = NULL;
 | 
						||
  gchar *listenable_address = NULL;
 | 
						||
  GDBusServer *server = NULL;
 | 
						||
  GDBusAuthObserver *observer = NULL;
 | 
						||
  GDBusServerFlags server_flags = G_DBUS_SERVER_FLAGS_RUN_IN_THREAD;
 | 
						||
  gchar *guid = NULL;
 | 
						||
  const char *connectable_address;
 | 
						||
  GDBusConnection *client = NULL;
 | 
						||
  GAsyncResult *result = NULL;
 | 
						||
  GVariant *tuple = NULL;
 | 
						||
  gint64 uid, pid;
 | 
						||
#ifdef HAVE_DBUS1
 | 
						||
  /* GNOME/glib#1831 seems to involve a race condition, so try a few times
 | 
						||
   * to see if we can trigger it. */
 | 
						||
  gsize i;
 | 
						||
  gsize n = 20;
 | 
						||
#endif
 | 
						||
 | 
						||
  if (flags & INTEROP_FLAGS_TCP)
 | 
						||
    {
 | 
						||
      listenable_address = g_strdup ("tcp:host=127.0.0.1");
 | 
						||
    }
 | 
						||
  else
 | 
						||
    {
 | 
						||
#ifdef G_OS_UNIX
 | 
						||
      gchar *escaped;
 | 
						||
 | 
						||
      tmpdir = g_dir_make_tmp ("gdbus-server-auth-XXXXXX", &error);
 | 
						||
      g_assert_no_error (error);
 | 
						||
      escaped = g_dbus_address_escape_value (tmpdir);
 | 
						||
      listenable_address = g_strdup_printf ("unix:%s=%s",
 | 
						||
                                            (flags & INTEROP_FLAGS_ABSTRACT) ? "tmpdir" : "dir",
 | 
						||
                                            escaped);
 | 
						||
      g_free (escaped);
 | 
						||
#else
 | 
						||
      g_test_skip ("unix: addresses only work on Unix");
 | 
						||
      goto out;
 | 
						||
#endif
 | 
						||
    }
 | 
						||
 | 
						||
  g_test_message ("Testing GDBus server at %s / libdbus client, with flags: "
 | 
						||
                  "external:%s "
 | 
						||
                  "anonymous:%s "
 | 
						||
                  "sha1:%s "
 | 
						||
                  "abstract:%s "
 | 
						||
                  "tcp:%s",
 | 
						||
                  listenable_address,
 | 
						||
                  (flags & INTEROP_FLAGS_EXTERNAL) ? "true" : "false",
 | 
						||
                  (flags & INTEROP_FLAGS_ANONYMOUS) ? "true" : "false",
 | 
						||
                  (flags & INTEROP_FLAGS_SHA1) ? "true" : "false",
 | 
						||
                  (flags & INTEROP_FLAGS_ABSTRACT) ? "true" : "false",
 | 
						||
                  (flags & INTEROP_FLAGS_TCP) ? "true" : "false");
 | 
						||
 | 
						||
#if !defined(G_CREDENTIALS_UNIX_CREDENTIALS_MESSAGE_SUPPORTED) \
 | 
						||
  && !defined(G_CREDENTIALS_SOCKET_GET_CREDENTIALS_SUPPORTED)
 | 
						||
  if (flags & INTEROP_FLAGS_EXTERNAL)
 | 
						||
    {
 | 
						||
      g_test_skip ("EXTERNAL authentication not implemented on this platform");
 | 
						||
      goto out;
 | 
						||
    }
 | 
						||
#endif
 | 
						||
 | 
						||
  if (flags & INTEROP_FLAGS_ANONYMOUS)
 | 
						||
    server_flags |= G_DBUS_SERVER_FLAGS_AUTHENTICATION_ALLOW_ANONYMOUS;
 | 
						||
  if (flags & INTEROP_FLAGS_REQUIRE_SAME_USER)
 | 
						||
    server_flags |= G_DBUS_SERVER_FLAGS_AUTHENTICATION_REQUIRE_SAME_USER;
 | 
						||
 | 
						||
  observer = g_dbus_auth_observer_new ();
 | 
						||
 | 
						||
  if (flags & INTEROP_FLAGS_EXTERNAL)
 | 
						||
    g_signal_connect (observer, "allow-mechanism",
 | 
						||
                      G_CALLBACK (allow_external_cb), NULL);
 | 
						||
  else if (flags & INTEROP_FLAGS_ANONYMOUS)
 | 
						||
    g_signal_connect (observer, "allow-mechanism",
 | 
						||
                      G_CALLBACK (allow_anonymous_cb), NULL);
 | 
						||
  else if (flags & INTEROP_FLAGS_SHA1)
 | 
						||
    g_signal_connect (observer, "allow-mechanism",
 | 
						||
                      G_CALLBACK (allow_sha1_cb), NULL);
 | 
						||
  else
 | 
						||
    g_signal_connect (observer, "allow-mechanism",
 | 
						||
                      G_CALLBACK (allow_any_mechanism_cb), NULL);
 | 
						||
 | 
						||
  g_signal_connect (observer, "authorize-authenticated-peer",
 | 
						||
                    G_CALLBACK (authorize_any_authenticated_peer_cb),
 | 
						||
                    NULL);
 | 
						||
 | 
						||
  guid = g_dbus_generate_guid ();
 | 
						||
  server = g_dbus_server_new_sync (listenable_address,
 | 
						||
                                   server_flags,
 | 
						||
                                   guid,
 | 
						||
                                   observer,
 | 
						||
                                   NULL,
 | 
						||
                                   &error);
 | 
						||
  g_assert_no_error (error);
 | 
						||
  g_assert_nonnull (server);
 | 
						||
  g_signal_connect (server, "new-connection", G_CALLBACK (new_connection_cb), NULL);
 | 
						||
  g_dbus_server_start (server);
 | 
						||
  connectable_address = g_dbus_server_get_client_address (server);
 | 
						||
  g_test_message ("Connectable address: %s", connectable_address);
 | 
						||
 | 
						||
  result = NULL;
 | 
						||
  g_dbus_connection_new_for_address (connectable_address,
 | 
						||
                                     G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT,
 | 
						||
                                     NULL, NULL, store_result_cb, &result);
 | 
						||
 | 
						||
  while (result == NULL)
 | 
						||
    g_main_context_iteration (NULL, TRUE);
 | 
						||
 | 
						||
  client = g_dbus_connection_new_for_address_finish (result, &error);
 | 
						||
  g_assert_no_error (error);
 | 
						||
  g_assert_nonnull (client);
 | 
						||
  g_clear_object (&result);
 | 
						||
 | 
						||
  g_dbus_connection_call (client, NULL, "/", "com.example.Test", "WhoAmI",
 | 
						||
                          NULL, G_VARIANT_TYPE ("(xx)"),
 | 
						||
                          G_DBUS_CALL_FLAGS_NONE, -1, NULL, store_result_cb,
 | 
						||
                          &result);
 | 
						||
 | 
						||
  while (result == NULL)
 | 
						||
    g_main_context_iteration (NULL, TRUE);
 | 
						||
 | 
						||
  tuple = g_dbus_connection_call_finish (client, result, &error);
 | 
						||
  g_assert_no_error (error);
 | 
						||
  g_assert_nonnull (tuple);
 | 
						||
  g_clear_object (&result);
 | 
						||
  g_clear_object (&client);
 | 
						||
 | 
						||
  uid = -2;
 | 
						||
  pid = -2;
 | 
						||
  g_variant_get (tuple, "(xx)", &uid, &pid);
 | 
						||
 | 
						||
  g_debug ("Server says GDBus client is uid %" G_GINT64_FORMAT ", pid %" G_GINT64_FORMAT,
 | 
						||
           uid, pid);
 | 
						||
 | 
						||
  assert_expected_uid_pid (flags, uid, pid);
 | 
						||
 | 
						||
  g_clear_pointer (&tuple, g_variant_unref);
 | 
						||
 | 
						||
#ifdef HAVE_DBUS1
 | 
						||
  for (i = 0; i < n; i++)
 | 
						||
    {
 | 
						||
      LibdbusCall libdbus_call = { DBUS_ERROR_INIT, NULL, NULL, NULL };
 | 
						||
      GTask *task;
 | 
						||
 | 
						||
      /* The test suite uses %G_TEST_OPTION_ISOLATE_DIRS, which sets
 | 
						||
       * `HOME=/dev/null` and leaves g_get_home_dir() pointing to the per-test
 | 
						||
       * temp home directory. Unfortunately, libdbus doesn’t allow the home dir
 | 
						||
       * to be overridden except using the environment, so copy the per-test
 | 
						||
       * temp home directory back there so that libdbus uses the same
 | 
						||
       * `$HOME/.dbus-keyrings` path as GLib. This is not thread-safe. */
 | 
						||
      g_setenv ("HOME", g_get_home_dir (), TRUE);
 | 
						||
 | 
						||
      libdbus_call.conn = dbus_connection_open_private (connectable_address,
 | 
						||
                                                        &libdbus_call.error);
 | 
						||
      g_assert_cmpstr (libdbus_call.error.name, ==, NULL);
 | 
						||
      g_assert_nonnull (libdbus_call.conn);
 | 
						||
 | 
						||
      libdbus_call.call = dbus_message_new_method_call (NULL, "/",
 | 
						||
                                                        "com.example.Test",
 | 
						||
                                                        "WhoAmI");
 | 
						||
 | 
						||
      if (libdbus_call.call == NULL)
 | 
						||
        g_error ("Out of memory");
 | 
						||
 | 
						||
      result = NULL;
 | 
						||
      task = g_task_new (NULL, NULL, store_result_cb, &result);
 | 
						||
      g_task_set_task_data (task, &libdbus_call, NULL);
 | 
						||
      g_task_run_in_thread (task, libdbus_call_task_cb);
 | 
						||
 | 
						||
      while (result == NULL)
 | 
						||
        g_main_context_iteration (NULL, TRUE);
 | 
						||
 | 
						||
      g_clear_object (&result);
 | 
						||
 | 
						||
      g_assert_cmpstr (libdbus_call.error.name, ==, NULL);
 | 
						||
      g_assert_nonnull (libdbus_call.reply);
 | 
						||
 | 
						||
      uid = -2;
 | 
						||
      pid = -2;
 | 
						||
      dbus_message_get_args (libdbus_call.reply, &libdbus_call.error,
 | 
						||
                             DBUS_TYPE_INT64, &uid,
 | 
						||
                             DBUS_TYPE_INT64, &pid,
 | 
						||
                             DBUS_TYPE_INVALID);
 | 
						||
      g_assert_cmpstr (libdbus_call.error.name, ==, NULL);
 | 
						||
 | 
						||
      g_debug ("Server says libdbus client %" G_GSIZE_FORMAT " is uid %" G_GINT64_FORMAT ", pid %" G_GINT64_FORMAT,
 | 
						||
               i, uid, pid);
 | 
						||
      assert_expected_uid_pid (flags | INTEROP_FLAGS_LIBDBUS, uid, pid);
 | 
						||
 | 
						||
      dbus_connection_close (libdbus_call.conn);
 | 
						||
      dbus_connection_unref (libdbus_call.conn);
 | 
						||
      dbus_message_unref (libdbus_call.call);
 | 
						||
      dbus_message_unref (libdbus_call.reply);
 | 
						||
      g_clear_object (&task);
 | 
						||
    }
 | 
						||
#else /* !HAVE_DBUS1 */
 | 
						||
  g_test_skip ("Testing interop with libdbus not supported");
 | 
						||
#endif /* !HAVE_DBUS1 */
 | 
						||
 | 
						||
  /* No practical effect, just to avoid -Wunused-label under some
 | 
						||
   * combinations of #ifdefs */
 | 
						||
  goto out;
 | 
						||
 | 
						||
out:
 | 
						||
  if (server != NULL)
 | 
						||
    g_dbus_server_stop (server);
 | 
						||
 | 
						||
  if (tmpdir != NULL)
 | 
						||
    g_assert_cmpstr (g_rmdir (tmpdir) == 0 ? "OK" : g_strerror (errno),
 | 
						||
                     ==, "OK");
 | 
						||
 | 
						||
  g_clear_object (&server);
 | 
						||
  g_clear_object (&observer);
 | 
						||
  g_free (guid);
 | 
						||
  g_free (listenable_address);
 | 
						||
  g_free (tmpdir);
 | 
						||
}
 | 
						||
 | 
						||
static void
 | 
						||
test_server_auth (void)
 | 
						||
{
 | 
						||
  do_test_server_auth (INTEROP_FLAGS_NONE);
 | 
						||
}
 | 
						||
 | 
						||
static void
 | 
						||
test_server_auth_abstract (void)
 | 
						||
{
 | 
						||
  do_test_server_auth (INTEROP_FLAGS_ABSTRACT);
 | 
						||
}
 | 
						||
 | 
						||
static void
 | 
						||
test_server_auth_tcp (void)
 | 
						||
{
 | 
						||
  do_test_server_auth (INTEROP_FLAGS_TCP);
 | 
						||
}
 | 
						||
 | 
						||
static void
 | 
						||
test_server_auth_anonymous (void)
 | 
						||
{
 | 
						||
  do_test_server_auth (INTEROP_FLAGS_ANONYMOUS);
 | 
						||
}
 | 
						||
 | 
						||
static void
 | 
						||
test_server_auth_anonymous_tcp (void)
 | 
						||
{
 | 
						||
  do_test_server_auth (INTEROP_FLAGS_ANONYMOUS | INTEROP_FLAGS_TCP);
 | 
						||
}
 | 
						||
 | 
						||
static void
 | 
						||
test_server_auth_external (void)
 | 
						||
{
 | 
						||
  do_test_server_auth (INTEROP_FLAGS_EXTERNAL);
 | 
						||
}
 | 
						||
 | 
						||
static void
 | 
						||
test_server_auth_external_require_same_user (void)
 | 
						||
{
 | 
						||
  do_test_server_auth (INTEROP_FLAGS_EXTERNAL | INTEROP_FLAGS_REQUIRE_SAME_USER);
 | 
						||
}
 | 
						||
 | 
						||
static void
 | 
						||
test_server_auth_sha1 (void)
 | 
						||
{
 | 
						||
  do_test_server_auth (INTEROP_FLAGS_SHA1);
 | 
						||
}
 | 
						||
 | 
						||
static void
 | 
						||
test_server_auth_sha1_tcp (void)
 | 
						||
{
 | 
						||
  do_test_server_auth (INTEROP_FLAGS_SHA1 | INTEROP_FLAGS_TCP);
 | 
						||
}
 | 
						||
 | 
						||
int
 | 
						||
main (int   argc,
 | 
						||
      char *argv[])
 | 
						||
{
 | 
						||
  g_test_init (&argc, &argv, G_TEST_OPTION_ISOLATE_DIRS, NULL);
 | 
						||
 | 
						||
  g_test_add_func ("/gdbus/server-auth", test_server_auth);
 | 
						||
  g_test_add_func ("/gdbus/server-auth/abstract", test_server_auth_abstract);
 | 
						||
  g_test_add_func ("/gdbus/server-auth/tcp", test_server_auth_tcp);
 | 
						||
  g_test_add_func ("/gdbus/server-auth/anonymous", test_server_auth_anonymous);
 | 
						||
  g_test_add_func ("/gdbus/server-auth/anonymous/tcp", test_server_auth_anonymous_tcp);
 | 
						||
  g_test_add_func ("/gdbus/server-auth/external", test_server_auth_external);
 | 
						||
  g_test_add_func ("/gdbus/server-auth/external/require-same-user", test_server_auth_external_require_same_user);
 | 
						||
  g_test_add_func ("/gdbus/server-auth/sha1", test_server_auth_sha1);
 | 
						||
  g_test_add_func ("/gdbus/server-auth/sha1/tcp", test_server_auth_sha1_tcp);
 | 
						||
 | 
						||
  return g_test_run();
 | 
						||
}
 |