From 2da45b348ebc6a03ee3a1be8e8b9ebc372b9fb0a Mon Sep 17 00:00:00 2001 From: Vincent Untz Date: Thu, 21 Jul 2011 08:20:08 +0200 Subject: [PATCH] daemon: Monitor /etc/gdm/custom.conf for changes in autologin config We also emit relevant signals when loading the file. https://bugs.freedesktop.org/show_bug.cgi?id=39413 --- src/daemon.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++----------- 1 files changed, 51 insertions(+), 13 deletions(-) diff --git a/src/daemon.c b/src/daemon.c index ec319a9..dccd6a8 100644 --- a/src/daemon.c +++ b/src/daemon.c @@ -50,6 +50,7 @@ #define PATH_PASSWD "/etc/passwd" #define PATH_SHADOW "/etc/shadow" #define PATH_LOGIN_DEFS "/etc/login.defs" +#define PATH_GDM_CUSTOM "/etc/gdm/custom.conf" #ifndef FALLBACK_MINIMAL_UID #define FALLBACK_MINIMAL_UID 500 @@ -106,6 +107,7 @@ struct DaemonPrivate { GFileMonitor *passwd_monitor; GFileMonitor *shadow_monitor; + GFileMonitor *gdm_monitor; guint reload_id; guint autologin_id; @@ -450,7 +452,7 @@ reload_autologin_timeout (Daemon *daemon) gboolean enabled; gchar *name = NULL; GError *error = NULL; - User *user; + User *user = NULL; daemon->priv->autologin_id = 0; @@ -462,11 +464,23 @@ reload_autologin_timeout (Daemon *daemon) return FALSE; } + if (enabled && name) + user = daemon_local_find_user_by_name (daemon, name); + + if (daemon->priv->autologin != NULL && daemon->priv->autologin != user) { + g_object_set (daemon->priv->autologin, "automatic-login", FALSE, NULL); + g_signal_emit_by_name (daemon->priv->autologin, "changed", 0); + g_object_unref (daemon->priv->autologin); + daemon->priv->autologin = NULL; + } + if (enabled) { g_debug ("automatic login is enabled for '%s'\n", name); - user = daemon_local_find_user_by_name (daemon, name); - g_object_set (user, "automatic-login", TRUE, NULL); - daemon->priv->autologin = g_object_ref (user); + if (daemon->priv->autologin != user) { + g_object_set (user, "automatic-login", TRUE, NULL); + daemon->priv->autologin = g_object_ref (user); + g_signal_emit_by_name (daemon->priv->autologin, "changed", 0); + } } else { g_debug ("automatic login is disabled\n"); @@ -512,6 +526,21 @@ on_passwd_monitor_changed (GFileMonitor *monitor, reload_users (daemon); } +static void +on_gdm_monitor_changed (GFileMonitor *monitor, + GFile *file, + GFile *other_file, + GFileMonitorEvent event_type, + Daemon *daemon) +{ + if (event_type != G_FILE_MONITOR_EVENT_CHANGED && + event_type != G_FILE_MONITOR_EVENT_CREATED) { + return; + } + + queue_reload_autologin (daemon); +} + static uid_t get_minimal_uid (void) { @@ -602,6 +631,12 @@ daemon_init (Daemon *daemon) NULL, &error); g_object_unref (file); + file = g_file_new_for_path (PATH_GDM_CUSTOM); + daemon->priv->gdm_monitor = g_file_monitor_file (file, + G_FILE_MONITOR_NONE, + NULL, + &error); + g_object_unref (file); if (daemon->priv->passwd_monitor != NULL) { g_signal_connect (daemon->priv->passwd_monitor, @@ -621,6 +656,15 @@ daemon_init (Daemon *daemon) g_warning ("Unable to monitor %s: %s", PATH_SHADOW, error->message); g_error_free (error); } + if (daemon->priv->gdm_monitor != NULL) { + g_signal_connect (daemon->priv->gdm_monitor, + "changed", + G_CALLBACK (on_gdm_monitor_changed), + daemon); + } else { + g_warning ("Unable to monitor %s: %s", PATH_GDM_CUSTOM, error->message); + g_error_free (error); + } queue_reload_users (daemon); queue_reload_autologin (daemon); @@ -1207,15 +1251,12 @@ load_autologin (Daemon *daemon, GError **error) { GKeyFile *keyfile; - const gchar *filename; GError *local_error; gchar *string; - filename = "/etc/gdm/custom.conf"; - keyfile = g_key_file_new (); if (!g_key_file_load_from_file (keyfile, - filename, + PATH_GDM_CUSTOM, G_KEY_FILE_KEEP_COMMENTS, error)) { g_key_file_free (keyfile); @@ -1257,15 +1298,12 @@ save_autologin (Daemon *daemon, GError **error) { GKeyFile *keyfile; - const gchar *filename; gchar *data; gboolean result; - filename = "/etc/gdm/custom.conf"; - keyfile = g_key_file_new (); if (!g_key_file_load_from_file (keyfile, - filename, + PATH_GDM_CUSTOM, G_KEY_FILE_KEEP_COMMENTS, error)) { g_key_file_free (keyfile); @@ -1276,7 +1314,7 @@ save_autologin (Daemon *daemon, g_key_file_set_string (keyfile, "daemon", "AutomaticLogin", name); data = g_key_file_to_data (keyfile, NULL, NULL); - result = g_file_set_contents (filename, data, -1, error); + result = g_file_set_contents (PATH_GDM_CUSTOM, data, -1, error); g_key_file_free (keyfile); g_free (data); -- 1.7.6