ifp_users.c revision d3c82d0170d6d7407549afdadd08aa7e11aeb9a2
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina Pavel Březina <pbrezina@redhat.com>
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina Copyright (C) 2015 Red Hat
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 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 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#include "responder/common/responder_cache_req.h"
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březinachar * ifp_users_build_path_from_msg(TALLOC_CTX *mem_ctx,
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina const char *uid;
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina uid = ldb_msg_find_attr_as_string(msg, SYSDB_UIDNUM, NULL);
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina return sbus_opath_compose(mem_ctx, IFP_PATH_USERS, domain->name, uid);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březinastatic errno_t ifp_users_decompose_path(struct sss_domain_info *domains,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina ret = sbus_opath_decompose_exact(NULL, path, IFP_PATH_USERS, 2, &parts);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina domain = find_domain_by_name(domains, parts[0], false);
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březinastatic void ifp_users_find_by_name_done(struct tevent_req *req);
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březinaint ifp_users_find_by_name(struct sbus_request *sbus_req,
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Invalid pointer!\n");
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina req = cache_req_user_by_name_send(sbus_req, ctx->rctx->ev, ctx->rctx,
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina tevent_req_set_callback(req, ifp_users_find_by_name_done, sbus_req);
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březinaifp_users_find_by_name_done(struct tevent_req *req)
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina sbus_req = tevent_req_callback_data(req, struct sbus_request);
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina ret = cache_req_user_by_name_recv(sbus_req, req, &result, &domain, NULL);
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina error = sbus_error_new(sbus_req, SBUS_ERROR_NOT_FOUND,
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina "User not found");
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina error = sbus_error_new(sbus_req, DBUS_ERROR_FAILED, "Failed to fetch "
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina object_path = ifp_users_build_path_from_msg(sbus_req, domain,
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina error = sbus_error_new(sbus_req, SBUS_ERROR_INTERNAL,
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina "Failed to compose object path");
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina sbus_request_fail_and_finish(sbus_req, error);
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina iface_ifp_users_FindByName_finish(sbus_req, object_path);
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březinastatic void ifp_users_find_by_id_done(struct tevent_req *req);
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březinaint ifp_users_find_by_id(struct sbus_request *sbus_req,
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Invalid pointer!\n");
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina req = cache_req_user_by_id_send(sbus_req, ctx->rctx->ev, ctx->rctx,
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina tevent_req_set_callback(req, ifp_users_find_by_id_done, sbus_req);
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březinaifp_users_find_by_id_done(struct tevent_req *req)
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina sbus_req = tevent_req_callback_data(req, struct sbus_request);
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina ret = cache_req_user_by_id_recv(sbus_req, req, &result, &domain);
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina error = sbus_error_new(sbus_req, SBUS_ERROR_NOT_FOUND,
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina "User not found");
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina error = sbus_error_new(sbus_req, DBUS_ERROR_FAILED, "Failed to fetch "
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina object_path = ifp_users_build_path_from_msg(sbus_req, domain,
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina error = sbus_error_new(sbus_req, SBUS_ERROR_INTERNAL,
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina "Failed to compose object path");
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina sbus_request_fail_and_finish(sbus_req, error);
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březina iface_ifp_users_FindByID_finish(sbus_req, object_path);
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březinaint ifp_users_list_by_name(struct sbus_request *sbus_req,
c747b0c875785ce693f70b50bdda0237c4b04e35Pavel Březinaint ifp_users_list_by_domain_and_name(struct sbus_request *sbus_req,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březinaifp_users_user_get(struct sbus_request *sbus_req,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina ret = ifp_users_decompose_path(ifp_ctx->rctx->domains, sbus_req->path,
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 ret = sysdb_getpwuid_with_views(sbus_req, domain, uid, &res);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to lookup user %u@%s [%d]: %s\n",
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březinastatic void ifp_users_get_as_string(struct sbus_request *sbus_req,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina const char **_out)
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina ifp_ctx = talloc_get_type(data, struct ifp_ctx);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Invalid pointer!\n");
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 ret = ifp_users_user_get(sbus_req, ifp_ctx, NULL, &domain, &msg);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina *_out = sss_view_ldb_msg_find_attr_as_string(domain, msg, attr, NULL);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březinastatic void ifp_users_get_as_uint32(struct sbus_request *sbus_req,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina ifp_ctx = talloc_get_type(data, struct ifp_ctx);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Invalid pointer!\n");
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 ret = ifp_users_user_get(sbus_req, ifp_ctx, NULL, &domain, &msg);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina *_out = sss_view_ldb_msg_find_attr_as_uint64(domain, msg, attr, 0);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březinastatic void ifp_users_user_update_groups_list_done(struct tevent_req *req);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březinaint ifp_users_user_update_groups_list(struct sbus_request *sbus_req,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Invalid pointer!\n");
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina ret = ifp_users_user_get(sbus_req, data, NULL, &domain, &user);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina username = ldb_msg_find_attr_as_string(user, SYSDB_NAME, NULL);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "User name is empty!\n");
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina req = cache_req_initgr_by_name_send(sbus_req, ctx->rctx->ev, ctx->rctx,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina tevent_req_set_callback(req, ifp_users_user_update_groups_list_done,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březinastatic void ifp_users_user_update_groups_list_done(struct tevent_req *req)
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina sbus_req = tevent_req_callback_data(req, struct sbus_request);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina ret = cache_req_initgr_by_name_recv(sbus_req, req, NULL, NULL, NULL);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina error = sbus_error_new(sbus_req, SBUS_ERROR_NOT_FOUND,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina "User not found");
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina error = sbus_error_new(sbus_req, DBUS_ERROR_FAILED, "Failed to fetch "
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina sbus_request_fail_and_finish(sbus_req, error);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina iface_ifp_users_user_UpdateGroupsList_finish(sbus_req);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březinavoid ifp_users_user_get_name(struct sbus_request *sbus_req,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina const char **_out)
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina ifp_users_get_as_string(sbus_req, data, SYSDB_NAME, _out);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březinavoid ifp_users_user_get_uid_number(struct sbus_request *sbus_req,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina ifp_users_get_as_uint32(sbus_req, data, SYSDB_UIDNUM, _out);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březinavoid ifp_users_user_get_gid_number(struct sbus_request *sbus_req,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina ifp_users_get_as_uint32(sbus_req, data, SYSDB_GIDNUM, _out);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březinavoid ifp_users_user_get_gecos(struct sbus_request *sbus_req,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina const char **_out)
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina ifp_users_get_as_string(sbus_req, data, SYSDB_GECOS, _out);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březinavoid ifp_users_user_get_home_directory(struct sbus_request *sbus_req,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina const char **_out)
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina ifp_users_get_as_string(sbus_req, data, SYSDB_HOMEDIR, _out);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březinavoid ifp_users_user_get_login_shell(struct sbus_request *sbus_req,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina const char **_out)
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina ifp_users_get_as_string(sbus_req, data, SYSDB_SHELL, _out);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březinavoid ifp_users_user_get_groups(struct sbus_request *sbus_req,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina const char ***_out,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina const char **out;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina ifp_ctx = talloc_get_type(data, struct ifp_ctx);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Invalid pointer!\n");
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 ret = ifp_users_user_get(sbus_req, ifp_ctx, NULL, &domain, &user);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina username = ldb_msg_find_attr_as_string(user, SYSDB_NAME, NULL);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "User name is empty!\n");
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina /* Run initgroups. */
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina ret = sysdb_initgroups_with_views(sbus_req, domain, username, &res);
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 out = talloc_zero_array(sbus_req, const char *, res->count);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "talloc_zero_array() failed\n");
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina gid = sss_view_ldb_msg_find_attr_as_uint64(domain, res->msgs[i],
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina out[i] = ifp_groups_build_path_from_msg(out, domain, res->msgs[i]);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "ifp_groups_build_path() failed\n");
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březinavoid ifp_users_user_get_extra_attributes(struct sbus_request *sbus_req,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina const char **extra;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina const char **values;
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina ifp_ctx = talloc_get_type(data, struct ifp_ctx);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Invalid pointer!\n");
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina extra = ifp_get_user_extra_attributes(sbus_req, ifp_ctx);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina DEBUG(SSSDBG_TRACE_ALL, "No extra attributes to return\n");
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina ret = ifp_users_user_get(sbus_req, data, &uid, &domain, NULL);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina basedn = sysdb_user_base_dn(sbus_req, domain);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "sysdb_user_base_dn() failed\n");
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina filter = talloc_asprintf(sbus_req, "(&(%s=%s)(%s=%u))",
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "talloc_asprintf() failed\n");
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina ret = sysdb_search_entry(sbus_req, domain->sysdb, basedn,
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to lookup user [%d]: %s\n",
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina DEBUG(SSSDBG_TRACE_FUNC, "User %u not found!\n", uid);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "More than one entry found!\n");
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to create hash table!\n");
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina /* Read each extra attribute. */
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina DEBUG(SSSDBG_TRACE_ALL, "Attribute %s not found, skipping...\n",
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina values = sss_ldb_el_to_string_list(table, el);
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "sss_ldb_el_to_string_list() failed\n");
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "talloc_strdup() failed\n");
a1e4113a5388e34c08459c5b69679c82ac2bddc9Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to insert entry "
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březinaint ifp_cache_list_user(struct sbus_request *sbus_req,
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina return ifp_cache_list(sbus_req, data, IFP_CACHE_USER);
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březinaint ifp_cache_list_by_domain_user(struct sbus_request *sbus_req,
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina return ifp_cache_list_by_domain(sbus_req, data, domain, IFP_CACHE_USER);
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březinaint ifp_cache_object_store_user(struct sbus_request *sbus_req,
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina ret = ifp_users_user_get(sbus_req, data, NULL, &domain, &user);
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina error = sbus_error_new(sbus_req, DBUS_ERROR_FAILED, "Failed to fetch "
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina return sbus_request_fail_and_finish(sbus_req, error);
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina /* The request is finished inside. */
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina return ifp_cache_object_store(sbus_req, domain, user->dn);
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březinaint ifp_cache_object_remove_user(struct sbus_request *sbus_req,
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina ret = ifp_users_user_get(sbus_req, data, NULL, &domain, &user);
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina error = sbus_error_new(sbus_req, DBUS_ERROR_FAILED, "Failed to fetch "
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina return sbus_request_fail_and_finish(sbus_req, error);
d3c82d0170d6d7407549afdadd08aa7e11aeb9a2Pavel Březina /* The request is finished inside. */