Blame SOURCES/fix-timed-login.patch

ef3d3d
From a45940c9eb4ac9874e4bd2d6374b0d855d8954fe Mon Sep 17 00:00:00 2001
ef3d3d
From: "Jasper St. Pierre" <jstpierre@mecheye.net>
ef3d3d
Date: Thu, 13 Feb 2014 14:52:49 -0500
ef3d3d
Subject: [PATCH 1/4] display: Clean up get_timed_login_details
ef3d3d
ef3d3d
Make it properly log itself as a GdmDisplay method, and use
ef3d3d
local variables to ensure that callers can pass NULL.
ef3d3d
---
ef3d3d
 daemon/gdm-display.c | 34 ++++++++++++++++++++++++++--------
ef3d3d
 1 file changed, 26 insertions(+), 8 deletions(-)
ef3d3d
ef3d3d
diff --git a/daemon/gdm-display.c b/daemon/gdm-display.c
ef3d3d
index 352dd92..5d06036 100644
ef3d3d
--- a/daemon/gdm-display.c
ef3d3d
+++ b/daemon/gdm-display.c
ef3d3d
@@ -426,20 +426,38 @@ gdm_display_real_get_timed_login_details (GdmDisplay *display,
ef3d3d
 
ef3d3d
 gboolean
ef3d3d
 gdm_display_get_timed_login_details (GdmDisplay *display,
ef3d3d
-                                     gboolean   *enabled,
ef3d3d
-                                     char      **username,
ef3d3d
-                                     int        *delay,
ef3d3d
+                                     gboolean   *out_enabled,
ef3d3d
+                                     char      **out_username,
ef3d3d
+                                     int        *out_delay,
ef3d3d
                                      GError    **error)
ef3d3d
 {
ef3d3d
+        gboolean enabled;
ef3d3d
+        char *username;
ef3d3d
+        int delay;
ef3d3d
+
ef3d3d
         g_return_val_if_fail (GDM_IS_DISPLAY (display), FALSE);
ef3d3d
 
ef3d3d
-        GDM_DISPLAY_GET_CLASS (display)->get_timed_login_details (display, enabled, username, delay);
ef3d3d
+        GDM_DISPLAY_GET_CLASS (display)->get_timed_login_details (display, &enabled, &username, &delay);
ef3d3d
 
ef3d3d
-        g_debug ("GdmSlave: Got timed login details for display %s: %d '%s' %d",
ef3d3d
+        g_debug ("GdmDisplay: Got timed login details for display %s: %d '%s' %d",
ef3d3d
                  display->priv->x11_display_name,
ef3d3d
-                 *enabled,
ef3d3d
-                 *username ? *username : "(null)",
ef3d3d
-                 *delay);
ef3d3d
+                 enabled,
ef3d3d
+                 username,
ef3d3d
+                 delay);
ef3d3d
+
ef3d3d
+        if (out_enabled) {
ef3d3d
+                *out_enabled = enabled;
ef3d3d
+        }
ef3d3d
+
ef3d3d
+        if (out_username) {
ef3d3d
+                *out_username = username;
ef3d3d
+        } else {
ef3d3d
+                g_free (username);
ef3d3d
+        }
ef3d3d
+
ef3d3d
+        if (out_delay) {
ef3d3d
+                *out_delay = delay;
ef3d3d
+        }
ef3d3d
 
ef3d3d
         return TRUE;
ef3d3d
 }
ef3d3d
-- 
ef3d3d
1.8.3.1
ef3d3d
ef3d3d
ef3d3d
From ab639086db4f694722fa1c83046bfc503e790894 Mon Sep 17 00:00:00 2001
ef3d3d
From: Vadim Rutkovsky <vrutkovs@redhat.com>
ef3d3d
Date: Fri, 30 May 2014 20:33:49 +0200
ef3d3d
Subject: [PATCH 2/4] Add debug messages for timed login
ef3d3d
ef3d3d
---
ef3d3d
 daemon/gdm-session.c      | 1 +
ef3d3d
 daemon/gdm-simple-slave.c | 2 ++
ef3d3d
 2 files changed, 3 insertions(+)
ef3d3d
ef3d3d
diff --git a/daemon/gdm-session.c b/daemon/gdm-session.c
ef3d3d
index 4a749d3..6a7d570 100644
ef3d3d
--- a/daemon/gdm-session.c
ef3d3d
+++ b/daemon/gdm-session.c
ef3d3d
@@ -2604,6 +2604,7 @@ gdm_session_request_timed_login (GdmSession *self,
ef3d3d
                                  const char *username,
ef3d3d
                                  int         delay)
ef3d3d
 {
ef3d3d
+        g_debug ("GdmSession: requesting timed login");
ef3d3d
         if (self->priv->greeter_interface != NULL) {
ef3d3d
                 gdm_dbus_greeter_emit_timed_login_requested (self->priv->greeter_interface,
ef3d3d
                                                              username,
ef3d3d
diff --git a/daemon/gdm-simple-slave.c b/daemon/gdm-simple-slave.c
ef3d3d
index d83216b..f08f7ad 100644
ef3d3d
--- a/daemon/gdm-simple-slave.c
ef3d3d
+++ b/daemon/gdm-simple-slave.c
ef3d3d
@@ -721,6 +721,7 @@ on_ready_to_request_timed_login (GdmSession         *session,
ef3d3d
                                  GSimpleAsyncResult *result,
ef3d3d
                                  gpointer           *user_data)
ef3d3d
 {
ef3d3d
+        g_debug ("GdmSimpleSlave: ready to request timed login");
ef3d3d
         int delay = GPOINTER_TO_INT (user_data);
ef3d3d
         GCancellable *cancellable;
ef3d3d
         char         *username;
ef3d3d
@@ -754,6 +755,7 @@ on_ready_to_request_timed_login (GdmSession         *session,
ef3d3d
 static gboolean
ef3d3d
 on_wait_for_greeter_timeout (GSimpleAsyncResult *result)
ef3d3d
 {
ef3d3d
+        g_debug ("GdmSimpleSlave: wait for greeter timeout");
ef3d3d
         g_simple_async_result_complete (result);
ef3d3d
 
ef3d3d
         return FALSE;
ef3d3d
-- 
ef3d3d
1.8.3.1
ef3d3d
ef3d3d
ef3d3d
From ad879ccbfb4bfc0908b0ca3d256c42d034ae16c7 Mon Sep 17 00:00:00 2001
ef3d3d
From: Ray Strode <rstrode@redhat.com>
ef3d3d
Date: Thu, 5 Jun 2014 17:01:48 -0400
ef3d3d
Subject: [PATCH 3/4] manager: close up timed login race
ef3d3d
ef3d3d
Previously we would emit the timed-login-requested signal after the
ef3d3d
client connects, which might be before it was listening for the
ef3d3d
signal.
ef3d3d
ef3d3d
Now we only emit the signal in direct response to a GetTimedLoginDetails
ef3d3d
call, which we make implicitly when the appropiate proxy interface is
ef3d3d
set up.
ef3d3d
ef3d3d
https://bugzilla.gnome.org/show_bug.cgi?id=680348
ef3d3d
---
ef3d3d
 daemon/gdm-session.c      | 44 ++++++++++++++++++-----
ef3d3d
 daemon/gdm-session.h      |  2 +-
ef3d3d
 daemon/gdm-session.xml    |  5 +++
ef3d3d
 daemon/gdm-simple-slave.c | 92 +----------------------------------------------
ef3d3d
 gui/libgdm/gdm-client.c   | 23 ++++++++++++
ef3d3d
 5 files changed, 65 insertions(+), 101 deletions(-)
ef3d3d
ef3d3d
diff --git a/daemon/gdm-session.c b/daemon/gdm-session.c
ef3d3d
index 6a7d570..e2e357f 100644
ef3d3d
--- a/daemon/gdm-session.c
ef3d3d
+++ b/daemon/gdm-session.c
ef3d3d
@@ -89,6 +89,10 @@ struct _GdmSessionPrivate
ef3d3d
         char                *selected_user;
ef3d3d
         char                *user_x11_authority_file;
ef3d3d
 
ef3d3d
+        char                *timed_login_username;
ef3d3d
+        int                  timed_login_delay;
ef3d3d
+        GList               *pending_timed_login_invocations;
ef3d3d
+
ef3d3d
         GHashTable          *conversations;
ef3d3d
 
ef3d3d
         GdmSessionConversation *session_conversation;
ef3d3d
@@ -1319,6 +1323,27 @@ gdm_session_handle_client_start_session_when_ready (GdmDBusGreeter        *greet
ef3d3d
 }
ef3d3d
 
ef3d3d
 static gboolean
ef3d3d
+gdm_session_handle_get_timed_login_details (GdmDBusGreeter        *greeter_interface,
ef3d3d
+                                            GDBusMethodInvocation *invocation,
ef3d3d
+                                            GdmSession            *self)
ef3d3d
+{
ef3d3d
+
ef3d3d
+        if (self->priv->greeter_interface != NULL) {
ef3d3d
+                gdm_dbus_greeter_complete_get_timed_login_details (greeter_interface,
ef3d3d
+                                                                   invocation,
ef3d3d
+                                                                   self->priv->timed_login_username != NULL,
ef3d3d
+                                                                   self->priv->timed_login_username != NULL? self->priv->timed_login_username : "",
ef3d3d
+                                                                   self->priv->timed_login_delay);
ef3d3d
+                if (self->priv->timed_login_username != NULL) {
ef3d3d
+                        gdm_dbus_greeter_emit_timed_login_requested (self->priv->greeter_interface,
ef3d3d
+                                                                     self->priv->timed_login_username,
ef3d3d
+                                                                     self->priv->timed_login_delay);
ef3d3d
+                }
ef3d3d
+        }
ef3d3d
+        return TRUE;
ef3d3d
+}
ef3d3d
+
ef3d3d
+static gboolean
ef3d3d
 gdm_session_handle_client_begin_auto_login (GdmDBusGreeter        *greeter_interface,
ef3d3d
                                             GDBusMethodInvocation *invocation,
ef3d3d
                                             const char            *username,
ef3d3d
@@ -1395,6 +1420,10 @@ export_greeter_interface (GdmSession      *self,
ef3d3d
                           "handle-start-session-when-ready",
ef3d3d
                           G_CALLBACK (gdm_session_handle_client_start_session_when_ready),
ef3d3d
                           self);
ef3d3d
+        g_signal_connect (greeter_interface,
ef3d3d
+                          "handle-get-timed-login-details",
ef3d3d
+                          G_CALLBACK (gdm_session_handle_get_timed_login_details),
ef3d3d
+                          self);
ef3d3d
 
ef3d3d
         g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (greeter_interface),
ef3d3d
                                           connection,
ef3d3d
@@ -2600,16 +2629,13 @@ gdm_session_reset (GdmSession *self)
ef3d3d
 }
ef3d3d
 
ef3d3d
 void
ef3d3d
-gdm_session_request_timed_login (GdmSession *self,
ef3d3d
-                                 const char *username,
ef3d3d
-                                 int         delay)
ef3d3d
+gdm_session_set_timed_login_details (GdmSession *self,
ef3d3d
+                                     const char *username,
ef3d3d
+                                     int         delay)
ef3d3d
 {
ef3d3d
-        g_debug ("GdmSession: requesting timed login");
ef3d3d
-        if (self->priv->greeter_interface != NULL) {
ef3d3d
-                gdm_dbus_greeter_emit_timed_login_requested (self->priv->greeter_interface,
ef3d3d
-                                                             username,
ef3d3d
-                                                             delay);
ef3d3d
-        }
ef3d3d
+        g_debug ("GdmSession: timed login details %s %d", username, delay);
ef3d3d
+        self->priv->timed_login_username = g_strdup (username);
ef3d3d
+        self->priv->timed_login_delay = delay;
ef3d3d
 }
ef3d3d
 
ef3d3d
 gboolean
ef3d3d
diff --git a/daemon/gdm-session.h b/daemon/gdm-session.h
ef3d3d
index 8b93e2c..14a1721 100644
ef3d3d
--- a/daemon/gdm-session.h
ef3d3d
+++ b/daemon/gdm-session.h
ef3d3d
@@ -158,7 +158,7 @@ void              gdm_session_select_user                 (GdmSession *session,
ef3d3d
                                                            const char *username);
ef3d3d
 void              gdm_session_cancel                      (GdmSession *session);
ef3d3d
 void              gdm_session_reset                       (GdmSession *session);
ef3d3d
-void              gdm_session_request_timed_login         (GdmSession *session,
ef3d3d
+void              gdm_session_set_timed_login_details     (GdmSession *session,
ef3d3d
                                                            const char *username,
ef3d3d
                                                            int         delay);
ef3d3d
 gboolean          gdm_session_client_is_connected         (GdmSession *session);
ef3d3d
diff --git a/daemon/gdm-session.xml b/daemon/gdm-session.xml
ef3d3d
index cf3103a..756346d 100644
ef3d3d
--- a/daemon/gdm-session.xml
ef3d3d
+++ b/daemon/gdm-session.xml
ef3d3d
@@ -88,6 +88,11 @@
ef3d3d
     <method name="BeginAutoLogin">
ef3d3d
       <arg name="username" direction="in" type="s"/>
ef3d3d
     </method>
ef3d3d
+    <method name="GetTimedLoginDetails">
ef3d3d
+      <arg name="enabled" direction="out" type="b"/>
ef3d3d
+      <arg name="username" direction="out" type="s"/>
ef3d3d
+      <arg name="delay" direction="out" type="i"/>
ef3d3d
+    </method>
ef3d3d
     <method name="StartSessionWhenReady">
ef3d3d
       <arg name="service_name" direction="in" type="s"/>
ef3d3d
       <arg name="should_start_session" direction="in" type="b"/>
ef3d3d
diff --git a/daemon/gdm-simple-slave.c b/daemon/gdm-simple-slave.c
ef3d3d
index f08f7ad..e0e82c7 100644
ef3d3d
--- a/daemon/gdm-simple-slave.c
ef3d3d
+++ b/daemon/gdm-simple-slave.c
ef3d3d
@@ -717,51 +717,6 @@ on_session_client_ready_for_session_to_start (GdmSession      *session,
ef3d3d
 }
ef3d3d
 
ef3d3d
 static void
ef3d3d
-on_ready_to_request_timed_login (GdmSession         *session,
ef3d3d
-                                 GSimpleAsyncResult *result,
ef3d3d
-                                 gpointer           *user_data)
ef3d3d
-{
ef3d3d
-        g_debug ("GdmSimpleSlave: ready to request timed login");
ef3d3d
-        int delay = GPOINTER_TO_INT (user_data);
ef3d3d
-        GCancellable *cancellable;
ef3d3d
-        char         *username;
ef3d3d
-
ef3d3d
-        cancellable = g_object_get_data (G_OBJECT (result),
ef3d3d
-                                         "cancellable");
ef3d3d
-        if (g_cancellable_is_cancelled (cancellable)) {
ef3d3d
-                return;
ef3d3d
-        }
ef3d3d
-
ef3d3d
-        username = g_simple_async_result_get_source_tag (result);
ef3d3d
-
ef3d3d
-        gdm_session_request_timed_login (session, username, delay);
ef3d3d
-
ef3d3d
-        g_object_weak_unref (G_OBJECT (session),
ef3d3d
-                             (GWeakNotify)
ef3d3d
-                             g_cancellable_cancel,
ef3d3d
-                             cancellable);
ef3d3d
-        g_object_weak_unref (G_OBJECT (session),
ef3d3d
-                             (GWeakNotify)
ef3d3d
-                             g_object_unref,
ef3d3d
-                             cancellable);
ef3d3d
-        g_object_weak_unref (G_OBJECT (session),
ef3d3d
-                             (GWeakNotify)
ef3d3d
-                             g_free,
ef3d3d
-                             username);
ef3d3d
-
ef3d3d
-        g_free (username);
ef3d3d
-}
ef3d3d
-
ef3d3d
-static gboolean
ef3d3d
-on_wait_for_greeter_timeout (GSimpleAsyncResult *result)
ef3d3d
-{
ef3d3d
-        g_debug ("GdmSimpleSlave: wait for greeter timeout");
ef3d3d
-        g_simple_async_result_complete (result);
ef3d3d
-
ef3d3d
-        return FALSE;
ef3d3d
-}
ef3d3d
-
ef3d3d
-static void
ef3d3d
 on_session_client_connected (GdmSession          *session,
ef3d3d
                              GCredentials        *credentials,
ef3d3d
                              GPid                 pid_of_client,
ef3d3d
@@ -790,53 +745,8 @@ on_session_client_connected (GdmSession          *session,
ef3d3d
                 return;
ef3d3d
         }
ef3d3d
 
ef3d3d
-        /* temporary hack to fix timed login
ef3d3d
-         * http://bugzilla.gnome.org/680348
ef3d3d
-         */
ef3d3d
         if (delay > 0) {
ef3d3d
-                GSimpleAsyncResult *result;
ef3d3d
-                GCancellable       *cancellable;
ef3d3d
-                guint               timeout_id;
ef3d3d
-                gpointer            source_tag;
ef3d3d
-
ef3d3d
-                delay = MAX (delay, 4);
ef3d3d
-
ef3d3d
-                cancellable = g_cancellable_new ();
ef3d3d
-                source_tag = g_strdup (username);
ef3d3d
-                result = g_simple_async_result_new (G_OBJECT (session),
ef3d3d
-                                                    (GAsyncReadyCallback)
ef3d3d
-                                                    on_ready_to_request_timed_login,
ef3d3d
-                                                    GINT_TO_POINTER (delay),
ef3d3d
-                                                    source_tag);
ef3d3d
-                g_simple_async_result_set_check_cancellable (result, cancellable);
ef3d3d
-                g_object_set_data (G_OBJECT (result),
ef3d3d
-                                   "cancellable",
ef3d3d
-                                   cancellable);
ef3d3d
-
ef3d3d
-                timeout_id = g_timeout_add_seconds_full (delay - 2,
ef3d3d
-                                                         G_PRIORITY_DEFAULT,
ef3d3d
-                                                         (GSourceFunc)
ef3d3d
-                                                         on_wait_for_greeter_timeout,
ef3d3d
-                                                         g_object_ref (result),
ef3d3d
-                                                         (GDestroyNotify)
ef3d3d
-                                                         g_object_unref);
ef3d3d
-                g_cancellable_connect (cancellable,
ef3d3d
-                                       G_CALLBACK (g_source_remove),
ef3d3d
-                                       GINT_TO_POINTER (timeout_id),
ef3d3d
-                                       NULL);
ef3d3d
-
ef3d3d
-                g_object_weak_ref (G_OBJECT (session),
ef3d3d
-                                   (GWeakNotify)
ef3d3d
-                                   g_cancellable_cancel,
ef3d3d
-                                   cancellable);
ef3d3d
-                g_object_weak_ref (G_OBJECT (session),
ef3d3d
-                                   (GWeakNotify)
ef3d3d
-                                   g_object_unref,
ef3d3d
-                                   cancellable);
ef3d3d
-                g_object_weak_ref (G_OBJECT (session),
ef3d3d
-                                   (GWeakNotify)
ef3d3d
-                                   g_free,
ef3d3d
-                                   source_tag);
ef3d3d
+                gdm_session_set_timed_login_details (session, username, delay);
ef3d3d
         }
ef3d3d
 
ef3d3d
         g_free (username);
ef3d3d
diff --git a/gui/libgdm/gdm-client.c b/gui/libgdm/gdm-client.c
ef3d3d
index 4542c3e..e1188e5 100644
ef3d3d
--- a/gui/libgdm/gdm-client.c
ef3d3d
+++ b/gui/libgdm/gdm-client.c
ef3d3d
@@ -794,6 +794,26 @@ gdm_client_get_user_verifier_finish (GdmClient       *client,
ef3d3d
 }
ef3d3d
 
ef3d3d
 static void
ef3d3d
+on_timed_login_details_got (GdmGreeter   *greeter,
ef3d3d
+                            GAsyncResult *result)
ef3d3d
+{
ef3d3d
+        gdm_greeter_call_get_timed_login_details_finish (greeter, NULL, NULL, NULL, result, NULL);
ef3d3d
+}
ef3d3d
+
ef3d3d
+static void
ef3d3d
+query_for_timed_login_requested_signal (GdmGreeter *greeter)
ef3d3d
+{
ef3d3d
+        /* This just makes sure a timed-login-requested signal gets fired
ef3d3d
+         * off if appropriate.
ef3d3d
+         */
ef3d3d
+        gdm_greeter_call_get_timed_login_details (greeter,
ef3d3d
+                                                  NULL,
ef3d3d
+                                                  (GAsyncReadyCallback)
ef3d3d
+                                                  on_timed_login_details_got,
ef3d3d
+                                                  NULL);
ef3d3d
+}
ef3d3d
+
ef3d3d
+static void
ef3d3d
 on_greeter_proxy_created (GObject            *source,
ef3d3d
                           GAsyncResult       *result,
ef3d3d
                           GSimpleAsyncResult *operation_result)
ef3d3d
@@ -813,6 +833,8 @@ on_greeter_proxy_created (GObject            *source,
ef3d3d
                                                    (GDestroyNotify)
ef3d3d
                                                    g_object_unref);
ef3d3d
         g_simple_async_result_complete_in_idle (operation_result);
ef3d3d
+
ef3d3d
+        query_for_timed_login_requested_signal (greeter);
ef3d3d
 }
ef3d3d
 
ef3d3d
 static void
ef3d3d
@@ -980,6 +1002,7 @@ gdm_client_get_greeter_sync (GdmClient     *client,
ef3d3d
                                    (GWeakNotify)
ef3d3d
                                    g_clear_object,
ef3d3d
                                    &client->priv->connection);
ef3d3d
+                query_for_timed_login_requested_signal (client->priv->greeter);
ef3d3d
         }
ef3d3d
 
ef3d3d
         return client->priv->greeter;
ef3d3d
-- 
ef3d3d
1.8.3.1
ef3d3d
ef3d3d
ef3d3d
From 35d66c9d4cf54d3e480c399b045468547a0818a8 Mon Sep 17 00:00:00 2001
ef3d3d
From: Philippe Troin <phil@fifi.org>
ef3d3d
Date: Tue, 2 Sep 2014 15:28:17 -0400
ef3d3d
Subject: [PATCH 4/4] daemon: allow multiple time logins to work
ef3d3d
ef3d3d
GDM currently lumps timed login with autologin when deciding whether or
ef3d3d
not to skip it, if it's already happened once this boot.
ef3d3d
ef3d3d
That's the wrong behavior, and indeed will create a confused experience,
ef3d3d
because it's not what the login screen provided by gnome-shell
ef3d3d
expects.
ef3d3d
ef3d3d
This commit allows timed login to work after the user logs out.
ef3d3d
ef3d3d
https://bugzilla.gnome.org/show_bug.cgi?id=732774
ef3d3d
---
ef3d3d
 daemon/gdm-simple-slave.c | 7 ++++---
ef3d3d
 1 file changed, 4 insertions(+), 3 deletions(-)
ef3d3d
ef3d3d
diff --git a/daemon/gdm-simple-slave.c b/daemon/gdm-simple-slave.c
ef3d3d
index e0e82c7..5057eb4 100644
ef3d3d
--- a/daemon/gdm-simple-slave.c
ef3d3d
+++ b/daemon/gdm-simple-slave.c
ef3d3d
@@ -650,13 +650,14 @@ static void
ef3d3d
 start_autologin_conversation_if_necessary (GdmSimpleSlave  *slave)
ef3d3d
 {
ef3d3d
         gboolean enabled;
ef3d3d
+        int delay = 0;
ef3d3d
 
ef3d3d
-        if (g_file_test (GDM_RAN_ONCE_MARKER_FILE, G_FILE_TEST_EXISTS)) {
ef3d3d
+        gdm_slave_get_timed_login_details (GDM_SLAVE (slave), &enabled, NULL, &delay);
ef3d3d
+
ef3d3d
+        if (delay == 0 && g_file_test (GDM_RAN_ONCE_MARKER_FILE, G_FILE_TEST_EXISTS)) {
ef3d3d
                 return;
ef3d3d
         }
ef3d3d
 
ef3d3d
-        gdm_slave_get_timed_login_details (GDM_SLAVE (slave), &enabled, NULL, NULL);
ef3d3d
-
ef3d3d
         if (!enabled) {
ef3d3d
                 return;
ef3d3d
         }
ef3d3d
-- 
ef3d3d
1.8.3.1
ef3d3d