sdap_async_enum.c revision fdda4b659fa3be3027df91a2b053835186ec2c59
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek/*
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek SSSD
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek LDAP Enumeration Module
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek Authors:
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek Simo Sorce <ssorce@redhat.com>
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek Jakub Hrozek <jhrozek@redhat.com>
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek Copyright (C) 2013 Red Hat
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek This program is free software; you can redistribute it and/or modify
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek it under the terms of the GNU General Public License as published by
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek the Free Software Foundation; either version 3 of the License, or
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek (at your option) any later version.
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek This program is distributed in the hope that it will be useful,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek but WITHOUT ANY WARRANTY; without even the implied warranty of
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek GNU General Public License for more details.
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek You should have received a copy of the GNU General Public License
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek along with this program. If not, see <http://www.gnu.org/licenses/>.
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek*/
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek#include <errno.h>
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek#include "util/util.h"
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek#include "db/sysdb.h"
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek#include "providers/ldap/ldap_common.h"
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek#include "providers/ldap/sdap_async.h"
5cd4414fce1e0eb4133dfc6fc828bf25c8a959f9Lukas Slebodnik#include "providers/ldap/sdap_async_enum.h"
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek#include "providers/ldap/sdap_idmap.h"
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozekstatic struct tevent_req *enum_users_send(TALLOC_CTX *memctx,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct tevent_context *ev,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct sdap_id_ctx *ctx,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct sdap_domain *sdom,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct sdap_id_op *op,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek bool purge);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozekstatic errno_t enum_users_recv(struct tevent_req *req);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozekstatic struct tevent_req *enum_groups_send(TALLOC_CTX *memctx,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct tevent_context *ev,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct sdap_id_ctx *ctx,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct sdap_domain *sdom,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct sdap_id_op *op,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek bool purge);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozekstatic errno_t enum_groups_recv(struct tevent_req *req);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek/* ==Enumeration-Request==================================================== */
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozekstruct sdap_dom_enum_state {
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct tevent_context *ev;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct sdap_id_ctx *ctx;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct sdap_domain *sdom;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct sdap_id_conn_ctx *conn;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct sdap_id_op *op;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek bool purge;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek};
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozekstatic errno_t sdap_dom_enum_retry(struct tevent_req *req);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozekstatic void sdap_dom_enum_conn_done(struct tevent_req *subreq);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozekstatic void sdap_dom_enum_users_done(struct tevent_req *subreq);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozekstatic void sdap_dom_enum_groups_done(struct tevent_req *subreq);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozekstatic void sdap_dom_enum_services_done(struct tevent_req *subreq);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozekstruct tevent_req *
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozeksdap_dom_enum_send(TALLOC_CTX *memctx,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct tevent_context *ev,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct sdap_id_ctx *ctx,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct sdap_domain *sdom,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct sdap_id_conn_ctx *conn)
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek{
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct tevent_req *req;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct sdap_dom_enum_state *state;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek int t;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek errno_t ret;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek req = tevent_req_create(ctx, &state, struct sdap_dom_enum_state);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek if (!req) return NULL;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek state->ev = ev;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek state->ctx = ctx;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek state->sdom = sdom;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek state->conn = conn;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek state->op = sdap_id_op_create(state, state->ctx->conn->conn_cache);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek if (!state->op) {
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek DEBUG(SSSDBG_CRIT_FAILURE, ("sdap_id_op_create failed\n"));
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ret = EIO;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek goto fail;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek }
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek sdom->last_enum = tevent_timeval_current();
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek t = dp_opt_get_int(ctx->opts->basic, SDAP_CACHE_PURGE_TIMEOUT);
66edf42c51f8591c93204b6490c103fa51346f47Jakub Hrozek if ((sdom->last_purge.tv_sec + t) < sdom->last_enum.tv_sec) {
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek state->purge = true;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek }
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ret = sdap_dom_enum_retry(req);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek if (ret != EOK) {
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek DEBUG(SSSDBG_OP_FAILURE, ("ldap_id_enumerate_retry failed\n"));
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek goto fail;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek }
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek return req;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozekfail:
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek tevent_req_error(req, ret);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek tevent_req_post(req, ev);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek return req;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek}
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozekstatic errno_t sdap_dom_enum_retry(struct tevent_req *req)
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek{
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct sdap_dom_enum_state *state = tevent_req_data(req,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct sdap_dom_enum_state);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct tevent_req *subreq;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek errno_t ret;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek subreq = sdap_id_op_connect_send(state->op, state, &ret);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek if (subreq == NULL) {
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek DEBUG(SSSDBG_OP_FAILURE,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ("sdap_id_op_connect_send failed: %d\n", ret));
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek return ret;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek }
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek tevent_req_set_callback(subreq, sdap_dom_enum_conn_done, req);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek return EOK;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek}
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozekstatic void sdap_dom_enum_conn_done(struct tevent_req *subreq)
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek{
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct tevent_req *req = tevent_req_callback_data(subreq,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct tevent_req);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct sdap_dom_enum_state *state = tevent_req_data(req,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct sdap_dom_enum_state);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek int ret, dp_error;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ret = sdap_id_op_connect_recv(subreq, &dp_error);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek talloc_zfree(subreq);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek if (ret != EOK) {
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek if (dp_error == DP_ERR_OFFLINE) {
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek DEBUG(SSSDBG_TRACE_FUNC,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ("Backend is marked offline, retry later!\n"));
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek tevent_req_done(req);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek } else {
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek DEBUG(SSSDBG_MINOR_FAILURE,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ("Domain enumeration failed to connect to " \
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek "LDAP server: (%d)[%s]\n", ret, strerror(ret)));
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek tevent_req_error(req, ret);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek }
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek return;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek }
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek subreq = enum_users_send(state, state->ev,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek state->ctx, state->sdom,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek state->op, state->purge);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek if (subreq == NULL) {
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek tevent_req_error(req, ENOMEM);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek return;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek }
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek tevent_req_set_callback(subreq, sdap_dom_enum_users_done, req);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek}
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozekstatic void sdap_dom_enum_users_done(struct tevent_req *subreq)
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek{
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct tevent_req *req = tevent_req_callback_data(subreq,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct tevent_req);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct sdap_dom_enum_state *state = tevent_req_data(req,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct sdap_dom_enum_state);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek uint64_t err = 0;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek int ret, dp_error = DP_ERR_FATAL;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek err = enum_users_recv(subreq);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek talloc_zfree(subreq);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek if (err != EOK && err != ENOENT) {
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek /* We call sdap_id_op_done only on error
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek * as the connection is reused by groups enumeration */
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ret = sdap_id_op_done(state->op, (int)err, &dp_error);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek if (dp_error == DP_ERR_OK) {
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek /* retry */
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ret = sdap_dom_enum_retry(req);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek if (ret == EOK) {
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek return;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek }
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek dp_error = DP_ERR_FATAL;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek }
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek if (dp_error == DP_ERR_OFFLINE) {
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek tevent_req_done(req);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek } else {
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek DEBUG(SSSDBG_OP_FAILURE,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ("User enumeration failed with: (%d)[%s]\n",
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ret, strerror(ret)));
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek tevent_req_error(req, ret);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek }
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek return;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek }
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek subreq = enum_groups_send(state, state->ev, state->ctx,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek state->sdom,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek state->op, state->purge);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek if (subreq == NULL) {
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek tevent_req_error(req, ENOMEM);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek return;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek }
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek tevent_req_set_callback(subreq, sdap_dom_enum_groups_done, req);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek}
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozekstatic void sdap_dom_enum_groups_done(struct tevent_req *subreq)
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek{
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct tevent_req *req = tevent_req_callback_data(subreq,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct tevent_req);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct sdap_dom_enum_state *state = tevent_req_data(req,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct sdap_dom_enum_state);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek uint64_t err = 0;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek int ret, dp_error = DP_ERR_FATAL;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek err = enum_groups_recv(subreq);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek talloc_zfree(subreq);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek if (err != EOK && err != ENOENT) {
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek /* We call sdap_id_op_done only on error
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek * as the connection is reused by services enumeration */
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ret = sdap_id_op_done(state->op, (int)err, &dp_error);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek if (dp_error == DP_ERR_OK && ret != EOK) {
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek /* retry */
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ret = sdap_dom_enum_retry(req);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek if (ret == EOK) {
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek return;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek }
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek dp_error = DP_ERR_FATAL;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek }
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek if (ret != EOK) {
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek if (dp_error == DP_ERR_OFFLINE) {
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek tevent_req_done(req);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek } else {
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek DEBUG(SSSDBG_OP_FAILURE,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ("Group enumeration failed with: (%d)[%s]\n",
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ret, strerror(ret)));
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek tevent_req_error(req, ret);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek }
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek return;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek }
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek }
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek subreq = enum_services_send(state, state->ev, state->ctx,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek state->op, state->purge);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek if (!subreq) {
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek tevent_req_error(req, ENOMEM);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek return;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek }
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek tevent_req_set_callback(subreq, sdap_dom_enum_services_done, req);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek}
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozekstatic void sdap_dom_enum_services_done(struct tevent_req *subreq)
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek{
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek errno_t ret;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek int dp_error = DP_ERR_FATAL;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct tevent_req *req = tevent_req_callback_data(subreq,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct tevent_req);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct sdap_dom_enum_state *state = tevent_req_data(req,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct sdap_dom_enum_state);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ret = enum_services_recv(subreq);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek talloc_zfree(subreq);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek if (ret == ENOENT) ret = EOK;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek /* All enumerations are complete, so conclude the
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek * id_op
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek */
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ret = sdap_id_op_done(state->op, ret, &dp_error);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek if (dp_error == DP_ERR_OK && ret != EOK) {
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek /* retry */
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ret = sdap_dom_enum_retry(req);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek if (ret == EOK) {
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek return;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek }
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek dp_error = DP_ERR_FATAL;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek }
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek if (ret != EOK) {
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek if (dp_error == DP_ERR_OFFLINE) {
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek tevent_req_done(req);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek } else {
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek DEBUG(SSSDBG_MINOR_FAILURE,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ("Service enumeration failed with: (%d)[%s]\n",
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ret, strerror(ret)));
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek tevent_req_error(req, ret);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek }
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek return;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek }
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek /* Ok, we've completed an enumeration. Save this to the
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek * sysdb so we can postpone starting up the enumeration
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek * process on the next SSSD service restart (to avoid
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek * slowing down system boot-up
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek */
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ret = sysdb_set_enumerated(state->sdom->dom->sysdb,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek state->sdom->dom, true);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek if (ret != EOK) {
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek DEBUG(SSSDBG_MINOR_FAILURE,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ("Could not mark domain as having enumerated.\n"));
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek /* This error is non-fatal, so continue */
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek }
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek if (state->purge) {
fc6afb011198f84a30e6598c62923b5a588ccd54Jakub Hrozek ret = ldap_id_cleanup(state->ctx->opts, state->sdom);
34a63c4a00096da7a8e09d49b5970bb1f807eddcJakub Hrozek if (ret != EOK) {
34a63c4a00096da7a8e09d49b5970bb1f807eddcJakub Hrozek /* Not fatal, worst case we'll have stale entries that would be
34a63c4a00096da7a8e09d49b5970bb1f807eddcJakub Hrozek * removed on a subsequent online lookup
34a63c4a00096da7a8e09d49b5970bb1f807eddcJakub Hrozek */
34a63c4a00096da7a8e09d49b5970bb1f807eddcJakub Hrozek DEBUG(SSSDBG_MINOR_FAILURE, ("Cleanup failed: %d\n", ret));
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek }
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek }
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek tevent_req_done(req);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek}
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozekerrno_t sdap_dom_enum_recv(struct tevent_req *req)
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek{
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek TEVENT_REQ_RETURN_ON_ERROR(req);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek return EOK;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek}
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek/* ==User-Enumeration===================================================== */
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozekstruct enum_users_state {
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct tevent_context *ev;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct sdap_id_ctx *ctx;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct sdap_domain *sdom;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct sdap_id_op *op;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek char *filter;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek const char **attrs;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek};
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozekstatic void enum_users_done(struct tevent_req *subreq);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozekstatic struct tevent_req *enum_users_send(TALLOC_CTX *memctx,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct tevent_context *ev,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct sdap_id_ctx *ctx,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct sdap_domain *sdom,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct sdap_id_op *op,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek bool purge)
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek{
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct tevent_req *req, *subreq;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct enum_users_state *state;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek int ret;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek bool use_mapping;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek req = tevent_req_create(memctx, &state, struct enum_users_state);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek if (!req) return NULL;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek state->ev = ev;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek state->sdom = sdom;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek state->ctx = ctx;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek state->op = op;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek use_mapping = sdap_idmap_domain_has_algorithmic_mapping(
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ctx->opts->idmap_ctx,
fdda4b659fa3be3027df91a2b053835186ec2c59Sumit Bose sdom->dom->name,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek sdom->dom->domain_id);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek /* We always want to filter on objectclass and an available name */
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek state->filter = talloc_asprintf(state,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek "(&(objectclass=%s)(%s=*)",
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ctx->opts->user_map[SDAP_OC_USER].name,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ctx->opts->user_map[SDAP_AT_USER_NAME].name);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek if (!state->filter) {
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek DEBUG(SSSDBG_MINOR_FAILURE,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ("Failed to build base filter\n"));
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ret = ENOMEM;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek goto fail;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek }
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek if (use_mapping) {
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek /* If we're ID-mapping, check for the objectSID as well */
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek state->filter = talloc_asprintf_append_buffer(
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek state->filter, "(%s=*)",
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ctx->opts->user_map[SDAP_AT_USER_OBJECTSID].name);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek } else {
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek /* We're not ID-mapping, so make sure to only get entries
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek * that have UID and GID
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek */
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek state->filter = talloc_asprintf_append_buffer(
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek state->filter, "(%s=*)(%s=*)",
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ctx->opts->user_map[SDAP_AT_USER_UID].name,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ctx->opts->user_map[SDAP_AT_USER_GID].name);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek }
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek if (!state->filter) {
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek DEBUG(SSSDBG_MINOR_FAILURE,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ("Failed to build base filter\n"));
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ret = ENOMEM;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek goto fail;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek }
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek if (ctx->srv_opts && ctx->srv_opts->max_user_value && !purge) {
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek /* If we have lastUSN available and we're not doing a full
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek * refresh, limit to changes with a higher entryUSN value.
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek */
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek state->filter = talloc_asprintf_append_buffer(
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek state->filter,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek "(%s>=%s)(!(%s=%s))",
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ctx->opts->user_map[SDAP_AT_USER_USN].name,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ctx->srv_opts->max_user_value,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ctx->opts->user_map[SDAP_AT_USER_USN].name,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ctx->srv_opts->max_user_value);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek if (!state->filter) {
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek DEBUG(SSSDBG_MINOR_FAILURE,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ("Failed to build base filter\n"));
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ret = ENOMEM;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek goto fail;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek }
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek }
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek /* Terminate the search filter */
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek state->filter = talloc_asprintf_append_buffer(state->filter, ")");
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek if (!state->filter) {
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek DEBUG(2, ("Failed to build base filter\n"));
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ret = ENOMEM;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek goto fail;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek }
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek /* TODO: handle attrs_type */
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ret = build_attrs_from_map(state, ctx->opts->user_map, SDAP_OPTS_USER,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek NULL, &state->attrs, NULL);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek if (ret != EOK) goto fail;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek /* TODO: restrict the enumerations to using a single
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek * search base at a time.
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek */
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek subreq = sdap_get_users_send(state, state->ev,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek state->sdom->dom,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek state->sdom->dom->sysdb,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek state->ctx->opts,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek state->sdom->user_search_bases,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek sdap_id_op_handle(state->op),
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek state->attrs, state->filter,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek dp_opt_get_int(state->ctx->opts->basic,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek SDAP_ENUM_SEARCH_TIMEOUT),
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek true);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek if (!subreq) {
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ret = ENOMEM;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek goto fail;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek }
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek tevent_req_set_callback(subreq, enum_users_done, req);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek return req;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozekfail:
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek tevent_req_error(req, ret);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek tevent_req_post(req, ev);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek return req;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek}
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozekstatic void enum_users_done(struct tevent_req *subreq)
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek{
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct tevent_req *req = tevent_req_callback_data(subreq,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct tevent_req);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct enum_users_state *state = tevent_req_data(req,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct enum_users_state);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek char *usn_value;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek char *endptr = NULL;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek unsigned usn_number;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek int ret;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ret = sdap_get_users_recv(subreq, state, &usn_value);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek talloc_zfree(subreq);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek if (ret) {
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek tevent_req_error(req, ret);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek return;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek }
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek if (usn_value) {
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek talloc_zfree(state->ctx->srv_opts->max_user_value);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek state->ctx->srv_opts->max_user_value =
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek talloc_steal(state->ctx, usn_value);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek usn_number = strtoul(usn_value, &endptr, 10);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek if ((endptr == NULL || (*endptr == '\0' && endptr != usn_value))
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek && (usn_number > state->ctx->srv_opts->last_usn)) {
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek state->ctx->srv_opts->last_usn = usn_number;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek }
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek }
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek DEBUG(4, ("Users higher USN value: [%s]\n",
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek state->ctx->srv_opts->max_user_value));
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek tevent_req_done(req);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek}
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozekstatic errno_t enum_users_recv(struct tevent_req *req)
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek{
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek TEVENT_REQ_RETURN_ON_ERROR(req);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek return EOK;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek}
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek/* =Group-Enumeration===================================================== */
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozekstruct enum_groups_state {
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct tevent_context *ev;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct sdap_id_ctx *ctx;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct sdap_domain *sdom;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct sdap_id_op *op;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek char *filter;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek const char **attrs;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek};
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozekstatic void enum_groups_done(struct tevent_req *subreq);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozekstatic struct tevent_req *enum_groups_send(TALLOC_CTX *memctx,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct tevent_context *ev,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct sdap_id_ctx *ctx,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct sdap_domain *sdom,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct sdap_id_op *op,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek bool purge)
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek{
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct tevent_req *req, *subreq;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct enum_groups_state *state;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek int ret;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek bool use_mapping;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek req = tevent_req_create(memctx, &state, struct enum_groups_state);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek if (!req) return NULL;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek state->ev = ev;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek state->sdom = sdom;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek state->ctx = ctx;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek state->op = op;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek use_mapping = sdap_idmap_domain_has_algorithmic_mapping(
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ctx->opts->idmap_ctx,
fdda4b659fa3be3027df91a2b053835186ec2c59Sumit Bose sdom->dom->name,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek sdom->dom->domain_id);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek /* We always want to filter on objectclass and an available name */
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek state->filter = talloc_asprintf(state,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek "(&(objectclass=%s)(%s=*)",
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ctx->opts->group_map[SDAP_OC_GROUP].name,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ctx->opts->group_map[SDAP_AT_GROUP_NAME].name);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek if (!state->filter) {
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek DEBUG(SSSDBG_MINOR_FAILURE,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ("Failed to build base filter\n"));
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ret = ENOMEM;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek goto fail;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek }
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek if (use_mapping) {
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek /* If we're ID-mapping, check for the objectSID as well */
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek state->filter = talloc_asprintf_append_buffer(
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek state->filter, "(%s=*)",
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ctx->opts->group_map[SDAP_AT_GROUP_OBJECTSID].name);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek } else {
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek /* We're not ID-mapping, so make sure to only get entries
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek * that have a non-zero GID.
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek */
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek state->filter = talloc_asprintf_append_buffer(
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek state->filter, "(&(%s=*)(!(%s=0)))",
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ctx->opts->group_map[SDAP_AT_GROUP_GID].name,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ctx->opts->group_map[SDAP_AT_GROUP_GID].name);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek }
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek if (!state->filter) {
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek DEBUG(SSSDBG_MINOR_FAILURE,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ("Failed to build base filter\n"));
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ret = ENOMEM;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek goto fail;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek }
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek if (ctx->srv_opts && ctx->srv_opts->max_group_value && !purge) {
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek state->filter = talloc_asprintf_append_buffer(
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek state->filter,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek "(%s>=%s)(!(%s=%s))",
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ctx->opts->group_map[SDAP_AT_GROUP_USN].name,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ctx->srv_opts->max_group_value,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ctx->opts->group_map[SDAP_AT_GROUP_USN].name,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ctx->srv_opts->max_group_value);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek if (!state->filter) {
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek DEBUG(SSSDBG_MINOR_FAILURE,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ("Failed to build base filter\n"));
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ret = ENOMEM;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek goto fail;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek }
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek }
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek /* Terminate the search filter */
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek state->filter = talloc_asprintf_append_buffer(state->filter, ")");
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek if (!state->filter) {
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek DEBUG(SSSDBG_MINOR_FAILURE,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ("Failed to build base filter\n"));
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ret = ENOMEM;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek goto fail;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek }
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek /* TODO: handle attrs_type */
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ret = build_attrs_from_map(state, ctx->opts->group_map, SDAP_OPTS_GROUP,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek NULL, &state->attrs, NULL);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek if (ret != EOK) goto fail;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek /* TODO: restrict the enumerations to using a single
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek * search base at a time.
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek */
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek subreq = sdap_get_groups_send(state, state->ev,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek state->sdom,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek state->ctx->opts,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek sdap_id_op_handle(state->op),
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek state->attrs, state->filter,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek dp_opt_get_int(state->ctx->opts->basic,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek SDAP_ENUM_SEARCH_TIMEOUT),
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek true);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek if (!subreq) {
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ret = ENOMEM;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek goto fail;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek }
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek tevent_req_set_callback(subreq, enum_groups_done, req);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek return req;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozekfail:
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek tevent_req_error(req, ret);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek tevent_req_post(req, ev);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek return req;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek}
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozekstatic void enum_groups_done(struct tevent_req *subreq)
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek{
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct tevent_req *req = tevent_req_callback_data(subreq,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct tevent_req);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct enum_groups_state *state = tevent_req_data(req,
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek struct enum_groups_state);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek char *usn_value;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek char *endptr = NULL;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek unsigned usn_number;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek int ret;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek ret = sdap_get_groups_recv(subreq, state, &usn_value);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek talloc_zfree(subreq);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek if (ret) {
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek tevent_req_error(req, ret);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek return;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek }
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek if (usn_value) {
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek talloc_zfree(state->ctx->srv_opts->max_group_value);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek state->ctx->srv_opts->max_group_value =
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek talloc_steal(state->ctx, usn_value);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek usn_number = strtoul(usn_value, &endptr, 10);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek if ((endptr == NULL || (*endptr == '\0' && endptr != usn_value))
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek && (usn_number > state->ctx->srv_opts->last_usn)) {
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek state->ctx->srv_opts->last_usn = usn_number;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek }
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek }
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek DEBUG(4, ("Groups higher USN value: [%s]\n",
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek state->ctx->srv_opts->max_group_value));
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek tevent_req_done(req);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek}
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozekstatic errno_t enum_groups_recv(struct tevent_req *req)
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek{
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek TEVENT_REQ_RETURN_ON_ERROR(req);
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek return EOK;
8ca73915a3bf60331468fed6b3b38652c979f95dJakub Hrozek}