diff options
author | Ray Strode <rstrode@redhat.com> | 2013-05-20 14:48:00 -0400 |
---|---|---|
committer | Ray Strode <rstrode@redhat.com> | 2013-05-20 19:49:12 -0400 |
commit | 69632f1e2f2c7e424c182b70eaa8febcbcce849b (patch) | |
tree | f7cc5eed3b0ad90d521df264a568d364b547d73d | |
parent | 142713252e31676f9eabfcbb3ce1a95ec3f52170 (diff) | |
download | accountsservice-69632f1e2f2c7e424c182b70eaa8febcbcce849b.tar.gz |
lib: notice when account changes from system acount to normal account
We currently don't show system users (e.g. 'mysql') in the
control-center user list. Occasionally a system user gets promoted to
a normal user account. When that happens, we fail to notice.
This commit fixes that.
https://bugs.freedesktop.org/show_bug.cgi?id=64769
-rw-r--r-- | src/libaccountsservice/act-user-manager.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/src/libaccountsservice/act-user-manager.c b/src/libaccountsservice/act-user-manager.c index b9512c9..bf2bd76 100644 --- a/src/libaccountsservice/act-user-manager.c +++ b/src/libaccountsservice/act-user-manager.c @@ -241,6 +241,8 @@ static void give_up (ActUserManager *manager, static void fetch_user_incrementally (ActUserManagerFetchUserRequest *request); static void maybe_set_is_loaded (ActUserManager *manager); +static void update_user (ActUserManager *manager, + ActUser *user); static gpointer user_manager_object = NULL; G_DEFINE_TYPE (ActUserManager, act_user_manager, G_TYPE_OBJECT) @@ -634,6 +636,8 @@ on_user_changed (ActUser *user, describe_user (user)); g_signal_emit (manager, signals[USER_CHANGED], 0, user); + + update_user (manager, user); } } @@ -869,6 +873,40 @@ remove_user (ActUserManager *manager, g_object_unref (user); } +static void +update_user (ActUserManager *manager, + ActUser *user) +{ + const char *username; + + username = act_user_get_user_name (user); + if (g_hash_table_lookup (manager->priv->system_users_by_name, username) != NULL) { + if (!act_user_is_system_account (user)) { + g_hash_table_insert (manager->priv->normal_users_by_name, + g_strdup (act_user_get_user_name (user)), + g_object_ref (user)); + g_hash_table_remove (manager->priv->system_users_by_name, username); + g_signal_emit (manager, signals[USER_ADDED], 0, user); + + if (g_hash_table_size (manager->priv->normal_users_by_name) > 1) { + set_has_multiple_users (manager, TRUE); + } + } + } else { + if (act_user_is_system_account (user)) { + g_hash_table_insert (manager->priv->system_users_by_name, + g_strdup (act_user_get_user_name (user)), + g_object_ref (user)); + g_hash_table_remove (manager->priv->normal_users_by_name, username); + g_signal_emit (manager, signals[USER_REMOVED], 0, user); + + if (g_hash_table_size (manager->priv->normal_users_by_name) <= 1) { + set_has_multiple_users (manager, FALSE); + } + } + } +} + static ActUser * lookup_user_by_name (ActUserManager *manager, const char *username) |