diff options
-rw-r--r-- | tests/Makefile.am | 2 | ||||
-rw-r--r-- | tests/scripts/xdmcp-server-keep-alive.conf | 48 | ||||
-rw-r--r-- | tests/src/X.c | 23 | ||||
-rw-r--r-- | tests/src/xdmcp-client.c | 47 | ||||
-rw-r--r-- | tests/src/xdmcp-client.h | 10 | ||||
-rwxr-xr-x | tests/test-xdmcp-server-keep-alive | 2 |
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 |