c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny/*
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny Authors:
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny Jan Zeleny <jzeleny@redhat.com>
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny Copyright (C) 2011 Red Hat
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny This program is free software; you can redistribute it and/or modify
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny it under the terms of the GNU General Public License as published by
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny the Free Software Foundation; either version 3 of the License, or
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny (at your option) any later version.
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny This program is distributed in the hope that it will be useful,
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny but WITHOUT ANY WARRANTY; without even the implied warranty of
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny GNU General Public License for more details.
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny You should have received a copy of the GNU General Public License
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny along with this program. If not, see <http://www.gnu.org/licenses/>.
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny*/
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny#include "util/util.h"
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny#include "responder/common/responder.h"
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny#include "providers/data_provider.h"
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny#include "db/sysdb.h"
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek/* ========== Get subdomains for a domain ================= */
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozekstatic DBusMessage *sss_dp_get_domains_msg(void *pvt);
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zelenystruct sss_dp_domains_info {
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny struct sss_domain_info *dom;
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny const char *hint;
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny};
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozekstatic struct tevent_req *
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozekget_subdomains_send(TALLOC_CTX *mem_ctx, struct resp_ctx *rctx,
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek struct sss_domain_info *dom,
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek const char *hint)
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny{
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny errno_t ret;
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny struct tevent_req *req;
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek struct sss_dp_req_state *state;
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny struct sss_dp_domains_info *info;
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek char *key;
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek req = tevent_req_create(mem_ctx, &state, struct sss_dp_req_state);
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny if (req == NULL) {
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek return NULL;
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny }
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek info = talloc_zero(state, struct sss_dp_domains_info);
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek if (!info) {
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek ret = ENOMEM;
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek goto fail;
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny }
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek info->hint = hint;
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek info->dom = dom;
bdbf4f169e4d5d00b0616df19f7a55debb407f78Pavel Březina
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek key = talloc_asprintf(state, "domains@%s", dom->name);
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny if (key == NULL) {
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek ret = ENOMEM;
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek goto fail;
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny }
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek ret = sss_dp_issue_request(state, rctx, key, dom,
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek sss_dp_get_domains_msg, info, req);
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny talloc_free(key);
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny if (ret != EOK) {
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek ret = EIO;
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek goto fail;
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny }
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek return req;
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozekfail:
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek tevent_req_error(req, ret);
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek tevent_req_post(req, rctx->ev);
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek return req;
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny}
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zelenystatic DBusMessage *
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zelenysss_dp_get_domains_msg(void *pvt)
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny{
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny struct sss_dp_domains_info *info;
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny DBusMessage *msg = NULL;
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny dbus_bool_t dbret;
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny info = talloc_get_type(pvt, struct sss_dp_domains_info);
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny msg = dbus_message_new_method_call(NULL,
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny DP_PATH,
04e870d99e72aa3160bdb6ab05d986fb4005c3edPavel Březina IFACE_DP,
04e870d99e72aa3160bdb6ab05d986fb4005c3edPavel Březina IFACE_DP_GETDOMAINS);
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny if (msg == NULL) {
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_CRIT_FAILURE, "Out of memory?!\n");
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny return NULL;
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny }
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny DEBUG(SSSDBG_TRACE_FUNC,
ef2455b63380ecd17bea94270ceaabe15dcf6456Jakub Hrozek "Sending get domains request for [%s][%s]\n",
ef2455b63380ecd17bea94270ceaabe15dcf6456Jakub Hrozek info->dom->name, info->hint);
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny /* Send the hint argument to provider as well. This will
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny * be useful for some cases of transitional trust where
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny * the server might not know all trusted domains
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny */
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny dbret = dbus_message_append_args(msg,
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny DBUS_TYPE_STRING, &info->hint,
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny DBUS_TYPE_INVALID);
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny if (!dbret) {
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_OP_FAILURE ,"Failed to build message\n");
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny dbus_message_unref(msg);
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny return NULL;
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny }
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny return msg;
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny}
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozekstatic errno_t
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozekget_next_domain_recv(TALLOC_CTX *mem_ctx,
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek struct tevent_req *req,
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek dbus_uint16_t *dp_err,
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek dbus_uint32_t *dp_ret,
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek char **err_msg)
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek{
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek return sss_dp_req_recv(mem_ctx, req, dp_err, dp_ret, err_msg);
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek}
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek/* ====== Iterate over all domains, searching for their subdomains ======= */
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozekstatic errno_t process_subdomains(struct sss_domain_info *dom);
99bac83188601c2b07e0b141aac7dc7d882b464aSumit Bosestatic void set_time_of_last_request(struct resp_ctx *rctx);
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozekstatic errno_t check_last_request(struct resp_ctx *rctx, const char *hint);
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozekstruct sss_dp_get_domains_state {
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek struct resp_ctx *rctx;
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek struct sss_domain_info *dom;
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek const char *hint;
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek};
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozekstatic void
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozeksss_dp_get_domains_process(struct tevent_req *subreq);
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozekstruct tevent_req *sss_dp_get_domains_send(TALLOC_CTX *mem_ctx,
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek struct resp_ctx *rctx,
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek bool force,
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek const char *hint)
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny{
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny errno_t ret;
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek struct tevent_req *req;
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek struct tevent_req *subreq;
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek struct sss_dp_get_domains_state *state;
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek req = tevent_req_create(mem_ctx, &state, struct sss_dp_get_domains_state);
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek if (req == NULL) {
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek return NULL;
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek }
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek if (rctx->domains == NULL) {
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_CRIT_FAILURE, "No domains configured.\n");
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek ret = EINVAL;
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek goto immediately;
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek }
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek if (!force) {
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek ret = check_last_request(rctx, hint);
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek if (ret == EOK) {
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek DEBUG(SSSDBG_TRACE_FUNC,
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov "Last call was too recent, nothing to do!\n");
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek goto immediately;
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek } else if (ret != EAGAIN) {
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_TRACE_FUNC, "check_domain_request failed with [%d][%s]\n",
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov ret, strerror(ret));
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek goto immediately;
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek }
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek }
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek state->rctx = rctx;
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek if (hint != NULL) {
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek state->hint = hint;
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek } else {
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek state->hint = talloc_strdup(state, "");
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek if (state->hint == NULL) {
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek ret = ENOMEM;
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek goto immediately;
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek }
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek }
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek state->dom = rctx->domains;
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek while(state->dom != NULL && !NEED_CHECK_PROVIDER(state->dom->provider)) {
877b92e80bde510d5cd9f03dbf01e2bcf73ab072Michal Židek state->dom = get_next_domain(state->dom, 0);
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek }
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek if (state->dom == NULL) {
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek /* All domains were local */
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek ret = EOK;
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek goto immediately;
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek }
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek
ef2455b63380ecd17bea94270ceaabe15dcf6456Jakub Hrozek subreq = get_subdomains_send(req, rctx, state->dom, state->hint);
b6d5f2a91fbce15c7ef4d382fa6b52407adb26ddPavel Březina if (subreq == NULL) {
b6d5f2a91fbce15c7ef4d382fa6b52407adb26ddPavel Březina ret = ENOMEM;
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek goto immediately;
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek }
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek tevent_req_set_callback(subreq, sss_dp_get_domains_process, req);
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek return req;
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozekimmediately:
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek if (ret == EOK) {
99bac83188601c2b07e0b141aac7dc7d882b464aSumit Bose set_time_of_last_request(rctx);
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek tevent_req_done(req);
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek } else {
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek tevent_req_error(req, ret);
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek }
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek tevent_req_post(req, rctx->ev);
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek return req;
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek}
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozekstatic void
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozeksss_dp_get_domains_process(struct tevent_req *subreq)
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek{
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek errno_t ret;
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek struct tevent_req *req = tevent_req_callback_data(subreq,
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek struct tevent_req);
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek struct sss_dp_get_domains_state *state = tevent_req_data(req,
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek struct sss_dp_get_domains_state);
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny dbus_uint16_t dp_err;
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny dbus_uint32_t dp_ret;
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny char *err_msg;
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek ret = get_next_domain_recv(req, subreq, &dp_err, &dp_ret, &err_msg);
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek talloc_zfree(subreq);
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny if (ret != EOK) {
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny goto fail;
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny }
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek ret = process_subdomains(state->dom);
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny if (ret != EOK) {
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_OP_FAILURE, "process_subdomains failed, "
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov "trying next domain.\n");
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny goto fail;
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny }
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek /* Advance to the next domain */
877b92e80bde510d5cd9f03dbf01e2bcf73ab072Michal Židek state->dom = get_next_domain(state->dom, 0);
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek /* Skip local domains */
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek while(state->dom != NULL && !NEED_CHECK_PROVIDER(state->dom->provider)) {
877b92e80bde510d5cd9f03dbf01e2bcf73ab072Michal Židek state->dom = get_next_domain(state->dom, 0);
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek }
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek if (state->dom == NULL) {
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek /* All domains were local */
99bac83188601c2b07e0b141aac7dc7d882b464aSumit Bose set_time_of_last_request(state->rctx);
bdbf4f169e4d5d00b0616df19f7a55debb407f78Pavel Březina tevent_req_done(req);
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek return;
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny }
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny
ef2455b63380ecd17bea94270ceaabe15dcf6456Jakub Hrozek subreq = get_subdomains_send(req, state->rctx, state->dom, state->hint);
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek if (subreq == NULL) {
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek ret = ENOMEM;
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek goto fail;
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek }
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozek tevent_req_set_callback(subreq, sss_dp_get_domains_process, req);
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny return;
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zelenyfail:
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny tevent_req_error(req, ret);
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny return;
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny}
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozekstatic errno_t
8ba8222afca3026fd67af08e224b1d9e848aceaaJakub Hrozekprocess_subdomains(struct sss_domain_info *domain)
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny{
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny int ret;
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny
65393a294e635822c1d7a15fe5853dc457ad8a2aSimo Sorce if (domain->realm == NULL ||
65393a294e635822c1d7a15fe5853dc457ad8a2aSimo Sorce domain->flat_name == NULL ||
65393a294e635822c1d7a15fe5853dc457ad8a2aSimo Sorce domain->domain_id == NULL) {
65393a294e635822c1d7a15fe5853dc457ad8a2aSimo Sorce ret = sysdb_master_domain_update(domain);
aac3ca699a09090072ae4d68bdda8dec990ae393Sumit Bose if (ret != EOK) {
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_FUNC_DATA, "sysdb_master_domain_get_info " \
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov "failed.\n");
aac3ca699a09090072ae4d68bdda8dec990ae393Sumit Bose goto done;
aac3ca699a09090072ae4d68bdda8dec990ae393Sumit Bose }
aac3ca699a09090072ae4d68bdda8dec990ae393Sumit Bose }
aac3ca699a09090072ae4d68bdda8dec990ae393Sumit Bose
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce /* Retrieve all subdomains of this domain from sysdb
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce * and create their struct sss_domain_info representations
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce */
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce ret = sysdb_update_subdomains(domain);
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce if (ret != EOK) {
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_FUNC_DATA, "sysdb_update_subdomains failed.\n");
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce goto done;
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce }
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny errno = 0;
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny ret = gettimeofday(&domain->subdomains_last_checked, NULL);
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny if (ret == -1) {
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny ret = errno;
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny goto done;
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny }
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny ret = EOK;
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zelenydone:
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny if (ret != EOK) {
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_OP_FAILURE, "Failed to update sub-domains "
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov "of domain [%s].\n", domain->name);
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny }
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny return ret;
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny}
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zelenyerrno_t sss_dp_get_domains_recv(struct tevent_req *req)
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny{
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny TEVENT_REQ_RETURN_ON_ERROR(req);
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny return EOK;
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny}
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny
99bac83188601c2b07e0b141aac7dc7d882b464aSumit Bosestatic void set_time_of_last_request(struct resp_ctx *rctx)
99bac83188601c2b07e0b141aac7dc7d882b464aSumit Bose{
99bac83188601c2b07e0b141aac7dc7d882b464aSumit Bose int ret;
99bac83188601c2b07e0b141aac7dc7d882b464aSumit Bose
99bac83188601c2b07e0b141aac7dc7d882b464aSumit Bose errno = 0;
99bac83188601c2b07e0b141aac7dc7d882b464aSumit Bose ret = gettimeofday(&rctx->get_domains_last_call, NULL);
99bac83188601c2b07e0b141aac7dc7d882b464aSumit Bose if (ret == -1) {
99bac83188601c2b07e0b141aac7dc7d882b464aSumit Bose ret = errno;
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_TRACE_FUNC, "gettimeofday failed [%d][%s].\n",
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov ret, strerror(ret));
99bac83188601c2b07e0b141aac7dc7d882b464aSumit Bose }
99bac83188601c2b07e0b141aac7dc7d882b464aSumit Bose}
99bac83188601c2b07e0b141aac7dc7d882b464aSumit Bose
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zelenystatic errno_t check_last_request(struct resp_ctx *rctx, const char *hint)
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny{
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny struct sss_domain_info *dom;
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny time_t now = time(NULL);
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny time_t diff;
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce diff = now - rctx->get_domains_last_call.tv_sec;
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny if (diff >= rctx->domains_timeout) {
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny /* Timeout, expired, fetch domains again */
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny return EAGAIN;
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny }
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny if (hint != NULL) {
877b92e80bde510d5cd9f03dbf01e2bcf73ab072Michal Židek for (dom = rctx->domains; dom;
877b92e80bde510d5cd9f03dbf01e2bcf73ab072Michal Židek dom = get_next_domain(dom, SSS_GND_DESCEND)) {
4f118e3e6a25762f40a43e6dbefb09f44adbef32Simo Sorce if (!IS_SUBDOMAIN(dom)) {
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce diff = now - dom->subdomains_last_checked.tv_sec;
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce /* not a subdomain */
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce continue;
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce }
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce if (strcasecmp(dom->name, hint) == 0) {
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce if (diff >= rctx->domains_timeout) {
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce /* Timeout, expired, fetch domains again */
bba1a5fd62cffcae076d1351df5a83fbc4a6ec17Simo Sorce return EAGAIN;
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny }
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny }
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny }
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny }
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny return EOK;
c0f9698cd951b7223f251ff2511c4b22a6e4ba60Jan Zeleny}
909a86af4eb99f5d311d7136cab78dca535ae304Sumit Bose
0528fdec17d0031996e919fcd852459e86592c35Jakub Hrozekstruct get_domains_state {
0528fdec17d0031996e919fcd852459e86592c35Jakub Hrozek struct resp_ctx *rctx;
0528fdec17d0031996e919fcd852459e86592c35Jakub Hrozek struct sss_nc_ctx *optional_ncache;
0528fdec17d0031996e919fcd852459e86592c35Jakub Hrozek};
0528fdec17d0031996e919fcd852459e86592c35Jakub Hrozek
909a86af4eb99f5d311d7136cab78dca535ae304Sumit Bosestatic void get_domains_at_startup_done(struct tevent_req *req)
909a86af4eb99f5d311d7136cab78dca535ae304Sumit Bose{
909a86af4eb99f5d311d7136cab78dca535ae304Sumit Bose int ret;
0528fdec17d0031996e919fcd852459e86592c35Jakub Hrozek struct get_domains_state *state;
0528fdec17d0031996e919fcd852459e86592c35Jakub Hrozek
0528fdec17d0031996e919fcd852459e86592c35Jakub Hrozek state = tevent_req_callback_data(req, struct get_domains_state);
909a86af4eb99f5d311d7136cab78dca535ae304Sumit Bose
909a86af4eb99f5d311d7136cab78dca535ae304Sumit Bose ret = sss_dp_get_domains_recv(req);
909a86af4eb99f5d311d7136cab78dca535ae304Sumit Bose talloc_free(req);
909a86af4eb99f5d311d7136cab78dca535ae304Sumit Bose if (ret != EOK) {
0528fdec17d0031996e919fcd852459e86592c35Jakub Hrozek DEBUG(SSSDBG_MINOR_FAILURE, "sss_dp_get_domains request failed.\n");
909a86af4eb99f5d311d7136cab78dca535ae304Sumit Bose }
909a86af4eb99f5d311d7136cab78dca535ae304Sumit Bose
0528fdec17d0031996e919fcd852459e86592c35Jakub Hrozek if (state->optional_ncache != NULL) {
0528fdec17d0031996e919fcd852459e86592c35Jakub Hrozek ret = sss_ncache_reset_repopulate_permanent(state->rctx,
0528fdec17d0031996e919fcd852459e86592c35Jakub Hrozek state->optional_ncache);
0528fdec17d0031996e919fcd852459e86592c35Jakub Hrozek if (ret != EOK) {
0528fdec17d0031996e919fcd852459e86592c35Jakub Hrozek DEBUG(SSSDBG_MINOR_FAILURE, "sss_dp_get_domains request failed.\n");
0528fdec17d0031996e919fcd852459e86592c35Jakub Hrozek }
0528fdec17d0031996e919fcd852459e86592c35Jakub Hrozek }
0528fdec17d0031996e919fcd852459e86592c35Jakub Hrozek
0528fdec17d0031996e919fcd852459e86592c35Jakub Hrozek talloc_free(state);
909a86af4eb99f5d311d7136cab78dca535ae304Sumit Bose return;
909a86af4eb99f5d311d7136cab78dca535ae304Sumit Bose}
909a86af4eb99f5d311d7136cab78dca535ae304Sumit Bose
909a86af4eb99f5d311d7136cab78dca535ae304Sumit Bosestatic void get_domains_at_startup(struct tevent_context *ev,
909a86af4eb99f5d311d7136cab78dca535ae304Sumit Bose struct tevent_immediate *imm,
909a86af4eb99f5d311d7136cab78dca535ae304Sumit Bose void *pvt)
909a86af4eb99f5d311d7136cab78dca535ae304Sumit Bose{
909a86af4eb99f5d311d7136cab78dca535ae304Sumit Bose struct tevent_req *req;
0528fdec17d0031996e919fcd852459e86592c35Jakub Hrozek struct get_domains_state *state;
909a86af4eb99f5d311d7136cab78dca535ae304Sumit Bose
0528fdec17d0031996e919fcd852459e86592c35Jakub Hrozek state = talloc_get_type(pvt, struct get_domains_state);
909a86af4eb99f5d311d7136cab78dca535ae304Sumit Bose
0528fdec17d0031996e919fcd852459e86592c35Jakub Hrozek req = sss_dp_get_domains_send(state, state->rctx, true, NULL);
909a86af4eb99f5d311d7136cab78dca535ae304Sumit Bose if (req == NULL) {
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_OP_FAILURE, "sss_dp_get_domains_send failed.\n");
0528fdec17d0031996e919fcd852459e86592c35Jakub Hrozek talloc_free(state);
909a86af4eb99f5d311d7136cab78dca535ae304Sumit Bose return;
909a86af4eb99f5d311d7136cab78dca535ae304Sumit Bose }
909a86af4eb99f5d311d7136cab78dca535ae304Sumit Bose
0528fdec17d0031996e919fcd852459e86592c35Jakub Hrozek tevent_req_set_callback(req, get_domains_at_startup_done, state);
909a86af4eb99f5d311d7136cab78dca535ae304Sumit Bose return;
909a86af4eb99f5d311d7136cab78dca535ae304Sumit Bose}
909a86af4eb99f5d311d7136cab78dca535ae304Sumit Bose
909a86af4eb99f5d311d7136cab78dca535ae304Sumit Boseerrno_t schedule_get_domains_task(TALLOC_CTX *mem_ctx,
909a86af4eb99f5d311d7136cab78dca535ae304Sumit Bose struct tevent_context *ev,
0528fdec17d0031996e919fcd852459e86592c35Jakub Hrozek struct resp_ctx *rctx,
0528fdec17d0031996e919fcd852459e86592c35Jakub Hrozek struct sss_nc_ctx *optional_ncache)
909a86af4eb99f5d311d7136cab78dca535ae304Sumit Bose{
909a86af4eb99f5d311d7136cab78dca535ae304Sumit Bose struct tevent_immediate *imm;
0528fdec17d0031996e919fcd852459e86592c35Jakub Hrozek struct get_domains_state *state;
0528fdec17d0031996e919fcd852459e86592c35Jakub Hrozek
0528fdec17d0031996e919fcd852459e86592c35Jakub Hrozek state = talloc(mem_ctx, struct get_domains_state);
0528fdec17d0031996e919fcd852459e86592c35Jakub Hrozek if (state == NULL) {
0528fdec17d0031996e919fcd852459e86592c35Jakub Hrozek return ENOMEM;
0528fdec17d0031996e919fcd852459e86592c35Jakub Hrozek }
0528fdec17d0031996e919fcd852459e86592c35Jakub Hrozek state->rctx = rctx;
0528fdec17d0031996e919fcd852459e86592c35Jakub Hrozek state->optional_ncache = optional_ncache;
909a86af4eb99f5d311d7136cab78dca535ae304Sumit Bose
909a86af4eb99f5d311d7136cab78dca535ae304Sumit Bose imm = tevent_create_immediate(mem_ctx);
909a86af4eb99f5d311d7136cab78dca535ae304Sumit Bose if (imm == NULL) {
a3c8390d19593b1e5277d95bfb4ab206d4785150Nikolai Kondrashov DEBUG(SSSDBG_OP_FAILURE, "tevent_create_immediate failed.\n");
0528fdec17d0031996e919fcd852459e86592c35Jakub Hrozek talloc_free(state);
909a86af4eb99f5d311d7136cab78dca535ae304Sumit Bose return ENOMEM;
909a86af4eb99f5d311d7136cab78dca535ae304Sumit Bose }
909a86af4eb99f5d311d7136cab78dca535ae304Sumit Bose
0528fdec17d0031996e919fcd852459e86592c35Jakub Hrozek tevent_schedule_immediate(imm, ev, get_domains_at_startup, state);
909a86af4eb99f5d311d7136cab78dca535ae304Sumit Bose
909a86af4eb99f5d311d7136cab78dca535ae304Sumit Bose return EOK;
909a86af4eb99f5d311d7136cab78dca535ae304Sumit Bose}
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozekstruct sss_parse_inp_state {
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek struct resp_ctx *rctx;
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek const char *rawinp;
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek char *name;
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek char *domname;
28ebfa4373d1e7ce45b5d70a3619df1c074a661ePavel Březina errno_t error;
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek};
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozekstatic void sss_parse_inp_done(struct tevent_req *subreq);
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozekstruct tevent_req *
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozeksss_parse_inp_send(TALLOC_CTX *mem_ctx, struct resp_ctx *rctx,
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek const char *rawinp)
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek{
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek errno_t ret;
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek struct tevent_req *req;
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek struct tevent_req *subreq;
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek struct sss_parse_inp_state *state;
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek req = tevent_req_create(mem_ctx, &state, struct sss_parse_inp_state);
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek if (req == NULL) {
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek return NULL;
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek }
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek state->rawinp = rawinp;
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek state->rctx = rctx;
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek /* If the subdomains haven't been checked yet, we need to always
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek * attach to the post-startup subdomain request and only then parse
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek * the input. Otherwise, we might not be able to parse input with a
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek * flat domain name specifier */
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek if (rctx->get_domains_last_call.tv_sec > 0) {
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek ret = sss_parse_name_for_domains(state, rctx->domains,
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek rctx->default_domain, rawinp,
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek &state->domname, &state->name);
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek if (ret == EOK) {
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek /* Was able to use cached domains */
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek goto done;
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek } else if (ret != EAGAIN) {
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek DEBUG(SSSDBG_OP_FAILURE, "Invalid name received [%s]\n", rawinp);
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek ret = ERR_INPUT_PARSE;
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek goto done;
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek }
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek }
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek /* EAGAIN - check the DP for subdomains */
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek DEBUG(SSSDBG_FUNC_DATA, "Requesting info for [%s] from [%s]\n",
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek state->name, state->domname ? state->domname : "<ALL>");
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek /* We explicitly use force=false here. This request should decide itself
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek * if it's time to re-use the cached subdomain list or refresh. If the
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek * caller needs to specify the 'force' parameter, they should use the
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek * sss_dp_get_domains_send() request itself
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek */
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek subreq = sss_dp_get_domains_send(state, rctx, false, state->domname);
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek if (subreq == NULL) {
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek ret = ENOMEM;
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek goto done;
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek }
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek tevent_req_set_callback(subreq, sss_parse_inp_done, req);
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek return req;
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozekdone:
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek if (ret == EOK) {
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek tevent_req_done(req);
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek } else {
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek tevent_req_error(req, ret);
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek }
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek tevent_req_post(req, rctx->ev);
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek return req;
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek}
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozekstatic void sss_parse_inp_done(struct tevent_req *subreq)
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek{
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek errno_t ret;
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek struct tevent_req *req = tevent_req_callback_data(subreq,
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek struct tevent_req);
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek struct sss_parse_inp_state *state = tevent_req_data(req,
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek struct sss_parse_inp_state);
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek ret = sss_dp_get_domains_recv(subreq);
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek talloc_free(subreq);
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek if (ret != EOK) {
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek tevent_req_error(req, ret);
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek return;
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek }
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek
28ebfa4373d1e7ce45b5d70a3619df1c074a661ePavel Březina state->error = ERR_OK;
28ebfa4373d1e7ce45b5d70a3619df1c074a661ePavel Březina
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek ret = sss_parse_name_for_domains(state, state->rctx->domains,
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek state->rctx->default_domain,
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek state->rawinp,
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek &state->domname, &state->name);
28ebfa4373d1e7ce45b5d70a3619df1c074a661ePavel Březina if (ret == EAGAIN && state->domname != NULL && state->name == NULL) {
28ebfa4373d1e7ce45b5d70a3619df1c074a661ePavel Březina DEBUG(SSSDBG_OP_FAILURE,
28ebfa4373d1e7ce45b5d70a3619df1c074a661ePavel Březina "Unknown domain in [%s]\n", state->rawinp);
28ebfa4373d1e7ce45b5d70a3619df1c074a661ePavel Březina state->error = ERR_DOMAIN_NOT_FOUND;
28ebfa4373d1e7ce45b5d70a3619df1c074a661ePavel Březina } else if (ret != EOK) {
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek DEBUG(SSSDBG_OP_FAILURE,
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek "Invalid name received [%s]\n", state->rawinp);
28ebfa4373d1e7ce45b5d70a3619df1c074a661ePavel Březina state->error = ERR_INPUT_PARSE;
28ebfa4373d1e7ce45b5d70a3619df1c074a661ePavel Březina }
28ebfa4373d1e7ce45b5d70a3619df1c074a661ePavel Březina
28ebfa4373d1e7ce45b5d70a3619df1c074a661ePavel Březina if (state->error != ERR_OK) {
28ebfa4373d1e7ce45b5d70a3619df1c074a661ePavel Březina tevent_req_error(req, state->error);
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek return;
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek }
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek /* Was able to parse the name now */
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek tevent_req_done(req);
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek}
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozekerrno_t sss_parse_inp_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek char **_name, char **_domname)
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek{
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek struct sss_parse_inp_state *state = tevent_req_data(req,
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek struct sss_parse_inp_state);
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek
28ebfa4373d1e7ce45b5d70a3619df1c074a661ePavel Březina if (state->error != ERR_DOMAIN_NOT_FOUND) {
28ebfa4373d1e7ce45b5d70a3619df1c074a661ePavel Březina TEVENT_REQ_RETURN_ON_ERROR(req);
28ebfa4373d1e7ce45b5d70a3619df1c074a661ePavel Březina }
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek if (_name) {
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek *_name = talloc_steal(mem_ctx, state->name);
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek }
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek if (_domname) {
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek *_domname = talloc_steal(mem_ctx, state->domname);
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek }
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek
28ebfa4373d1e7ce45b5d70a3619df1c074a661ePavel Březina return state->error;
7caf7ed4f2eae1ec1c0717b4ee6ce78bdacd5926Jakub Hrozek}