mirror of
https://github.com/phpseclib/phpseclib.git
synced 2025-01-27 17:18:25 +00:00
SSH1: do fsockopen() call when login has been called
This commit is contained in:
parent
6fcfe5c885
commit
24bb941799
@ -182,8 +182,9 @@ define('NET_SSH1_RESPONSE_DATA', 2);
|
|||||||
* @access private
|
* @access private
|
||||||
*/
|
*/
|
||||||
define('NET_SSH1_MASK_CONSTRUCTOR', 0x00000001);
|
define('NET_SSH1_MASK_CONSTRUCTOR', 0x00000001);
|
||||||
define('NET_SSH1_MASK_LOGIN', 0x00000002);
|
define('NET_SSH1_MASK_CONNECTED', 0x00000002);
|
||||||
define('NET_SSH1_MASK_SHELL', 0x00000004);
|
define('NET_SSH1_MASK_LOGIN', 0x00000004);
|
||||||
|
define('NET_SSH1_MASK_SHELL', 0x00000008);
|
||||||
/**#@-*/
|
/**#@-*/
|
||||||
|
|
||||||
/**#@+
|
/**#@+
|
||||||
@ -457,6 +458,48 @@ class Net_SSH1
|
|||||||
*/
|
*/
|
||||||
var $log_short_width = 16;
|
var $log_short_width = 16;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Hostname
|
||||||
|
*
|
||||||
|
* @see Net_SSH1::Net_SSH1()
|
||||||
|
* @see Net_SSH1::_connect()
|
||||||
|
* @var String
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $host;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Port Number
|
||||||
|
*
|
||||||
|
* @see Net_SSH1::Net_SSH1()
|
||||||
|
* @see Net_SSH1::_connect()
|
||||||
|
* @var Integer
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $port;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Timeout for Constructor
|
||||||
|
*
|
||||||
|
* For historical BC purposes setTimeout() does not effect timeout of constructor
|
||||||
|
*
|
||||||
|
* @see Net_SSH1::Net_SSH1()
|
||||||
|
* @see Net_SSH1::_connect()
|
||||||
|
* @var Integer
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $constructorTimeout;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Default cipher
|
||||||
|
*
|
||||||
|
* @see Net_SSH1::Net_SSH1()
|
||||||
|
* @see Net_SSH1::_connect()
|
||||||
|
* @var Integer
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
var $cipher;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default Constructor.
|
* Default Constructor.
|
||||||
*
|
*
|
||||||
@ -505,10 +548,24 @@ class Net_SSH1
|
|||||||
|
|
||||||
$this->_define_array($this->protocol_flags);
|
$this->_define_array($this->protocol_flags);
|
||||||
|
|
||||||
$this->fsock = @fsockopen($host, $port, $errno, $errstr, $timeout);
|
$this->host = $host;
|
||||||
|
$this->port = $port;
|
||||||
|
$this->constructorTimeout = $timeout;
|
||||||
|
$this->cipher = $cipher;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Connect to an SSHv1 server
|
||||||
|
*
|
||||||
|
* @return Boolean
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
function _connect()
|
||||||
|
{
|
||||||
|
$this->fsock = @fsockopen($this->host, $this->port, $errno, $errstr, $this->constructorTimeout);
|
||||||
if (!$this->fsock) {
|
if (!$this->fsock) {
|
||||||
user_error(rtrim("Cannot connect to $host. Error $errno. $errstr"));
|
user_error(rtrim("Cannot connect to $this->host:$this->port. Error $errno. $errstr"));
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->server_identification = $init_line = fgets($this->fsock, 255);
|
$this->server_identification = $init_line = fgets($this->fsock, 255);
|
||||||
@ -520,11 +577,11 @@ class Net_SSH1
|
|||||||
|
|
||||||
if (!preg_match('#SSH-([0-9\.]+)-(.+)#', $init_line, $parts)) {
|
if (!preg_match('#SSH-([0-9\.]+)-(.+)#', $init_line, $parts)) {
|
||||||
user_error('Can only connect to SSH servers');
|
user_error('Can only connect to SSH servers');
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
if ($parts[1][0] != 1) {
|
if ($parts[1][0] != 1) {
|
||||||
user_error("Cannot connect to SSH $parts[1] servers");
|
user_error("Cannot connect to SSH $parts[1] servers");
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
fputs($this->fsock, $this->identifier."\r\n");
|
fputs($this->fsock, $this->identifier."\r\n");
|
||||||
@ -532,7 +589,7 @@ class Net_SSH1
|
|||||||
$response = $this->_get_binary_packet();
|
$response = $this->_get_binary_packet();
|
||||||
if ($response[NET_SSH1_RESPONSE_TYPE] != NET_SSH1_SMSG_PUBLIC_KEY) {
|
if ($response[NET_SSH1_RESPONSE_TYPE] != NET_SSH1_SMSG_PUBLIC_KEY) {
|
||||||
user_error('Expected SSH_SMSG_PUBLIC_KEY');
|
user_error('Expected SSH_SMSG_PUBLIC_KEY');
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
$anti_spoofing_cookie = $this->_string_shift($response[NET_SSH1_RESPONSE_DATA], 8);
|
$anti_spoofing_cookie = $this->_string_shift($response[NET_SSH1_RESPONSE_DATA], 8);
|
||||||
@ -612,12 +669,12 @@ class Net_SSH1
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
$cipher = isset($this->supported_ciphers[$cipher]) ? $cipher : NET_SSH1_CIPHER_3DES;
|
$cipher = isset($this->supported_ciphers[$this->cipher]) ? $this->cipher : NET_SSH1_CIPHER_3DES;
|
||||||
$data = pack('C2a*na*N', NET_SSH1_CMSG_SESSION_KEY, $cipher, $anti_spoofing_cookie, 8 * strlen($double_encrypted_session_key), $double_encrypted_session_key, 0);
|
$data = pack('C2a*na*N', NET_SSH1_CMSG_SESSION_KEY, $cipher, $anti_spoofing_cookie, 8 * strlen($double_encrypted_session_key), $double_encrypted_session_key, 0);
|
||||||
|
|
||||||
if (!$this->_send_binary_packet($data)) {
|
if (!$this->_send_binary_packet($data)) {
|
||||||
user_error('Error sending SSH_CMSG_SESSION_KEY');
|
user_error('Error sending SSH_CMSG_SESSION_KEY');
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch ($cipher) {
|
switch ($cipher) {
|
||||||
@ -656,10 +713,12 @@ class Net_SSH1
|
|||||||
|
|
||||||
if ($response[NET_SSH1_RESPONSE_TYPE] != NET_SSH1_SMSG_SUCCESS) {
|
if ($response[NET_SSH1_RESPONSE_TYPE] != NET_SSH1_SMSG_SUCCESS) {
|
||||||
user_error('Expected SSH_SMSG_SUCCESS');
|
user_error('Expected SSH_SMSG_SUCCESS');
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->bitmap = NET_SSH1_MASK_CONSTRUCTOR;
|
$this->bitmap = NET_SSH1_MASK_CONNECTED;
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -673,6 +732,13 @@ class Net_SSH1
|
|||||||
function login($username, $password = '')
|
function login($username, $password = '')
|
||||||
{
|
{
|
||||||
if (!($this->bitmap & NET_SSH1_MASK_CONSTRUCTOR)) {
|
if (!($this->bitmap & NET_SSH1_MASK_CONSTRUCTOR)) {
|
||||||
|
$this->bitmap |= NET_SSH1_MASK_CONSTRUCTOR;
|
||||||
|
if (!$this->_connect()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!($this->bitmap & NET_SSH1_MASK_CONNECTED)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user