diff options
author | Robert Ancell <robert.ancell@canonical.com> | 2016-06-21 12:39:34 +1200 |
---|---|---|
committer | Robert Ancell <robert.ancell@canonical.com> | 2016-06-21 12:39:34 +1200 |
commit | 1e3d3494090e0a140d5088a9adcc78974efdea70 (patch) | |
tree | 35bf73458c7fe9121e39de3c42e3ad42b15ea83e | |
parent | 480156bacc31d2d1ed202ee7110197c4127aa508 (diff) | |
download | lightdm-git-1e3d3494090e0a140d5088a9adcc78974efdea70.tar.gz |
Refactor GreeterSession and Greeter into separate modules. This is to allow in-session greeters in the future.
-rw-r--r-- | configure.ac | 20 | ||||
-rw-r--r-- | po/lightdm.pot | 24 | ||||
-rw-r--r-- | src/Makefile.am | 2 | ||||
-rw-r--r-- | src/greeter-session.c | 108 | ||||
-rw-r--r-- | src/greeter-session.h | 47 | ||||
-rw-r--r-- | src/greeter.c | 190 | ||||
-rw-r--r-- | src/greeter.h | 11 | ||||
-rw-r--r-- | src/lightdm.c | 4 | ||||
-rw-r--r-- | src/seat-unity.c | 4 | ||||
-rw-r--r-- | src/seat-xlocal.c | 6 | ||||
-rw-r--r-- | src/seat-xremote.c | 4 | ||||
-rw-r--r-- | src/seat.c | 170 | ||||
-rw-r--r-- | src/seat.h | 4 | ||||
-rw-r--r-- | src/unity-system-compositor.c | 4 |
14 files changed, 387 insertions, 211 deletions
diff --git a/configure.ac b/configure.ac index 7896864e..7960800a 100644 --- a/configure.ac +++ b/configure.ac @@ -158,27 +158,27 @@ dnl ########################################################################### dnl Configurable values dnl ########################################################################### -USER_SESSION=default +DEFAULT_USER_SESSION=default AC_ARG_WITH(user-session, AS_HELP_STRING(--with-user-session=<name>, Session to use for user accounts), if test x$withval != x; then - USER_SESSION="$withval" + DEFAULT_USER_SESSION="$withval" fi ) -AC_SUBST(USER_SESSION) -AC_DEFINE_UNQUOTED(USER_SESSION, "$USER_SESSION", User session) +AC_SUBST(DEFAULT_USER_SESSION) +AC_DEFINE_UNQUOTED(DEFAULT_USER_SESSION, "$DEFAULT_USER_SESSION", User session) -GREETER_SESSION=default +DEFAULT_GREETER_SESSION=default AC_ARG_WITH(greeter-session, AS_HELP_STRING(--with-greeter-session=<session>, Greeter session), if test x$withval != x; then - GREETER_SESSION="$withval" + DEFAULT_GREETER_SESSION="$withval" fi ) -AC_SUBST(GREETER_SESSION) -AC_DEFINE_UNQUOTED(GREETER_SESSION, "$GREETER_SESSION", Greeter session) +AC_SUBST(DEFAULT_GREETER_SESSION) +AC_DEFINE_UNQUOTED(DEFAULT_GREETER_SESSION, "$DEFAULT_GREETER_SESSION", Greeter session) GREETER_USER=lightdm AC_ARG_WITH(greeter-user, @@ -237,9 +237,9 @@ echo " =========================== prefix: $prefix - Greeter session: $GREETER_SESSION + Greeter session: $DEFAULT_GREETER_SESSION Greeter user: $GREETER_USER - User session: $USER_SESSION + User session: $DEFAULT_USER_SESSION GObject introspection: $found_introspection Vala bindings: $enable_vala liblightdm-qt: $compile_liblightdm_qt4 diff --git a/po/lightdm.pot b/po/lightdm.pot index 74216e44..361e3577 100644 --- a/po/lightdm.pot +++ b/po/lightdm.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-08-10 12:37+1200\n" +"POT-Creation-Date: 2016-06-21 12:35+1200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -18,57 +18,57 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" #. Help string for command line --config flag -#: ../src/lightdm.c:1169 +#: ../src/lightdm.c:1188 msgid "Use configuration file" msgstr "" #. Help string for command line --debug flag -#: ../src/lightdm.c:1172 +#: ../src/lightdm.c:1191 msgid "Print debugging messages" msgstr "" #. Help string for command line --test-mode flag -#: ../src/lightdm.c:1175 +#: ../src/lightdm.c:1194 msgid "Run as unprivileged user, skipping things that require root access" msgstr "" #. Help string for command line --pid-file flag -#: ../src/lightdm.c:1178 +#: ../src/lightdm.c:1197 msgid "File to write PID into" msgstr "" #. Help string for command line --log-dir flag -#: ../src/lightdm.c:1181 +#: ../src/lightdm.c:1200 msgid "Directory to write logs to" msgstr "" #. Help string for command line --run-dir flag -#: ../src/lightdm.c:1184 +#: ../src/lightdm.c:1203 msgid "Directory to store running state" msgstr "" #. Help string for command line --cache-dir flag -#: ../src/lightdm.c:1187 +#: ../src/lightdm.c:1206 msgid "Directory to cache information" msgstr "" #. Help string for command line --show-config flag -#: ../src/lightdm.c:1190 +#: ../src/lightdm.c:1209 msgid "Show combined configuration" msgstr "" #. Help string for command line --version flag -#: ../src/lightdm.c:1193 +#: ../src/lightdm.c:1212 msgid "Show release version" msgstr "" #. Arguments and description for --help test -#: ../src/lightdm.c:1212 +#: ../src/lightdm.c:1231 msgid "- Display Manager" msgstr "" #. Text printed out when an unknown command-line argument provided -#: ../src/lightdm.c:1222 +#: ../src/lightdm.c:1241 #, c-format msgid "Run '%s --help' to see a full list of available command line options." msgstr "" diff --git a/src/Makefile.am b/src/Makefile.am index 8509276a..d519e638 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -12,6 +12,8 @@ lightdm_SOURCES = \ display-server.h \ greeter.c \ greeter.h \ + greeter-session.c \ + greeter-session.h \ guest-account.c \ guest-account.h \ lightdm.c \ diff --git a/src/greeter-session.c b/src/greeter-session.c new file mode 100644 index 00000000..0241dbdf --- /dev/null +++ b/src/greeter-session.c @@ -0,0 +1,108 @@ +/* + * 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 + * version. See http://www.gnu.org/copyleft/gpl.html the full text of the + * license. + */ + +#include <config.h> + +#include <string.h> +#include <errno.h> + +#include "greeter-session.h" + +struct GreeterSessionPrivate +{ + /* Greeter running inside this session */ + Greeter *greeter; + + /* Communication channels to communicate with */ + int to_greeter_input; + int from_greeter_output; +}; + +G_DEFINE_TYPE (GreeterSession, greeter_session, SESSION_TYPE); + +GreeterSession * +greeter_session_new (void) +{ + return g_object_new (GREETER_SESSION_TYPE, NULL); +} + +Greeter * +greeter_session_get_greeter (GreeterSession *session) +{ + g_return_val_if_fail (session != NULL, NULL); + return session->priv->greeter; +} + +static gboolean +setup_cb (Greeter *greeter, int input_fd, int output_fd, gpointer user_data) +{ + Session *session = user_data; + gchar *value; + + /* Let the greeter session know how to communicate with the daemon */ + value = g_strdup_printf ("%d", input_fd); + session_set_env (session, "LIGHTDM_TO_SERVER_FD", value); + g_free (value); + value = g_strdup_printf ("%d", output_fd); + session_set_env (session, "LIGHTDM_FROM_SERVER_FD", value); + g_free (value); + + return SESSION_CLASS (greeter_session_parent_class)->start (session); +} + +static gboolean +greeter_session_start (Session *session) +{ + GreeterSession *s = GREETER_SESSION (session); + return greeter_start (s->priv->greeter, setup_cb, session); +} + +static void +greeter_session_stop (Session *session) +{ + GreeterSession *s = GREETER_SESSION (session); + + greeter_stop (s->priv->greeter); + + SESSION_CLASS (greeter_session_parent_class)->stop (session); +} + +static void +greeter_session_init (GreeterSession *session) +{ + session->priv = G_TYPE_INSTANCE_GET_PRIVATE (session, GREETER_SESSION_TYPE, GreeterSessionPrivate); + session->priv->greeter = greeter_new (); +} + +static void +greeter_session_finalize (GObject *object) +{ + GreeterSession *self = GREETER_SESSION (object); + + g_clear_object (&self->priv->greeter); + close (self->priv->to_greeter_input); + close (self->priv->from_greeter_output); + + G_OBJECT_CLASS (greeter_session_parent_class)->finalize (object); +} + +static void +greeter_session_class_init (GreeterSessionClass *klass) +{ + SessionClass *session_class = SESSION_CLASS (klass); + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + session_class->start = greeter_session_start; + session_class->stop = greeter_session_stop; + object_class->finalize = greeter_session_finalize; + + g_type_class_add_private (klass, sizeof (GreeterSessionPrivate)); +} diff --git a/src/greeter-session.h b/src/greeter-session.h new file mode 100644 index 00000000..ea43da2d --- /dev/null +++ b/src/greeter-session.h @@ -0,0 +1,47 @@ +/* + * 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 + * version. See http://www.gnu.org/copyleft/gpl.html the full text of the + * license. + */ + +#ifndef GREETER_SESSION_H_ +#define GREETER_SESSION_H_ + +#include "session.h" +#include "greeter.h" + +G_BEGIN_DECLS + +#define GREETER_SESSION_TYPE (greeter_session_get_type()) +#define GREETER_SESSION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GREETER_SESSION_TYPE, GreeterSession)) +#define GREETER_SESSION_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GREETER_SESSION_TYPE, GreeterSessionClass)) +#define GREETER_SESSION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GREETER_SESSION_TYPE, GreeterSessionClass)) +#define IS_GREETER_SESSION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GREETER_SESSION_TYPE)) + +typedef struct GreeterSessionPrivate GreeterSessionPrivate; + +typedef struct +{ + Session parent_instance; + GreeterSessionPrivate *priv; +} GreeterSession; + +typedef struct +{ + SessionClass parent_class; +} GreeterSessionClass; + +GType greeter_session_get_type (void); + +GreeterSession *greeter_session_new (void); + +Greeter *greeter_session_get_greeter (GreeterSession *session); + +G_END_DECLS + +#endif /* GREETER_SESSION_H_ */ diff --git a/src/greeter.c b/src/greeter.c index db52a43d..72eaa2e7 100644 --- a/src/greeter.c +++ b/src/greeter.c @@ -1,6 +1,5 @@ /* - * Copyright (C) 2010-2011 Robert Ancell. - * Author: Robert Ancell <robert.ancell@canonical.com> + * Copyright (C) 2010-2016 Canonical Ltd. * * 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 @@ -83,7 +82,7 @@ struct GreeterPrivate guint from_greeter_watch; }; -G_DEFINE_TYPE (Greeter, greeter, SESSION_TYPE); +G_DEFINE_TYPE (Greeter, greeter, G_TYPE_OBJECT); /* Messages from the greeter to the server */ typedef enum @@ -119,9 +118,62 @@ greeter_new (void) return g_object_new (GREETER_TYPE, NULL); } +gboolean +greeter_start (Greeter *greeter, gboolean (*setup_child_cb)(Greeter *greeter, int input_fd, int output_fd, gpointer user_data), gpointer user_data) +{ + int to_greeter_pipe[2], from_greeter_pipe[2]; + int to_greeter_output, from_greeter_input; + gboolean result; + GError *error = NULL; + + /* Create a pipe to talk with the greeter */ + if (pipe (to_greeter_pipe) != 0 || pipe (from_greeter_pipe) != 0) + { + g_warning ("Failed to create pipes: %s", strerror (errno)); + return FALSE; + } + to_greeter_output = to_greeter_pipe[0]; + greeter->priv->to_greeter_input = to_greeter_pipe[1]; + greeter->priv->to_greeter_channel = g_io_channel_unix_new (greeter->priv->to_greeter_input); + g_io_channel_set_encoding (greeter->priv->to_greeter_channel, NULL, &error); + if (error) + g_warning ("Failed to set encoding on to greeter channel to binary: %s\n", error->message); + g_clear_error (&error); + greeter->priv->from_greeter_output = from_greeter_pipe[0]; + from_greeter_input = from_greeter_pipe[1]; + greeter->priv->from_greeter_channel = g_io_channel_unix_new (greeter->priv->from_greeter_output); + g_io_channel_set_encoding (greeter->priv->from_greeter_channel, NULL, &error); + if (error) + g_warning ("Failed to set encoding on from greeter channel to binary: %s\n", error->message); + g_clear_error (&error); + g_io_channel_set_buffered (greeter->priv->from_greeter_channel, FALSE); + greeter->priv->from_greeter_watch = g_io_add_watch (greeter->priv->from_greeter_channel, G_IO_IN | G_IO_HUP, read_cb, greeter); + + /* Don't allow the daemon end of the pipes to be accessed in child processes */ + fcntl (greeter->priv->to_greeter_input, F_SETFD, FD_CLOEXEC); + fcntl (greeter->priv->from_greeter_output, F_SETFD, FD_CLOEXEC); + + result = setup_child_cb (greeter, from_greeter_input, to_greeter_output, user_data); + + /* Close the session ends of the pipe */ + close (from_greeter_input); + close (to_greeter_output); + + return result; +} + +void +greeter_stop (Greeter *greeter) +{ + /* Stop any events occurring after we've stopped */ + if (greeter->priv->authentication_session) + g_signal_handlers_disconnect_matched (greeter->priv->authentication_session, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, greeter); +} + void greeter_set_pam_services (Greeter *greeter, const gchar *pam_service, const gchar *autologin_pam_service) { + g_return_if_fail (greeter != NULL); g_free (greeter->priv->pam_service); greeter->priv->pam_service = g_strdup (pam_service); g_free (greeter->priv->autologin_pam_service); @@ -131,18 +183,21 @@ greeter_set_pam_services (Greeter *greeter, const gchar *pam_service, const gcha void greeter_set_allow_guest (Greeter *greeter, gboolean allow_guest) { + g_return_if_fail (greeter != NULL); greeter->priv->allow_guest = allow_guest; } void greeter_clear_hints (Greeter *greeter) { + g_return_if_fail (greeter != NULL); g_hash_table_remove_all (greeter->priv->hints); } void greeter_set_hint (Greeter *greeter, const gchar *name, const gchar *value) { + g_return_if_fail (greeter != NULL); g_hash_table_insert (greeter->priv->hints, g_strdup (name), g_strdup (value)); } @@ -198,7 +253,7 @@ write_message (Greeter *greeter, guint8 *message, gsize message_length) status = g_io_channel_write_chars (greeter->priv->to_greeter_channel, data, data_length, &n_written, &error); if (error) - l_warning (greeter, "Error writing to greeter: %s", error->message); + g_warning ("Error writing to greeter: %s", error->message); g_clear_error (&error); if (status != G_IO_STATUS_NORMAL) return; @@ -208,7 +263,7 @@ write_message (Greeter *greeter, guint8 *message, gsize message_length) g_io_channel_flush (greeter->priv->to_greeter_channel, &error); if (error) - l_warning (greeter, "Failed to flush data to greeter: %s", error->message); + g_warning ("Failed to flush data to greeter: %s", error->message); g_clear_error (&error); } @@ -268,7 +323,7 @@ handle_connect (Greeter *greeter, const gchar *version, gboolean resettable) GHashTableIter iter; gpointer key, value; - l_debug (greeter, "Greeter connected version=%s resettable=%s", version, resettable ? "true" : "false"); + g_debug ("Greeter connected version=%s resettable=%s", version, resettable ? "true" : "false"); greeter->priv->resettable = resettable; @@ -305,7 +360,7 @@ pam_messages_cb (Session *session, Greeter *greeter) messages_length = session_get_messages_length (session); /* Respond to d-bus query with messages */ - l_debug (greeter, "Prompt greeter with %d message(s)", messages_length); + g_debug ("Prompt greeter with %d message(s)", messages_length); size = int_length () + string_length (session_get_username (session)) + int_length (); for (i = 0; i < messages_length; i++) size += int_length () + string_length (messages[i].msg); @@ -367,6 +422,8 @@ greeter_reset (Greeter *greeter) GHashTableIter iter; gpointer key, value; + g_return_if_fail (greeter != NULL); + g_hash_table_iter_init (&iter, greeter->priv->hints); while (g_hash_table_iter_next (&iter, &key, &value)) length += string_length (key) + string_length (value); @@ -386,16 +443,16 @@ authentication_complete_cb (Session *session, Greeter *greeter) { int result; - l_debug (greeter, "Authenticate result for user %s: %s", session_get_username (session), session_get_authentication_result_string (session)); + g_debug ("Authenticate result for user %s: %s", session_get_username (session), session_get_authentication_result_string (session)); result = session_get_authentication_result (session); if (session_get_is_authenticated (session)) { if (session_get_user (session)) - l_debug (greeter, "User %s authorized", session_get_username (session)); + g_debug ("User %s authorized", session_get_username (session)); else { - l_debug (greeter, "User %s authorized, but no account of that name exists", session_get_username (session)); + g_debug ("User %s authorized, but no account of that name exists", session_get_username (session)); result = PAM_USER_UNKNOWN; } } @@ -426,11 +483,11 @@ handle_login (Greeter *greeter, guint32 sequence_number, const gchar *username) if (username[0] == '\0') { - l_debug (greeter, "Greeter start authentication"); + g_debug ("Greeter start authentication"); username = NULL; } else - l_debug (greeter, "Greeter start authentication for %s", username); + g_debug ("Greeter start authentication for %s", username); reset_session (greeter); @@ -474,13 +531,13 @@ handle_login (Greeter *greeter, guint32 sequence_number, const gchar *username) static void handle_login_as_guest (Greeter *greeter, guint32 sequence_number) { - l_debug (greeter, "Greeter start authentication for guest account"); + g_debug ("Greeter start authentication for guest account"); reset_session (greeter); if (!greeter->priv->allow_guest) { - l_debug (greeter, "Guest account is disabled"); + g_debug ("Guest account is disabled"); send_end_authentication (greeter, sequence_number, "", PAM_USER_UNKNOWN); return; } @@ -531,11 +588,11 @@ handle_login_remote (Greeter *greeter, const gchar *session_name, const gchar *u if (username[0] == '\0') { - l_debug (greeter, "Greeter start authentication for remote session %s", session_name); + g_debug ("Greeter start authentication for remote session %s", session_name); username = NULL; } else - l_debug (greeter, "Greeter start authentication for remote session %s as user %s", session_name, username); + g_debug ("Greeter start authentication for remote session %s as user %s", session_name, username); reset_session (greeter); @@ -600,7 +657,7 @@ handle_continue_authentication (Greeter *greeter, gchar **secrets) return; } - l_debug (greeter, "Continue authentication"); + g_debug ("Continue authentication"); /* Build response */ response = calloc (messages_length, sizeof (struct pam_response)); @@ -630,7 +687,7 @@ handle_cancel_authentication (Greeter *greeter) if (greeter->priv->authentication_session == NULL) return; - l_debug (greeter, "Cancel authentication"); + g_debug ("Cancel authentication"); reset_session (greeter); } @@ -655,15 +712,15 @@ handle_start_session (Greeter *greeter, const gchar *session) if (greeter->priv->guest_account_authenticated || session_get_is_authenticated (greeter->priv->authentication_session)) { if (session) - l_debug (greeter, "Greeter requests session %s", session); + g_debug ("Greeter requests session %s", session); else - l_debug (greeter, "Greeter requests default session"); + g_debug ("Greeter requests default session"); greeter->priv->start_session = TRUE; g_signal_emit (greeter, signals[START_SESSION], 0, session_type, session, &result); } else { - l_debug (greeter, "Ignoring start session request, user is not authorized"); + g_debug ("Ignoring start session request, user is not authorized"); result = FALSE; } @@ -679,18 +736,18 @@ handle_set_language (Greeter *greeter, const gchar *language) if (!greeter->priv->guest_account_authenticated && !session_get_is_authenticated (greeter->priv->authentication_session)) { - l_debug (greeter, "Ignoring set language request, user is not authorized"); + g_debug ("Ignoring set language request, user is not authorized"); return; } // FIXME: Could use this if (greeter->priv->guest_account_authenticated) { - l_debug (greeter, "Ignoring set language request for guest user"); + g_debug ("Ignoring set language request for guest user"); return; } - l_debug (greeter, "Greeter sets language %s", language); + g_debug ("Greeter sets language %s", language); user = session_get_user (greeter->priv->authentication_session); user_set_language (user, language); } @@ -702,7 +759,7 @@ handle_ensure_shared_dir (Greeter *greeter, const gchar *username) guint8 message[MAX_MESSAGE_LENGTH]; gsize offset = 0; - l_debug (greeter, "Greeter requests data directory for user %s", username); + g_debug ("Greeter requests data directory for user %s", username); dir = shared_data_manager_ensure_user_dir (shared_data_manager_get_instance (), username); @@ -720,7 +777,7 @@ read_int (Greeter *greeter, gsize *offset) guint8 *buffer; if (greeter->priv->n_read - *offset < sizeof (guint32)) { - l_warning (greeter, "Not enough space for int, need %zu, got %zu", sizeof (guint32), greeter->priv->n_read - *offset); + g_warning ("Not enough space for int, need %zu, got %zu", sizeof (guint32), greeter->priv->n_read - *offset); return 0; } buffer = greeter->priv->read_buffer + *offset; @@ -740,7 +797,7 @@ get_message_length (Greeter *greeter) if (HEADER_SIZE + payload_length < HEADER_SIZE) { - l_warning (greeter, "Payload length of %u octets too long", payload_length); + g_warning ("Payload length of %u octets too long", payload_length); return HEADER_SIZE; } @@ -756,7 +813,7 @@ read_string_full (Greeter *greeter, gsize *offset, void* (*alloc_fn)(size_t n)) length = read_int (greeter, offset); if (greeter->priv->n_read - *offset < length) { - l_warning (greeter, "Not enough space for string, need %u, got %zu", length, greeter->priv->n_read - *offset); + g_warning ("Not enough space for string, need %u, got %zu", length, greeter->priv->n_read - *offset); return g_strdup (""); } @@ -798,7 +855,7 @@ read_cb (GIOChannel *source, GIOCondition condition, gpointer data) if (condition == G_IO_HUP) { - l_debug (greeter, "Greeter closed communication channel"); + g_debug ("Greeter closed communication channel"); greeter->priv->from_greeter_watch = 0; return FALSE; } @@ -820,7 +877,7 @@ read_cb (GIOChannel *source, GIOCondition condition, gpointer data) &n_read, &error); if (error) - l_warning (greeter, "Error reading from greeter: %s", error->message); + g_warning ("Error reading from greeter: %s", error->message); g_clear_error (&error); if (status != G_IO_STATUS_NORMAL) return TRUE; @@ -874,7 +931,7 @@ read_cb (GIOChannel *source, GIOCondition condition, gpointer data) max_secrets = (G_MAXUINT32 - 1) / sizeof (gchar *); if (n_secrets > max_secrets) { - l_warning (greeter, "Array length of %u elements too long", n_secrets); + g_warning ("Array length of %u elements too long", n_secrets); greeter->priv->from_greeter_watch = 0; return FALSE; } @@ -906,7 +963,7 @@ read_cb (GIOChannel *source, GIOCondition condition, gpointer data) g_free (username); break; default: - l_warning (greeter, "Unknown message from greeter: %d", id); + g_warning ("Unknown message from greeter: %d", id); break; } @@ -950,60 +1007,6 @@ greeter_get_active_username (Greeter *greeter) return greeter->priv->active_username; } -static gboolean -greeter_start (Session *session) -{ - Greeter *greeter = GREETER (session); - int to_greeter_pipe[2], from_greeter_pipe[2]; - int to_greeter_output, from_greeter_input; - gboolean result = FALSE; - gchar *value; - GError *error = NULL; - - /* Create a pipe to talk with the greeter */ - if (pipe (to_greeter_pipe) != 0 || pipe (from_greeter_pipe) != 0) - { - g_warning ("Failed to create pipes: %s", strerror (errno)); - return FALSE; - } - to_greeter_output = to_greeter_pipe[0]; - greeter->priv->to_greeter_input = to_greeter_pipe[1]; - greeter->priv->to_greeter_channel = g_io_channel_unix_new (greeter->priv->to_greeter_input); - g_io_channel_set_encoding (greeter->priv->to_greeter_channel, NULL, &error); - if (error) - g_warning ("Failed to set encoding on to greeter channel to binary: %s\n", error->message); - g_clear_error (&error); - greeter->priv->from_greeter_output = from_greeter_pipe[0]; - from_greeter_input = from_greeter_pipe[1]; - greeter->priv->from_greeter_channel = g_io_channel_unix_new (greeter->priv->from_greeter_output); - g_io_channel_set_encoding (greeter->priv->from_greeter_channel, NULL, &error); - if (error) - g_warning ("Failed to set encoding on from greeter channel to binary: %s\n", error->message); - g_clear_error (&error); - g_io_channel_set_buffered (greeter->priv->from_greeter_channel, FALSE); - greeter->priv->from_greeter_watch = g_io_add_watch (greeter->priv->from_greeter_channel, G_IO_IN | G_IO_HUP, read_cb, greeter); - - /* Let the greeter session know how to communicate with the daemon */ - value = g_strdup_printf ("%d", from_greeter_input); - session_set_env (SESSION (greeter), "LIGHTDM_TO_SERVER_FD", value); - g_free (value); - value = g_strdup_printf ("%d", to_greeter_output); - session_set_env (SESSION (greeter), "LIGHTDM_FROM_SERVER_FD", value); - g_free (value); - - /* Don't allow the daemon end of the pipes to be accessed in child processes */ - fcntl (greeter->priv->to_greeter_input, F_SETFD, FD_CLOEXEC); - fcntl (greeter->priv->from_greeter_output, F_SETFD, FD_CLOEXEC); - - result = SESSION_CLASS (greeter_parent_class)->start (session); - - /* Close the session ends of the pipe */ - close (to_greeter_output); - close (from_greeter_input); - - return result; -} - static Session * greeter_real_create_session (Greeter *greeter) { @@ -1017,18 +1020,6 @@ greeter_real_start_session (Greeter *greeter, SessionType type, const gchar *ses } static void -greeter_stop (Session *session) -{ - Greeter *greeter = GREETER (session); - - /* Stop any events occurring after we've stopped */ - if (greeter->priv->authentication_session) - g_signal_handlers_disconnect_matched (greeter->priv->authentication_session, G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, greeter); - - SESSION_CLASS (greeter_parent_class)->stop (session); -} - -static void greeter_init (Greeter *greeter) { greeter->priv = G_TYPE_INSTANCE_GET_PRIVATE (greeter, GREETER_TYPE, GreeterPrivate); @@ -1097,13 +1088,10 @@ greeter_get_property (GObject *object, static void greeter_class_init (GreeterClass *klass) { - SessionClass *session_class = SESSION_CLASS (klass); GObjectClass *object_class = G_OBJECT_CLASS (klass); klass->create_session = greeter_real_create_session; klass->start_session = greeter_real_start_session; - session_class->start = greeter_start; - session_class->stop = greeter_stop; object_class->finalize = greeter_finalize; object_class->get_property = greeter_get_property; object_class->set_property = greeter_set_property; diff --git a/src/greeter.h b/src/greeter.h index 32b76b5e..a48a6d43 100644 --- a/src/greeter.h +++ b/src/greeter.h @@ -1,6 +1,5 @@ /* - * Copyright (C) 2010-2011 Robert Ancell. - * Author: Robert Ancell <robert.ancell@canonical.com> + * Copyright (C) 2010-2016 Canonical Ltd. * * 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 @@ -34,13 +33,13 @@ typedef struct GreeterPrivate GreeterPrivate; typedef struct { - Session parent_instance; + GObject parent_instance; GreeterPrivate *priv; } Greeter; typedef struct { - SessionClass parent_class; + GObjectClass parent_class; void (*connected)(Greeter *greeter); Session *(*create_session)(Greeter *greeter); gboolean (*start_session)(Greeter *greeter, SessionType type, const gchar *session); @@ -50,6 +49,10 @@ GType greeter_get_type (void); Greeter *greeter_new (void); +gboolean greeter_start (Greeter *greeter, gboolean (*setup_child_cb)(Greeter *greeter, int input_fd, int output_fd, gpointer user_data), gpointer user_data); + +void greeter_stop (Greeter *greeter); + void greeter_set_pam_services (Greeter *greeter, const gchar *pam_service, const gchar *autologin_pam_service); void greeter_set_allow_guest (Greeter *greeter, gboolean allow_guest); diff --git a/src/lightdm.c b/src/lightdm.c index a360a1ce..32ab3c05 100644 --- a/src/lightdm.c +++ b/src/lightdm.c @@ -1424,9 +1424,9 @@ main (int argc, char **argv) if (!config_has_key (config_get_instance (), "Seat:*", "greeter-show-remote-login")) config_set_boolean (config_get_instance (), "Seat:*", "greeter-show-remote-login", TRUE); if (!config_has_key (config_get_instance (), "Seat:*", "greeter-session")) - config_set_string (config_get_instance (), "Seat:*", "greeter-session", GREETER_SESSION); + config_set_string (config_get_instance (), "Seat:*", "greeter-session", DEFAULT_GREETER_SESSION); if (!config_has_key (config_get_instance (), "Seat:*", "user-session")) - config_set_string (config_get_instance (), "Seat:*", "user-session", USER_SESSION); + config_set_string (config_get_instance (), "Seat:*", "user-session", DEFAULT_USER_SESSION); if (!config_has_key (config_get_instance (), "Seat:*", "session-wrapper")) config_set_string (config_get_instance (), "Seat:*", "session-wrapper", "lightdm-session"); if (!config_has_key (config_get_instance (), "LightDM", "log-directory")) diff --git a/src/seat-unity.c b/src/seat-unity.c index acad7ce1..2bed5a56 100644 --- a/src/seat-unity.c +++ b/src/seat-unity.c @@ -267,10 +267,10 @@ seat_unity_create_display_server (Seat *seat, Session *session) } } -static Greeter * +static GreeterSession * seat_unity_create_greeter_session (Seat *seat) { - Greeter *greeter_session; + GreeterSession *greeter_session; gchar *id; gint vt; diff --git a/src/seat-xlocal.c b/src/seat-xlocal.c index 53154101..0192eba6 100644 --- a/src/seat-xlocal.c +++ b/src/seat-xlocal.c @@ -298,10 +298,10 @@ seat_xlocal_create_display_server (Seat *seat, Session *session) } } -static Greeter * +static GreeterSession * seat_xlocal_create_greeter_session (Seat *seat) { - Greeter *greeter_session; + GreeterSession *greeter_session; greeter_session = SEAT_CLASS (seat_xlocal_parent_class)->create_greeter_session (seat); session_set_env (SESSION (greeter_session), "XDG_SEAT", seat_get_name (seat)); @@ -332,7 +332,7 @@ seat_xlocal_set_active_session (Seat *seat, Session *session) vt_set_active (vt); if (IS_UNITY_SYSTEM_COMPOSITOR (display_server)) - unity_system_compositor_set_active_session (UNITY_SYSTEM_COMPOSITOR (display_server), IS_GREETER (session) ? "greeter-0" : "session-0"); + unity_system_compositor_set_active_session (UNITY_SYSTEM_COMPOSITOR (display_server), IS_GREETER_SESSION (session) ? "greeter-0" : "session-0"); SEAT_CLASS (seat_xlocal_parent_class)->set_active_session (seat, session); } diff --git a/src/seat-xremote.c b/src/seat-xremote.c index efc8135d..2e260c37 100644 --- a/src/seat-xremote.c +++ b/src/seat-xremote.c @@ -49,10 +49,10 @@ seat_xremote_create_display_server (Seat *seat, Session *session) return DISPLAY_SERVER (x_server); } -static Greeter * +static GreeterSession * seat_xremote_create_greeter_session (Seat *seat) { - Greeter *greeter_session; + GreeterSession *greeter_session; greeter_session = SEAT_CLASS (seat_xremote_parent_class)->create_greeter_session (seat); session_set_env (SESSION (greeter_session), "XDG_SEAT", seat_get_name (seat)); @@ -16,7 +16,7 @@ #include "seat.h" #include "configuration.h" #include "guest-account.h" -#include "greeter.h" +#include "greeter-session.h" #include "session-config.h" enum { @@ -67,7 +67,7 @@ struct SeatPrivate gboolean stopped; /* The greeter to be started to replace the current one */ - Greeter *replacement_greeter; + GreeterSession *replacement_greeter; }; static void seat_logger_iface_init (LoggerInterface *iface); @@ -85,7 +85,7 @@ static GHashTable *seat_modules = NULL; // FIXME: Make a get_display_server() that re-uses display servers if supported static DisplayServer *create_display_server (Seat *seat, Session *session); -static Greeter *create_greeter_session (Seat *seat); +static GreeterSession *create_greeter_session (Seat *seat); static void start_session (Seat *seat, Session *session); void @@ -235,12 +235,12 @@ seat_set_active_session (Seat *seat, Session *session) if (s == session || session_get_is_stopping (s)) continue; - if (IS_GREETER (s)) + if (IS_GREETER_SESSION (s)) { - Greeter *greeter = GREETER (s); + Greeter *greeter = greeter_session_get_greeter (GREETER_SESSION (s)); if (greeter_get_resettable (greeter)) { - if (seat->priv->active_session == SESSION (greeter)) + if (seat->priv->active_session == s) { l_debug (seat, "Idling greeter"); /* Do this in an idle callback, because we might very well @@ -259,7 +259,7 @@ seat_set_active_session (Seat *seat, Session *session) } /* Lock previous sessions */ - if (seat->priv->active_session && session != seat->priv->active_session && !IS_GREETER (seat->priv->active_session)) + if (seat->priv->active_session && session != seat->priv->active_session && !IS_GREETER_SESSION (seat->priv->active_session)) session_lock (seat->priv->active_session); session_activate (session); @@ -466,7 +466,7 @@ display_server_stopped_cb (DisplayServer *display_server, Seat *seat) continue; /* Stop seat if this is the only display server and it failed to start a greeter */ - if (IS_GREETER (session) && + if (IS_GREETER_SESSION (session) && !session_get_is_started (session) && g_list_length (seat->priv->display_servers) == 0) { @@ -503,7 +503,7 @@ can_share_display_server (Seat *seat, DisplayServer *display_server) return seat->priv->share_display_server && display_server_get_can_share (display_server); } -static Greeter * +static GreeterSession * find_greeter_session (Seat *seat) { GList *link; @@ -511,14 +511,14 @@ find_greeter_session (Seat *seat) for (link = seat->priv->sessions; link; link = link->next) { Session *session = link->data; - if (!session_get_is_stopping (session) && IS_GREETER (session)) - return GREETER (session); + if (!session_get_is_stopping (session) && IS_GREETER_SESSION (session)) + return GREETER_SESSION (session); } return NULL; } -static Greeter * +static GreeterSession * find_resettable_greeter (Seat *seat) { GList *link; @@ -526,29 +526,30 @@ find_resettable_greeter (Seat *seat) for (link = seat->priv->sessions; link; link = link->next) { Session *session = link->data; - if (!session_get_is_stopping (session) && IS_GREETER (session) && - greeter_get_resettable (GREETER (session))) - return GREETER (session); + if (!session_get_is_stopping (session) && IS_GREETER_SESSION (session) && + greeter_get_resettable (greeter_session_get_greeter (GREETER_SESSION (session)))) + return GREETER_SESSION (session); } return NULL; } static void -set_greeter_hints (Seat *seat, Greeter *greeter_session) +set_greeter_hints (Seat *seat, Greeter *greeter) { - greeter_clear_hints (greeter_session); - greeter_set_hint (greeter_session, "default-session", seat_get_string_property (seat, "user-session")); - greeter_set_hint (greeter_session, "hide-users", seat_get_boolean_property (seat, "greeter-hide-users") ? "true" : "false"); - greeter_set_hint (greeter_session, "show-manual-login", seat_get_boolean_property (seat, "greeter-show-manual-login") ? "true" : "false"); - greeter_set_hint (greeter_session, "show-remote-login", seat_get_boolean_property (seat, "greeter-show-remote-login") ? "true" : "false"); - greeter_set_hint (greeter_session, "has-guest-account", seat_get_allow_guest (seat) && seat_get_boolean_property (seat, "greeter-allow-guest") ? "true" : "false"); + greeter_clear_hints (greeter); + greeter_set_hint (greeter, "default-session", seat_get_string_property (seat, "user-session")); + greeter_set_hint (greeter, "hide-users", seat_get_boolean_property (seat, "greeter-hide-users") ? "true" : "false"); + greeter_set_hint (greeter, "show-manual-login", seat_get_boolean_property (seat, "greeter-show-manual-login") ? "true" : "false"); + greeter_set_hint (greeter, "show-remote-login", seat_get_boolean_property (seat, "greeter-show-remote-login") ? "true" : "false"); + greeter_set_hint (greeter, "has-guest-account", seat_get_allow_guest (seat) && seat_get_boolean_property (seat, "greeter-allow-guest") ? "true" : "false"); } static void switch_to_greeter_from_failed_session (Seat *seat, Session *session) { - Greeter *greeter_session; + GreeterSession *greeter_session; + Greeter *greeter; gboolean existing = FALSE; /* Switch to greeter if one open */ @@ -556,22 +557,23 @@ switch_to_greeter_from_failed_session (Seat *seat, Session *session) if (greeter_session) { l_debug (seat, "Switching to existing greeter"); - set_greeter_hints (seat, greeter_session); + set_greeter_hints (seat, greeter_session_get_greeter (greeter_session)); existing = TRUE; } else { greeter_session = create_greeter_session (seat); } + greeter = greeter_session_get_greeter (greeter_session); if (session_get_is_guest (session)) - greeter_set_hint (greeter_session, "select-guest", "true"); + greeter_set_hint (greeter, "select-guest", "true"); else - greeter_set_hint (greeter_session, "select-user", session_get_username (session)); + greeter_set_hint (greeter, "select-user", session_get_username (session)); if (existing) { - greeter_reset (greeter_session); + greeter_reset (greeter); seat_set_active_session (seat, SESSION (greeter_session)); } else @@ -605,7 +607,7 @@ static void start_session (Seat *seat, Session *session) { /* Use system location for greeter log file */ - if (IS_GREETER (session)) + if (IS_GREETER_SESSION (session)) { gchar *log_dir, *filename, *log_filename; gboolean backup_logs; @@ -623,7 +625,7 @@ start_session (Seat *seat, Session *session) if (session_start (session)) return; - if (IS_GREETER (session)) + if (IS_GREETER_SESSION (session)) { l_debug (seat, "Failed to start greeter"); display_server_stop (session_get_display_server (session)); @@ -639,7 +641,7 @@ run_session (Seat *seat, Session *session) { const gchar *script; - if (IS_GREETER (session)) + if (IS_GREETER_SESSION (session)) script = seat_get_string_property (seat, "greeter-setup-script"); else script = seat_get_string_property (seat, "session-setup-script"); @@ -650,7 +652,7 @@ run_session (Seat *seat, Session *session) return; } - if (!IS_GREETER (session)) + if (!IS_GREETER_SESSION (session)) { g_signal_emit (seat, signals[RUNNING_USER_SESSION], 0, session); emit_upstart_signal ("desktop-session-start"); @@ -733,7 +735,7 @@ session_authentication_complete_cb (Session *session, Seat *seat) run_session (seat, session); } } - else if (!IS_GREETER (session)) + else if (!IS_GREETER_SESSION (session)) { l_debug (seat, "Switching to greeter due to failed authentication"); switch_to_greeter_from_failed_session (seat, session); @@ -769,7 +771,7 @@ session_stopped_cb (Session *session, Seat *seat) } /* Cleanup */ - if (!IS_GREETER (session)) + if (!IS_GREETER_SESSION (session)) { const gchar *script; script = seat_get_string_property (seat, "session-cleanup-script"); @@ -790,9 +792,9 @@ session_stopped_cb (Session *session, Seat *seat) } /* If there is a pending replacement greeter, start it */ - if (IS_GREETER (session) && seat->priv->replacement_greeter) + if (IS_GREETER_SESSION (session) && seat->priv->replacement_greeter) { - Greeter *replacement_greeter = seat->priv->replacement_greeter; + GreeterSession *replacement_greeter = seat->priv->replacement_greeter; seat->priv->replacement_greeter = NULL; if (session_get_is_authenticated (SESSION (replacement_greeter))) @@ -809,9 +811,9 @@ session_stopped_cb (Session *session, Seat *seat) g_object_unref (replacement_greeter); } /* If this is the greeter session then re-use this display server */ - else if (IS_GREETER (session) && + else if (IS_GREETER_SESSION (session) && can_share_display_server (seat, display_server) && - greeter_get_start_session (GREETER (session))) + greeter_get_start_session (greeter_session_get_greeter (GREETER_SESSION (session)))) { GList *link; @@ -837,8 +839,8 @@ session_stopped_cb (Session *session, Seat *seat) } } /* If this is the greeter and nothing else is running then stop the seat */ - else if (IS_GREETER (session) && - !greeter_get_start_session (GREETER (session)) && + else if (IS_GREETER_SESSION (session) && + !greeter_get_start_session (greeter_session_get_greeter (GREETER_SESSION (session))) && g_list_length (seat->priv->display_servers) == 1 && g_list_nth_data (seat->priv->display_servers, 0) == display_server) { @@ -846,7 +848,7 @@ session_stopped_cb (Session *session, Seat *seat) seat_stop (seat); } /* If we were the active session, switch to a greeter */ - else if (!IS_GREETER (session) && session == seat_get_active_session (seat)) + else if (!IS_GREETER_SESSION (session) && session == seat_get_active_session (seat)) { l_debug (seat, "Active session stopped, starting greeter"); if (!seat_switch_to_greeter (seat)) @@ -1139,14 +1141,33 @@ create_guest_session (Seat *seat, const gchar *session_name) return session; } +// FIXME: This is inefficient and we already know the greeter session when we set the callbacks... +static Session * +get_greeter_session (Seat *seat, Greeter *greeter) +{ + GList *link; + + /* Stop any greeters */ + for (link = seat->priv->sessions; link; link = link->next) + { + Session *session = link->data; + + if (IS_GREETER_SESSION (session) && greeter_session_get_greeter (GREETER_SESSION (session))) + return session; + } + + return NULL; +} + static Session * greeter_create_session_cb (Greeter *greeter, Seat *seat) { - Session *session; + Session *greeter_session, *session; + greeter_session = get_greeter_session (seat, greeter); session = create_session (seat, FALSE); - session_set_config (session, session_get_config (SESSION (greeter))); - session_set_display_server (session, session_get_display_server (SESSION (greeter))); + session_set_config (session, session_get_config (greeter_session)); + session_set_display_server (session, session_get_display_server (greeter_session)); return g_object_ref (session); } @@ -1154,7 +1175,7 @@ greeter_create_session_cb (Greeter *greeter, Seat *seat) static gboolean greeter_start_session_cb (Greeter *greeter, SessionType type, const gchar *session_name, Seat *seat) { - Session *session, *existing_session; + Session *session, *existing_session, *greeter_session; const gchar *username; DisplayServer *display_server; @@ -1233,7 +1254,8 @@ greeter_start_session_cb (Greeter *greeter, SessionType type, const gchar *sessi } /* If can re-use the display server, stop the greeter first */ - display_server = session_get_display_server (SESSION (greeter)); + greeter_session = get_greeter_session (seat, greeter); + display_server = session_get_display_server (greeter_session); if (!greeter_get_resettable (greeter) && can_share_display_server (seat, display_server) && strcmp (display_server_get_session_type (display_server), session_get_session_type (session)) == 0) @@ -1244,7 +1266,7 @@ greeter_start_session_cb (Greeter *greeter, SessionType type, const gchar *sessi session_set_display_server (session, display_server); /* Stop the greeter */ - session_stop (SESSION (greeter)); + session_stop (greeter_session); return TRUE; } @@ -1263,12 +1285,13 @@ greeter_start_session_cb (Greeter *greeter, SessionType type, const gchar *sessi } } -static Greeter * +static GreeterSession * create_greeter_session (Seat *seat) { gchar *sessions_dir, **argv; SessionConfig *session_config; - Greeter *greeter_session; + GreeterSession *greeter_session; + Greeter *greeter; const gchar *greeter_wrapper; const gchar *autologin_username; int autologin_timeout; @@ -1293,9 +1316,10 @@ create_greeter_session (Seat *seat) } greeter_session = SEAT_GET_CLASS (seat)->create_greeter_session (seat); + greeter = greeter_session_get_greeter (greeter_session); session_set_config (SESSION (greeter_session), session_config); seat->priv->sessions = g_list_append (seat->priv->sessions, SESSION (greeter_session)); - g_signal_connect (greeter_session, GREETER_SIGNAL_ACTIVE_USERNAME_CHANGED, G_CALLBACK (greeter_active_username_changed_cb), seat); + g_signal_connect (greeter, GREETER_SIGNAL_ACTIVE_USERNAME_CHANGED, G_CALLBACK (greeter_active_username_changed_cb), seat); g_signal_connect (greeter_session, SESSION_SIGNAL_AUTHENTICATION_COMPLETE, G_CALLBACK (session_authentication_complete_cb), seat); g_signal_connect (greeter_session, SESSION_SIGNAL_STOPPED, G_CALLBACK (session_stopped_cb), seat); @@ -1318,15 +1342,15 @@ create_greeter_session (Seat *seat) session_set_argv (SESSION (greeter_session), argv); g_strfreev (argv); - greeter_set_pam_services (greeter_session, + greeter_set_pam_services (greeter, seat_get_string_property (seat, "pam-service"), seat_get_string_property (seat, "pam-autologin-service")); - g_signal_connect (greeter_session, GREETER_SIGNAL_CREATE_SESSION, G_CALLBACK (greeter_create_session_cb), seat); - g_signal_connect (greeter_session, GREETER_SIGNAL_START_SESSION, G_CALLBACK (greeter_start_session_cb), seat); + g_signal_connect (greeter, GREETER_SIGNAL_CREATE_SESSION, G_CALLBACK (greeter_create_session_cb), seat); + g_signal_connect (greeter, GREETER_SIGNAL_START_SESSION, G_CALLBACK (greeter_start_session_cb), seat); /* Set hints to greeter */ - greeter_set_allow_guest (greeter_session, seat_get_allow_guest (seat)); - set_greeter_hints (seat, greeter_session); + greeter_set_allow_guest (greeter, seat_get_allow_guest (seat)); + set_greeter_hints (seat, greeter); /* Configure for automatic login */ autologin_username = seat_get_string_property (seat, "autologin-user"); @@ -1339,12 +1363,12 @@ create_greeter_session (Seat *seat) gchar *value; value = g_strdup_printf ("%d", autologin_timeout); - greeter_set_hint (greeter_session, "autologin-timeout", value); + greeter_set_hint (greeter, "autologin-timeout", value); g_free (value); if (autologin_username) - greeter_set_hint (greeter_session, "autologin-user", autologin_username); + greeter_set_hint (greeter, "autologin-user", autologin_username); if (autologin_guest) - greeter_set_hint (greeter_session, "autologin-guest", "true"); + greeter_set_hint (greeter, "autologin-guest", "true"); } g_object_unref (session_config); @@ -1427,7 +1451,7 @@ create_display_server (Seat *seat, Session *session) gboolean seat_switch_to_greeter (Seat *seat) { - Greeter *greeter_session; + GreeterSession *greeter_session; DisplayServer *display_server; g_return_val_if_fail (seat != NULL, FALSE); @@ -1460,7 +1484,8 @@ seat_switch_to_greeter (Seat *seat) static void switch_authentication_complete_cb (Session *session, Seat *seat) { - Greeter *greeter_session; + GreeterSession *greeter_session; + Greeter *greeter; DisplayServer *display_server; gboolean existing = FALSE; @@ -1497,7 +1522,7 @@ switch_authentication_complete_cb (Session *session, Seat *seat) if (greeter_session) { l_debug (seat, "Switching to existing greeter to authenticate session"); - set_greeter_hints (seat, greeter_session); + set_greeter_hints (seat, greeter_session_get_greeter (greeter_session)); existing = TRUE; } else @@ -1505,15 +1530,16 @@ switch_authentication_complete_cb (Session *session, Seat *seat) l_debug (seat, "Starting greeter to authenticate session"); greeter_session = create_greeter_session (seat); } + greeter = greeter_session_get_greeter (greeter_session); if (session_get_is_guest (session)) - greeter_set_hint (greeter_session, "select-guest", "true"); + greeter_set_hint (greeter, "select-guest", "true"); else - greeter_set_hint (greeter_session, "select-user", session_get_username (session)); + greeter_set_hint (greeter, "select-user", session_get_username (session)); if (existing) { - greeter_reset (greeter_session); + greeter_reset (greeter); seat_set_active_session (seat, SESSION (greeter_session)); } else @@ -1605,7 +1631,8 @@ seat_switch_to_guest (Seat *seat, const gchar *session_name) gboolean seat_lock (Seat *seat, const gchar *username) { - Greeter *greeter_session; + GreeterSession *greeter_session; + Greeter *greeter; DisplayServer *display_server = NULL; gboolean reset_existing = FALSE; gboolean reuse_xserver = FALSE; @@ -1624,7 +1651,7 @@ seat_lock (Seat *seat, const gchar *username) if (greeter_session) { l_debug (seat, "Switching to existing greeter"); - set_greeter_hints (seat, greeter_session); + set_greeter_hints (seat, greeter_session_get_greeter (greeter_session)); reset_existing = TRUE; } else @@ -1646,14 +1673,15 @@ seat_lock (Seat *seat, const gchar *username) if (!greeter_session) return FALSE; } + greeter = greeter_session_get_greeter (greeter_session); - greeter_set_hint (greeter_session, "lock-screen", "true"); + greeter_set_hint (greeter, "lock-screen", "true"); if (username) - greeter_set_hint (greeter_session, "select-user", username); + greeter_set_hint (greeter, "select-user", username); if (reset_existing) { - greeter_reset (greeter_session); + greeter_reset (greeter); seat_set_active_session (seat, SESSION (greeter_session)); return TRUE; } @@ -1760,7 +1788,7 @@ seat_real_start (Seat *seat) /* Fallback to a greeter */ if (!session) { - Greeter *greeter_session; + GreeterSession *greeter_session; DisplayServer *display_server; greeter_session = create_greeter_session (seat); @@ -1807,10 +1835,10 @@ seat_real_start (Seat *seat) return TRUE; } -static Greeter * +static GreeterSession * seat_real_create_greeter_session (Seat *seat) { - return greeter_new (); + return greeter_session_new (); } static Session * @@ -14,7 +14,7 @@ #include <glib-object.h> #include "display-server.h" -#include "greeter.h" +#include "greeter-session.h" #include "session.h" #include "process.h" #include "logger.h" @@ -47,7 +47,7 @@ typedef struct gboolean (*start)(Seat *seat); DisplayServer *(*create_display_server) (Seat *seat, Session *session); gboolean (*display_server_supports_session_type) (Seat *seat, DisplayServer *display_server, const gchar *session_type); - Greeter *(*create_greeter_session) (Seat *seat); + GreeterSession *(*create_greeter_session) (Seat *seat); Session *(*create_session) (Seat *seat); void (*set_active_session)(Seat *seat, Session *session); void (*set_next_session)(Seat *seat, Session *session); diff --git a/src/unity-system-compositor.c b/src/unity-system-compositor.c index cf426835..9991257d 100644 --- a/src/unity-system-compositor.c +++ b/src/unity-system-compositor.c @@ -21,7 +21,7 @@ #include "unity-system-compositor.h" #include "configuration.h" #include "process.h" -#include "greeter.h" +#include "greeter-session.h" #include "vt.h" struct UnitySystemCompositorPrivate @@ -178,7 +178,7 @@ unity_system_compositor_connect_session (DisplayServer *display_server, Session if (compositor->priv->socket) session_set_env (session, "MIR_SERVER_HOST_SOCKET", compositor->priv->socket); - if (IS_GREETER (session)) + if (IS_GREETER_SESSION (session)) name = "greeter-0"; else name = "session-0"; |