--- gdm-2.17.6/docs/C/gdm.xml.username 2007-01-22 00:31:17.000000000 -0500 +++ gdm-2.17.6/docs/C/gdm.xml 2007-02-06 22:52:08.000000000 -0500 @@ -2,8 +2,8 @@ - - + + ]>
@@ -13,7 +13,7 @@ 0.0 - 2006-12 + 2007-01 @@ -4515,7 +4515,9 @@ AUTH_LOCAL CLOSE FLEXI_XNEST +FLEXI_XNEST_USER FLEXI_XSERVER +FLEXI_XSERVER_USER GET_CONFIG GET_CONFIG_FILE GET_CUSTOM_CONFIG_FILE @@ -4699,6 +4701,36 @@ + + FLEXI_XNEST_USER + +FLEXI_XNEST_USER: Start a new flexible Xnest display and + initialize the greeter with the given username. +Note: This is a variant of the FLEXI_XNEST command. +Note: The cookie should be the MIT-MAGIC-COOKIE-1, + the first one GDM can find in the XAUTHORITY + file for this display. If that's not what you + use you should generate one first. The cookie + should be in hex form. +Supported since: 2.17.7 +Arguments: <username> <display to run on> <uid of requesting user> + <xauth cookie for the display> <xauth file> +Answers: + OK <display> + ERROR <err number> <english error description> + 0 = Not implemented + 1 = No more flexi servers + 2 = Startup errors + 3 = X failed + 4 = X too busy + 5 = Xnest can't connect + 6 = No server binary + 100 = Not authenticated + 200 = Too many messages + 999 = Unknown error + + + FLEXI_XSERVER @@ -4722,6 +4754,30 @@ + + FLEXI_XSERVER_USER + +FLEXI_XSERVER_USER: Start a new X flexible display and initialize the + greeter with the given username. Only supported on + connection that passed AUTH_LOCAL +Supported since: 2.17.7 +Arguments: <username> <xserver type> + If no server type specified, starts the standard X server +Answers: + OK <display> + ERROR <err number> <english error description> + 0 = Not implemented + 1 = No more flexi servers + 2 = Startup errors + 3 = X failed + 4 = X too busy + 6 = No server binary + 100 = Not authenticated + 200 = Too many messages + 999 = Unknown error + + + GET_CONFIG --- gdm-2.17.6/daemon/slave.c.username 2007-02-06 22:52:08.000000000 -0500 +++ gdm-2.17.6/daemon/slave.c 2007-02-06 22:52:08.000000000 -0500 @@ -1946,6 +1946,7 @@ gdm_slave_wait_for_login (void) { char *successsound; + char *username; g_free (login); login = NULL; @@ -1970,10 +1971,14 @@ NEVER_FAILS_root_set_euid_egid (0, 0); gdm_debug ("gdm_slave_wait_for_login: In loop"); + username = d->preset_user; + d->preset_user = NULL; login = gdm_verify_user (d /* the display */, - NULL /* username*/, + username /* username*/, d->name /* display name */, d->attached /* display attached? (bool) */); + g_free (username); + gdm_debug ("gdm_slave_wait_for_login: end verify for '%s'", ve_sure_string (login)); --- gdm-2.17.6/daemon/server.c.username 2007-01-22 00:20:40.000000000 -0500 +++ gdm-2.17.6/daemon/server.c 2007-02-06 22:52:08.000000000 -0500 @@ -1439,6 +1439,7 @@ d->retry_count = 0; d->sleep_before_run = 0; d->login = NULL; + d->preset_user = NULL; d->timed_login_ok = FALSE; --- gdm-2.17.6/daemon/gdm.h.username 2007-02-06 22:52:08.000000000 -0500 +++ gdm-2.17.6/daemon/gdm.h 2007-02-06 22:52:08.000000000 -0500 @@ -557,6 +557,8 @@ gboolean logged_in; /* TRUE if someone is logged in */ char *login; + char *preset_user; + gboolean timed_login_ok; int screenx; @@ -874,6 +876,26 @@ * 200 = Too many messages * 999 = Unknown error */ +#define GDM_SUP_FLEXI_XSERVER_USER "FLEXI_XSERVER_USER" /* */ +/* FLEXI_XSERVER_USER: Start a new X flexible display and initialize the + * greeter with the given username. Only supported on + * connection that passed AUTH_LOCAL + * Supported since: 2.17.7 + * Arguments: + * If no server type specified, starts the standard X server + * Answers: + * OK + * ERROR + * 0 = Not implemented + * 1 = No more flexi servers + * 2 = Startup errors + * 3 = X failed + * 4 = X too busy + * 6 = No server binary + * 100 = Not authenticated + * 200 = Too many messages + * 999 = Unknown error + */ #define GDM_SUP_FLEXI_XNEST "FLEXI_XNEST" /* */ /* FLEXI_XNEXT: Start a new flexible Xnest display. * Note: Supported on older versions from 2.2.4.0, later @@ -909,6 +931,31 @@ * 200 = Too many messages * 999 = Unknown error */ +#define GDM_SUP_FLEXI_XNEST_USER "FLEXI_XNEST_USER" /* */ +/* FLEXI_XNEXT_USER: Start a new flexible Xnest display and + * initialize the greeter with the given username + * Note: The cookie should be the MIT-MAGIC-COOKIE-1, + * the first one gdm can find in the XAUTHORITY + * file for this display. If that's not what you + * use you should generate one first. The cookie + * should be in hex form. + * Supported since: 2.17.7 + * Arguments: + * + * Answers: + * OK + * ERROR + * 0 = Not implemented + * 1 = No more flexi servers + * 2 = Startup errors + * 3 = X failed + * 4 = X too busy + * 5 = Xnest can't connect + * 6 = No server binary + * 100 = Not authenticated + * 200 = Too many messages + * 999 = Unknown error + */ #define GDM_SUP_ADD_DYNAMIC_DISPLAY "ADD_DYNAMIC_DISPLAY" /* * ADD_DYNAMIC_DISPLAY: Create a new server definition that will --- gdm-2.17.6/daemon/display.c.username 2007-01-22 00:20:40.000000000 -0500 +++ gdm-2.17.6/daemon/display.c 2007-02-06 22:52:08.000000000 -0500 @@ -1,4 +1,6 @@ -/* GDM - The GNOME Display Manager +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * + * GDM - The GNOME Display Manager * Copyright (C) 1998, 1999, 2000 Martin K. Petersen * * This program is free software; you can redistribute it and/or modify @@ -531,6 +533,9 @@ g_free (d->login); d->login = NULL; + g_free (d->preset_user); + d->preset_user = NULL; + g_free (d->xsession_errors_filename); d->xsession_errors_filename = NULL; --- gdm-2.17.6/daemon/gdm.c.username 2007-02-06 22:52:08.000000000 -0500 +++ gdm-2.17.6/daemon/gdm.c 2007-02-06 22:53:54.000000000 -0500 @@ -1,4 +1,6 @@ -/* GDM - The GNOME Display Manager +/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- + * + * GDM - The GNOME Display Manager * Copyright (C) 1998, 1999, 2000 Martin K. Petersen * * This program is free software; you can redistribute it and/or modify @@ -103,7 +105,8 @@ const gchar *xnest_disp, uid_t xnest_uid, const gchar *xnest_auth_file, - const gchar *xnest_cookie); + const gchar *xnest_cookie, + const gchar *username); static void custom_cmd_restart (long cmd_id); static void custom_cmd_no_restart (long cmd_id); @@ -2563,7 +2566,7 @@ handle_flexi_server (NULL, TYPE_FLEXI, gdm_get_value_string (GDM_KEY_STANDARD_XSERVER), TRUE /* handled */, FALSE /* chooser */, - NULL, 0, NULL, NULL); + NULL, 0, NULL, NULL, NULL); } else if (strcmp (msg, GDM_SOP_CANCEL_LOGIN_REQUESTS) == 0) { GSList *li; for (li = displays; li != NULL; li = li->next) { @@ -2970,7 +2973,8 @@ gboolean chooser, const gchar *xnest_disp, uid_t xnest_uid, const gchar *xnest_auth_file, - const gchar *xnest_cookie) + const gchar *xnest_cookie, + const gchar *username) { GdmDisplay *display; gchar *bin; @@ -3102,6 +3106,7 @@ flexi_servers++; + display->preset_user = g_strdup (username); display->type = type; display->socket_conn = conn; display->parent_disp = g_strdup (xnest_disp); @@ -3243,6 +3248,7 @@ gdm_handle_user_message (GdmConnection *conn, const gchar *msg, gpointer data) { gint i; + gboolean has_user; gdm_debug ("Handling user message: '%s'", msg); @@ -3311,12 +3317,16 @@ handle_flexi_server (conn, TYPE_FLEXI, gdm_get_value_string (GDM_KEY_STANDARD_XSERVER), TRUE /* handled */, FALSE /* chooser */, - NULL, 0, NULL, NULL); - } else if (strncmp (msg, GDM_SUP_FLEXI_XSERVER " ", - strlen (GDM_SUP_FLEXI_XSERVER " ")) == 0) { + NULL, 0, NULL, NULL, NULL); + } else if (((has_user = strncmp (msg, GDM_SUP_FLEXI_XSERVER_USER " ", + strlen (GDM_SUP_FLEXI_XSERVER_USER " "))) == 0) || + (strncmp (msg, GDM_SUP_FLEXI_XSERVER " ", + strlen (GDM_SUP_FLEXI_XSERVER " ")) == 0)) { gchar *name; const gchar *command = NULL; GdmXserver *svr; + const gchar *rest; + gchar *username, *end; /* Only allow locally authenticated connections */ if ( ! GDM_CONN_AUTHENTICATED(conn)) { @@ -3327,7 +3337,21 @@ return; } - name = g_strdup (&msg[strlen (GDM_SUP_FLEXI_XSERVER " ")]); + if (has_user == 0) { + rest = msg + strlen (GDM_SUP_FLEXI_XSERVER_USER " "); + end = strchr (rest, ' '); + if (end) { + username = g_strndup (rest, end - rest); + rest = end + 1; + } else { + username = g_strdup (rest); + rest = rest + strlen (rest); + } + } else { + rest = msg + strlen (GDM_SUP_FLEXI_XSERVER " "); + username = NULL; + } + name = g_strdup (rest); g_strstrip (name); if (ve_string_empty (name)) { g_free (name); @@ -3357,13 +3381,27 @@ oh well, this makes other things simpler */ svr->handled, svr->chooser, - NULL, 0, NULL, NULL); - } else if (strncmp (msg, GDM_SUP_FLEXI_XNEST " ", - strlen (GDM_SUP_FLEXI_XNEST " ")) == 0) { + NULL, 0, NULL, NULL, username); + g_free (username); + } else if (((has_user = strncmp (msg, GDM_SUP_FLEXI_XNEST_USER " ", + strlen (GDM_SUP_FLEXI_XNEST_USER " "))) == 0) || + (strncmp (msg, GDM_SUP_FLEXI_XNEST " ", + strlen (GDM_SUP_FLEXI_XNEST " ")) == 0)) { gchar *dispname = NULL, *xauthfile = NULL, *cookie = NULL; uid_t uid; + const gchar *rest; + gchar *username, *end; + + if (has_user == 0) { + rest = msg + strlen (GDM_SUP_FLEXI_XNEST_USER " "); + end = strchr (rest, ' '); + username = g_strndup (rest, end - rest); + } else { + rest = msg; + username = NULL; + } - extract_dispname_uid_xauthfile_cookie (msg, &dispname, &uid, + extract_dispname_uid_xauthfile_cookie (rest, &dispname, &uid, &xauthfile, &cookie); if (dispname == NULL) { @@ -3387,10 +3425,11 @@ handle_flexi_server (conn, TYPE_FLEXI_XNEST, gdm_get_value_string (GDM_KEY_XNEST), TRUE /* handled */, FALSE /* chooser */, - dispname, uid, xauthfile, cookie); + dispname, uid, xauthfile, cookie, username); g_free (dispname); g_free (xauthfile); + g_free (username); } else if ((strncmp (msg, GDM_SUP_ATTACHED_SERVERS, strlen (GDM_SUP_ATTACHED_SERVERS)) == 0) || (strncmp (msg, GDM_SUP_CONSOLE_SERVERS,