URL: https://github.com/SSSD/sssd/pull/127 Author: pbrezina Title: #127: ssh: use cache_req Action: synchronized
To pull the PR as Git branch: git remote add ghsssd https://github.com/SSSD/sssd git fetch ghsssd pull/127/head:pr127 git checkout pr127
From 557f79ba99251ce16b4e29b33a07de60eef01252 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavel=20B=C5=99ezina?= <[email protected]> Date: Tue, 17 Jan 2017 12:00:31 +0100 Subject: [PATCH 1/6] ssh: fix number of output certificates All certificate are added into result so we should use addition here. --- src/responder/ssh/sshsrv_cmd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/responder/ssh/sshsrv_cmd.c b/src/responder/ssh/sshsrv_cmd.c index 2e64893..bd6270d 100644 --- a/src/responder/ssh/sshsrv_cmd.c +++ b/src/responder/ssh/sshsrv_cmd.c @@ -1012,7 +1012,7 @@ ssh_cmd_build_reply(struct ssh_cmd_ctx *cmd_ctx) el_orig = ldb_msg_find_element(cmd_ctx->result, ORIGINALAD_PREFIX SYSDB_SSH_PUBKEY); if (el_orig) { - count = el_orig->num_values; + count += el_orig->num_values; } if (DOM_HAS_VIEWS(cmd_ctx->domain)) { From 8dbfe2e0025606e79ea5a1e28046c7a04df6d47d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavel=20B=C5=99ezina?= <[email protected]> Date: Tue, 17 Jan 2017 11:58:06 +0100 Subject: [PATCH 2/6] ssh: do not create again fq name We have already qualified name in sysdb so there is not need to append the domain part. --- src/responder/ssh/sshsrv_cmd.c | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/src/responder/ssh/sshsrv_cmd.c b/src/responder/ssh/sshsrv_cmd.c index bd6270d..195d576 100644 --- a/src/responder/ssh/sshsrv_cmd.c +++ b/src/responder/ssh/sshsrv_cmd.c @@ -982,8 +982,7 @@ ssh_cmd_build_reply(struct ssh_cmd_ctx *cmd_ctx) struct ldb_message_element *el_user_cert_keys = NULL; uint32_t count = 0; const char *name; - char *fqname; - uint32_t fqname_len; + uint32_t name_len; TALLOC_CTX *tmp_ctx; struct ssh_ctx *ssh_ctx; struct cli_protocol *pctx; @@ -1060,38 +1059,31 @@ ssh_cmd_build_reply(struct ssh_cmd_ctx *cmd_ctx) goto done; } - fqname = talloc_asprintf(cmd_ctx, "%s@%s", - name, cmd_ctx->domain->name); - if (!fqname) { - ret = ENOMEM; - goto done; - } - - fqname_len = strlen(fqname)+1; + name_len = strlen(name) + 1; ret = decode_and_add_base64_data(cmd_ctx, el, false, ssh_ctx, - fqname_len, fqname, &c); + name_len, name, &c); if (ret != EOK) { DEBUG(SSSDBG_OP_FAILURE, "decode_and_add_base64_data failed.\n"); goto done; } ret = decode_and_add_base64_data(cmd_ctx, el_orig, false, ssh_ctx, - fqname_len, fqname, &c); + name_len, name, &c); if (ret != EOK) { DEBUG(SSSDBG_OP_FAILURE, "decode_and_add_base64_data failed.\n"); goto done; } ret = decode_and_add_base64_data(cmd_ctx, el_override, false, ssh_ctx, - fqname_len, fqname, &c); + name_len, name, &c); if (ret != EOK) { DEBUG(SSSDBG_OP_FAILURE, "decode_and_add_base64_data failed.\n"); goto done; } ret = decode_and_add_base64_data(cmd_ctx, el_user_cert_keys, true, ssh_ctx, - fqname_len, fqname, &c); + name_len, name, &c); if (ret != EOK) { DEBUG(SSSDBG_OP_FAILURE, "decode_and_add_base64_data failed.\n"); goto done; From b639cf98160271dff76676ba7117fc186c3f6cc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavel=20B=C5=99ezina?= <[email protected]> Date: Wed, 11 Jan 2017 11:36:50 +0100 Subject: [PATCH 3/6] cache_req: search user by name with attrs --- src/responder/common/cache_req/cache_req.h | 13 +++++++++ .../cache_req/plugins/cache_req_user_by_name.c | 31 ++++++++++++++++++++-- 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/src/responder/common/cache_req/cache_req.h b/src/responder/common/cache_req/cache_req.h index 7700091..2740c21 100644 --- a/src/responder/common/cache_req/cache_req.h +++ b/src/responder/common/cache_req/cache_req.h @@ -186,6 +186,19 @@ cache_req_user_by_name_send(TALLOC_CTX *mem_ctx, cache_req_single_domain_recv(mem_ctx, req, _result) struct tevent_req * +cache_req_user_by_name_attrs_send(TALLOC_CTX *mem_ctx, + struct tevent_context *ev, + struct resp_ctx *rctx, + struct sss_nc_ctx *ncache, + int cache_refresh_percent, + const char *domain, + const char *name, + const char **attrs); + +#define cache_req_user_by_name_attrs_recv(mem_ctx, req, _result) \ + cache_req_single_domain_recv(mem_ctx, req, _result) + +struct tevent_req * cache_req_user_by_id_send(TALLOC_CTX *mem_ctx, struct tevent_context *ev, struct resp_ctx *rctx, diff --git a/src/responder/common/cache_req/plugins/cache_req_user_by_name.c b/src/responder/common/cache_req/plugins/cache_req_user_by_name.c index 46dd943..540ee70 100644 --- a/src/responder/common/cache_req/plugins/cache_req_user_by_name.c +++ b/src/responder/common/cache_req/plugins/cache_req_user_by_name.c @@ -105,8 +105,13 @@ cache_req_user_by_name_lookup(TALLOC_CTX *mem_ctx, struct sss_domain_info *domain, struct ldb_result **_result) { - return sysdb_getpwnam_with_views(mem_ctx, domain, data->name.lookup, - _result); + if (data->attrs == NULL) { + return sysdb_getpwnam_with_views(mem_ctx, domain, data->name.lookup, + _result); + } + + return sysdb_get_user_attr_with_views(mem_ctx, domain, data->name.lookup, + data->attrs, _result); } static errno_t @@ -195,3 +200,25 @@ cache_req_user_by_name_send(TALLOC_CTX *mem_ctx, return cache_req_steal_data_and_send(mem_ctx, ev, rctx, ncache, cache_refresh_percent, domain, data); } + +struct tevent_req * +cache_req_user_by_name_attrs_send(TALLOC_CTX *mem_ctx, + struct tevent_context *ev, + struct resp_ctx *rctx, + struct sss_nc_ctx *ncache, + int cache_refresh_percent, + const char *domain, + const char *name, + const char **attrs) +{ + struct cache_req_data *data; + + data = cache_req_data_name_attrs(mem_ctx, CACHE_REQ_USER_BY_NAME, + name, attrs); + if (data == NULL) { + return NULL; + } + + return cache_req_steal_data_and_send(mem_ctx, ev, rctx, ncache, + cache_refresh_percent, domain, data); +} From fe079d28f3a886262cbd515a50548c6a445d776e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavel=20B=C5=99ezina?= <[email protected]> Date: Tue, 17 Jan 2017 14:11:32 +0100 Subject: [PATCH 4/6] cache_req: add api to create ldb_result from message --- src/responder/common/cache_req/cache_req.c | 47 ++++++++++++++++++------------ 1 file changed, 28 insertions(+), 19 deletions(-) diff --git a/src/responder/common/cache_req/cache_req.c b/src/responder/common/cache_req/cache_req.c index f546e61..ec39118 100644 --- a/src/responder/common/cache_req/cache_req.c +++ b/src/responder/common/cache_req/cache_req.c @@ -78,7 +78,6 @@ static errno_t cache_req_set_plugin(struct cache_req *cr, } cr->reqname = plugin->name; - cr->dp_type = plugin->dp_type; cr->plugin = plugin; CACHE_REQ_DEBUG(SSSDBG_TRACE_INTERNAL, cr, "Setting \"%s\" plugin\n", @@ -813,16 +812,11 @@ cache_req_create_result(TALLOC_CTX *mem_ctx, return result; } -struct cache_req_result * -cache_req_create_result_from_msg(TALLOC_CTX *mem_ctx, - struct sss_domain_info *domain, - struct ldb_message *ldb_msg, - const char *lookup_name, - const char *well_known_domain) +struct ldb_result * +cache_req_create_ldb_result_from_msg(TALLOC_CTX *mem_ctx, + struct ldb_message *ldb_msg) { - struct cache_req_result *result; struct ldb_result *ldb_result; - errno_t ret; if (ldb_msg == NULL) { DEBUG(SSSDBG_CRIT_FAILURE, "No message set!\n"); @@ -840,23 +834,38 @@ cache_req_create_result_from_msg(TALLOC_CTX *mem_ctx, ldb_result->count = 1; ldb_result->msgs = talloc_zero_array(ldb_result, struct ldb_message *, 2); if (ldb_result->msgs == NULL) { - ret = ENOMEM; - goto done; + talloc_free(ldb_result); + return NULL; } ldb_result->msgs[0] = talloc_steal(ldb_result->msgs, ldb_msg); - result = cache_req_create_result(mem_ctx, domain, ldb_result, - lookup_name, well_known_domain); - if (result == NULL) { - ret = ENOMEM; - goto done; + return ldb_result; +} + +struct cache_req_result * +cache_req_create_result_from_msg(TALLOC_CTX *mem_ctx, + struct sss_domain_info *domain, + struct ldb_message *ldb_msg, + const char *lookup_name, + const char *well_known_domain) +{ + struct cache_req_result *result; + struct ldb_result *ldb_result; + + if (ldb_msg == NULL) { + DEBUG(SSSDBG_CRIT_FAILURE, "No message set!\n"); + return NULL; } - ret = EOK; + ldb_result = cache_req_create_ldb_result_from_msg(mem_ctx, ldb_msg); + if (ldb_result == NULL) { + return NULL; + } -done: - if (ret != EOK) { + result = cache_req_create_result(mem_ctx, domain, ldb_result, + lookup_name, well_known_domain); + if (result == NULL) { talloc_free(ldb_result); return NULL; } From 1818049241333071708dbf2929217149be69d26a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavel=20B=C5=99ezina?= <[email protected]> Date: Tue, 17 Jan 2017 14:11:58 +0100 Subject: [PATCH 5/6] cache_req: move dp request to plugin This will allow to use cache req even for object that do not use account request such as hosts. --- src/responder/common/cache_req/cache_req_plugin.h | 39 ++++---- src/responder/common/cache_req/cache_req_private.h | 13 ++- src/responder/common/cache_req/cache_req_search.c | 106 ++++----------------- .../common/cache_req/plugins/cache_req_common.c | 40 ++++++++ .../cache_req/plugins/cache_req_enum_groups.c | 24 ++--- .../common/cache_req/plugins/cache_req_enum_svc.c | 24 ++--- .../cache_req/plugins/cache_req_enum_users.c | 24 ++--- .../cache_req/plugins/cache_req_group_by_filter.c | 25 +++-- .../cache_req/plugins/cache_req_group_by_id.c | 26 ++++- .../cache_req/plugins/cache_req_group_by_name.c | 26 ++++- .../plugins/cache_req_initgroups_by_name.c | 26 ++++- .../plugins/cache_req_initgroups_by_upn.c | 25 +++-- .../cache_req/plugins/cache_req_netgroup_by_name.c | 25 +++-- .../cache_req/plugins/cache_req_object_by_id.c | 25 +++-- .../cache_req/plugins/cache_req_object_by_name.c | 25 +++-- .../cache_req/plugins/cache_req_object_by_sid.c | 24 ++--- .../cache_req/plugins/cache_req_svc_by_name.c | 25 +++-- .../cache_req/plugins/cache_req_svc_by_port.c | 25 +++-- .../cache_req/plugins/cache_req_user_by_cert.c | 24 ++--- .../cache_req/plugins/cache_req_user_by_filter.c | 25 +++-- .../cache_req/plugins/cache_req_user_by_id.c | 26 ++++- .../cache_req/plugins/cache_req_user_by_name.c | 26 ++++- .../cache_req/plugins/cache_req_user_by_upn.c | 25 +++-- src/tests/cmocka/common_mock_resp_dp.c | 31 +++++- src/tests/cmocka/test_responder_cache_req.c | 28 +++--- 25 files changed, 400 insertions(+), 332 deletions(-) diff --git a/src/responder/common/cache_req/cache_req_plugin.h b/src/responder/common/cache_req/cache_req_plugin.h index e4d5eef..7b0c489 100644 --- a/src/responder/common/cache_req/cache_req_plugin.h +++ b/src/responder/common/cache_req/cache_req_plugin.h @@ -117,18 +117,29 @@ typedef errno_t struct ldb_result **_result); /** - * Return parameters for Data Provider request. + * Send Data Provider request. * - * @return EOK If everything went fine. - * @return Other errno code in case of an error. + * @return Tevent request on success. + * @return NULL on error. */ -typedef errno_t -(*cache_req_dpreq_params_fn)(TALLOC_CTX *mem_ctx, - struct cache_req *cr, - struct ldb_result *result, - const char **_string, - uint32_t *_id, - const char **_flag); +typedef struct tevent_req * +(*cache_req_dp_send_fn)(TALLOC_CTX *mem_ctx, + struct cache_req *cr, + struct cache_req_data *data, + struct sss_domain_info *domain, + struct ldb_result *result); + +/** + * Process result of Data Provider request. + * + * Do not free subreq! It will be freed in the caller. + * + * @return True if data provider request succeeded. + * @return False if there was an error. + */ +typedef bool +(*cache_req_dp_recv_fn)(struct tevent_req *subreq, + struct cache_req *cr); struct cache_req_plugin { /** @@ -137,11 +148,6 @@ struct cache_req_plugin { const char *name; /** - * Data provider request type. - */ - enum sss_dp_acct_type dp_type; - - /** * Expiration timestamp attribute name. */ const char *attr_expiration; @@ -197,7 +203,8 @@ struct cache_req_plugin { cache_req_ncache_check_fn ncache_check_fn; cache_req_ncache_add_fn ncache_add_fn; cache_req_lookup_fn lookup_fn; - cache_req_dpreq_params_fn dpreq_params_fn; + cache_req_dp_send_fn dp_send_fn; + cache_req_dp_recv_fn dp_recv_fn; }; extern const struct cache_req_plugin cache_req_user_by_name; diff --git a/src/responder/common/cache_req/cache_req_private.h b/src/responder/common/cache_req/cache_req_private.h index e79fe86..b544b73 100644 --- a/src/responder/common/cache_req/cache_req_private.h +++ b/src/responder/common/cache_req/cache_req_private.h @@ -38,11 +38,6 @@ struct cache_req { struct sss_nc_ctx *ncache; int midpoint; - /* Data Provider request type resolved from @type. - * FIXME: This is currently needed for data provider calls. We should - * refactor responder_dp.c to get rid of this member. */ - enum sss_dp_acct_type dp_type; - /* Domain related informations. */ struct sss_domain_info *domain; @@ -116,6 +111,10 @@ cache_req_create_result(TALLOC_CTX *mem_ctx, const char *lookup_name, const char *well_known_domain); +struct ldb_result * +cache_req_create_ldb_result_from_msg(TALLOC_CTX *mem_ctx, + struct ldb_message *ldb_msg); + struct cache_req_result * cache_req_create_result_from_msg(TALLOC_CTX *mem_ctx, struct sss_domain_info *domain, @@ -132,4 +131,8 @@ cache_req_well_known_sid_result(TALLOC_CTX *mem_ctx, const char *sid, const char *name); +bool +cache_req_common_dp_recv(struct tevent_req *subreq, + struct cache_req *cr); + #endif /* _CACHE_REQ_PRIVATE_H_ */ diff --git a/src/responder/common/cache_req/cache_req_search.c b/src/responder/common/cache_req/cache_req_search.c index aabff38..eed82cf 100644 --- a/src/responder/common/cache_req/cache_req_search.c +++ b/src/responder/common/cache_req/cache_req_search.c @@ -138,70 +138,6 @@ static errno_t cache_req_search_cache(TALLOC_CTX *mem_ctx, return ret; } -static errno_t cache_req_dpreq_params(TALLOC_CTX *mem_ctx, - struct cache_req *cr, - struct ldb_result *result, - const char **_string, - uint32_t *_id, - const char **_flag) -{ - errno_t ret; - - if (cr->plugin->dpreq_params_fn == NULL) { - CACHE_REQ_DEBUG(SSSDBG_CRIT_FAILURE, cr, - "Bug: No dpreq params function specified\n"); - return ERR_INTERNAL; - } - - - CACHE_REQ_DEBUG(SSSDBG_TRACE_INTERNAL, cr, - "Creating DP request parameters\n"); - - ret = cr->plugin->dpreq_params_fn(mem_ctx, cr, result, _string, _id, _flag); - if (ret != EOK) { - CACHE_REQ_DEBUG(SSSDBG_CRIT_FAILURE, cr, - "Unable to create DP request parameters [%d]: %s\n", - ret, sss_strerror(ret)); - return ret; - } - - return EOK; -} - -static bool cache_req_search_process_dp(TALLOC_CTX *mem_ctx, - struct tevent_req *subreq, - struct cache_req *cr) -{ - char *err_msg; - dbus_uint16_t err_maj; - dbus_uint32_t err_min; - errno_t ret; - - ret = sss_dp_get_account_recv(mem_ctx, subreq, &err_maj, &err_min, &err_msg); - talloc_zfree(subreq); - if (ret != EOK) { - CACHE_REQ_DEBUG(SSSDBG_OP_FAILURE, cr, - "Could not get account info [%d]: %s\n", - ret, sss_strerror(ret)); - CACHE_REQ_DEBUG(SSSDBG_TRACE_FUNC, cr, - "Due to an error we will return cached data\n"); - - return false; - } - - if (err_maj) { - CACHE_REQ_DEBUG(SSSDBG_OP_FAILURE, cr, - "Data Provider Error: %u, %u, %s\n", - (unsigned int)err_maj, (unsigned int)err_min, err_msg); - CACHE_REQ_DEBUG(SSSDBG_TRACE_FUNC, cr, - "Due to an error we will return cached data\n"); - - return false; - } - - return true; -} - static enum cache_object_status cache_req_expiration_status(struct cache_req *cr, struct ldb_result *result) @@ -316,19 +252,10 @@ static errno_t cache_req_search_dp(struct tevent_req *req, { struct cache_req_search_state *state; struct tevent_req *subreq; - const char *extra_flag; - const char *search_str; - uint32_t search_id; errno_t ret; state = tevent_req_data(req, struct cache_req_search_state); - ret = cache_req_dpreq_params(state, state->cr, state->result, - &search_str, &search_id, &extra_flag); - if (ret != EOK) { - return ret; - } - switch (status) { case CACHE_OBJECT_MIDPOINT: /* Out of band update. The calling function will return the cached @@ -339,10 +266,10 @@ static errno_t cache_req_search_dp(struct tevent_req *req, "Performing midpoint cache update of [%s]\n", state->cr->debugobj); - subreq = sss_dp_get_account_send(state->cr->rctx, state->cr->rctx, - state->cr->domain, true, - state->cr->dp_type, - search_str, search_id, extra_flag); + subreq = state->cr->plugin->dp_send_fn(state->cr, state->cr, + state->cr->data, + state->cr->domain, + state->result); if (subreq == NULL) { DEBUG(SSSDBG_CRIT_FAILURE, "Out of memory sending out-of-band " "data provider request\n"); @@ -351,31 +278,37 @@ static errno_t cache_req_search_dp(struct tevent_req *req, tevent_req_set_callback(subreq, cache_req_search_oob_done, req); } - return EOK; + ret = EOK; + break; case CACHE_OBJECT_EXPIRED: case CACHE_OBJECT_MISSING: CACHE_REQ_DEBUG(SSSDBG_TRACE_FUNC, state->cr, "Looking up [%s] in data provider\n", state->cr->debugobj); - subreq = sss_dp_get_account_send(state, state->cr->rctx, - state->cr->domain, true, - state->cr->dp_type, - search_str, search_id, extra_flag); + subreq = state->cr->plugin->dp_send_fn(state->cr, state->cr, + state->cr->data, + state->cr->domain, + state->result); if (subreq == NULL) { DEBUG(SSSDBG_CRIT_FAILURE, "Out of memory sending data provider request\n"); - return ENOMEM; + ret = ENOMEM; + break; } tevent_req_set_callback(subreq, cache_req_search_done, req); - return EAGAIN; + ret = EAGAIN; + break; default: /* error */ CACHE_REQ_DEBUG(SSSDBG_CRIT_FAILURE, state->cr, "Unexpected status [%d]\n", status); - return ret; + ret = ERR_INTERNAL; + break; } + + return ret; } static void cache_req_search_oob_done(struct tevent_req *subreq) @@ -395,7 +328,8 @@ static void cache_req_search_done(struct tevent_req *subreq) req = tevent_req_callback_data(subreq, struct tevent_req); state = tevent_req_data(req, struct cache_req_search_state); - state->dp_success = cache_req_search_process_dp(state, subreq, state->cr); + state->dp_success = state->cr->plugin->dp_recv_fn(subreq, state->cr); + talloc_zfree(subreq); /* Get result from cache again. */ ret = cache_req_search_cache(state, state->cr, &state->result); diff --git a/src/responder/common/cache_req/plugins/cache_req_common.c b/src/responder/common/cache_req/plugins/cache_req_common.c index 4c0f358..b80f310 100644 --- a/src/responder/common/cache_req/plugins/cache_req_common.c +++ b/src/responder/common/cache_req/plugins/cache_req_common.c @@ -107,3 +107,43 @@ cache_req_well_known_sid_result(TALLOC_CTX *mem_ctx, return result; } + +bool +cache_req_common_dp_recv(struct tevent_req *subreq, + struct cache_req *cr) +{ + char *err_msg; + dbus_uint16_t err_maj; + dbus_uint32_t err_min; + errno_t ret; + bool bret; + + ret = sss_dp_req_recv(NULL, subreq, &err_maj, &err_min, &err_msg); + if (ret != EOK) { + CACHE_REQ_DEBUG(SSSDBG_OP_FAILURE, cr, + "Could not get account info [%d]: %s\n", + ret, sss_strerror(ret)); + CACHE_REQ_DEBUG(SSSDBG_TRACE_FUNC, cr, + "Due to an error we will return cached data\n"); + + bret = false; + goto done; + } + + if (err_maj) { + CACHE_REQ_DEBUG(SSSDBG_OP_FAILURE, cr, + "Data Provider Error: %u, %u, %s\n", + (unsigned int)err_maj, (unsigned int)err_min, err_msg); + CACHE_REQ_DEBUG(SSSDBG_TRACE_FUNC, cr, + "Due to an error we will return cached data\n"); + + bret = false; + goto done; + } + + bret = true; + +done: + talloc_free(err_msg); + return bret; +} diff --git a/src/responder/common/cache_req/plugins/cache_req_enum_groups.c b/src/responder/common/cache_req/plugins/cache_req_enum_groups.c index de4bd96..f14f52b 100644 --- a/src/responder/common/cache_req/plugins/cache_req_enum_groups.c +++ b/src/responder/common/cache_req/plugins/cache_req_enum_groups.c @@ -44,24 +44,19 @@ cache_req_enum_groups_lookup(TALLOC_CTX *mem_ctx, return sysdb_enumgrent_with_views(mem_ctx, domain, _result); } -static errno_t -cache_req_enum_groups_dpreq_params(TALLOC_CTX *mem_ctx, - struct cache_req *cr, - struct ldb_result *result, - const char **_string, - uint32_t *_id, - const char **_flag) +static struct tevent_req * +cache_req_enum_groups_dp_send(TALLOC_CTX *mem_ctx, + struct cache_req *cr, + struct cache_req_data *data, + struct sss_domain_info *domain, + struct ldb_result *result) { - *_id = 0; - *_string = NULL; - *_flag = NULL; - - return EOK; + return sss_dp_get_account_send(mem_ctx, cr->rctx, domain, true, + SSS_DP_GROUP, NULL, 0, NULL); } const struct cache_req_plugin cache_req_enum_groups = { .name = "Enumerate groups", - .dp_type = SSS_DP_GROUP, .attr_expiration = SYSDB_CACHE_EXPIRE, .parse_name = false, .bypass_cache = true, @@ -80,7 +75,8 @@ const struct cache_req_plugin cache_req_enum_groups = { .ncache_check_fn = NULL, .ncache_add_fn = NULL, .lookup_fn = cache_req_enum_groups_lookup, - .dpreq_params_fn = cache_req_enum_groups_dpreq_params + .dp_send_fn = cache_req_enum_groups_dp_send, + .dp_recv_fn = cache_req_common_dp_recv }; struct tevent_req * diff --git a/src/responder/common/cache_req/plugins/cache_req_enum_svc.c b/src/responder/common/cache_req/plugins/cache_req_enum_svc.c index c83564f..89ee124 100644 --- a/src/responder/common/cache_req/plugins/cache_req_enum_svc.c +++ b/src/responder/common/cache_req/plugins/cache_req_enum_svc.c @@ -45,24 +45,19 @@ cache_req_enum_svc_lookup(TALLOC_CTX *mem_ctx, return sysdb_enumservent(mem_ctx, domain, _result); } -static errno_t -cache_req_enum_svc_dpreq_params(TALLOC_CTX *mem_ctx, - struct cache_req *cr, - struct ldb_result *result, - const char **_string, - uint32_t *_id, - const char **_flag) +static struct tevent_req * +cache_req_enum_svc_dp_send(TALLOC_CTX *mem_ctx, + struct cache_req *cr, + struct cache_req_data *data, + struct sss_domain_info *domain, + struct ldb_result *result) { - *_id = 0; - *_string = NULL; - *_flag = NULL; - - return EOK; + return sss_dp_get_account_send(mem_ctx, cr->rctx, domain, true, + SSS_DP_SERVICES, NULL, 0, NULL); } const struct cache_req_plugin cache_req_enum_svc = { .name = "Enumerate services", - .dp_type = SSS_DP_SERVICES, .attr_expiration = SYSDB_CACHE_EXPIRE, .parse_name = false, .bypass_cache = true, @@ -81,7 +76,8 @@ const struct cache_req_plugin cache_req_enum_svc = { .ncache_check_fn = NULL, .ncache_add_fn = NULL, .lookup_fn = cache_req_enum_svc_lookup, - .dpreq_params_fn = cache_req_enum_svc_dpreq_params + .dp_send_fn = cache_req_enum_svc_dp_send, + .dp_recv_fn = cache_req_common_dp_recv }; struct tevent_req * diff --git a/src/responder/common/cache_req/plugins/cache_req_enum_users.c b/src/responder/common/cache_req/plugins/cache_req_enum_users.c index c4eeed7..5dbe3c1 100644 --- a/src/responder/common/cache_req/plugins/cache_req_enum_users.c +++ b/src/responder/common/cache_req/plugins/cache_req_enum_users.c @@ -44,24 +44,19 @@ cache_req_enum_users_lookup(TALLOC_CTX *mem_ctx, return sysdb_enumpwent_with_views(mem_ctx, domain, _result); } -static errno_t -cache_req_enum_users_dpreq_params(TALLOC_CTX *mem_ctx, - struct cache_req *cr, - struct ldb_result *result, - const char **_string, - uint32_t *_id, - const char **_flag) +static struct tevent_req * +cache_req_enum_users_dp_send(TALLOC_CTX *mem_ctx, + struct cache_req *cr, + struct cache_req_data *data, + struct sss_domain_info *domain, + struct ldb_result *result) { - *_id = 0; - *_string = NULL; - *_flag = NULL; - - return EOK; + return sss_dp_get_account_send(mem_ctx, cr->rctx, domain, true, + SSS_DP_USER, NULL, 0, NULL); } const struct cache_req_plugin cache_req_enum_users = { .name = "Enumerate users", - .dp_type = SSS_DP_USER, .attr_expiration = SYSDB_CACHE_EXPIRE, .parse_name = false, .bypass_cache = true, @@ -80,7 +75,8 @@ const struct cache_req_plugin cache_req_enum_users = { .ncache_check_fn = NULL, .ncache_add_fn = NULL, .lookup_fn = cache_req_enum_users_lookup, - .dpreq_params_fn = cache_req_enum_users_dpreq_params + .dp_send_fn = cache_req_enum_users_dp_send, + .dp_recv_fn = cache_req_common_dp_recv }; struct tevent_req * diff --git a/src/responder/common/cache_req/plugins/cache_req_group_by_filter.c b/src/responder/common/cache_req/plugins/cache_req_group_by_filter.c index 1619cf7..272f7ed 100644 --- a/src/responder/common/cache_req/plugins/cache_req_group_by_filter.c +++ b/src/responder/common/cache_req/plugins/cache_req_group_by_filter.c @@ -99,24 +99,20 @@ cache_req_group_by_filter_lookup(TALLOC_CTX *mem_ctx, return ret; } -static errno_t -cache_req_group_by_filter_dpreq_params(TALLOC_CTX *mem_ctx, - struct cache_req *cr, - struct ldb_result *result, - const char **_string, - uint32_t *_id, - const char **_flag) +static struct tevent_req * +cache_req_group_by_filter_dp_send(TALLOC_CTX *mem_ctx, + struct cache_req *cr, + struct cache_req_data *data, + struct sss_domain_info *domain, + struct ldb_result *result) { - *_id = cr->data->id; - *_string = cr->data->name.lookup; - *_flag = NULL; - - return EOK; + return sss_dp_get_account_send(mem_ctx, cr->rctx, domain, true, + SSS_DP_WILDCARD_GROUP, + cr->data->name.lookup, cr->data->id, NULL); } const struct cache_req_plugin cache_req_group_by_filter = { .name = "Group by filter", - .dp_type = SSS_DP_WILDCARD_GROUP, .attr_expiration = SYSDB_CACHE_EXPIRE, .parse_name = true, .bypass_cache = true, @@ -135,7 +131,8 @@ const struct cache_req_plugin cache_req_group_by_filter = { .ncache_check_fn = NULL, .ncache_add_fn = NULL, .lookup_fn = cache_req_group_by_filter_lookup, - .dpreq_params_fn = cache_req_group_by_filter_dpreq_params + .dp_send_fn = cache_req_group_by_filter_dp_send, + .dp_recv_fn = cache_req_common_dp_recv }; struct tevent_req * diff --git a/src/responder/common/cache_req/plugins/cache_req_group_by_id.c b/src/responder/common/cache_req/plugins/cache_req_group_by_id.c index 293994f..5be8432 100644 --- a/src/responder/common/cache_req/plugins/cache_req_group_by_id.c +++ b/src/responder/common/cache_req/plugins/cache_req_group_by_id.c @@ -102,9 +102,30 @@ cache_req_group_by_id_dpreq_params(TALLOC_CTX *mem_ctx, return EOK; } +static struct tevent_req * +cache_req_group_by_id_dp_send(TALLOC_CTX *mem_ctx, + struct cache_req *cr, + struct cache_req_data *data, + struct sss_domain_info *domain, + struct ldb_result *result) +{ + const char *string; + const char *flag; + uint32_t id; + errno_t ret; + + ret = cache_req_group_by_id_dpreq_params(mem_ctx, cr, result, + &string, &id, &flag); + if (ret != EOK) { + return NULL; + } + + return sss_dp_get_account_send(mem_ctx, cr->rctx, domain, true, + SSS_DP_GROUP, string, id, flag); +} + const struct cache_req_plugin cache_req_group_by_id = { .name = "Group by ID", - .dp_type = SSS_DP_GROUP, .attr_expiration = SYSDB_CACHE_EXPIRE, .parse_name = false, .bypass_cache = false, @@ -123,7 +144,8 @@ const struct cache_req_plugin cache_req_group_by_id = { .ncache_check_fn = cache_req_group_by_id_ncache_check, .ncache_add_fn = NULL, .lookup_fn = cache_req_group_by_id_lookup, - .dpreq_params_fn = cache_req_group_by_id_dpreq_params + .dp_send_fn = cache_req_group_by_id_dp_send, + .dp_recv_fn = cache_req_common_dp_recv }; struct tevent_req * diff --git a/src/responder/common/cache_req/plugins/cache_req_group_by_name.c b/src/responder/common/cache_req/plugins/cache_req_group_by_name.c index c88dbd4..d82cf80 100644 --- a/src/responder/common/cache_req/plugins/cache_req_group_by_name.c +++ b/src/responder/common/cache_req/plugins/cache_req_group_by_name.c @@ -152,9 +152,30 @@ cache_req_group_by_name_dpreq_params(TALLOC_CTX *mem_ctx, return EOK; } +static struct tevent_req * +cache_req_group_by_name_dp_send(TALLOC_CTX *mem_ctx, + struct cache_req *cr, + struct cache_req_data *data, + struct sss_domain_info *domain, + struct ldb_result *result) +{ + const char *string; + const char *flag; + uint32_t id; + errno_t ret; + + ret = cache_req_group_by_name_dpreq_params(mem_ctx, cr, result, + &string, &id, &flag); + if (ret != EOK) { + return NULL; + } + + return sss_dp_get_account_send(mem_ctx, cr->rctx, domain, true, + SSS_DP_GROUP, string, id, flag); +} + const struct cache_req_plugin cache_req_group_by_name = { .name = "Group by name", - .dp_type = SSS_DP_GROUP, .attr_expiration = SYSDB_CACHE_EXPIRE, .parse_name = true, .bypass_cache = false, @@ -173,7 +194,8 @@ const struct cache_req_plugin cache_req_group_by_name = { .ncache_check_fn = cache_req_group_by_name_ncache_check, .ncache_add_fn = cache_req_group_by_name_ncache_add, .lookup_fn = cache_req_group_by_name_lookup, - .dpreq_params_fn = cache_req_group_by_name_dpreq_params + .dp_send_fn = cache_req_group_by_name_dp_send, + .dp_recv_fn = cache_req_common_dp_recv }; struct tevent_req * diff --git a/src/responder/common/cache_req/plugins/cache_req_initgroups_by_name.c b/src/responder/common/cache_req/plugins/cache_req_initgroups_by_name.c index 9575ae7..2604732 100644 --- a/src/responder/common/cache_req/plugins/cache_req_initgroups_by_name.c +++ b/src/responder/common/cache_req/plugins/cache_req_initgroups_by_name.c @@ -167,9 +167,30 @@ cache_req_initgroups_by_name_dpreq_params(TALLOC_CTX *mem_ctx, return EOK; } +static struct tevent_req * +cache_req_initgroups_by_name_dp_send(TALLOC_CTX *mem_ctx, + struct cache_req *cr, + struct cache_req_data *data, + struct sss_domain_info *domain, + struct ldb_result *result) +{ + const char *string; + const char *flag; + uint32_t id; + errno_t ret; + + ret = cache_req_initgroups_by_name_dpreq_params(mem_ctx, cr, result, + &string, &id, &flag); + if (ret != EOK) { + return NULL; + } + + return sss_dp_get_account_send(mem_ctx, cr->rctx, domain, true, + SSS_DP_INITGROUPS, string, id, flag); +} + const struct cache_req_plugin cache_req_initgroups_by_name = { .name = "Initgroups by name", - .dp_type = SSS_DP_INITGROUPS, .attr_expiration = SYSDB_INITGR_EXPIRE, .parse_name = true, .bypass_cache = false, @@ -188,7 +209,8 @@ const struct cache_req_plugin cache_req_initgroups_by_name = { .ncache_check_fn = cache_req_initgroups_by_name_ncache_check, .ncache_add_fn = cache_req_initgroups_by_name_ncache_add, .lookup_fn = cache_req_initgroups_by_name_lookup, - .dpreq_params_fn = cache_req_initgroups_by_name_dpreq_params + .dp_send_fn = cache_req_initgroups_by_name_dp_send, + .dp_recv_fn = cache_req_common_dp_recv }; struct tevent_req * diff --git a/src/responder/common/cache_req/plugins/cache_req_initgroups_by_upn.c b/src/responder/common/cache_req/plugins/cache_req_initgroups_by_upn.c index 7a0b96b..d967973 100644 --- a/src/responder/common/cache_req/plugins/cache_req_initgroups_by_upn.c +++ b/src/responder/common/cache_req/plugins/cache_req_initgroups_by_upn.c @@ -88,24 +88,20 @@ cache_req_initgroups_by_upn_lookup(TALLOC_CTX *mem_ctx, _result); } -static errno_t -cache_req_initgroups_by_upn_dpreq_params(TALLOC_CTX *mem_ctx, - struct cache_req *cr, - struct ldb_result *result, - const char **_string, - uint32_t *_id, - const char **_flag) +static struct tevent_req * +cache_req_initgroups_by_upn_dp_send(TALLOC_CTX *mem_ctx, + struct cache_req *cr, + struct cache_req_data *data, + struct sss_domain_info *domain, + struct ldb_result *result) { - *_id = 0; - *_string = cr->data->name.lookup; - *_flag = EXTRA_NAME_IS_UPN; - - return EOK; + return sss_dp_get_account_send(mem_ctx, cr->rctx, domain, true, + SSS_DP_INITGROUPS, cr->data->name.lookup, + 0, EXTRA_NAME_IS_UPN); } const struct cache_req_plugin cache_req_initgroups_by_upn = { .name = "Initgroups by UPN", - .dp_type = SSS_DP_INITGROUPS, .attr_expiration = SYSDB_INITGR_EXPIRE, .parse_name = false, .bypass_cache = false, @@ -124,5 +120,6 @@ const struct cache_req_plugin cache_req_initgroups_by_upn = { .ncache_check_fn = cache_req_initgroups_by_upn_ncache_check, .ncache_add_fn = cache_req_initgroups_by_upn_ncache_add, .lookup_fn = cache_req_initgroups_by_upn_lookup, - .dpreq_params_fn = cache_req_initgroups_by_upn_dpreq_params + .dp_send_fn = cache_req_initgroups_by_upn_dp_send, + .dp_recv_fn = cache_req_common_dp_recv }; diff --git a/src/responder/common/cache_req/plugins/cache_req_netgroup_by_name.c b/src/responder/common/cache_req/plugins/cache_req_netgroup_by_name.c index 15549ad..d874057 100644 --- a/src/responder/common/cache_req/plugins/cache_req_netgroup_by_name.c +++ b/src/responder/common/cache_req/plugins/cache_req_netgroup_by_name.c @@ -96,24 +96,20 @@ cache_req_netgroup_by_name_lookup(TALLOC_CTX *mem_ctx, return sysdb_getnetgr(mem_ctx, domain, data->name.lookup, _result); } -static errno_t -cache_req_netgroup_by_name_dpreq_params(TALLOC_CTX *mem_ctx, - struct cache_req *cr, - struct ldb_result *result, - const char **_string, - uint32_t *_id, - const char **_flag) +static struct tevent_req * +cache_req_netgroup_by_name_dp_send(TALLOC_CTX *mem_ctx, + struct cache_req *cr, + struct cache_req_data *data, + struct sss_domain_info *domain, + struct ldb_result *result) { - *_id = 0; - *_string = cr->data->name.lookup; - *_flag = NULL; - - return EOK; + return sss_dp_get_account_send(mem_ctx, cr->rctx, domain, true, + SSS_DP_NETGR, cr->data->name.lookup, + 0, NULL); } const struct cache_req_plugin cache_req_netgroup_by_name = { .name = "Netgroup by name", - .dp_type = SSS_DP_NETGR, .attr_expiration = SYSDB_CACHE_EXPIRE, .parse_name = true, .bypass_cache = false, @@ -132,7 +128,8 @@ const struct cache_req_plugin cache_req_netgroup_by_name = { .ncache_check_fn = cache_req_netgroup_by_name_ncache_check, .ncache_add_fn = cache_req_netgroup_by_name_ncache_add, .lookup_fn = cache_req_netgroup_by_name_lookup, - .dpreq_params_fn = cache_req_netgroup_by_name_dpreq_params + .dp_send_fn = cache_req_netgroup_by_name_dp_send, + .dp_recv_fn = cache_req_common_dp_recv }; struct tevent_req * diff --git a/src/responder/common/cache_req/plugins/cache_req_object_by_id.c b/src/responder/common/cache_req/plugins/cache_req_object_by_id.c index b8ad3b5..42adc81 100644 --- a/src/responder/common/cache_req/plugins/cache_req_object_by_id.c +++ b/src/responder/common/cache_req/plugins/cache_req_object_by_id.c @@ -79,24 +79,20 @@ cache_req_object_by_id_lookup(TALLOC_CTX *mem_ctx, data->attrs, _result); } -static errno_t -cache_req_object_by_id_dpreq_params(TALLOC_CTX *mem_ctx, - struct cache_req *cr, - struct ldb_result *result, - const char **_string, - uint32_t *_id, - const char **_flag) +static struct tevent_req * +cache_req_object_by_id_dp_send(TALLOC_CTX *mem_ctx, + struct cache_req *cr, + struct cache_req_data *data, + struct sss_domain_info *domain, + struct ldb_result *result) { - *_id = cr->data->id; - *_string = NULL; - *_flag = NULL; - - return EOK; + return sss_dp_get_account_send(mem_ctx, cr->rctx, domain, true, + SSS_DP_USER_AND_GROUP, NULL, + cr->data->id, NULL); } const struct cache_req_plugin cache_req_object_by_id = { .name = "Object by ID", - .dp_type = SSS_DP_USER_AND_GROUP, .attr_expiration = SYSDB_CACHE_EXPIRE, .parse_name = false, .bypass_cache = false, @@ -115,7 +111,8 @@ const struct cache_req_plugin cache_req_object_by_id = { .ncache_check_fn = cache_req_object_by_id_ncache_check, .ncache_add_fn = NULL, .lookup_fn = cache_req_object_by_id_lookup, - .dpreq_params_fn = cache_req_object_by_id_dpreq_params + .dp_send_fn = cache_req_object_by_id_dp_send, + .dp_recv_fn = cache_req_common_dp_recv }; struct tevent_req * diff --git a/src/responder/common/cache_req/plugins/cache_req_object_by_name.c b/src/responder/common/cache_req/plugins/cache_req_object_by_name.c index 1ec906c..bbddeea 100644 --- a/src/responder/common/cache_req/plugins/cache_req_object_by_name.c +++ b/src/responder/common/cache_req/plugins/cache_req_object_by_name.c @@ -172,24 +172,20 @@ cache_req_object_by_name_lookup(TALLOC_CTX *mem_ctx, data->attrs, _result); } -static errno_t -cache_req_object_by_name_dpreq_params(TALLOC_CTX *mem_ctx, - struct cache_req *cr, - struct ldb_result *result, - const char **_string, - uint32_t *_id, - const char **_flag) +static struct tevent_req * +cache_req_object_by_name_dp_send(TALLOC_CTX *mem_ctx, + struct cache_req *cr, + struct cache_req_data *data, + struct sss_domain_info *domain, + struct ldb_result *result) { - *_id = 0; - *_string = cr->data->name.lookup; - *_flag = NULL; - - return EOK; + return sss_dp_get_account_send(mem_ctx, cr->rctx, domain, true, + SSS_DP_USER_AND_GROUP, + cr->data->name.lookup, 0, NULL); } const struct cache_req_plugin cache_req_object_by_name = { .name = "Object by name", - .dp_type = SSS_DP_USER_AND_GROUP, .attr_expiration = SYSDB_CACHE_EXPIRE, .parse_name = true, .bypass_cache = false, @@ -208,7 +204,8 @@ const struct cache_req_plugin cache_req_object_by_name = { .ncache_check_fn = cache_req_object_by_name_ncache_check, .ncache_add_fn = cache_req_object_by_name_ncache_add, .lookup_fn = cache_req_object_by_name_lookup, - .dpreq_params_fn = cache_req_object_by_name_dpreq_params + .dp_send_fn = cache_req_object_by_name_dp_send, + .dp_recv_fn = cache_req_common_dp_recv }; struct tevent_req * diff --git a/src/responder/common/cache_req/plugins/cache_req_object_by_sid.c b/src/responder/common/cache_req/plugins/cache_req_object_by_sid.c index 35cb74f..99f3dbb 100644 --- a/src/responder/common/cache_req/plugins/cache_req_object_by_sid.c +++ b/src/responder/common/cache_req/plugins/cache_req_object_by_sid.c @@ -89,24 +89,19 @@ cache_req_object_by_sid_lookup(TALLOC_CTX *mem_ctx, _result); } -static errno_t -cache_req_object_by_sid_dpreq_params(TALLOC_CTX *mem_ctx, - struct cache_req *cr, - struct ldb_result *result, - const char **_string, - uint32_t *_id, - const char **_flag) +static struct tevent_req * +cache_req_object_by_sid_dp_send(TALLOC_CTX *mem_ctx, + struct cache_req *cr, + struct cache_req_data *data, + struct sss_domain_info *domain, + struct ldb_result *result) { - *_id = 0; - *_string = cr->data->sid; - *_flag = NULL; - - return EOK; + return sss_dp_get_account_send(mem_ctx, cr->rctx, domain, true, + SSS_DP_SECID, cr->data->sid, 0, NULL); } const struct cache_req_plugin cache_req_object_by_sid = { .name = "Object by SID", - .dp_type = SSS_DP_SECID, .attr_expiration = SYSDB_CACHE_EXPIRE, .parse_name = false, .bypass_cache = false, @@ -125,7 +120,8 @@ const struct cache_req_plugin cache_req_object_by_sid = { .ncache_check_fn = cache_req_object_by_sid_ncache_check, .ncache_add_fn = NULL, .lookup_fn = cache_req_object_by_sid_lookup, - .dpreq_params_fn = cache_req_object_by_sid_dpreq_params + .dp_send_fn = cache_req_object_by_sid_dp_send, + .dp_recv_fn = cache_req_common_dp_recv }; struct tevent_req * diff --git a/src/responder/common/cache_req/plugins/cache_req_svc_by_name.c b/src/responder/common/cache_req/plugins/cache_req_svc_by_name.c index 4de2757..3c25f4f 100644 --- a/src/responder/common/cache_req/plugins/cache_req_svc_by_name.c +++ b/src/responder/common/cache_req/plugins/cache_req_svc_by_name.c @@ -120,24 +120,20 @@ cache_req_svc_by_name_lookup(TALLOC_CTX *mem_ctx, data->svc.protocol.lookup, _result); } -static errno_t -cache_req_svc_by_name_dpreq_params(TALLOC_CTX *mem_ctx, - struct cache_req *cr, - struct ldb_result *result, - const char **_string, - uint32_t *_id, - const char **_flag) +static struct tevent_req * +cache_req_svc_by_name_dp_send(TALLOC_CTX *mem_ctx, + struct cache_req *cr, + struct cache_req_data *data, + struct sss_domain_info *domain, + struct ldb_result *result) { - *_id = 0; - *_string = cr->data->svc.name->lookup; - *_flag = cr->data->svc.protocol.lookup; - - return EOK; + return sss_dp_get_account_send(mem_ctx, cr->rctx, domain, true, + SSS_DP_SERVICES, cr->data->svc.name->lookup, + 0, cr->data->svc.protocol.lookup); } const struct cache_req_plugin cache_req_svc_by_name = { .name = "Service by name", - .dp_type = SSS_DP_SERVICES, .attr_expiration = SYSDB_CACHE_EXPIRE, .parse_name = true, .bypass_cache = false, @@ -156,7 +152,8 @@ const struct cache_req_plugin cache_req_svc_by_name = { .ncache_check_fn = cache_req_svc_by_name_ncache_check, .ncache_add_fn = cache_req_svc_by_name_ncache_add, .lookup_fn = cache_req_svc_by_name_lookup, - .dpreq_params_fn = cache_req_svc_by_name_dpreq_params + .dp_send_fn = cache_req_svc_by_name_dp_send, + .dp_recv_fn = cache_req_common_dp_recv }; struct tevent_req * diff --git a/src/responder/common/cache_req/plugins/cache_req_svc_by_port.c b/src/responder/common/cache_req/plugins/cache_req_svc_by_port.c index 1b17c71..b16de59 100644 --- a/src/responder/common/cache_req/plugins/cache_req_svc_by_port.c +++ b/src/responder/common/cache_req/plugins/cache_req_svc_by_port.c @@ -93,24 +93,20 @@ cache_req_svc_by_port_lookup(TALLOC_CTX *mem_ctx, data->svc.protocol.lookup, _result); } -static errno_t -cache_req_svc_by_port_dpreq_params(TALLOC_CTX *mem_ctx, - struct cache_req *cr, - struct ldb_result *result, - const char **_string, - uint32_t *_id, - const char **_flag) +static struct tevent_req * +cache_req_svc_by_port_dp_send(TALLOC_CTX *mem_ctx, + struct cache_req *cr, + struct cache_req_data *data, + struct sss_domain_info *domain, + struct ldb_result *result) { - *_id = cr->data->svc.port; - *_string = NULL; - *_flag = cr->data->svc.protocol.lookup; - - return EOK; + return sss_dp_get_account_send(mem_ctx, cr->rctx, domain, true, + SSS_DP_SERVICES, NULL, cr->data->svc.port, + cr->data->svc.protocol.lookup); } const struct cache_req_plugin cache_req_svc_by_port = { .name = "Service by port", - .dp_type = SSS_DP_SERVICES, .attr_expiration = SYSDB_CACHE_EXPIRE, .parse_name = false, .bypass_cache = false, @@ -129,7 +125,8 @@ const struct cache_req_plugin cache_req_svc_by_port = { .ncache_check_fn = cache_req_svc_by_port_ncache_check, .ncache_add_fn = cache_req_svc_by_port_ncache_add, .lookup_fn = cache_req_svc_by_port_lookup, - .dpreq_params_fn = cache_req_svc_by_port_dpreq_params + .dp_send_fn = cache_req_svc_by_port_dp_send, + .dp_recv_fn = cache_req_common_dp_recv }; struct tevent_req * diff --git a/src/responder/common/cache_req/plugins/cache_req_user_by_cert.c b/src/responder/common/cache_req/plugins/cache_req_user_by_cert.c index 9a1bcc6..321eca2 100644 --- a/src/responder/common/cache_req/plugins/cache_req_user_by_cert.c +++ b/src/responder/common/cache_req/plugins/cache_req_user_by_cert.c @@ -63,24 +63,19 @@ cache_req_user_by_cert_lookup(TALLOC_CTX *mem_ctx, _result); } -static errno_t -cache_req_user_by_cert_dpreq_params(TALLOC_CTX *mem_ctx, - struct cache_req *cr, - struct ldb_result *result, - const char **_string, - uint32_t *_id, - const char **_flag) +static struct tevent_req * +cache_req_user_by_cert_dp_send(TALLOC_CTX *mem_ctx, + struct cache_req *cr, + struct cache_req_data *data, + struct sss_domain_info *domain, + struct ldb_result *result) { - *_id = 0; - *_string = cr->data->cert; - *_flag = NULL; - - return EOK; + return sss_dp_get_account_send(mem_ctx, cr->rctx, domain, true, + SSS_DP_CERT, cr->data->cert, 0, NULL); } const struct cache_req_plugin cache_req_user_by_cert = { .name = "User by certificate", - .dp_type = SSS_DP_CERT, .attr_expiration = SYSDB_CACHE_EXPIRE, .parse_name = false, .bypass_cache = false, @@ -99,7 +94,8 @@ const struct cache_req_plugin cache_req_user_by_cert = { .ncache_check_fn = cache_req_user_by_cert_ncache_check, .ncache_add_fn = NULL, .lookup_fn = cache_req_user_by_cert_lookup, - .dpreq_params_fn = cache_req_user_by_cert_dpreq_params + .dp_send_fn = cache_req_user_by_cert_dp_send, + .dp_recv_fn = cache_req_common_dp_recv }; struct tevent_req * diff --git a/src/responder/common/cache_req/plugins/cache_req_user_by_filter.c b/src/responder/common/cache_req/plugins/cache_req_user_by_filter.c index ee9f60b..d89d526 100644 --- a/src/responder/common/cache_req/plugins/cache_req_user_by_filter.c +++ b/src/responder/common/cache_req/plugins/cache_req_user_by_filter.c @@ -99,24 +99,20 @@ cache_req_user_by_filter_lookup(TALLOC_CTX *mem_ctx, return ret; } -static errno_t -cache_req_user_by_filter_dpreq_params(TALLOC_CTX *mem_ctx, - struct cache_req *cr, - struct ldb_result *result, - const char **_string, - uint32_t *_id, - const char **_flag) +static struct tevent_req * +cache_req_user_by_filter_dp_send(TALLOC_CTX *mem_ctx, + struct cache_req *cr, + struct cache_req_data *data, + struct sss_domain_info *domain, + struct ldb_result *result) { - *_id = cr->data->id; - *_string = cr->data->name.lookup; - *_flag = NULL; - - return EOK; + return sss_dp_get_account_send(mem_ctx, cr->rctx, domain, true, + SSS_DP_WILDCARD_USER, cr->data->name.lookup, + cr->data->id, NULL); } const struct cache_req_plugin cache_req_user_by_filter = { .name = "User by filter", - .dp_type = SSS_DP_WILDCARD_USER, .attr_expiration = SYSDB_CACHE_EXPIRE, .parse_name = true, .bypass_cache = true, @@ -135,7 +131,8 @@ const struct cache_req_plugin cache_req_user_by_filter = { .ncache_check_fn = NULL, .ncache_add_fn = NULL, .lookup_fn = cache_req_user_by_filter_lookup, - .dpreq_params_fn = cache_req_user_by_filter_dpreq_params + .dp_send_fn = cache_req_user_by_filter_dp_send, + .dp_recv_fn = cache_req_common_dp_recv }; struct tevent_req * diff --git a/src/responder/common/cache_req/plugins/cache_req_user_by_id.c b/src/responder/common/cache_req/plugins/cache_req_user_by_id.c index d710986..59f4b6b 100644 --- a/src/responder/common/cache_req/plugins/cache_req_user_by_id.c +++ b/src/responder/common/cache_req/plugins/cache_req_user_by_id.c @@ -102,9 +102,30 @@ cache_req_user_by_id_dpreq_params(TALLOC_CTX *mem_ctx, return EOK; } +static struct tevent_req * +cache_req_user_by_id_dp_send(TALLOC_CTX *mem_ctx, + struct cache_req *cr, + struct cache_req_data *data, + struct sss_domain_info *domain, + struct ldb_result *result) +{ + const char *string; + const char *flag; + uint32_t id; + errno_t ret; + + ret = cache_req_user_by_id_dpreq_params(mem_ctx, cr, result, + &string, &id, &flag); + if (ret != EOK) { + return NULL; + } + + return sss_dp_get_account_send(mem_ctx, cr->rctx, domain, true, + SSS_DP_USER, string, id, flag); +} + const struct cache_req_plugin cache_req_user_by_id = { .name = "User by ID", - .dp_type = SSS_DP_USER, .attr_expiration = SYSDB_CACHE_EXPIRE, .parse_name = false, .bypass_cache = false, @@ -123,7 +144,8 @@ const struct cache_req_plugin cache_req_user_by_id = { .ncache_check_fn = cache_req_user_by_id_ncache_check, .ncache_add_fn = NULL, .lookup_fn = cache_req_user_by_id_lookup, - .dpreq_params_fn = cache_req_user_by_id_dpreq_params + .dp_send_fn = cache_req_user_by_id_dp_send, + .dp_recv_fn = cache_req_common_dp_recv }; struct tevent_req * diff --git a/src/responder/common/cache_req/plugins/cache_req_user_by_name.c b/src/responder/common/cache_req/plugins/cache_req_user_by_name.c index 540ee70..64259d6 100644 --- a/src/responder/common/cache_req/plugins/cache_req_user_by_name.c +++ b/src/responder/common/cache_req/plugins/cache_req_user_by_name.c @@ -157,9 +157,30 @@ cache_req_user_by_name_dpreq_params(TALLOC_CTX *mem_ctx, return EOK; } +static struct tevent_req * +cache_req_user_by_name_dp_send(TALLOC_CTX *mem_ctx, + struct cache_req *cr, + struct cache_req_data *data, + struct sss_domain_info *domain, + struct ldb_result *result) +{ + const char *string; + const char *flag; + uint32_t id; + errno_t ret; + + ret = cache_req_user_by_name_dpreq_params(mem_ctx, cr, result, + &string, &id, &flag); + if (ret != EOK) { + return NULL; + } + + return sss_dp_get_account_send(mem_ctx, cr->rctx, domain, true, + SSS_DP_USER, string, id, flag); +} + const struct cache_req_plugin cache_req_user_by_name = { .name = "User by name", - .dp_type = SSS_DP_USER, .attr_expiration = SYSDB_CACHE_EXPIRE, .parse_name = true, .bypass_cache = false, @@ -178,7 +199,8 @@ const struct cache_req_plugin cache_req_user_by_name = { .ncache_check_fn = cache_req_user_by_name_ncache_check, .ncache_add_fn = cache_req_user_by_name_ncache_add, .lookup_fn = cache_req_user_by_name_lookup, - .dpreq_params_fn = cache_req_user_by_name_dpreq_params + .dp_send_fn = cache_req_user_by_name_dp_send, + .dp_recv_fn = cache_req_common_dp_recv }; struct tevent_req * diff --git a/src/responder/common/cache_req/plugins/cache_req_user_by_upn.c b/src/responder/common/cache_req/plugins/cache_req_user_by_upn.c index 9d1e703..18fe601 100644 --- a/src/responder/common/cache_req/plugins/cache_req_user_by_upn.c +++ b/src/responder/common/cache_req/plugins/cache_req_user_by_upn.c @@ -92,24 +92,20 @@ cache_req_user_by_upn_lookup(TALLOC_CTX *mem_ctx, data->attrs, _result); } -static errno_t -cache_req_user_by_upn_dpreq_params(TALLOC_CTX *mem_ctx, - struct cache_req *cr, - struct ldb_result *result, - const char **_string, - uint32_t *_id, - const char **_flag) +static struct tevent_req * +cache_req_user_by_upn_dp_send(TALLOC_CTX *mem_ctx, + struct cache_req *cr, + struct cache_req_data *data, + struct sss_domain_info *domain, + struct ldb_result *result) { - *_id = 0; - *_string = cr->data->name.lookup; - *_flag = EXTRA_NAME_IS_UPN; - - return EOK; + return sss_dp_get_account_send(mem_ctx, cr->rctx, domain, true, + SSS_DP_USER, cr->data->name.lookup, + 0, EXTRA_NAME_IS_UPN); } const struct cache_req_plugin cache_req_user_by_upn = { .name = "User by UPN", - .dp_type = SSS_DP_USER, .attr_expiration = SYSDB_CACHE_EXPIRE, .parse_name = false, .bypass_cache = false, @@ -128,5 +124,6 @@ const struct cache_req_plugin cache_req_user_by_upn = { .ncache_check_fn = cache_req_user_by_upn_ncache_check, .ncache_add_fn = cache_req_user_by_upn_ncache_add, .lookup_fn = cache_req_user_by_upn_lookup, - .dpreq_params_fn = cache_req_user_by_upn_dpreq_params + .dp_send_fn = cache_req_user_by_upn_dp_send, + .dp_recv_fn = cache_req_common_dp_recv }; diff --git a/src/tests/cmocka/common_mock_resp_dp.c b/src/tests/cmocka/common_mock_resp_dp.c index f62606e..61792eb 100644 --- a/src/tests/cmocka/common_mock_resp_dp.c +++ b/src/tests/cmocka/common_mock_resp_dp.c @@ -61,16 +61,37 @@ sss_dp_get_account_recv(TALLOC_CTX *mem_ctx, return test_request_recv(req); } +errno_t +sss_dp_req_recv(TALLOC_CTX *mem_ctx, + struct tevent_req *req, + dbus_uint16_t *dp_err, + dbus_uint32_t *dp_ret, + char **err_msg) +{ + acct_cb_t cb; + + *dp_err = sss_mock_type(dbus_uint16_t); + *dp_ret = sss_mock_type(dbus_uint32_t); + *err_msg = sss_mock_ptr_type(char *); + + cb = sss_mock_ptr_type(acct_cb_t); + if (cb) { + (cb)(sss_mock_ptr_type(void *)); + } + + return test_request_recv(req); +} + void mock_account_recv(uint16_t dp_err, uint32_t dp_ret, char *msg, acct_cb_t acct_cb, void *pvt) { - will_return(sss_dp_get_account_recv, dp_err); - will_return(sss_dp_get_account_recv, dp_ret); - will_return(sss_dp_get_account_recv, msg); + will_return(sss_dp_req_recv, dp_err); + will_return(sss_dp_req_recv, dp_ret); + will_return(sss_dp_req_recv, msg); - will_return(sss_dp_get_account_recv, acct_cb); + will_return(sss_dp_req_recv, acct_cb); if (acct_cb) { - will_return(sss_dp_get_account_recv, pvt); + will_return(sss_dp_req_recv, pvt); } } diff --git a/src/tests/cmocka/test_responder_cache_req.c b/src/tests/cmocka/test_responder_cache_req.c index d4e54cd..94a902c 100644 --- a/src/tests/cmocka/test_responder_cache_req.c +++ b/src/tests/cmocka/test_responder_cache_req.c @@ -530,7 +530,7 @@ void test_user_by_name_multiple_domains_found(void **state) /* Mock values. */ will_return_always(__wrap_sss_dp_get_account_send, test_ctx); - will_return_always(sss_dp_get_account_recv, 0); + will_return_always(sss_dp_req_recv, 0); mock_parse_inp(users[0].short_name, NULL, ERR_OK); /* Test. */ @@ -547,7 +547,7 @@ void test_user_by_name_multiple_domains_notfound(void **state) /* Mock values. */ will_return_always(__wrap_sss_dp_get_account_send, test_ctx); - will_return_always(sss_dp_get_account_recv, 0); + will_return_always(sss_dp_req_recv, 0); mock_parse_inp(users[0].short_name, NULL, ERR_OK); /* Test. */ @@ -749,7 +749,7 @@ void test_user_by_upn_multiple_domains_found(void **state) /* Mock values. */ will_return_always(__wrap_sss_dp_get_account_send, test_ctx); - will_return_always(sss_dp_get_account_recv, 0); + will_return_always(sss_dp_req_recv, 0); mock_parse_inp(NULL, NULL, ERR_DOMAIN_NOT_FOUND); /* Test. */ @@ -766,7 +766,7 @@ void test_user_by_upn_multiple_domains_notfound(void **state) /* Mock values. */ will_return_always(__wrap_sss_dp_get_account_send, test_ctx); - will_return_always(sss_dp_get_account_recv, 0); + will_return_always(sss_dp_req_recv, 0); mock_parse_inp(NULL, NULL, ERR_DOMAIN_NOT_FOUND); /* Test. */ @@ -904,7 +904,7 @@ void test_user_by_id_multiple_domains_found(void **state) /* Mock values. */ will_return_always(__wrap_sss_dp_get_account_send, test_ctx); - will_return_always(sss_dp_get_account_recv, 0); + will_return_always(sss_dp_req_recv, 0); /* Test. */ run_user_by_id(test_ctx, NULL, 0, ERR_OK); @@ -920,7 +920,7 @@ void test_user_by_id_multiple_domains_notfound(void **state) /* Mock values. */ will_return_always(__wrap_sss_dp_get_account_send, test_ctx); - will_return_always(sss_dp_get_account_recv, 0); + will_return_always(sss_dp_req_recv, 0); /* Test. */ run_user_by_id(test_ctx, NULL, 0, ENOENT); @@ -1045,7 +1045,7 @@ void test_group_by_name_multiple_domains_found(void **state) /* Mock values. */ will_return_always(__wrap_sss_dp_get_account_send, test_ctx); - will_return_always(sss_dp_get_account_recv, 0); + will_return_always(sss_dp_req_recv, 0); mock_parse_inp(groups[0].short_name, NULL, ERR_OK); /* Test. */ @@ -1062,7 +1062,7 @@ void test_group_by_name_multiple_domains_notfound(void **state) /* Mock values. */ will_return_always(__wrap_sss_dp_get_account_send, test_ctx); - will_return_always(sss_dp_get_account_recv, 0); + will_return_always(sss_dp_req_recv, 0); mock_parse_inp(groups[0].short_name, NULL, ERR_OK); /* Test. */ @@ -1261,7 +1261,7 @@ void test_group_by_id_multiple_domains_found(void **state) /* Mock values. */ will_return_always(__wrap_sss_dp_get_account_send, test_ctx); - will_return_always(sss_dp_get_account_recv, 0); + will_return_always(sss_dp_req_recv, 0); /* Test. */ run_group_by_id(test_ctx, NULL, 0, ERR_OK); @@ -1277,7 +1277,7 @@ void test_group_by_id_multiple_domains_notfound(void **state) /* Mock values. */ will_return_always(__wrap_sss_dp_get_account_send, test_ctx); - will_return_always(sss_dp_get_account_recv, 0); + will_return_always(sss_dp_req_recv, 0); /* Test. */ run_group_by_id(test_ctx, NULL, 0, ENOENT); @@ -1912,7 +1912,7 @@ void test_object_by_sid_user_multiple_domains_found(void **state) /* Mock values. */ will_return_always(__wrap_sss_dp_get_account_send, test_ctx); - will_return_always(sss_dp_get_account_recv, 0); + will_return_always(sss_dp_req_recv, 0); /* Test. */ run_object_by_sid(test_ctx, NULL, users[0].sid, attrs, 0, ERR_OK); @@ -1929,7 +1929,7 @@ void test_object_by_sid_user_multiple_domains_notfound(void **state) /* Mock values. */ will_return_always(__wrap_sss_dp_get_account_send, test_ctx); - will_return_always(sss_dp_get_account_recv, 0); + will_return_always(sss_dp_req_recv, 0); /* Test. */ run_object_by_sid(test_ctx, NULL, users[0].sid, attrs, 0, ENOENT); @@ -2068,7 +2068,7 @@ void test_object_by_sid_group_multiple_domains_found(void **state) /* Mock values. */ will_return_always(__wrap_sss_dp_get_account_send, test_ctx); - will_return_always(sss_dp_get_account_recv, 0); + will_return_always(sss_dp_req_recv, 0); /* Test. */ run_object_by_sid(test_ctx, NULL, groups[0].sid, attrs, 0, ERR_OK); @@ -2085,7 +2085,7 @@ void test_object_by_sid_group_multiple_domains_notfound(void **state) /* Mock values. */ will_return_always(__wrap_sss_dp_get_account_send, test_ctx); - will_return_always(sss_dp_get_account_recv, 0); + will_return_always(sss_dp_req_recv, 0); /* Test. */ run_object_by_sid(test_ctx, NULL, groups[0].sid, attrs, 0, ENOENT); From ec8cd7806ef91947f02a71375b9e21d13d1ff4ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavel=20B=C5=99ezina?= <[email protected]> Date: Wed, 18 Jan 2017 12:12:01 +0100 Subject: [PATCH 6/6] cache_req: add host by name search --- Makefile.am | 3 +- src/responder/common/cache_req/cache_req.c | 2 + src/responder/common/cache_req/cache_req.h | 23 +++ src/responder/common/cache_req/cache_req_data.c | 39 ++++++ src/responder/common/cache_req/cache_req_plugin.h | 1 + src/responder/common/cache_req/cache_req_private.h | 1 + .../cache_req/plugins/cache_req_host_by_name.c | 120 ++++++++++++++++ src/responder/common/responder.h | 15 ++ src/responder/common/responder_dp_ssh.c | 155 ++++++++++++++++++++ src/responder/ssh/sshsrv_dp.c | 156 --------------------- src/responder/ssh/sshsrv_private.h | 15 -- src/tests/cmocka/common_mock_resp_dp.c | 33 +++++ src/tests/cwrap/Makefile.am | 2 + 13 files changed, 393 insertions(+), 172 deletions(-) create mode 100644 src/responder/common/cache_req/plugins/cache_req_host_by_name.c create mode 100644 src/responder/common/responder_dp_ssh.c delete mode 100644 src/responder/ssh/sshsrv_dp.c diff --git a/Makefile.am b/Makefile.am index 674d328..d25e578 100644 --- a/Makefile.am +++ b/Makefile.am @@ -513,6 +513,7 @@ SSSD_CACHE_REQ_OBJ = \ src/responder/common/cache_req/plugins/cache_req_svc_by_name.c \ src/responder/common/cache_req/plugins/cache_req_svc_by_port.c \ src/responder/common/cache_req/plugins/cache_req_netgroup_by_name.c \ + src/responder/common/cache_req/plugins/cache_req_host_by_name.c \ $(NULL) SSSD_RESPONDER_OBJ = \ @@ -521,6 +522,7 @@ SSSD_RESPONDER_OBJ = \ src/responder/common/responder_cmd.c \ src/responder/common/responder_common.c \ src/responder/common/responder_dp.c \ + src/responder/common/responder_dp_ssh.c \ src/responder/common/responder_packet.c \ src/responder/common/responder_get_domains.c \ src/responder/common/responder_utils.c \ @@ -1333,7 +1335,6 @@ endif if BUILD_SSH sssd_ssh_SOURCES = \ src/responder/ssh/sshsrv.c \ - src/responder/ssh/sshsrv_dp.c \ src/responder/ssh/sshsrv_cmd.c \ $(SSSD_RESPONDER_OBJ) \ $(NULL) diff --git a/src/responder/common/cache_req/cache_req.c b/src/responder/common/cache_req/cache_req.c index ec39118..796a1fc 100644 --- a/src/responder/common/cache_req/cache_req.c +++ b/src/responder/common/cache_req/cache_req.c @@ -56,6 +56,8 @@ cache_req_get_plugin(enum cache_req_type type) &cache_req_svc_by_port, &cache_req_netgroup_by_name, + + &cache_req_host_by_name, }; if (type >= CACHE_REQ_SENTINEL) { diff --git a/src/responder/common/cache_req/cache_req.h b/src/responder/common/cache_req/cache_req.h index 2740c21..185558d 100644 --- a/src/responder/common/cache_req/cache_req.h +++ b/src/responder/common/cache_req/cache_req.h @@ -52,6 +52,8 @@ enum cache_req_type { CACHE_REQ_NETGROUP_BY_NAME, + CACHE_REQ_HOST_BY_NAME, + CACHE_REQ_SENTINEL }; @@ -103,6 +105,13 @@ cache_req_data_svc(TALLOC_CTX *mem_ctx, const char *protocol, uint16_t port); +struct cache_req_data * +cache_req_data_host(TALLOC_CTX *mem_ctx, + enum cache_req_type type, + const char *name, + const char *alias, + const char **attrs); + /* Output data. */ struct cache_req_result { @@ -377,4 +386,18 @@ cache_req_netgroup_by_name_send(TALLOC_CTX *mem_ctx, #define cache_req_netgroup_by_name_recv(mem_ctx, req, _result) \ cache_req_single_domain_recv(mem_ctx, req, _result) +struct tevent_req * +cache_req_host_by_name_send(TALLOC_CTX *mem_ctx, + struct tevent_context *ev, + struct resp_ctx *rctx, + struct sss_nc_ctx *ncache, + int cache_refresh_percent, + const char *domain, + const char *name, + const char *alias, + const char **attrs); + +#define cache_req_host_by_name_recv(mem_ctx, req, _result) \ + cache_req_single_domain_recv(mem_ctx, req, _result) + #endif /* _CACHE_REQ_H_ */ diff --git a/src/responder/common/cache_req/cache_req_data.c b/src/responder/common/cache_req/cache_req_data.c index d056478..b2e22ec 100644 --- a/src/responder/common/cache_req/cache_req_data.c +++ b/src/responder/common/cache_req/cache_req_data.c @@ -188,6 +188,29 @@ cache_req_data_create(TALLOC_CTX *mem_ctx, } break; + case CACHE_REQ_HOST_BY_NAME: + if (input->name.input == NULL) { + DEBUG(SSSDBG_CRIT_FAILURE, "Bug: name cannot be NULL!\n"); + ret = ERR_INTERNAL; + goto done; + } + + data->name.input = talloc_strdup(data, input->name.input); + if (data->name.input == NULL) { + ret = ENOMEM; + goto done; + } + + if (input->alias == NULL) { + break; + } + + data->alias = talloc_strdup(data, input->alias); + if (data->alias == NULL) { + ret = ENOMEM; + goto done; + } + break; case CACHE_REQ_SENTINEL: DEBUG(SSSDBG_CRIT_FAILURE, "Invalid cache request type!\n"); ret = ERR_INTERNAL; @@ -318,3 +341,19 @@ cache_req_data_svc(TALLOC_CTX *mem_ctx, return cache_req_data_create(mem_ctx, type, &input); } + +struct cache_req_data * +cache_req_data_host(TALLOC_CTX *mem_ctx, + enum cache_req_type type, + const char *name, + const char *alias, + const char **attrs) +{ + struct cache_req_data input = {0}; + + input.name.input = name; + input.alias = alias; + input.attrs = attrs; + + return cache_req_data_create(mem_ctx, type, &input); +} diff --git a/src/responder/common/cache_req/cache_req_plugin.h b/src/responder/common/cache_req/cache_req_plugin.h index 7b0c489..da4a2d9 100644 --- a/src/responder/common/cache_req/cache_req_plugin.h +++ b/src/responder/common/cache_req/cache_req_plugin.h @@ -226,5 +226,6 @@ extern const struct cache_req_plugin cache_req_enum_svc; extern const struct cache_req_plugin cache_req_svc_by_name; extern const struct cache_req_plugin cache_req_svc_by_port; extern const struct cache_req_plugin cache_req_netgroup_by_name; +extern const struct cache_req_plugin cache_req_host_by_name; #endif /* _CACHE_REQ_PLUGIN_H_ */ diff --git a/src/responder/common/cache_req/cache_req_private.h b/src/responder/common/cache_req/cache_req_private.h index b544b73..cc47375 100644 --- a/src/responder/common/cache_req/cache_req_private.h +++ b/src/responder/common/cache_req/cache_req_private.h @@ -76,6 +76,7 @@ struct cache_req_data { uint32_t id; const char *cert; const char *sid; + const char *alias; const char **attrs; struct { diff --git a/src/responder/common/cache_req/plugins/cache_req_host_by_name.c b/src/responder/common/cache_req/plugins/cache_req_host_by_name.c new file mode 100644 index 0000000..402efca --- /dev/null +++ b/src/responder/common/cache_req/plugins/cache_req_host_by_name.c @@ -0,0 +1,120 @@ +/* + Authors: + Pavel Březina <[email protected]> + + Copyright (C) 2016 Red Hat + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include <talloc.h> +#include <ldb.h> + +#include "db/sysdb_ssh.h" +#include "util/util.h" +#include "providers/data_provider.h" +#include "responder/common/cache_req/cache_req_plugin.h" + +static const char * +cache_req_host_by_name_create_debug_name(TALLOC_CTX *mem_ctx, + struct cache_req_data *data, + struct sss_domain_info *domain) +{ + return talloc_strdup(mem_ctx, data->name.name); +} + +static errno_t +cache_req_host_by_name_lookup(TALLOC_CTX *mem_ctx, + struct cache_req *cr, + struct cache_req_data *data, + struct sss_domain_info *domain, + struct ldb_result **_result) +{ + struct ldb_result *result; + struct ldb_message *msg; + errno_t ret; + + ret = sysdb_get_ssh_host(mem_ctx, domain, data->name.name, + data->attrs, &msg); + if (ret != EOK) { + return ret; + } + + result = cache_req_create_ldb_result_from_msg(mem_ctx, msg); + if (result == NULL) { + return ENOMEM; + } + + *_result = result; + + return EOK; +} + +struct tevent_req * +cache_req_host_by_name_dp_send(TALLOC_CTX *mem_ctx, + struct cache_req *cr, + struct cache_req_data *data, + struct sss_domain_info *domain, + struct ldb_result *result) +{ + return sss_dp_get_ssh_host_send(mem_ctx, cr->rctx, domain, false, + data->name.name, data->alias); +} + +const struct cache_req_plugin cache_req_host_by_name = { + .name = "Host by name", + .attr_expiration = SYSDB_CACHE_EXPIRE, + .parse_name = true, + .bypass_cache = false, + .only_one_result = true, + .search_all_domains = false, + .require_enumeration = false, + .allow_missing_fqn = false, + .allow_switch_to_upn = false, + .upn_equivalent = CACHE_REQ_SENTINEL, + .get_next_domain_flags = 0, + + .is_well_known_fn = NULL, + .prepare_domain_data_fn = NULL, + .create_debug_name_fn = cache_req_host_by_name_create_debug_name, + .global_ncache_add_fn = NULL, + .ncache_check_fn = NULL, + .ncache_add_fn = NULL, + .lookup_fn = cache_req_host_by_name_lookup, + .dp_send_fn = cache_req_host_by_name_dp_send, + .dp_recv_fn = cache_req_common_dp_recv +}; + +struct tevent_req * +cache_req_host_by_name_send(TALLOC_CTX *mem_ctx, + struct tevent_context *ev, + struct resp_ctx *rctx, + struct sss_nc_ctx *ncache, + int cache_refresh_percent, + const char *domain, + const char *name, + const char *alias, + const char **attrs) +{ + struct cache_req_data *data; + + data = cache_req_data_host(mem_ctx, CACHE_REQ_HOST_BY_NAME, name, + alias, attrs); + if (data == NULL) { + return NULL; + } + + return cache_req_steal_data_and_send(mem_ctx, ev, rctx, ncache, + cache_refresh_percent, domain, data); +} diff --git a/src/responder/common/responder.h b/src/responder/common/responder.h index d1fa532..68071f1 100644 --- a/src/responder/common/responder.h +++ b/src/responder/common/responder.h @@ -318,6 +318,21 @@ sss_dp_get_account_recv(TALLOC_CTX *mem_ctx, dbus_uint32_t *err_min, char **err_msg); +struct tevent_req * +sss_dp_get_ssh_host_send(TALLOC_CTX *mem_ctx, + struct resp_ctx *rctx, + struct sss_domain_info *dom, + bool fast_reply, + const char *name, + const char *alias); + +errno_t +sss_dp_get_ssh_host_recv(TALLOC_CTX *mem_ctx, + struct tevent_req *req, + dbus_uint16_t *dp_err, + dbus_uint32_t *dp_ret, + char **err_msg); + bool sss_utf8_check(const uint8_t *s, size_t n); void responder_set_fd_limit(rlim_t fd_limit); diff --git a/src/responder/common/responder_dp_ssh.c b/src/responder/common/responder_dp_ssh.c new file mode 100644 index 0000000..303ba15 --- /dev/null +++ b/src/responder/common/responder_dp_ssh.c @@ -0,0 +1,155 @@ +/* + Authors: + Jakub Hrozek <[email protected]> + + Copyright (C) 2012 Red Hat + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include <talloc.h> +#include <tevent.h> +#include <dbus/dbus.h> + +#include "util/util.h" +#include "sbus/sbus_client.h" +#include "sbus/sssd_dbus.h" +#include "providers/data_provider/dp_responder_iface.h" +#include "responder/common/responder.h" + +struct sss_dp_get_ssh_host_info { + struct sss_domain_info *dom; + + bool fast_reply; + const char *name; + const char *alias; +}; + +static DBusMessage * +sss_dp_get_ssh_host_msg(void *pvt); + +struct tevent_req * +sss_dp_get_ssh_host_send(TALLOC_CTX *mem_ctx, + struct resp_ctx *rctx, + struct sss_domain_info *dom, + bool fast_reply, + const char *name, + const char *alias) +{ + errno_t ret; + struct tevent_req *req; + struct sss_dp_get_ssh_host_info *info; + struct sss_dp_req_state *state; + char *key; + + req = tevent_req_create(mem_ctx, &state, struct sss_dp_req_state); + if (!req) { + return NULL; + } + + if (!dom) { + ret = EINVAL; + goto error; + } + + info = talloc_zero(state, struct sss_dp_get_ssh_host_info); + info->fast_reply = fast_reply; + info->name = name; + info->alias = alias; + info->dom = dom; + + if (alias) { + key = talloc_asprintf(state, "%s:%s@%s", name, alias, dom->name); + } else { + key = talloc_asprintf(state, "%s@%s", name, dom->name); + } + if (!key) { + ret = ENOMEM; + goto error; + } + + ret = sss_dp_issue_request(state, rctx, key, dom, sss_dp_get_ssh_host_msg, + info, req); + talloc_free(key); + if (ret != EOK) { + DEBUG(SSSDBG_OP_FAILURE, + "Could not issue DP request [%d]: %s\n", + ret, strerror(ret)); + goto error; + } + + return req; + +error: + tevent_req_error(req, ret); + tevent_req_post(req, rctx->ev); + return req; +} + +static DBusMessage * +sss_dp_get_ssh_host_msg(void *pvt) +{ + DBusMessage *msg; + dbus_bool_t dbret; + struct sss_dp_get_ssh_host_info *info; + uint32_t dp_flags = 0; + + info = talloc_get_type(pvt, struct sss_dp_get_ssh_host_info); + + if (info->fast_reply) { + dp_flags |= DP_FAST_REPLY; + } + + msg = dbus_message_new_method_call(NULL, + DP_PATH, + IFACE_DP, + IFACE_DP_HOSTHANDLER); + if (msg == NULL) { + DEBUG(SSSDBG_CRIT_FAILURE, "Out of memory?!\n"); + return NULL; + } + + /* create the message */ + DEBUG(SSSDBG_TRACE_FUNC, + "Creating SSH host request for [%s][%u][%s][%s]\n", + info->dom->name, dp_flags, info->name, + info->alias == NULL ? "-" : info->alias); + + if (info->alias == NULL) { + info->alias = ""; + } + + dbret = dbus_message_append_args(msg, + DBUS_TYPE_UINT32, &dp_flags, + DBUS_TYPE_STRING, &info->name, + DBUS_TYPE_STRING, &info->alias, + DBUS_TYPE_INVALID); + if (!dbret) { + DEBUG(SSSDBG_CRIT_FAILURE, "Failed to build message\n"); + dbus_message_unref(msg); + return NULL; + } + + return msg; +} + +errno_t +sss_dp_get_ssh_host_recv(TALLOC_CTX *mem_ctx, + struct tevent_req *req, + dbus_uint16_t *dp_err, + dbus_uint32_t *dp_ret, + char **err_msg) +{ + return sss_dp_req_recv(mem_ctx, req, dp_err, dp_ret, err_msg); +} diff --git a/src/responder/ssh/sshsrv_dp.c b/src/responder/ssh/sshsrv_dp.c deleted file mode 100644 index f02c3f4..0000000 --- a/src/responder/ssh/sshsrv_dp.c +++ /dev/null @@ -1,156 +0,0 @@ -/* - Authors: - Jakub Hrozek <[email protected]> - - Copyright (C) 2012 Red Hat - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. -*/ - -#include <talloc.h> -#include <tevent.h> -#include <dbus/dbus.h> -#include "sbus/sssd_dbus.h" - -#include "util/util.h" -#include "sbus/sbus_client.h" -#include "providers/data_provider/dp_responder_iface.h" -#include "responder/common/responder.h" -#include "responder/ssh/sshsrv_private.h" - -struct sss_dp_get_ssh_host_info { - struct sss_domain_info *dom; - - bool fast_reply; - const char *name; - const char *alias; -}; - -static DBusMessage * -sss_dp_get_ssh_host_msg(void *pvt); - -struct tevent_req * -sss_dp_get_ssh_host_send(TALLOC_CTX *mem_ctx, - struct resp_ctx *rctx, - struct sss_domain_info *dom, - bool fast_reply, - const char *name, - const char *alias) -{ - errno_t ret; - struct tevent_req *req; - struct sss_dp_get_ssh_host_info *info; - struct sss_dp_req_state *state; - char *key; - - req = tevent_req_create(mem_ctx, &state, struct sss_dp_req_state); - if (!req) { - return NULL; - } - - if (!dom) { - ret = EINVAL; - goto error; - } - - info = talloc_zero(state, struct sss_dp_get_ssh_host_info); - info->fast_reply = fast_reply; - info->name = name; - info->alias = alias; - info->dom = dom; - - if (alias) { - key = talloc_asprintf(state, "%s:%s@%s", name, alias, dom->name); - } else { - key = talloc_asprintf(state, "%s@%s", name, dom->name); - } - if (!key) { - ret = ENOMEM; - goto error; - } - - ret = sss_dp_issue_request(state, rctx, key, dom, sss_dp_get_ssh_host_msg, - info, req); - talloc_free(key); - if (ret != EOK) { - DEBUG(SSSDBG_OP_FAILURE, - "Could not issue DP request [%d]: %s\n", - ret, strerror(ret)); - goto error; - } - - return req; - -error: - tevent_req_error(req, ret); - tevent_req_post(req, rctx->ev); - return req; -} - -static DBusMessage * -sss_dp_get_ssh_host_msg(void *pvt) -{ - DBusMessage *msg; - dbus_bool_t dbret; - struct sss_dp_get_ssh_host_info *info; - uint32_t dp_flags = 0; - - info = talloc_get_type(pvt, struct sss_dp_get_ssh_host_info); - - if (info->fast_reply) { - dp_flags |= DP_FAST_REPLY; - } - - msg = dbus_message_new_method_call(NULL, - DP_PATH, - IFACE_DP, - IFACE_DP_HOSTHANDLER); - if (msg == NULL) { - DEBUG(SSSDBG_CRIT_FAILURE, "Out of memory?!\n"); - return NULL; - } - - /* create the message */ - DEBUG(SSSDBG_TRACE_FUNC, - "Creating SSH host request for [%s][%u][%s][%s]\n", - info->dom->name, dp_flags, info->name, - info->alias == NULL ? "-" : info->alias); - - if (info->alias == NULL) { - info->alias = ""; - } - - dbret = dbus_message_append_args(msg, - DBUS_TYPE_UINT32, &dp_flags, - DBUS_TYPE_STRING, &info->name, - DBUS_TYPE_STRING, &info->alias, - DBUS_TYPE_INVALID); - if (!dbret) { - DEBUG(SSSDBG_CRIT_FAILURE, "Failed to build message\n"); - dbus_message_unref(msg); - return NULL; - } - - return msg; -} - -errno_t -sss_dp_get_ssh_host_recv(TALLOC_CTX *mem_ctx, - struct tevent_req *req, - dbus_uint16_t *dp_err, - dbus_uint32_t *dp_ret, - char **err_msg) -{ - return sss_dp_req_recv(mem_ctx, req, dp_err, dp_ret, err_msg); -} diff --git a/src/responder/ssh/sshsrv_private.h b/src/responder/ssh/sshsrv_private.h index 9553cd7..3ea8955 100644 --- a/src/responder/ssh/sshsrv_private.h +++ b/src/responder/ssh/sshsrv_private.h @@ -51,19 +51,4 @@ struct ssh_cmd_ctx { struct sss_cmd_table *get_ssh_cmds(void); -struct tevent_req * -sss_dp_get_ssh_host_send(TALLOC_CTX *mem_ctx, - struct resp_ctx *rctx, - struct sss_domain_info *dom, - bool fast_reply, - const char *name, - const char *alias); - -errno_t -sss_dp_get_ssh_host_recv(TALLOC_CTX *mem_ctx, - struct tevent_req *req, - dbus_uint16_t *dp_err, - dbus_uint32_t *dp_ret, - char **err_msg); - #endif /* _SSHSRV_PRIVATE_H_ */ diff --git a/src/tests/cmocka/common_mock_resp_dp.c b/src/tests/cmocka/common_mock_resp_dp.c index 61792eb..a5ed1f5 100644 --- a/src/tests/cmocka/common_mock_resp_dp.c +++ b/src/tests/cmocka/common_mock_resp_dp.c @@ -61,6 +61,39 @@ sss_dp_get_account_recv(TALLOC_CTX *mem_ctx, return test_request_recv(req); } +struct tevent_req * +sss_dp_get_ssh_host_send(TALLOC_CTX *mem_ctx, + struct resp_ctx *rctx, + struct sss_domain_info *dom, + bool fast_reply, + const char *name, + const char *alias) +{ + return test_req_succeed_send(mem_ctx, rctx->ev); +} + + +errno_t +sss_dp_get_ssh_host_recv(TALLOC_CTX *mem_ctx, + struct tevent_req *req, + dbus_uint16_t *dp_err, + dbus_uint32_t *dp_ret, + char **err_msg) +{ + acct_cb_t cb; + + *dp_err = sss_mock_type(dbus_uint16_t); + *dp_ret = sss_mock_type(dbus_uint32_t); + *err_msg = sss_mock_ptr_type(char *); + + cb = sss_mock_ptr_type(acct_cb_t); + if (cb) { + (cb)(sss_mock_ptr_type(void *)); + } + + return test_request_recv(req); +} + errno_t sss_dp_req_recv(TALLOC_CTX *mem_ctx, struct tevent_req *req, diff --git a/src/tests/cwrap/Makefile.am b/src/tests/cwrap/Makefile.am index 8ca0026..09a8b53 100644 --- a/src/tests/cwrap/Makefile.am +++ b/src/tests/cwrap/Makefile.am @@ -60,6 +60,7 @@ SSSD_CACHE_REQ_OBJ = \ ../../../src/responder/common/cache_req/plugins/cache_req_svc_by_name.c \ ../../../src/responder/common/cache_req/plugins/cache_req_svc_by_port.c \ ../../../src/responder/common/cache_req/plugins/cache_req_netgroup_by_name.c \ + ../../../src/responder/common/cache_req/plugins/cache_req_host_by_name.c \ $(NULL) SSSD_RESPONDER_OBJ = \ @@ -68,6 +69,7 @@ SSSD_RESPONDER_OBJ = \ ../../../src/responder/common/responder_cmd.c \ ../../../src/responder/common/responder_common.c \ ../../../src/responder/common/responder_dp.c \ + ../../../src/responder/common/responder_dp_ssh.c \ ../../../src/responder/common/responder_packet.c \ ../../../src/responder/common/responder_get_domains.c \ ../../../src/responder/common/responder_utils.c \
_______________________________________________ sssd-devel mailing list -- [email protected] To unsubscribe send an email to [email protected]
