mirror of
https://git.libssh.org/projects/libssh.git
synced 2026-02-09 09:54:25 +09:00
Added support for StrictHostKeyChecking and UserKnownHostsFile parameters.
Added OpenSSH parameters to libssh:
- StrictHostKeyChecking
- UserKnownHostsFile
This parameters are useful to avoid checking the fingerprint. Eg:
~/.ssh/config:
Host 192.10.20.30
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
Signed-off-by: Ruben Garcia Azuara <rubenga@tid.es>
Signed-off-by: Andreas Schneider <mail@cynapses.org>
This commit is contained in:
committed by
Andreas Schneider
parent
14eb593af3
commit
5a2abd34ce
@@ -269,11 +269,11 @@ enum ssh_options_e {
|
|||||||
SSH_OPTIONS_SSH2,
|
SSH_OPTIONS_SSH2,
|
||||||
SSH_OPTIONS_LOG_VERBOSITY,
|
SSH_OPTIONS_LOG_VERBOSITY,
|
||||||
SSH_OPTIONS_LOG_VERBOSITY_STR,
|
SSH_OPTIONS_LOG_VERBOSITY_STR,
|
||||||
|
|
||||||
SSH_OPTIONS_CIPHERS_C_S,
|
SSH_OPTIONS_CIPHERS_C_S,
|
||||||
SSH_OPTIONS_CIPHERS_S_C,
|
SSH_OPTIONS_CIPHERS_S_C,
|
||||||
SSH_OPTIONS_COMPRESSION_C_S,
|
SSH_OPTIONS_COMPRESSION_C_S,
|
||||||
SSH_OPTIONS_COMPRESSION_S_C
|
SSH_OPTIONS_COMPRESSION_S_C,
|
||||||
|
SSH_OPTIONS_HOSTKEYCHECK
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
|
|||||||
@@ -141,7 +141,7 @@ struct ssh_session_struct {
|
|||||||
socket_t fd;
|
socket_t fd;
|
||||||
int ssh2;
|
int ssh2;
|
||||||
int ssh1;
|
int ssh1;
|
||||||
|
int StrictHostKeyChecking;
|
||||||
};
|
};
|
||||||
|
|
||||||
int ssh_handle_packets(ssh_session session, int timeout);
|
int ssh_handle_packets(ssh_session session, int timeout);
|
||||||
|
|||||||
@@ -38,7 +38,9 @@ enum ssh_config_opcode_e {
|
|||||||
SOC_CIPHERS,
|
SOC_CIPHERS,
|
||||||
SOC_COMPRESSION,
|
SOC_COMPRESSION,
|
||||||
SOC_TIMEOUT,
|
SOC_TIMEOUT,
|
||||||
SOC_PROTOCOL
|
SOC_PROTOCOL,
|
||||||
|
SOC_HOSTKEYCHECK,
|
||||||
|
SOC_KNOWNHOSTS
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ssh_config_keyword_table_s {
|
struct ssh_config_keyword_table_s {
|
||||||
@@ -56,6 +58,8 @@ static struct ssh_config_keyword_table_s ssh_config_keyword_table[] = {
|
|||||||
{ "compression", SOC_COMPRESSION },
|
{ "compression", SOC_COMPRESSION },
|
||||||
{ "connecttimeout", SOC_TIMEOUT },
|
{ "connecttimeout", SOC_TIMEOUT },
|
||||||
{ "protocol", SOC_PROTOCOL },
|
{ "protocol", SOC_PROTOCOL },
|
||||||
|
{ "stricthostkeychecking", SOC_HOSTKEYCHECK },
|
||||||
|
{ "userknownhostsfile", SOC_KNOWNHOSTS },
|
||||||
{ NULL, SOC_UNSUPPORTED }
|
{ NULL, SOC_UNSUPPORTED }
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -276,6 +280,18 @@ static int ssh_config_parse_line(ssh_session session, const char *line,
|
|||||||
ssh_options_set(session, SSH_OPTIONS_TIMEOUT, &i);
|
ssh_options_set(session, SSH_OPTIONS_TIMEOUT, &i);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case SOC_HOSTKEYCHECK:
|
||||||
|
i = ssh_config_get_yesno(&s, -1);
|
||||||
|
if (i >= 0 && *parsing) {
|
||||||
|
ssh_options_set(session, SSH_OPTIONS_HOSTKEYCHECK, &i);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case SOC_KNOWNHOSTS:
|
||||||
|
p = ssh_config_get_str(&s, NULL);
|
||||||
|
if (p && *parsing) {
|
||||||
|
ssh_options_set(session, SSH_OPTIONS_KNOWNHOSTS, p);
|
||||||
|
}
|
||||||
|
break;
|
||||||
case SOC_UNSUPPORTED:
|
case SOC_UNSUPPORTED:
|
||||||
fprintf(stderr, "Unsupported option: %s, line: %d\n", keyword, count);
|
fprintf(stderr, "Unsupported option: %s, line: %d\n", keyword, count);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -1648,6 +1648,11 @@ int ssh_is_server_known(ssh_session session) {
|
|||||||
}
|
}
|
||||||
} while (1);
|
} while (1);
|
||||||
|
|
||||||
|
if ( (ret == SSH_SERVER_NOT_KNOWN) && (session->StrictHostKeyChecking == 0) ) {
|
||||||
|
ssh_write_knownhost(session);
|
||||||
|
ret = SSH_SERVER_KNOWN_OK;
|
||||||
|
}
|
||||||
|
|
||||||
SAFE_FREE(host);
|
SAFE_FREE(host);
|
||||||
if (file != NULL) {
|
if (file != NULL) {
|
||||||
fclose(file);
|
fclose(file);
|
||||||
|
|||||||
@@ -362,6 +362,10 @@ char *dir_expand_dup(ssh_session session, const char *value, int allowsshdir) {
|
|||||||
* Set the compression to use for server to client
|
* Set the compression to use for server to client
|
||||||
* communication (string, "none" or "zlib").
|
* communication (string, "none" or "zlib").
|
||||||
*
|
*
|
||||||
|
* - SSH_OPTIONS_HOSTKEYCHECK:
|
||||||
|
* Set the parameter StrictHostKeyChecking to avoid
|
||||||
|
* asking about a fingerprint
|
||||||
|
*
|
||||||
* @param value The value to set. This is a generic pointer and the
|
* @param value The value to set. This is a generic pointer and the
|
||||||
* datatype which is used should be set according to the
|
* datatype which is used should be set according to the
|
||||||
* type set.
|
* type set.
|
||||||
@@ -612,6 +616,14 @@ int ssh_options_set(ssh_session session, enum ssh_options_e type,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case SSH_OPTIONS_HOSTKEYCHECK:
|
||||||
|
if (value == NULL) {
|
||||||
|
ssh_set_error_invalid(session, __FUNCTION__);
|
||||||
|
return -1;
|
||||||
|
} else {
|
||||||
|
session->StrictHostKeyChecking = *(int*)value;
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
ssh_set_error(session, SSH_REQUEST_DENIED, "Unknown ssh option %d", type);
|
ssh_set_error(session, SSH_REQUEST_DENIED, "Unknown ssh option %d", type);
|
||||||
return -1;
|
return -1;
|
||||||
|
|||||||
@@ -90,6 +90,7 @@ ssh_session ssh_new(void) {
|
|||||||
session->maxchannel = FIRST_CHANNEL;
|
session->maxchannel = FIRST_CHANNEL;
|
||||||
|
|
||||||
/* options */
|
/* options */
|
||||||
|
session->StrictHostKeyChecking = 1;
|
||||||
session->port = 22;
|
session->port = 22;
|
||||||
session->fd = -1;
|
session->fd = -1;
|
||||||
session->ssh2 = 1;
|
session->ssh2 = 1;
|
||||||
|
|||||||
Reference in New Issue
Block a user