summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRay Strode <rstrode@redhat.com>2013-05-20 14:48:00 -0400
committerRay Strode <rstrode@redhat.com>2013-05-20 19:49:12 -0400
commit69632f1e2f2c7e424c182b70eaa8febcbcce849b (patch)
treef7cc5eed3b0ad90d521df264a568d364b547d73d
parent142713252e31676f9eabfcbb3ce1a95ec3f52170 (diff)
downloadaccountsservice-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.c38
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)