# Negotiate with daemon
#?XSERVER-98 GOT-WILLING AUTHENTICATION-NAME="" HOSTNAME="" STATUS=""
-#?XSERVER-98 SEND-REQUEST DISPLAY-NUMBER=98 AUTHORIZATION-NAME="MIT-MAGIC-COOKIE-1" MFID="TEST XSERVER"
+#?*XSERVER-98 SEND-REQUEST ADDRESSES="127.0.0.1" AUTHORIZATION-NAMES="MIT-MAGIC-COOKIE-1" MFID="TEST XSERVER"
#?XSERVER-98 GOT-ACCEPT SESSION-ID=[0-9]* AUTHENTICATION-NAME="" AUTHORIZATION-NAME="MIT-MAGIC-COOKIE-1"
-#?XSERVER-98 SEND-MANAGE SESSION-ID=[0-9]* DISPLAY-NUMBER=98 DISPLAY-CLASS="DISPLAY CLASS"
+#?*XSERVER-98 SEND-MANAGE
# LightDM connects to X server
#?XSERVER-98 ACCEPT-CONNECT
# Negotiate with daemon
#?XSERVER-99 GOT-WILLING AUTHENTICATION-NAME="" HOSTNAME="" STATUS=""
-#?XSERVER-99 SEND-REQUEST DISPLAY-NUMBER=99 AUTHORIZATION-NAME="MIT-MAGIC-COOKIE-1" MFID="TEST XSERVER"
+#?*XSERVER-99 SEND-REQUEST ADDRESSES="127.0.0.1" AUTHORIZATION-NAMES="MIT-MAGIC-COOKIE-1" MFID="TEST XSERVER"
#?XSERVER-99 GOT-ACCEPT SESSION-ID=[0-9]* AUTHENTICATION-NAME="" AUTHORIZATION-NAME="MIT-MAGIC-COOKIE-1"
-#?XSERVER-99 SEND-MANAGE SESSION-ID=[0-9]* DISPLAY-NUMBER=99 DISPLAY-CLASS="DISPLAY CLASS"
+#?*XSERVER-99 SEND-MANAGE
# LightDM connects to X server
#?XSERVER-99 ACCEPT-CONNECT
/* XDMCP client */
static XDMCPClient *xdmcp_client = NULL;
+/* Session ID provided by XDMCP server */
+static guint32 xdmcp_session_id = 0;
+
/* Authorization provided by XDMCP server */
static guint16 xdmcp_cookie_length = 0;
static guint8 *xdmcp_cookie = NULL;
static void
xdmcp_willing_cb (XDMCPClient *client, XDMCPWilling *message)
{
- gchar **authorization_names;
- GInetAddress *addresses[2];
-
status_notify ("%s GOT-WILLING AUTHENTICATION-NAME=\"%s\" HOSTNAME=\"%s\" STATUS=\"%s\"", id, message->authentication_name, message->hostname, message->status);
-
- status_notify ("%s SEND-REQUEST DISPLAY-NUMBER=%d AUTHORIZATION-NAME=\"%s\" MFID=\"%s\"", id, display_number, "MIT-MAGIC-COOKIE-1", "TEST XSERVER");
-
- authorization_names = g_strsplit ("MIT-MAGIC-COOKIE-1", " ", -1);
- addresses[0] = xdmcp_client_get_local_address (client);
- addresses[1] = NULL;
- xdmcp_client_send_request (client, display_number,
- addresses,
- "", NULL, 0,
- authorization_names, "TEST XSERVER");
- g_strfreev (authorization_names);
}
static void
{
status_notify ("%s GOT-ACCEPT SESSION-ID=%d AUTHENTICATION-NAME=\"%s\" AUTHORIZATION-NAME=\"%s\"", id, message->session_id, message->authentication_name, message->authorization_name);
- /* Ignore if haven't picked a valid authorization */
- if (strcmp (message->authorization_name, "MIT-MAGIC-COOKIE-1") != 0)
- return;
+ xdmcp_session_id = message->session_id;
g_free (xdmcp_cookie);
xdmcp_cookie_length = message->authorization_data_length;
xdmcp_cookie = g_malloc (message->authorization_data_length);
memcpy (xdmcp_cookie, message->authorization_data, message->authorization_data_length);
-
- status_notify ("%s SEND-MANAGE SESSION-ID=%d DISPLAY-NUMBER=%d DISPLAY-CLASS=\"%s\"", id, message->session_id, display_number, "DISPLAY CLASS");
- xdmcp_client_send_manage (client, message->session_id, display_number, "DISPLAY CLASS");
}
static void
if (!xdmcp_client_start (xdmcp_client))
quit (EXIT_FAILURE);
}
+
+ else if (strcmp (name, "SEND-REQUEST") == 0)
+ {
+ const gchar *addresses_list, *authorization_names_list, *mfid;
+ gchar **list, **authorization_names;
+ gsize list_length;
+ gint i;
+ GInetAddress **addresses;
+
+ addresses_list = g_hash_table_lookup (params, "ADDRESSES");
+ if (!addresses_list)
+ addresses_list = "";
+ 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);
+
+ authorization_names = g_strsplit (authorization_names_list, " ", -1);
+
+ xdmcp_client_send_request (xdmcp_client, display_number,
+ addresses,
+ "", NULL, 0,
+ authorization_names, mfid);
+ g_strfreev (authorization_names);
+ }
+
+ else if (strcmp (name, "SEND-MANAGE") == 0)
+ {
+ xdmcp_client_send_manage (xdmcp_client, xdmcp_session_id, display_number, "DISPLAY CLASS");
+ }
}
static int