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 )