]> rtime.felk.cvut.cz Git - sojka/lightdm.git/blobdiff - src/greeter.c
Fix greeter being killing a started session once if a new authentication is started
[sojka/lightdm.git] / src / greeter.c
index 4534ee2fc0f175e7293936573361d29da0febc52..1ec5bd9c008848455efc29f011c8aedd60784ee3 100644 (file)
 #include "shared-data-manager.h"
 
 enum {
-    PROP_0,
-    PROP_ACTIVE_USERNAME,
+    PROP_ACTIVE_USERNAME = 1,
 };
 
 enum {
     CONNECTED,
+    DISCONNECTED,  
     CREATE_SESSION,
     START_SESSION,
     LAST_SIGNAL
@@ -455,7 +455,7 @@ reset_session (Greeter *greeter)
 }
 
 static void
-handle_login (Greeter *greeter, guint32 sequence_number, const gchar *username)
+handle_authenticate (Greeter *greeter, guint32 sequence_number, const gchar *username)
 {
     const gchar *autologin_username, *service;
     gboolean is_interactive;
@@ -508,7 +508,7 @@ handle_login (Greeter *greeter, guint32 sequence_number, const gchar *username)
 }
 
 static void
-handle_login_as_guest (Greeter *greeter, guint32 sequence_number)
+handle_authenticate_as_guest (Greeter *greeter, guint32 sequence_number)
 {
     g_debug ("Greeter start authentication for guest account");
 
@@ -561,7 +561,7 @@ get_remote_session_service (const gchar *session_name)
 }
 
 static void
-handle_login_remote (Greeter *greeter, const gchar *session_name, const gchar *username, guint32 sequence_number)
+handle_authenticate_remote (Greeter *greeter, const gchar *session_name, const gchar *username, guint32 sequence_number)
 {
     gchar *service;
 
@@ -836,6 +836,7 @@ read_cb (GIOChannel *source, GIOCondition condition, gpointer data)
     {
         g_debug ("Greeter closed communication channel");
         greeter->priv->from_greeter_watch = 0;
+        g_signal_emit (greeter, signals[DISCONNECTED], 0);
         return FALSE;
     }
 
@@ -858,7 +859,14 @@ read_cb (GIOChannel *source, GIOCondition condition, gpointer data)
     if (error)
         g_warning ("Error reading from greeter: %s", error->message);
     g_clear_error (&error);
-    if (status != G_IO_STATUS_NORMAL)
+    if (status == G_IO_STATUS_EOF)
+    {
+        g_debug ("Greeter closed communication channel");
+        greeter->priv->from_greeter_watch = 0;
+        g_signal_emit (greeter, signals[DISCONNECTED], 0);
+        return FALSE;
+    }
+    else if (status != G_IO_STATUS_NORMAL)
         return TRUE;
 
     greeter->priv->n_read += n_read;
@@ -892,18 +900,18 @@ read_cb (GIOChannel *source, GIOCondition condition, gpointer data)
     case GREETER_MESSAGE_AUTHENTICATE:
         sequence_number = read_int (greeter, &offset);
         username = read_string (greeter, &offset);
-        handle_login (greeter, sequence_number, username);
+        handle_authenticate (greeter, sequence_number, username);
         g_free (username);
         break;
     case GREETER_MESSAGE_AUTHENTICATE_AS_GUEST:
         sequence_number = read_int (greeter, &offset);
-        handle_login_as_guest (greeter, sequence_number);
+        handle_authenticate_as_guest (greeter, sequence_number);
         break;
     case GREETER_MESSAGE_AUTHENTICATE_REMOTE:
         sequence_number = read_int (greeter, &offset);
         session_name = read_string (greeter, &offset);
         username = read_string (greeter, &offset);
-        handle_login_remote (greeter, session_name, username, sequence_number);
+        handle_authenticate_remote (greeter, session_name, username, sequence_number);
         break;
     case GREETER_MESSAGE_CONTINUE_AUTHENTICATION:
         n_secrets = read_int (greeter, &offset);
@@ -959,10 +967,18 @@ greeter_get_guest_authenticated (Greeter *greeter)
 }
 
 Session *
-greeter_get_authentication_session (Greeter *greeter)
+greeter_take_authentication_session (Greeter *greeter)
 {
+    Session *session;
+
     g_return_val_if_fail (greeter != NULL, NULL);
-    return greeter->priv->authentication_session;
+
+    session = greeter->priv->authentication_session;
+    if (greeter->priv->authentication_session)
+        g_signal_handlers_disconnect_matched (greeter->priv->authentication_session, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, greeter);
+    greeter->priv->authentication_session = NULL;
+
+    return session;
 }
 
 gboolean
@@ -1084,6 +1100,15 @@ greeter_class_init (GreeterClass *klass)
                       NULL,
                       G_TYPE_NONE, 0);
 
+    signals[DISCONNECTED] =
+        g_signal_new (GREETER_SIGNAL_DISCONNECTED,
+                      G_TYPE_FROM_CLASS (klass),
+                      G_SIGNAL_RUN_LAST,
+                      G_STRUCT_OFFSET (GreeterClass, disconnected),
+                      NULL, NULL,
+                      NULL,
+                      G_TYPE_NONE, 0);
+
     signals[CREATE_SESSION] =
         g_signal_new (GREETER_SIGNAL_CREATE_SESSION,
                       G_TYPE_FROM_CLASS (klass),