]> rtime.felk.cvut.cz Git - sojka/lightdm.git/commitdiff
Run remote sessions when selected from the greeter
authorRobert Ancell <robert.ancell@canonical.com>
Mon, 27 Aug 2012 05:30:37 +0000 (17:30 +1200)
committerRobert Ancell <robert.ancell@canonical.com>
Mon, 27 Aug 2012 05:30:37 +0000 (17:30 +1200)
src/display.c
src/display.h
src/greeter.c
src/greeter.h
src/ldm-marshal.list
src/seat.c
src/session.h
tests/data/remote-sessions/test-remote.desktop

index ae7ebd9c1557e3d0615e7f99c405fa44c0fa3300..ec001530743f2ef81a77282a89ec9de8c668c805 100644 (file)
@@ -35,15 +35,6 @@ enum
 };
 static guint signals[LAST_SIGNAL] = { 0 };
 
-typedef enum
-{
-    SESSION_NONE = 0,
-    SESSION_GREETER_PRE_CONNECT,
-    SESSION_GREETER,
-    SESSION_GREETER_AUTHENTICATED,
-    SESSION_USER
-} SessionType;
-
 struct DisplayPrivate
 {
     /* Display server */
@@ -62,6 +53,7 @@ struct DisplayPrivate
     gboolean greeter_is_lock;
 
     /* Session requested to log into */
+    SessionType user_session_type;
     gchar *user_session;
 
     /* Program to run sessions through */
@@ -220,10 +212,11 @@ display_set_lock_hint (Display *display, gboolean is_lock)
 }
 
 void
-display_set_user_session (Display *display, const gchar *session_name)
+display_set_user_session (Display *display, SessionType type, const gchar *session_name)
 {
     g_return_if_fail (display != NULL);
     g_free (display->priv->user_session);
+    display->priv->user_session_type = type;
     display->priv->user_session = g_strdup (session_name);
 }
 
@@ -349,7 +342,7 @@ greeter_start_authentication_cb (Greeter *greeter, const gchar *username, Displa
 }
 
 static gboolean
-greeter_start_session_cb (Greeter *greeter, const gchar *session_name, Display *display)
+greeter_start_session_cb (Greeter *greeter, SessionType type, const gchar *session_name, Display *display)
 {
     /* If no session requested, use the previous one */
     if (!session_name && !greeter_get_guest_authenticated (greeter))
@@ -357,6 +350,7 @@ greeter_start_session_cb (Greeter *greeter, const gchar *session_name, Display *
         User *user;
 
         user = session_get_user (greeter_get_authentication_session (greeter));
+        type = SESSION_TYPE_LOCAL;
         session_name = user_get_xsession (user);
     }
 
@@ -364,7 +358,7 @@ greeter_start_session_cb (Greeter *greeter, const gchar *session_name, Display *
     if (session_name)
     {
         g_debug ("Using session %s", session_name);
-        display_set_user_session (display, session_name);
+        display_set_user_session (display, type, session_name);
     }
 
     /* Stop this display if that session already exists and can switch to it */
@@ -474,7 +468,7 @@ autologin_authentication_complete_cb (Session *session, Display *display)
         if (session_name)
         {
             g_debug ("Autologin using session %s", session_name);
-            display_set_user_session (display, session_name);
+            display_set_user_session (display, SESSION_TYPE_LOCAL, session_name);
         }
 
         g_signal_emit (display, signals[START_SESSION], 0, &result);
@@ -700,12 +694,16 @@ display_start_session (Display *display)
 
     user = session_get_user (display->priv->session);
 
-    /* Store this session name so we automatically use it next time */
-    user_set_xsession (user, display->priv->user_session);
-
     /* Find the command to run for the selected session */
-    // FIXME: This is X specific, move into xsession.c
-    sessions_dir = config_get_string (config_get_instance (), "LightDM", "xsessions-directory");
+    if (display->priv->user_session_type == SESSION_TYPE_LOCAL)
+    {
+        sessions_dir = config_get_string (config_get_instance (), "LightDM", "xsessions-directory");
+
+        /* Store this session name so we automatically use it next time */
+        user_set_xsession (user, display->priv->user_session);
+    }
+    else
+        sessions_dir = config_get_string (config_get_instance (), "LightDM", "remote-sessions-directory");
     filename = g_strdup_printf ("%s.desktop", display->priv->user_session);
     path = g_build_filename (sessions_dir, filename, NULL);
     g_free (sessions_dir);
index e6a970b199ebceaebab357cfa49f8a7dbc24a173..23d8c8baf3fd2f008e57a28e65abace9119b4abb 100644 (file)
@@ -76,7 +76,7 @@ void display_set_show_manual_login_hint (Display *display, gboolean show_manual)
 
 void display_set_lock_hint (Display *display, gboolean is_lock);
 
-void display_set_user_session (Display *display, const gchar *session_name);
+void display_set_user_session (Display *display, SessionType type, const gchar *session_name);
 
 gboolean display_start (Display *display);
 
index ac5b1b4e29499e932c119233c5edb0ec1ed3e21d..5180fc8226f82e84520f4cf2f66a0adbed1fb470 100644 (file)
@@ -49,6 +49,9 @@ struct GreeterPrivate
     /* Sequence number of current PAM session */
     guint32 authentication_sequence_number;
 
+    /* Remote session name */
+    gchar *remote_session;
+
     /* PAM session being constructed by the greeter */
     Session *authentication_session;
 
@@ -295,6 +298,8 @@ authentication_complete_cb (Session *session, Greeter *greeter)
 static void
 reset_session (Greeter *greeter)
 {
+    g_free (greeter->priv->remote_session);
+    greeter->priv->remote_session = NULL;
     if (greeter->priv->authentication_session)
     {
         g_signal_handlers_disconnect_matched (greeter->priv->authentication_session, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, greeter);
@@ -409,7 +414,8 @@ handle_login_remote (Greeter *greeter, const gchar *session_name, const gchar *u
         return;
     }
 
-    greeter->priv->authentication_sequence_number = sequence_number;  
+    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);
     if (greeter->priv->authentication_session)
     {
@@ -491,10 +497,18 @@ handle_start_session (Greeter *greeter, const gchar *session)
     gboolean result;
     guint8 message[MAX_MESSAGE_LENGTH];
     gsize offset = 0;
+    SessionType session_type = SESSION_TYPE_LOCAL;
 
     if (strcmp (session, "") == 0)
         session = NULL;
 
+    /* Use session type chosen in remote session */
+    if (greeter->priv->remote_session)
+    {
+        session_type = SESSION_TYPE_REMOTE;
+        session = greeter->priv->remote_session;
+    }
+
     if (greeter->priv->guest_account_authenticated || session_get_is_authenticated (greeter->priv->authentication_session))
     {
         if (session)
@@ -502,7 +516,7 @@ handle_start_session (Greeter *greeter, const gchar *session)
         else
             g_debug ("Greeter requests default session");
         greeter->priv->start_session = TRUE;
-        g_signal_emit (greeter, signals[START_SESSION], 0, session, &result);
+        g_signal_emit (greeter, signals[START_SESSION], 0, session_type, session, &result);
     }
     else
     {
@@ -755,7 +769,7 @@ greeter_real_start_authentication (Greeter *greeter, const gchar *username)
 }
 
 static gboolean
-greeter_real_start_session (Greeter *greeter, const gchar *session, gboolean is_guest)
+greeter_real_start_session (Greeter *greeter, SessionType type, const gchar *session)
 {
     return FALSE;
 }
@@ -780,6 +794,7 @@ greeter_finalize (GObject *object)
     g_free (self->priv->pam_service);
     g_free (self->priv->read_buffer);
     g_hash_table_unref (self->priv->hints);
+    g_free (self->priv->remote_session);
     if (self->priv->authentication_session)
     {
         g_signal_handlers_disconnect_matched (self->priv->authentication_session, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, self);
@@ -828,8 +843,8 @@ greeter_class_init (GreeterClass *klass)
                       G_STRUCT_OFFSET (GreeterClass, start_session),
                       g_signal_accumulator_true_handled,
                       NULL,
-                      ldm_marshal_BOOLEAN__STRING,
-                      G_TYPE_BOOLEAN, 1, G_TYPE_STRING);
+                      ldm_marshal_BOOLEAN__INT_STRING,
+                      G_TYPE_BOOLEAN, 2, G_TYPE_INT, G_TYPE_STRING);
 
     g_type_class_add_private (klass, sizeof (GreeterPrivate));
 }
index 88fb2bc8dcd5546a4b54c4ce7ce4ad84a72b1541..27801952594d25d10bb15fbbdc795f10dc2b2de9 100644 (file)
@@ -32,7 +32,7 @@ typedef struct
     GObjectClass parent_class;
     void (*connected)(Greeter *greeter);
     Session *(*start_authentication)(Greeter *greeter, const gchar *username);
-    gboolean (*start_session)(Greeter *greeter, const gchar *session, gboolean is_guest);
+    gboolean (*start_session)(Greeter *greeter, SessionType type, const gchar *session);
 } GreeterClass;
 
 GType greeter_get_type (void);
index 57d376b977995f693c0ea5ab0e3399fca2bbcd9f..9be211acee8a4341004efabea8d24fc8e6c6a9fb 100644 (file)
@@ -1,6 +1,6 @@
 VOID:INT,POINTER
 BOOLEAN:VOID
-BOOLEAN:STRING
+BOOLEAN:INT,STRING
 BOOLEAN:OBJECT
 STRING:VOID
 OBJECT:VOID
index ad42731333de9aa271ff702adfda00ae0d70a1ff..f055f389d38d97742fdce05d711e8d9612240637 100644 (file)
@@ -495,7 +495,7 @@ switch_to_user_or_start_greeter (Seat *seat, const gchar *username, gboolean use
         display_set_select_user_hint (display, username, is_guest);
     if (!session_name)
         session_name = seat_get_string_property (seat, "user-session");
-    display_set_user_session (display, session_name);
+    display_set_user_session (display, SESSION_TYPE_LOCAL, session_name);
 
     seat->priv->displays = g_list_append (seat->priv->displays, display);
     g_signal_emit (seat, signals[DISPLAY_ADDED], 0, display);
index ebf870c2859c9c6d2409d15e5349ea0125f2f17d..52a6e9e8dd1a53938c34b0e1560299828051cd0f 100644 (file)
@@ -43,6 +43,12 @@ typedef struct
     void (*stopped)(Session *session);
 } SessionClass;
 
+typedef enum
+{
+    SESSION_TYPE_LOCAL,
+    SESSION_TYPE_REMOTE
+} SessionType;
+
 #define XDG_SESSION_CLASS_USER        "user"
 #define XDG_SESSION_CLASS_GREETER     "greeter"
 #define XDG_SESSION_CLASS_LOCK_SCREEN "lock-screen"
index 4d486335a14dc6626373fb61f46a877c8a366529..60829d44638ef3adbfe14ff65672892e020eba44 100644 (file)
@@ -1,5 +1,5 @@
 [Desktop Entry]
 Name=Test Remote Session
 Comment=LightDM remote test session
-Exec=test-remote
+Exec=test-session
 X-LightDM-PAM-Service=test-remote