mirror of
https://github.com/phpseclib/phpseclib.git
synced 2024-11-15 01:44:06 +00:00
Merge branch 'keepalive-1.0' into keepalive-2.0
This commit is contained in:
commit
a35535e9c6
@ -3336,6 +3336,57 @@ class SSH2
|
|||||||
*/
|
*/
|
||||||
function _get_binary_packet($skip_channel_filter = false)
|
function _get_binary_packet($skip_channel_filter = false)
|
||||||
{
|
{
|
||||||
|
if ($skip_channel_filter) {
|
||||||
|
$read = array($this->fsock);
|
||||||
|
$write = $except = null;
|
||||||
|
|
||||||
|
if ($this->curTimeout <= 0) {
|
||||||
|
if ($this->keepAlive <= 0) {
|
||||||
|
@stream_select($read, $write, $except, null);
|
||||||
|
} else {
|
||||||
|
if (!@stream_select($read, $write, $except, $this->keepAlive) && !count($read)) {
|
||||||
|
$this->_send_binary_packet(pack('CN', NET_SSH2_MSG_IGNORE, 0));
|
||||||
|
return $this->_get_binary_packet(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if ($this->curTimeout < 0) {
|
||||||
|
$this->is_timeout = true;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
$read = array($this->fsock);
|
||||||
|
$write = $except = null;
|
||||||
|
|
||||||
|
$start = strtok(microtime(), ' ') + strtok(''); // http://php.net/microtime#61838
|
||||||
|
|
||||||
|
if ($this->keepAlive > 0 && $this->keepAlive < $this->curTimeout) {
|
||||||
|
if (!@stream_select($read, $write, $except, $this->keepAlive) && !count($read)) {
|
||||||
|
$this->_send_binary_packet(pack('CN', NET_SSH2_MSG_IGNORE, 0));
|
||||||
|
$elapsed = strtok(microtime(), ' ') + strtok('') - $start;
|
||||||
|
$this->curTimeout-= $elapsed;
|
||||||
|
return $this->_get_binary_packet(true);
|
||||||
|
}
|
||||||
|
$elapsed = strtok(microtime(), ' ') + strtok('') - $start;
|
||||||
|
$this->curTimeout-= $elapsed;
|
||||||
|
}
|
||||||
|
|
||||||
|
$sec = floor($this->curTimeout);
|
||||||
|
$usec = 1000000 * ($this->curTimeout - $sec);
|
||||||
|
|
||||||
|
// on windows this returns a "Warning: Invalid CRT parameters detected" error
|
||||||
|
if (!@stream_select($read, $write, $except, $sec, $usec) && !count($read)) {
|
||||||
|
$this->is_timeout = true;
|
||||||
|
if ($client_channel == self::CHANNEL_EXEC && !$this->request_pty) {
|
||||||
|
$this->_close_channel($client_channel);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
$elapsed = strtok(microtime(), ' ') + strtok('') - $start;
|
||||||
|
$this->curTimeout-= $elapsed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!is_resource($this->fsock) || feof($this->fsock)) {
|
if (!is_resource($this->fsock) || feof($this->fsock)) {
|
||||||
$this->bitmap = 0;
|
$this->bitmap = 0;
|
||||||
user_error('Connection closed prematurely');
|
user_error('Connection closed prematurely');
|
||||||
@ -3487,9 +3538,19 @@ class SSH2
|
|||||||
// only called when we've already logged in
|
// only called when we've already logged in
|
||||||
if (($this->bitmap & self::MASK_CONNECTED) && $this->isAuthenticated()) {
|
if (($this->bitmap & self::MASK_CONNECTED) && $this->isAuthenticated()) {
|
||||||
switch (ord($payload[0])) {
|
switch (ord($payload[0])) {
|
||||||
|
case NET_SSH2_MSG_CHANNEL_REQUEST:
|
||||||
|
if (strlen($payload) == 31) {
|
||||||
|
extract(unpack('cpacket_type/Nchannel/Nlength', $payload));
|
||||||
|
if (substr($payload, 9, $length) == 'keepalive@openssh.com' && isset($this->server_channels[$channel])) {
|
||||||
|
if (ord(substr($payload, 9 + $length))) { // want reply
|
||||||
|
$this->_send_binary_packet(pack('CN', NET_SSH2_MSG_CHANNEL_SUCCESS, $this->server_channels[$channel]));
|
||||||
|
}
|
||||||
|
$payload = $this->_get_binary_packet($skip_channel_filter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
case NET_SSH2_MSG_CHANNEL_DATA:
|
case NET_SSH2_MSG_CHANNEL_DATA:
|
||||||
case NET_SSH2_MSG_CHANNEL_EXTENDED_DATA:
|
case NET_SSH2_MSG_CHANNEL_EXTENDED_DATA:
|
||||||
case NET_SSH2_MSG_CHANNEL_REQUEST:
|
|
||||||
case NET_SSH2_MSG_CHANNEL_CLOSE:
|
case NET_SSH2_MSG_CHANNEL_CLOSE:
|
||||||
case NET_SSH2_MSG_CHANNEL_EOF:
|
case NET_SSH2_MSG_CHANNEL_EOF:
|
||||||
if (!$skip_channel_filter && !empty($this->server_channels)) {
|
if (!$skip_channel_filter && !empty($this->server_channels)) {
|
||||||
@ -3685,54 +3746,6 @@ class SSH2
|
|||||||
$response = $this->binary_packet_buffer;
|
$response = $this->binary_packet_buffer;
|
||||||
$this->binary_packet_buffer = false;
|
$this->binary_packet_buffer = false;
|
||||||
} else {
|
} else {
|
||||||
$read = array($this->fsock);
|
|
||||||
$write = $except = null;
|
|
||||||
|
|
||||||
if ($this->curTimeout <= 0) {
|
|
||||||
if ($this->keepAlive <= 0) {
|
|
||||||
@stream_select($read, $write, $except, null);
|
|
||||||
} else {
|
|
||||||
if (!@stream_select($read, $write, $except, $this->keepAlive) && !count($read)) {
|
|
||||||
$this->_send_binary_packet(pack('CN', NET_SSH2_MSG_IGNORE, 0));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if ($this->curTimeout < 0) {
|
|
||||||
$this->is_timeout = true;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
$read = array($this->fsock);
|
|
||||||
$write = $except = null;
|
|
||||||
|
|
||||||
$start = microtime(true);
|
|
||||||
if ($this->keepAlive > 0 && $this->keepAlive < $this->curTimeout) {
|
|
||||||
if (!@stream_select($read, $write, $except, $this->keepAlive) && !count($read)) {
|
|
||||||
$this->_send_binary_packet(pack('CN', NET_SSH2_MSG_IGNORE, 0));
|
|
||||||
$elapsed = microtime(true) - $start;
|
|
||||||
$this->curTimeout-= $elapsed;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
$elapsed = microtime(true) - $start;
|
|
||||||
$this->curTimeout-= $elapsed;
|
|
||||||
}
|
|
||||||
|
|
||||||
$sec = floor($this->curTimeout);
|
|
||||||
$usec = 1000000 * ($this->curTimeout - $sec);
|
|
||||||
|
|
||||||
// on windows this returns a "Warning: Invalid CRT parameters detected" error
|
|
||||||
if (!@stream_select($read, $write, $except, $sec, $usec) && !count($read)) {
|
|
||||||
$this->is_timeout = true;
|
|
||||||
if ($client_channel == self::CHANNEL_EXEC && !$this->request_pty) {
|
|
||||||
$this->_close_channel($client_channel);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
$elapsed = microtime(true) - $start;
|
|
||||||
$this->curTimeout-= $elapsed;
|
|
||||||
}
|
|
||||||
|
|
||||||
$response = $this->_get_binary_packet(true);
|
$response = $this->_get_binary_packet(true);
|
||||||
if ($response === false) {
|
if ($response === false) {
|
||||||
$this->bitmap = 0;
|
$this->bitmap = 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user