]> rtime.felk.cvut.cz Git - sojka/lightdm.git/commitdiff
Start connecting up greeters
authorRobert Ancell <robert.ancell@canonical.com>
Sun, 14 Jul 2013 04:53:58 +0000 (16:53 +1200)
committerRobert Ancell <robert.ancell@canonical.com>
Sun, 14 Jul 2013 04:53:58 +0000 (16:53 +1200)
src/greeter.c
src/greeter.h
src/seat.c

index 4b33e95d1c79dfb7085ee091a8afd21d97d4aa0b..fb073bb79611fd375e6d84ccdae0e7c960dcd032 100644 (file)
@@ -23,7 +23,7 @@
 
 enum {
     CONNECTED,
-    START_AUTHENTICATION,
+    CREATE_SESSION,
     START_SESSION,
     LAST_SIGNAL
 };
@@ -361,7 +361,7 @@ handle_login (Greeter *greeter, guint32 sequence_number, const gchar *username)
     reset_session (greeter);
 
     greeter->priv->authentication_sequence_number = sequence_number;
-    g_signal_emit (greeter, signals[START_AUTHENTICATION], 0, username, &greeter->priv->authentication_session);
+    g_signal_emit (greeter, signals[CREATE_SESSION], 0, &greeter->priv->authentication_session);
     if (!greeter->priv->authentication_session)
     {
         send_end_authentication (greeter, sequence_number, "", PAM_USER_UNKNOWN);
@@ -469,7 +469,7 @@ handle_login_remote (Greeter *greeter, const gchar *session_name, const gchar *u
 
     greeter->priv->authentication_sequence_number = sequence_number;
     greeter->priv->remote_session = g_strdup (session_name);
-    g_signal_emit (greeter, signals[START_AUTHENTICATION], 0, username, &greeter->priv->authentication_session);
+    g_signal_emit (greeter, signals[CREATE_SESSION], 0, &greeter->priv->authentication_session);
     if (greeter->priv->authentication_session)
     {
         g_signal_connect (G_OBJECT (greeter->priv->authentication_session), "got-messages", G_CALLBACK (pam_messages_cb), greeter);
@@ -805,6 +805,13 @@ read_cb (GIOChannel *source, GIOCondition condition, gpointer data)
     return TRUE;
 }
 
+Session *
+greeter_get_session (Greeter *greeter)
+{
+    g_return_val_if_fail (greeter != NULL, NULL);
+    return greeter->priv->session;
+}
+
 gboolean
 greeter_get_guest_authenticated (Greeter *greeter)
 {
@@ -827,7 +834,7 @@ greeter_get_start_session (Greeter *greeter)
 }
 
 gboolean
-greeter_start (Greeter *greeter, const gchar *service, const gchar *username)
+greeter_start (Greeter *greeter)
 {
     int to_greeter_pipe[2], from_greeter_pipe[2];
     gboolean result = FALSE;
@@ -858,8 +865,6 @@ greeter_start (Greeter *greeter, const gchar *service, const gchar *username)
     fcntl (to_greeter_pipe[1], F_SETFD, FD_CLOEXEC);
     fcntl (from_greeter_pipe[0], F_SETFD, FD_CLOEXEC);
 
-    session_set_pam_service (greeter->priv->session, service);
-    session_set_username (greeter->priv->session, username);
     result = session_start (greeter->priv->session);
 
     /* Close the session ends of the pipe */
@@ -870,7 +875,7 @@ greeter_start (Greeter *greeter, const gchar *service, const gchar *username)
 }
 
 static Session *
-greeter_real_start_authentication (Greeter *greeter, const gchar *username)
+greeter_real_create_session (Greeter *greeter)
 {
     return NULL;
 }
@@ -921,7 +926,7 @@ greeter_class_init (GreeterClass *klass)
 {
     GObjectClass *object_class = G_OBJECT_CLASS (klass);
 
-    klass->start_authentication = greeter_real_start_authentication;
+    klass->create_session = greeter_real_create_session;
     klass->start_session = greeter_real_start_session;
     object_class->finalize = greeter_finalize;
 
@@ -934,15 +939,15 @@ greeter_class_init (GreeterClass *klass)
                       g_cclosure_marshal_VOID__VOID,
                       G_TYPE_NONE, 0);
 
-    signals[START_AUTHENTICATION] =
-        g_signal_new ("start-authentication",
+    signals[CREATE_SESSION] =
+        g_signal_new ("create-session",
                       G_TYPE_FROM_CLASS (klass),
                       G_SIGNAL_RUN_LAST,
-                      G_STRUCT_OFFSET (GreeterClass, start_authentication),
+                      G_STRUCT_OFFSET (GreeterClass, create_session),
                       g_signal_accumulator_first_wins,
                       NULL,
-                      ldm_marshal_OBJECT__STRING,
-                      SESSION_TYPE, 1, G_TYPE_STRING);
+                      ldm_marshal_OBJECT__VOID,
+                      SESSION_TYPE, 0);
 
     signals[START_SESSION] =
         g_signal_new ("start-session",
index 758afb43554c910c0862acb979f26bd8917daea2..b784fcd9b509d980a3359bac264847373717b245 100644 (file)
@@ -31,7 +31,7 @@ typedef struct
 {
     GObjectClass parent_class;
     void (*connected)(Greeter *greeter);
-    Session *(*start_authentication)(Greeter *greeter, const gchar *username);
+    Session *(*create_session)(Greeter *greeter);
     gboolean (*start_session)(Greeter *greeter, SessionType type, const gchar *session);
 } GreeterClass;
 
@@ -43,13 +43,15 @@ void greeter_set_allow_guest (Greeter *greeter, gboolean allow_guest);
 
 void greeter_set_hint (Greeter *greeter, const gchar *name, const gchar *value);
 
+Session *greeter_get_session (Greeter *greeter);
+
 gboolean greeter_get_guest_authenticated (Greeter *greeter);
 
 Session *greeter_get_authentication_session (Greeter *greeter);
 
 gboolean greeter_get_start_session (Greeter *greeter);
 
-gboolean greeter_start (Greeter *greeter, const gchar *service, const gchar *username);
+gboolean greeter_start (Greeter *greeter);
 
 G_END_DECLS
 
index 1f48fc8fb0cd1e56d80abb511342c8facde12b51..6ade059665da35ca1b9c88523d9a181a6dfb1201 100644 (file)
@@ -16,6 +16,7 @@
 #include "seat.h"
 #include "configuration.h"
 #include "guest-account.h"
+#include "greeter.h"
 
 enum {
     SESSION_ADDED,
@@ -45,6 +46,9 @@ struct SeatPrivate
     /* The sessions on this seat */
     GList *sessions;
 
+    /* Greeter connection */
+    Greeter *greeter;
+
     /* TRUE if stopping this seat (waiting for displays to stop) */
     gboolean stopping;
 
@@ -344,9 +348,20 @@ session_stopped_cb (Session *session, Seat *seat)
 
     g_signal_handlers_disconnect_matched (session, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, seat);
     seat->priv->sessions = g_list_remove (seat->priv->sessions, session);
-    g_object_unref (session);
 
     check_stopped (seat);
+  
+    /* If this is the greeter session then start the user session */
+    if (seat->priv->greeter &&
+        session == greeter_get_session (seat->priv->greeter) &&
+        seat->priv->share_display_server)
+    {
+        Session *s;
+        s = greeter_get_authentication_session (seat->priv->greeter);
+        session_run (s);
+    }
+
+    g_object_unref (session);
 }
 
 static Session *
@@ -493,7 +508,10 @@ display_server_ready_cb (DisplayServer *display_server, Seat *seat)
         if (session_get_display_server (session) == display_server)
         {
             g_signal_connect (session, "authentication-complete", G_CALLBACK (session_authentication_complete_cb), seat);
-            session_start (session);
+            if (seat->priv->greeter && greeter_get_session (seat->priv->greeter) == session)
+                greeter_start (seat->priv->greeter);
+            else
+                session_start (session);
             used_display_server = TRUE;
         }
     }
@@ -505,6 +523,12 @@ display_server_ready_cb (DisplayServer *display_server, Seat *seat)
     }
 }
 
+static Session *
+greeter_create_session_cb (Greeter *greeter, Seat *seat)
+{
+    return create_session (seat, NULL); // FIXME display_server
+}
+
 static gchar **
 get_session_argv_from_filename (const gchar *filename, const gchar *session_wrapper)
 {
@@ -584,6 +608,37 @@ get_session_argv (const gchar *sessions_dir, const gchar *session_name, const gc
     return argv;
 }
 
+static gboolean
+greeter_start_session_cb (Greeter *greeter, SessionType type, const gchar *session_name, Seat *seat)
+{
+    /* If can re-use the display server, stop the greeter first */
+    if (seat->priv->share_display_server)
+    {
+        Session *s;
+        gchar *sessions_dir;
+        gchar **argv;
+
+        s = greeter_get_authentication_session (seat->priv->greeter);
+
+        /* Run on the same display server */
+        session_set_display_server (s, session_get_display_server (greeter_get_session (seat->priv->greeter)));
+
+        sessions_dir = config_get_string (config_get_instance (), "LightDM", "sessions-directory");
+        argv = get_session_argv (sessions_dir, session_name, seat_get_string_property (seat, "session-wrapper"));
+        g_free (sessions_dir);
+        session_set_argv (s, argv);
+        g_strfreev (argv);
+
+        seat->priv->sessions = g_list_append (seat->priv->sessions, g_object_ref (s));
+
+        return TRUE;
+    }
+
+    /* Start a new display server for this session */
+
+    return TRUE;
+}
+
 static gboolean
 seat_real_start (Seat *seat)
 {
@@ -620,10 +675,10 @@ seat_real_start (Seat *seat)
     display_server = create_display_server (seat);
     g_signal_connect (display_server, "ready", G_CALLBACK (display_server_ready_cb), seat);
 
-    /* Start new greeter or autologin session */
     session = create_session (seat, display_server);
     session_set_display_server (session, display_server);
 
+    /* Autologin or start a greeter */
     if (autologin_timeout == 0 && autologin_guest)
     {
         session_set_pam_service (session, AUTOLOGIN_SERVICE);
@@ -642,6 +697,21 @@ seat_real_start (Seat *seat)
         wrapper = seat_get_string_property (seat, "session-wrapper");
         session_name = user_get_xsession (user);
     }
+    else
+    {
+        gchar *greeter_user;
+
+        session_set_pam_service (session, GREETER_SERVICE);
+        greeter_user = config_get_string (config_get_instance (), "LightDM", "greeter-user");
+        session_set_username (session, greeter_user);
+        g_free (greeter_user);
+        sessions_dir = config_get_string (config_get_instance (), "LightDM", "greeters-directory");
+        wrapper = seat_get_string_property (seat, "session-wrapper");
+
+        seat->priv->greeter = greeter_new (session, USER_SERVICE, AUTOLOGIN_SERVICE);
+        g_signal_connect (seat->priv->greeter, "create-session", G_CALLBACK (greeter_create_session_cb), seat);
+        g_signal_connect (seat->priv->greeter, "start-session", G_CALLBACK (greeter_start_session_cb), seat);
+    }
 
     if (!session_name)
         session_name = user_session;