summaryrefslogtreecommitdiff
path: root/tests/src/X.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/src/X.c')
-rw-r--r--tests/src/X.c192
1 files changed, 169 insertions, 23 deletions
diff --git a/tests/src/X.c b/tests/src/X.c
index e35d0086..618f8893 100644
--- a/tests/src/X.c
+++ b/tests/src/X.c
@@ -104,27 +104,46 @@ sigterm_cb (gpointer user_data)
}
static void
-xdmcp_query_cb (XDMCPClient *client)
+xdmcp_willing_cb (XDMCPClient *client, XDMCPWilling *message)
{
- static gboolean notified_query = FALSE;
-
- if (!notified_query)
- {
- status_notify ("%s SEND-QUERY", id);
- notified_query = TRUE;
- }
+ status_notify ("%s GOT-WILLING AUTHENTICATION-NAME=\"%s\" HOSTNAME=\"%s\" STATUS=\"%s\"", id, message->authentication_name, message->hostname, message->status);
}
static void
-xdmcp_willing_cb (XDMCPClient *client, XDMCPWilling *message)
+xdmcp_unwilling_cb (XDMCPClient *client, XDMCPUnwilling *message)
{
- status_notify ("%s GOT-WILLING AUTHENTICATION-NAME=\"%s\" HOSTNAME=\"%s\" STATUS=\"%s\"", id, message->authentication_name, message->hostname, message->status);
+ status_notify ("%s GOT-UNWILLING HOSTNAME=\"%s\" STATUS=\"%s\"", id, message->hostname, message->status);
+}
+
+static gchar *
+data_to_string (guint8 *data, gsize data_length)
+{
+ static gchar hex_char[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
+ gchar *text;
+ gsize i;
+
+ text = malloc (data_length * 2 + 1);
+ for (i = 0; i < data_length; i++)
+ {
+ text[i*2] = hex_char [data[i] >> 4];
+ text[i*2 + 1] = hex_char [data[i] & 0xF];
+ }
+ text[i*2] = '\0';
+
+ return text;
}
static void
xdmcp_accept_cb (XDMCPClient *client, XDMCPAccept *message)
{
- status_notify ("%s GOT-ACCEPT SESSION-ID=%d AUTHENTICATION-NAME=\"%s\" AUTHORIZATION-NAME=\"%s\"", id, message->session_id, message->authentication_name, message->authorization_name);
+ gchar *authentication_data_text, *authorization_data_text;
+
+ authentication_data_text = data_to_string (message->authentication_data, message->authentication_data_length);
+ authorization_data_text = data_to_string (message->authorization_data, message->authorization_data_length);
+ status_notify ("%s GOT-ACCEPT SESSION-ID=%d AUTHENTICATION-NAME=\"%s\" AUTHENTICATION-DATA=%s AUTHORIZATION-NAME=\"%s\" AUTHORIZATION-DATA=%s",
+ id, message->session_id, message->authentication_name, authentication_data_text, message->authorization_name, authorization_data_text);
+ g_free (authentication_data_text);
+ g_free (authorization_data_text);
xdmcp_session_id = message->session_id;
@@ -137,7 +156,11 @@ xdmcp_accept_cb (XDMCPClient *client, XDMCPAccept *message)
static void
xdmcp_decline_cb (XDMCPClient *client, XDMCPDecline *message)
{
- status_notify ("%s GOT-DECLINE STATUS=\"%s\" AUTHENTICATION-NAME=\"%s\"", id, message->status, message->authentication_name);
+ gchar *authentication_data_text;
+
+ authentication_data_text = data_to_string (message->authentication_data, message->authentication_data_length);
+ status_notify ("%s GOT-DECLINE STATUS=\"%s\" AUTHENTICATION-NAME=\"%s\" AUTHENTICATION-DATA=%s", id, message->status, message->authentication_name, authentication_data_text);
+ g_free (authentication_data_text);
}
static void
@@ -147,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);
@@ -155,8 +184,21 @@ client_connected_cb (XServer *server, XClient *client)
static void
client_disconnected_cb (XServer *server, XClient *client)
-{
- g_signal_handlers_disconnect_matched (client, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, NULL);
+{
+ g_signal_handlers_disconnect_matched (client, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, NULL);
+}
+
+static guint8
+get_nibble (char c)
+{
+ if (c >= '0' && c <= '9')
+ return c - '0';
+ else if (c >= 'a' && c <= 'f')
+ return c - 'a' + 10;
+ else if (c >= 'A' && c <= 'F')
+ return c - 'A' + 10;
+ else
+ return 0;
}
static void
@@ -187,10 +229,113 @@ request_cb (const gchar *name, GHashTable *params)
signal (SIGUSR1, handler);
}
- else if (strcmp (name, "START-XDMCP") == 0)
+ else if (strcmp (name, "SEND-QUERY") == 0)
{
+ const gchar *authentication_names_list;
+ gchar **authentication_names;
+
if (!xdmcp_client_start (xdmcp_client))
quit (EXIT_FAILURE);
+
+ authentication_names_list = g_hash_table_lookup (params, "AUTHENTICATION-NAMES");
+ if (!authentication_names_list)
+ authentication_names_list = "";
+ authentication_names = g_strsplit (authentication_names_list, " ", -1);
+
+ xdmcp_client_send_query (xdmcp_client, authentication_names);
+ g_strfreev (authentication_names);
+ }
+
+ else if (strcmp (name, "SEND-REQUEST") == 0)
+ {
+ const gchar *text, *addresses_list, *authentication_name, *authentication_data_text, *authorization_names_list, *mfid;
+ int request_display_number = display_number;
+ gchar **list, **authorization_names;
+ guint8 *authentication_data;
+ gsize authentication_data_length, list_length;
+ gint i;
+ GInetAddress **addresses;
+
+ text = g_hash_table_lookup (params, "DISPLAY-NUMBER");
+ if (text)
+ request_display_number = atoi (text);
+ addresses_list = g_hash_table_lookup (params, "ADDRESSES");
+ if (!addresses_list)
+ addresses_list = "";
+ authentication_name = g_hash_table_lookup (params, "AUTHENTICATION-NAME");
+ if (!authentication_name)
+ authentication_name = "";
+ authentication_data_text = g_hash_table_lookup (params, "AUTHENTICATION-DATA");
+ if (!authentication_data_text)
+ authentication_data_text = "";
+ authorization_names_list = g_hash_table_lookup (params, "AUTHORIZATION-NAMES");
+ if (!authorization_names_list)
+ authorization_names_list = "";
+ mfid = g_hash_table_lookup (params, "MFID");
+ if (!mfid)
+ mfid = "";
+
+ list = g_strsplit (addresses_list, " ", -1);
+ list_length = g_strv_length (list);
+ addresses = g_malloc (sizeof (GInetAddress *) * (list_length + 1));
+ for (i = 0; i < list_length; i++)
+ addresses[i] = g_inet_address_new_from_string (list[i]);
+ addresses[i] = NULL;
+ g_strfreev (list);
+
+ authentication_data_length = strlen (authentication_data_text) / 2;
+ authentication_data = malloc (authentication_data_length);
+ for (i = 0; i < authentication_data_length; i++)
+ authentication_data[i] = get_nibble (authentication_data_text[i*2]) << 4 | get_nibble (authentication_data_text[i*2+1]);
+
+ authorization_names = g_strsplit (authorization_names_list, " ", -1);
+
+ xdmcp_client_send_request (xdmcp_client,
+ request_display_number,
+ addresses,
+ authentication_name,
+ authentication_data, authentication_data_length,
+ authorization_names, mfid);
+ g_free (authentication_data);
+ g_strfreev (authorization_names);
+ }
+
+ else if (strcmp (name, "SEND-MANAGE") == 0)
+ {
+ const char *text, *display_class;
+ guint32 session_id = xdmcp_session_id;
+ guint16 manage_display_number = display_number;
+
+ text = g_hash_table_lookup (params, "SESSION-ID");
+ if (text)
+ session_id = atoi (text);
+ text = g_hash_table_lookup (params, "DISPLAY-NUMBER");
+ if (text)
+ manage_display_number = atoi (text);
+ display_class = g_hash_table_lookup (params, "DISPLAY-CLASS");
+
+ if (!display_class)
+ display_class = "";
+ xdmcp_client_send_manage (xdmcp_client,
+ session_id,
+ 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);
}
else if (strcmp (name, "SEND-REQUEST") == 0)
@@ -411,8 +556,8 @@ main (int argc, char **argv)
status_connect (request_cb, id);
xserver = x_server_new (display_number);
- g_signal_connect (xserver, "client-connected", G_CALLBACK (client_connected_cb), NULL);
- g_signal_connect (xserver, "client-disconnected", G_CALLBACK (client_disconnected_cb), NULL);
+ g_signal_connect (xserver, X_SERVER_SIGNAL_CLIENT_CONNECTED, G_CALLBACK (client_connected_cb), NULL);
+ g_signal_connect (xserver, X_SERVER_SIGNAL_CLIENT_DISCONNECTED, G_CALLBACK (client_disconnected_cb), NULL);
status_text = g_string_new ("");
g_string_printf (status_text, "%s START", id);
@@ -466,7 +611,7 @@ main (int argc, char **argv)
gchar *socket_path;
socket_dir = g_build_filename (g_getenv ("LIGHTDM_TEST_ROOT"), "tmp", ".X11-unix", NULL);
- g_mkdir_with_parents (socket_dir, 0755);
+ g_mkdir_with_parents (socket_dir, 0755);
socket_filename = g_strdup_printf ("X%d", display_number);
socket_path = g_build_filename (socket_dir, socket_filename, NULL);
@@ -514,11 +659,12 @@ main (int argc, char **argv)
xdmcp_client_set_hostname (xdmcp_client, xdmcp_host);
if (xdmcp_port > 0)
xdmcp_client_set_port (xdmcp_client, xdmcp_port);
- g_signal_connect (xdmcp_client, "query", G_CALLBACK (xdmcp_query_cb), NULL);
- g_signal_connect (xdmcp_client, "willing", G_CALLBACK (xdmcp_willing_cb), NULL);
- g_signal_connect (xdmcp_client, "accept", G_CALLBACK (xdmcp_accept_cb), NULL);
- g_signal_connect (xdmcp_client, "decline", G_CALLBACK (xdmcp_decline_cb), NULL);
- g_signal_connect (xdmcp_client, "failed", G_CALLBACK (xdmcp_failed_cb), NULL);
+ g_signal_connect (xdmcp_client, XDMCP_CLIENT_SIGNAL_WILLING, G_CALLBACK (xdmcp_willing_cb), NULL);
+ g_signal_connect (xdmcp_client, XDMCP_CLIENT_SIGNAL_UNWILLING, G_CALLBACK (xdmcp_unwilling_cb), NULL);
+ 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);