summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Ancell <robert.ancell@canonical.com>2015-11-20 13:03:36 +1300
committerRobert Ancell <robert.ancell@canonical.com>2015-11-20 13:03:36 +1300
commit0197e0c37094638d0d6d646aa44ca6e8ce1775cf (patch)
tree8a50dc8e98bdb7dd93cc1f05748f3f8bf310a5f9
parent3d160784fd90f82be10ba2cb7d5e15521fff96c4 (diff)
downloadlightdm-0197e0c37094638d0d6d646aa44ca6e8ce1775cf.tar.gz
Check LightDM responds to XDMCP KeepAlive packets
-rw-r--r--tests/Makefile.am2
-rw-r--r--tests/scripts/xdmcp-server-keep-alive.conf48
-rw-r--r--tests/src/X.c23
-rw-r--r--tests/src/xdmcp-client.c47
-rw-r--r--tests/src/xdmcp-client.h10
-rwxr-xr-xtests/test-xdmcp-server-keep-alive2
6 files changed, 132 insertions, 0 deletions
diff --git a/tests/Makefile.am b/tests/Makefile.am
index a73046f0..7f6c4dea 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -179,6 +179,7 @@ TESTS = \
test-xdmcp-server-login \
test-xdmcp-server-double-login \
test-xdmcp-server-guest \
+ test-xdmcp-server-keep-alive \
test-xdmcp-server-xdm-authentication \
test-xdmcp-server-xdm-authentication-missing-data \
test-xdmcp-server-xdm-authentication-short-data \
@@ -611,6 +612,7 @@ EXTRA_DIST = \
scripts/xdmcp-server-double-login.conf \
scripts/xdmcp-server-guest.conf \
scripts/xdmcp-server-invalid-authentication.conf \
+ scripts/xdmcp-server-keep-alive.conf \
scripts/xdmcp-server-login.conf \
scripts/xdmcp-server-open-file-descriptors.conf \
scripts/xdmcp-server-request-invalid-authentication.conf \
diff --git a/tests/scripts/xdmcp-server-keep-alive.conf b/tests/scripts/xdmcp-server-keep-alive.conf
new file mode 100644
index 00000000..194ec883
--- /dev/null
+++ b/tests/scripts/xdmcp-server-keep-alive.conf
@@ -0,0 +1,48 @@
+#
+# Check that LightDM correctly responds to KeepAlive messages
+#
+
+[LightDM]
+start-default-seat=false
+
+[XDMCPServer]
+enabled=true
+
+[Seat:*]
+user-session=default
+autologin-user=have-password1
+
+#?*START-DAEMON
+#?RUNNER DAEMON-START
+#?*WAIT
+
+# Start a remote X server to log in with XDMCP
+#?*START-XSERVER ARGS=":98 -query 127.0.0.1 -nolisten unix"
+#?XSERVER-98 START LISTEN-TCP NO-LISTEN-UNIX
+
+# Request to connect - daemon says OK
+#?*XSERVER-98 SEND-QUERY
+#?XSERVER-98 GOT-WILLING AUTHENTICATION-NAME="" HOSTNAME="" STATUS=""
+
+# Connect - daemon says OK
+#?*XSERVER-98 SEND-REQUEST ADDRESSES="127.0.0.1" AUTHORIZATION-NAMES="MIT-MAGIC-COOKIE-1"
+#?XSERVER-98 GOT-ACCEPT SESSION-ID=[0-9]+ AUTHENTICATION-NAME="" AUTHENTICATION-DATA= AUTHORIZATION-NAME="MIT-MAGIC-COOKIE-1" AUTHORIZATION-DATA=[0-9A-F]{32}
+#?*XSERVER-98 SEND-MANAGE
+
+# LightDM connects to X server
+#?XSERVER-98 ACCEPT-CONNECT
+
+# Session starts
+#?SESSION-X-127.0.0.1:98 START XDG_SESSION_TYPE=x11 XDG_SESSION_DESKTOP=default USER=have-password1
+#?LOGIN1 ACTIVATE-SESSION SESSION=c0
+#?XSERVER-98 ACCEPT-CONNECT
+#?SESSION-X-127.0.0.1:98 CONNECT-XSERVER
+
+# Check daemon is alive
+#?*XSERVER-98 SEND-KEEP-ALIVE
+#?XSERVER-98 GOT-ALIVE SESSION-RUNNING=TRUE SESSION-ID=[0-9]+
+
+# Clean up
+#?*STOP-DAEMON
+#?SESSION-X-127.0.0.1:98 TERMINATE SIGNAL=15
+#?RUNNER DAEMON-EXIT STATUS=0
diff --git a/tests/src/X.c b/tests/src/X.c
index ca25c532..a367a9d4 100644
--- a/tests/src/X.c
+++ b/tests/src/X.c
@@ -170,6 +170,12 @@ xdmcp_failed_cb (XDMCPClient *client, XDMCPFailed *message)
}
static void
+xdmcp_alive_cb (XDMCPClient *client, XDMCPAlive *message)
+{
+ status_notify ("%s GOT-ALIVE SESSION-RUNNING=%s SESSION-ID=%d", id, message->session_running ? "TRUE" : "FALSE", message->session_id);
+}
+
+static void
client_connected_cb (XServer *server, XClient *client)
{
status_notify ("%s ACCEPT-CONNECT", id);
@@ -315,6 +321,22 @@ request_cb (const gchar *name, GHashTable *params)
manage_display_number,
display_class);
}
+
+ else if (strcmp (name, "SEND-KEEP-ALIVE") == 0)
+ {
+ const char *text;
+ guint32 session_id = xdmcp_session_id;
+ guint16 keep_alive_display_number = display_number;
+
+ text = g_hash_table_lookup (params, "DISPLAY-NUMBER");
+ if (text)
+ keep_alive_display_number = atoi (text);
+ text = g_hash_table_lookup (params, "SESSION-ID");
+ if (text)
+ session_id = atoi (text);
+
+ xdmcp_client_send_keep_alive (xdmcp_client, keep_alive_display_number, session_id);
+ }
}
static int
@@ -594,6 +616,7 @@ main (int argc, char **argv)
g_signal_connect (xdmcp_client, XDMCP_CLIENT_SIGNAL_ACCEPT, G_CALLBACK (xdmcp_accept_cb), NULL);
g_signal_connect (xdmcp_client, XDMCP_CLIENT_SIGNAL_DECLINE, G_CALLBACK (xdmcp_decline_cb), NULL);
g_signal_connect (xdmcp_client, XDMCP_CLIENT_SIGNAL_FAILED, G_CALLBACK (xdmcp_failed_cb), NULL);
+ g_signal_connect (xdmcp_client, XDMCP_CLIENT_SIGNAL_ALIVE, G_CALLBACK (xdmcp_alive_cb), NULL);
}
g_main_loop_run (loop);
diff --git a/tests/src/xdmcp-client.c b/tests/src/xdmcp-client.c
index e81bfad3..84b0b599 100644
--- a/tests/src/xdmcp-client.c
+++ b/tests/src/xdmcp-client.c
@@ -48,6 +48,7 @@ enum {
XDMCP_CLIENT_ACCEPT,
XDMCP_CLIENT_DECLINE,
XDMCP_CLIENT_FAILED,
+ XDMCP_CLIENT_ALIVE,
XDMCP_CLIENT_LAST_SIGNAL
};
static guint xdmcp_client_signals[XDMCP_CLIENT_LAST_SIGNAL] = { 0 };
@@ -133,6 +134,7 @@ decode_accept (XDMCPClient *client, const guint8 *buffer, gssize buffer_length)
g_signal_emit (client, xdmcp_client_signals[XDMCP_CLIENT_ACCEPT], 0, message);
g_free (message->authentication_name);
+ g_free (message->authentication_data);
g_free (message->authorization_name);
g_free (message->authorization_data);
g_free (message);
@@ -158,6 +160,7 @@ decode_decline (XDMCPClient *client, const guint8 *buffer, gssize buffer_length)
g_free (message->status);
g_free (message->authentication_name);
+ g_free (message->authentication_data);
g_free (message);
}
@@ -180,6 +183,22 @@ decode_failed (XDMCPClient *client, const guint8 *buffer, gssize buffer_length)
g_free (message);
}
+static void
+decode_alive (XDMCPClient *client, const guint8 *buffer, gssize buffer_length)
+{
+ XDMCPAlive *message;
+ gsize offset = 0;
+
+ message = g_malloc0 (sizeof (XDMCPAlive));
+
+ message->session_running = read_card8 (buffer, buffer_length, &offset) != 0 ? TRUE : FALSE;
+ message->session_id = read_card32 (buffer, buffer_length, X_BYTE_ORDER_MSB, &offset);
+
+ g_signal_emit (client, xdmcp_client_signals[XDMCP_CLIENT_ALIVE], 0, message);
+
+ g_free (message);
+}
+
static gboolean
xdmcp_data_cb (GIOChannel *channel, GIOCondition condition, gpointer data)
{
@@ -236,6 +255,10 @@ xdmcp_data_cb (GIOChannel *channel, GIOCondition condition, gpointer data)
decode_failed (client, buffer + offset, n_read - offset);
break;
+ case XDMCP_Alive:
+ decode_alive (client, buffer + offset, n_read - offset);
+ break;
+
default:
g_debug ("Ignoring unknown XDMCP opcode %d", opcode);
break;
@@ -457,6 +480,22 @@ xdmcp_client_send_manage (XDMCPClient *client, guint32 session_id, guint16 displ
xdmcp_write (client, buffer, offset);
}
+void
+xdmcp_client_send_keep_alive (XDMCPClient *client, guint16 display_number, guint32 session_id)
+{
+ guint8 buffer[MAXIMUM_REQUEST_LENGTH];
+ gsize offset = 0;
+
+ write_card16 (buffer, MAXIMUM_REQUEST_LENGTH, X_BYTE_ORDER_MSB, XDMCP_VERSION, &offset);
+ write_card16 (buffer, MAXIMUM_REQUEST_LENGTH, X_BYTE_ORDER_MSB, XDMCP_KeepAlive, &offset);
+ write_card16 (buffer, MAXIMUM_REQUEST_LENGTH, X_BYTE_ORDER_MSB, 6, &offset);
+
+ write_card16 (buffer, MAXIMUM_REQUEST_LENGTH, X_BYTE_ORDER_MSB, display_number, &offset);
+ write_card32 (buffer, MAXIMUM_REQUEST_LENGTH, X_BYTE_ORDER_MSB, session_id, &offset);
+
+ xdmcp_write (client, buffer, offset);
+}
+
static void
xdmcp_client_finalize (GObject *object)
{
@@ -514,4 +553,12 @@ xdmcp_client_class_init (XDMCPClientClass *klass)
NULL, NULL,
NULL,
G_TYPE_NONE, 1, G_TYPE_POINTER);
+ xdmcp_client_signals[XDMCP_CLIENT_ALIVE] =
+ g_signal_new (XDMCP_CLIENT_SIGNAL_ALIVE,
+ G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (XDMCPClientClass, alive),
+ NULL, NULL,
+ NULL,
+ G_TYPE_NONE, 1, G_TYPE_POINTER);
}
diff --git a/tests/src/xdmcp-client.h b/tests/src/xdmcp-client.h
index 7d13fca5..89e97b7b 100644
--- a/tests/src/xdmcp-client.h
+++ b/tests/src/xdmcp-client.h
@@ -12,6 +12,7 @@
#define XDMCP_CLIENT_SIGNAL_ACCEPT "accept"
#define XDMCP_CLIENT_SIGNAL_DECLINE "decline"
#define XDMCP_CLIENT_SIGNAL_FAILED "failed"
+#define XDMCP_CLIENT_SIGNAL_ALIVE "alive"
typedef struct
{
@@ -51,6 +52,12 @@ typedef struct
gchar *status;
} XDMCPFailed;
+typedef struct
+{
+ gboolean session_running;
+ guint32 session_id;
+} XDMCPAlive;
+
typedef struct XDMCPClientPrivate XDMCPClientPrivate;
typedef struct
@@ -67,6 +74,7 @@ typedef struct
void (*accept)(XDMCPClient *client, XDMCPAccept *message);
void (*decline)(XDMCPClient *client, XDMCPDecline *message);
void (*failed)(XDMCPClient *client, XDMCPFailed *message);
+ void (*alive)(XDMCPClient *client, XDMCPAlive *message);
} XDMCPClientClass;
GType xdmcp_client_get_type (void);
@@ -96,6 +104,8 @@ void xdmcp_client_send_request (XDMCPClient *client,
void xdmcp_client_send_manage (XDMCPClient *client, guint32 session_id, guint16 display_number, const gchar *display_class);
+void xdmcp_client_send_keep_alive (XDMCPClient *client, guint16 display_number, guint32 session_id);
+
G_END_DECLS
#endif /* XDMCP_CLIENT_H_ */
diff --git a/tests/test-xdmcp-server-keep-alive b/tests/test-xdmcp-server-keep-alive
new file mode 100755
index 00000000..f6190de3
--- /dev/null
+++ b/tests/test-xdmcp-server-keep-alive
@@ -0,0 +1,2 @@
+#!/bin/sh
+./src/dbus-env ./src/test-runner xdmcp-server-keep-alive test-gobject-greeter