diff options
author | zhuyaliang <15132211195@163.com> | 2023-01-14 18:23:39 +0800 |
---|---|---|
committer | Ray Strode <halfline@gmail.com> | 2023-02-23 18:09:24 +0000 |
commit | 68e8a5d3d57344e893becdd80a4ead48438717e8 (patch) | |
tree | d33bcf467a7a0052ef6166dc42f3cb34a9c372d4 | |
parent | 322165ea2e1c1c4715d532910ccb31b3d1e0a04e (diff) | |
download | accountsservice-68e8a5d3d57344e893becdd80a4ead48438717e8.tar.gz |
Add lightdm autologin support
-rw-r--r-- | meson.build | 7 | ||||
-rw-r--r-- | meson_options.txt | 1 | ||||
-rw-r--r-- | src/daemon.c | 173 | ||||
-rw-r--r-- | src/user-classify.c | 1 |
4 files changed, 162 insertions, 20 deletions
diff --git a/meson.build b/meson.build index 6f0fadb..67e68c9 100644 --- a/meson.build +++ b/meson.build @@ -207,6 +207,10 @@ config_h.set('MINIMUM_UID', get_option('minimum_uid')) gdm_conf_file = get_option('gdmconffile') config_h.set_quoted('PATH_GDM_CUSTOM', gdm_conf_file) +# LightDM +lightdm_conf_file = get_option('lightdmconffile') +config_h.set_quoted('PATH_LIGHTDM_CONF', lightdm_conf_file) + if get_option('elogind') logind_dep = dependency('libelogind', version: '>= 229.4') else @@ -242,5 +246,6 @@ output = '\n' + meson.project_name() + ' was configured with the following optio output += '** DocBook documentation build: ' + enable_docbook.to_string() + '\n' output += '** Administrator group: ' + admin_group + '\n' output += '** Extra administrator groups: ' + extra_admin_groups + '\n' -output += '** GDM configuration: ' + gdm_conf_file +output += '** GDM configuration: ' + gdm_conf_file + '\n' +output += '** LightDM configuration: ' + lightdm_conf_file message(output) diff --git a/meson_options.txt b/meson_options.txt index 93f384a..b34a0fa 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -1,5 +1,6 @@ option('systemdsystemunitdir', type: 'string', value: '', description: 'custom directory for systemd system units') option('gdmconffile', type: 'string', value: '/etc/gdm/custom.conf', description: 'GDM configuration file') +option('lightdmconffile', type: 'string', value: '/etc/lightdm/lightdm.conf', description: 'LightDM configuration file') option('admin_group', type: 'string', value: '', description: 'Set group for administrative accounts') option('extra_admin_groups', type: 'array', value: [], description: 'Comma-separated list of extra groups that administrator users are part of') 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, diff --git a/src/user-classify.c b/src/user-classify.c index a34df59..2a38a77 100644 --- a/src/user-classify.c +++ b/src/user-classify.c @@ -51,6 +51,7 @@ static const char *default_excludes[] = { "man", "at", "gdm", + "lightdm", "gnome-initial-setup", "git" }; |