コード例 #1
0
ファイル: accounts.c プロジェクト: magcius/cockpit
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);
}
コード例 #2
0
ファイル: accounts.c プロジェクト: magcius/cockpit
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);
    }
}
コード例 #3
0
ファイル: accounts.c プロジェクト: magcius/cockpit
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));
}
コード例 #4
0
ファイル: account.c プロジェクト: nphilipp/cockpit
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;
}