summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Ancell <robert.ancell@canonical.com>2016-07-29 15:51:42 +1200
committerRobert Ancell <robert.ancell@canonical.com>2016-07-29 15:51:42 +1200
commitc673712bb461cec49d4c8a6db25c96ca7c8fc6f3 (patch)
tree08619d927ac8bfc41b7c907a70c609b30295246f
parent018691887d2d00925f2e17be7e9e24c08818084e (diff)
downloadlightdm-git-c673712bb461cec49d4c8a6db25c96ca7c8fc6f3.tar.gz
Allow in-session greeters to reconnect
-rw-r--r--src/greeter-socket.c11
-rw-r--r--src/greeter.c12
-rw-r--r--src/greeter.h2
-rw-r--r--tests/Makefile.am4
-rw-r--r--tests/scripts/session-greeter-reconnect.conf66
-rw-r--r--tests/src/test-session.c6
-rwxr-xr-xtests/test-session-greeter-reconnect2
7 files changed, 102 insertions, 1 deletions
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