Index: accountsservice-0.6.13/src/daemon.c =================================================================== --- accountsservice-0.6.13.orig/src/daemon.c 2011-08-10 11:12:56.876468024 -0400 +++ accountsservice-0.6.13/src/daemon.c 2011-08-11 12:19:21.070627049 -0400 @@ -1192,10 +1192,10 @@ } gboolean -load_autologin (Daemon *daemon, - gchar **name, - gboolean *enabled, - GError **error) +load_autologin_gdm (Daemon *daemon, + gchar **name, + gboolean *enabled, + GError **error) { GKeyFile *keyfile; const gchar *filename; @@ -1241,16 +1241,72 @@ return TRUE; } -static gboolean -save_autologin (Daemon *daemon, - const gchar *name, - gboolean enabled, +gboolean +load_autologin_lightdm (Daemon *daemon, + gchar **name, + gboolean *enabled, + GError **error) +{ + GKeyFile *keyfile; + const gchar *filename; + + filename = "/etc/lightdm/lightdm.conf"; + + keyfile = g_key_file_new (); + if (!g_key_file_load_from_file (keyfile, + filename, + G_KEY_FILE_KEEP_COMMENTS, + error)) { + g_key_file_free (keyfile); + return FALSE; + } + + *name = g_key_file_get_string (keyfile, "daemon", "autologin-user", error); + *enabled = (error == NULL && (*name) && (*name)[0] != 0); + + g_key_file_free (keyfile); + + return (error == NULL); +} + +gboolean +load_autologin (Daemon *daemon, + gchar **name, + gboolean *enabled, GError **error) { + DBusGProxy *proxy; + + /* First, determine whether we should load GDM or LightDM values by + checking if GDM is running. */ + proxy = dbus_g_proxy_new_for_name_owner (daemon->priv->bus_connection, + "org.gnome.DisplayManager", + "/org/gnome/DisplayManager/Manager", + "org.gnome.DisplayManager.Manager", + NULL); + + if (proxy != NULL) { + g_object_unref (proxy); + return load_autologin_gdm (daemon, name, enabled, error); + } else { + return load_autologin_lightdm (daemon, name, enabled, error); + } +} + +static gboolean +save_autologin_gdm (Daemon *daemon, + const gchar *name, + gboolean enabled, + GError **error) +{ GKeyFile *keyfile; const gchar *filename; gchar *data; gboolean result; + GError *local_error = NULL; + + if (!g_file_test ("/etc/gdm", G_FILE_TEST_EXISTS)) + return TRUE; /* not an error, just not installed */ filename = "/etc/gdm/custom.conf"; @@ -1258,9 +1314,14 @@ if (!g_key_file_load_from_file (keyfile, filename, G_KEY_FILE_KEEP_COMMENTS, - error)) { - g_key_file_free (keyfile); - return FALSE; + &local_error)) { + /* It's OK for custom.conf to not exist, we will make it */ + if (!g_error_matches (local_error, G_FILE_ERROR, G_FILE_ERROR_NOENT)) { + g_propagate_error (error, local_error); + g_key_file_free (keyfile); + return FALSE; + } + g_error_free (local_error); } g_key_file_set_string (keyfile, "daemon", "AutomaticLoginEnable", enabled ? "True" : "False"); @@ -1275,6 +1336,61 @@ return result; } +static gboolean +save_autologin_lightdm (Daemon *daemon, + const gchar *name, + gboolean enabled, + GError **error) +{ + GKeyFile *keyfile; + const gchar *filename; + gchar *data; + gboolean result; + GError *local_error = NULL; + + if (!g_file_test ("/etc/lightdm", G_FILE_TEST_EXISTS)) + return TRUE; /* not an error, just not installed */ + + filename = "/etc/lightdm/lightdm.conf"; + + keyfile = g_key_file_new (); + if (!g_key_file_load_from_file (keyfile, + filename, + G_KEY_FILE_KEEP_COMMENTS, + &local_error)) { + /* It's OK for custom.conf to not exist, we will make it */ + if (!g_error_matches (local_error, G_FILE_ERROR, G_FILE_ERROR_NOENT)) { + g_propagate_error (error, local_error); + g_key_file_free (keyfile); + return FALSE; + } + g_error_free (local_error); + } + + g_key_file_set_string (keyfile, "SeatDefaults", "autologin-user", enabled ? name : ""); + + data = g_key_file_to_data (keyfile, NULL, NULL); + result = g_file_set_contents (filename, data, -1, error); + + g_key_file_free (keyfile); + g_free (data); + + return result; +} + +static gboolean +save_autologin (Daemon *daemon, + const gchar *name, + gboolean enabled, + GError **error) +{ + if (!save_autologin_gdm (daemon, name, enabled, error)) + return FALSE; + if (!save_autologin_lightdm (daemon, name, enabled, error)) + return FALSE; + return TRUE; +} + gboolean daemon_local_set_automatic_login (Daemon *daemon, User *user,