From b42b5d5aaf4da165582e73ad985fdff6e34e61e4 Mon Sep 17 00:00:00 2001 From: Jakub Hrozek Date: Wed, 18 Apr 2012 14:27:44 +0200 Subject: SSH: Add dp_get_host_send to common responder code Instead of using account_info request, creates a new ssh specific request. This improves code readability and will make the code more flexible in the future. https://fedorahosted.org/sssd/ticket/1176 --- src/responder/common/responder.h | 3 +- src/responder/common/responder_dp.c | 12 +-- src/responder/ssh/sshsrv_cmd.c | 14 ++-- src/responder/ssh/sshsrv_dp.c | 163 ++++++++++++++++++++++++++++++++++++ src/responder/ssh/sshsrv_private.h | 16 +++- 5 files changed, 186 insertions(+), 22 deletions(-) create mode 100644 src/responder/ssh/sshsrv_dp.c (limited to 'src/responder') diff --git a/src/responder/common/responder.h b/src/responder/common/responder.h index 30a7101d4..27a58eae5 100644 --- a/src/responder/common/responder.h +++ b/src/responder/common/responder.h @@ -253,8 +253,7 @@ enum sss_dp_acct_type { SSS_DP_GROUP, SSS_DP_INITGROUPS, SSS_DP_NETGR, - SSS_DP_SERVICES, - SSS_DP_HOST + SSS_DP_SERVICES }; struct tevent_req * diff --git a/src/responder/common/responder_dp.c b/src/responder/common/responder_dp.c index 7362bd74b..ca9cb834d 100644 --- a/src/responder/common/responder_dp.c +++ b/src/responder/common/responder_dp.c @@ -490,34 +490,24 @@ sss_dp_get_account_msg(void *pvt) uint32_t be_type; uint32_t attrs = BE_ATTR_CORE; char *filter; - const char *dp_method; info = talloc_get_type(pvt, struct sss_dp_account_info); switch (info->type) { case SSS_DP_USER: be_type = BE_REQ_USER; - dp_method = DP_METHOD_GETACCTINFO; break; case SSS_DP_GROUP: be_type = BE_REQ_GROUP; - dp_method = DP_METHOD_GETACCTINFO; break; case SSS_DP_INITGROUPS: be_type = BE_REQ_INITGROUPS; - dp_method = DP_METHOD_GETACCTINFO; break; case SSS_DP_NETGR: be_type = BE_REQ_NETGROUP; - dp_method = DP_METHOD_GETACCTINFO; break; case SSS_DP_SERVICES: be_type = BE_REQ_SERVICES; - dp_method = DP_METHOD_GETACCTINFO; - break; - case SSS_DP_HOST: - be_type = 0; - dp_method = DP_METHOD_HOSTHANDLER; break; } @@ -550,7 +540,7 @@ sss_dp_get_account_msg(void *pvt) msg = dbus_message_new_method_call(NULL, DP_PATH, DP_INTERFACE, - dp_method); + DP_METHOD_GETACCTINFO); if (msg == NULL) { talloc_free(filter); DEBUG(SSSDBG_CRIT_FAILURE, ("Out of memory?!\n")); diff --git a/src/responder/ssh/sshsrv_cmd.c b/src/responder/ssh/sshsrv_cmd.c index 0740cd25c..fa02025e8 100644 --- a/src/responder/ssh/sshsrv_cmd.c +++ b/src/responder/ssh/sshsrv_cmd.c @@ -55,7 +55,6 @@ sss_ssh_cmd_get_user_pubkeys(struct cli_ctx *cctx) return ENOMEM; } cmd_ctx->cctx = cctx; - cmd_ctx->type = SSS_DP_USER; ret = ssh_cmd_parse_request(cmd_ctx); if (ret != EOK) { @@ -98,7 +97,6 @@ sss_ssh_cmd_get_host_pubkeys(struct cli_ctx *cctx) return ENOMEM; } cmd_ctx->cctx = cctx; - cmd_ctx->type = SSS_DP_HOST; ret = ssh_cmd_parse_request(cmd_ctx); if (ret != EOK) { @@ -139,9 +137,9 @@ ssh_dp_send_req_done(struct tevent_req *req) dbus_uint32_t err_min; char *err_msg; - ret = sss_dp_get_account_recv(cb_ctx->mem_ctx, req, - &err_maj, &err_min, - &err_msg); + ret = sss_dp_get_ssh_host_recv(cb_ctx->mem_ctx, req, + &err_maj, &err_min, + &err_msg); talloc_zfree(req); if (ret != EOK) { DEBUG(SSSDBG_CRIT_FAILURE, @@ -312,9 +310,9 @@ ssh_host_pubkeys_search(struct ssh_cmd_ctx *cmd_ctx) /* refresh the host's cache entry */ if (NEED_CHECK_PROVIDER(cmd_ctx->domain->provider)) { - req = sss_dp_get_account_send(cmd_ctx, cmd_ctx->cctx->rctx, - cmd_ctx->domain, false, SSS_DP_HOST, - cmd_ctx->name, 0, cmd_ctx->alias); + req = sss_dp_get_ssh_host_send(cmd_ctx, cmd_ctx->cctx->rctx, + cmd_ctx->domain, false, + cmd_ctx->name, cmd_ctx->alias); if (!req) { DEBUG(SSSDBG_CRIT_FAILURE, ("Out of memory sending data provider request\n")); diff --git a/src/responder/ssh/sshsrv_dp.c b/src/responder/ssh/sshsrv_dp.c new file mode 100644 index 000000000..dbdcd479e --- /dev/null +++ b/src/responder/ssh/sshsrv_dp.c @@ -0,0 +1,163 @@ +/* + Authors: + Jakub Hrozek + + 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 . +*/ + +#include +#include +#include +#include "sbus/sssd_dbus.h" + +#include "util/util.h" +#include "sbus/sbus_client.h" +#include "providers/data_provider.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) { + ret = ENOMEM; + goto error; + } + + 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 be_type = 0; + char *filter; + + info = talloc_get_type(pvt, struct sss_dp_get_ssh_host_info); + + if (info->fast_reply) { + be_type |= BE_REQ_FAST; + } + + if (info->alias) { + filter = talloc_asprintf(info, "name=%s:%s", info->name, info->alias); + } else { + filter = talloc_asprintf(info, "name=%s", info->name); + } + if (!filter) { + DEBUG(SSSDBG_CRIT_FAILURE, ("Out of memory?!\n")); + return NULL; + } + + msg = dbus_message_new_method_call(NULL, + DP_PATH, + DP_INTERFACE, + DP_METHOD_HOSTHANDLER); + if (msg == NULL) { + DEBUG(SSSDBG_CRIT_FAILURE, ("Out of memory?!\n")); + talloc_free(filter); + return NULL; + } + + /* create the message */ + DEBUG(SSSDBG_TRACE_FUNC, + ("Creating SSH host request for [%s][%u][%s]\n", + info->dom->name, be_type, filter)); + + dbret = dbus_message_append_args(msg, + DBUS_TYPE_UINT32, &be_type, + DBUS_TYPE_STRING, &filter, + DBUS_TYPE_INVALID); + talloc_free(filter); + 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 d74b49250..e63a3105c 100644 --- a/src/responder/ssh/sshsrv_private.h +++ b/src/responder/ssh/sshsrv_private.h @@ -37,7 +37,6 @@ struct ssh_ctx { struct ssh_cmd_ctx { struct cli_ctx *cctx; - enum sss_dp_acct_type type; char *name; char *alias; char *domname; @@ -51,4 +50,19 @@ 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_ */ -- cgit