Changeset View
Changeset View
Standalone View
Standalone View
sysutils/accountsservice/files/patch-src_daemon.c
| --- src/daemon.c.orig 2018-09-26 13:20:49 UTC | --- src/daemon.c.orig 2022-01-28 20:47:34 UTC | ||||
| +++ src/daemon.c | +++ src/daemon.c | ||||
| @@ -79,7 +79,11 @@ typedef struct { | @@ -84,7 +84,11 @@ typedef struct { | ||||
| GHashTable *extension_ifaces; | GHashTable *extension_ifaces; | ||||
| } DaemonPrivate; | } DaemonPrivate; | ||||
| Context not available. | |||||
| +typedef struct passwd * (* EntryGeneratorFunc) (Daemon *, GHashTable *, gpointer *); | +typedef struct passwd * (* EntryGeneratorFunc) (Daemon *, GHashTable *, gpointer *); | ||||
| +#endif | +#endif | ||||
| static void daemon_accounts_accounts_iface_init (AccountsAccountsIface *iface); | typedef struct { | ||||
| Daemon *daemon; | |||||
| @@ -154,17 +158,25 @@ remove_cache_files (const gchar *user_name) | @@ -168,17 +172,25 @@ remove_cache_files (const gchar *user_name) | ||||
| } | } | ||||
| static struct passwd * | static struct passwd * | ||||
| Context not available. | |||||
| struct { | struct { | ||||
| FILE *fp; | FILE *fp; | ||||
| @@ -175,6 +187,7 @@ entry_generator_fgetpwent (Daemon *daemon, | @@ -189,6 +201,7 @@ entry_generator_fgetpwent (Daemon *daemon, | ||||
| if (*state == NULL) { | if (*state == NULL) { | ||||
| GHashTable *shadow_users = NULL; | GHashTable *shadow_users = NULL; | ||||
| FILE *fp; | FILE *fp; | ||||
| Context not available. | |||||
| struct spwd *shadow_entry; | struct spwd *shadow_entry; | ||||
| fp = fopen (PATH_SHADOW, "r"); | fp = fopen (PATH_SHADOW, "r"); | ||||
| @@ -208,6 +221,7 @@ entry_generator_fgetpwent (Daemon *daemon, | @@ -222,6 +235,7 @@ entry_generator_fgetpwent (Daemon *daemon, | ||||
| g_clear_pointer (&shadow_users, g_hash_table_unref); | g_clear_pointer (&shadow_users, g_hash_table_unref); | ||||
| return NULL; | return NULL; | ||||
| } | } | ||||
| Context not available. | |||||
| fp = fopen (PATH_PASSWD, "r"); | fp = fopen (PATH_PASSWD, "r"); | ||||
| if (fp == NULL) { | if (fp == NULL) { | ||||
| @@ -229,12 +243,17 @@ entry_generator_fgetpwent (Daemon *daemon, | @@ -243,6 +257,7 @@ entry_generator_fgetpwent (Daemon *daemon, | ||||
| if (g_hash_table_size (users) < MAX_LOCAL_USERS) { | if (g_hash_table_size (users) < MAX_LOCAL_USERS) { | ||||
| pwent = fgetpwent (generator_state->fp); | pwent = fgetpwent (generator_state->fp); | ||||
| if (pwent != NULL) { | if (pwent != NULL) { | ||||
| Context not available. | |||||
| shadow_entry_buffers = g_hash_table_lookup (generator_state->users, pwent->pw_name); | shadow_entry_buffers = g_hash_table_lookup (generator_state->users, pwent->pw_name); | ||||
| if (shadow_entry_buffers != NULL) { | if (shadow_entry_buffers != NULL) { | ||||
| *spent = &shadow_entry_buffers->spbuf; | @@ -255,7 +270,15 @@ entry_generator_fgetpwent (Daemon *daemon, | ||||
| return entry_generator_fgetpwent (daemon, users, state, spent); | |||||
| } | } | ||||
| return pwent; | |||||
| +#else | +#else | ||||
| + if (!generator_state->users || g_hash_table_lookup (generator_state->users, pwent->pw_name)) | + /* Skip system users... */ | ||||
| + return pwent; | + if (!user_classify_is_human (pwent->pw_uid, pwent->pw_name, pwent->pw_shell, NULL)) { | ||||
| + g_debug ("skipping user: %s", pwent->pw_name); | |||||
| + return entry_generator_fgetpwent (daemon, users, state); | |||||
| + } | |||||
| +#endif | +#endif | ||||
| + | |||||
| return pwent; | |||||
| } | } | ||||
| } | } | ||||
| @@ -270,10 +293,16 @@ entry_generator_fgetpwent (Daemon *daemon, | |||||
| @@ -248,10 +267,16 @@ entry_generator_fgetpwent (Daemon *daemon, | |||||
| } | } | ||||
| static struct passwd * | static struct passwd * | ||||
| Context not available. | |||||
| { | { | ||||
| struct passwd *pwent; | struct passwd *pwent; | ||||
| g_autoptr(GError) error = NULL; | g_autoptr(GError) error = NULL; | ||||
| @@ -293,7 +318,9 @@ entry_generator_cachedir (Daemon *daemon, | @@ -315,7 +344,9 @@ entry_generator_cachedir (Daemon *daemon, | ||||
| errno = 0; | errno = 0; | ||||
| pwent = getpwnam (name); | pwent = getpwnam (name); | ||||
| if (pwent != NULL) { | if (pwent != NULL) { | ||||
| Context not available. | |||||
| return pwent; | return pwent; | ||||
| } else if (errno == 0) { | } else if (errno == 0) { | ||||
| @@ -329,10 +356,16 @@ entry_generator_cachedir (Daemon *daemon, | @@ -345,10 +376,16 @@ entry_generator_cachedir (Daemon *daemon, | ||||
| } | } | ||||
| static struct passwd * | static struct passwd * | ||||
| Context not available. | |||||
| { | { | ||||
| DaemonPrivate *priv = daemon_get_instance_private (daemon); | DaemonPrivate *priv = daemon_get_instance_private (daemon); | ||||
| struct passwd *pwent; | struct passwd *pwent; | ||||
| @@ -360,7 +393,9 @@ entry_generator_requested_users (Daemon *daemon, | @@ -376,7 +413,9 @@ entry_generator_requested_users (Daemon *daemon, | ||||
| if (pwent == NULL) { | if (pwent == NULL) { | ||||
| g_debug ("user '%s' requested previously but not present on system", name); | g_debug ("user '%s' requested previously but not present on system", name); | ||||
| } else { | } else { | ||||
| Context not available. | |||||
| return pwent; | return pwent; | ||||
| } | } | ||||
| @@ -383,19 +418,29 @@ load_entries (Daemon *daemon, | @@ -399,14 +438,20 @@ load_entries (Daemon *daemon, | ||||
| DaemonPrivate *priv = daemon_get_instance_private (daemon); | DaemonPrivate *priv = daemon_get_instance_private (daemon); | ||||
| gpointer generator_state = NULL; | gpointer generator_state = NULL; | ||||
| struct passwd *pwent; | struct passwd *pwent; | ||||
| Context not available. | |||||
| if (pwent == NULL) | if (pwent == NULL) | ||||
| break; | break; | ||||
| /* Skip system users... */ | @@ -427,7 +472,11 @@ load_entries (Daemon *daemon, | ||||
| +#ifdef HAVE_SHADOW_H | |||||
| if (!explicitly_requested && !user_classify_is_human (pwent->pw_uid, pwent->pw_name, pwent->pw_shell, spent? spent->sp_pwdp : NULL)) { | |||||
| +#else | |||||
| + if (!explicitly_requested && !user_classify_is_human (pwent->pw_uid, pwent->pw_name, pwent->pw_shell, NULL)) { | |||||
| +#endif | |||||
| g_debug ("skipping user: %s", pwent->pw_name); | |||||
| continue; | |||||
| } | |||||
| @@ -417,7 +462,11 @@ load_entries (Daemon *daemon, | |||||
| /* freeze & update users not already in the new list */ | /* freeze & update users not already in the new list */ | ||||
| g_object_freeze_notify (G_OBJECT (user)); | g_object_freeze_notify (G_OBJECT (user)); | ||||
| Context not available. | |||||
| g_hash_table_insert (users, g_strdup (user_get_user_name (user)), user); | g_hash_table_insert (users, g_strdup (user_get_user_name (user)), user); | ||||
| g_debug ("loaded user: %s", user_get_user_name (user)); | g_debug ("loaded user: %s", user_get_user_name (user)); | ||||
| @@ -823,15 +872,24 @@ throw_error (GDBusMethodInvocation *context, | @@ -841,15 +890,24 @@ throw_error (GDBusMethodInvocation *context, | ||||
| } | } | ||||
| static User * | static User * | ||||
| Context not available. | |||||
| user_register (user); | user_register (user); | ||||
| g_hash_table_insert (priv->users, | g_hash_table_insert (priv->users, | ||||
| @@ -860,9 +918,13 @@ daemon_local_find_user_by_id (Daemon *daemon, | @@ -878,9 +936,13 @@ daemon_local_find_user_by_id (Daemon *daemon, | ||||
| user = g_hash_table_lookup (priv->users, pwent->pw_name); | user = g_hash_table_lookup (priv->users, pwent->pw_name); | ||||
| if (user == NULL) { | if (user == NULL) { | ||||
| Context not available. | |||||
| priv->explicitly_requested_users = g_list_append (priv->explicitly_requested_users, | priv->explicitly_requested_users = g_list_append (priv->explicitly_requested_users, | ||||
| g_strdup (pwent->pw_name)); | g_strdup (pwent->pw_name)); | ||||
| @@ -888,9 +950,13 @@ daemon_local_find_user_by_name (Daemon *daemon, | @@ -906,9 +968,13 @@ daemon_local_find_user_by_name (Daemon *daemon, | ||||
| user = g_hash_table_lookup (priv->users, pwent->pw_name); | user = g_hash_table_lookup (priv->users, pwent->pw_name); | ||||
| if (user == NULL) { | if (user == NULL) { | ||||
| Context not available. | |||||
| priv->explicitly_requested_users = g_list_append (priv->explicitly_requested_users, | priv->explicitly_requested_users = g_list_append (priv->explicitly_requested_users, | ||||
| g_strdup (pwent->pw_name)); | g_strdup (pwent->pw_name)); | ||||
| @@ -1095,10 +1161,12 @@ daemon_create_user_authorized_cb (Daemon | @@ -1102,10 +1168,12 @@ daemon_create_user_authorized_cb (Daemon | ||||
| sys_log (context, "create user '%s'", cd->user_name); | sys_log (context, "create user '%s'", cd->user_name); | ||||
| Context not available. | |||||
| + argv[4] = "-c"; | + argv[4] = "-c"; | ||||
| + argv[5] = cd->real_name; | + argv[5] = cd->real_name; | ||||
| if (cd->account_type == ACCOUNT_TYPE_ADMINISTRATOR) { | if (cd->account_type == ACCOUNT_TYPE_ADMINISTRATOR) { | ||||
| if (EXTRA_ADMIN_GROUPS != NULL && EXTRA_ADMIN_GROUPS[0] != '\0') | g_auto(GStrv) admin_groups_array = NULL; | ||||
| admin_groups = g_strconcat (ADMIN_GROUP, ",", | g_autoptr(GStrvBuilder) admin_groups_builder = g_strv_builder_new (); | ||||
| @@ -1106,15 +1174,11 @@ daemon_create_user_authorized_cb (Daemon | @@ -1126,15 +1194,11 @@ daemon_create_user_authorized_cb (Daemon | ||||
| else | admin_groups_array = g_strv_builder_end (admin_groups_builder); | ||||
| admin_groups = g_strdup (ADMIN_GROUP); | admin_groups = g_strjoinv (",", admin_groups_array); | ||||
| - argv[4] = "-G"; | - argv[4] = "-G"; | ||||
| - argv[5] = admin_groups; | - argv[5] = admin_groups; | ||||
| Context not available. | |||||
| argv[6] = NULL; | argv[6] = NULL; | ||||
| } | } | ||||
| else { | else { | ||||
| @@ -1281,7 +1345,7 @@ daemon_delete_user_authorized_cb (Daemon | @@ -1298,7 +1362,7 @@ daemon_delete_user_authorized_cb (Daemon | ||||
| DeleteUserData *ud = data; | DeleteUserData *ud = data; | ||||
| g_autoptr(GError) error = NULL; | g_autoptr(GError) error = NULL; | ||||
| struct passwd *pwent; | struct passwd *pwent; | ||||
| - const gchar *argv[6]; | - const gchar *argv[6]; | ||||
| + const gchar *argv[5]; | + const gchar *argv[5]; | ||||
| const gchar *homedir; | |||||
| gchar *resolved_homedir; | |||||
| User *user; | User *user; | ||||
| @@ -1335,19 +1399,16 @@ daemon_delete_user_authorized_cb (Daemon | |||||
| pwent = getpwuid (ud->uid); | } | ||||
| @@ -1307,19 +1371,16 @@ daemon_delete_user_authorized_cb (Daemon | free (resolved_homedir); | ||||
| user_set_saved (user, FALSE); | |||||
| - argv[0] = "/usr/sbin/userdel"; | - argv[0] = "/usr/sbin/userdel"; | ||||
| + argv[0] = "/usr/sbin/pw"; | + argv[0] = "/usr/sbin/pw"; | ||||
| Context not available. | |||||