summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Ancell <robert.ancell@canonical.com>2016-06-21 12:39:34 +1200
committerRobert Ancell <robert.ancell@canonical.com>2016-06-21 12:39:34 +1200
commit1e3d3494090e0a140d5088a9adcc78974efdea70 (patch)
tree35bf73458c7fe9121e39de3c42e3ad42b15ea83e
parent480156bacc31d2d1ed202ee7110197c4127aa508 (diff)
downloadlightdm-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.ac20
-rw-r--r--po/lightdm.pot24
-rw-r--r--src/Makefile.am2
-rw-r--r--src/greeter-session.c108
-rw-r--r--src/greeter-session.h47
-rw-r--r--src/greeter.c190
-rw-r--r--src/greeter.h11
-rw-r--r--src/lightdm.c4
-rw-r--r--src/seat-unity.c4
-rw-r--r--src/seat-xlocal.c6
-rw-r--r--src/seat-xremote.c4
-rw-r--r--src/seat.c170
-rw-r--r--src/seat.h4
-rw-r--r--src/unity-system-compositor.c4
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));
diff --git a/src/seat.c b/src/seat.c
index 1a7a9da1..b983c48d 100644
--- a/src/seat.c
+++ b/src/seat.c
@@ -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 *
diff --git a/src/seat.h b/src/seat.h
index e8d2bc6f..308b6891 100644
--- a/src/seat.h
+++ b/src/seat.h
@@ -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";