summaryrefslogtreecommitdiffstats
path: root/src/responder/ssh
diff options
context:
space:
mode:
authorJakub Hrozek <jhrozek@redhat.com>2012-04-18 14:27:44 +0200
committerStephen Gallagher <sgallagh@redhat.com>2012-05-03 11:46:18 -0400
commitb42b5d5aaf4da165582e73ad985fdff6e34e61e4 (patch)
tree3628fa960f554e1971952e369ff3576ba6adef11 /src/responder/ssh
parentd226a2a0f8e6738507874f3e04bf281c2bf526b1 (diff)
downloadsssd-b42b5d5aaf4da165582e73ad985fdff6e34e61e4.tar.gz
sssd-b42b5d5aaf4da165582e73ad985fdff6e34e61e4.tar.xz
sssd-b42b5d5aaf4da165582e73ad985fdff6e34e61e4.zip
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
Diffstat (limited to 'src/responder/ssh')
-rw-r--r--src/responder/ssh/sshsrv_cmd.c14
-rw-r--r--src/responder/ssh/sshsrv_dp.c163
-rw-r--r--src/responder/ssh/sshsrv_private.h16
3 files changed, 184 insertions, 9 deletions
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 <jhrozek@redhat.com>
+
+ 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.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_ */