ifp_domains.c revision 590582be38cdbfde387fcc57df92903d48c5a083
6ae232055d4d8a97267517c5e50074c2c819941and/*
6ae232055d4d8a97267517c5e50074c2c819941and Authors:
fd9abdda70912b99b24e3bf1a38f26fde908a74cnd Jakub Hrozek <jhrozek@redhat.com>
fd9abdda70912b99b24e3bf1a38f26fde908a74cnd Pavel Březina <pbrezina@redhat.com>
fd9abdda70912b99b24e3bf1a38f26fde908a74cnd
6ae232055d4d8a97267517c5e50074c2c819941and Copyright (C) 2014 Red Hat
6ae232055d4d8a97267517c5e50074c2c819941and
6ae232055d4d8a97267517c5e50074c2c819941and This program is free software; you can redistribute it and/or modify
6ae232055d4d8a97267517c5e50074c2c819941and it under the terms of the GNU General Public License as published by
96ad5d81ee4a2cc66a4ae19893efc8aa6d06fae7jailletc the Free Software Foundation; either version 3 of the License, or
6ae232055d4d8a97267517c5e50074c2c819941and (at your option) any later version.
6ae232055d4d8a97267517c5e50074c2c819941and
d29d9ab4614ff992b0e8de6e2b88d52b6f1f153erbowen This program is distributed in the hope that it will be useful,
2e545ce2450a9953665f701bb05350f0d3f26275nd but WITHOUT ANY WARRANTY; without even the implied warranty of
d29d9ab4614ff992b0e8de6e2b88d52b6f1f153erbowen MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
d29d9ab4614ff992b0e8de6e2b88d52b6f1f153erbowen GNU General Public License for more details.
6ae232055d4d8a97267517c5e50074c2c819941and
6ae232055d4d8a97267517c5e50074c2c819941and You should have received a copy of the GNU General Public License
6ae232055d4d8a97267517c5e50074c2c819941and along with this program. If not, see <http://www.gnu.org/licenses/>.
af33a4994ae2ff15bc67d19ff1a7feb906745bf8rbowen*/
3f08db06526d6901aa08c110b5bc7dde6bc39905nd
6ae232055d4d8a97267517c5e50074c2c819941and#include <talloc.h>
6ae232055d4d8a97267517c5e50074c2c819941and
6ae232055d4d8a97267517c5e50074c2c819941and#include "db/sysdb.h"
b43f840409794ed298e8634f6284741f193b6c4ftakashi#include "util/util.h"
6ae232055d4d8a97267517c5e50074c2c819941and#include "confdb/confdb.h"
6ae232055d4d8a97267517c5e50074c2c819941and#include "responder/common/responder.h"
6ae232055d4d8a97267517c5e50074c2c819941and#include "responder/ifp/ifp_domains.h"
b43f840409794ed298e8634f6284741f193b6c4ftakashi
11495c9f0bd33e51a25b4d532beadfbcf9b944a3nilgunstatic void ifp_list_domains_process(struct tevent_req *req);
6ae232055d4d8a97267517c5e50074c2c819941and
f086b4b402fa9a2fefc7dda85de2a3cc1cd0a654rjungint ifp_list_domains(struct sbus_request *dbus_req,
6ae232055d4d8a97267517c5e50074c2c819941and void *data)
b43f840409794ed298e8634f6284741f193b6c4ftakashi{
b43f840409794ed298e8634f6284741f193b6c4ftakashi struct ifp_ctx *ifp_ctx;
b43f840409794ed298e8634f6284741f193b6c4ftakashi struct ifp_req *ireq;
b43f840409794ed298e8634f6284741f193b6c4ftakashi struct tevent_req *req;
6ae232055d4d8a97267517c5e50074c2c819941and DBusError *error;
6ae232055d4d8a97267517c5e50074c2c819941and errno_t ret;
6ae232055d4d8a97267517c5e50074c2c819941and
6a3ab831a34f470b077294a173f24fcf1e5f0a3ctakashi ifp_ctx = talloc_get_type(data, struct ifp_ctx);
6ae232055d4d8a97267517c5e50074c2c819941and if (ifp_ctx == NULL) {
6ae232055d4d8a97267517c5e50074c2c819941and DEBUG(SSSDBG_CRIT_FAILURE, "Invalid ifp context!\n");
6ae232055d4d8a97267517c5e50074c2c819941and error = sbus_error_new(dbus_req, DBUS_ERROR_FAILED,
6ae232055d4d8a97267517c5e50074c2c819941and "Invalid ifp context!");
6ae232055d4d8a97267517c5e50074c2c819941and return sbus_request_fail_and_finish(dbus_req, error);
6ae232055d4d8a97267517c5e50074c2c819941and }
6ae232055d4d8a97267517c5e50074c2c819941and
6ae232055d4d8a97267517c5e50074c2c819941and ret = ifp_req_create(dbus_req, ifp_ctx, &ireq);
6a3ab831a34f470b077294a173f24fcf1e5f0a3ctakashi if (ret != EOK) {
6ae232055d4d8a97267517c5e50074c2c819941and error = sbus_error_new(dbus_req, DBUS_ERROR_FAILED,
6ae232055d4d8a97267517c5e50074c2c819941and "%s", sss_strerror(ret));
6ae232055d4d8a97267517c5e50074c2c819941and return sbus_request_fail_and_finish(dbus_req, error);
6ae232055d4d8a97267517c5e50074c2c819941and }
6ae232055d4d8a97267517c5e50074c2c819941and
6ae232055d4d8a97267517c5e50074c2c819941and req = sss_dp_get_domains_send(ireq, ifp_ctx->rctx, false, NULL);
6ae232055d4d8a97267517c5e50074c2c819941and if (req == NULL) {
6ae232055d4d8a97267517c5e50074c2c819941and return sbus_request_finish(ireq->dbus_req, NULL);
6ae232055d4d8a97267517c5e50074c2c819941and }
6ae232055d4d8a97267517c5e50074c2c819941and
6ae232055d4d8a97267517c5e50074c2c819941and tevent_req_set_callback(req, ifp_list_domains_process, ireq);
6ae232055d4d8a97267517c5e50074c2c819941and
6ae232055d4d8a97267517c5e50074c2c819941and return EOK;
6ae232055d4d8a97267517c5e50074c2c819941and}
6ae232055d4d8a97267517c5e50074c2c819941and
6ae232055d4d8a97267517c5e50074c2c819941andstatic void ifp_list_domains_process(struct tevent_req *req)
6ae232055d4d8a97267517c5e50074c2c819941and{
6ae232055d4d8a97267517c5e50074c2c819941and struct sss_domain_info *dom;
6ae232055d4d8a97267517c5e50074c2c819941and struct ifp_req *ireq;
6ae232055d4d8a97267517c5e50074c2c819941and const char **paths;
6ae232055d4d8a97267517c5e50074c2c819941and char *p;
6ae232055d4d8a97267517c5e50074c2c819941and DBusError *error;
6ae232055d4d8a97267517c5e50074c2c819941and size_t num_domains;
6ae232055d4d8a97267517c5e50074c2c819941and size_t pi;
6ae232055d4d8a97267517c5e50074c2c819941and errno_t ret;
6ae232055d4d8a97267517c5e50074c2c819941and
6ae232055d4d8a97267517c5e50074c2c819941and ireq = tevent_req_callback_data(req, struct ifp_req);
6ae232055d4d8a97267517c5e50074c2c819941and
6ae232055d4d8a97267517c5e50074c2c819941and ret = sss_dp_get_domains_recv(req);
6ae232055d4d8a97267517c5e50074c2c819941and talloc_free(req);
6ae232055d4d8a97267517c5e50074c2c819941and if (ret != EOK) {
6ae232055d4d8a97267517c5e50074c2c819941and error = sbus_error_new(ireq->dbus_req, DBUS_ERROR_FAILED,
6ae232055d4d8a97267517c5e50074c2c819941and "Failed to refresh domain objects\n");
1f1b6bf13313fdd14a45e52e553d3ff28689b717coar sbus_request_fail_and_finish(ireq->dbus_req, error);
6ae232055d4d8a97267517c5e50074c2c819941and return;
6ae232055d4d8a97267517c5e50074c2c819941and }
1f1b6bf13313fdd14a45e52e553d3ff28689b717coar
1f1b6bf13313fdd14a45e52e553d3ff28689b717coar ret = sysdb_master_domain_update(ireq->ifp_ctx->rctx->domains);
1f1b6bf13313fdd14a45e52e553d3ff28689b717coar if (ret != EOK) {
6ae232055d4d8a97267517c5e50074c2c819941and error = sbus_error_new(ireq->dbus_req, DBUS_ERROR_FAILED,
070897b4d34cbd17fd2846289189f2a9891f9c84takashi "Failed to refresh subdomain list\n");
30471a4650391f57975f60bbb6e4a90be7b284bfhumbedooh sbus_request_fail_and_finish(ireq->dbus_req, error);
6ae232055d4d8a97267517c5e50074c2c819941and return;
6ae232055d4d8a97267517c5e50074c2c819941and }
6ae232055d4d8a97267517c5e50074c2c819941and
6ae232055d4d8a97267517c5e50074c2c819941and num_domains = 0;
6ae232055d4d8a97267517c5e50074c2c819941and for (dom = ireq->ifp_ctx->rctx->domains;
6ae232055d4d8a97267517c5e50074c2c819941and dom != NULL;
6ae232055d4d8a97267517c5e50074c2c819941and dom = get_next_domain(dom, true)) {
6ae232055d4d8a97267517c5e50074c2c819941and num_domains++;
6ae232055d4d8a97267517c5e50074c2c819941and }
6ae232055d4d8a97267517c5e50074c2c819941and
6ae232055d4d8a97267517c5e50074c2c819941and paths = talloc_zero_array(ireq, const char *, num_domains);
6ae232055d4d8a97267517c5e50074c2c819941and if (paths == NULL) {
6ae232055d4d8a97267517c5e50074c2c819941and sbus_request_finish(ireq->dbus_req, NULL);
6ae232055d4d8a97267517c5e50074c2c819941and return;
6ae232055d4d8a97267517c5e50074c2c819941and }
6a3ab831a34f470b077294a173f24fcf1e5f0a3ctakashi
6a3ab831a34f470b077294a173f24fcf1e5f0a3ctakashi pi = 0;
6a3ab831a34f470b077294a173f24fcf1e5f0a3ctakashi for (dom = ireq->ifp_ctx->rctx->domains;
6a3ab831a34f470b077294a173f24fcf1e5f0a3ctakashi dom != NULL;
6a3ab831a34f470b077294a173f24fcf1e5f0a3ctakashi dom = get_next_domain(dom, true)) {
6a3ab831a34f470b077294a173f24fcf1e5f0a3ctakashi p = ifp_reply_objpath(ireq, INFOPIPE_DOMAIN_PATH_PFX, dom->name);
6a3ab831a34f470b077294a173f24fcf1e5f0a3ctakashi if (p == NULL) {
6a3ab831a34f470b077294a173f24fcf1e5f0a3ctakashi DEBUG(SSSDBG_MINOR_FAILURE,
6ae232055d4d8a97267517c5e50074c2c819941and "Could not create path for dom %s, skipping\n", dom->name);
6ae232055d4d8a97267517c5e50074c2c819941and continue;
6ae232055d4d8a97267517c5e50074c2c819941and }
6ae232055d4d8a97267517c5e50074c2c819941and paths[pi] = p;
6ae232055d4d8a97267517c5e50074c2c819941and pi++;
6ae232055d4d8a97267517c5e50074c2c819941and }
6ae232055d4d8a97267517c5e50074c2c819941and
6ae232055d4d8a97267517c5e50074c2c819941and ret = infopipe_iface_ListDomains_finish(ireq->dbus_req, paths, num_domains);
6ae232055d4d8a97267517c5e50074c2c819941and if (ret != EOK) {
6ae232055d4d8a97267517c5e50074c2c819941and DEBUG(SSSDBG_OP_FAILURE, "Could not finish request!\n");
6ae232055d4d8a97267517c5e50074c2c819941and }
6ae232055d4d8a97267517c5e50074c2c819941and}
6ae232055d4d8a97267517c5e50074c2c819941and
6ae232055d4d8a97267517c5e50074c2c819941andstruct ifp_get_domain_state {
6a3ab831a34f470b077294a173f24fcf1e5f0a3ctakashi const char *name;
6a3ab831a34f470b077294a173f24fcf1e5f0a3ctakashi struct ifp_req *ireq;
6a3ab831a34f470b077294a173f24fcf1e5f0a3ctakashi};
6a3ab831a34f470b077294a173f24fcf1e5f0a3ctakashi
6a3ab831a34f470b077294a173f24fcf1e5f0a3ctakashistatic void ifp_find_domain_by_name_process(struct tevent_req *req);
6a3ab831a34f470b077294a173f24fcf1e5f0a3ctakashi
6a3ab831a34f470b077294a173f24fcf1e5f0a3ctakashiint ifp_find_domain_by_name(struct sbus_request *dbus_req,
6a3ab831a34f470b077294a173f24fcf1e5f0a3ctakashi void *data,
6a3ab831a34f470b077294a173f24fcf1e5f0a3ctakashi const char *arg_name)
6a3ab831a34f470b077294a173f24fcf1e5f0a3ctakashi{
6a3ab831a34f470b077294a173f24fcf1e5f0a3ctakashi struct ifp_ctx *ifp_ctx;
6a3ab831a34f470b077294a173f24fcf1e5f0a3ctakashi struct ifp_req *ireq;
6a3ab831a34f470b077294a173f24fcf1e5f0a3ctakashi struct tevent_req *req;
6ae232055d4d8a97267517c5e50074c2c819941and struct ifp_get_domain_state *state;
6ae232055d4d8a97267517c5e50074c2c819941and DBusError *error;
6ae232055d4d8a97267517c5e50074c2c819941and errno_t ret;
6ae232055d4d8a97267517c5e50074c2c819941and
b43f840409794ed298e8634f6284741f193b6c4ftakashi ifp_ctx = talloc_get_type(data, struct ifp_ctx);
11495c9f0bd33e51a25b4d532beadfbcf9b944a3nilgun if (ifp_ctx == NULL) {
6ae232055d4d8a97267517c5e50074c2c819941and DEBUG(SSSDBG_CRIT_FAILURE, "Invalid pointer!\n");
f086b4b402fa9a2fefc7dda85de2a3cc1cd0a654rjung error = sbus_error_new(dbus_req, DBUS_ERROR_FAILED,
727872d18412fc021f03969b8641810d8896820bhumbedooh "Invalid ifp context!");
0d0ba3a410038e179b695446bb149cce6264e0abnd return sbus_request_fail_and_finish(dbus_req, error);
727872d18412fc021f03969b8641810d8896820bhumbedooh }
cc7e1025de9ac63bd4db6fe7f71c158b2cf09fe4humbedooh
0d0ba3a410038e179b695446bb149cce6264e0abnd ret = ifp_req_create(dbus_req, ifp_ctx, &ireq);
cc7e1025de9ac63bd4db6fe7f71c158b2cf09fe4humbedooh if (ret != EOK) {
727872d18412fc021f03969b8641810d8896820bhumbedooh error = sbus_error_new(dbus_req, DBUS_ERROR_FAILED,
0d0ba3a410038e179b695446bb149cce6264e0abnd "%s", sss_strerror(ret));
0d0ba3a410038e179b695446bb149cce6264e0abnd return sbus_request_fail_and_finish(dbus_req, error);
0d0ba3a410038e179b695446bb149cce6264e0abnd }
ac082aefa89416cbdc9a1836eaf3bed9698201c8humbedooh
0d0ba3a410038e179b695446bb149cce6264e0abnd state = talloc_zero(ireq, struct ifp_get_domain_state);
0d0ba3a410038e179b695446bb149cce6264e0abnd if (state == NULL) {
0d0ba3a410038e179b695446bb149cce6264e0abnd return sbus_request_finish(dbus_req, NULL);
727872d18412fc021f03969b8641810d8896820bhumbedooh }
0d0ba3a410038e179b695446bb149cce6264e0abnd state->name = arg_name;
0d0ba3a410038e179b695446bb149cce6264e0abnd state->ireq = ireq;
30471a4650391f57975f60bbb6e4a90be7b284bfhumbedooh
205f749042ed530040a4f0080dbcb47ceae8a374rjung req = sss_dp_get_domains_send(ireq, ifp_ctx->rctx, false, NULL);
af33a4994ae2ff15bc67d19ff1a7feb906745bf8rbowen if (req == NULL) {
0d0ba3a410038e179b695446bb149cce6264e0abnd return sbus_request_finish(dbus_req, NULL);
7fec19672a491661b2fe4b29f685bc7f4efa64d4nd }
7fec19672a491661b2fe4b29f685bc7f4efa64d4nd tevent_req_set_callback(req, ifp_find_domain_by_name_process, state);
7fec19672a491661b2fe4b29f685bc7f4efa64d4nd return EOK;
6ae232055d4d8a97267517c5e50074c2c819941and}
static void ifp_find_domain_by_name_process(struct tevent_req *req)
{
errno_t ret;
struct ifp_req *ireq;
struct ifp_get_domain_state *state;
struct sss_domain_info *iter;
const char *path;
DBusError *error;
state = tevent_req_callback_data(req, struct ifp_get_domain_state);
ireq = state->ireq;
ret = sss_dp_get_domains_recv(req);
talloc_free(req);
if (ret != EOK) {
error = sbus_error_new(ireq->dbus_req, DBUS_ERROR_FAILED,
"Failed to refresh domain objects\n");
sbus_request_fail_and_finish(ireq->dbus_req, error);
return;
}
ret = sysdb_master_domain_update(ireq->ifp_ctx->rctx->domains);
if (ret != EOK) {
error = sbus_error_new(ireq->dbus_req, DBUS_ERROR_FAILED,
"Failed to refresh subdomain list\n");
sbus_request_fail_and_finish(ireq->dbus_req, error);
return;
}
/* Reply with the domain that was asked for */
for (iter = ireq->ifp_ctx->rctx->domains;
iter != NULL;
iter = get_next_domain(iter, true)) {
if (strcasecmp(iter->name, state->name) == 0) {
break;
}
}
if (iter == NULL) {
error = sbus_error_new(ireq->dbus_req, DBUS_ERROR_FAILED,
"No such domain\n");
sbus_request_fail_and_finish(ireq->dbus_req, error);
return;
}
path = ifp_reply_objpath(ireq, INFOPIPE_DOMAIN_PATH_PFX, iter->name);
if (path == NULL) {
DEBUG(SSSDBG_MINOR_FAILURE,
"Could not create path for domain %s, skipping\n", iter->name);
sbus_request_finish(ireq->dbus_req, NULL);
return;
}
ret = infopipe_iface_FindDomainByName_finish(ireq->dbus_req, path);
if (ret != EOK) {
DEBUG(SSSDBG_OP_FAILURE, "Could not finish request!\n");
}
}