From 9e896dc45792ea7d2f267b4fbd49542d10339c63 Mon Sep 17 00:00:00 2001 From: Jan Cholasta Date: Fri, 24 Feb 2012 12:48:08 -0500 Subject: SSH: Save SSH host name aliases --- src/responder/ssh/sshsrv_cmd.c | 26 +++++++++++++++++++++++++- src/responder/ssh/sshsrv_private.h | 1 + 2 files changed, 26 insertions(+), 1 deletion(-) (limited to 'src/responder') diff --git a/src/responder/ssh/sshsrv_cmd.c b/src/responder/ssh/sshsrv_cmd.c index 0a182f31..da6a4540 100644 --- a/src/responder/ssh/sshsrv_cmd.c +++ b/src/responder/ssh/sshsrv_cmd.c @@ -22,6 +22,7 @@ #include #include +#include #include "util/util.h" #include "util/crypto/sss_crypto.h" @@ -90,6 +91,8 @@ sss_ssh_cmd_get_host_pubkeys(struct cli_ctx *cctx) { struct ssh_cmd_ctx *cmd_ctx; errno_t ret; + struct addrinfo ai_hint; + struct addrinfo *ai = NULL; cmd_ctx = talloc_zero(cctx, struct ssh_cmd_ctx); if (!cmd_ctx) { @@ -107,6 +110,27 @@ sss_ssh_cmd_get_host_pubkeys(struct cli_ctx *cctx) ("Requesting SSH host public keys for [%s] from [%s]\n", cmd_ctx->name, cmd_ctx->domname ? cmd_ctx->domname : "")); + /* canonicalize host name */ + memset(&ai_hint, 0, sizeof(struct addrinfo)); + ai_hint.ai_flags = AI_CANONNAME; + + ret = getaddrinfo(cmd_ctx->name, NULL, &ai_hint, &ai); + if (!ret) { + if (strcmp(cmd_ctx->name, ai[0].ai_canonname) != 0) { + cmd_ctx->alias = cmd_ctx->name; + cmd_ctx->name = talloc_strdup(cmd_ctx, ai[0].ai_canonname); + if (!cmd_ctx->name) { + ret = ENOMEM; + goto done; + } + } + } else { + DEBUG(SSSDBG_OP_FAILURE, + ("getaddrinfo() failed (%d): %s\n", ret, gai_strerror(ret))); + } + + freeaddrinfo(ai); + if (cmd_ctx->domname) { cmd_ctx->domain = responder_get_domain(cctx->rctx->domains, cmd_ctx->domname); @@ -312,7 +336,7 @@ ssh_host_pubkeys_search(struct ssh_cmd_ctx *cmd_ctx) 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, NULL); + cmd_ctx->name, 0, cmd_ctx->alias); if (!req) { DEBUG(SSSDBG_CRIT_FAILURE, ("Out of memory sending data provider request\n")); diff --git a/src/responder/ssh/sshsrv_private.h b/src/responder/ssh/sshsrv_private.h index 26ed6b92..ffe88eb3 100644 --- a/src/responder/ssh/sshsrv_private.h +++ b/src/responder/ssh/sshsrv_private.h @@ -34,6 +34,7 @@ struct ssh_cmd_ctx { struct cli_ctx *cctx; enum sss_dp_acct_type type; char *name; + char *alias; char *domname; struct sss_domain_info *domain; -- cgit