<?xml version="1.0"?>
<!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.26.0">
<!ENTITY date "02/10/2009">
<!ENTITY mdash "—">
<!ENTITY percnt "%">
]>
<article id="index" lang="en">
<articleinfo>
<title>GNOME Display Manager Reference Manual</title>
<revhistory>
<revision>
<revnumber>0.0</revnumber>
<date>2008-09</date>
</revision>
</revhistory>
<abstract role="description">
<para>
GDM is the GNOME Display Manager, a graphical login program.
</para>
</abstract>
<authorgroup>
<author>
<firstname>Martin</firstname><othername>K.</othername>
<surname>Petersen</surname>
<affiliation>
<address><email>mkp@mkp.net</email></address>
</affiliation>
</author>
<author>
<firstname>George</firstname><surname>Lebl</surname>
<affiliation>
<address><email>jirka@5z.com</email></address>
</affiliation>
</author>
<author>
<firstname>Jon</firstname><surname>McCann</surname>
<affiliation>
<address><email>mccann@jhu.edu</email></address>
</affiliation>
</author>
<author>
<firstname>Ray</firstname><surname>Strode</surname>
<affiliation>
<address><email>rstrode@redhat.com</email></address>
</affiliation>
</author>
<author role="maintainer">
<firstname>Brian</firstname><surname>Cameron</surname>
<affiliation>
<address><email>Brian.Cameron@Oracle.COM</email></address>
</affiliation>
</author>
</authorgroup>
<copyright>
<year>1998</year>
<year>1999</year>
<holder>Martin K. Petersen</holder>
</copyright>
<copyright>
<year>2001</year>
<year>2003</year>
<year>2004</year>
<holder>George Lebl</holder>
</copyright>
<copyright>
<year>2003</year>
<year>2007</year>
<year>2008</year>
<holder>Red Hat, Inc.</holder>
</copyright>
<copyright>
<year>2003</year>
<year>2011</year>
<holder>Oracle and/or its affiliates. All rights reserved.</holder>
</copyright>
&legal;
<releaseinfo>
This manual describes version &version; of the GNOME Display Manager.
It was last updated on &date;.
</releaseinfo>
</articleinfo>
<!-- ============= Preface ================================== -->
<sect1 id="preface">
<title>Terms and Conventions Used in This Manual</title>
<para>
This manual describes version &version; of the GNOME Display Manager.
It was last updated on &date;.
</para>
<para>
Chooser - A program used to select a remote host for managing a
display remotely on the attached display (<command>gdm-host-chooser</command>).
</para>
<para>
FreeDesktop - The organization providing desktop standards, such as the
Desktop Entry Specification used by GDM.
<ulink type="http" url="http://www.freedesktop.org/">
http://www.freedesktop.org</ulink>.
</para>
<para>
GDM - GNOME Display Manager. Used to describe the software package as a
whole.
</para>
<para>
Greeter - The graphical login window (provided by <command>gnome-shell</command>).
</para>
<para>
PAM - Pluggable Authentication Mechanism
</para>
<para>
XDMCP - X Display Manage Protocol
</para>
<para>
Xserver - An implementation of the X Window System. For example the
Xorg Xserver provided by the X.org Foundation
<ulink type="http" url="http://www.x.org/">http://www.x.org</ulink>.
</para>
<para>
Paths that start with a word in angle brackets are relative to the
installation prefix. I.e. <filename><share>/pixmaps/</filename>
refers to <filename>/usr/share/pixmaps</filename> if GDM was
configured with <command>--prefix=/usr</command>.
</para>
</sect1>
<!-- ============= Overview ================================= -->
<sect1 id="overview">
<title>Overview</title>
<sect2 id="introduction">
<title>Introduction</title>
<para>
The GNOME Display Manager (GDM) is a display manager that implements
all significant features required for managing attached and remote
displays. GDM was written from scratch and does not contain any XDM or
X Consortium code.
</para>
<para>
Note that GDM is configurable, and many configuration settings have
an impact on security. Issues to be aware of are highlighted in this
document.
</para>
<para>
Please note that some Operating Systems configure GDM to behave
differently than the default values as described in this document. If
GDM does not seem to behave as documented, then check to see if any
related configuration may be different than described here.
</para>
<para>
For further information about GDM, refer to the project website at
<ulink type="http" url="http://wiki.gnome.org/Projects/GDM/">
http://wiki.gnome.org/Projects/GDM</ulink>.
</para>
<para>
For discussion or queries about GDM, refer to the
<address><email>gdm-list@gnome.org</email></address> mail list. This
list is archived, and is a good resource to check to seek answers to
common questions. This list is archived at
<ulink type="http" url="http://mail.gnome.org/archives/gdm-list/">
http://mail.gnome.org/archives/gdm-list/</ulink> and has a search
facility to look for messages with keywords.
</para>
<para>
Please submit any bug reports or enhancement requests to the
"gdm" category in
<ulink type="http" url="http://bugzilla.gnome.org/">
http://bugzilla.gnome.org</ulink>.
</para>
</sect2>
<sect2 id="stability">
<title>Interface Stability</title>
<para>
GDM 2.20 and earlier supported stable configuration interfaces.
However, the codebase was completely rewritten for GDM 2.22, and
is not completely backward compatible with older releases. This is
in part because things work differently, so some options just don't
make sense, in part because some options never made sense, and in
part because some functionality has not been reimplemented yet.
</para>
<para>
Interfaces which continue to be supported in a stable fashion include
the Init, PreSession, PostSession, PostLogin, and Xsession scripts.
Some daemon configuration options in the
<filename><etc>/gdm/custom.conf</filename> file continue to be
supported. Also, the <filename>~/.dmrc</filename>, and face browser
image locations are still supported.
</para>
<para>
GDM 2.20 and earlier supported the ability to manage multiple displays
with separate graphics cards, such as used in terminal server
environments, login in a window via a program like Xnest or Xephyr, the
gdmsetup program, XML-based greeter themes, and the ability to run the
XDMCP chooser from the login screen. These features were not
added back during the 2.22 rewrite.
</para>
</sect2>
<sect2 id="functionaldesc">
<title>Functional Description</title>
<!--
<para>
TODO - Would be good to discuss D-Bus, perhaps the new GObject model,
and to explain the reasons why the rewrite made GDM better.
From a high-level overview perspective, rather than the
technical aspects.
</para>
-->
<para>
GDM is responsible for managing displays on the system. This includes
authenticating users, starting the user session, and terminating the
user session. GDM is configurable and the ways it can be configured
are described in the "Configuring GDM" section of this
document. GDM is also accessible for users with disabilities.
</para>
<para>
GDM provides the ability to manage the main console display, and
displays launched via VT. It is integrated with other programs,
such as the Fast User Switch Applet (FUSA) and gnome-screensaver
to manage multiple displays on the console via the Xserver Virtual
Terminal (VT) interface. It also can manage XDMCP displays.
</para>
<para>
Regardless of the display type, GDM will do the following when it
manages the display. It will start an Xserver process, then run the
<filename>Init</filename> script as the root user, and start the
greeter program on the display.
</para>
<para>
The greeter program is run as the unprivileged "gdm"
user/group. This user and group are described in the
"Security" section of this document. The main functions of
the greeter program are to provide a mechanism for selecting
an account for log in and to drive the dialogue between
the user and system when authenticating that account. The authentication
process is driven by Pluggable Authentication Modules (PAM). The PAM
modules determine what prompts (if any) are shown to the user to
authenticate. On the average system, the greeter program will request
a username and password for authentication. However some systems may
be configured to use supplemental mechanisms such as a fingerprint or
SmartCard readers. GDM can be configured to support these
alternatives in parallel with greeter login extensions and the
<command>--enable-split-authentication</command>
<filename>./configure</filename> option, or one at a
time via system PAM configuration.
</para>
<para>
The smartcard extension can be enabled or disabled via the
<filename>org.gnome.display-manager.extensions.smartcard.active</filename>
gsettings key.
</para>
<para>
Likewise, the fingerprint extension can be enabled or disabled via the
<filename>org.gnome.display-manager.extensions.fingerprint.active</filename>
gsettings key.
</para>
<para>
GDM and PAM can be configured to not require any
input, which will cause GDM to automatically log in and simply
start a session, which can be useful for some environments, such as
single user systems or kiosks.
</para>
<para>
In addition to authentication, the greeter program allows the user to
select which session to start and which language to use. Sessions are
defined by files that end in the .desktop suffix and more information
about these files can be found in the "GDM User Session and Language
Configuration" section of this document. By default, GDM is configured
to display a face browser so the user can select their user account by
clicking on an image instead of having to type their username. GDM
keeps track of the user's default session and language in the user's
<filename>~/.dmrc</filename> and will use these defaults if the user
did not pick a session or language in the login GUI.
</para>
<para>
After authenticating a user, the daemon runs the
<filename>PostLogin</filename> script as root, then runs the
<filename>PreSession</filename> script as root. After running these
scripts, the user session is started. When the user exits their
session, the <filename>PostSession</filename> script is run as root.
These scripts are provided as hooks for distributions and end-users
to customize how sessions are managed. For example, using these
hooks you could set up a machine which creates the user's $HOME
directory on the fly, and erases it on logout. The difference
between the <filename>PostLogin</filename> and
<filename>PreSession</filename> scripts is that
<filename>PostLogin</filename> is run before the pam_open_session call
so is the right place to do anything which should be run before the
user session is initialized. The <filename>PreSession</filename>
script is called after session initialization.
</para>
</sect2>
<sect2 id="greeterpanel">
<title>Greeter Panel</title>
<para>
The GDM greeter program displays a panel docked at the bottom of the
screen which provides additional functionality. When a user is
selected, the panel allows the user to select which session, language,
and keyboard layout to use after logging in. The keyboard layout
selector also changes the keyboard layout used when typing your
password. The panel also contains an area for login services to leave
status icons. Some example status icons include a battery icon for
current battery usage, and an icon for enabling accessibility features.
The greeter program also provides buttons which allow the user to
shutdown or restart the system. It is possible to configure GDM to not
provide the shutdown and restart buttons, if desired. GDM can also be
configured via PolicyKit (or via RBAC on Oracle Solaris) to require the
user have appropriate authorization before accepting the shutdown or
restart request.
</para>
<para>
Note that keyboard layout features are only available on systems that
support libxklavier.
</para>
</sect2>
<sect2 id="accessibility">
<title>Accessibility</title>
<para>
GDM supports "Accessible Login", allowing users to log into
their desktop session even if they cannot easily use the screen,
mouse, or keyboard in the usual way. Accessible Technology (AT)
features such as an on-screen keyboard, screen reader, screen
magnifier, and Xserver AccessX keyboard accessibility are available.
It is also possible to enable large text or high contrast icons and
controls, if needed. Refer to the "Accessibility
Configuration" section of the document for more information
how various accessibility features can be configured.
</para>
<para>
On some Operating Systems, it is necessary to make sure that the GDM
user is a member of the "audio" group for AT programs that
require audio output (such as text-to-speech) to be functional.
</para>
</sect2>
<sect2 id="facebrowser">
<title>The GDM Face Browser</title>
<para>
The Face Browser is the interface which allows users to select their
username by clicking on an image. This feature can be enabled or
disabled via the org.gnome.login-screen disable-user-list GSettings
key and is on by default. When disabled, users must type their
complete username by hand. When enabled, it displays all local users
which are available for login on the system (all user accounts defined
in the /etc/passwd file that have a valid shell and sufficiently high
UID) and remote users that have recently logged in.
The face browser in GDM 2.20 and earlier would attempt to display all
remote users, which caused performance problems in large,
enterprise deployments.
</para>
<para>
The Face Browser is configured to display the users who log in most
frequently at the top of the list. This helps to ensure that users
who log in frequently can quickly find their login image.
</para>
<para>
The Face Browser supports "type-ahead search" which dynamically
moves the face selection as the user types to the corresponding username
in the list. This means that a user with a long username will only
have to type the first few characters of the username before the correct
item in the list gets selected.
</para>
<para>
The icons used by GDM can be installed globally by the sysadmin or can
be located in the user's home directories. If installed globally
they should be in the <filename><share>/pixmaps/faces/</filename>
directory and the filename should be the name of the user. Face image
files should be a standard image that GTK+ can read, such as PNG or
JPEG. Face icons placed in the global face directory must be readable
to the GDM user.
</para>
<!--
<para>
TODO - In the old GDM the ~/gnome2/gdm file is used, but the new code
seems to use ~/.gnome/gdm. Error?
</para>
-->
<para>
If there is no global icon for the user, GDM will look in the user's
$HOME directory for the image file. GDM will first look for the user's
face image in <filename>~/.face</filename>. If not found, it will try
<filename>~/.face.icon</filename>. If still not found, it will use the
value defined for "face/picture=" in the
<filename>~/.gnome2/gdm</filename> file.
</para>
<para>
If a user has no defined face image, GDM will use the
"stock_person" icon defined in the current GTK+ theme. If no
such image is defined, it will fallback to a generic face image.
</para>
<para>
Please note that loading and scaling face icons located in remote user
home directories can be a very time-consuming task. Since it not
practical to load images over NIS or NFS, GDM does not attempt to load
face images from remote home directories.
</para>
<para>
When the browser is turned on, valid usernames on the computer are
exposed for everyone to see. If XDMCP is enabled, then the usernames
are exposed to remote users. This, of course, limits security
somewhat since a malicious user does not need to guess valid usernames.
In some very restrictive environments the face browser may not be
appropriate.
</para>
</sect2>
<sect2 id="xdmcp">
<title>XDMCP</title>
<!--
<para>
TODO - What XDMCP features actually work? I know that the
chooser is missing.
</para>
-->
<para>
The GDM daemon can be configured to listen for and manage X Display
Manage Protocol (XDMCP) requests from remote displays. By default
XDMCP support is turned off, but can be enabled if desired. If GDM is
built with TCP Wrapper support, then the daemon will only grant access
to hosts specified in the GDM service section in the TCP Wrappers
configuration file.
</para>
<para>
GDM includes several measures making it more resistant to denial of
service attacks on the XDMCP service. A lot of the protocol
parameters, handshaking timeouts, etc. can be fine tuned. The default
configuration should work reasonably on most systems.
</para>
<para>
GDM by default listens for XDMCP requests on the normal UDP port used
for XDMCP, port 177, and will respond to QUERY and BROADCAST_QUERY
requests by sending a WILLING packet to the originator.
</para>
<para>
GDM can also be configured to honor INDIRECT queries and present a
host chooser to the remote display. GDM will remember the user's
choice and forward subsequent requests to the chosen manager. GDM
also supports an extension to the protocol which will make it forget
the redirection once the user's connection succeeds. This extension
is only supported if both daemons are GDM. It is transparent and
will be ignored by XDM or other daemons that implement XDMCP.
</para>
<para>
If XDMCP seems to not be working, make sure that all machines are
specified in <filename>/etc/hosts</filename>.
</para>
<para>
Refer to the "Security" section for information about
security concerns when using XDMCP.
</para>
</sect2>
<sect2 id="logging">
<title>Logging</title>
<para>
GDM uses syslog to log errors and status. It can also log debugging
information, which can be useful for tracking down problems if GDM is
not working properly. Debug output can be enabled by setting the
debug/Enable key to "true" in the
<filename><etc>/gdm/custom.conf</filename> file.
</para>
<para>
Output from the various Xservers is stored in the GDM log directory,
which is normally <filename><var>/log/gdm/</filename>. Any
Xserver messages are saved to a file associated with the display value,
<filename><display>.log</filename>.
</para>
<para>
The session output is piped through the GDM daemon to the
<filename>~/<replaceable>$XDG_CACHE_HOME</replaceable>/gdm/session.log</filename>
file which usually expands to <filename>~/.cache/gdm/session.log</filename>.
The file is overwritten on each login, so logging out and logging back
into the same user via GDM will cause any messages from the previous
session to be lost.
</para>
<para>
Note that if GDM can not create this file for some reason, then a
fallback file will be created named <filename>~/<replaceable>$XDG_CACHE_HOME</replaceable>/gdm/session.log.XXXXXXXX</filename>
where the <filename>XXXXXXXX</filename> are some random characters.
</para>
</sect2>
<sect2 id="fusa">
<title>Fast User Switching</title>
<para>
GDM allows multiple users to be logged in at the same time. After one
user is logged in, additional users can log in via the User Switcher
on the GNOME Panel, or from the "Switch User" button in Lock Screen dialog
of GNOME Screensaver. The active session can be changed back and forth using
the same mechanism. Note that some distributions may not add the User Switcher
to the default panel configuration. It can be added using the panel context
menu.
</para>
<para>
Note this feature is available on systems that support Virtual
Terminals. This feature will not function if Virtual Terminals is not
available.
</para>
</sect2>
</sect1>
<!-- ============= Security ================================= -->
<sect1 id="security">
<title>Security</title>
<sect2 id="gdmuser">
<title>The GDM User And Group</title>
<para>
For security reasons a dedicated user and group id are recommended for
proper operation. This user and group are normally "gdm" on
most systems, but can be configured to any user or group. All GDM
GUI programs are run as this user, so that the programs which interact
with the user are run in a sandbox. This user and group should have
limited privilege.
</para>
<para>
The only special privilege the "gdm" user requires is the
ability to read and write Xauth files to the
<filename><var>/run/gdm</filename> directory. The
<filename><var>/run/gdm</filename> directory should have
root:gdm ownership and 1777 permissions.
</para>
<para>
You should not, under any circumstances, configure the GDM user/group
to a user which a user could easily gain access to, such as the user
<filename>nobody</filename>. Any user who gains access to an Xauth
key can snoop on and control running GUI programs running in the
associated session or perform a denial-of-service attack on it. It
is important to ensure that the system is configured properly so that
only the "gdm" user has access to these files and that it
is not easy to login to this account. For example, the account should
be setup to not have a password or allow non-root users to login to the
account.
</para>
<para>
The GDM greeter configuration is stored in GConf. To allow the GDM
user to be able to write configuration, it is necessary for the
"gdm" user to have a writable $HOME directory. Users may
configure the default GConf configuration as desired to avoid the
need to provide the "gdm" user with a writable $HOME
directory. However, some features of GDM may be disabled if it is
unable to write state information to GConf configuration.
</para>
</sect2>
<sect2 id="PAM">
<title>PAM</title>
<para>
GDM uses PAM for login authentication. PAM stands for Pluggable
Authentication Module, and is used by most programs that request
authentication on your computer. It allows the administrator to
configure specific authentication behavior for different login programs
(such as ssh, login GUI, screensaver, etc.)
</para>
<para>
PAM is complicated and highly configurable, and this documentation does
not intend to explain this in detail. Instead, it is intended to give
an overview of how PAM configuration relates with GDM, how PAM is
commonly configured with GDM, and known issues. It is expected that
a person needing to do PAM configuration would need to do further
reading of PAM documentation to understand how to configure PAM and
to understand terms used in this section.
</para>
<para>
PAM configuration has different, but similar, interfaces on different
Operating Systems, so check the
<ulink type="help" url="man:pam.d">pam.d</ulink> or
<ulink type="help" url="man:pam.conf">pam.conf</ulink> man page for
details. Be sure you read the PAM documentation and are comfortable
with the security implications of any changes you intend to make to
your configuration.
</para>
<para>
Note that, by default, GDM uses the "gdm" PAM service name
for normal login and the "gdm-autologin" PAM service name for
automatic login. These services may not be defined in your pam.d or
pam.conf configured file. If there is no entry, then GDM will use the
default PAM behavior. On most systems this should work fine.
However, the automatic login feature may not work if the gdm-autologin
service is not defined.
</para>
<para>
The <filename>PostLogin</filename> script is run before
pam_open_session is called, and the <filename>PreSession</filename>
script is called after. This allows the system administrator to add
any scripting to the login process either before or after PAM
initializes the session.
</para>
<para>
If you wish to make GDM work with other types of authentication
mechanisms (such as a fingerprint or SmartCard reader), then you should
implement this by using a PAM service module for the desired
authentication type rather than by trying to modify the GDM code
directly. Refer to the PAM documentation on your system. How to do
this is frequently discussed on the
<address><email>gdm-list@gnome.org</email></address> mail list,
so you can refer to the list archives for more information.
</para>
<para>
PAM does have some limitations regarding being able to work with
multiple types of authentication at the same time, like supporting
the ability to accept either SmartCard and the ability to type the
username and password into the login program. There are techniques
that are used to make this work, and it is best to research how this
problem is commonly solved when setting up such a configuration.
</para>
<para>
If automatic login does not work on a system, check to see if the
"gdm-autologin" PAM stack is defined in the PAM configuration. For
this to work, it is necessary to use a PAM module that simply does no
authentication, or which simply returns PAM_SUCCESS from all of its
public interfaces. Assuming your system has a pam_allow.so PAM module
which does this, a PAM configuration to enable "gdm-autologin" would
look like this:
</para>
<screen>
gdm-autologin auth required pam_unix_cred.so.1
gdm-autologin auth sufficient pam_allow.so.1
gdm-autologin account sufficient pam_allow.so.1
gdm-autologin session sufficient pam_allow.so.1
gdm-autologin password sufficient pam_allow.so.1
</screen>
<para>
The above setup will cause no lastlog entry to be generated. If a
lastlog entry is desired, then use the following for the session:
</para>
<screen>
gdm-autologin session required pam_unix_session.so.1
</screen>
<para>
If the computer is used by several people, which makes automatic login
unsuitable, you may want to allow some users to log in without entering
their password. This feature can be enabled as a per-user option in
the users-admin tool from the gnome-system-tools; it is achieved by
checking that the user is member a Unix group called
"nopasswdlogin" before asking for a password. For this to work,
the PAM configuration file for the "gdm" service must include
a line such as:
</para>
<screen>
gdm auth sufficient pam_succeed_if.so user ingroup nopasswdlogin
</screen>
</sect2>
<sect2 id="utmpwtmp">
<title>utmp and wtmp</title>
<para>
GDM generates utmp and wtmp User Accounting Database entries upon
session login and logout. The utmp database contains user access
and accounting information that is accessed by commands such as
<command>finger</command>, <command>last</command>,
<command>login</command>, and <command>who</command>. The wtmp
database contains the history of user access and accounting
information for the utmp database. Refer to the
<ulink type="help" url="man:utmp">utmp</ulink> and
<ulink type="help" url="man:wtmp">wtmp</ulink>
man pages on your system for more information.
</para>
</sect2>
<sect2 id="xauth">
<title>Xserver Authentication Scheme</title>
<para>
Xserver authorization files are stored in a newly created subdirectory
of <filename><var>/run/gdm</filename> at start up. These files
are used to store and share a "password" between X clients
and the Xserver. This "password" is unique for each session
logged in, so users from one session can't snoop on users from another.
</para>
<para>
GDM only supports the MIT-MAGIC-COOKIE-1 Xserver authentication
scheme. Normally little is gained from the other schemes, and no
effort has been made to implement them so far. Be especially
careful about using XDMCP because the Xserver authentication cookie
goes over the wire as clear text. If snooping is possible, then an
attacker could simply snoop your authentication password as you log in,
regardless of the authentication scheme being used. If snooping is
possible and undesirable, then you should use ssh for tunneling an X
connection rather then using XDMCP. You could think of XDMCP as a sort
of graphical telnet, having the same security issues. In most cases,
ssh -Y should be preferred over GDM's XDMCP features.
</para>
</sect2>
<sect2 id="xdmcpsecurity">
<title>XDMCP Security</title>
<para>
Even though your display is protected by cookies, XEvents and thus
keystrokes typed when entering passwords will still go over the wire in
clear text. It is trivial to capture these.
</para>
<para>
XDMCP is primarily useful for running thin clients such as in terminal
labs. Those thin clients will only ever need the network to access
the server, and so it seems like the best security policy to have
those thin clients on a separate network that cannot be accessed by
the outside world, and can only connect to the server. The only point
from which you need to access outside is the server. This type of set up
should never use an unmanaged hub or other sniffable network.
</para>
</sect2>
<sect2 id="xdmcpaccess">
<title>XDMCP Access Control</title>
<para>
XDMCP access control is done using TCP wrappers. It is possible to
compile GDM without TCP wrapper support, so this feature may not be
supported on some Operating Systems.
</para>
<para>
You should use the daemon name <command>gdm</command> in the
<filename><etc>/hosts.allow</filename> and
<filename><etc>/hosts.deny</filename> files. For example to
deny computers from <filename>.evil.domain</filename> from logging in,
then add
</para>
<screen>
gdm: .evil.domain
</screen>
<para>
to <filename><etc>/hosts.deny</filename>. You may also need
to add
</para>
<screen>
gdm: .your.domain
</screen>
<para>
to your <filename><etc>/hosts.allow</filename> if you normally
disallow all services from all hosts. See the
<ulink type="help" url="man:hosts.allow">hosts.allow(5)</ulink> man
page for details.
</para>
</sect2>
<sect2 id="firewall">
<title>Firewall Security</title>
<para>
Even though GDM tries to outsmart potential attackers trying to take
advantage of XDMCP, it is still advised that you block the XDMCP port
(normally UDP port 177) on your firewall unless really needed. GDM
guards against denial of service attacks, but the X protocol is still
inherently insecure and should only be used in controlled environments.
Also each remote connection takes up lots of resources, so it is much
easier to do a denial of service attack via XDMCP than attacking a
webserver.
</para>
<para>
It is also wise to block all of the Xserver ports. These are TCP
ports 6000+ (one for each display number) on your firewall. Note that
GDM will use display numbers 20 and higher for flexible on-demand
servers.
</para>
<para>
X is not a very safe protocol when using it over the Internet, and
XDMCP is even less safe.
</para>
</sect2>
<sect2 id="policykit">
<title>PolicyKit</title>
<!--
<para>
TODO - Should we say more?
</para>
-->
<para>
GDM may be configured to use PolicyKit to allow the system
administrator to control whether the login screen should provide
the shutdown and restart buttons on the greeter screen.
</para>
<para>
These buttons are controlled by the
<filename>org.freedesktop.consolekit.system.stop-multiple-users</filename>
and
<filename>org.freedesktop.consolekit.system.restart-multiple-users</filename>
actions respectively. Policy for these actions can be set up using the
polkit-gnome-authorization tool, or the polkit-auth command line program.
</para>
</sect2>
<sect2 id="rbac">
<title>RBAC (Role Based Access Control)</title>
<para>
GDM may be configured to use RBAC instead of PolicyKit. In this
case the RBAC configuration is used to control whether the login screen
should provide the shutdown and restart buttons on the greeter screen.
</para>
<para>
For example, on Oracle Solaris, the "solaris.system.shutdown"
authorization is used to control this. Simply modify the
<filename>/etc/user_attr</filename> file so that the "gdm"
user has this authorization.
</para>
</sect2>
</sect1>
<!-- ============= ConsoleKit ================================ -->
<sect1 id="consolekit">
<title>Support for ConsoleKit</title>
<!--
<para>
TODO - Should we update these docs? Probably should mention any
configuration that users may want to do for using it with GDM?
If so, perhaps this section should be moved to a subsection of
the "Configure" section?
</para>
-->
<para>
GDM includes support for publishing user login information with the user
and login session accounting framework known as ConsoleKit. ConsoleKit
is able to keep track of all the users currently logged in. In this
respect, it can be used as a replacement for the utmp or utmpx files that
are available on most Unix-like Operating Systems.
</para>
<para>
When GDM is about to create a new login process for a user it will call
a privileged method of ConsoleKit in order to open a new session for this
user. At this time GDM also provides ConsoleKit with information about
this user session such as: the user ID, the X11 Display name that will be
associated with the session, the host-name from which the session
originates (useful in the case of an XDMCP session), whether or not this
session is attached, etc. As the entity that initiates the user process,
GDM is in a unique position to know about the user session and to be
trusted to provide these bits of information. The use of this privileged
method is restricted by the use of the D-Bus system message bus security
policy.
</para>
<para>
In case a user with an existing session has authenticated
at GDM and requests to resume that existing session, GDM calls a
privileged method of ConsoleKit to unlock that session. The exact
details of what happens when the session receives this unlock signal are
undefined and session-specific. However, most sessions will unlock a
screensaver in response.
</para>
<para>
When the user chooses to log out, or if GDM or the session quit
unexpectedly the user session will be unregistered from ConsoleKit.
</para>
</sect1>
<!-- ============= Configuration ============================= -->
<sect1 id="configuration">
<title>Configuration</title>
<para>
GDM has a number of configuration interfaces. These include scripting
integration points, daemon configuration, greeter configuration,
general session settings, integration with gnome-settings-daemon
configuration, and session configuration. These types of integration are
described in detail below.
</para>
<sect2 id="scripting">
<title>Scripting Integration Points</title>
<para>
The GDM script integration points can be found in the
<filename><etc>/gdm/</filename> directory:
</para>
<screen>
Xsession
Init/
PostLogin/
PreSession/
PostSession/
</screen>
<para>
The <filename>Init</filename>, <filename>PostLogin</filename>,
<filename>PreSession</filename>, and <filename>PostSession</filename>
scripts all work as described below.
</para>
<para>
For each type of script, the default one which will be executed is
called "Default" and is stored in a directory associated with
the script type. So the default <filename>Init</filename> script is
<filename><etc>/gdm/Init/Default</filename>. A per-display
script can be provided, and if it exists it will be run instead of the
default script. Such scripts are stored in the same directory as the
default script and have the same name as the Xserver DISPLAY value for
that display. For example, if the <filename><Init>/:0</filename>
script exists, it will be run for DISPLAY ":0".
</para>
<para>
All of these scripts are run with root privilege and return 0 if run
successfully, and a non-zero return code if there was any failure that
should cause the login session to be aborted. Also note that GDM will
block until the scripts finish, so if any of these scripts hang, this
will cause the login process to also hang.
</para>
<para>
When the Xserver for the login GUI has been successfully started, but
before the login GUI is actually displayed, GDM will run the
<filename>Init</filename> script. This script is useful for starting
programs that should be run while the login screen is showing, or for
doing any special initialization if required.
</para>
<para>
After the user has been successfully authenticated GDM will run the
<filename>PostLogin</filename> script. This is done before any session
setup has been done, including before the pam_open_session call. This
script is useful for doing any session initialization that needs to
happen before the session starts. For example, you might setup the
user's $HOME directory if needed.
</para>
<para>
After the user session has been initialized, GDM will run the
<filename>PreSession</filename> script. This script is useful for
doing any session initialization that needs to happen after the
session has been initialized. It can be used for session management or
accounting, for example.
</para>
<para>
When a user terminates their session, GDM will run the
<filename>PostSession</filename> script. Note that the Xserver will
have been stopped by the time this script is run, so it should not be
accessed.
</para>
<para>
Note that the <filename>PostSession</filename> script will be run
even when the display fails to respond due to an I/O error or
similar. Thus, there is no guarantee that X applications will work
during script execution.
</para>
<para>
All of the above scripts will set the
<filename>$RUNNING_UNDER_GDM</filename> environment variable to
<filename>yes</filename>. If the scripts are also shared with other
display managers, this allows you to identify when GDM is calling these
scripts, so you can run specific code when GDM is used.
</para>
</sect2>
<sect2 id="autostart">
<title>Autostart Configuration</title>
<para>
The <filename><share>/gdm/autostart/LoginWindow</filename>
directory contains files in the format specified by the
"FreeDesktop.org Desktop Application Autostart
Specification". Standard features in the specification may be
used to specify programs that should auto-restart or only be launched
if a GConf configuration value is set, etc.
</para>
<para>
Any <filename>.desktop</filename> files in this directory will cause
the associated program to automatically start with the login GUI
greeter. By default, GDM is shipped with files which will autostart
the gdm-simple-greeter login GUI greeter itself, the
gnome-power-manager application, the gnome-settings-daemon, and the
metacity window manager. These programs are needed for the greeter
program to work. In addition, desktop files are provided for starting
various AT programs if the configuration values specified in the
Accessibility Configuration section below are set.
</para>
</sect2>
<sect2 id="xsessionscript">
<title>Xsession Script</title>
<para>
There is also an <filename>Xsession</filename> script located at
<filename><etc>/gdm/Xsession</filename> which is called between
the <filename>PreSession</filename> and the
<filename>PostSession</filename> scripts. This script does not
support per-display like the other scripts. This script is used for
actually starting the user session. This script is run as the user,
and it will run whatever session was specified by the Desktop session
file the user selected to start.
</para>
</sect2>
<sect2 id="daemonconfig">
<title>Daemon Configuration</title>
<para>
The GDM daemon is configured using the
<filename><etc>/gdm/custom.conf</filename> file. Default
values are stored in GConf in the <filename>gdm.schemas</filename>
file. It is recommended that end-users modify the
<filename><etc>/gdm/custom.conf</filename> file because the
schemas file may be overwritten when the user updates their system to
have a newer version of GDM.
</para>
<para>
Note that older versions of GDM supported additional configuration
options which are no longer supported in the latest versions of GDM.
</para>
<para>
The <filename><etc>/gdm/custom.conf</filename> file is in the
<filename>keyfile</filename> format. Keywords in brackets
define group sections, strings before an equal sign (=) are keys and
the data after equal sign represents their value. Empty lines or
lines starting with the hash mark (#) are ignored.
</para>
<para>
The file <filename><etc>/gdm/custom.conf</filename> supports the
"[daemon]", "[security]", and "[xdmcp]"
group sections. Within each group, there are particular key/value
pairs that can be specified to modify how GDM behaves. For example,
to enable timed login and specify the timed login user to be a user
named "you", you would modify the file so it contains the
following lines:
</para>
<screen>
[daemon]
TimedLoginEnable=true
TimedLogin=you
</screen>
<para>
A full list of supported configuration keys follow:
</para>
<sect3 id="choosersection">
<title>[chooser]</title>
<variablelist>
<varlistentry>
<term>Multicast</term>
<listitem>
<synopsis>Multicast=false</synopsis>
<para>
If true and IPv6 is enabled, the chooser will send a multicast
query to the local network and collect responses from the hosts
who have joined multicast group.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>MulticastAddr</term>
<listitem>
<synopsis>MulticastAddr=ff02::1</synopsis>
<para>
This is the Link-local multicast address.
</para>
</listitem>
</varlistentry>
</variablelist>
</sect3>
<sect3 id="daemonsection">
<title>[daemon]</title>
<variablelist>
<varlistentry>
<term>TimedLoginEnable</term>
<listitem>
<synopsis>TimedLoginEnable=false</synopsis>
<para>
If the user given in <filename>TimedLogin</filename> should be
logged in after a number of seconds (set with
<filename>TimedLoginDelay</filename>) of inactivity on the
login screen. This is useful for public access terminals or
perhaps even home use. If the user uses the keyboard or
browses the menus, the timeout will be reset to
<filename>TimedLoginDelay</filename> or 30 seconds, whichever
is higher. If the user does not enter a username but just
hits the ENTER key while the login program is requesting the
username, then GDM will assume the user wants to login
immediately as the timed user. Note that no password will be
asked for this user so you should be careful, although if using
PAM it can be configured to require password entry before
allowing login. Refer to the "Security->PAM"
section of the manual for more information, or for help if this
feature does not seem to work.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>TimedLogin</term>
<listitem>
<synopsis>TimedLogin=</synopsis>
<para>
This is the user that should be logged in after a specified
number of seconds of inactivity.
</para>
<para>
If the value ends with a vertical bar | (the pipe symbol),
then GDM will execute the program specified and use whatever
value is returned on standard out from the program as the user.
The program is run with the DISPLAY environment variable set so
that it is possible to specify the user in a per-display
fashion. For example if the value is "/usr/bin/getloginuser|",
then the program "/usr/bin/getloginuser" will be run to get the
user value.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>TimedLoginDelay</term>
<listitem>
<synopsis>TimedLoginDelay=30</synopsis>
<para>
Delay in seconds before the <filename>TimedLogin</filename>
user will be logged in.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>AutomaticLoginEnable</term>
<listitem>
<synopsis>AutomaticLoginEnable=false</synopsis>
<para>
If true, the user given in <filename>AutomaticLogin</filename>
should be logged in immediately. This feature is like timed
login with a delay of 0 seconds.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>AutomaticLogin</term>
<listitem>
<synopsis>AutomaticLogin=</synopsis>
<para>
This is the user that should be logged in immediately if
<filename>AutomaticLoginEnable</filename> is true.
</para>
<para>
If the value ends with a vertical bar | (the pipe symbol),
then GDM will execute the program specified and use whatever
value is returned on standard out from the program as the user.
The program is run with the DISPLAY environment variable set so
that it is possible to specify the user in a per-display
fashion. For example if the value is "/usr/bin/getloginuser|",
then the program "/usr/bin/getloginuser" will be run to get the
user value.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>User</term>
<listitem>
<synopsis>User=gdm</synopsis>
<para>
The username under which the greeter and other GUI programs
are run. Refer to the <filename>Group</filename>
configuration key and to the "Security->GDM User And
Group" section of this document for more information.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>Group</term>
<listitem>
<synopsis>Group=gdm</synopsis>
<para>
The group name under which the greeter and other GUI programs
are run. Refer to the <filename>User</filename>
configuration key and to the "Security->GDM User And
Group" section of this document for more information.
</para>
</listitem>
</varlistentry>
</variablelist>
</sect3>
<sect3 id="debugsection">
<title>Debug Options</title>
<variablelist>
<title>[debug]</title>
<varlistentry>
<term>Enable</term>
<listitem>
<synopsis>Enable=false</synopsis>
<para>
To enable debugging, set the debug/Enable key to
"true" in the
<filename><etc>/gdm/custom.conf</filename>
file and restart GDM. Then debug output will be sent to the
system log file (<filename><var>/log/messages</filename>
or <filename><var>/adm/messages</filename> depending on
your Operating System).
</para>
</listitem>
</varlistentry>
</variablelist>
</sect3>
<sect3 id="greetersection">
<title>Greeter Options</title>
<variablelist>
<title>[greeter]</title>
<varlistentry>
<term>IncludeAll</term>
<listitem>
<synopsis>IncludeAll=true</synopsis>
<para>
If true, then the face browser will show all users on the local
machine. If false, the face browser will only show users who
have recently logged in.
</para>
<para>
When this key is true, GDM will call fgetpwent() to get a list
of local users on the system. Any users with a user id less
than 500 (or 100 if running on Oracle Solaris) are filtered
out. The Face Browser also will display any users that have
previously logged in on the system (for example NIS/LDAP
users). It gets this list via calling the
<command>ck-history</command> ConsoleKit interface. It will
also filter out any users which do not have a valid shell
(valid shells are any shell that getusershell() returns -
/sbin/nologin or /bin/false are considered invalid shells even
if getusershell() returns them).
</para>
<para>
If false, then GDM more simply only displays users that have
previously logged in on the system (local or NIS/LDAP users) by
calling the <command>ck-history</command> ConsoleKit interface.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>Include</term>
<listitem>
<synopsis>Include=</synopsis>
<para>
Set to a list of users to always include in the Face Browser.
This value is set to a list of users separated by commas. By
default, the value is empty.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>Exclude</term>
<listitem>
<synopsis>Exclude=bin,root,daemon,adm,lp,sync,shutdown,halt,mail,news,uucp,operator,nobody,nobody4,noaccess,postgres,pvm,rpm,nfsnobody,pcap</synopsis>
<para>
Set to a list of users to always exclude in the Face Browser.
This value is set to a list of users separated by commas. Note
that the setting in the <filename>custom.conf</filename>
overrides the default value, so if you wish to add additional
users to the list, then you need to set the value to the
default value with additional users appended to the list.
</para>
</listitem>
</varlistentry>
</variablelist>
</sect3>
<sect3 id="securitysection">
<title>Security Options</title>
<variablelist>
<title>[security]</title>
<varlistentry>
<term>DisallowTCP</term>
<listitem>
<synopsis>DisallowTCP=true</synopsis>
<para>
If true, then always append <filename>-nolisten tcp</filename>
to the command line when starting attached Xservers, thus
disallowing TCP connection. This is a more secure
configuration if you are not using remote connections.
</para>
</listitem>
</varlistentry>
</variablelist>
</sect3>
<sect3 id="xdmcpsection">
<title>XDCMP Support</title>
<variablelist>
<title>[xdmcp]</title>
<varlistentry>
<term>DisplaysPerHost</term>
<listitem>
<synopsis>DisplaysPerHost=1</synopsis>
<para>
To prevent attackers from filling up the pending queue, GDM
will only allow one connection for each remote computer. If
you want to provide display services to computers with more
than one screen, you should increase this value.
</para>
<para>
Note that the number of attached DISPLAYS allowed is not
limited. Only remote connections via XDMCP are limited by
this configuration option.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>Enable</term>
<listitem>
<synopsis>Enable=false</synopsis>
<para>
Setting this to true enables XDMCP support allowing remote
displays/X terminals to be managed by GDM.
</para>
<para>
<filename>gdm</filename> listens for requests on UDP port 177.
See the Port option for more information.
</para>
<para>
If GDM is compiled to support it, access from remote displays
can be controlled using the TCP Wrappers library. The service
name is <filename>gdm</filename>
</para>
<para>
You should add
<screen>
gdm:.my.domain
</screen>
to your <filename><etc>/hosts.allow</filename>, depending
on your TCP Wrappers configuration. See the
<ulink type="help" url="man:hosts.allow">hosts.allow</ulink>
man page for details.
</para>
<para>
Please note that XDMCP is not a particularly secure protocol
and that it is a good idea to block UDP port 177 on your
firewall unless you really need it.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>HonorIndirect</term>
<listitem>
<synopsis>HonorIndirect=true</synopsis>
<para>
Enables XDMCP INDIRECT choosing (i.e. remote execution of
<filename>gdmchooser</filename>) for X-terminals which do not
supply their own display browser.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>MaxPending</term>
<listitem>
<synopsis>MaxPending=4</synopsis>
<para>
To avoid denial of service attacks, GDM has fixed size queue
of pending connections. Only MaxPending displays can start at
the same time.
</para>
<para>
Please note that this parameter does not limit the number of
remote displays which can be managed. It only limits the number
of displays initiating a connection simultaneously.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>MaxSessions</term>
<listitem>
<synopsis>MaxSessions=16</synopsis>
<para>
Determines the maximum number of remote display connections
which will be managed simultaneously. I.e. the total number of
remote displays that can use your host.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>MaxWait</term>
<listitem>
<synopsis>MaxWait=30</synopsis>
<para>
When GDM is ready to manage a display an ACCEPT packet is sent
to it containing a unique session id which will be used in
future XDMCP conversations.
</para>
<para>
GDM will then place the session id in the pending queue
waiting for the display to respond with a MANAGE request.
</para>
<para>
If no response is received within MaxWait seconds, GDM will
declare the display dead and erase it from the pending queue
freeing up the slot for other displays.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>MaxWaitIndirect</term>
<listitem>
<synopsis>MaxWaitIndirect=30</synopsis>
<para>
The MaxWaitIndirect parameter determines the maximum number of
seconds between the time where a user chooses a host and the
subsequent indirect query where the user is connected to the
host. When the timeout is exceeded, the information about the
chosen host is forgotten and the indirect slot freed up for
other displays. The information may be forgotten earlier if
there are more hosts trying to send indirect queries then
<filename>MaxPendingIndirect</filename>.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>PingIntervalSeconds</term>
<listitem>
<synopsis>PingIntervalSeconds=60</synopsis>
<para>
If the Xserver does not respond in the specified number of
seconds, then the connection is stopped and the session ended.
When this happens the daemon dies with an ALARM signal.
Note that GDM 2.20 and earlier multiplied this setting by 2,
so it may be necessary to increase the timeout if upgrading
from GDM 2.20 and earlier to a newer version.
</para>
<para>
Note that GDM in the past used to have a
<filename>PingInterval</filename> configuration key which was
also in minutes. For most purposes you'd want this setting
to be lower than one minute. However since in most cases where
XDMCP would be used (such as terminal labs), a lag of more
than 15 or so seconds would really mean that the terminal was
turned off or restarted and you would want to end the session.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>Port</term>
<listitem>
<synopsis>Port=177</synopsis>
<para>
The UDP port number <filename>gdm</filename> should listen to
for XDMCP requests. Do not change this unless you know what
you are doing.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>Willing</term>
<listitem>
<synopsis>Willing=<etc>/gdm/Xwilling</synopsis>
<para>
When the machine sends a WILLING packet back after a QUERY it
sends a string that gives the current status of this server.
The default message is the system ID, but it is possible to
create a script that displays customized message. If this
script does not exist or this key is empty the default message
is sent. If this script succeeds and produces some output,
the first line of it's output is sent (and only the first
line). It runs at most once every 3 seconds to prevent
possible denial of service by flooding the machine with QUERY
packets.
</para>
</listitem>
</varlistentry>
</variablelist>
</sect3>
</sect2>
<sect2 id="greeterconfiguration">
<title>Simple Greeter Configuration</title>
<para>
The GDM default greeter is called the simple Greeter and is
configured via GConf. Default values are stored in GConf in the
<filename>gdm-simple-greeter.schemas</filename> file. These defaults
can be overridden if the "gdm" user has a writable $HOME
directory to store GConf settings. These values can be edited using
the <command>gconftool-2</command> or <command>gconf-editor</command>
programs. The following configuration options are supported:
</para>
<variablelist>
<title>Greeter Configuration Keys</title>
<varlistentry>
<term>/apps/gdm/simple-greeter/banner_message_enable</term>
<listitem>
<synopsis>false (boolean)</synopsis>
<para>
Controls whether the banner message text is displayed.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>/apps/gdm/simple-greeter/banner_message_text</term>
<listitem>
<synopsis>NULL (string)</synopsis>
<para>
Specifies the text banner message to show on the greeter
window.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>/apps/gdm/simple-greeter/disable_restart_buttons</term>
<listitem>
<synopsis>false (boolean)</synopsis>
<para>
Controls whether to show the restart buttons in the login
window.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>/apps/gdm/simple-greeter/disable_user_list</term>
<listitem>
<synopsis>false (boolean)</synopsis>
<para>
If true, then the face browser with known users is not shown
in the login window.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>/apps/gdm/simple-greeter/logo_icon_name</term>
<listitem>
<synopsis>computer (string)</synopsis>
<para>
Set to the themed icon name to use for the greeter logo.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>/apps/gdm/simple-greeter/recent-languages</term>
<listitem>
<synopsis>[] (string list)</synopsis>
<para>
Set to a list of languages to be shown by default in the login
window. Default value is "[]". With the default setting only
the system default language is shown and the option "Other..."
which pops-up a dialog box showing a full list of available
languages which the user can select.
</para>
<para>
Users are not intended to change this setting by hand. Instead
GDM keeps track of any languages selected in this configuration
key, and will show them in the language combo box along with
the "Other..." choice. This way, commonly selected languages
are easier to select.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>/apps/gdm/simple-greeter/recent-layouts</term>
<listitem>
<synopsis>[] (string list)</synopsis>
<para>
Set to a list of keyboard layouts to be shown by default in the
login panel. Default value is "[]". With the default setting
only the system default keyboard layout is shown and the option
"Other..." which pops-up a dialog box showing a full list of
available keyboard layouts which the user can select.
</para>
<para>
Users are not intended to change this setting by hand. Instead
GDM keeps track of any keyboard layouts selected in this
configuration key, and will show them in the keyboard layout
combo box along with the "Other..." choice. This way, commonly
selected keyboard layouts are easier to select.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>/apps/gdm/simple-greeter/wm_use_compiz</term>
<listitem>
<synopsis>false (boolean)</synopsis>
<para>
Controls whether compiz is used as the window manager instead
of metacity.
</para>
</listitem>
</varlistentry>
</variablelist>
</sect2>
<sect2 id="accessibilityconfiguration">
<title>Accessibility Configuration</title>
<para>
This section describes the accessibility configuration options available
in GDM.
</para>
<sect3 id="accessibilitydialog">
<title>GDM Accessibility Dialog And GConf Keys</title>
<para>
The GDM greeter panel at the login screen displays an accessibility
icon. Clicking on that icon opens the GDM Accessibility Dialog. In
the GDM Accessibility Dialog, there is a list of checkboxes, so the
user can enable or disable the associated assistive tools.
</para>
<para>
The checkboxes that correspond to the on-screen keyboard, screen
magnifier and screen reader assistive tools act on the three GConf
keys that are described in the next section of this document. By
enabling or disabling these checkboxes, the associated GConf key is
set to "true" or "false". When the GConf key is set to true, the
assistive tools linked to this GConf key are launched. When the
GConf key is set to "false", any running assistive tool linked to
this GConf key are terminated. These GConf keys are not automatically
reset to a default state after the user has logged in. Consequently,
the assistive tools that were running during the last GDM login
session will automatically be launched at the next GDM login session.
</para>
<para>
The other checkboxes in the GDM Accessibility Dialog do not have
corresponding GConf keys because no additional program is launched to
provide the accessibility features that they offer. These other
options correspond to accessibility features that are provided by the
Xserver, which is always running during the GDM session.
</para>
</sect3>
<sect3 id="accessibilitygconfconfiguration">
<title>Accessibility GConf Keys</title>
<para>
GDM offers the following GConf keys to control its accessibility
features:
</para>
<variablelist>
<title>GDM Configuration Keys</title>
<varlistentry>
<term>/desktop/gnome/interface/accessibility</term>
<listitem>
<synopsis>false (boolean)</synopsis>
<para>
Controls whether the Accessibility infrastructure will be
started with the GDM GUI. This is needed for many
accessibility technology programs to work.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>/desktop/gnome/applications/at/screen_magnifier_enabled</term>
<listitem>
<synopsis>false (boolean)</synopsis>
<para>
If set, then the assistive tools linked to this GConf key will
be started with the GDM GUI program. By default this is a
screen magnifier application.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>/desktop/gnome/applications/at/screen_keyboard_enabled</term>
<listitem>
<synopsis>false (boolean)</synopsis>
<para>
If set, then the assistive tools linked to this GConf key will
be started with the GDM GUI program. By default this is an
on-screen keyboard application.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>/desktop/gnome/applications/at/screen_reader_enabled</term>
<listitem>
<synopsis>false (boolean)</synopsis>
<para>
If set, then the assistive tools linked to this GConf key will
be started with the GDM GUI program. By default this is a
screen reader application.
</para>
</listitem>
</varlistentry>
</variablelist>
</sect3>
<sect3 id="accessibilitytoolsconfiguration">
<title>Linking GConf Keys to Accessibility Tools</title>
<para>
For the screen_magnifier_enabled, the screen_keyboard_enabled, and the
screen_reader_enabled GConf keys, the assistive tool which gets
launched depends on the desktop files located in the GDM autostart
directory as described in the "Autostart Configuration" section of
this manual. Any desktop file in the GDM autostart directory can be
linked to these GConf key via specifying that GConf key in the
AutostartCondition value in the desktop file. So the exact
AutostartCondition line in the desktop file could be one of the
following:
</para>
<screen>
AutostartCondition=GNOME /desktop/gnome/applications/at/screen_keyboard_enabled
AutostartCondition=GNOME /desktop/gnome/applications/at/screen_magnifier_enabled
AutostartCondition=GNOME /desktop/gnome/applications/at/screen_reader_enabled
</screen>
<para>
When an accessibility key is true, then any program which is linked to
that key in a GDM autostart desktop file will be launched (unless the
Hidden key is set to true in that desktop file). A single GConf key
can even start multiple assistive tools if there are multiple desktop
files with this AutostartCondition in the GDM autostart directory.
</para>
</sect3>
<sect3 id="accessibilitytoolexample">
<title>Example Of Modifying Accessibility Tool Configuration</title>
<para>
For example, if GNOME is distributed with GOK as the default on-screen
keyboard, then this could be replaced with a different program if
desired. To replace GOK with the on-screen keyboard application
"onboard" and additionally activate the assistive tool "mousetweaks"
for dwelling support, then the following configuration is needed.
</para>
<para>
Create a desktop file for onboard and a second one for mousetweaks;
for example, onboard.desktop and mousetweaks.desktop. These files
must be placed in the GDM autostart directory and be in the format
as explained in the "Autostart Configuration" section of this
document.
</para>
<para>
The following is an example <filename>onboard.desktop</filename> file:
</para>
<screen>
[Desktop Entry]
Encoding=UTF-8
Name=Onboard Onscreen Keyboard
Comment=Use an on-screen keyboard
TryExec=onboard
Exec=onboard --size 500x180 -x 20 -y 10
Terminal=false
Type=Application
StartupNotify=true
Categories=GNOME;GTK;Accessibility;
AutostartCondition=GNOME /desktop/gnome/applications/at/screen_keyboard_enabled
</screen>
<para>
The following is an example <filename>mousetweaks.desktop</filename>
file:
</para>
<screen>
[Desktop Entry]
Encoding=UTF-8
Name=Software Mouse-Clicks
Comment=Perform clicks by dwelling with the pointer
TryExec=mousetweaks
Exec=mousetweaks --enable-dwell -m window -c -x 20 -y 240
Terminal=false
Type=Application
StartupNotify=true
Categories=GNOME;GTK;Accessibility;
AutostartCondition=GNOME /desktop/gnome/applications/at/screen_keyboard_enabled
</screen>
<para>
Note the line with the AutostartCondition that links both desktop
files to the GConf key for the on-screen keyboard.
</para>
<para>
To disable GOK from starting, the desktop file for the GOK on-screen
keyboard must be removed or deactivated. Otherwise onboard and GOK
would simultaneously be started. This can be done by removing the
gok.desktop file from the GDM autostart directory, or by adding the
"Hidden=true" key setting to the gok.desktop file.
</para>
<para>
After making these changes, GOK will no longer be started when the
user activates the on-screen keyboard in the GDM session; but onboard
and mousetweaks will instead be launched.
</para>
</sect3>
</sect2>
<sect2 id="generalsessionconfig">
<title>General Session Settings</title>
<!--
<para>
TODO - I think this section should be expanded upon. What specific
keys are of interest, or would some users be likely to want
to configure? Also, would be good to be more specific about
how lock down management is handled.
</para>
-->
<para>
The GDM Greeter uses some of the same framework that your desktop
session will use. And so, it is influenced by a number of the same
GConf settings. For each of these settings the Greeter will use the
default value unless it is specifically overridden by a) GDM's
installed mandatory policy b) system mandatory policy. GDM installs
its own mandatory policy to lock down some settings for security.
</para>
</sect2>
<sect2 id="gnomesettingsdaemon">
<title>GNOME Settings Daemon</title>
<!--
<para>
TODO - I think this section should be expanded upon. What specific
keys are of interest, or would some users be likely to want
to configure? Also, would be good to give a more complete
list of plugins that users might want to consider disabling.
Also, shouldn't we list the sound/active key in the Greeter
configuration setting? Oddly I do not find this key used
in anything but the chooser in SVN.
</para>
-->
<para>
GDM enables the following gnome-settings-daemon plugins:
a11y-keyboard, background, sound, xsettings.
</para>
<para>
These are responsible for things like the background image, font and
theme settings, sound events, etc.
</para>
<para>
Plugins can also be disabled using GConf. For example, if you want to
disable the sound plugin then unset the following key:
<filename>/apps/gdm/simple-greeter/settings-manager-plugins/sound/active</filename>.
</para>
</sect2>
<sect2 id="sessionconfig">
<title>GDM Session Configuration</title>
<para>
GDM sessions are specified using the FreeDesktop.org Desktop Entry
Specification, which can be referenced at the following URL:
<ulink url="http://www.freedesktop.org/wiki/Specifications/desktop-entry-spec">
http://www.freedesktop.org/wiki/Specifications/desktop-entry-spec</ulink>.
</para>
<para>
By default, GDM will install desktop files in the
<filename><share>/xsessions</filename> directory. GDM will
search the following directories in this order to find desktop files:
<filename><etc>/X11/sessions/</filename>,
<filename><dmconfdir>/Sessions</filename>,
<filename><share>/xsessions</filename>, and
<filename><share>/gdm/BuiltInSessions</filename>. By default the
<filename><dmconfdir></filename> is set to
<filename><etc>/dm/</filename> unless GDM is configured to use
a different directory via the "--with-dmconfdir" option.
</para>
<para>
A session can be disabled by editing the desktop file and adding a line
as follows: <filename>Hidden=true</filename>.
</para>
<para>
GDM desktop files support a GDM-specific extension, a key named
"X-GDM-BypassXsession". If the key is not specified in a
desktop file, the value defaults to "false". If this key is
specified to be "true" in a desktop file, then GDM will
launch the program specified by the desktop file "Exec" key
directly when starting the user session. It will not run the program
via the <filename><etc>/gdm/Xsession</filename> script, which is
the normal behavior. Since bypassing the
<filename><etc>/gdm/Xsession</filename> script avoids setting up
the user session with the normal system and user settings, sessions
started this way can be useful for debugging problems in the system or
user scripts that might be preventing a user from being able to start
a session.
</para>
</sect2>
<sect2 id="userconfig">
<title>GDM User Session and Language Configuration</title>
<para>
The user's default session and language choices are stored in the
<filename>~/.dmrc</filename> file. When a user logs in for the first
time, this file is created with the user's initial choices. The user
can change these default values by simply changing to a different value
when logging in. GDM will remember this change for subsequent logins.
</para>
<para>
The <filename>~/.dmrc</filename> file is in the standard
<filename>INI</filename> format. It has one section called
<filename>[Desktop]</filename> which has two keys:
<filename>Session</filename> and <filename>Language</filename>.
</para>
<para>
The <filename>Session</filename> key specifies the basename of the
session <filename>.desktop</filename> file that the user wishes to
normally use without the <filename>.desktop</filename> extension.
The <filename>Language</filename> key specifies the language that the
user wishes to use by default. If either of these keys is missing, the
system default is used. The file would normally look as follows:
</para>
<screen>
[Desktop]
Session=gnome
Language=cs_CZ.UTF-8
</screen>
</sect2>
</sect1>
<!-- ============= GDM Commands ============================= -->
<sect1 id="binaries">
<title>GDM Commands</title>
<sect2 id="sbindir_binaries">
<title>GDM Root User Commands</title>
<para>
The GDM package provides the following commands in
<filename>sbindir</filename> intended to be run by the root user:
</para>
<sect3 id="gdmcommandline">
<title><command>gdm</command> Command Line Options</title>
<para>
<command>gdm</command> is the main daemon which sets up
graphical login environment and starts necessary helpers.
</para>
<variablelist>
<title><command>gdm</command> Command Line Options</title>
<varlistentry>
<term>-?, --help</term>
<listitem>
<para>
Gives a brief overview of the command line options.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>--fatal-warnings</term>
<listitem>
<para>
Make all warnings cause GDM to exit.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>--timed-exit</term>
<listitem>
<para>
Exit after 30 seconds. Useful for debugging.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>--version</term>
<listitem>
<para>
Print the version of the GDM daemon.
</para>
</listitem>
</varlistentry>
</variablelist>
</sect3>
<sect3 id="gdmrestartcommandline">
<title><command>gdm-restart</command> Command Line Options</title>
<para>
<command>gdm-restart</command> stops and restarts GDM by sending
the GDM daemon a HUP signal. This command will immediately terminate
all sessions and log out users currently logged in with GDM.
</para>
</sect3>
<sect3 id="gdmsaferestartcommandline">
<title><command>gdm-safe-restart</command> Command Line Options</title>
<para>
<command>gdm-safe-restart</command> stops and restarts GDM by
sending the GDM daemon a USR1 signal. GDM will be restarted as soon
as all users log out.
</para>
</sect3>
<sect3 id="gdmstopcommandline">
<title><command>gdm-stop</command> Command Line Options</title>
<para>
<command>gdm-stop</command> stops GDM by sending the GDM daemon
a TERM signal.
</para>
</sect3>
</sect2>
</sect1>
<!-- ============= Troubleshooting =========================== -->
<sect1 id="troubleshooting">
<title>Troubleshooting</title>
<!--
<para>
TODO - any other tips we should add? Might be useful to highlight any
common D-Bus configuration issues?
</para>
-->
<para>
This section discusses helpful tips for getting GDM working. In general,
if you have a problem using GDM, you can submit a bug or send an email
to the gdm-list mailing list. Information about how to do this is in
the Introduction section of the document.
</para>
<para>
If GDM is failing to work properly, it is always a good idea to include
debug information. To enable debugging, set the debug/Enable key to
"true" in the <filename><etc>/gdm/custom.conf</filename>
file and restart GDM. Then use GDM to the point where it fails, and
debug output will be sent to the system log file
(<filename><var>/log/messages</filename> or
<filename><var>/adm/messages</filename> depending on your Operating
System). If you share this output with the GDM community via a bug
report or email, please only include the GDM related debug information
and not the entire file since it can be large. If you do not see any
GDM syslog output, you may need to configure syslog (refer to the
<ulink type="help" url="man:syslog">syslog</ulink> man page).
</para>
<sect2 id="wontstart">
<title>GDM Will Not Start</title>
<para>
There are a many problems that can cause GDM to fail to start, but
this section will discuss a few common problems and how to approach
tracking down a problem with GDM starting. Some problems will
cause GDM to respond with an error message or dialog when it tries
to start, but it can be difficult to track down problems when GDM
fails silently.
</para>
<para>
First make sure that the Xserver is configured properly. The
GDM configuration file contains a command in the [server-Standard]
section that is used for starting the Xserver. Verify that this
command works on your system. Running this command from the
console should start the Xserver. If it fails, then the problem
is likely with your Xserver configuration. Refer to your Xserver
error log for an idea of what the problem may be. The problem may
also be that your Xserver requires different command-line options.
If so, then modify the Xserver command in the GDM configuration file
so that it is correct for your system.
</para>
<para>
Also make sure that the <filename>/tmp</filename> directory has
reasonable ownership and permissions, and that the machine's file
system is not full. These problems will cause GDM to fail to start.
</para>
</sect2>
</sect1>
<!-- ============= Application License ============================= -->
<sect1 id="license">
<title>License</title>
<para>
This program is free software; you can redistribute it and/or
modify it under the terms of the <ulink type="help" url="gnome-help:gpl">
<citetitle>GNU General Public License</citetitle></ulink> as
published by the Free Software Foundation;
either version 2 of the License, or (at your option) any later
version.
</para>
<para>
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
<citetitle>GNU General Public License</citetitle> for more details.
</para>
<para>
A copy of the <citetitle>GNU General Public License</citetitle> is
included as an appendix to the <citetitle>GNOME Users
Guide</citetitle>. You may also obtain a copy of the
<citetitle>GNU General Public License</citetitle> from the Free
Software Foundation by visiting
<ulink type="http" url="http://www.fsf.org">their Web site</ulink> or by
writing to
<address>
Free Software Foundation, Inc.
<street>51 Franklin Street, Fifth Floor</street>
<city>Boston</city>, <state>MA</state> <postcode>02110-1301</postcode>
<country>USA</country>
</address>
</para>
</sect1>
</article>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:2
sgml-indent-data:t
sgml-parent-document:nil
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
-->