Blame SOURCES/0002-libgdm-don-t-keep-manager-proxy-around-longer-than-w.patch

b61949
From 1a590b855f5b5d323334b49707778d4ee88ba873 Mon Sep 17 00:00:00 2001
b61949
From: Ray Strode <rstrode@redhat.com>
b61949
Date: Mon, 14 May 2018 15:57:14 -0400
b61949
Subject: [PATCH 02/15] libgdm: don't keep manager proxy around longer than we
b61949
 need it
b61949
MIME-Version: 1.0
b61949
Content-Type: text/plain; charset=UTF-8
b61949
Content-Transfer-Encoding: 8bit
b61949
b61949
Right now we keep the manager proxy alive long after we need it.
b61949
It doesn't get cleared until one of the other proxies go away.
b61949
b61949
That is not only unnecessary but illogical and confusing.
b61949
b61949
This commit changes the manager proxy to be transient—only alive
b61949
long enough to get what we need from it.
b61949
b61949
https://bugzilla.gnome.org/show_bug.cgi?id=795940
b61949
---
b61949
 libgdm/gdm-client.c | 119 ++++++++++----------------------------------
b61949
 1 file changed, 26 insertions(+), 93 deletions(-)
b61949
b61949
diff --git a/libgdm/gdm-client.c b/libgdm/gdm-client.c
b61949
index 06dfe725e..e02e3ea57 100644
b61949
--- a/libgdm/gdm-client.c
b61949
+++ b/libgdm/gdm-client.c
b61949
@@ -13,150 +13,130 @@
b61949
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
b61949
  * GNU General Public License for more details.
b61949
  *
b61949
  * You should have received a copy of the GNU General Public License
b61949
  * along with this program; if not, write to the Free Software
b61949
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
b61949
  *
b61949
  */
b61949
 
b61949
 #include "config.h"
b61949
 
b61949
 #include <stdlib.h>
b61949
 #include <stdio.h>
b61949
 #include <unistd.h>
b61949
 #include <string.h>
b61949
 
b61949
 #include <glib.h>
b61949
 #include <glib/gi18n.h>
b61949
 #include <glib-object.h>
b61949
 
b61949
 #include "gdm-client.h"
b61949
 #include "gdm-client-glue.h"
b61949
 #include "gdm-manager-glue.h"
b61949
 
b61949
 #define GDM_CLIENT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GDM_TYPE_CLIENT, GdmClientPrivate))
b61949
 
b61949
 #define SESSION_DBUS_PATH      "/org/gnome/DisplayManager/Session"
b61949
 
b61949
 struct GdmClientPrivate
b61949
 {
b61949
-        GdmManager         *manager;
b61949
-
b61949
         GdmUserVerifier    *user_verifier;
b61949
         GHashTable         *user_verifier_extensions;
b61949
 
b61949
         GdmGreeter         *greeter;
b61949
         GdmRemoteGreeter   *remote_greeter;
b61949
         GdmChooser         *chooser;
b61949
         GDBusConnection    *connection;
b61949
         char               *address;
b61949
 
b61949
         char              **enabled_extensions;
b61949
 };
b61949
 
b61949
 static void     gdm_client_class_init  (GdmClientClass *klass);
b61949
 static void     gdm_client_init        (GdmClient      *client);
b61949
 static void     gdm_client_finalize    (GObject        *object);
b61949
 
b61949
 G_DEFINE_TYPE (GdmClient, gdm_client, G_TYPE_OBJECT);
b61949
 
b61949
 static gpointer client_object = NULL;
b61949
 
b61949
 GQuark
b61949
 gdm_client_error_quark (void)
b61949
 {
b61949
         static GQuark error_quark = 0;
b61949
 
b61949
         if (error_quark == 0)
b61949
                 error_quark = g_quark_from_static_string ("gdm-client");
b61949
 
b61949
         return error_quark;
b61949
 }
b61949
 
b61949
 static void
b61949
-on_got_manager (GdmManager          *manager,
b61949
+on_got_manager (GObject             *object,
b61949
                 GAsyncResult        *result,
b61949
                 GTask               *task)
b61949
 {
b61949
         GdmClient *client;
b61949
-        GdmManager       *new_manager;
b61949
-        GError           *error;
b61949
+        GError    *error;
b61949
+        g_autoptr(GdmManager) manager = NULL;
b61949
 
b61949
         client = GDM_CLIENT (g_async_result_get_source_object (G_ASYNC_RESULT (task)));
b61949
 
b61949
         error = NULL;
b61949
-        new_manager = gdm_manager_proxy_new_finish (result, &error);
b61949
-
b61949
-        if (client->priv->manager == NULL) {
b61949
-                client->priv->manager = new_manager;
b61949
-
b61949
-        } else {
b61949
-                g_object_ref (client->priv->manager);
b61949
-                g_object_unref (new_manager);
b61949
-
b61949
-                g_clear_error (&error);
b61949
-        }
b61949
+        manager = gdm_manager_proxy_new_finish (result, &error);
b61949
 
b61949
         if (error != NULL) {
b61949
                 g_task_return_error (task, error);
b61949
         } else {
b61949
                 g_task_return_pointer (task,
b61949
-                                       g_object_ref (client->priv->manager),
b61949
+                                       g_object_ref (manager),
b61949
                                        (GDestroyNotify) g_object_unref);
b61949
         }
b61949
 
b61949
         g_object_unref (task);
b61949
         g_object_unref (client);
b61949
 }
b61949
 
b61949
 static void
b61949
 get_manager (GdmClient           *client,
b61949
              GCancellable        *cancellable,
b61949
              GAsyncReadyCallback  callback,
b61949
              gpointer             user_data)
b61949
 {
b61949
         GTask *task;
b61949
 
b61949
         task = g_task_new (G_OBJECT (client),
b61949
                            cancellable,
b61949
                            callback,
b61949
                            user_data);
b61949
 
b61949
-        if (client->priv->manager != NULL) {
b61949
-                g_task_return_pointer (task,
b61949
-                                       g_object_ref (client->priv->manager),
b61949
-                                       (GDestroyNotify) g_object_unref);
b61949
-                g_object_unref (task);
b61949
-                return;
b61949
-        }
b61949
-
b61949
         gdm_manager_proxy_new_for_bus (G_BUS_TYPE_SYSTEM,
b61949
                                        G_DBUS_PROXY_FLAGS_NONE,
b61949
                                        "org.gnome.DisplayManager",
b61949
                                        "/org/gnome/DisplayManager/Manager",
b61949
                                        cancellable,
b61949
                                        (GAsyncReadyCallback)
b61949
                                        on_got_manager,
b61949
                                        task);
b61949
 }
b61949
 
b61949
 typedef struct {
b61949
         GTask           *task;
b61949
         GdmUserVerifier *user_verifier;
b61949
 } UserVerifierData;
b61949
 
b61949
 static UserVerifierData *
b61949
 user_verifier_data_new (GTask *task, GdmUserVerifier *user_verifier)
b61949
 {
b61949
         UserVerifierData *data;
b61949
 
b61949
         data = g_slice_new (UserVerifierData);
b61949
         data->task = g_object_ref (task);
b61949
         data->user_verifier = g_object_ref (user_verifier);
b61949
 
b61949
         return data;
b61949
 }
b61949
 
b61949
 static void
b61949
 user_verifier_data_free (UserVerifierData *data)
b61949
 {
b61949
@@ -377,114 +357,113 @@ on_reauthentication_channel_opened (GdmManager         *manager,
b61949
         cancellable = g_task_get_cancellable (task);
b61949
         g_dbus_connection_new_for_address (address,
b61949
                                            G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT,
b61949
                                            NULL,
b61949
                                            cancellable,
b61949
                                            (GAsyncReadyCallback)
b61949
                                            on_reauthentication_channel_connected,
b61949
                                            task);
b61949
 }
b61949
 
b61949
 static void
b61949
 on_got_manager_for_reauthentication (GdmClient           *client,
b61949
                                      GAsyncResult        *result,
b61949
                                      GTask               *task)
b61949
 {
b61949
         GCancellable *cancellable;
b61949
         GdmManager   *manager;
b61949
         char         *username;
b61949
         GError       *error;
b61949
 
b61949
         error = NULL;
b61949
         manager = g_task_propagate_pointer (G_TASK (result), &error);
b61949
         if (manager == NULL) {
b61949
                 g_task_return_error (task, error);
b61949
                 g_object_unref (task);
b61949
                 return;
b61949
         }
b61949
 
b61949
         cancellable = g_task_get_cancellable (task);
b61949
         username = g_object_get_data (G_OBJECT (task), "username");
b61949
-        gdm_manager_call_open_reauthentication_channel (client->priv->manager,
b61949
+        gdm_manager_call_open_reauthentication_channel (manager,
b61949
                                                         username,
b61949
                                                         cancellable,
b61949
                                                         (GAsyncReadyCallback)
b61949
                                                         on_reauthentication_channel_opened,
b61949
                                                         task);
b61949
 
b61949
 }
b61949
 
b61949
 static gboolean
b61949
 gdm_client_open_connection_sync (GdmClient      *client,
b61949
                                  GCancellable   *cancellable,
b61949
                                  GError        **error)
b61949
 {
b61949
+        g_autoptr(GdmManager) manager = NULL;
b61949
         gboolean ret;
b61949
 
b61949
         g_return_val_if_fail (GDM_IS_CLIENT (client), FALSE);
b61949
 
b61949
         if (client->priv->connection != NULL) {
b61949
                 g_object_ref (client->priv->connection);
b61949
                 return TRUE;
b61949
         }
b61949
 
b61949
-        client->priv->manager = gdm_manager_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
b61949
-                                                                    G_DBUS_PROXY_FLAGS_NONE,
b61949
-                                                                    "org.gnome.DisplayManager",
b61949
-                                                                    "/org/gnome/DisplayManager/Manager",
b61949
-                                                                    cancellable,
b61949
-                                                                    error);
b61949
+        manager = gdm_manager_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
b61949
+                                                      G_DBUS_PROXY_FLAGS_NONE,
b61949
+                                                      "org.gnome.DisplayManager",
b61949
+                                                      "/org/gnome/DisplayManager/Manager",
b61949
+                                                      cancellable,
b61949
+                                                      error);
b61949
 
b61949
-        if (client->priv->manager == NULL) {
b61949
+        if (manager == NULL) {
b61949
                 goto out;
b61949
         }
b61949
 
b61949
-        ret = gdm_manager_call_open_session_sync (client->priv->manager,
b61949
+        ret = gdm_manager_call_open_session_sync (manager,
b61949
                                                   &client->priv->address,
b61949
                                                   cancellable,
b61949
                                                   error);
b61949
 
b61949
         if (!ret) {
b61949
-                g_clear_object (&client->priv->manager);
b61949
                 goto out;
b61949
         }
b61949
 
b61949
         g_debug ("GdmClient: connecting to address: %s", client->priv->address);
b61949
 
b61949
         client->priv->connection = g_dbus_connection_new_for_address_sync (client->priv->address,
b61949
                                                                            G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT,
b61949
                                                                            NULL,
b61949
                                                                            cancellable,
b61949
                                                                            error);
b61949
 
b61949
         if (client->priv->connection == NULL) {
b61949
-                g_clear_object (&client->priv->manager);
b61949
                 g_clear_pointer (&client->priv->address, g_free);
b61949
                 goto out;
b61949
         }
b61949
 
b61949
         g_object_add_weak_pointer (G_OBJECT (client->priv->connection),
b61949
                                    (gpointer *)
b61949
                                    &client->priv->connection);
b61949
 
b61949
  out:
b61949
         return client->priv->connection != NULL;
b61949
 }
b61949
 
b61949
 static void
b61949
 on_connected (GObject            *source_object,
b61949
               GAsyncResult       *result,
b61949
               GTask              *task)
b61949
 {
b61949
         GDBusConnection *connection;
b61949
         GError *error;
b61949
 
b61949
         error = NULL;
b61949
         connection = g_dbus_connection_new_for_address_finish (result, &error);
b61949
         if (!connection) {
b61949
                 g_task_return_error (task, error);
b61949
                 g_object_unref (task);
b61949
                 return;
b61949
         }
b61949
 
b61949
         g_task_return_pointer (task,
b61949
                                g_object_ref (connection),
b61949
@@ -517,61 +496,61 @@ on_session_opened (GdmManager         *manager,
b61949
 
b61949
         cancellable = g_task_get_cancellable (task);
b61949
         g_dbus_connection_new_for_address (client->priv->address,
b61949
                                            G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT,
b61949
                                            NULL,
b61949
                                            cancellable,
b61949
                                            (GAsyncReadyCallback)
b61949
                                            on_connected,
b61949
                                            task);
b61949
         g_object_unref (client);
b61949
 }
b61949
 
b61949
 static void
b61949
 on_got_manager_for_opening_connection (GdmClient           *client,
b61949
                                        GAsyncResult        *result,
b61949
                                        GTask               *task)
b61949
 {
b61949
         GCancellable *cancellable;
b61949
         GdmManager   *manager;
b61949
         GError       *error;
b61949
 
b61949
         error = NULL;
b61949
         manager = g_task_propagate_pointer (G_TASK (result), &error);
b61949
         if (manager == NULL) {
b61949
                 g_task_return_error (task, error);
b61949
                 g_object_unref (task);
b61949
                 return;
b61949
         }
b61949
 
b61949
         cancellable = g_task_get_cancellable (task);
b61949
-        gdm_manager_call_open_session (client->priv->manager,
b61949
+        gdm_manager_call_open_session (manager,
b61949
                                        cancellable,
b61949
                                        (GAsyncReadyCallback)
b61949
                                        on_session_opened,
b61949
                                        task);
b61949
 }
b61949
 
b61949
 static gboolean
b61949
 gdm_client_open_connection_finish (GdmClient      *client,
b61949
                                    GAsyncResult   *result,
b61949
                                    GError        **error)
b61949
 {
b61949
         g_autoptr(GDBusConnection) connection = NULL;
b61949
 
b61949
         g_return_val_if_fail (GDM_IS_CLIENT (client), FALSE);
b61949
 
b61949
         connection = g_task_propagate_pointer (G_TASK (result), error);
b61949
         if (connection == NULL) {
b61949
                 return FALSE;
b61949
         }
b61949
 
b61949
         if (client->priv->connection == NULL) {
b61949
                 client->priv->connection = g_steal_pointer (&connection);
b61949
                 g_object_add_weak_pointer (G_OBJECT (client->priv->connection),
b61949
                                            (gpointer *) &client->priv->connection);
b61949
         } else if (client->priv->connection == connection) {
b61949
                 connection = NULL;
b61949
         }
b61949
 
b61949
         return TRUE;
b61949
 }
b61949
@@ -600,122 +579,114 @@ gdm_client_open_connection (GdmClient           *client,
b61949
         }
b61949
 
b61949
         get_manager (client,
b61949
                      cancellable,
b61949
                      (GAsyncReadyCallback)
b61949
                      on_got_manager_for_opening_connection,
b61949
                      task);
b61949
 }
b61949
 
b61949
 /**
b61949
  * gdm_client_open_reauthentication_channel_sync:
b61949
  * @client: a #GdmClient
b61949
  * @username: user to reauthenticate
b61949
  * @cancellable: a #GCancellable
b61949
  * @error: a #GError
b61949
  *
b61949
  * Gets a #GdmUserVerifier object that can be used to
b61949
  * reauthenticate an already logged in user. Free with
b61949
  * g_object_unref to close reauthentication channel.
b61949
  *
b61949
  * Returns: (transfer full): #GdmUserVerifier or %NULL if @username is not
b61949
  * already logged in.
b61949
  */
b61949
 GdmUserVerifier *
b61949
 gdm_client_open_reauthentication_channel_sync (GdmClient     *client,
b61949
                                                const char    *username,
b61949
                                                GCancellable  *cancellable,
b61949
                                                GError       **error)
b61949
 {
b61949
         GDBusConnection *connection;
b61949
+        g_autoptr(GdmManager) manager = NULL;
b61949
         GdmUserVerifier *user_verifier = NULL;
b61949
         gboolean         ret;
b61949
         char            *address;
b61949
 
b61949
         g_return_val_if_fail (GDM_IS_CLIENT (client), FALSE);
b61949
 
b61949
-        if (client->priv->manager == NULL) {
b61949
-                client->priv->manager = gdm_manager_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
b61949
-                                                                            G_DBUS_PROXY_FLAGS_NONE,
b61949
-                                                                            "org.gnome.DisplayManager",
b61949
-                                                                            "/org/gnome/DisplayManager/Manager",
b61949
-                                                                            cancellable,
b61949
-                                                                            error);
b61949
+        manager = gdm_manager_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
b61949
+                                                      G_DBUS_PROXY_FLAGS_NONE,
b61949
+                                                      "org.gnome.DisplayManager",
b61949
+                                                      "/org/gnome/DisplayManager/Manager",
b61949
+                                                      cancellable,
b61949
+                                                      error);
b61949
 
b61949
-                if (client->priv->manager == NULL) {
b61949
-                        goto out;
b61949
-                }
b61949
-        } else {
b61949
-                client->priv->manager = g_object_ref (client->priv->manager);
b61949
+        if (manager == NULL) {
b61949
+                goto out;
b61949
         }
b61949
 
b61949
-        ret = gdm_manager_call_open_reauthentication_channel_sync (client->priv->manager,
b61949
+        ret = gdm_manager_call_open_reauthentication_channel_sync (manager,
b61949
                                                                    username,
b61949
                                                                    &address,
b61949
                                                                    cancellable,
b61949
                                                                    error);
b61949
 
b61949
         if (!ret) {
b61949
                 goto out;
b61949
         }
b61949
 
b61949
         g_debug ("GdmClient: connecting to address: %s", client->priv->address);
b61949
 
b61949
         connection = g_dbus_connection_new_for_address_sync (address,
b61949
                                                              G_DBUS_CONNECTION_FLAGS_AUTHENTICATION_CLIENT,
b61949
                                                              NULL,
b61949
                                                              cancellable,
b61949
                                                              error);
b61949
 
b61949
         if (connection == NULL) {
b61949
                 g_free (address);
b61949
                 goto out;
b61949
         }
b61949
         g_free (address);
b61949
 
b61949
         user_verifier = gdm_user_verifier_proxy_new_sync (connection,
b61949
                                                           G_DBUS_PROXY_FLAGS_NONE,
b61949
                                                           NULL,
b61949
                                                           SESSION_DBUS_PATH,
b61949
                                                           cancellable,
b61949
                                                           error);
b61949
 
b61949
         if (user_verifier != NULL) {
b61949
                 g_object_weak_ref (G_OBJECT (user_verifier),
b61949
                                    (GWeakNotify)
b61949
                                    g_object_unref,
b61949
                                    connection);
b61949
-
b61949
-                g_object_weak_ref (G_OBJECT (user_verifier),
b61949
-                                   (GWeakNotify)
b61949
-                                   g_clear_object,
b61949
-                                   &client->priv->manager);
b61949
         }
b61949
 
b61949
  out:
b61949
         return user_verifier;
b61949
 }
b61949
 
b61949
 /**
b61949
  * gdm_client_open_reauthentication_channel:
b61949
  * @client: a #GdmClient
b61949
  * @username: user to reauthenticate
b61949
  * @callback: a #GAsyncReadyCallback to call when the request is satisfied
b61949
  * @user_data: The data to pass to @callback
b61949
  * @cancellable: a #GCancellable
b61949
  *
b61949
  * Gets a #GdmUserVerifier object that can be used to
b61949
  * reauthenticate an already logged in user.
b61949
  */
b61949
 void
b61949
 gdm_client_open_reauthentication_channel (GdmClient           *client,
b61949
                                           const char          *username,
b61949
                                           GCancellable        *cancellable,
b61949
                                           GAsyncReadyCallback  callback,
b61949
                                           gpointer             user_data)
b61949
 {
b61949
         GTask *task;
b61949
 
b61949
         g_return_if_fail (GDM_IS_CLIENT (client));
b61949
 
b61949
         task = g_task_new (G_OBJECT (client),
b61949
                            cancellable,
b61949
@@ -764,64 +735,60 @@ gdm_client_open_reauthentication_channel_finish (GdmClient       *client,
b61949
  *
b61949
  * Gets a #GdmUserVerifier object that can be used to
b61949
  * verify a user's local account.
b61949
  *
b61949
  * Returns: (transfer full): #GdmUserVerifier or %NULL if not connected
b61949
  */
b61949
 GdmUserVerifier *
b61949
 gdm_client_get_user_verifier_sync (GdmClient     *client,
b61949
                                    GCancellable  *cancellable,
b61949
                                    GError       **error)
b61949
 {
b61949
         if (client->priv->user_verifier != NULL) {
b61949
                 return g_object_ref (client->priv->user_verifier);
b61949
         }
b61949
 
b61949
         if (!gdm_client_open_connection_sync (client, cancellable, error)) {
b61949
                 return NULL;
b61949
         }
b61949
 
b61949
         client->priv->user_verifier = gdm_user_verifier_proxy_new_sync (client->priv->connection,
b61949
                                                                         G_DBUS_PROXY_FLAGS_NONE,
b61949
                                                                         NULL,
b61949
                                                                         SESSION_DBUS_PATH,
b61949
                                                                         cancellable,
b61949
                                                                         error);
b61949
 
b61949
         if (client->priv->user_verifier != NULL) {
b61949
                 g_object_add_weak_pointer (G_OBJECT (client->priv->user_verifier),
b61949
                                            (gpointer *)
b61949
                                            &client->priv->user_verifier);
b61949
-                g_object_weak_ref (G_OBJECT (client->priv->user_verifier),
b61949
-                                   (GWeakNotify)
b61949
-                                   g_clear_object,
b61949
-                                   &client->priv->manager);
b61949
                 g_object_weak_ref (G_OBJECT (client->priv->user_verifier),
b61949
                                    (GWeakNotify)
b61949
                                    g_object_unref,
b61949
                                    client->priv->connection);
b61949
 
b61949
                 if (client->priv->enabled_extensions != NULL) {
b61949
                         gboolean res;
b61949
 
b61949
                         client->priv->user_verifier_extensions = g_hash_table_new_full (g_str_hash,
b61949
                                                                                         g_str_equal,
b61949
                                                                                         NULL,
b61949
                                                                                         (GDestroyNotify)
b61949
                                                                                         free_interface_skeleton);
b61949
                         res = gdm_user_verifier_call_enable_extensions_sync (client->priv->user_verifier,
b61949
                                                                             (const char * const *)
b61949
                                                                              client->priv->enabled_extensions,
b61949
                                                                              cancellable,
b61949
                                                                              NULL);
b61949
 
b61949
                         if (res) {
b61949
                                 size_t i;
b61949
                                 for (i = 0; client->priv->enabled_extensions[i] != NULL; i++) {
b61949
                                             if (strcmp (client->priv->enabled_extensions[i],
b61949
                                                         gdm_user_verifier_choice_list_interface_info ()->name) == 0) {
b61949
                                                         GdmUserVerifierChoiceList *choice_list_interface;
b61949
                                                         choice_list_interface = gdm_user_verifier_choice_list_proxy_new_sync (client->priv->connection,
b61949
                                                                                                                               G_DBUS_PROXY_FLAGS_NONE,
b61949
                                                                                                                               NULL,
b61949
                                                                                                                               SESSION_DBUS_PATH,
b61949
                                                                                                                               cancellable,
b61949
@@ -914,65 +881,60 @@ gdm_client_get_user_verifier (GdmClient           *client,
b61949
  *
b61949
  * Returns: (transfer full): a #GdmUserVerifier
b61949
  */
b61949
 GdmUserVerifier *
b61949
 gdm_client_get_user_verifier_finish (GdmClient       *client,
b61949
                                      GAsyncResult    *result,
b61949
                                      GError         **error)
b61949
 {
b61949
         GdmUserVerifier *user_verifier;
b61949
 
b61949
         g_return_val_if_fail (GDM_IS_CLIENT (client), FALSE);
b61949
 
b61949
         if (client->priv->user_verifier != NULL)
b61949
                 return g_object_ref (client->priv->user_verifier);
b61949
 
b61949
         user_verifier = g_task_propagate_pointer (G_TASK (result), error);
b61949
         if (user_verifier == NULL)
b61949
                 return NULL;
b61949
 
b61949
         client->priv->user_verifier = user_verifier;
b61949
 
b61949
         g_object_add_weak_pointer (G_OBJECT (client->priv->user_verifier),
b61949
                                    (gpointer *)
b61949
                                    &client->priv->user_verifier);
b61949
 
b61949
         g_object_weak_ref (G_OBJECT (client->priv->user_verifier),
b61949
                            (GWeakNotify)
b61949
                            g_object_unref,
b61949
                            client->priv->connection);
b61949
 
b61949
-        g_object_weak_ref (G_OBJECT (client->priv->user_verifier),
b61949
-                           (GWeakNotify)
b61949
-                           g_clear_object,
b61949
-                           &client->priv->manager);
b61949
-
b61949
         return user_verifier;
b61949
 }
b61949
 
b61949
 /**
b61949
  * gdm_client_get_user_verifier_choice_list:
b61949
  * @client: a #GdmClient
b61949
  *
b61949
  * Gets a #GdmUserVerifierChoiceList object that can be used to
b61949
  * verify a user's local account.
b61949
  *
b61949
  * Returns: (transfer none): #GdmUserVerifierChoiceList or %NULL if user
b61949
  * verifier isn't yet fetched, or daemon doesn't support choice lists
b61949
  */
b61949
 GdmUserVerifierChoiceList *
b61949
 gdm_client_get_user_verifier_choice_list (GdmClient *client)
b61949
 {
b61949
         if (client->priv->user_verifier_extensions == NULL)
b61949
                 return NULL;
b61949
 
b61949
         return g_hash_table_lookup (client->priv->user_verifier_extensions,
b61949
                                     gdm_user_verifier_choice_list_interface_info ()->name);
b61949
 }
b61949
 
b61949
 static void
b61949
 on_timed_login_details_got (GdmGreeter   *greeter,
b61949
                             GAsyncResult *result)
b61949
 {
b61949
     gdm_greeter_call_get_timed_login_details_finish (greeter, NULL, NULL, NULL, result, NULL);
b61949
 }
b61949
 
b61949
@@ -1088,110 +1050,100 @@ gdm_client_get_greeter (GdmClient           *client,
b61949
  * gdm_client_get_greeter().
b61949
  *
b61949
  * Returns: (transfer full): a #GdmGreeter
b61949
  */
b61949
 GdmGreeter *
b61949
 gdm_client_get_greeter_finish (GdmClient       *client,
b61949
                                GAsyncResult    *result,
b61949
                                GError         **error)
b61949
 {
b61949
         GdmGreeter *greeter;
b61949
 
b61949
         g_return_val_if_fail (GDM_IS_CLIENT (client), FALSE);
b61949
 
b61949
         if (client->priv->greeter != NULL)
b61949
                 return g_object_ref (client->priv->greeter);
b61949
 
b61949
         greeter = g_task_propagate_pointer (G_TASK (result), error);
b61949
         if (greeter == NULL)
b61949
                 return NULL;
b61949
 
b61949
         client->priv->greeter = greeter;
b61949
 
b61949
         g_object_add_weak_pointer (G_OBJECT (client->priv->greeter),
b61949
                                    (gpointer *)
b61949
                                    &client->priv->greeter);
b61949
 
b61949
         g_object_weak_ref (G_OBJECT (client->priv->greeter),
b61949
                            (GWeakNotify)
b61949
                            g_object_unref,
b61949
                            client->priv->connection);
b61949
-
b61949
-        g_object_weak_ref (G_OBJECT (client->priv->greeter),
b61949
-                           (GWeakNotify)
b61949
-                           g_clear_object,
b61949
-                           &client->priv->manager);
b61949
-
b61949
         return greeter;
b61949
 }
b61949
 
b61949
 /**
b61949
  * gdm_client_get_greeter_sync:
b61949
  * @client: a #GdmClient
b61949
  * @cancellable: a #GCancellable
b61949
  * @error: a #GError
b61949
  *
b61949
  * Gets a #GdmGreeter object that can be used
b61949
  * to do do various login screen related tasks, such
b61949
  * as selecting a users session, and starting that
b61949
  * session.
b61949
  *
b61949
  * Returns: (transfer full): #GdmGreeter or %NULL if caller is not a greeter
b61949
  */
b61949
 GdmGreeter *
b61949
 gdm_client_get_greeter_sync (GdmClient     *client,
b61949
                              GCancellable  *cancellable,
b61949
                              GError       **error)
b61949
 {
b61949
         if (client->priv->greeter != NULL) {
b61949
                 return g_object_ref (client->priv->greeter);
b61949
         }
b61949
 
b61949
         if (!gdm_client_open_connection_sync (client, cancellable, error)) {
b61949
                 return NULL;
b61949
         }
b61949
 
b61949
         client->priv->greeter = gdm_greeter_proxy_new_sync (client->priv->connection,
b61949
                                                             G_DBUS_PROXY_FLAGS_NONE,
b61949
                                                             NULL,
b61949
                                                             SESSION_DBUS_PATH,
b61949
                                                             cancellable,
b61949
                                                             error);
b61949
 
b61949
         if (client->priv->greeter != NULL) {
b61949
                 g_object_add_weak_pointer (G_OBJECT (client->priv->greeter),
b61949
                                            (gpointer *)
b61949
                                            &client->priv->greeter);
b61949
-                g_object_weak_ref (G_OBJECT (client->priv->greeter),
b61949
-                                   (GWeakNotify)
b61949
-                                   g_clear_object,
b61949
-                                   &client->priv->manager);
b61949
                 g_object_weak_ref (G_OBJECT (client->priv->greeter),
b61949
                                    (GWeakNotify)
b61949
                                    g_object_unref,
b61949
                                    client->priv->connection);
b61949
 
b61949
                 query_for_timed_login_requested_signal (client->priv->greeter);
b61949
         }
b61949
 
b61949
         return client->priv->greeter;
b61949
 }
b61949
 
b61949
 static void
b61949
 on_remote_greeter_proxy_created (GObject            *object,
b61949
                                  GAsyncResult       *result,
b61949
                                  GTask              *task)
b61949
 {
b61949
         GdmRemoteGreeter *remote_greeter;
b61949
         GError           *error = NULL;
b61949
 
b61949
         remote_greeter = gdm_remote_greeter_proxy_new_finish (result, &error);
b61949
         if (remote_greeter == NULL) {
b61949
                 g_task_return_error (task, error);
b61949
                 g_object_unref (task);
b61949
                 return;
b61949
         }
b61949
 
b61949
         g_task_return_pointer (task,
b61949
                                remote_greeter,
b61949
                                (GDestroyNotify) g_object_unref);
b61949
         g_object_unref (task);
b61949
@@ -1274,108 +1226,99 @@ gdm_client_get_remote_greeter (GdmClient           *client,
b61949
  *
b61949
  * Returns: (transfer full): a #GdmRemoteGreeter
b61949
  */
b61949
 GdmRemoteGreeter *
b61949
 gdm_client_get_remote_greeter_finish (GdmClient     *client,
b61949
                                       GAsyncResult  *result,
b61949
                                       GError       **error)
b61949
 {
b61949
         GdmRemoteGreeter *remote_greeter;
b61949
 
b61949
         g_return_val_if_fail (GDM_IS_CLIENT (client), FALSE);
b61949
 
b61949
         if (client->priv->remote_greeter != NULL)
b61949
                 return g_object_ref (client->priv->remote_greeter);
b61949
 
b61949
         remote_greeter = g_task_propagate_pointer (G_TASK (result), error);
b61949
         if (remote_greeter == NULL)
b61949
                 return NULL;
b61949
 
b61949
         client->priv->remote_greeter = remote_greeter;
b61949
 
b61949
         g_object_add_weak_pointer (G_OBJECT (client->priv->remote_greeter),
b61949
                                    (gpointer *)
b61949
                                    &client->priv->remote_greeter);
b61949
 
b61949
         g_object_weak_ref (G_OBJECT (client->priv->remote_greeter),
b61949
                            (GWeakNotify)
b61949
                            g_object_unref,
b61949
                            client->priv->connection);
b61949
 
b61949
-        g_object_weak_ref (G_OBJECT (client->priv->remote_greeter),
b61949
-                           (GWeakNotify)
b61949
-                           g_clear_object,
b61949
-                           &client->priv->manager);
b61949
-
b61949
         return remote_greeter;
b61949
 }
b61949
 
b61949
 /**
b61949
  * gdm_client_get_remote_greeter_sync:
b61949
  * @client: a #GdmClient
b61949
  * @cancellable: a #GCancellable
b61949
  * @error: a #GError
b61949
  *
b61949
  * Gets a #GdmRemoteGreeter object that can be used
b61949
  * to do do various remote login screen related tasks,
b61949
  * such as disconnecting.
b61949
  *
b61949
  * Returns: (transfer full): #GdmRemoteGreeter or %NULL if caller is not remote
b61949
  */
b61949
 GdmRemoteGreeter *
b61949
 gdm_client_get_remote_greeter_sync (GdmClient     *client,
b61949
                                     GCancellable  *cancellable,
b61949
                                     GError       **error)
b61949
 {
b61949
         if (client->priv->remote_greeter != NULL) {
b61949
                 return g_object_ref (client->priv->remote_greeter);
b61949
         }
b61949
 
b61949
         if (!gdm_client_open_connection_sync (client, cancellable, error)) {
b61949
                 return NULL;
b61949
         }
b61949
 
b61949
         client->priv->remote_greeter = gdm_remote_greeter_proxy_new_sync (client->priv->connection,
b61949
                                                                           G_DBUS_PROXY_FLAGS_NONE,
b61949
                                                                           NULL,
b61949
                                                                           SESSION_DBUS_PATH,
b61949
                                                                           cancellable,
b61949
                                                                           error);
b61949
 
b61949
         if (client->priv->remote_greeter != NULL) {
b61949
                 g_object_add_weak_pointer (G_OBJECT (client->priv->remote_greeter),
b61949
                                            (gpointer *)
b61949
                                            &client->priv->remote_greeter);
b61949
-                g_object_weak_ref (G_OBJECT (client->priv->remote_greeter),
b61949
-                                   (GWeakNotify)
b61949
-                                   g_clear_object,
b61949
-                                   &client->priv->manager);
b61949
                 g_object_weak_ref (G_OBJECT (client->priv->remote_greeter),
b61949
                                    (GWeakNotify)
b61949
                                    g_object_unref,
b61949
                                    client->priv->connection);
b61949
         }
b61949
 
b61949
         return client->priv->remote_greeter;
b61949
 }
b61949
 
b61949
 static void
b61949
 on_chooser_proxy_created (GObject            *source,
b61949
                           GAsyncResult       *result,
b61949
                           GTask              *task)
b61949
 {
b61949
         GdmChooser   *chooser;
b61949
         GError       *error = NULL;
b61949
 
b61949
         chooser = gdm_chooser_proxy_new_finish (result, &error);
b61949
         if (chooser == NULL) {
b61949
                 g_task_return_error (task, error);
b61949
                 g_object_unref (task);
b61949
                 return;
b61949
         }
b61949
 
b61949
         g_task_return_pointer (task,
b61949
                                chooser,
b61949
                                (GDestroyNotify) g_object_unref);
b61949
         g_object_unref (task);
b61949
 }
b61949
 
b61949
@@ -1456,109 +1399,100 @@ gdm_client_get_chooser (GdmClient           *client,
b61949
  *
b61949
  * Returns: (transfer full): a #GdmChooser
b61949
  */
b61949
 GdmChooser *
b61949
 gdm_client_get_chooser_finish (GdmClient       *client,
b61949
                                GAsyncResult    *result,
b61949
                                GError         **error)
b61949
 {
b61949
         GdmChooser *chooser;
b61949
 
b61949
         g_return_val_if_fail (GDM_IS_CLIENT (client), FALSE);
b61949
 
b61949
         if (client->priv->chooser != NULL)
b61949
                 return g_object_ref (client->priv->chooser);
b61949
 
b61949
         chooser = g_task_propagate_pointer (G_TASK (result), error);
b61949
         if (chooser == NULL)
b61949
                 return NULL;
b61949
 
b61949
         client->priv->chooser = chooser;
b61949
 
b61949
         g_object_add_weak_pointer (G_OBJECT (client->priv->chooser),
b61949
                                    (gpointer *)
b61949
                                    &client->priv->chooser);
b61949
 
b61949
         g_object_weak_ref (G_OBJECT (client->priv->chooser),
b61949
                            (GWeakNotify)
b61949
                            g_object_unref,
b61949
                            client->priv->connection);
b61949
 
b61949
-        g_object_weak_ref (G_OBJECT (client->priv->chooser),
b61949
-                           (GWeakNotify)
b61949
-                           g_clear_object,
b61949
-                           &client->priv->manager);
b61949
-
b61949
         return chooser;
b61949
 }
b61949
 
b61949
 /**
b61949
  * gdm_client_get_chooser_sync:
b61949
  * @client: a #GdmClient
b61949
  * @cancellable: a #GCancellable
b61949
  * @error: a #GError
b61949
  *
b61949
  * Gets a #GdmChooser object that can be used
b61949
  * to do do various XDMCP chooser related tasks, such
b61949
  * as selecting a host or disconnecting.
b61949
  *
b61949
  * Returns: (transfer full): #GdmChooser or %NULL if caller is not a chooser
b61949
  */
b61949
 GdmChooser *
b61949
 gdm_client_get_chooser_sync (GdmClient     *client,
b61949
                              GCancellable  *cancellable,
b61949
                              GError       **error)
b61949
 {
b61949
 
b61949
         if (client->priv->chooser != NULL) {
b61949
                 return g_object_ref (client->priv->chooser);
b61949
         }
b61949
 
b61949
         if (!gdm_client_open_connection_sync (client, cancellable, error)) {
b61949
                 return NULL;
b61949
         }
b61949
 
b61949
         client->priv->chooser = gdm_chooser_proxy_new_sync (client->priv->connection,
b61949
                                                             G_DBUS_PROXY_FLAGS_NONE,
b61949
                                                             NULL,
b61949
                                                             SESSION_DBUS_PATH,
b61949
                                                             cancellable,
b61949
                                                             error);
b61949
 
b61949
         if (client->priv->chooser != NULL) {
b61949
                 g_object_add_weak_pointer (G_OBJECT (client->priv->chooser),
b61949
                                            (gpointer *)
b61949
                                            &client->priv->chooser);
b61949
-                g_object_weak_ref (G_OBJECT (client->priv->chooser),
b61949
-                                   (GWeakNotify)
b61949
-                                   g_clear_object,
b61949
-                                   &client->priv->manager);
b61949
                 g_object_weak_ref (G_OBJECT (client->priv->chooser),
b61949
                                    (GWeakNotify)
b61949
                                    g_object_unref,
b61949
                                    client->priv->connection);
b61949
         }
b61949
 
b61949
         return client->priv->chooser;
b61949
 }
b61949
 
b61949
 static void
b61949
 gdm_client_class_init (GdmClientClass *klass)
b61949
 {
b61949
         GObjectClass   *object_class = G_OBJECT_CLASS (klass);
b61949
 
b61949
         object_class->finalize = gdm_client_finalize;
b61949
 
b61949
         g_type_class_add_private (klass, sizeof (GdmClientPrivate));
b61949
 
b61949
 }
b61949
 
b61949
 static void
b61949
 gdm_client_init (GdmClient *client)
b61949
 {
b61949
 
b61949
         client->priv = GDM_CLIENT_GET_PRIVATE (client);
b61949
 }
b61949
 
b61949
 static void
b61949
 gdm_client_finalize (GObject *object)
b61949
 {
b61949
@@ -1574,61 +1508,60 @@ gdm_client_finalize (GObject *object)
b61949
         if (client->priv->user_verifier != NULL) {
b61949
                 g_object_remove_weak_pointer (G_OBJECT (client->priv->user_verifier),
b61949
                                               (gpointer *)
b61949
                                               &client->priv->user_verifier);
b61949
         }
b61949
 
b61949
         if (client->priv->greeter != NULL) {
b61949
                 g_object_remove_weak_pointer (G_OBJECT (client->priv->greeter),
b61949
                                               (gpointer *)
b61949
                                               &client->priv->greeter);
b61949
         }
b61949
 
b61949
         if (client->priv->remote_greeter != NULL) {
b61949
                 g_object_remove_weak_pointer (G_OBJECT (client->priv->remote_greeter),
b61949
                                               (gpointer *)
b61949
                                               &client->priv->remote_greeter);
b61949
         }
b61949
 
b61949
         if (client->priv->chooser != NULL) {
b61949
                 g_object_remove_weak_pointer (G_OBJECT (client->priv->chooser),
b61949
                                               (gpointer *)
b61949
                                               &client->priv->chooser);
b61949
         }
b61949
 
b61949
         if (client->priv->connection != NULL) {
b61949
                 g_object_remove_weak_pointer (G_OBJECT (client->priv->connection),
b61949
                                               (gpointer *)
b61949
                                               &client->priv->connection);
b61949
         }
b61949
 
b61949
-        g_clear_object (&client->priv->manager);
b61949
         g_clear_object (&client->priv->connection);
b61949
 
b61949
         g_strfreev (client->priv->enabled_extensions);
b61949
         g_free (client->priv->address);
b61949
 
b61949
         G_OBJECT_CLASS (gdm_client_parent_class)->finalize (object);
b61949
 }
b61949
 
b61949
 GdmClient *
b61949
 gdm_client_new (void)
b61949
 {
b61949
         if (client_object != NULL) {
b61949
                 g_object_ref (client_object);
b61949
         } else {
b61949
                 client_object = g_object_new (GDM_TYPE_CLIENT, NULL);
b61949
                 g_object_add_weak_pointer (client_object,
b61949
                                            (gpointer *) &client_object);
b61949
         }
b61949
 
b61949
         return GDM_CLIENT (client_object);
b61949
 }
b61949
 
b61949
 
b61949
 /**
b61949
  * gdm_client_set_enabled_extensions:
b61949
  * @client: a #GdmClient
b61949
  * @extensions: (array zero-terminated=1) (element-type utf8): a list of extensions
b61949
  *
b61949
  * Enables GDM's pam extensions.  Currently, only
b61949
  * org.gnome.DisplayManager.UserVerifier.ChoiceList is supported.
b61949
-- 
b61949
2.26.2
b61949