sssd/0024-sss_parse_inp_send-provide-default_domain-as-paramet.patch
2017-02-28 16:54:33 +01:00

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