From c673712bb461cec49d4c8a6db25c96ca7c8fc6f3 Mon Sep 17 00:00:00 2001 From: Robert Ancell Date: Fri, 29 Jul 2016 15:51:42 +1200 Subject: Allow in-session greeters to reconnect --- src/greeter-socket.c | 11 +++++ src/greeter.c | 12 +++++ src/greeter.h | 2 + tests/Makefile.am | 4 +- tests/scripts/session-greeter-reconnect.conf | 66 ++++++++++++++++++++++++++++ tests/src/test-session.c | 6 +++ tests/test-session-greeter-reconnect | 2 + 7 files changed, 102 insertions(+), 1 deletion(-) create mode 100644 tests/scripts/session-greeter-reconnect.conf create mode 100755 tests/test-session-greeter-reconnect diff --git a/src/greeter-socket.c b/src/greeter-socket.c index 18e6a52f..4a7beb53 100644 --- a/src/greeter-socket.c +++ b/src/greeter-socket.c @@ -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; diff --git a/src/greeter.c b/src/greeter.c index 124e4c8a..e2ae19f9 100644 --- a/src/greeter.c +++ b/src/greeter.c @@ -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), diff --git a/src/greeter.h b/src/greeter.h index 19ddf86c..b9404ae5 100644 --- a/src/greeter.h +++ b/src/greeter.h @@ -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; diff --git a/tests/Makefile.am b/tests/Makefile.am index ef941d24..41934259 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -168,6 +168,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 \ @@ -540,7 +541,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 index 00000000..2d2c45eb --- /dev/null +++ b/tests/scripts/session-greeter-reconnect.conf @@ -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 diff --git a/tests/src/test-session.c b/tests/src/test-session.c index 88be15ec..1b2669fd 100644 --- a/tests/src/test-session.c +++ b/tests/src/test-session.c @@ -271,6 +271,12 @@ request_cb (const gchar *name, GHashTable *params) status_notify ("%s GREETER-FAILED", session_id); } + else if (strcmp (name, "GREETER-STOP") == 0) + { + g_assert (greeter != NULL); + g_clear_object (&greeter); + } + else if (strcmp (name, "GREETER-AUTHENTICATE") == 0) { lightdm_greeter_authenticate (greeter, g_hash_table_lookup (params, "USERNAME")); diff --git a/tests/test-session-greeter-reconnect b/tests/test-session-greeter-reconnect new file mode 100755 index 00000000..e7972bc1 --- /dev/null +++ b/tests/test-session-greeter-reconnect @@ -0,0 +1,2 @@ +#!/bin/sh +./src/dbus-env ./src/test-runner session-greeter-reconnect test-gobject-greeter -- cgit v1.2.1