Blame SOURCES/0080-CACHE_REQ-Add-a-private-request-cache_req_locate_dom.patch

9f2ebf
From d30dd0f52d452562e47f9a30b1630eff2f817792 Mon Sep 17 00:00:00 2001
9f2ebf
From: Jakub Hrozek <jhrozek@redhat.com>
9f2ebf
Date: Mon, 30 Oct 2017 20:21:05 +0100
9f2ebf
Subject: [PATCH 80/83] CACHE_REQ: Add a private request
9f2ebf
 cache_req_locate_domain()
9f2ebf
MIME-Version: 1.0
9f2ebf
Content-Type: text/plain; charset=UTF-8
9f2ebf
Content-Transfer-Encoding: 8bit
9f2ebf
9f2ebf
Adds a new request cache_req_locate_domain_send/recv. This request, if the
9f2ebf
plugin that is being processed supports the locator, will call the plugin's
9f2ebf
dp_get_domain_send_fn(). On any error, the request returns just the error
9f2ebf
code. On success, the request returns the domain the object was found at.
9f2ebf
9f2ebf
If the getAccountDomain() method returns that the back end does not support
9f2ebf
the locator method, all further getAccountDomain() calls are disabled for
9f2ebf
that domain.
9f2ebf
9f2ebf
Related:
9f2ebf
https://pagure.io/SSSD/sssd/issue/3468
9f2ebf
9f2ebf
Reviewed-by: Pavel Březina <pbrezina@redhat.com>
9f2ebf
Reviewed-by: Sumit Bose <sbose@redhat.com>
9f2ebf
(cherry picked from commit 0a0b34f5fbe8f4a8c533a7d65f0f2961ee264054)
9f2ebf
---
9f2ebf
 src/responder/common/cache_req/cache_req_private.h |  7 ++
9f2ebf
 src/responder/common/cache_req/cache_req_search.c  | 93 ++++++++++++++++++++++
9f2ebf
 src/util/util_errors.c                             |  1 +
9f2ebf
 src/util/util_errors.h                             |  1 +
9f2ebf
 4 files changed, 102 insertions(+)
9f2ebf
9f2ebf
diff --git a/src/responder/common/cache_req/cache_req_private.h b/src/responder/common/cache_req/cache_req_private.h
9f2ebf
index a156fc65fed80693cdd0473613aeaaa3f5bb2269..9586e3788045ff44eb2a4b626dc7fcaf11ec8028 100644
9f2ebf
--- a/src/responder/common/cache_req/cache_req_private.h
9f2ebf
+++ b/src/responder/common/cache_req/cache_req_private.h
9f2ebf
@@ -106,6 +106,13 @@ errno_t cache_req_search_recv(TALLOC_CTX *mem_ctx,
9f2ebf
                               struct ldb_result **_result,
9f2ebf
                               bool *_dp_success);
9f2ebf
 
9f2ebf
+struct tevent_req *cache_req_locate_domain_send(TALLOC_CTX *mem_ctx,
9f2ebf
+                                                struct tevent_context *ev,
9f2ebf
+                                                struct cache_req *cr);
9f2ebf
+errno_t cache_req_locate_domain_recv(TALLOC_CTX *mem_ctx,
9f2ebf
+                                     struct tevent_req *req,
9f2ebf
+                                     char **_found_domain);
9f2ebf
+
9f2ebf
 struct tevent_req *
9f2ebf
 cache_req_steal_data_and_send(TALLOC_CTX *mem_ctx,
9f2ebf
                               struct tevent_context *ev,
9f2ebf
diff --git a/src/responder/common/cache_req/cache_req_search.c b/src/responder/common/cache_req/cache_req_search.c
9f2ebf
index 9d5ad8056cda0284b1cc32cd51d7cb0ec12ad667..3365962d473b0982945de2541e44ba86b43a0db5 100644
9f2ebf
--- a/src/responder/common/cache_req/cache_req_search.c
9f2ebf
+++ b/src/responder/common/cache_req/cache_req_search.c
9f2ebf
@@ -485,3 +485,96 @@ errno_t cache_req_search_recv(TALLOC_CTX *mem_ctx,
9f2ebf
 
9f2ebf
     return EOK;
9f2ebf
 }
9f2ebf
+
9f2ebf
+struct cache_req_locate_domain_state {
9f2ebf
+    struct cache_req *cr;
9f2ebf
+
9f2ebf
+    char *found_domain;
9f2ebf
+};
9f2ebf
+
9f2ebf
+static void cache_req_locate_domain_done(struct tevent_req *subreq);
9f2ebf
+
9f2ebf
+struct tevent_req *cache_req_locate_domain_send(TALLOC_CTX *mem_ctx,
9f2ebf
+                                                struct tevent_context *ev,
9f2ebf
+                                                struct cache_req *cr)
9f2ebf
+{
9f2ebf
+    struct cache_req_locate_domain_state *state;
9f2ebf
+    struct tevent_req *req;
9f2ebf
+    struct tevent_req *subreq;
9f2ebf
+    errno_t ret;
9f2ebf
+    bool should_run;
9f2ebf
+
9f2ebf
+    req = tevent_req_create(mem_ctx, &state, struct cache_req_locate_domain_state);
9f2ebf
+    if (req == NULL) {
9f2ebf
+        DEBUG(SSSDBG_CRIT_FAILURE, "tevent_req_create() failed\n");
9f2ebf
+        return NULL;
9f2ebf
+    }
9f2ebf
+    state->cr = cr;
9f2ebf
+
9f2ebf
+    should_run = cr->plugin->dp_get_domain_check_fn(cr->rctx,
9f2ebf
+                                                    get_domains_head(cr->domain),
9f2ebf
+                                                    cr->data);
9f2ebf
+    if (should_run == false) {
9f2ebf
+        /* The request was tried too recently, don't issue a new one
9f2ebf
+         * as its results are still valid
9f2ebf
+         */
9f2ebf
+        ret = ERR_GET_ACCT_DOM_CACHED;
9f2ebf
+        goto immediate;
9f2ebf
+    }
9f2ebf
+
9f2ebf
+    subreq = cr->plugin->dp_get_domain_send_fn(state,
9f2ebf
+                                               cr->rctx,
9f2ebf
+                                               get_domains_head(cr->domain),
9f2ebf
+                                               cr->data);
9f2ebf
+    if (subreq == NULL) {
9f2ebf
+        ret = ENOMEM;
9f2ebf
+        goto immediate;
9f2ebf
+    }
9f2ebf
+    tevent_req_set_callback(subreq, cache_req_locate_domain_done, req);
9f2ebf
+    return req;
9f2ebf
+
9f2ebf
+immediate:
9f2ebf
+    if (ret == EOK) {
9f2ebf
+        tevent_req_done(req);
9f2ebf
+    } else {
9f2ebf
+        tevent_req_error(req, ret);
9f2ebf
+    }
9f2ebf
+    tevent_req_post(req, ev);
9f2ebf
+    return req;
9f2ebf
+}
9f2ebf
+
9f2ebf
+static void cache_req_locate_domain_done(struct tevent_req *subreq)
9f2ebf
+{
9f2ebf
+    struct tevent_req *req;
9f2ebf
+    struct cache_req_locate_domain_state *state;
9f2ebf
+    errno_t ret;
9f2ebf
+
9f2ebf
+    req = tevent_req_callback_data(subreq, struct tevent_req);
9f2ebf
+    state = tevent_req_data(req, struct cache_req_locate_domain_state);
9f2ebf
+
9f2ebf
+    ret = state->cr->plugin->dp_get_domain_recv_fn(state,
9f2ebf
+                                                   subreq,
9f2ebf
+                                                   state->cr,
9f2ebf
+                                                   &state->found_domain);
9f2ebf
+    talloc_zfree(subreq);
9f2ebf
+    if (ret != EOK) {
9f2ebf
+        tevent_req_error(req, ret);
9f2ebf
+        return;
9f2ebf
+    }
9f2ebf
+
9f2ebf
+    tevent_req_done(req);
9f2ebf
+}
9f2ebf
+
9f2ebf
+errno_t cache_req_locate_domain_recv(TALLOC_CTX *mem_ctx,
9f2ebf
+                                     struct tevent_req *req,
9f2ebf
+                                     char **_found_domain)
9f2ebf
+{
9f2ebf
+    struct cache_req_locate_domain_state *state = NULL;
9f2ebf
+
9f2ebf
+    state = tevent_req_data(req, struct cache_req_locate_domain_state);
9f2ebf
+
9f2ebf
+    TEVENT_REQ_RETURN_ON_ERROR(req);
9f2ebf
+
9f2ebf
+    *_found_domain = talloc_steal(mem_ctx, state->found_domain);
9f2ebf
+    return EOK;
9f2ebf
+}
9f2ebf
diff --git a/src/util/util_errors.c b/src/util/util_errors.c
9f2ebf
index 9a9ba3f3063cab4afb538c3a58527a2d2ed3fffd..06c620b40aaa00d6ce58ace3a28449ffbdf8da88 100644
9f2ebf
--- a/src/util/util_errors.c
9f2ebf
+++ b/src/util/util_errors.c
9f2ebf
@@ -116,6 +116,7 @@ struct err_string error_to_str[] = {
9f2ebf
     { "Unable to verify peer" }, /* ERR_UNABLE_TO_VERIFY_PEER */
9f2ebf
     { "Unable to resolve host" }, /* ERR_UNABLE_TO_RESOLVE_HOST */
9f2ebf
     { "GetAccountDomain() not supported" }, /* ERR_GET_ACCT_DOM_NOT_SUPPORTED */
9f2ebf
+    { "The last GetAccountDomain() result is still valid" }, /* ERR_GET_ACCT_DOM_CACHED */
9f2ebf
     { "ERR_LAST" } /* ERR_LAST */
9f2ebf
 };
9f2ebf
 
9f2ebf
diff --git a/src/util/util_errors.h b/src/util/util_errors.h
9f2ebf
index 5ee9862c3f2f60c078693b1b85a40f15436e818c..bebd6e198fc0077891a602f80182a993ce3f789b 100644
9f2ebf
--- a/src/util/util_errors.h
9f2ebf
+++ b/src/util/util_errors.h
9f2ebf
@@ -138,6 +138,7 @@ enum sssd_errors {
9f2ebf
     ERR_UNABLE_TO_VERIFY_PEER,
9f2ebf
     ERR_UNABLE_TO_RESOLVE_HOST,
9f2ebf
     ERR_GET_ACCT_DOM_NOT_SUPPORTED,
9f2ebf
+    ERR_GET_ACCT_DOM_CACHED,
9f2ebf
     ERR_LAST            /* ALWAYS LAST */
9f2ebf
 };
9f2ebf
 
9f2ebf
-- 
9f2ebf
2.14.3
9f2ebf