From 473e79d52bd61c07a68811d3b5967826c8169447 Mon Sep 17 00:00:00 2001 From: Robert Ancell Date: Mon, 18 Jul 2011 17:15:58 +1000 Subject: Make generic hint fields for greeters --- configure.ac | 16 +- doc/lightdm-gobject-0-sections.txt | 13 +- doc/tmpl/greeter.sgml | 102 +++++++++-- greeters/gtk/lightdm-gtk-greeter.c | 19 ++- liblightdm-gobject/greeter.c | 322 +++++++++++++++++++++++++++-------- liblightdm-gobject/lightdm/greeter.h | 20 ++- liblightdm-qt/QLightDM/greeter.cpp | 71 +++++--- liblightdm-qt/QLightDM/greeter.h | 12 +- src/display.c | 21 ++- src/greeter.c | 96 +++++------ src/greeter.h | 8 +- src/lightdm.c | 2 +- tests/src/test-gobject-greeter.c | 6 +- 13 files changed, 497 insertions(+), 211 deletions(-) diff --git a/configure.ac b/configure.ac index f7b1ea18..1bf46196 100644 --- a/configure.ac +++ b/configure.ac @@ -121,16 +121,16 @@ dnl ########################################################################### dnl Configurable values dnl ########################################################################### -DEFAULT_SESSION=gnome -AC_ARG_WITH(default-session, - AS_HELP_STRING(--with-default-session=, - Default session to launch for users), +USER_SESSION=gnome +AC_ARG_WITH(user-session, + AS_HELP_STRING(--with-user-session=, + Session to use for user accounts), if test x$withval != x; then - DEFAULT_SESSION="$withval" + USER_SESSION="$withval" fi ) -AC_SUBST(DEFAULT_SESSION) -AC_DEFINE_UNQUOTED(DEFAULT_SESSION, "$DEFAULT_SESSION", Default session) +AC_SUBST(USER_SESSION) +AC_DEFINE_UNQUOTED(USER_SESSION, "$USER_SESSION", User session) if test $have_gtk = yes; then GREETER_SESSION=lightdm-gtk-greeter @@ -199,7 +199,7 @@ echo " prefix: $prefix Greeter session: $GREETER_SESSION - Default session: $DEFAULT_SESSION + User session: $USER_SESSION liblightdm-gobject: $compile_liblightdm_gobject GObject introspection: $found_introspection liblightdm-qt: $compile_liblightdm_qt diff --git a/doc/lightdm-gobject-0-sections.txt b/doc/lightdm-gobject-0-sections.txt index be179847..8e414be1 100644 --- a/doc/lightdm-gobject-0-sections.txt +++ b/doc/lightdm-gobject-0-sections.txt @@ -113,10 +113,15 @@ ldm_greeter_get_layouts ldm_greeter_get_layout ldm_greeter_set_layout ldm_greeter_get_sessions -ldm_greeter_get_default_session -ldm_greeter_get_has_guest_session -ldm_greeter_get_timed_login_user -ldm_greeter_get_timed_login_delay +ldm_greeter_get_default_session_hint +ldm_greeter_get_hint +ldm_greeter_get_has_guest_account_hint +ldm_greeter_get_show_users_hint +ldm_greeter_get_select_user_hint +ldm_greeter_get_select_guest_hint +ldm_greeter_get_autologin_user_hint +ldm_greeter_get_autologin_guest_hint +ldm_greeter_get_autologin_timeout_hint ldm_greeter_cancel_timed_login ldm_greeter_login ldm_greeter_login_with_user_prompt diff --git a/doc/tmpl/greeter.sgml b/doc/tmpl/greeter.sgml index 6b1e4d6b..758560d6 100644 --- a/doc/tmpl/greeter.sgml +++ b/doc/tmpl/greeter.sgml @@ -87,37 +87,35 @@ g_object_connect (G_OBJECT (greeter), "quit", G_CALLBACK (quit_cb), NULL); @ldmgreeter: the object which received the signal. - + @ldmgreeter: the object which received the signal. - + @ldmgreeter: the object which received the signal. - + @ldmgreeter: the object which received the signal. - + @ldmgreeter: the object which received the signal. -@arg1: -@Param3: - + @@ -126,13 +124,14 @@ g_object_connect (G_OBJECT (greeter), "quit", G_CALLBACK (quit_cb), NULL); @arg1: @Param3: - + @ldmgreeter: the object which received the signal. @arg1: +@Param3: @@ -163,6 +162,21 @@ g_object_connect (G_OBJECT (greeter), "quit", G_CALLBACK (quit_cb), NULL); + + + + + + + + + + + + + + + @@ -183,7 +197,12 @@ g_object_connect (G_OBJECT (greeter), "quit", G_CALLBACK (quit_cb), NULL); - + + + + + + @@ -208,17 +227,22 @@ g_object_connect (G_OBJECT (greeter), "quit", G_CALLBACK (quit_cb), NULL); - + - + - + + + + + + @@ -332,7 +356,53 @@ g_object_connect (G_OBJECT (greeter), "quit", G_CALLBACK (quit_cb), NULL); @Returns: - + + + + + +@greeter: +@Returns: + + + + + + + +@greeter: +@name: +@Returns: + + + + + + + +@greeter: +@Returns: + + + + + + + +@greeter: +@Returns: + + + + + + + +@greeter: +@Returns: + + + @@ -341,7 +411,7 @@ g_object_connect (G_OBJECT (greeter), "quit", G_CALLBACK (quit_cb), NULL); @Returns: - + @@ -350,7 +420,7 @@ g_object_connect (G_OBJECT (greeter), "quit", G_CALLBACK (quit_cb), NULL); @Returns: - + @@ -359,7 +429,7 @@ g_object_connect (G_OBJECT (greeter), "quit", G_CALLBACK (quit_cb), NULL); @Returns: - + diff --git a/greeters/gtk/lightdm-gtk-greeter.c b/greeters/gtk/lightdm-gtk-greeter.c index 481b527e..0bbe36b5 100644 --- a/greeters/gtk/lightdm-gtk-greeter.c +++ b/greeters/gtk/lightdm-gtk-greeter.c @@ -31,7 +31,7 @@ get_session () gchar *session; if (!gtk_combo_box_get_active_iter (GTK_COMBO_BOX (session_combo), &iter)) - return g_strdup (ldm_greeter_get_default_session (greeter)); + return g_strdup (ldm_greeter_get_default_session_hint (greeter)); gtk_tree_model_get (gtk_combo_box_get_model (GTK_COMBO_BOX (session_combo)), &iter, 1, &session, -1); @@ -83,7 +83,7 @@ start_authentication (const gchar *username) if (user) set_session (ldm_user_get_session (user)); else - set_session (ldm_greeter_get_default_session (greeter)); + set_session (ldm_greeter_get_default_session_hint (greeter)); ldm_greeter_login (greeter, username); } @@ -194,10 +194,13 @@ authentication_complete_cb (LdmGreeter *greeter) } static void -timed_login_cb (LdmGreeter *greeter, const gchar *username) +autologin_timer_expired_cb (LdmGreeter *greeter) { - set_session (ldm_greeter_get_default_session (greeter)); - ldm_greeter_login (greeter, ldm_greeter_get_timed_login_user (greeter)); + set_session (ldm_greeter_get_default_session_hint (greeter)); + if (ldm_greeter_get_autologin_guest_hint (greeter)) + ldm_greeter_login_as_guest (greeter); + else if (ldm_greeter_get_autologin_user_hint (greeter)) + ldm_greeter_login (greeter, ldm_greeter_get_autologin_user_hint (greeter)); } void suspend_cb (GtkWidget *widget, LdmGreeter *greeter); @@ -551,7 +554,7 @@ connected_cb (LdmGreeter *greeter) 2, pixbuf, -1); } - if (ldm_greeter_get_has_guest_session (greeter)) + if (ldm_greeter_get_has_guest_account_hint (greeter)) { gtk_list_store_append (GTK_LIST_STORE (model), &iter); gtk_list_store_set (GTK_LIST_STORE (model), &iter, @@ -585,7 +588,7 @@ connected_cb (LdmGreeter *greeter) 1, ldm_session_get_key (session), -1); } - set_session (ldm_greeter_get_default_session (greeter)); + set_session (ldm_greeter_get_default_session_hint (greeter)); gtk_window_set_default_size (GTK_WINDOW (window), screen_width, screen_height); gtk_builder_connect_signals(builder, greeter); @@ -609,7 +612,7 @@ main(int argc, char **argv) g_signal_connect (G_OBJECT (greeter), "show-prompt", G_CALLBACK (show_prompt_cb), NULL); g_signal_connect (G_OBJECT (greeter), "show-message", G_CALLBACK (show_message_cb), NULL); g_signal_connect (G_OBJECT (greeter), "authentication-complete", G_CALLBACK (authentication_complete_cb), NULL); - g_signal_connect (G_OBJECT (greeter), "timed-login", G_CALLBACK (timed_login_cb), NULL); + g_signal_connect (G_OBJECT (greeter), "autologin-timer-expired", G_CALLBACK (autologin_timer_expired_cb), NULL); g_signal_connect (G_OBJECT (greeter), "user-added", G_CALLBACK (user_added_cb), NULL); g_signal_connect (G_OBJECT (greeter), "user-changed", G_CALLBACK (user_changed_cb), NULL); g_signal_connect (G_OBJECT (greeter), "user-removed", G_CALLBACK (user_removed_cb), NULL); diff --git a/liblightdm-gobject/greeter.c b/liblightdm-gobject/greeter.c index 832ecc3b..b7e186bb 100644 --- a/liblightdm-gobject/greeter.c +++ b/liblightdm-gobject/greeter.c @@ -33,9 +33,14 @@ enum { PROP_LAYOUTS, PROP_LAYOUT, PROP_SESSIONS, - PROP_DEFAULT_SESSION, - PROP_TIMED_LOGIN_USER, - PROP_TIMED_LOGIN_DELAY, + PROP_DEFAULT_SESSION_HINT, + PROP_SHOW_USERS_HINT, + PROP_HAS_GUEST_ACCOUNT_HINT, + PROP_SELECT_USER_HINT, + PROP_SELECT_GUEST_HINT, + PROP_AUTOLOGIN_USER_HINT, + PROP_AUTOLOGIN_GUEST_HINT, + PROP_AUTOLOGIN_TIMEOUT_HINT, PROP_AUTHENTICATION_USER, PROP_IN_AUTHENTICATION, PROP_IS_AUTHENTICATED, @@ -51,7 +56,7 @@ enum { SHOW_MESSAGE, AUTHENTICATION_COMPLETE, SESSION_FAILED, - TIMED_LOGIN, + AUTOLOGIN_TIMER_EXPIRED, USER_ADDED, USER_CHANGED, USER_REMOVED, @@ -94,18 +99,16 @@ struct _LdmGreeterPrivate gboolean have_sessions; GList *sessions; - gchar *default_session; gchar *authentication_user; gboolean in_authentication; gboolean is_authenticated; guint32 authenticate_sequence_number; gboolean cancelling_authentication; + + GHashTable *hints; - gchar *selected_user; - gint login_delay; guint login_timeout; - gboolean guest_account_supported; }; G_DEFINE_TYPE (LdmGreeter, ldm_greeter, G_TYPE_OBJECT); @@ -156,7 +159,7 @@ timed_login_cb (gpointer data) LdmGreeter *greeter = data; greeter->priv->login_timeout = 0; - g_signal_emit (G_OBJECT (greeter), signals[TIMED_LOGIN], 0, greeter->priv->selected_user); + g_signal_emit (G_OBJECT (greeter), signals[AUTOLOGIN_TIMER_EXPIRED], 0); return FALSE; } @@ -259,31 +262,34 @@ static guint32 get_packet_length (LdmGreeter *greeter) } static void -handle_connected (LdmGreeter *greeter, gsize *offset) +handle_connected (LdmGreeter *greeter, guint32 length, gsize *offset) { gchar *version; + GString *hint_string; + int timeout; version = read_string (greeter, offset); - greeter->priv->default_session = read_string (greeter, offset); - greeter->priv->selected_user = read_string (greeter, offset); - greeter->priv->login_delay = read_int (greeter, offset); - greeter->priv->guest_account_supported = read_int (greeter, offset) != 0; - - g_debug ("Connected version=%s default-session=%s timed-user=%s login-delay=%d guest-account-supported=%s", - version, - greeter->priv->default_session, - greeter->priv->selected_user, greeter->priv->login_delay, - greeter->priv->guest_account_supported ? "true" : "false"); - g_free (version); + hint_string = g_string_new (""); + while (*offset < length) + { + gchar *name, *value; + + name = read_string (greeter, offset); + value = read_string (greeter, offset); + g_hash_table_insert (greeter->priv->hints, name, value); + g_string_append_printf (hint_string, " %s=%s", name, value); + } - if (greeter->priv->selected_user[0] == '\0') - greeter->priv->selected_user = NULL; + g_debug ("Connected version=%s%s", version, hint_string->str); + g_free (version); + g_string_free (hint_string, TRUE); /* Set timeout for default login */ - if (greeter->priv->selected_user && greeter->priv->login_delay > 0) + timeout = ldm_greeter_get_autologin_timeout_hint (greeter); + if (timeout) { - g_debug ("Logging in as %s in %d seconds", greeter->priv->selected_user, greeter->priv->login_delay); - greeter->priv->login_timeout = g_timeout_add (greeter->priv->login_delay * 1000, timed_login_cb, greeter); + g_debug ("Setting autologin timer for %d seconds", timeout); + greeter->priv->login_timeout = g_timeout_add (timeout * 1000, timed_login_cb, greeter); } g_signal_emit (G_OBJECT (greeter), signals[CONNECTED], 0); } @@ -431,18 +437,18 @@ from_server_cb (GIOChannel *source, GIOCondition condition, gpointer data) { LdmGreeter *greeter = data; gsize offset; - guint32 id; - + guint32 id, length; + if (!read_packet (greeter, FALSE)) return TRUE; offset = 0; id = read_int (greeter, &offset); - read_int (greeter, &offset); + length = read_int (greeter, &offset); switch (id) { case SERVER_MESSAGE_CONNECTED: - handle_connected (greeter, &offset); + handle_connected (greeter, length, &offset); break; case SERVER_MESSAGE_PROMPT_AUTHENTICATION: handle_prompt_authentication (greeter, &offset); @@ -1104,7 +1110,23 @@ ldm_greeter_get_sessions (LdmGreeter *greeter) } /** - * ldm_greeter_get_default_session: + * ldm_greeter_get_hint: + * @greeter: A #LdmGreeter + * @name: The hint name to query. + * + * Get a hint. + * + * Return value: The value for this hint or NULL if not set. + **/ +const gchar * +ldm_greeter_get_hint (LdmGreeter *greeter, const gchar *name) +{ + g_return_val_if_fail (LDM_IS_GREETER (greeter), NULL); + return g_hash_table_lookup (greeter->priv->hints, name); +} + +/** + * ldm_greeter_get_default_session_hint: * @greeter: A #LdmGreeter * * Get the default session to use. @@ -1112,14 +1134,33 @@ ldm_greeter_get_sessions (LdmGreeter *greeter) * Return value: The session name **/ const gchar * -ldm_greeter_get_default_session (LdmGreeter *greeter) +ldm_greeter_get_default_session_hint (LdmGreeter *greeter) { g_return_val_if_fail (LDM_IS_GREETER (greeter), NULL); - return greeter->priv->default_session; + return ldm_greeter_get_hint (greeter, "default-session"); +} + +/** + * ldm_greeter_get_show_users_hint: + * @greeter: A #LdmGreeter + * + * Check if user accounts should be shown. + * + * Return value: TRUE if all the user accounts should be shown. + */ +gboolean +ldm_greeter_get_show_users_hint (LdmGreeter *greeter) +{ + const gchar *value; + + g_return_val_if_fail (LDM_IS_GREETER (greeter), FALSE); + value = ldm_greeter_get_hint (greeter, "show-users"); + + return g_strcmp0 (value, "true") == 0; } /** - * ldm_greeter_get_has_guest_session: + * ldm_greeter_get_has_guest_account_hint: * @greeter: A #LdmGreeter * * Check if guest sessions are supported. @@ -1127,40 +1168,105 @@ ldm_greeter_get_default_session (LdmGreeter *greeter) * Return value: TRUE if guest sessions are supported. */ gboolean -ldm_greeter_get_has_guest_session (LdmGreeter *greeter) +ldm_greeter_get_has_guest_account_hint (LdmGreeter *greeter) { + const gchar *value; + g_return_val_if_fail (LDM_IS_GREETER (greeter), FALSE); - return greeter->priv->guest_account_supported; + value = ldm_greeter_get_hint (greeter, "has-guest-account"); + + return g_strcmp0 (value, "true") == 0; } /** - * ldm_greeter_get_timed_login_user: + * ldm_greeter_get_select_user_hint: * @greeter: A #LdmGreeter * - * Get the user to log in by as default. + * Get the user to select by default. * * Return value: A username */ const gchar * -ldm_greeter_get_timed_login_user (LdmGreeter *greeter) +ldm_greeter_get_select_user_hint (LdmGreeter *greeter) +{ + g_return_val_if_fail (LDM_IS_GREETER (greeter), NULL); + return ldm_greeter_get_hint (greeter, "select-user"); +} + +/** + * ldm_greeter_get_select_guest_hint: + * @greeter: A #LdmGreeter + * + * Check if the guest account should be selected by default. + * + * Return value: TRUE if the guest account should be selected by default. + */ +gboolean +ldm_greeter_get_select_guest_hint (LdmGreeter *greeter) +{ + const gchar *value; + + g_return_val_if_fail (LDM_IS_GREETER (greeter), FALSE); + value = ldm_greeter_get_hint (greeter, "select-guest"); + + return g_strcmp0 (value, "true") == 0; +} + +/** + * ldm_greeter_get_autologin_user_hint: + * @greeter: A #LdmGreeter + * + * Get the user account to automatically logg into when the timer expires. + * + * Return value: The user account to automatically log into. + */ +const gchar * +ldm_greeter_get_autologin_user_hint (LdmGreeter *greeter) { g_return_val_if_fail (LDM_IS_GREETER (greeter), NULL); - return greeter->priv->selected_user; + return ldm_greeter_get_hint (greeter, "autologin-user"); } /** - * ldm_greeter_get_timed_login_delay: + * ldm_greeter_get_autologin_guest_hint: * @greeter: A #LdmGreeter * - * Get the number of seconds to wait until logging in as the default user. + * Check if the guest account should be automatically logged into when the timer expires. * - * Return value: The number of seconds before logging in as the default user + * Return value: TRUE if the guest account should be automatically logged into. + */ +gboolean +ldm_greeter_get_autologin_guest_hint (LdmGreeter *greeter) +{ + const gchar *value; + + g_return_val_if_fail (LDM_IS_GREETER (greeter), FALSE); + value = ldm_greeter_get_hint (greeter, "autologin-guest"); + + return g_strcmp0 (value, "true") == 0; +} + +/** + * ldm_greeter_get_autologin_timeout_hint: + * @greeter: A #LdmGreeter + * + * Get the number of seconds to wait before automaitcally logging in. + * + * Return value: The number of seconds to wait before automatically logging in or 0 for no timeout. */ gint -ldm_greeter_get_timed_login_delay (LdmGreeter *greeter) +ldm_greeter_get_autologin_timeout_hint (LdmGreeter *greeter) { - g_return_val_if_fail (LDM_IS_GREETER (greeter), 0); - return greeter->priv->login_delay; + const gchar *value; + gint timeout; + + g_return_val_if_fail (LDM_IS_GREETER (greeter), FALSE); + value = ldm_greeter_get_hint (greeter, "autologin-timeout"); + timeout = atoi (value); + if (timeout < 0) + timeout = 0; + + return timeout; } /** @@ -1571,6 +1677,7 @@ ldm_greeter_init (LdmGreeter *greeter) { greeter->priv = G_TYPE_INSTANCE_GET_PRIVATE (greeter, LDM_TYPE_GREETER, LdmGreeterPrivate); greeter->priv->read_buffer = g_malloc (HEADER_SIZE); + greeter->priv->hints = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); g_debug ("default-language=%s", ldm_greeter_get_default_language (greeter)); } @@ -1624,14 +1731,29 @@ ldm_greeter_get_property (GObject *object, break; case PROP_SESSIONS: break; - case PROP_DEFAULT_SESSION: - g_value_set_string (value, ldm_greeter_get_default_session (self)); + case PROP_DEFAULT_SESSION_HINT: + g_value_set_string (value, ldm_greeter_get_default_session_hint (self)); + break; + case PROP_SHOW_USERS_HINT: + g_value_set_boolean (value, ldm_greeter_get_show_users_hint (self)); + break; + case PROP_HAS_GUEST_ACCOUNT_HINT: + g_value_set_boolean (value, ldm_greeter_get_has_guest_account_hint (self)); + break; + case PROP_SELECT_USER_HINT: + g_value_set_string (value, ldm_greeter_get_select_user_hint (self)); + break; + case PROP_SELECT_GUEST_HINT: + g_value_set_boolean (value, ldm_greeter_get_select_guest_hint (self)); + break; + case PROP_AUTOLOGIN_USER_HINT: + g_value_set_string (value, ldm_greeter_get_autologin_user_hint (self)); break; - case PROP_TIMED_LOGIN_USER: - g_value_set_string (value, ldm_greeter_get_timed_login_user (self)); + case PROP_AUTOLOGIN_GUEST_HINT: + g_value_set_boolean (value, ldm_greeter_get_autologin_guest_hint (self)); break; - case PROP_TIMED_LOGIN_DELAY: - g_value_set_int (value, ldm_greeter_get_timed_login_delay (self)); + case PROP_AUTOLOGIN_TIMEOUT_HINT: + g_value_set_int (value, ldm_greeter_get_autologin_timeout_hint (self)); break; case PROP_AUTHENTICATION_USER: g_value_set_string (value, ldm_greeter_get_authentication_user (self)); @@ -1696,6 +1818,16 @@ marshal_VOID__STRING_INT (GClosure *closure, data2); } +static void +ldm_greeter_finalize (GObject *object) +{ + LdmGreeter *self = LDM_GREETER (object); + + g_hash_table_unref (self->priv->hints); + + G_OBJECT_CLASS (ldm_greeter_parent_class)->finalize (object); +} + static void ldm_greeter_class_init (LdmGreeterClass *klass) { @@ -1705,6 +1837,7 @@ ldm_greeter_class_init (LdmGreeterClass *klass) object_class->set_property = ldm_greeter_set_property; object_class->get_property = ldm_greeter_get_property; + object_class->finalize = ldm_greeter_finalize; g_object_class_install_property (object_class, PROP_NUM_USERS, @@ -1750,26 +1883,69 @@ ldm_greeter_class_init (LdmGreeterClass *klass) "sessions", "Available sessions"));*/ g_object_class_install_property (object_class, - PROP_DEFAULT_SESSION, - g_param_spec_string ("default-session", - "default-session", - "Default session", + PROP_DEFAULT_SESSION_HINT, + g_param_spec_string ("default-session-hint", + "default-session-hint", + "Default session hint", NULL, G_PARAM_READWRITE)); + + g_object_class_install_property (object_class, + PROP_SHOW_USERS_HINT, + g_param_spec_boolean ("show-users-hint", + "show-users-hint", + "Show users hint", + FALSE, + G_PARAM_READABLE)); + + g_object_class_install_property (object_class, + PROP_HAS_GUEST_ACCOUNT_HINT, + g_param_spec_boolean ("has-guest-account-hint", + "has-guest-account-hint", + "Has guest account hint", + FALSE, + G_PARAM_READABLE)); + + g_object_class_install_property (object_class, + PROP_SELECT_USER_HINT, + g_param_spec_string ("select-user-hint", + "select-user-hint", + "Select user hint", + NULL, + G_PARAM_READABLE)); + g_object_class_install_property (object_class, - PROP_TIMED_LOGIN_USER, - g_param_spec_string ("timed-login-user", - "timed-login-user", - "User to login as when timed expires", + PROP_SELECT_GUEST_HINT, + g_param_spec_boolean ("select-guest-hint", + "select-guest-hint", + "Select guest account hint", + FALSE, + G_PARAM_READABLE)); + + g_object_class_install_property (object_class, + PROP_AUTOLOGIN_USER_HINT, + g_param_spec_string ("autologin-user-hint", + "autologin-user-hint", + "Autologin user hint", NULL, G_PARAM_READABLE)); + g_object_class_install_property (object_class, - PROP_TIMED_LOGIN_DELAY, - g_param_spec_int ("login-delay", - "login-delay", - "Number of seconds until logging in as default user", - G_MININT, G_MAXINT, 0, + PROP_AUTOLOGIN_GUEST_HINT, + g_param_spec_boolean ("autologin-guest-hint", + "autologin-guest-hint", + "Autologin guest account hint", + FALSE, + G_PARAM_READABLE)); + + g_object_class_install_property (object_class, + PROP_AUTOLOGIN_TIMEOUT_HINT, + g_param_spec_int ("autologin-timeout-hint", + "autologin-timeout-hint", + "Autologin timeout hint", + 0, G_MAXINT, 0, G_PARAM_READABLE)); + g_object_class_install_property (object_class, PROP_AUTHENTICATION_USER, g_param_spec_string ("authentication-user", @@ -1912,21 +2088,21 @@ ldm_greeter_class_init (LdmGreeterClass *klass) G_TYPE_NONE, 0); /** - * LdmGreeter::timed-login: + * LdmGreeter::autologin-timer-expired: * @greeter: A #LdmGreeter * @username: A username * - * The ::timed-login signal gets emitted when the default user timer - * has expired. + * The ::timed-login signal gets emitted when the automatic login timer has expired. + * The application should then call ldm_greeter_login(). **/ - signals[TIMED_LOGIN] = - g_signal_new ("timed-login", + signals[AUTOLOGIN_TIMER_EXPIRED] = + g_signal_new ("autologin-timer-expired", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (LdmGreeterClass, timed_login), + G_STRUCT_OFFSET (LdmGreeterClass, autologin_timer_expired), NULL, NULL, - g_cclosure_marshal_VOID__STRING, - G_TYPE_NONE, 1, G_TYPE_STRING); + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); /** * LdmGreeter::user-added: diff --git a/liblightdm-gobject/lightdm/greeter.h b/liblightdm-gobject/lightdm/greeter.h index b8dc4a31..1b957705 100644 --- a/liblightdm-gobject/lightdm/greeter.h +++ b/liblightdm-gobject/lightdm/greeter.h @@ -60,7 +60,7 @@ struct _LdmGreeterClass void (*show_message)(LdmGreeter *greeter, const gchar *text, LdmMessageType type); void (*authentication_complete)(LdmGreeter *greeter); void (*session_failed)(LdmGreeter *greeter); - void (*timed_login)(LdmGreeter *greeter, const gchar *username); + void (*autologin_timer_expired)(LdmGreeter *greeter); void (*user_added)(LdmGreeter *greeter, LdmUser *user); void (*user_changed)(LdmGreeter *greeter, LdmUser *user); void (*user_removed)(LdmGreeter *greeter, LdmUser *user); @@ -93,13 +93,23 @@ const gchar *ldm_greeter_get_layout (LdmGreeter *greeter); GList *ldm_greeter_get_sessions (LdmGreeter *greeter); -const gchar *ldm_greeter_get_default_session (LdmGreeter *greeter); +const gchar *ldm_greeter_get_hint (LdmGreeter *greeter, const gchar *name); -gboolean ldm_greeter_get_has_guest_session (LdmGreeter *greeter); +const gchar *ldm_greeter_get_default_session_hint (LdmGreeter *greeter); -const gchar *ldm_greeter_get_timed_login_user (LdmGreeter *greeter); +gboolean ldm_greeter_get_show_users_hint (LdmGreeter *greeter); -gint ldm_greeter_get_timed_login_delay (LdmGreeter *greeter); +gboolean ldm_greeter_get_has_guest_account_hint (LdmGreeter *greeter); + +const gchar *ldm_greeter_get_select_user_hint (LdmGreeter *greeter); + +gboolean ldm_greeter_get_select_guest_hint (LdmGreeter *greeter); + +const gchar *ldm_greeter_get_autologin_user_hint (LdmGreeter *greeter); + +gboolean ldm_greeter_get_autologin_guest_hint (LdmGreeter *greeter); + +gint ldm_greeter_get_autologin_timeout_hint (LdmGreeter *greeter); void ldm_greeter_cancel_timed_login (LdmGreeter *greeter); diff --git a/liblightdm-qt/QLightDM/greeter.cpp b/liblightdm-qt/QLightDM/greeter.cpp index bb1ee267..a51e9bfb 100644 --- a/liblightdm-qt/QLightDM/greeter.cpp +++ b/liblightdm-qt/QLightDM/greeter.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -58,16 +59,13 @@ using namespace QLightDM; class GreeterPrivate { public: - QString defaultSession; - QString timedUser; - int loginDelay; - bool guestAccountSupported; - SessionsModel *sessionsModel; QDBusInterface* lightdmInterface; QDBusInterface* powerManagementInterface; QDBusInterface* consoleKitInterface; + + QHash hints; int toServerFd; int fromServerFd; @@ -319,25 +317,26 @@ void Greeter::onRead(int fd) int offset = 0; int id = readInt(&offset); - readInt(&offset); + int length = readInt(&offset); int nMessages, sequenceNumber, returnCode; QString version, username; + QString hintString = ""; switch(id) { case SERVER_MESSAGE_CONNECTED: version = readString(&offset); - d->defaultSession = readString(&offset); - d->timedUser = readString(&offset); - d->loginDelay = readInt(&offset); - d->guestAccountSupported = readInt(&offset) != 0; - qDebug() << "Connected version=" << version << " default-session=" << d->defaultSession << " timed-user=" << d->timedUser << " login-delay" << d->loginDelay << " guestAccountSupported" << d->guestAccountSupported; - - /* Set timeout for default login */ - if(d->timedUser != "" && d->loginDelay > 0) + while (offset < length) { - qDebug() << "Logging in as " << d->timedUser << " in " << d->loginDelay << " seconds"; - //FIXME: d->login_timeout = g_timeout_add (d->login_delay * 1000, timed_login_cb, greeter); + QString name = readString(&offset); + QString value = readString(&offset); + hintString.append (" "); + hintString.append (name); + hintString.append ("="); + hintString.append (value); } + + qDebug() << "Connected version=" << version << hintString; + emit connected(); break; case SERVER_MESSAGE_QUIT: @@ -413,29 +412,49 @@ QString Greeter::defaultLanguage() const return getenv("LANG"); } -QString Greeter::defaultSession() const +QString Greeter::getHint(QString name) const +{ + return d->hints.value (name); +} + +QString Greeter::defaultSessionHint() const +{ + return getHint ("default-session"); +} + +bool Greeter::showUsersHint() const +{ + return d->hints.value ("show-users", "false") == "true"; +} + +bool Greeter::hasGuestAccountHint() const +{ + return d->hints.value ("has-guest-account", "false") == "true"; +} + +QString Greeter::selectUserHint() const { - return d->defaultSession; + return getHint ("select-user"); } -bool Greeter::guestAccountSupported() const +bool Greeter::selectGuestHint() const { - return d->guestAccountSupported; + return d->hints.value ("select-guest", "false") == "true"; } -QString Greeter::timedLoginUser() const +QString Greeter::autologinUserHint() const { - return d->timedUser; + return getHint ("autologin-user"); } -int Greeter::timedLoginDelay() const +bool Greeter::autologinGuestHint() const { - return d->loginDelay; + return d->hints.value ("autologin-guest", "false") == "true"; } -void Greeter::cancelTimedLogin() +int Greeter::autologinTimeoutHint() const { - //FIXME TODO + return d->hints.value ("autologin-timeout", "0").toInt (); } bool Greeter::canSuspend() const diff --git a/liblightdm-qt/QLightDM/greeter.h b/liblightdm-qt/QLightDM/greeter.h index 1e2056a4..36ec1050 100644 --- a/liblightdm-qt/QLightDM/greeter.h +++ b/liblightdm-qt/QLightDM/greeter.h @@ -50,8 +50,15 @@ namespace QLightDM //QList layouts() const; QString layout() const; - QString defaultSession() const; - bool guestAccountSupported() const; + QString getHint(QString name) const; + QString defaultSessionHint() const; + bool showUsersHint() const; + bool hasGuestAccountHint() const; + QString selectUserHint() const; + bool selectGuestHint() const; + QString autologinUserHint() const; + bool autologinGuestHint() const; + int autologinTimeoutHint() const; bool inAuthentication() const; bool isAuthenticated() const; @@ -69,7 +76,6 @@ namespace QLightDM void restart(); void connectToServer(); - void cancelTimedLogin(); void login(const QString &username); void loginAsGuest(); void respond(const QString &response); diff --git a/src/display.c b/src/display.c index 5d53cf08..2dde4d30 100644 --- a/src/display.c +++ b/src/display.c @@ -465,6 +465,8 @@ create_session (Display *display, PAMSession *pam_session, const gchar *session_ { child_process_set_env (CHILD_PROCESS (session), "DBUS_SESSION_BUS_ADDRESS", g_getenv ("DBUS_SESSION_BUS_ADDRESS")); child_process_set_env (CHILD_PROCESS (session), "LDM_BUS", "SESSION"); + child_process_set_env (CHILD_PROCESS (session), "LD_LIBRARY_PATH", g_getenv ("LD_LIBRARY_PATH")); + child_process_set_env (CHILD_PROCESS (session), "PATH", g_getenv ("PATH")); } /* Variables required for regression tests */ @@ -657,11 +659,22 @@ start_greeter_session (Display *display) display->priv->greeter = greeter_new (session); g_signal_connect (G_OBJECT (display->priv->greeter), "start-session", G_CALLBACK (greeter_start_session_cb), display); - if (display->priv->default_user) - greeter_set_selected_user (display->priv->greeter, display->priv->default_user, display->priv->default_user_timeout); + if (display->priv->default_user_timeout) + { + gchar *value = g_strdup_printf ("%d", display->priv->default_user_timeout); + greeter_set_hint (display->priv->greeter, "autologin-timeout", value); + g_free (value); + if (display->priv->default_user) + greeter_set_hint (display->priv->greeter, "autologin-user", display->priv->default_user); + else if (display->priv->default_user_is_guest) + greeter_set_hint (display->priv->greeter, "autologin-guest", "true"); + } + else if (display->priv->default_user) + greeter_set_hint (display->priv->greeter, "select-user", display->priv->default_user); else if (display->priv->default_user_is_guest) - greeter_set_selected_user (display->priv->greeter, guest_account_get_username (), 0); - greeter_set_default_session (display->priv->greeter, display->priv->default_session); + greeter_set_hint (display->priv->greeter, "select-guest", "true"); + greeter_set_hint (display->priv->greeter, "default-session", display->priv->default_session); + greeter_set_hint (display->priv->greeter, "has-guest-account", guest_account_get_is_enabled () ? "true" : "false"); result = greeter_start (display->priv->greeter); if (result) diff --git a/src/greeter.c b/src/greeter.c index 1a5e5273..7a337cca 100644 --- a/src/greeter.c +++ b/src/greeter.c @@ -34,15 +34,12 @@ struct GreeterPrivate guint8 *read_buffer; gsize n_read; + /* Hints for the greeter */ + GHashTable *hints; + /* Default session to use */ gchar *default_session; - /* Hint for user to select */ - gchar *selected_user; - - /* Time in seconds to wait until logging in as default user */ - gint autologin_timeout; - /* Sequence number of current PAM session */ guint32 authentication_sequence_number; @@ -52,6 +49,7 @@ struct GreeterPrivate /* TRUE if logging into guest session */ gboolean using_guest_account; + /* Communication channels to communicate with */ GIOChannel *to_greeter_channel; GIOChannel *from_greeter_channel; }; @@ -90,36 +88,9 @@ greeter_new (Session *session) } void -greeter_set_selected_user (Greeter *greeter, const gchar *username, gint timeout) +greeter_set_hint (Greeter *greeter, const gchar *name, const gchar *value) { - g_return_if_fail (greeter != NULL); - - g_free (greeter->priv->selected_user); - greeter->priv->selected_user = g_strdup (username); - greeter->priv->autologin_timeout = timeout; -} - -void -greeter_set_default_session (Greeter *greeter, const gchar *session) -{ - g_return_if_fail (greeter != NULL); - - g_free (greeter->priv->default_session); - greeter->priv->default_session = g_strdup (session); -} - -const gchar * -greeter_get_default_session (Greeter *greeter) -{ - g_return_val_if_fail (greeter != NULL, NULL); - return greeter->priv->default_session; -} - -PAMSession * -greeter_get_pam_session (Greeter *greeter) -{ - g_return_val_if_fail (greeter != NULL, NULL); - return greeter->priv->pam_session; + g_hash_table_insert (greeter->priv->hints, g_strdup (name), g_strdup (value)); } static guint32 @@ -195,15 +166,25 @@ handle_connect (Greeter *greeter, const gchar *version) { guint8 message[MAX_MESSAGE_LENGTH]; gsize offset = 0; + guint32 length; + GHashTableIter iter; + gpointer key, value; g_debug ("Greeter connected version=%s", version); - write_header (message, MAX_MESSAGE_LENGTH, SERVER_MESSAGE_CONNECTED, string_length (VERSION) + string_length (greeter->priv->default_session) + string_length (greeter->priv->selected_user) + int_length () + int_length (), &offset); + length = string_length (VERSION); + 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); + + write_header (message, MAX_MESSAGE_LENGTH, SERVER_MESSAGE_CONNECTED, length, &offset); write_string (message, MAX_MESSAGE_LENGTH, VERSION, &offset); - write_string (message, MAX_MESSAGE_LENGTH, greeter->priv->default_session, &offset); - write_string (message, MAX_MESSAGE_LENGTH, greeter->priv->selected_user, &offset); - write_int (message, MAX_MESSAGE_LENGTH, greeter->priv->autologin_timeout, &offset); - write_int (message, MAX_MESSAGE_LENGTH, guest_account_get_is_enabled (), &offset); + g_hash_table_iter_init (&iter, greeter->priv->hints); + while (g_hash_table_iter_next (&iter, &key, &value)) + { + write_string (message, MAX_MESSAGE_LENGTH, key, &offset); + write_string (message, MAX_MESSAGE_LENGTH, value, &offset); + } write_message (greeter, message, offset); } @@ -380,18 +361,6 @@ handle_cancel_authentication (Greeter *greeter) pam_session_cancel (greeter->priv->pam_session); } -void -greeter_quit (Greeter *greeter) -{ - guint8 message[MAX_MESSAGE_LENGTH]; - gsize offset = 0; - - g_return_if_fail (greeter != NULL); - - write_header (message, MAX_MESSAGE_LENGTH, SERVER_MESSAGE_QUIT, 0, &offset); - write_message (greeter, message, offset); -} - static void handle_start_session (Greeter *greeter, gchar *session) { @@ -587,11 +556,31 @@ greeter_start (Greeter *greeter) return TRUE; } +PAMSession * +greeter_get_pam_session (Greeter *greeter) +{ + g_return_val_if_fail (greeter != NULL, NULL); + return greeter->priv->pam_session; +} + +void +greeter_quit (Greeter *greeter) +{ + guint8 message[MAX_MESSAGE_LENGTH]; + gsize offset = 0; + + g_return_if_fail (greeter != NULL); + + write_header (message, MAX_MESSAGE_LENGTH, SERVER_MESSAGE_QUIT, 0, &offset); + write_message (greeter, message, offset); +} + static void greeter_init (Greeter *greeter) { greeter->priv = G_TYPE_INSTANCE_GET_PRIVATE (greeter, GREETER_TYPE, GreeterPrivate); greeter->priv->read_buffer = g_malloc (HEADER_SIZE); + greeter->priv->hints = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free); } static void @@ -602,9 +591,8 @@ greeter_finalize (GObject *object) self = GREETER (object); g_object_unref (self->priv->session); + g_hash_table_unref (self->priv->hints); g_free (self->priv->read_buffer); - g_free (self->priv->default_session); - g_free (self->priv->selected_user); if (self->priv->to_greeter_channel) g_io_channel_unref (self->priv->to_greeter_channel); if (self->priv->from_greeter_channel) diff --git a/src/greeter.h b/src/greeter.h index 6bc2d3a9..f1a48ae4 100644 --- a/src/greeter.h +++ b/src/greeter.h @@ -38,16 +38,12 @@ GType greeter_get_type (void); Greeter *greeter_new (Session *session); -void greeter_set_selected_user (Greeter *greeter, const gchar *username, gint timeout); +void greeter_set_hint (Greeter *greeter, const gchar *name, const gchar *value); -void greeter_set_default_session (Greeter *greeter, const gchar *session); - -const gchar *greeter_get_default_session (Greeter *greeter); +gboolean greeter_start (Greeter *greeter); PAMSession *greeter_get_pam_session (Greeter *greeter); -gboolean greeter_start (Greeter *greeter); - void greeter_quit (Greeter *greeter); G_END_DECLS diff --git a/src/lightdm.c b/src/lightdm.c index ccc4ab5d..7f411d9b 100644 --- a/src/lightdm.c +++ b/src/lightdm.c @@ -428,7 +428,7 @@ main (int argc, char **argv) gchar *xsessions_dir = g_strdup (XSESSIONS_DIR); gchar *run_dir = g_strdup (RUN_DIR); gchar *cache_dir = g_strdup (CACHE_DIR); - gchar *user_session = g_strdup (user_session); + gchar *user_session = g_strdup (USER_SESSION); gchar *minimum_display_number = NULL; gboolean show_version = FALSE; GOptionEntry options[] = diff --git a/tests/src/test-gobject-greeter.c b/tests/src/test-gobject-greeter.c index dd003d3d..73124e51 100644 --- a/tests/src/test-gobject-greeter.c +++ b/tests/src/test-gobject-greeter.c @@ -26,10 +26,10 @@ connected_cb (LdmGreeter *greeter) } /* Automatically log in as requested user */ - if (ldm_greeter_get_timed_login_user (greeter) && ldm_greeter_get_timed_login_delay (greeter) == 0) + if (ldm_greeter_get_select_user_hint (greeter)) { - notify_status ("GREETER LOGIN-SELECTED USERNAME=%s", ldm_greeter_get_timed_login_user (greeter)); - ldm_greeter_login (greeter, ldm_greeter_get_timed_login_user (greeter)); + notify_status ("GREETER LOGIN-SELECTED USERNAME=%s", ldm_greeter_get_select_user_hint (greeter)); + ldm_greeter_login (greeter, ldm_greeter_get_select_user_hint (greeter)); return; } -- cgit v1.2.1