]> rtime.felk.cvut.cz Git - sojka/lightdm.git/commitdiff
Allow in-session greeters to reconnect
authorRobert Ancell <robert.ancell@canonical.com>
Thu, 14 Jul 2016 01:59:39 +0000 (13:59 +1200)
committerRobert Ancell <robert.ancell@canonical.com>
Thu, 14 Jul 2016 01:59:39 +0000 (13:59 +1200)
src/greeter-socket.c
src/greeter.c
src/greeter.h
tests/Makefile.am
tests/scripts/session-greeter-reconnect.conf [new file with mode: 0644]
tests/src/test-session.c
tests/test-session-greeter-reconnect [new file with mode: 0755]

index 18e6a52f84e76feed8c86a9bf73b1f02e12f7b80..4a7beb53d254ec43e57650352e4bfc816ade3dcf 100644 (file)
@@ -54,6 +54,16 @@ greeter_socket_new (const gchar *path)
     return socket;
 }
 
+static void
+greeter_disconnected_cb (Greeter *greeter, GreeterSocket *socket)
+{
+    if (greeter == socket->priv->greeter)
+    {
+        g_clear_object (&socket->priv->greeter);
+        g_clear_object (&socket->priv->greeter_socket);
+    }
+}
+
 static gboolean
 greeter_connect_cb (GSocket *s, GIOCondition condition, GreeterSocket *socket)
 {
@@ -77,6 +87,7 @@ greeter_connect_cb (GSocket *s, GIOCondition condition, GreeterSocket *socket)
 
     socket->priv->greeter_socket = new_socket;
     g_signal_emit (socket, signals[CREATE_GREETER], 0, &socket->priv->greeter);
+    g_signal_connect (socket->priv->greeter, GREETER_SIGNAL_DISCONNECTED, G_CALLBACK (greeter_disconnected_cb), socket);
     greeter_set_file_descriptors (socket->priv->greeter, g_socket_get_fd (new_socket), g_socket_get_fd (new_socket));
 
     return G_SOURCE_CONTINUE;
index 124e4c8a7e3aad68a98c174a964c6d0702e4799e..e2ae19f9d1bff02e07981f522da98fa729ae8e8d 100644 (file)
@@ -25,6 +25,7 @@ enum {
 
 enum {
     CONNECTED,
+    DISCONNECTED,  
     CREATE_SESSION,
     START_SESSION,
     LAST_SIGNAL
@@ -836,6 +837,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;
     }
 
@@ -862,6 +864,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;
     }
     else if (status != G_IO_STATUS_NORMAL)
@@ -1090,6 +1093,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),
index 19ddf86caa00da65e5c9e618cd4ef8d1c164bdeb..b9404ae528bb410072ce63d90411282f541b72c6 100644 (file)
@@ -24,6 +24,7 @@ G_BEGIN_DECLS
 #define IS_GREETER(obj)        (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GREETER_TYPE))
 
 #define GREETER_SIGNAL_CONNECTED      "connected"
+#define GREETER_SIGNAL_DISCONNECTED   "disconnected"
 #define GREETER_SIGNAL_CREATE_SESSION "create-session"
 #define GREETER_SIGNAL_START_SESSION  "start-session"
 
@@ -43,6 +44,7 @@ typedef struct
 {
     GObjectClass parent_class;
     void (*connected)(Greeter *greeter);
+    void (*disconnected)(Greeter *greeter);  
     Session *(*create_session)(Greeter *greeter);
     gboolean (*start_session)(Greeter *greeter, SessionType type, const gchar *session);
 } GreeterClass;
index 0bf48fcfb62e1a2f8e3a0a4df26285e42edea8da..8fe15bc7a884793d493022210702a29ab9233400 100644 (file)
@@ -169,6 +169,7 @@ TESTS = \
        test-switch-to-users \
        test-session-greeter \
        test-session-greeter-autologin \
+       test-session-greeter-reconnect \        
        test-vnc-login \
        test-vnc-command \
        test-vnc-dimensions \
@@ -542,7 +543,8 @@ EXTRA_DIST = \
        scripts/script-hook-session-setup-fail.conf \
        scripts/script-hook-session-setup-missing.conf \
        scripts/session-greeter.conf \
-       scripts/session-greeter-autologin.conf \        
+       scripts/session-greeter-autologin.conf \
+       scripts/session-greeter-reconnect.conf \
        scripts/session-stdout.conf \
        scripts/session-stderr.conf \
        scripts/session-stderr-multi-write.conf \
diff --git a/tests/scripts/session-greeter-reconnect.conf b/tests/scripts/session-greeter-reconnect.conf
new file mode 100644 (file)
index 0000000..2d2c45e
--- /dev/null
@@ -0,0 +1,66 @@
+#
+# Check can reconnect in-session greeter
+#
+
+[Seat:*]
+autologin-user=have-password1
+user-session=greeter
+
+#?*START-DAEMON
+#?RUNNER DAEMON-START
+
+# X server starts
+#?XSERVER-0 START VT=7 SEAT=seat0
+
+# Daemon connects when X server is ready
+#?*XSERVER-0 INDICATE-READY
+#?XSERVER-0 INDICATE-READY
+#?XSERVER-0 ACCEPT-CONNECT
+
+# Session starts
+#?SESSION-X-0 START XDG_SEAT=seat0 XDG_VTNR=7 XDG_GREETER_DATA_DIR=.*/have-password1 XDG_SESSION_TYPE=x11 XDG_SESSION_DESKTOP=greeter USER=have-password1
+#?LOGIN1 ACTIVATE-SESSION SESSION=c0
+#?XSERVER-0 ACCEPT-CONNECT
+#?SESSION-X-0 CONNECT-XSERVER
+
+# Start greeter inside session
+#?*SESSION-X-0 GREETER-START
+#?SESSION-X-0 GREETER-STARTED
+
+# Stop greeter
+#?*SESSION-X-0 GREETER-STOP
+
+# Re-start greeter
+#?*SESSION-X-0 GREETER-START
+#?SESSION-X-0 GREETER-STARTED
+
+# Log into account with a password
+#?*SESSION-X-0 GREETER-AUTHENTICATE USERNAME=have-password2
+#?SESSION-X-0 GREETER-SHOW-PROMPT TEXT="Password:"
+#?*SESSION-X-0 GREETER-RESPOND TEXT="password"
+#?SESSION-X-0 GREETER-AUTHENTICATION-COMPLETE USERNAME=have-password2 AUTHENTICATED=TRUE
+#?*SESSION-X-0 GREETER-START-SESSION
+
+# New X server starts
+#?XSERVER-1 START VT=8 SEAT=seat0
+#?*XSERVER-1 INDICATE-READY
+#?XSERVER-1 INDICATE-READY
+#?XSERVER-1 ACCEPT-CONNECT
+
+# New session starts
+#?SESSION-X-1 START XDG_SEAT=seat0 XDG_VTNR=8 XDG_GREETER_DATA_DIR=.*/have-password2 XDG_SESSION_TYPE=x11 XDG_SESSION_DESKTOP=greeter USER=have-password2
+#?XSERVER-1 ACCEPT-CONNECT
+#?SESSION-X-1 CONNECT-XSERVER
+
+# Switch to new session
+#?VT ACTIVATE VT=8
+#?LOGIN1 LOCK-SESSION SESSION=c0
+#?LOGIN1 ACTIVATE-SESSION SESSION=c1
+
+# Cleanup
+#?*STOP-DAEMON
+#?SESSION-X-0 TERMINATE SIGNAL=15
+#?XSERVER-1 TERMINATE SIGNAL=15
+#?SESSION-X-1 TERMINATE SIGNAL=15
+#?XSERVER-0 TERMINATE SIGNAL=15
+#?RUNNER DAEMON-EXIT STATUS=0
index f3270b5d1d636843860a8fd117700d8d9b953a41..f2a77e95f3e649b400db12d102557dbdc72a2f5f 100644 (file)
@@ -274,6 +274,12 @@ request_cb (const gchar *name, GHashTable *params)
         }
     }
 
+    else if (strcmp (name, "GREETER-STOP") == 0)
+    {
+        g_assert (greeter != NULL);
+        g_clear_object (&greeter);
+    }
+
     else if (strcmp (name, "GREETER-AUTHENTICATE") == 0)
     {
         if (!lightdm_greeter_authenticate (greeter, g_hash_table_lookup (params, "USERNAME"), &error))
diff --git a/tests/test-session-greeter-reconnect b/tests/test-session-greeter-reconnect
new file mode 100755 (executable)
index 0000000..e7972bc
--- /dev/null
@@ -0,0 +1,2 @@
+#!/bin/sh
+./src/dbus-env ./src/test-runner session-greeter-reconnect test-gobject-greeter