Libssh-Session
view release on metacpan or search on metacpan
lib/Libssh/Session.pm view on Meta::CPAN
return $ret;
}
}
return SSH_OK;
}
# Deprecated
sub get_publickey {
my ($self, %options) = @_;
$self->{pubkey} = undef;
return ssh_get_server_publickey($self->{ssh_session});
}
sub get_server_publickey {
my ($self, %options) = @_;
$self->{pubkey} = undef;
return ssh_get_server_publickey($self->{ssh_session});
}
sub get_publickey_hash {
my ($self, %options) = @_;
my $hash_type = SSH_PUBLICKEY_HASH_SHA1;
if (defined($options{Type}) &&
($options{Type} == SSH_PUBLICKEY_HASH_SHA1 || $options{Type} == SSH_PUBLICKEY_HASH_MD5)) {
$hash_type = $options{Type};
}
return ssh_get_publickey_hash($self->{pubkey}, $hash_type);
}
sub get_hexa {
my ($self, %options) = @_;
return ssh_get_hexa($options{value});
}
# Deprecated. Use is_known_server
sub is_server_known {
my ($self, %options) = @_;
return ssh_session_is_known_server($self->{ssh_session});
}
sub is_known_server {
my ($self, %options) = @_;
return ssh_session_is_known_server($self->{ssh_session});
}
# Deprecated. Please use update_known_hosts
sub write_knownhost {
my ($self, %options) = @_;
return ssh_session_update_known_hosts($self->{ssh_session});
}
sub update_known_hosts {
my ($self, %options) = @_;
return ssh_session_update_known_hosts($self->{ssh_session});
}
sub verify_knownhost {
my ($self, %options) = @_;
my $ret = $self->is_known_server();
$self->{pubkey} = $self->get_server_publickey();
if (!defined($self->{pubkey})) {
$self->set_err(msg => sprintf("get server pubkey failed: %s", ssh_get_error_from_session($self->{ssh_session})));
return SSH_ERROR;
}
my $pubkey_hash = $self->get_publickey_hash();
ssh_key_free($self->{pubkey});
if (!defined($pubkey_hash)) {
$self->set_err(msg => sprintf("get server pubkey hash failed: %s", ssh_get_error_from_session($self->{ssh_session})));
return SSH_ERROR;
}
if ($ret == SSH_KNOWN_HOSTS_OK) {
return SSH_OK;
} elsif ($ret == SSH_KNOWN_HOSTS_ERROR) {
$self->set_err(msg => sprintf("knownhost failed: %s", ssh_get_error_from_session($self->{ssh_session})));
} elsif ($ret == SSH_KNOWN_HOSTS_NOT_FOUND || $ret == SSH_KNOWN_HOSTS_UNKNOWN) {
if ($self->update_known_hosts() == SSH_OK) {
return SSH_OK;
}
$self->set_err(msg => sprintf("knownhost write failed: %s", get_strerror()));
} elsif ($ret == SSH_KNOWN_HOSTS_CHANGED) {
return SSH_OK if (defined($options{SkipKeyProblem}) && $options{SkipKeyProblem});
$self->set_err(msg => sprintf("knownhost failed: Host key for server changed: it is now: %s",
$self->get_hexa(value => $pubkey_hash)));
} elsif ($ret == SSH_KNOWN_HOSTS_OTHER) {
return SSH_OK if (defined($options{SkipKeyProblem}) && $options{SkipKeyProblem});
$self->set_err(msg => sprintf("knownhost failed: The host key for this server was not found but an other type of key exists."));
}
return SSH_ERROR;
}
sub connect {
my ($self, %options) = @_;
my $skip_key_problem = defined($options{SkipKeyProblem}) ? $options{SkipKeyProblem} : 1;
my $ret = ssh_connect($self->{ssh_session});
if ($ret != SSH_OK) {
$self->set_err(msg => sprintf("connect failed: %s", ssh_get_error_from_session($self->{ssh_session})));
return $ret;
}
if (!(defined($options{connect_only}) && $options{connect_only} == 1)) {
if (($ret = $self->verify_knownhost(SkipKeyProblem => $skip_key_problem)) != SSH_OK) {
return $ret;
}
}
return SSH_OK;
( run in 1.109 second using v1.01-cache-2.11-cpan-df04353d9ac )