static void user_changed (ActUserManager *um, ActUser *user, Accounts *accounts) { Account *acc = g_hash_table_lookup (accounts->act_user_to_account, user); if (acc) account_update (acc, user); }
static void user_removed (ActUserManager *um, ActUser *user, Accounts *accounts) { GDBusObjectManagerServer *object_manager_server = daemon_get_object_manager (daemon_get ()); Account *acc = g_hash_table_lookup (accounts->act_user_to_account, user); if (acc) { account_update (acc, NULL); g_dbus_object_manager_server_unexport (object_manager_server, g_dbus_object_get_object_path (g_dbus_interface_get_object (G_DBUS_INTERFACE (acc)))); g_hash_table_remove (accounts->act_user_to_account, user); } }
static void user_added (ActUserManager *um, ActUser *user, Accounts *accounts) { if (act_user_is_system_account (user)) return; GDBusObjectManagerServer *object_manager_server = daemon_get_object_manager (daemon_get ()); CockpitAccount *acc = account_new (); account_update (ACCOUNT (acc), user); gs_free gchar *path = utils_generate_object_path ("/com/redhat/Cockpit/Accounts", cockpit_account_get_user_name (acc)); gs_unref_object CockpitObjectSkeleton *obj = cockpit_object_skeleton_new (path); cockpit_object_skeleton_set_account (obj, acc); g_dbus_object_manager_server_export_uniquely (object_manager_server, G_DBUS_OBJECT_SKELETON (obj)); g_hash_table_insert (accounts->act_user_to_account, user, ACCOUNT(acc)); }
static gboolean handle_change_groups (CockpitAccount *object, GDBusMethodInvocation *invocation, const gchar *const *arg_add, const gchar *const *arg_remove) { Account *acc = ACCOUNT (object); GError *error; int i, j, ngroups; gid_t primary; gid_t *groups; GString *str; struct group *gr; const gchar *argv[6]; gint status; if (!auth_check_sender_role (invocation, COCKPIT_ROLE_USER_ADMIN)) return TRUE; ngroups = get_user_groups (acc->u, &primary, &groups); str = g_string_new (""); for (i = 0; i < ngroups; i++) { if (groups[i] == primary) continue; gr = getgrgid_alloc (groups[i]); if (gr != NULL) { for (j = 0; arg_remove[j]; j++) { if (strcmp (gr->gr_name, arg_remove[j]) == 0) break; } if (!arg_remove[j]) g_string_append_printf (str, "%s,", gr->gr_name); g_free (gr); } } for (j = 0; arg_add[j]; j++) g_string_append_printf (str, "%s,", arg_add[j]); /* remove excess comma */ g_string_truncate (str, str->len - 1); g_free (groups); argv[0] = "/usr/sbin/usermod"; argv[1] = "-G"; argv[2] = str->str; argv[3] = "--"; argv[4] = act_user_get_user_name (acc->u); argv[5] = NULL; error = NULL; if (g_spawn_sync (NULL, (gchar**)argv, NULL, 0, NULL, NULL, NULL, NULL, &status, &error)) g_spawn_check_exit_status (status, &error); if (error) { g_dbus_method_invocation_return_error (invocation, COCKPIT_ERROR, COCKPIT_ERROR_FAILED, "Failed to change user groups via %s: %s", argv[0], error->message); g_error_free (error); } else { account_update (acc, acc->u); cockpit_account_complete_change_groups (object, invocation); } return TRUE; }