396c651083
Required for: https://bugzilla.redhat.com/show_bug.cgi?id=1357418 - SSSD fast cache for local users
199 lines
8.6 KiB
Diff
199 lines
8.6 KiB
Diff
From 2b5704cd96a085b99d3b0d4f80f4414adc134750 Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?Pavel=20B=C5=99ezina?= <pbrezina@redhat.com>
|
|
Date: Fri, 3 Feb 2017 12:44:15 +0100
|
|
Subject: [PATCH 24/79] sss_parse_inp_send: provide default_domain as parameter
|
|
|
|
It is not always desirable to consider default_domain from configuration
|
|
but expect none instead. For example when we search host certificates.
|
|
|
|
This is currently not used in this patch since host lookups parse
|
|
name directly with sss_parse_name but it will be used in the next
|
|
patch.
|
|
|
|
Reviewed-by: Jakub Hrozek <jhrozek@redhat.com>
|
|
---
|
|
src/responder/common/cache_req/cache_req.c | 3 ++-
|
|
src/responder/common/responder.h | 5 ++++-
|
|
src/responder/common/responder_get_domains.c | 30 ++++++++++++++++++++++++----
|
|
src/responder/ifp/ifpsrv_cmd.c | 2 +-
|
|
src/tests/cmocka/common_mock_resp_dp.c | 4 +++-
|
|
src/tests/cmocka/test_responder_common.c | 12 +++++++----
|
|
6 files changed, 44 insertions(+), 12 deletions(-)
|
|
|
|
diff --git a/src/responder/common/cache_req/cache_req.c b/src/responder/common/cache_req/cache_req.c
|
|
index f546e6130a181f7b6d3fc1aca8ad0766e8a7f19d..e5026e1a869064fe81cc04e3b2bbd8c4cefec304 100644
|
|
--- a/src/responder/common/cache_req/cache_req.c
|
|
+++ b/src/responder/common/cache_req/cache_req.c
|
|
@@ -415,7 +415,8 @@ static errno_t cache_req_process_input(TALLOC_CTX *mem_ctx,
|
|
CACHE_REQ_DEBUG(SSSDBG_TRACE_FUNC, cr,
|
|
"Parsing input name [%s]\n", cr->data->name.input);
|
|
|
|
- subreq = sss_parse_inp_send(mem_ctx, cr->rctx, cr->data->name.input);
|
|
+ subreq = sss_parse_inp_send(mem_ctx, cr->rctx, cr->rctx->default_domain,
|
|
+ cr->data->name.input);
|
|
if (subreq == NULL) {
|
|
DEBUG(SSSDBG_CRIT_FAILURE, "Unable to create tevent request!\n");
|
|
return ENOMEM;
|
|
diff --git a/src/responder/common/responder.h b/src/responder/common/responder.h
|
|
index d1fa532be3402214842da50e037f5f8d149631fb..c387c6ec326c612eef8798673c1c70c67efd5452 100644
|
|
--- a/src/responder/common/responder.h
|
|
+++ b/src/responder/common/responder.h
|
|
@@ -347,8 +347,11 @@ errno_t check_allowed_uids(uid_t uid, size_t allowed_uids_count,
|
|
uid_t *allowed_uids);
|
|
|
|
struct tevent_req *
|
|
-sss_parse_inp_send(TALLOC_CTX *mem_ctx, struct resp_ctx *rctx,
|
|
+sss_parse_inp_send(TALLOC_CTX *mem_ctx,
|
|
+ struct resp_ctx *rctx,
|
|
+ const char *default_domain,
|
|
const char *rawinp);
|
|
+
|
|
errno_t sss_parse_inp_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
|
|
char **_name, char **_domname);
|
|
|
|
diff --git a/src/responder/common/responder_get_domains.c b/src/responder/common/responder_get_domains.c
|
|
index cc7b99f30046569547a08f83e46cbbe9d6c19897..0f39d107dad6c458785b1b8d708e60d7c34e3901 100644
|
|
--- a/src/responder/common/responder_get_domains.c
|
|
+++ b/src/responder/common/responder_get_domains.c
|
|
@@ -443,6 +443,7 @@ errno_t schedule_get_domains_task(TALLOC_CTX *mem_ctx,
|
|
|
|
struct sss_parse_inp_state {
|
|
struct resp_ctx *rctx;
|
|
+ const char *default_domain;
|
|
const char *rawinp;
|
|
|
|
char *name;
|
|
@@ -453,7 +454,9 @@ struct sss_parse_inp_state {
|
|
static void sss_parse_inp_done(struct tevent_req *subreq);
|
|
|
|
struct tevent_req *
|
|
-sss_parse_inp_send(TALLOC_CTX *mem_ctx, struct resp_ctx *rctx,
|
|
+sss_parse_inp_send(TALLOC_CTX *mem_ctx,
|
|
+ struct resp_ctx *rctx,
|
|
+ const char *default_domain,
|
|
const char *rawinp)
|
|
{
|
|
errno_t ret;
|
|
@@ -465,16 +468,35 @@ sss_parse_inp_send(TALLOC_CTX *mem_ctx, struct resp_ctx *rctx,
|
|
if (req == NULL) {
|
|
return NULL;
|
|
}
|
|
- state->rawinp = rawinp;
|
|
+
|
|
+ if (rawinp == NULL) {
|
|
+ DEBUG(SSSDBG_CRIT_FAILURE, "Empty input!\n");
|
|
+ ret = EINVAL;
|
|
+ goto done;
|
|
+ }
|
|
+
|
|
state->rctx = rctx;
|
|
|
|
+ state->rawinp = talloc_strdup(state, rawinp);
|
|
+ if (state->rawinp == NULL) {
|
|
+ ret = ENOMEM;
|
|
+ goto done;
|
|
+ }
|
|
+
|
|
+
|
|
+ state->default_domain = talloc_strdup(state, default_domain);
|
|
+ if (default_domain != NULL && state->default_domain == NULL) {
|
|
+ ret = ENOMEM;
|
|
+ goto done;
|
|
+ }
|
|
+
|
|
/* If the subdomains haven't been checked yet, we need to always
|
|
* attach to the post-startup subdomain request and only then parse
|
|
* the input. Otherwise, we might not be able to parse input with a
|
|
* flat domain name specifier */
|
|
if (rctx->get_domains_last_call.tv_sec > 0) {
|
|
ret = sss_parse_name_for_domains(state, rctx->domains,
|
|
- rctx->default_domain, rawinp,
|
|
+ default_domain, rawinp,
|
|
&state->domname, &state->name);
|
|
if (ret == EOK) {
|
|
/* Was able to use cached domains */
|
|
@@ -532,7 +554,7 @@ static void sss_parse_inp_done(struct tevent_req *subreq)
|
|
state->error = ERR_OK;
|
|
|
|
ret = sss_parse_name_for_domains(state, state->rctx->domains,
|
|
- state->rctx->default_domain,
|
|
+ state->default_domain,
|
|
state->rawinp,
|
|
&state->domname, &state->name);
|
|
if (ret == EAGAIN && state->domname != NULL && state->name == NULL) {
|
|
diff --git a/src/responder/ifp/ifpsrv_cmd.c b/src/responder/ifp/ifpsrv_cmd.c
|
|
index 23f410a19ea985b4fcfcf34a770d37ea9a864e67..07edcddffa1091f8bbcf79a25962aadc791bb890 100644
|
|
--- a/src/responder/ifp/ifpsrv_cmd.c
|
|
+++ b/src/responder/ifp/ifpsrv_cmd.c
|
|
@@ -453,7 +453,7 @@ ifp_user_get_attr_send(TALLOC_CTX *mem_ctx, struct resp_ctx *rctx,
|
|
state->ncache = ncache;
|
|
state->search_type = search_type;
|
|
|
|
- subreq = sss_parse_inp_send(req, rctx, inp);
|
|
+ subreq = sss_parse_inp_send(req, rctx, rctx->default_domain, inp);
|
|
if (subreq == NULL) {
|
|
ret = ENOMEM;
|
|
goto done;
|
|
diff --git a/src/tests/cmocka/common_mock_resp_dp.c b/src/tests/cmocka/common_mock_resp_dp.c
|
|
index f62606eb8a33b6417bbd32a7dccdbeaabd05818f..0b6870346c00954a3e2accf8f21625a14da8afb5 100644
|
|
--- a/src/tests/cmocka/common_mock_resp_dp.c
|
|
+++ b/src/tests/cmocka/common_mock_resp_dp.c
|
|
@@ -80,7 +80,9 @@ void mock_account_recv_simple(void)
|
|
}
|
|
|
|
struct tevent_req *
|
|
-sss_parse_inp_send(TALLOC_CTX *mem_ctx, struct resp_ctx *rctx,
|
|
+sss_parse_inp_send(TALLOC_CTX *mem_ctx,
|
|
+ struct resp_ctx *rctx,
|
|
+ const char *default_domain,
|
|
const char *rawinp)
|
|
{
|
|
return test_req_succeed_send(mem_ctx, rctx->ev);
|
|
diff --git a/src/tests/cmocka/test_responder_common.c b/src/tests/cmocka/test_responder_common.c
|
|
index b25f8a8efcded664ed61be4d5a67b0f2e3adf327..fb7e4ee500570319999e6e85ee14a05cddea8de3 100644
|
|
--- a/src/tests/cmocka/test_responder_common.c
|
|
+++ b/src/tests/cmocka/test_responder_common.c
|
|
@@ -192,7 +192,8 @@ void parse_inp_simple(void **state)
|
|
|
|
will_return(__wrap_sss_parse_name_for_domains, WRAP_CALL_REAL);
|
|
|
|
- req = sss_parse_inp_send(parse_inp_ctx, parse_inp_ctx->rctx, NAME);
|
|
+ req = sss_parse_inp_send(parse_inp_ctx, parse_inp_ctx->rctx,
|
|
+ parse_inp_ctx->rctx->default_domain, NAME);
|
|
assert_non_null(req);
|
|
tevent_req_set_callback(req, parse_inp_simple_done, parse_inp_ctx);
|
|
|
|
@@ -213,7 +214,8 @@ void parse_inp_call_dp(void **state)
|
|
/* The second one will succeed as the domains are up-to-date */
|
|
will_return(__wrap_sss_parse_name_for_domains, WRAP_CALL_REAL);
|
|
|
|
- req = sss_parse_inp_send(parse_inp_ctx, parse_inp_ctx->rctx, NAME);
|
|
+ req = sss_parse_inp_send(parse_inp_ctx, parse_inp_ctx->rctx,
|
|
+ parse_inp_ctx->rctx->default_domain, NAME);
|
|
assert_non_null(req);
|
|
tevent_req_set_callback(req, parse_inp_simple_done, parse_inp_ctx);
|
|
|
|
@@ -235,7 +237,8 @@ void parse_inp_call_attach(void **state)
|
|
* as the domains are up-to-date */
|
|
will_return(__wrap_sss_parse_name_for_domains, WRAP_CALL_REAL);
|
|
|
|
- req = sss_parse_inp_send(parse_inp_ctx, parse_inp_ctx->rctx, NAME);
|
|
+ req = sss_parse_inp_send(parse_inp_ctx, parse_inp_ctx->rctx,
|
|
+ parse_inp_ctx->rctx->default_domain, NAME);
|
|
assert_non_null(req);
|
|
tevent_req_set_callback(req, parse_inp_simple_done, parse_inp_ctx);
|
|
|
|
@@ -271,7 +274,8 @@ void parse_inp_call_neg(void **state)
|
|
will_return(__wrap_sss_parse_name_for_domains, WRAP_CALL_WRAPPER);
|
|
will_return(__wrap_sss_parse_name_for_domains, EINVAL);
|
|
|
|
- req = sss_parse_inp_send(parse_inp_ctx, parse_inp_ctx->rctx, NAME);
|
|
+ req = sss_parse_inp_send(parse_inp_ctx, parse_inp_ctx->rctx,
|
|
+ parse_inp_ctx->rctx->default_domain, NAME);
|
|
assert_non_null(req);
|
|
tevent_req_set_callback(req, parse_inp_neg_done, parse_inp_ctx);
|
|
|
|
--
|
|
2.9.3
|
|
|