370 lines
12 KiB
Diff
370 lines
12 KiB
Diff
|
--- 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 @@
|
||
|
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
|
||
|
"http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
|
||
|
<!ENTITY legal SYSTEM "legal.xml">
|
||
|
- <!ENTITY version "2.17.4">
|
||
|
- <!ENTITY date "12/13/2006">
|
||
|
+ <!ENTITY version "2.17.7">
|
||
|
+ <!ENTITY date "01/22/2007">
|
||
|
]>
|
||
|
|
||
|
<article id="index" lang="en">
|
||
|
@@ -13,7 +13,7 @@
|
||
|
<revhistory>
|
||
|
<revision>
|
||
|
<revnumber>0.0</revnumber>
|
||
|
- <date>2006-12</date>
|
||
|
+ <date>2007-01</date>
|
||
|
</revision>
|
||
|
</revhistory>
|
||
|
|
||
|
@@ -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 @@
|
||
|
</screen>
|
||
|
</sect3>
|
||
|
|
||
|
+ <sect3 id="flexixnestuser">
|
||
|
+ <title>FLEXI_XNEST_USER</title>
|
||
|
+<screen>
|
||
|
+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
|
||
|
+</screen>
|
||
|
+ </sect3>
|
||
|
+
|
||
|
<sect3 id="flexixserver">
|
||
|
<title>FLEXI_XSERVER</title>
|
||
|
<screen>
|
||
|
@@ -4722,6 +4754,30 @@
|
||
|
</screen>
|
||
|
</sect3>
|
||
|
|
||
|
+ <sect3 id="flexixserveruser">
|
||
|
+ <title>FLEXI_XSERVER_USER</title>
|
||
|
+<screen>
|
||
|
+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
|
||
|
+</screen>
|
||
|
+ </sect3>
|
||
|
+
|
||
|
<sect3 id="getconfig">
|
||
|
<title>GET_CONFIG</title>
|
||
|
<screen>
|
||
|
--- 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" /* <username> <xserver type> */
|
||
|
+/* 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
|
||
|
+ */
|
||
|
#define GDM_SUP_FLEXI_XNEST "FLEXI_XNEST" /* <display> <uid> <xauth cookie> <xauth file> */
|
||
|
/* 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" /* <username> <display> <uid> <xauth cookie> <xauth file> */
|
||
|
+/* 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: <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
|
||
|
+ */
|
||
|
#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 <mkp@mkp.net>
|
||
|
*
|
||
|
* 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 <mkp@mkp.net>
|
||
|
*
|
||
|
* 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,
|