/*
* Copyright (C) 2010-2011 Robert Ancell.
* Author: Robert Ancell <robert.ancell@canonical.com>
- *
+ *
* This program is free software: you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your option) any later
/* Display server */
DisplayServer *display_server;
- /* User to run greeter as */
- gchar *greeter_user;
-
/* Greeter session */
gchar *greeter_session;
/* Session requested to log into */
gchar *user_session;
-
- /* Directory to load X sessions from */
- gchar *xsessions_dir;
-
- /* Directory to load X greeters from */
- gchar *xgreeters_dir;
/* Program to run sessions through */
gchar *session_wrapper;
/* PAM service to authenticate against for automatic logins */
gchar *pam_autologin_service;
+
+ /* TRUE if a session should be started on greeter quit */
+ gboolean start_session_on_greeter_quit;
/* TRUE if in a user session */
gboolean in_user_session;
-
+
/* TRUE if have emitted ready signal */
gboolean indicated_ready;
-
+
/* Session process */
Session *session;
/* TRUE if start greeter if fail to login */
gboolean start_greeter_if_fail;
-
+
/* Hint to select user in greeter */
gchar *select_user_hint;
gboolean select_guest_hint;
-
+
/* TRUE if allowed to log into guest account */
gboolean allow_guest;
/* TRUE if stopping the display (waiting for dispaly server, greeter and session to stop) */
- gboolean stopping;
+ gboolean stopping;
+
+ /* TRUE if stopped */
+ gboolean stopped;
};
G_DEFINE_TYPE (Display, display, G_TYPE_OBJECT);
static gboolean start_greeter_session (Display *display);
static gboolean start_user_session (Display *display, PAMSession *authentication);
-// FIXME: Should be a construct property
-// FIXME: Move into seat.c
-void
-display_load_config (Display *display, const gchar *config_section)
-{
- g_return_if_fail (display != NULL);
-
- display->priv->greeter_user = config_get_string (config_get_instance (), "LightDM", "greeter-user");
-
- if (config_section)
- display->priv->greeter_session = config_get_string (config_get_instance (), config_section, "greeter-session");
- if (!display->priv->greeter_session)
- display->priv->greeter_session = config_get_string (config_get_instance (), "SeatDefaults", "greeter-session");
- if (config_section && config_has_key (config_get_instance (), config_section, "greeter-hide-users"))
- display->priv->greeter_hide_users = config_get_boolean (config_get_instance (), config_section, "greeter-hide-users");
- else if (config_has_key (config_get_instance (), "SeatDefaults", "greeter-hide-users"))
- display->priv->greeter_hide_users = config_get_boolean (config_get_instance (), "SeatDefaults", "greeter-hide-users");
- if (config_section)
- display->priv->user_session = config_get_string (config_get_instance (), config_section, "user-session");
- if (!display->priv->user_session)
- display->priv->user_session = config_get_string (config_get_instance (), "SeatDefaults", "user-session");
- if (config_section)
- display->priv->xsessions_dir = config_get_string (config_get_instance (), config_section, "xsessions-directory");
- if (!display->priv->xsessions_dir)
- display->priv->xsessions_dir = config_get_string (config_get_instance (), "SeatDefaults", "xsessions-directory");
- if (config_section)
- display->priv->xgreeters_dir = config_get_string (config_get_instance (), config_section, "xgreeters-directory");
- if (!display->priv->xgreeters_dir)
- display->priv->xgreeters_dir = config_get_string (config_get_instance (), "SeatDefaults", "xgreeters-directory");
- if (config_section)
- display->priv->session_wrapper = config_get_string (config_get_instance (), config_section, "session-wrapper");
- if (!display->priv->session_wrapper)
- display->priv->session_wrapper = config_get_string (config_get_instance (), "SeatDefaults", "session-wrapper");
-}
-
// FIXME: Should be a construct property
void
display_set_display_server (Display *display, DisplayServer *display_server)
return display->priv->session;
}
+void
+display_set_greeter_session (Display *display, const gchar *greeter_session)
+{
+ g_return_if_fail (display != NULL);
+ g_free (display->priv->greeter_session);
+ display->priv->greeter_session = g_strdup (greeter_session);
+}
+
+void
+display_set_session_wrapper (Display *display, const gchar *session_wrapper)
+{
+ g_return_if_fail (display != NULL);
+ g_free (display->priv->session_wrapper);
+ display->priv->session_wrapper = g_strdup (session_wrapper);
+}
+
void
display_set_allow_guest (Display *display, gboolean allow_guest)
{
display->priv->select_guest_hint = is_guest;
}
+void
+display_set_hide_users_hint (Display *display, gboolean hide_users)
+{
+ g_return_if_fail (display != NULL);
+ display->priv->greeter_hide_users = hide_users;
+}
+
void
display_set_user_session (Display *display, const gchar *session_name)
{
g_return_if_fail (display != NULL);
- if (session_name)
- {
- g_free (display->priv->user_session);
- display->priv->user_session = g_strdup (session_name);
- }
+ g_free (display->priv->user_session);
+ display->priv->user_session = g_strdup (session_name);
}
static gboolean
NULL,
"org.freedesktop.ConsoleKit",
"/org/freedesktop/ConsoleKit/Manager",
- "org.freedesktop.ConsoleKit.Manager",
+ "org.freedesktop.ConsoleKit.Manager",
NULL, &error);
if (!proxy)
g_warning ("Unable to get connection to ConsoleKit: %s", error->message);
NULL,
"org.freedesktop.ConsoleKit",
"/org/freedesktop/ConsoleKit/Manager",
- "org.freedesktop.ConsoleKit.Manager",
+ "org.freedesktop.ConsoleKit.Manager",
NULL, NULL);
result = g_dbus_proxy_call_sync (proxy,
"CloseSession",
check_stopped (Display *display)
{
if (display->priv->stopping &&
+ !display->priv->stopped &&
display->priv->display_server == NULL &&
display->priv->session == NULL)
{
+ display->priv->stopped = TRUE;
g_debug ("Display stopped");
g_signal_emit (display, signals[STOPPED], 0);
}
}
if (!started_session)
- display_stop (display);
+ display_stop (display);
}
static gboolean
if (!display->priv->display_server)
return;
- /* Start the session for the authenticated user */
- if (greeter_get_guest_authenticated (display->priv->greeter))
+ /* Start the session for the authenticated user */
+ if (display->priv->start_session_on_greeter_quit)
{
- started_session = autologin_guest (display, FALSE);
- if (!started_session)
- g_debug ("Failed to start guest session");
- }
- else
- {
- display->priv->in_user_session = TRUE;
- started_session = start_user_session (display, greeter_get_authentication (display->priv->greeter));
- if (!started_session)
- g_debug ("Failed to start user session");
+ if (greeter_get_guest_authenticated (display->priv->greeter))
+ {
+ started_session = autologin_guest (display, FALSE);
+ if (!started_session)
+ g_debug ("Failed to start guest session");
+ }
+ else
+ {
+ display->priv->in_user_session = TRUE;
+ started_session = start_user_session (display, greeter_get_authentication (display->priv->greeter));
+ if (!started_session)
+ g_debug ("Failed to start user session");
+ }
}
g_signal_handlers_disconnect_matched (display->priv->greeter, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, display);
create_session (Display *display, PAMSession *authentication, const gchar *session_name, gboolean is_greeter, const gchar *log_filename)
{
gchar *sessions_dir, *filename, *path, *command = NULL;
- const gchar *orig_path;
GKeyFile *session_desktop_file;
Session *session;
gchar *cookie;
// FIXME: This is X specific, move into xsession.c
if (is_greeter)
- sessions_dir = display->priv->xgreeters_dir;
+ sessions_dir = config_get_string (config_get_instance (), "LightDM", "xgreeters-directory");
else
- sessions_dir = display->priv->xsessions_dir;
-
+ sessions_dir = config_get_string (config_get_instance (), "LightDM", "xsessions-directory");
filename = g_strdup_printf ("%s.desktop", session_name);
path = g_build_filename (sessions_dir, filename, NULL);
+ g_free (sessions_dir);
g_free (filename);
session_desktop_file = g_key_file_new ();
process_set_env (PROCESS (session), "DESKTOP_SESSION", session_name); // FIXME: Apparently deprecated?
process_set_env (PROCESS (session), "GDMSESSION", session_name); // FIXME: Not cross-desktop
- /* Insert our own utility directory to PATH
- * This is to provide gdmflexiserver which provides backwards compatibility with GDM.
- * This can be removed when this is no longer required.
- */
- orig_path = process_get_env (PROCESS (session), "PATH");
- if (orig_path)
- {
- path = g_strdup_printf ("%s:%s", PKGLIBEXEC_DIR, orig_path);
- process_set_env (PROCESS (session), "PATH", path);
- g_free (path);
- }
-
process_set_log_file (PROCESS (session), log_filename);
/* Open ConsoleKit session */
process_set_env (PROCESS (session), "LIGHTDM_TEST_HOME_DIR", g_getenv ("LIGHTDM_TEST_HOME_DIR"));
process_set_env (PROCESS (session), "LD_LIBRARY_PATH", g_getenv ("LD_LIBRARY_PATH"));
}
-
+
return session;
}
/* Stop the greeter, the session will start when the greeter has quit */
g_debug ("Stopping greeter");
- session_stop (display->priv->session);
+ display->priv->start_session_on_greeter_quit = TRUE;
+ session_stop (display->priv->session);
return TRUE;
}
if (getuid () != 0)
user = user_get_current ();
- else if (display->priv->greeter_user)
+ else
{
- user = user_get_by_name (display->priv->greeter_user);
- if (!user)
+ gchar *greeter_user;
+
+ greeter_user = config_get_string (config_get_instance (), "LightDM", "greeter-user");
+ if (!greeter_user)
{
- g_debug ("Unable to start greeter, user %s does not exist", display->priv->greeter_user);
+ g_warning ("Greeter must not be run as root");
return FALSE;
}
- }
- else
- {
- g_warning ("Greeter must not be run as root");
- return FALSE;
+
+ user = user_get_by_name (greeter_user);
+ if (!user)
+ g_debug ("Unable to start greeter, user %s does not exist", greeter_user);
+ g_free (greeter_user);
+ if (!user)
+ return FALSE;
}
display->priv->in_user_session = FALSE;
if (display->priv->autologin_user)
greeter_set_hint (display->priv->greeter, "autologin-user", display->priv->autologin_user);
else if (display->priv->autologin_guest)
- greeter_set_hint (display->priv->greeter, "autologin-guest", "true");
+ greeter_set_hint (display->priv->greeter, "autologin-guest", "true");
}
if (display->priv->select_user_hint)
greeter_set_hint (display->priv->greeter, "select-user", display->priv->select_user_hint);
gboolean result = FALSE;
g_debug ("Starting user session");
-
+
user = pam_session_get_user (authentication);
/* Load the users login settings (~/.dmrc) */
NULL,
"org.freedesktop.ConsoleKit",
"/org/freedesktop/ConsoleKit/Manager",
- "org.freedesktop.ConsoleKit.Manager",
+ "org.freedesktop.ConsoleKit.Manager",
NULL, &error);
if (!proxy)
g_warning ("Unable to get connection to ConsoleKit: %s", error->message);
NULL,
"org.freedesktop.ConsoleKit",
session_path,
- "org.freedesktop.ConsoleKit.Session",
+ "org.freedesktop.ConsoleKit.Session",
NULL, &error);
if (!proxy)
g_warning ("Unable to get connection to ConsoleKit session: %s", error->message);
if (self->priv->display_server)
g_object_unref (self->priv->display_server);
- g_free (self->priv->greeter_user);
g_free (self->priv->greeter_session);
if (self->priv->greeter)
g_object_unref (self->priv->greeter);
- g_free (self->priv->xsessions_dir);
- g_free (self->priv->xgreeters_dir);
g_free (self->priv->session_wrapper);
g_free (self->priv->pam_service);
g_free (self->priv->pam_autologin_service);