a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina/*
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina Authors:
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina Pavel Březina <pbrezina@redhat.com>
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina Copyright (C) 2015 Red Hat
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina This program is free software; you can redistribute it and/or modify
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina it under the terms of the GNU General Public License as published by
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina the Free Software Foundation; either version 3 of the License, or
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina (at your option) any later version.
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina This program is distributed in the hope that it will be useful,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina but WITHOUT ANY WARRANTY; without even the implied warranty of
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina GNU General Public License for more details.
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina You should have received a copy of the GNU General Public License
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina along with this program. If not, see <http://www.gnu.org/licenses/>.
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina*/
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina#include <talloc.h>
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina#include <tevent.h>
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina#include "util/util.h"
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina#include "db/sysdb.h"
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina#include "util/strtonum.h"
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina#include "sbus/sssd_dbus_errors.h"
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina#include "responder/common/responder.h"
4169fb26ea2ff93c19ecdad6e09382732ea5deebPavel Březina#include "responder/common/cache_req/cache_req.h"
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina#include "responder/ifp/ifp_groups.h"
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina#include "responder/ifp/ifp_users.h"
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina#include "responder/ifp/ifp_cache.h"
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březinachar * ifp_groups_build_path_from_msg(TALLOC_CTX *mem_ctx,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina struct sss_domain_info *domain,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina struct ldb_message *msg)
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina{
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina const char *gid;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina gid = ldb_msg_find_attr_as_string(msg, SYSDB_GIDNUM, NULL);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina if (gid == NULL) {
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina return NULL;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina }
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina return sbus_opath_compose(mem_ctx, IFP_PATH_GROUPS, domain->name, gid);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina}
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březinastatic errno_t ifp_groups_decompose_path(struct sss_domain_info *domains,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina const char *path,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct sss_domain_info **_domain,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina gid_t *_gid)
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina{
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina char **parts = NULL;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct sss_domain_info *domain;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina gid_t gid;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina errno_t ret;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ret = sbus_opath_decompose_exact(NULL, path, IFP_PATH_GROUPS, 2, &parts);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (ret != EOK) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina return ret;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina domain = find_domain_by_name(domains, parts[0], false);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (domain == NULL) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ret = ERR_DOMAIN_NOT_FOUND;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina goto done;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina gid = strtouint32(parts[1], NULL, 10);
afdc0179af0ad8ddbedd67422193ef02dcd2bf84Lukas Slebodnik ret = errno;
afdc0179af0ad8ddbedd67422193ef02dcd2bf84Lukas Slebodnik if (ret != EOK) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina goto done;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina *_domain = domain;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina *_gid = gid;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březinadone:
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina talloc_free(parts);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina return ret;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina}
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozekstatic int ifp_groups_list_copy(struct ifp_list_ctx *list_ctx,
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek struct ldb_result *result)
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek{
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek size_t copy_count, i;
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek copy_count = ifp_list_ctx_remaining_capacity(list_ctx, result->count);
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek for (i = 0; i < copy_count; i++) {
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek list_ctx->paths[list_ctx->path_count + i] = \
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek ifp_groups_build_path_from_msg(list_ctx->paths,
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek list_ctx->dom,
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek result->msgs[i]);
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek if (list_ctx->paths[list_ctx->path_count + i] == NULL) {
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek return ENOMEM;
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek }
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek }
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek list_ctx->path_count += copy_count;
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek return EOK;
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek}
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březinastatic void ifp_groups_find_by_name_done(struct tevent_req *req);
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březinaint ifp_groups_find_by_name(struct sbus_request *sbus_req,
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina void *data,
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina const char *name)
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina{
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina struct ifp_ctx *ctx;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina struct tevent_req *req;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina ctx = talloc_get_type(data, struct ifp_ctx);
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina if (ctx == NULL) {
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Invalid pointer!\n");
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina return ERR_INTERNAL;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina }
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina req = cache_req_group_by_name_send(sbus_req, ctx->rctx->ev, ctx->rctx,
11a87c5f091d6c092b5dadd3d67f900213e280daPetr Cech ctx->rctx->ncache, 0, NULL, name);
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina if (req == NULL) {
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina return ENOMEM;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina }
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina tevent_req_set_callback(req, ifp_groups_find_by_name_done, sbus_req);
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina return EOK;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina}
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březinastatic void
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březinaifp_groups_find_by_name_done(struct tevent_req *req)
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina{
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina DBusError *error;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina struct sbus_request *sbus_req;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina struct sss_domain_info *domain;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina struct ldb_result *result;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina char *object_path;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina errno_t ret;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina sbus_req = tevent_req_callback_data(req, struct sbus_request);
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina ret = cache_req_group_by_name_recv(sbus_req, req, &result, &domain, NULL);
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina talloc_zfree(req);
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina if (ret == ENOENT) {
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina error = sbus_error_new(sbus_req, SBUS_ERROR_NOT_FOUND,
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina "Group not found");
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina goto done;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina } else if (ret != EOK) {
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina error = sbus_error_new(sbus_req, DBUS_ERROR_FAILED, "Failed to fetch "
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina "group [%d]: %s\n", ret, sss_strerror(ret));
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina goto done;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina }
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina object_path = ifp_groups_build_path_from_msg(sbus_req, domain,
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina result->msgs[0]);
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina if (object_path == NULL) {
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina error = sbus_error_new(sbus_req, SBUS_ERROR_INTERNAL,
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina "Failed to compose object path");
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina goto done;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina }
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina ret = EOK;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březinadone:
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina if (ret != EOK) {
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina sbus_request_fail_and_finish(sbus_req, error);
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina return;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina }
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina iface_ifp_groups_FindByName_finish(sbus_req, object_path);
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina return;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina}
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březinastatic void ifp_groups_find_by_id_done(struct tevent_req *req);
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březinaint ifp_groups_find_by_id(struct sbus_request *sbus_req,
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina void *data,
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina uint32_t id)
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina{
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina struct ifp_ctx *ctx;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina struct tevent_req *req;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina ctx = talloc_get_type(data, struct ifp_ctx);
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina if (ctx == NULL) {
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Invalid pointer!\n");
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina return ERR_INTERNAL;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina }
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina req = cache_req_group_by_id_send(sbus_req, ctx->rctx->ev, ctx->rctx,
11a87c5f091d6c092b5dadd3d67f900213e280daPetr Cech ctx->rctx->ncache, 0, NULL, id);
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina if (req == NULL) {
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina return ENOMEM;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina }
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina tevent_req_set_callback(req, ifp_groups_find_by_id_done, sbus_req);
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina return EOK;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina}
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březinastatic void
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březinaifp_groups_find_by_id_done(struct tevent_req *req)
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina{
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina DBusError *error;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina struct sbus_request *sbus_req;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina struct sss_domain_info *domain;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina struct ldb_result *result;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina char *object_path;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina errno_t ret;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina sbus_req = tevent_req_callback_data(req, struct sbus_request);
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina ret = cache_req_group_by_id_recv(sbus_req, req, &result, &domain);
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina talloc_zfree(req);
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina if (ret == ENOENT) {
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina error = sbus_error_new(sbus_req, SBUS_ERROR_NOT_FOUND,
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina "Group not found");
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina goto done;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina } else if (ret != EOK) {
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina error = sbus_error_new(sbus_req, DBUS_ERROR_FAILED, "Failed to fetch "
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina "group [%d]: %s\n", ret, sss_strerror(ret));
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina goto done;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina }
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina object_path = ifp_groups_build_path_from_msg(sbus_req, domain,
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina result->msgs[0]);
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina if (object_path == NULL) {
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina error = sbus_error_new(sbus_req, SBUS_ERROR_INTERNAL,
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina "Failed to compose object path");
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina goto done;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina }
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březinadone:
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina if (ret != EOK) {
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina sbus_request_fail_and_finish(sbus_req, error);
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina return;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina }
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina iface_ifp_groups_FindByID_finish(sbus_req, object_path);
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina return;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina}
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozekstatic int ifp_groups_list_by_name_step(struct ifp_list_ctx *list_ctx);
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozekstatic void ifp_groups_list_by_name_done(struct tevent_req *req);
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozekstatic void ifp_groups_list_by_name_reply(struct ifp_list_ctx *list_ctx);
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březinaint ifp_groups_list_by_name(struct sbus_request *sbus_req,
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina void *data,
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina const char *filter,
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina uint32_t limit)
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina{
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek struct ifp_ctx *ctx;
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek struct ifp_list_ctx *list_ctx;
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek ctx = talloc_get_type(data, struct ifp_ctx);
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek if (ctx == NULL) {
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek DEBUG(SSSDBG_CRIT_FAILURE, "Invalid pointer!\n");
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek return ERR_INTERNAL;
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek }
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek list_ctx = ifp_list_ctx_new(sbus_req, ctx, filter, limit);
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek if (list_ctx == NULL) {
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek return ENOMEM;
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek }
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek return ifp_groups_list_by_name_step(list_ctx);
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek}
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozekstatic int ifp_groups_list_by_name_step(struct ifp_list_ctx *list_ctx)
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek{
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek struct tevent_req *req;
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek req = cache_req_group_by_filter_send(list_ctx,
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek list_ctx->ctx->rctx->ev,
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek list_ctx->ctx->rctx,
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek list_ctx->dom->name,
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek list_ctx->filter);
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek if (req == NULL) {
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek return ENOMEM;
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek }
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek tevent_req_set_callback(req,
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek ifp_groups_list_by_name_done, list_ctx);
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina return EOK;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina}
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozekstatic void ifp_groups_list_by_name_done(struct tevent_req *req)
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek{
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek DBusError *error;
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek struct ifp_list_ctx *list_ctx;
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek struct sbus_request *sbus_req;
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek struct ldb_result *result;
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek struct sss_domain_info *domain;
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek errno_t ret;
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek list_ctx = tevent_req_callback_data(req, struct ifp_list_ctx);
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek sbus_req = list_ctx->sbus_req;
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek ret = cache_req_group_by_name_recv(sbus_req, req, &result, &domain, NULL);
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek talloc_zfree(req);
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek if (ret != EOK && ret != ENOENT) {
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek error = sbus_error_new(sbus_req, DBUS_ERROR_FAILED, "Failed to fetch "
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek "groups by filter [%d]: %s\n", ret, sss_strerror(ret));
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek sbus_request_fail_and_finish(sbus_req, error);
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek return;
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek }
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek ret = ifp_groups_list_copy(list_ctx, result);
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek if (ret != EOK) {
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek error = sbus_error_new(sbus_req, SBUS_ERROR_INTERNAL,
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek "Failed to copy domain result");
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek sbus_request_fail_and_finish(sbus_req, error);
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek return;
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek }
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek
877b92e80bde510d5cd9f03dbf01e2bcf73ab072Michal Židek list_ctx->dom = get_next_domain(list_ctx->dom, SSS_GND_DESCEND);
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek if (list_ctx->dom == NULL) {
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek return ifp_groups_list_by_name_reply(list_ctx);
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek }
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek ret = ifp_groups_list_by_name_step(list_ctx);
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek if (ret != EOK) {
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek error = sbus_error_new(sbus_req, SBUS_ERROR_INTERNAL,
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek "Failed to start next-domain search");
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek sbus_request_fail_and_finish(sbus_req, error);
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek return;
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek }
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek}
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozekstatic void ifp_groups_list_by_name_reply(struct ifp_list_ctx *list_ctx)
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek{
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek iface_ifp_groups_ListByDomainAndName_finish(list_ctx->sbus_req,
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek list_ctx->paths,
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek list_ctx->path_count);
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek}
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozekstatic void ifp_groups_list_by_domain_and_name_done(struct tevent_req *req);
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březinaint ifp_groups_list_by_domain_and_name(struct sbus_request *sbus_req,
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina void *data,
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina const char *domain,
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina const char *filter,
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina uint32_t limit)
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina{
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek struct tevent_req *req;
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek struct ifp_ctx *ctx;
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek struct ifp_list_ctx *list_ctx;
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek ctx = talloc_get_type(data, struct ifp_ctx);
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek if (ctx == NULL) {
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek DEBUG(SSSDBG_CRIT_FAILURE, "Invalid pointer!\n");
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek return ERR_INTERNAL;
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek }
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek list_ctx = ifp_list_ctx_new(sbus_req, ctx, filter, limit);
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek if (list_ctx == NULL) {
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek return ENOMEM;
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek }
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek req = cache_req_group_by_filter_send(list_ctx, ctx->rctx->ev, ctx->rctx,
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek domain, filter);
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek if (req == NULL) {
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek return ENOMEM;
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek }
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek tevent_req_set_callback(req,
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek ifp_groups_list_by_domain_and_name_done, list_ctx);
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina return EOK;
132e477d69e07e02fe6e4d668c0bb6226206474aPavel Březina}
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozekstatic void ifp_groups_list_by_domain_and_name_done(struct tevent_req *req)
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek{
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek DBusError *error;
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek struct ifp_list_ctx *list_ctx;
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek struct sbus_request *sbus_req;
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek struct ldb_result *result;
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek struct sss_domain_info *domain;
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek errno_t ret;
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek list_ctx = tevent_req_callback_data(req, struct ifp_list_ctx);
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek sbus_req = list_ctx->sbus_req;
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek ret = cache_req_user_by_name_recv(sbus_req, req, &result, &domain, NULL);
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek talloc_zfree(req);
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek if (ret == ENOENT) {
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek error = sbus_error_new(sbus_req, SBUS_ERROR_NOT_FOUND,
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek "User not found by filter");
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek goto done;
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek } else if (ret != EOK) {
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek error = sbus_error_new(sbus_req, DBUS_ERROR_FAILED, "Failed to fetch "
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek "groups by filter [%d]: %s\n", ret, sss_strerror(ret));
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek goto done;
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek }
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek ret = ifp_groups_list_copy(list_ctx, result);
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek if (ret != EOK) {
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek error = sbus_error_new(sbus_req, SBUS_ERROR_INTERNAL,
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek "Failed to copy domain result");
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek goto done;
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek }
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozekdone:
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek if (ret != EOK) {
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek sbus_request_fail_and_finish(sbus_req, error);
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek return;
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek }
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek iface_ifp_groups_ListByDomainAndName_finish(sbus_req,
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek list_ctx->paths,
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek list_ctx->path_count);
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek return;
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek}
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březinastatic errno_t
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březinaifp_groups_group_get(struct sbus_request *sbus_req,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina void *data,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina gid_t *_gid,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct sss_domain_info **_domain,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct ldb_message **_group)
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina{
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct ifp_ctx *ctx;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct sss_domain_info *domain;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct ldb_result *res;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina uid_t gid;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina errno_t ret;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ctx = talloc_get_type(data, struct ifp_ctx);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (ctx == NULL) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Invalid pointer!\n");
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina return ERR_INTERNAL;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ret = ifp_groups_decompose_path(ctx->rctx->domains, sbus_req->path,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina &domain, &gid);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (ret != EOK) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to decompose object path"
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina "[%s] [%d]: %s\n", sbus_req->path, ret, sss_strerror(ret));
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina return ret;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (_group != NULL) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ret = sysdb_getgrgid_with_views(sbus_req, domain, gid, &res);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (ret == EOK && res->count == 0) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina *_group = NULL;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ret = ENOENT;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (ret != EOK) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to lookup group %u@%s [%d]: %s\n",
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina gid, domain->name, ret, sss_strerror(ret));
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina } else {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina *_group = res->msgs[0];
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (ret == EOK || ret == ENOENT) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (_gid != NULL) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina *_gid = gid;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (_domain != NULL) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina *_domain = domain;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina return ret;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina}
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březinastruct resolv_ghosts_state {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct tevent_context *ev;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct sbus_request *sbus_req;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct ifp_ctx *ctx;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina void *data;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct sss_domain_info *domain;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina const char **ghosts;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina int index;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina};
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březinastatic void resolv_ghosts_group_done(struct tevent_req *subreq);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březinastatic errno_t resolv_ghosts_step(struct tevent_req *req);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březinastatic void resolv_ghosts_done(struct tevent_req *subreq);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březinastatic struct tevent_req *resolv_ghosts_send(TALLOC_CTX *mem_ctx,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct tevent_context *ev,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct sbus_request *sbus_req,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina void *data)
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina{
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct resolv_ghosts_state *state;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct sss_domain_info *domain;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct tevent_req *req;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct tevent_req *subreq;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct ldb_message *group;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct ifp_ctx *ctx;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina const char *name;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina errno_t ret;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina req = tevent_req_create(mem_ctx, &state, struct resolv_ghosts_state);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (req == NULL) {
c02b8482375837b57cb618ed56d4bede0e006d9dPavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "tevent_req_create() failed\n");
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina return NULL;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ctx = talloc_get_type(data, struct ifp_ctx);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (ctx == NULL) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Invalid pointer!\n");
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ret = ERR_INTERNAL;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina goto immediately;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina state->ev = ev;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina state->sbus_req = sbus_req;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina state->ctx = ctx;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina state->data = data;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ret = ifp_groups_group_get(sbus_req, data, NULL, &domain, &group);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (ret != EOK) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina goto immediately;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina name = ldb_msg_find_attr_as_string(group, SYSDB_NAME, NULL);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (name == NULL) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Group name is empty!\n");
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ret = ERR_INTERNAL;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina goto immediately;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina subreq = cache_req_group_by_name_send(state, ev, ctx->rctx,
11a87c5f091d6c092b5dadd3d67f900213e280daPetr Cech ctx->rctx->ncache, 0, domain->name, name);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (subreq == NULL) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ret = ENOMEM;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina goto immediately;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina tevent_req_set_callback(subreq, resolv_ghosts_group_done, req);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina return req;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březinaimmediately:
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (ret == EOK) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina tevent_req_done(req);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina } else {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina tevent_req_error(req, ret);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina tevent_req_post(req, ev);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina return req;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina}
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březinastatic void resolv_ghosts_group_done(struct tevent_req *subreq)
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina{
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct resolv_ghosts_state *state;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct ldb_message_element *el;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct ldb_message *group;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct tevent_req *req;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina errno_t ret;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina req = tevent_req_callback_data(subreq, struct tevent_req);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina state = tevent_req_data(req, struct resolv_ghosts_state);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ret = ifp_groups_group_get(state->sbus_req, state->data, NULL,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina &state->domain, &group);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (ret != EOK) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina goto done;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina el = ldb_msg_find_element(group, SYSDB_GHOST);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (el == NULL) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ret = ENOMEM;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina goto done;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (el->num_values == 0) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ret = EOK;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina goto done;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina state->ghosts = sss_ldb_el_to_string_list(state, el);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (state->ghosts == NULL) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ret = ENOMEM;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina goto done;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina state->index = 0;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ret = resolv_ghosts_step(req);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březinadone:
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (ret == EOK) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina tevent_req_done(req);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina } else if (ret != EAGAIN) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina tevent_req_error(req, ret);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina}
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březinaerrno_t resolv_ghosts_step(struct tevent_req *req)
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina{
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct resolv_ghosts_state *state;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct tevent_req *subreq;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina state = tevent_req_data(req, struct resolv_ghosts_state);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (state->ghosts[state->index] == NULL) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina return EOK;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina subreq = cache_req_user_by_name_send(state, state->ev, state->ctx->rctx,
11a87c5f091d6c092b5dadd3d67f900213e280daPetr Cech state->ctx->rctx->ncache, 0,
11a87c5f091d6c092b5dadd3d67f900213e280daPetr Cech state->domain->name,
11a87c5f091d6c092b5dadd3d67f900213e280daPetr Cech state->ghosts[state->index]);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (subreq == NULL) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina return ENOMEM;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina tevent_req_set_callback(subreq, resolv_ghosts_done, req);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina state->index++;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina return EAGAIN;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina}
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březinastatic void resolv_ghosts_done(struct tevent_req *subreq)
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina{
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct resolv_ghosts_state *state = NULL;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct tevent_req *req = NULL;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina errno_t ret;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina req = tevent_req_callback_data(subreq, struct tevent_req);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina state = tevent_req_data(req, struct resolv_ghosts_state);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ret = cache_req_user_by_name_recv(state, subreq, NULL, NULL, NULL);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina talloc_zfree(subreq);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (ret != EOK) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina goto done;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ret = resolv_ghosts_step(req);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březinadone:
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (ret == EOK) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina tevent_req_done(req);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina } else if (ret != EAGAIN) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina tevent_req_error(req, ret);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina}
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březinastatic errno_t resolv_ghosts_recv(struct tevent_req *req)
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina{
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina TEVENT_REQ_RETURN_ON_ERROR(req);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina return EOK;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina}
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březinastatic void ifp_groups_group_update_member_list_done(struct tevent_req *req);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březinaint ifp_groups_group_update_member_list(struct sbus_request *sbus_req,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina void *data)
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina{
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct tevent_req *subreq;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct ifp_ctx *ctx;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ctx = talloc_get_type(data, struct ifp_ctx);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (ctx == NULL) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Invalid pointer!\n");
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina return ERR_INTERNAL;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina subreq = resolv_ghosts_send(sbus_req, ctx->rctx->ev, sbus_req, data);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (subreq == NULL) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina return ENOMEM;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina tevent_req_set_callback(subreq, ifp_groups_group_update_member_list_done,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina sbus_req);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina return EOK;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina}
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březinastatic void ifp_groups_group_update_member_list_done(struct tevent_req *subreq)
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina{
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina DBusError *error;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct sbus_request *sbus_req;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina errno_t ret;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina sbus_req = tevent_req_callback_data(subreq, struct sbus_request);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ret = resolv_ghosts_recv(subreq);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina talloc_zfree(subreq);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (ret != EOK) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina error = sbus_error_new(sbus_req, DBUS_ERROR_FAILED,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina "Unable to resolve ghost members [%d]: %s\n",
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ret, sss_strerror(ret));
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina sbus_request_fail_and_finish(sbus_req, error);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina return;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina iface_ifp_groups_group_UpdateMemberList_finish(sbus_req);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina return;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina}
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březinavoid ifp_groups_group_get_name(struct sbus_request *sbus_req,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina void *data,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina const char **_out)
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina{
d0faaf01fd24a935d9779032886d228b3861fa48Jakub Hrozek struct ifp_ctx *ifp_ctx;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct ldb_message *msg;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct sss_domain_info *domain;
d0faaf01fd24a935d9779032886d228b3861fa48Jakub Hrozek const char *in_name;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina errno_t ret;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
d0faaf01fd24a935d9779032886d228b3861fa48Jakub Hrozek *_out = NULL;
d0faaf01fd24a935d9779032886d228b3861fa48Jakub Hrozek
d0faaf01fd24a935d9779032886d228b3861fa48Jakub Hrozek ifp_ctx = talloc_get_type(data, struct ifp_ctx);
d0faaf01fd24a935d9779032886d228b3861fa48Jakub Hrozek if (ifp_ctx == NULL) {
d0faaf01fd24a935d9779032886d228b3861fa48Jakub Hrozek DEBUG(SSSDBG_CRIT_FAILURE, "Invalid pointer!\n");
d0faaf01fd24a935d9779032886d228b3861fa48Jakub Hrozek return;
d0faaf01fd24a935d9779032886d228b3861fa48Jakub Hrozek }
d0faaf01fd24a935d9779032886d228b3861fa48Jakub Hrozek
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ret = ifp_groups_group_get(sbus_req, data, NULL, &domain, &msg);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (ret != EOK) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina *_out = NULL;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina return;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
d0faaf01fd24a935d9779032886d228b3861fa48Jakub Hrozek in_name = sss_view_ldb_msg_find_attr_as_string(domain, msg,
d0faaf01fd24a935d9779032886d228b3861fa48Jakub Hrozek SYSDB_NAME, NULL);
d0faaf01fd24a935d9779032886d228b3861fa48Jakub Hrozek if (in_name == NULL) {
d0faaf01fd24a935d9779032886d228b3861fa48Jakub Hrozek DEBUG(SSSDBG_OP_FAILURE, "No name?\n");
d0faaf01fd24a935d9779032886d228b3861fa48Jakub Hrozek return;
d0faaf01fd24a935d9779032886d228b3861fa48Jakub Hrozek }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
d0faaf01fd24a935d9779032886d228b3861fa48Jakub Hrozek *_out = ifp_format_name_attr(sbus_req, ifp_ctx, in_name, domain);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina return;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina}
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březinavoid ifp_groups_group_get_gid_number(struct sbus_request *sbus_req,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina void *data,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina uint32_t *_out)
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina{
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct ldb_message *msg;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct sss_domain_info *domain;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina errno_t ret;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ret = ifp_groups_group_get(sbus_req, data, NULL, &domain, &msg);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (ret != EOK) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina *_out = 0;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina return;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina *_out = sss_view_ldb_msg_find_attr_as_uint64(domain, msg, SYSDB_GIDNUM, 0);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina return;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina}
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
e9a2e7afbd09c23dd8748246e09831ed7b17d7c5Thomas Equetervoid ifp_groups_group_get_unique_id(struct sbus_request *sbus_req,
e9a2e7afbd09c23dd8748246e09831ed7b17d7c5Thomas Equeter void *data,
e9a2e7afbd09c23dd8748246e09831ed7b17d7c5Thomas Equeter const char **_out)
e9a2e7afbd09c23dd8748246e09831ed7b17d7c5Thomas Equeter{
e9a2e7afbd09c23dd8748246e09831ed7b17d7c5Thomas Equeter struct ldb_message *msg;
e9a2e7afbd09c23dd8748246e09831ed7b17d7c5Thomas Equeter struct sss_domain_info *domain;
e9a2e7afbd09c23dd8748246e09831ed7b17d7c5Thomas Equeter errno_t ret;
e9a2e7afbd09c23dd8748246e09831ed7b17d7c5Thomas Equeter
e9a2e7afbd09c23dd8748246e09831ed7b17d7c5Thomas Equeter ret = ifp_groups_group_get(sbus_req, data, NULL, &domain, &msg);
e9a2e7afbd09c23dd8748246e09831ed7b17d7c5Thomas Equeter if (ret != EOK) {
e9a2e7afbd09c23dd8748246e09831ed7b17d7c5Thomas Equeter *_out = 0;
e9a2e7afbd09c23dd8748246e09831ed7b17d7c5Thomas Equeter return;
e9a2e7afbd09c23dd8748246e09831ed7b17d7c5Thomas Equeter }
e9a2e7afbd09c23dd8748246e09831ed7b17d7c5Thomas Equeter
e9a2e7afbd09c23dd8748246e09831ed7b17d7c5Thomas Equeter *_out = sss_view_ldb_msg_find_attr_as_string(domain, msg, SYSDB_UUID, 0);
e9a2e7afbd09c23dd8748246e09831ed7b17d7c5Thomas Equeter
e9a2e7afbd09c23dd8748246e09831ed7b17d7c5Thomas Equeter return;
e9a2e7afbd09c23dd8748246e09831ed7b17d7c5Thomas Equeter}
e9a2e7afbd09c23dd8748246e09831ed7b17d7c5Thomas Equeter
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březinastatic errno_t
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březinaifp_groups_group_get_members(TALLOC_CTX *mem_ctx,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct sbus_request *sbus_req,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina void *data,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina const char ***_users,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina int *_num_users,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina const char ***_groups,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina int *_num_groups)
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina{
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina TALLOC_CTX *tmp_ctx;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct sss_domain_info *domain;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct ldb_message *group;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina struct ldb_message **members;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina size_t num_members;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina const char *class;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina const char **users;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina const char **groups;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina int num_users;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina int num_groups;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina int i;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina errno_t ret;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina const char *attrs[] = {SYSDB_OBJECTCLASS, SYSDB_UIDNUM,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina SYSDB_GIDNUM, NULL};
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina tmp_ctx = talloc_new(NULL);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (tmp_ctx == NULL) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina return ENOMEM;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ret = ifp_groups_group_get(sbus_req, data, NULL, &domain, &group);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (ret != EOK) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina goto done;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ret = sysdb_asq_search(tmp_ctx, domain, group->dn, NULL, SYSDB_MEMBER,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina attrs, &num_members, &members);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (ret != EOK) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to perform ASQ search [%d]: %s\n",
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ret, sss_strerror(ret));
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina goto done;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (num_members == 0) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina users = NULL;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina groups = NULL;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina num_users = 0;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina num_groups = 0;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ret = EOK;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina goto done;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina users = talloc_zero_array(tmp_ctx, const char *, num_members + 1);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (users == NULL) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "talloc_zero_array() failed\n");
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ret = ENOMEM;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina goto done;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina groups = talloc_zero_array(tmp_ctx, const char *, num_members + 1);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (groups == NULL) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "talloc_zero_array() failed\n");
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ret = ENOMEM;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina goto done;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina num_users = 0;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina num_groups = 0;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina for (i = 0; i < num_members; i++) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina class = ldb_msg_find_attr_as_string(members[i], SYSDB_OBJECTCLASS,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina NULL);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (class == NULL) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ret = ERR_INTERNAL;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina goto done;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (strcmp(class, SYSDB_USER_CLASS) == 0) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina users[num_users] = ifp_users_build_path_from_msg(users, domain,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina members[i]);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (users[num_users] == NULL) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ret = ENOMEM;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina goto done;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina num_users++;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina } else if (strcmp(class, SYSDB_GROUP_CLASS) == 0) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina groups[num_groups] = ifp_groups_build_path_from_msg(groups,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina domain, members[i]);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (groups[num_groups] == NULL) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ret = ENOMEM;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina goto done;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina num_groups++;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina } else {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unexpected object class %s\n", class);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ret = ERR_INTERNAL;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina goto done;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ret = EOK;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březinadone:
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (ret == EOK) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (_users != NULL) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina *_users = talloc_steal(mem_ctx, users);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (_num_users != NULL) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina *_num_users = num_users;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (_groups != NULL) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina *_groups = talloc_steal(mem_ctx, groups);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (_num_groups != NULL) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina *_num_groups = num_groups;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina talloc_free(tmp_ctx);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina return ret;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina}
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březinavoid ifp_groups_group_get_users(struct sbus_request *sbus_req,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina void *data,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina const char ***_out,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina int *_size)
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina{
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina errno_t ret;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina *_out = NULL;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina *_size = 0;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ret = ifp_groups_group_get_members(sbus_req, sbus_req, data, _out, _size,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina NULL, NULL);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (ret != EOK) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to acquire groups members\n");
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina}
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březinavoid ifp_groups_group_get_groups(struct sbus_request *sbus_req,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina void *data,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina const char ***_out,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina int *_size)
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina{
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina errno_t ret;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina *_out = NULL;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina *_size = 0;
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina ret = ifp_groups_group_get_members(sbus_req, sbus_req, data, NULL, NULL,
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina _out, _size);
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina if (ret != EOK) {
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to acquire groups members\n");
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina }
8fe171bf5a7a570591418e6548105f1d5a0097b3Pavel Březina}
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březinaint ifp_cache_list_group(struct sbus_request *sbus_req,
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina void *data)
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina{
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina return ifp_cache_list(sbus_req, data, IFP_CACHE_GROUP);
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina}
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březinaint ifp_cache_list_by_domain_group(struct sbus_request *sbus_req,
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina void *data,
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina const char *domain)
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina{
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina return ifp_cache_list_by_domain(sbus_req, data, domain, IFP_CACHE_GROUP);
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina}
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březinaint ifp_cache_object_store_group(struct sbus_request *sbus_req,
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina void *data)
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina{
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina DBusError *error;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina struct sss_domain_info *domain;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina struct ldb_message *group;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina errno_t ret;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina ret = ifp_groups_group_get(sbus_req, data, NULL, &domain, &group);
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina if (ret != EOK) {
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina error = sbus_error_new(sbus_req, DBUS_ERROR_FAILED, "Failed to fetch "
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina "group [%d]: %s\n", ret, sss_strerror(ret));
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina return sbus_request_fail_and_finish(sbus_req, error);
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina }
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina /* The request is finished inside. */
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina return ifp_cache_object_store(sbus_req, domain, group->dn);
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina}
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březinaint ifp_cache_object_remove_group(struct sbus_request *sbus_req,
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina void *data)
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina{
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina DBusError *error;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina struct sss_domain_info *domain;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina struct ldb_message *group;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina errno_t ret;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina ret = ifp_groups_group_get(sbus_req, data, NULL, &domain, &group);
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina if (ret != EOK) {
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina error = sbus_error_new(sbus_req, DBUS_ERROR_FAILED, "Failed to fetch "
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina "group [%d]: %s\n", ret, sss_strerror(ret));
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina return sbus_request_fail_and_finish(sbus_req, error);
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina }
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina /* The request is finished inside. */
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina return ifp_cache_object_remove(sbus_req, domain, group->dn);
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina}