summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzhuyaliang <15132211195@163.com>2023-01-14 18:23:39 +0800
committerRay Strode <halfline@gmail.com>2023-02-23 18:09:24 +0000
commit68e8a5d3d57344e893becdd80a4ead48438717e8 (patch)
treed33bcf467a7a0052ef6166dc42f3cb34a9c372d4
parent322165ea2e1c1c4715d532910ccb31b3d1e0a04e (diff)
downloadaccountsservice-68e8a5d3d57344e893becdd80a4ead48438717e8.tar.gz
Add lightdm autologin support
-rw-r--r--meson.build7
-rw-r--r--meson_options.txt1
-rw-r--r--src/daemon.c173
-rw-r--r--src/user-classify.c1
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"
};