c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina/*
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina Authors:
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina Pavel Březina <pbrezina@redhat.com>
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina Copyright (C) 2015 Red Hat
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina This program is free software; you can redistribute it and/or modify
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina it under the terms of the GNU General Public License as published by
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina the Free Software Foundation; either version 3 of the License, or
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina (at your option) any later version.
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina This program is distributed in the hope that it will be useful,
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina but WITHOUT ANY WARRANTY; without even the implied warranty of
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina GNU General Public License for more details.
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina You should have received a copy of the GNU General Public License
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina along with this program. If not, see <http://www.gnu.org/licenses/>.
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina*/
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina#include <talloc.h>
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina#include <tevent.h>
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina#include <string.h>
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina#include "db/sysdb.h"
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina#include "util/util.h"
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina#include "util/strtonum.h"
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose#include "util/cert.h"
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina#include "sbus/sssd_dbus_errors.h"
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina#include "responder/common/responder.h"
4169fb26ea2ff93c19ecdad6e09382732ea5deebPavel Březina#include "responder/common/cache_req/cache_req.h"
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina#include "responder/ifp/ifp_users.h"
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina#include "responder/ifp/ifp_groups.h"
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina#include "responder/ifp/ifp_cache.h"
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březinachar * ifp_users_build_path_from_msg(TALLOC_CTX *mem_ctx,
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina struct sss_domain_info *domain,
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina struct ldb_message *msg)
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina{
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina const char *uid;
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina uid = ldb_msg_find_attr_as_string(msg, SYSDB_UIDNUM, NULL);
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina if (uid == NULL) {
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina return NULL;
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina }
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina return sbus_opath_compose(mem_ctx, IFP_PATH_USERS, domain->name, uid);
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina}
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březinastatic errno_t ifp_users_decompose_path(struct sss_domain_info *domains,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina const char *path,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina struct sss_domain_info **_domain,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina uid_t *_uid)
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina{
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina char **parts = NULL;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina struct sss_domain_info *domain;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina uid_t uid;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina errno_t ret;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina ret = sbus_opath_decompose_exact(NULL, path, IFP_PATH_USERS, 2, &parts);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina if (ret != EOK) {
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina return ret;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina }
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina domain = find_domain_by_name(domains, parts[0], false);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina if (domain == NULL) {
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina ret = ERR_DOMAIN_NOT_FOUND;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina goto done;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina }
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina uid = strtouint32(parts[1], NULL, 10);
afdc0179af0ad8ddbedd67422193ef02dcd2bf84Lukas Slebodnik ret = errno;
afdc0179af0ad8ddbedd67422193ef02dcd2bf84Lukas Slebodnik if (ret != EOK) {
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina goto done;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina }
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina *_domain = domain;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina *_uid = uid;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březinadone:
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina talloc_free(parts);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina return ret;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina}
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březinastatic void ifp_users_find_by_name_done(struct tevent_req *req);
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březinaint ifp_users_find_by_name(struct sbus_request *sbus_req,
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina void *data,
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina const char *name)
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina{
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina struct ifp_ctx *ctx;
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina struct tevent_req *req;
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina ctx = talloc_get_type(data, struct ifp_ctx);
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina if (ctx == NULL) {
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Invalid pointer!\n");
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina return ERR_INTERNAL;
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina }
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina req = cache_req_user_by_name_send(sbus_req, ctx->rctx->ev, ctx->rctx,
11a87c5f091d6c092b5dadd3d67f900213e280daPetr Cech ctx->rctx->ncache, 0, NULL, name);
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina if (req == NULL) {
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina return ENOMEM;
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina }
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina tevent_req_set_callback(req, ifp_users_find_by_name_done, sbus_req);
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina return EOK;
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina}
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březinastatic void
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březinaifp_users_find_by_name_done(struct tevent_req *req)
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina{
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina DBusError *error;
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina struct sbus_request *sbus_req;
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina struct sss_domain_info *domain;
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina struct ldb_result *result;
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina char *object_path;
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina errno_t ret;
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina sbus_req = tevent_req_callback_data(req, struct sbus_request);
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina ret = cache_req_user_by_name_recv(sbus_req, req, &result, &domain, NULL);
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina talloc_zfree(req);
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina if (ret == ENOENT) {
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina error = sbus_error_new(sbus_req, SBUS_ERROR_NOT_FOUND,
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina "User not found");
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina goto done;
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina } else if (ret != EOK) {
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina error = sbus_error_new(sbus_req, DBUS_ERROR_FAILED, "Failed to fetch "
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina "user [%d]: %s\n", ret, sss_strerror(ret));
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina goto done;
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina }
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina object_path = ifp_users_build_path_from_msg(sbus_req, domain,
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina result->msgs[0]);
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina if (object_path == NULL) {
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina error = sbus_error_new(sbus_req, SBUS_ERROR_INTERNAL,
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina "Failed to compose object path");
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina goto done;
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina }
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina ret = EOK;
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březinadone:
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina if (ret != EOK) {
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina sbus_request_fail_and_finish(sbus_req, error);
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina return;
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina }
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina iface_ifp_users_FindByName_finish(sbus_req, object_path);
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina return;
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina}
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březinastatic void ifp_users_find_by_id_done(struct tevent_req *req);
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březinaint ifp_users_find_by_id(struct sbus_request *sbus_req,
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina void *data,
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina uint32_t id)
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina{
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina struct ifp_ctx *ctx;
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina struct tevent_req *req;
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina ctx = talloc_get_type(data, struct ifp_ctx);
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina if (ctx == NULL) {
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Invalid pointer!\n");
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina return ERR_INTERNAL;
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina }
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina req = cache_req_user_by_id_send(sbus_req, ctx->rctx->ev, ctx->rctx,
11a87c5f091d6c092b5dadd3d67f900213e280daPetr Cech ctx->rctx->ncache, 0, NULL, id);
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina if (req == NULL) {
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina return ENOMEM;
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina }
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina tevent_req_set_callback(req, ifp_users_find_by_id_done, sbus_req);
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina return EOK;
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina}
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březinastatic void
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březinaifp_users_find_by_id_done(struct tevent_req *req)
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina{
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina DBusError *error;
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina struct sbus_request *sbus_req;
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina struct sss_domain_info *domain;
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina struct ldb_result *result;
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina char *object_path;
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina errno_t ret;
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina sbus_req = tevent_req_callback_data(req, struct sbus_request);
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina ret = cache_req_user_by_id_recv(sbus_req, req, &result, &domain);
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina talloc_zfree(req);
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina if (ret == ENOENT) {
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina error = sbus_error_new(sbus_req, SBUS_ERROR_NOT_FOUND,
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina "User not found");
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina goto done;
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina } else if (ret != EOK) {
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina error = sbus_error_new(sbus_req, DBUS_ERROR_FAILED, "Failed to fetch "
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina "user [%d]: %s\n", ret, sss_strerror(ret));
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina goto done;
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina }
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina object_path = ifp_users_build_path_from_msg(sbus_req, domain,
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina result->msgs[0]);
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina if (object_path == NULL) {
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina error = sbus_error_new(sbus_req, SBUS_ERROR_INTERNAL,
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina "Failed to compose object path");
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina goto done;
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina }
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březinadone:
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina if (ret != EOK) {
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina sbus_request_fail_and_finish(sbus_req, error);
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina return;
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina }
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina iface_ifp_users_FindByID_finish(sbus_req, object_path);
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina return;
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina}
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bosestatic void ifp_users_find_by_cert_done(struct tevent_req *req);
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose
827a016a07d5f911cc4195be89896a376fd71f59Sumit Boseint ifp_users_find_by_cert(struct sbus_request *sbus_req, void *data,
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose const char *pem_cert)
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose{
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose struct ifp_ctx *ctx;
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose struct tevent_req *req;
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose int ret;
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose char *derb64;
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose DBusError *error;
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose ctx = talloc_get_type(data, struct ifp_ctx);
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose if (ctx == NULL) {
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose DEBUG(SSSDBG_CRIT_FAILURE, "Invalid pointer!\n");
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose return ERR_INTERNAL;
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose }
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose ret = sss_cert_pem_to_derb64(sbus_req, pem_cert, &derb64);
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose if (ret != EOK) {
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose DEBUG(SSSDBG_OP_FAILURE, "sss_cert_pem_to_derb64 failed.\n");
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose if (ret == ENOMEM) {
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose return ret;
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose }
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose error = sbus_error_new(sbus_req, DBUS_ERROR_INVALID_ARGS,
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose "Invalid certificate format");
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose sbus_request_fail_and_finish(sbus_req, error);
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose /* the connection is already terminated with an error message, hence
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose * we have to return EOK to not terminate the connection twice. */
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose return EOK;
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose }
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose req = cache_req_user_by_cert_send(sbus_req, ctx->rctx->ev, ctx->rctx,
11a87c5f091d6c092b5dadd3d67f900213e280daPetr Cech ctx->rctx->ncache, 0, NULL, derb64);
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose if (req == NULL) {
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose return ENOMEM;
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose }
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose tevent_req_set_callback(req, ifp_users_find_by_cert_done, sbus_req);
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose return EOK;
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose}
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bosestatic void ifp_users_find_by_cert_done(struct tevent_req *req)
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose{
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose DBusError *error;
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose struct sbus_request *sbus_req;
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose struct sss_domain_info *domain;
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose struct ldb_result *result;
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose char *object_path;
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose errno_t ret;
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose sbus_req = tevent_req_callback_data(req, struct sbus_request);
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose ret = cache_req_user_by_cert_recv(sbus_req, req, &result, &domain, NULL);
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose talloc_zfree(req);
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose if (ret == ENOENT) {
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose error = sbus_error_new(sbus_req, SBUS_ERROR_NOT_FOUND,
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose "User not found");
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose goto done;
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose } else if (ret != EOK) {
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose error = sbus_error_new(sbus_req, DBUS_ERROR_FAILED, "Failed to fetch "
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose "user [%d]: %s\n", ret, sss_strerror(ret));
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose goto done;
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose }
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose object_path = ifp_users_build_path_from_msg(sbus_req, domain,
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose result->msgs[0]);
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose if (object_path == NULL) {
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose error = sbus_error_new(sbus_req, SBUS_ERROR_INTERNAL,
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose "Failed to compose object path");
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose goto done;
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose }
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bosedone:
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose if (ret != EOK) {
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose sbus_request_fail_and_finish(sbus_req, error);
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose return;
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose }
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose iface_ifp_users_FindByCertificate_finish(sbus_req, object_path);
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose return;
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose}
827a016a07d5f911cc4195be89896a376fd71f59Sumit Bose
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozekstatic int ifp_users_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_users_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
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozekstatic int ifp_users_list_by_name_step(struct ifp_list_ctx *list_ctx);
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozekstatic void ifp_users_list_by_name_done(struct tevent_req *req);
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozekstatic void ifp_users_list_by_name_reply(struct ifp_list_ctx *list_ctx);
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březinaint ifp_users_list_by_name(struct sbus_request *sbus_req,
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina void *data,
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina const char *filter,
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina uint32_t limit)
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel 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_users_list_by_name_step(list_ctx);
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek}
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozekstatic int ifp_users_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_user_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_users_list_by_name_done, list_ctx);
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina return EOK;
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina}
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozekstatic void ifp_users_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_user_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 "users 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_users_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_users_list_by_name_reply(list_ctx);
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek }
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek ret = ifp_users_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_users_list_by_name_reply(struct ifp_list_ctx *list_ctx)
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek{
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek iface_ifp_users_ListByName_finish(list_ctx->sbus_req,
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek list_ctx->paths,
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek list_ctx->path_count);
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek}
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozekstatic void ifp_users_list_by_domain_and_name_done(struct tevent_req *req);
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březinaint ifp_users_list_by_domain_and_name(struct sbus_request *sbus_req,
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina void *data,
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina const char *domain,
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina const char *filter,
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina uint32_t limit)
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel 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_user_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_users_list_by_domain_and_name_done, list_ctx);
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina return EOK;
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina}
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozekstatic void ifp_users_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 size_t copy_count, i;
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 "users by filter [%d]: %s\n", ret, sss_strerror(ret));
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek goto done;
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek }
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[i] = ifp_users_build_path_from_msg(list_ctx->paths,
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek list_ctx->dom,
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek result->msgs[i]);
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek if (list_ctx->paths[i] == NULL) {
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek error = sbus_error_new(sbus_req, SBUS_ERROR_INTERNAL,
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek "Failed to compose object path");
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek goto done;
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek }
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek }
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek list_ctx->path_count += copy_count;
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_users_ListByDomainAndName_finish(sbus_req,
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek list_ctx->paths,
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek list_ctx->path_count);
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek return;
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek}
bdf32fbb3c947dd1b2c54d1c21d8028a1ddc80e6Jakub Hrozek
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březinastatic errno_t
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březinaifp_users_user_get(struct sbus_request *sbus_req,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina struct ifp_ctx *ifp_ctx,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina uid_t *_uid,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina struct sss_domain_info **_domain,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina struct ldb_message **_user)
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina{
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina struct sss_domain_info *domain;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina struct ldb_result *res;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina uid_t uid;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina errno_t ret;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina ret = ifp_users_decompose_path(ifp_ctx->rctx->domains, sbus_req->path,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina &domain, &uid);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina if (ret != EOK) {
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to decompose object path"
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina "[%s] [%d]: %s\n", sbus_req->path, ret, sss_strerror(ret));
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina return ret;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina }
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina if (_user != NULL) {
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina ret = sysdb_getpwuid_with_views(sbus_req, domain, uid, &res);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina if (ret == EOK && res->count == 0) {
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina *_user = NULL;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina ret = ENOENT;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina }
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina if (ret != EOK) {
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to lookup user %u@%s [%d]: %s\n",
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina uid, domain->name, ret, sss_strerror(ret));
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina } else {
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina *_user = res->msgs[0];
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina }
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina }
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina if (ret == EOK || ret == ENOENT) {
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina if (_uid != NULL) {
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina *_uid = uid;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina }
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina if (_domain != NULL) {
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina *_domain = domain;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina }
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina }
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina return ret;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina}
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březinastatic void ifp_users_get_as_string(struct sbus_request *sbus_req,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina void *data,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina const char *attr,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina const char **_out)
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina{
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina struct ifp_ctx *ifp_ctx;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina struct ldb_message *msg;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina struct sss_domain_info *domain;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina errno_t ret;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina *_out = NULL;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina ifp_ctx = talloc_get_type(data, struct ifp_ctx);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina if (ifp_ctx == NULL) {
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Invalid pointer!\n");
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina return;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina }
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina if (!ifp_is_user_attr_allowed(ifp_ctx, attr)) {
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina DEBUG(SSSDBG_TRACE_ALL, "Attribute %s is not allowed\n", attr);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina return;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina }
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina ret = ifp_users_user_get(sbus_req, ifp_ctx, NULL, &domain, &msg);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina if (ret != EOK) {
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina return;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina }
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina *_out = sss_view_ldb_msg_find_attr_as_string(domain, msg, attr, NULL);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina return;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina}
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
d0faaf01fd24a935d9779032886d228b3861fa48Jakub Hrozekstatic void ifp_users_get_name(struct sbus_request *sbus_req,
d0faaf01fd24a935d9779032886d228b3861fa48Jakub Hrozek void *data,
d0faaf01fd24a935d9779032886d228b3861fa48Jakub Hrozek const char *attr,
d0faaf01fd24a935d9779032886d228b3861fa48Jakub Hrozek const char **_out)
d0faaf01fd24a935d9779032886d228b3861fa48Jakub Hrozek{
d0faaf01fd24a935d9779032886d228b3861fa48Jakub Hrozek struct ifp_ctx *ifp_ctx;
d0faaf01fd24a935d9779032886d228b3861fa48Jakub Hrozek struct ldb_message *msg;
d0faaf01fd24a935d9779032886d228b3861fa48Jakub Hrozek struct sss_domain_info *domain;
d0faaf01fd24a935d9779032886d228b3861fa48Jakub Hrozek const char *in_name;
d0faaf01fd24a935d9779032886d228b3861fa48Jakub Hrozek errno_t ret;
d0faaf01fd24a935d9779032886d228b3861fa48Jakub Hrozek
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
d0faaf01fd24a935d9779032886d228b3861fa48Jakub Hrozek if (!ifp_is_user_attr_allowed(ifp_ctx, attr)) {
d0faaf01fd24a935d9779032886d228b3861fa48Jakub Hrozek DEBUG(SSSDBG_TRACE_ALL, "Attribute %s is not allowed\n", attr);
d0faaf01fd24a935d9779032886d228b3861fa48Jakub Hrozek return;
d0faaf01fd24a935d9779032886d228b3861fa48Jakub Hrozek }
d0faaf01fd24a935d9779032886d228b3861fa48Jakub Hrozek
d0faaf01fd24a935d9779032886d228b3861fa48Jakub Hrozek ret = ifp_users_user_get(sbus_req, ifp_ctx, NULL, &domain, &msg);
d0faaf01fd24a935d9779032886d228b3861fa48Jakub Hrozek if (ret != EOK) {
d0faaf01fd24a935d9779032886d228b3861fa48Jakub Hrozek return;
d0faaf01fd24a935d9779032886d228b3861fa48Jakub Hrozek }
d0faaf01fd24a935d9779032886d228b3861fa48Jakub Hrozek
d0faaf01fd24a935d9779032886d228b3861fa48Jakub Hrozek in_name = sss_view_ldb_msg_find_attr_as_string(domain, msg, attr, NULL);
d0faaf01fd24a935d9779032886d228b3861fa48Jakub Hrozek if (in_name == NULL) {
d0faaf01fd24a935d9779032886d228b3861fa48Jakub Hrozek DEBUG(SSSDBG_OP_FAILURE, "No name?\n");
d0faaf01fd24a935d9779032886d228b3861fa48Jakub Hrozek return;
d0faaf01fd24a935d9779032886d228b3861fa48Jakub Hrozek }
d0faaf01fd24a935d9779032886d228b3861fa48Jakub Hrozek
d0faaf01fd24a935d9779032886d228b3861fa48Jakub Hrozek *_out = ifp_format_name_attr(sbus_req, ifp_ctx, in_name, domain);
d0faaf01fd24a935d9779032886d228b3861fa48Jakub Hrozek return;
d0faaf01fd24a935d9779032886d228b3861fa48Jakub Hrozek}
d0faaf01fd24a935d9779032886d228b3861fa48Jakub Hrozek
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březinastatic void ifp_users_get_as_uint32(struct sbus_request *sbus_req,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina void *data,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina const char *attr,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina uint32_t *_out)
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina{
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina struct ifp_ctx *ifp_ctx;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina struct ldb_message *msg;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina struct sss_domain_info *domain;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina errno_t ret;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina *_out = 0;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina ifp_ctx = talloc_get_type(data, struct ifp_ctx);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina if (ifp_ctx == NULL) {
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Invalid pointer!\n");
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina return;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina }
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina if (!ifp_is_user_attr_allowed(ifp_ctx, attr)) {
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina DEBUG(SSSDBG_TRACE_ALL, "Attribute %s is not allowed\n", attr);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina return;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina }
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina ret = ifp_users_user_get(sbus_req, ifp_ctx, NULL, &domain, &msg);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina if (ret != EOK) {
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina return;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina }
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina *_out = sss_view_ldb_msg_find_attr_as_uint64(domain, msg, attr, 0);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina return;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina}
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březinastatic void ifp_users_user_update_groups_list_done(struct tevent_req *req);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březinaint ifp_users_user_update_groups_list(struct sbus_request *sbus_req,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina void *data)
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina{
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina struct tevent_req *req;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina struct ifp_ctx *ctx;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina struct sss_domain_info *domain;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina const char *username;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina struct ldb_message *user;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina errno_t ret;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina ctx = talloc_get_type(data, struct ifp_ctx);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina if (ctx == NULL) {
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Invalid pointer!\n");
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina return ERR_INTERNAL;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina }
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina ret = ifp_users_user_get(sbus_req, data, NULL, &domain, &user);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina if (ret != EOK) {
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina return ret;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina }
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina username = ldb_msg_find_attr_as_string(user, SYSDB_NAME, NULL);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina if (username == NULL) {
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "User name is empty!\n");
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina return ERR_INTERNAL;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina }
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina req = cache_req_initgr_by_name_send(sbus_req, ctx->rctx->ev, ctx->rctx,
11a87c5f091d6c092b5dadd3d67f900213e280daPetr Cech ctx->rctx->ncache, 0, domain->name,
11a87c5f091d6c092b5dadd3d67f900213e280daPetr Cech username);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina if (req == NULL) {
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina return ENOMEM;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina }
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina tevent_req_set_callback(req, ifp_users_user_update_groups_list_done,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina sbus_req);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina return EOK;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina}
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březinastatic void ifp_users_user_update_groups_list_done(struct tevent_req *req)
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina{
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina DBusError *error;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina struct sbus_request *sbus_req;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina errno_t ret;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina sbus_req = tevent_req_callback_data(req, struct sbus_request);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina ret = cache_req_initgr_by_name_recv(sbus_req, req, NULL, NULL, NULL);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina talloc_zfree(req);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina if (ret == ENOENT) {
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina error = sbus_error_new(sbus_req, SBUS_ERROR_NOT_FOUND,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina "User not found");
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina goto done;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina } else if (ret != EOK) {
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina error = sbus_error_new(sbus_req, DBUS_ERROR_FAILED, "Failed to fetch "
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina "user [%d]: %s\n", ret, sss_strerror(ret));
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina goto done;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina }
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březinadone:
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina if (ret != EOK) {
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina sbus_request_fail_and_finish(sbus_req, error);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina return;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina }
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina iface_ifp_users_user_UpdateGroupsList_finish(sbus_req);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina return;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina}
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březinavoid ifp_users_user_get_name(struct sbus_request *sbus_req,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina void *data,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina const char **_out)
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina{
d0faaf01fd24a935d9779032886d228b3861fa48Jakub Hrozek ifp_users_get_name(sbus_req, data, SYSDB_NAME, _out);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina}
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březinavoid ifp_users_user_get_uid_number(struct sbus_request *sbus_req,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina void *data,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina uint32_t *_out)
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina{
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina ifp_users_get_as_uint32(sbus_req, data, SYSDB_UIDNUM, _out);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina}
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březinavoid ifp_users_user_get_gid_number(struct sbus_request *sbus_req,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina void *data,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina uint32_t *_out)
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina{
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina ifp_users_get_as_uint32(sbus_req, data, SYSDB_GIDNUM, _out);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina}
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březinavoid ifp_users_user_get_gecos(struct sbus_request *sbus_req,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina void *data,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina const char **_out)
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina{
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina ifp_users_get_as_string(sbus_req, data, SYSDB_GECOS, _out);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina}
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březinavoid ifp_users_user_get_home_directory(struct sbus_request *sbus_req,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina void *data,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina const char **_out)
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina{
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina ifp_users_get_as_string(sbus_req, data, SYSDB_HOMEDIR, _out);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina}
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březinavoid ifp_users_user_get_login_shell(struct sbus_request *sbus_req,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina void *data,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina const char **_out)
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina{
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina ifp_users_get_as_string(sbus_req, data, SYSDB_SHELL, _out);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina}
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
e9a2e7afbd09c23dd8748246e09831ed7b17d7c5Thomas Equetervoid ifp_users_user_get_unique_id(struct sbus_request *sbus_req,
e9a2e7afbd09c23dd8748246e09831ed7b17d7c5Thomas Equeter void *data,
e9a2e7afbd09c23dd8748246e09831ed7b17d7c5Thomas Equeter const char **_out)
e9a2e7afbd09c23dd8748246e09831ed7b17d7c5Thomas Equeter{
e9a2e7afbd09c23dd8748246e09831ed7b17d7c5Thomas Equeter ifp_users_get_as_string(sbus_req, data, SYSDB_UUID, _out);
e9a2e7afbd09c23dd8748246e09831ed7b17d7c5Thomas Equeter}
e9a2e7afbd09c23dd8748246e09831ed7b17d7c5Thomas Equeter
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březinavoid ifp_users_user_get_groups(struct sbus_request *sbus_req,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina void *data,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina const char ***_out,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina int *_size)
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina{
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina struct ifp_ctx *ifp_ctx;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina struct sss_domain_info *domain;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina const char *username;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina struct ldb_message *user;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina struct ldb_result *res;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina const char **out;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina int num_groups;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina gid_t gid;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina errno_t ret;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina int i;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina *_out = NULL;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina *_size = 0;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina ifp_ctx = talloc_get_type(data, struct ifp_ctx);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina if (ifp_ctx == NULL) {
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Invalid pointer!\n");
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina return;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina }
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina if (!ifp_is_user_attr_allowed(ifp_ctx, "groups")) {
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina DEBUG(SSSDBG_TRACE_ALL, "Attribute %s is not allowed\n",
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina SYSDB_MEMBEROF);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina return;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina }
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina ret = ifp_users_user_get(sbus_req, ifp_ctx, NULL, &domain, &user);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina if (ret != EOK) {
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina return;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina }
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina username = ldb_msg_find_attr_as_string(user, SYSDB_NAME, NULL);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina if (username == NULL) {
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "User name is empty!\n");
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina return;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina }
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina /* Run initgroups. */
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina ret = sysdb_initgroups_with_views(sbus_req, domain, username, &res);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina if (ret != EOK) {
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to get groups for %s@%s [%d]: %s\n",
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina username, domain->name, ret, sss_strerror(ret));
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina return;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina }
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina if (res->count == 0) {
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina return;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina }
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina out = talloc_zero_array(sbus_req, const char *, res->count);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina if (out == NULL) {
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "talloc_zero_array() failed\n");
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina return;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina }
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina num_groups = 0;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina for (i = 0; i < res->count; i++) {
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina gid = sss_view_ldb_msg_find_attr_as_uint64(domain, res->msgs[i],
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina SYSDB_GIDNUM, 0);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina if (gid == 0) {
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina continue;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina }
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
788146c3e3a564f333f39a2fcffccf3012cc2679Jakub Hrozek out[num_groups] = ifp_groups_build_path_from_msg(out,
788146c3e3a564f333f39a2fcffccf3012cc2679Jakub Hrozek domain,
788146c3e3a564f333f39a2fcffccf3012cc2679Jakub Hrozek res->msgs[i]);
788146c3e3a564f333f39a2fcffccf3012cc2679Jakub Hrozek if (out[num_groups] == NULL) {
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "ifp_groups_build_path() failed\n");
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina return;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina }
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina num_groups++;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina }
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina *_out = out;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina *_size = num_groups;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina}
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březinavoid ifp_users_user_get_extra_attributes(struct sbus_request *sbus_req,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina void *data,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina hash_table_t **_out)
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina{
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina struct ifp_ctx *ifp_ctx;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina struct sss_domain_info *domain;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina struct ldb_message **user;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina struct ldb_message_element *el;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina struct ldb_dn *basedn;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina size_t count;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina uid_t uid;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina const char *filter;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina const char **extra;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina hash_table_t *table;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina hash_key_t key;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina hash_value_t value;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina const char **values;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina errno_t ret;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina int hret;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina int i;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina *_out = NULL;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina ifp_ctx = talloc_get_type(data, struct ifp_ctx);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina if (ifp_ctx == NULL) {
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Invalid pointer!\n");
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina return;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina }
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina extra = ifp_get_user_extra_attributes(sbus_req, ifp_ctx);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina if (extra == NULL || extra[0] == NULL) {
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina DEBUG(SSSDBG_TRACE_ALL, "No extra attributes to return\n");
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina return;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina }
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina ret = ifp_users_user_get(sbus_req, data, &uid, &domain, NULL);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina if (ret != EOK) {
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina return;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina }
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina basedn = sysdb_user_base_dn(sbus_req, domain);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina if (basedn == NULL) {
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "sysdb_user_base_dn() failed\n");
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina return;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina }
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina filter = talloc_asprintf(sbus_req, "(&(%s=%s)(%s=%u))",
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina SYSDB_OBJECTCLASS, SYSDB_USER_CLASS,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina SYSDB_UIDNUM, uid);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina if (filter == NULL) {
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "talloc_asprintf() failed\n");
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina return;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina }
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina ret = sysdb_search_entry(sbus_req, domain->sysdb, basedn,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina LDB_SCOPE_ONELEVEL, filter,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina extra, &count, &user);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina if (ret != EOK) {
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to lookup user [%d]: %s\n",
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina ret, sss_strerror(ret));
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina return;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina }
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina if (count == 0) {
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina DEBUG(SSSDBG_TRACE_FUNC, "User %u not found!\n", uid);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina return;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina } else if (count > 1) {
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "More than one entry found!\n");
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina return;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina }
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina ret = sss_hash_create(sbus_req, 10, &table);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina if (ret != EOK) {
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to create hash table!\n");
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina return;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina }
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina /* Read each extra attribute. */
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina for (i = 0; extra[i] != NULL; i++) {
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina el = ldb_msg_find_element(user[0], extra[i]);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina if (el == NULL) {
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina DEBUG(SSSDBG_TRACE_ALL, "Attribute %s not found, skipping...\n",
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina extra[i]);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina continue;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina }
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina values = sss_ldb_el_to_string_list(table, el);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina if (values == NULL) {
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "sss_ldb_el_to_string_list() failed\n");
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina return;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina }
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina key.type = HASH_KEY_STRING;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina key.str = talloc_strdup(table, extra[i]);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina if (key.str == NULL) {
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "talloc_strdup() failed\n");
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina return;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina }
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina value.type = HASH_VALUE_PTR;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina value.ptr = values;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina hret = hash_enter(table, &key, &value);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina if (hret != HASH_SUCCESS) {
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to insert entry "
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina "into hash table: %d\n", hret);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina return;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina }
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina }
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina *_out = table;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina}
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březinaint ifp_cache_list_user(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_USER);
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina}
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březinaint ifp_cache_list_by_domain_user(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_USER);
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina}
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březinaint ifp_cache_object_store_user(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 *user;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina errno_t ret;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina ret = ifp_users_user_get(sbus_req, data, NULL, &domain, &user);
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina if (ret != EOK) {
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina error = sbus_error_new(sbus_req, DBUS_ERROR_FAILED, "Failed to fetch "
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina "user [%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, user->dn);
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina}
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březinaint ifp_cache_object_remove_user(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 *user;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina errno_t ret;
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina ret = ifp_users_user_get(sbus_req, data, NULL, &domain, &user);
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina if (ret != EOK) {
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina error = sbus_error_new(sbus_req, DBUS_ERROR_FAILED, "Failed to fetch "
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina "user [%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, user->dn);
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina}