libssh: avoid options override by configuration files
Previously, options set explicitly through command line options could be overridden by the configuration files parsed automatically when ssh_connect() was called. By calling ssh_options_parse_config() explicitly, the configuration files are parsed before setting the options, avoiding the options override. Once the configuration files are parsed, the automatic configuration parsing is not executed. Fixes #4972 Closes #5283 Signed-off-by: Anderson Toshiyuki Sasaki <ansasaki@redhat.com>
This commit is contained in:
Родитель
11091cd4d2
Коммит
7bc709f670
|
@ -2149,6 +2149,7 @@ static CURLcode myssh_connect(struct connectdata *conn, bool *done)
|
|||
CURLcode result;
|
||||
curl_socket_t sock = conn->sock[FIRSTSOCKET];
|
||||
struct Curl_easy *data = conn->data;
|
||||
int rc;
|
||||
|
||||
/* initialize per-handle data if not already */
|
||||
if(!data->req.protop)
|
||||
|
@ -2175,38 +2176,70 @@ static CURLcode myssh_connect(struct connectdata *conn, bool *done)
|
|||
return CURLE_FAILED_INIT;
|
||||
}
|
||||
|
||||
ssh_options_set(ssh->ssh_session, SSH_OPTIONS_FD, &sock);
|
||||
rc = ssh_options_set(ssh->ssh_session, SSH_OPTIONS_HOST, conn->host.name);
|
||||
if(rc != SSH_OK) {
|
||||
failf(data, "Could not set remote host");
|
||||
return CURLE_FAILED_INIT;
|
||||
}
|
||||
|
||||
if(conn->user) {
|
||||
rc = ssh_options_parse_config(ssh->ssh_session, NULL);
|
||||
if(rc != SSH_OK) {
|
||||
infof(data, "Could not parse SSH configuration files");
|
||||
/* ignore */
|
||||
}
|
||||
|
||||
rc = ssh_options_set(ssh->ssh_session, SSH_OPTIONS_FD, &sock);
|
||||
if(rc != SSH_OK) {
|
||||
failf(data, "Could not set socket");
|
||||
return CURLE_FAILED_INIT;
|
||||
}
|
||||
|
||||
if(conn->user && conn->user[0] != '\0') {
|
||||
infof(data, "User: %s\n", conn->user);
|
||||
ssh_options_set(ssh->ssh_session, SSH_OPTIONS_USER, conn->user);
|
||||
rc = ssh_options_set(ssh->ssh_session, SSH_OPTIONS_USER, conn->user);
|
||||
if(rc != SSH_OK) {
|
||||
failf(data, "Could not set user");
|
||||
return CURLE_FAILED_INIT;
|
||||
}
|
||||
}
|
||||
|
||||
if(data->set.str[STRING_SSH_KNOWNHOSTS]) {
|
||||
infof(data, "Known hosts: %s\n", data->set.str[STRING_SSH_KNOWNHOSTS]);
|
||||
ssh_options_set(ssh->ssh_session, SSH_OPTIONS_KNOWNHOSTS,
|
||||
data->set.str[STRING_SSH_KNOWNHOSTS]);
|
||||
rc = ssh_options_set(ssh->ssh_session, SSH_OPTIONS_KNOWNHOSTS,
|
||||
data->set.str[STRING_SSH_KNOWNHOSTS]);
|
||||
if(rc != SSH_OK) {
|
||||
failf(data, "Could not set known hosts file path");
|
||||
return CURLE_FAILED_INIT;
|
||||
}
|
||||
}
|
||||
|
||||
ssh_options_set(ssh->ssh_session, SSH_OPTIONS_HOST, conn->host.name);
|
||||
if(conn->remote_port)
|
||||
ssh_options_set(ssh->ssh_session, SSH_OPTIONS_PORT,
|
||||
&conn->remote_port);
|
||||
if(conn->remote_port) {
|
||||
rc = ssh_options_set(ssh->ssh_session, SSH_OPTIONS_PORT,
|
||||
&conn->remote_port);
|
||||
if(rc != SSH_OK) {
|
||||
failf(data, "Could not set remote port");
|
||||
return CURLE_FAILED_INIT;
|
||||
}
|
||||
}
|
||||
|
||||
if(data->set.ssh_compression) {
|
||||
ssh_options_set(ssh->ssh_session, SSH_OPTIONS_COMPRESSION,
|
||||
"zlib,zlib@openssh.com,none");
|
||||
rc = ssh_options_set(ssh->ssh_session, SSH_OPTIONS_COMPRESSION,
|
||||
"zlib,zlib@openssh.com,none");
|
||||
if(rc != SSH_OK) {
|
||||
failf(data, "Could not set compression");
|
||||
return CURLE_FAILED_INIT;
|
||||
}
|
||||
}
|
||||
|
||||
ssh->privkey = NULL;
|
||||
ssh->pubkey = NULL;
|
||||
|
||||
if(data->set.str[STRING_SSH_PUBLIC_KEY]) {
|
||||
int rc = ssh_pki_import_pubkey_file(data->set.str[STRING_SSH_PUBLIC_KEY],
|
||||
&ssh->pubkey);
|
||||
rc = ssh_pki_import_pubkey_file(data->set.str[STRING_SSH_PUBLIC_KEY],
|
||||
&ssh->pubkey);
|
||||
if(rc != SSH_OK) {
|
||||
failf(data, "Could not load public key file");
|
||||
/* ignore */
|
||||
return CURLE_FAILED_INIT;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче