summaryrefslogtreecommitdiff
path: root/src/daemon.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/daemon.c')
-rw-r--r--src/daemon.c173
1 files changed, 154 insertions, 19 deletions
diff --git a/src/daemon.c b/src/daemon.c
index f6e19ac..447893b 100644
--- a/src/daemon.c
+++ b/src/daemon.c
@@ -55,6 +55,7 @@
#define PATH_PASSWD "passwd"
#define PATH_SHADOW "shadow"
#define PATH_GROUP "/etc/group"
+#define PATH_DM "/etc/systemd/system/display-manager.service"
enum
{
@@ -62,6 +63,13 @@ enum
PROP_DAEMON_VERSION
};
+typedef enum
+{
+ DISPLAY_MANAGER_TYPE_NONE = -1,
+ DISPLAY_MANAGER_TYPE_GDM,
+ DISPLAY_MANAGER_TYPE_LIGHTDM
+} DisplayManagerType;
+
typedef struct
{
GDBusConnection *bus_connection;
@@ -75,7 +83,7 @@ typedef struct
GFileMonitor *passwd_monitor;
GFileMonitor *shadow_monitor;
GFileMonitor *group_monitor;
- GFileMonitor *gdm_monitor;
+ GFileMonitor *dm_monitor;
GFileMonitor *wtmp_monitor;
GQueue *pending_list_cached_users;
@@ -161,6 +169,29 @@ error_get_type (void)
#define MAX_LOCAL_USERS 50
#endif
+/* Get current system Display Manager type */
+static DisplayManagerType
+get_current_system_dm_type (void)
+{
+ g_autofree gchar *link_target = NULL;
+ g_autofree gchar *basename = NULL;
+ GFile *file;
+
+ link_target = g_file_read_link (PATH_DM, NULL);
+ if (link_target) {
+ file = g_file_new_for_path (link_target);
+ basename = g_file_get_basename (file);
+ g_object_unref (file);
+
+ if (g_strcmp0 (basename, "lightdm.service") == 0)
+ return DISPLAY_MANAGER_TYPE_LIGHTDM;
+ else if (g_strcmp0 (basename, "gdm.service") == 0)
+ return DISPLAY_MANAGER_TYPE_GDM;
+ }
+
+ return DISPLAY_MANAGER_TYPE_NONE;
+}
+
static void
remove_cache_files (const gchar *user_name)
{
@@ -606,7 +637,7 @@ reload_autologin_timeout (Daemon *daemon)
priv->autologin_id = 0;
if (!load_autologin (daemon, &name, &enabled, &error)) {
- g_debug ("failed to load gdms custom.conf: %s", error->message);
+ g_debug ("failed to load autologin conf file: %s", error->message);
return FALSE;
}
@@ -715,11 +746,11 @@ on_users_monitor_changed (GFileMonitor *monitor,
}
static void
-on_gdm_monitor_changed (GFileMonitor *monitor,
- GFile *file,
- GFile *other_file,
- GFileMonitorEvent event_type,
- Daemon *daemon)
+on_dm_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) {
@@ -772,6 +803,8 @@ daemon_init (Daemon *daemon)
DaemonPrivate *priv = daemon_get_instance_private (daemon);
g_autofree char *shadow_path = NULL;
g_autofree char *passwd_path = NULL;
+ g_autofree char *dm_path = NULL;
+ DisplayManagerType dm_type;
priv->extension_ifaces = daemon_read_extension_ifaces ();
@@ -795,9 +828,16 @@ daemon_init (Daemon *daemon)
wtmp_helper_get_path_for_monitor (),
on_users_monitor_changed);
- priv->gdm_monitor = setup_monitor (daemon,
- PATH_GDM_CUSTOM,
- on_gdm_monitor_changed);
+ dm_type = get_current_system_dm_type ();
+ if (dm_type == DISPLAY_MANAGER_TYPE_LIGHTDM)
+ dm_path = g_strdup (PATH_LIGHTDM_CONF);
+ else if (dm_type == DISPLAY_MANAGER_TYPE_GDM)
+ dm_path = g_strdup (PATH_GDM_CUSTOM);
+
+ priv->dm_monitor = setup_monitor (daemon,
+ dm_path,
+ on_dm_monitor_changed);
+
reload_users_timeout (daemon);
queue_reload_autologin (daemon);
}
@@ -1643,11 +1683,11 @@ daemon_local_check_auth (Daemon *daemon,
g_object_unref (subject);
}
-gboolean
-load_autologin (Daemon *daemon,
- gchar **name,
- gboolean *enabled,
- GError **error)
+static gboolean
+load_autologin_gdm (Daemon *daemon,
+ gchar **name,
+ gboolean *enabled,
+ GError **error)
{
g_autoptr (GKeyFile) keyfile = NULL;
GError *local_error = NULL;
@@ -1682,10 +1722,57 @@ load_autologin (Daemon *daemon,
}
static gboolean
-save_autologin (Daemon *daemon,
- const gchar *name,
- gboolean enabled,
- GError **error)
+load_autologin_lightdm (Daemon *daemon,
+ gchar **name,
+ gboolean *enabled,
+ GError **error)
+{
+ g_autoptr (GKeyFile) keyfile = NULL;
+ GError *local_error = NULL;
+
+ keyfile = g_key_file_new ();
+ if (!g_key_file_load_from_file (keyfile,
+ PATH_LIGHTDM_CONF,
+ G_KEY_FILE_KEEP_COMMENTS,
+ error)) {
+ return FALSE;
+ }
+
+ *name = g_key_file_get_string (keyfile, "SeatDefaults", "autologin-user", &local_error);
+ if (local_error) {
+ g_propagate_error (error, local_error);
+ return FALSE;
+ }
+
+ *enabled = ((*name) && (*name)[0] != 0);
+
+ return TRUE;
+}
+
+gboolean
+load_autologin (Daemon *daemon,
+ gchar **name,
+ gboolean *enabled,
+ GError **error)
+{
+ DisplayManagerType dm_type;
+
+ dm_type = get_current_system_dm_type ();
+ if (dm_type == DISPLAY_MANAGER_TYPE_LIGHTDM)
+ return load_autologin_lightdm (daemon, name, enabled, error);
+ else if (dm_type == DISPLAY_MANAGER_TYPE_GDM)
+ return load_autologin_gdm (daemon, name, enabled, error);
+
+ g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, _ ("Unsupported Display Manager"));
+
+ return FALSE;
+}
+
+static gboolean
+save_autologin_gdm (Daemon *daemon,
+ const gchar *name,
+ gboolean enabled,
+ GError **error)
{
g_autoptr (GKeyFile) keyfile = NULL;
g_autofree gchar *data = NULL;
@@ -1713,6 +1800,54 @@ save_autologin (Daemon *daemon,
return result;
}
+static gboolean
+save_autologin_lightdm (Daemon *daemon,
+ const gchar *name,
+ gboolean enabled,
+ GError **error)
+{
+ g_autoptr (GKeyFile) keyfile = NULL;
+ g_autofree gchar *data = NULL;
+ gboolean result;
+ g_autoptr (GError) local_error = NULL;
+
+ keyfile = g_key_file_new ();
+ if (!g_key_file_load_from_file (keyfile,
+ PATH_LIGHTDM_CONF,
+ G_KEY_FILE_KEEP_COMMENTS,
+ &local_error)) {
+ /* It's OK for lightdm.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, g_steal_pointer (&local_error));
+ return FALSE;
+ }
+ }
+
+ 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 (PATH_LIGHTDM_CONF, data, -1, error);
+
+ return result;
+}
+
+static gboolean
+save_autologin (Daemon *daemon,
+ const gchar *name,
+ gboolean enabled,
+ GError **error)
+{
+ DisplayManagerType dm_type;
+
+ dm_type = get_current_system_dm_type ();
+ if (dm_type == DISPLAY_MANAGER_TYPE_LIGHTDM)
+ return save_autologin_lightdm (daemon, name, enabled, error);
+ else if (dm_type == DISPLAY_MANAGER_TYPE_GDM)
+ return save_autologin_gdm (daemon, name, enabled, error);
+
+ return FALSE;
+}
+
gboolean
daemon_local_set_automatic_login (Daemon *daemon,
User *user,