summaryrefslogtreecommitdiff
path: root/src/xdmcp-server.c
diff options
context:
space:
mode:
authorrobert.ancell@gmail.com <>2010-07-18 15:53:59 +0200
committerrobert.ancell@gmail.com <>2010-07-18 15:53:59 +0200
commit0d7a5f0568bd1d56687b14eefc414cbc28f482fb (patch)
treebcf51a6222a3c87cfdf75c9d681966996c63cf09 /src/xdmcp-server.c
parent9d162557efb42b094ab8da7c058e75ebbdf99afe (diff)
downloadlightdm-0d7a5f0568bd1d56687b14eefc414cbc28f482fb.tar.gz
Store authorization in files
Diffstat (limited to 'src/xdmcp-server.c')
-rw-r--r--src/xdmcp-server.c24
1 files changed, 18 insertions, 6 deletions
diff --git a/src/xdmcp-server.c b/src/xdmcp-server.c
index cce3ff2e..b69b960e 100644
--- a/src/xdmcp-server.c
+++ b/src/xdmcp-server.c
@@ -267,8 +267,9 @@ handle_request (XDMCPServer *server, GSocket *socket, GSocketAddress *address, X
gboolean match_authorization = FALSE;
guchar *authorization_data = NULL;
gsize authorization_data_length = 0;
+ guchar *session_authorization_data = NULL;
+ gsize session_authorization_data_length = 0;
gchar **j;
- guchar session_key[8];
GInetAddress *address4 = NULL; /*, *address6 = NULL;*/
/* Must be using our authentication scheme */
@@ -333,7 +334,6 @@ handle_request (XDMCPServer *server, GSocket *socket, GSocketAddress *address, X
}
/* Perform requested authorization */
- memset (session_key, 0, sizeof (session_key));
if (strcmp (server->priv->authorization_name, "MIT-MAGIC-COOKIE-1") == 0)
{
/* Data is the cookie */
@@ -344,18 +344,28 @@ handle_request (XDMCPServer *server, GSocket *socket, GSocketAddress *address, X
else if (strcmp (server->priv->authorization_name, "XDM-AUTHORIZATION-1") == 0)
{
gint i;
- guchar key[8];
+ guchar key[8], session_key[8];
/* Setup key */
memset (key, 0, 8);
memcpy (key, server->priv->authentication_data, server->priv->authentication_data_length > 8 ? 8 : server->priv->authentication_data_length);
- /* Generate a private session key and encode it */
+ /* Generate a private session key */
+ // FIXME: Pick a good DES key?
for (i = 0; i < 8; i++)
session_key[i] = g_random_int () & 0xFF;
+
+ /* Encrypt the session key and send it to the server */
authorization_data = g_malloc (sizeof (guchar) * 8);
authorization_data_length = 8;
XdmcpWrap (session_key, key, authorization_data, authorization_data_length);
+
+ /* Authorization data is the session key (64 bit) followed by the private key (56 bit) followed by an empty byte */
+ session_authorization_data = g_malloc (sizeof (guchar) * 16);
+ session_authorization_data_length = 8;
+ memcpy (session_authorization_data, session_key, 8);
+ memcpy (session_authorization_data + 8, key + 1, 7);
+ session_authorization_data[15] = 0;
}
for (i = 0; i < packet->Request.n_connections; i++)
@@ -390,7 +400,9 @@ handle_request (XDMCPServer *server, GSocket *socket, GSocketAddress *address, X
session = add_session (server);
session->priv->address = address4; /*address6 ? address6 : address4;*/
- memcpy (session->priv->key, session_key, 8);
+ session->priv->authorization_name = g_strdup (server->priv->authorization_name);
+ session->priv->authorization_data = session_authorization_data;
+ session->priv->authorization_data_length = session_authorization_data_length;
response = xdmcp_packet_alloc (XDMCP_Accept);
response->Accept.session_id = xdmcp_session_get_id (session);
@@ -574,7 +586,7 @@ xdmcp_server_init (XDMCPServer *server)
server->priv->port = XDM_UDP_PORT;
server->priv->hostname = g_strdup ("");
server->priv->status = g_strdup ("");
- server->priv->sessions = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, g_free);
+ server->priv->sessions = g_hash_table_new_full (g_direct_hash, g_direct_equal, NULL, g_object_unref);
server->priv->authentication_name = g_strdup ("");
server->priv->authorization_name = g_strdup ("");
}