mirror of
https://github.com/phpseclib/phpseclib.git
synced 2024-12-31 21:21:55 +00:00
Merge branch '2.0'
* 2.0: Unit/X509/CSR: looks like a line got overwritten.. SFTP: stat cache updates
This commit is contained in:
commit
d098568e4f
@ -862,7 +862,7 @@ class SFTP extends SSH2
|
|||||||
} else {
|
} else {
|
||||||
$temp = $dir . '/' . $shortname;
|
$temp = $dir . '/' . $shortname;
|
||||||
}
|
}
|
||||||
$this->_update_stat_cache($temp, (object) $attributes);
|
$this->_update_stat_cache($temp, (object) array('stat' => $attributes));
|
||||||
}
|
}
|
||||||
// SFTPv6 has an optional boolean end-of-list field, but we'll ignore that, since the
|
// SFTPv6 has an optional boolean end-of-list field, but we'll ignore that, since the
|
||||||
// final SSH_FXP_STATUS packet should tell us that, already.
|
// final SSH_FXP_STATUS packet should tell us that, already.
|
||||||
@ -1033,6 +1033,14 @@ class SFTP extends SSH2
|
|||||||
$temp[$dir] = array();
|
$temp[$dir] = array();
|
||||||
}
|
}
|
||||||
if ($i === $max) {
|
if ($i === $max) {
|
||||||
|
if (is_object($temp[$dir])) {
|
||||||
|
if (!isset($value->stat) && isset($temp[$dir]->stat)) {
|
||||||
|
$value->stat = $temp[$dir]->stat;
|
||||||
|
}
|
||||||
|
if (!isset($value->lstat) && isset($temp[$dir]->lstat)) {
|
||||||
|
$value->lstat = $temp[$dir]->lstat;
|
||||||
|
}
|
||||||
|
}
|
||||||
$temp[$dir] = $value;
|
$temp[$dir] = $value;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1111,10 +1119,10 @@ class SFTP extends SSH2
|
|||||||
if ($this->use_stat_cache) {
|
if ($this->use_stat_cache) {
|
||||||
$result = $this->_query_stat_cache($filename);
|
$result = $this->_query_stat_cache($filename);
|
||||||
if (is_array($result) && isset($result['.'])) {
|
if (is_array($result) && isset($result['.'])) {
|
||||||
return (array) $result['.'];
|
return $result['.']->stat;
|
||||||
}
|
}
|
||||||
if (is_object($result)) {
|
if (is_object($result) && isset($result->stat)) {
|
||||||
return (array) $result;
|
return $result->stat;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1127,7 +1135,7 @@ class SFTP extends SSH2
|
|||||||
if ($stat['type'] == NET_SFTP_TYPE_DIRECTORY) {
|
if ($stat['type'] == NET_SFTP_TYPE_DIRECTORY) {
|
||||||
$filename.= '/.';
|
$filename.= '/.';
|
||||||
}
|
}
|
||||||
$this->_update_stat_cache($filename, (object) $stat);
|
$this->_update_stat_cache($filename, (object) array('stat' => $stat));
|
||||||
return $stat;
|
return $stat;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1140,7 +1148,7 @@ class SFTP extends SSH2
|
|||||||
if ($stat['type'] == NET_SFTP_TYPE_DIRECTORY) {
|
if ($stat['type'] == NET_SFTP_TYPE_DIRECTORY) {
|
||||||
$filename.= '/.';
|
$filename.= '/.';
|
||||||
}
|
}
|
||||||
$this->_update_stat_cache($filename, (object) $stat);
|
$this->_update_stat_cache($filename, (object) array('stat' => $stat));
|
||||||
|
|
||||||
return $stat;
|
return $stat;
|
||||||
}
|
}
|
||||||
@ -1168,10 +1176,10 @@ class SFTP extends SSH2
|
|||||||
if ($this->use_stat_cache) {
|
if ($this->use_stat_cache) {
|
||||||
$result = $this->_query_stat_cache($filename);
|
$result = $this->_query_stat_cache($filename);
|
||||||
if (is_array($result) && isset($result['.'])) {
|
if (is_array($result) && isset($result['.'])) {
|
||||||
return (array) $result['.'];
|
return $result['.']->lstat;
|
||||||
}
|
}
|
||||||
if (is_object($result)) {
|
if (is_object($result) && isset($result->lstat)) {
|
||||||
return (array) $result;
|
return $result->lstat;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1184,7 +1192,7 @@ class SFTP extends SSH2
|
|||||||
if ($lstat['type'] == NET_SFTP_TYPE_DIRECTORY) {
|
if ($lstat['type'] == NET_SFTP_TYPE_DIRECTORY) {
|
||||||
$filename.= '/.';
|
$filename.= '/.';
|
||||||
}
|
}
|
||||||
$this->_update_stat_cache($filename, (object) $lstat);
|
$this->_update_stat_cache($filename, (object) array('lstat' => $lstat));
|
||||||
return $lstat;
|
return $lstat;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1192,7 +1200,7 @@ class SFTP extends SSH2
|
|||||||
|
|
||||||
if ($lstat != $stat) {
|
if ($lstat != $stat) {
|
||||||
$lstat = array_merge($lstat, array('type' => NET_SFTP_TYPE_SYMLINK));
|
$lstat = array_merge($lstat, array('type' => NET_SFTP_TYPE_SYMLINK));
|
||||||
$this->_update_stat_cache($filename, (object) $lstat);
|
$this->_update_stat_cache($filename, (object) array('lstat' => $lstat));
|
||||||
return $stat;
|
return $stat;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1205,7 +1213,7 @@ class SFTP extends SSH2
|
|||||||
if ($lstat['type'] == NET_SFTP_TYPE_DIRECTORY) {
|
if ($lstat['type'] == NET_SFTP_TYPE_DIRECTORY) {
|
||||||
$filename.= '/.';
|
$filename.= '/.';
|
||||||
}
|
}
|
||||||
$this->_update_stat_cache($filename, (object) $lstat);
|
$this->_update_stat_cache($filename, (object) array('lstat' => $lstat));
|
||||||
|
|
||||||
return $lstat;
|
return $lstat;
|
||||||
}
|
}
|
||||||
@ -2262,7 +2270,7 @@ class SFTP extends SSH2
|
|||||||
*/
|
*/
|
||||||
function is_link($path)
|
function is_link($path)
|
||||||
{
|
{
|
||||||
$result = $this->_get_stat_cache_prop($path, 'type');
|
$result = $this->_get_lstat_cache_prop($path, 'type');
|
||||||
if ($result === false) {
|
if ($result === false) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -2377,18 +2385,48 @@ class SFTP extends SSH2
|
|||||||
* @access private
|
* @access private
|
||||||
*/
|
*/
|
||||||
function _get_stat_cache_prop($path, $prop)
|
function _get_stat_cache_prop($path, $prop)
|
||||||
|
{
|
||||||
|
return $this->_get_xstat_cache_prop($path, $prop, 'stat');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return an lstat properity
|
||||||
|
*
|
||||||
|
* Uses cache if appropriate.
|
||||||
|
*
|
||||||
|
* @param String $path
|
||||||
|
* @param String $prop
|
||||||
|
* @return Mixed
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
function _get_lstat_cache_prop($path, $prop)
|
||||||
|
{
|
||||||
|
return $this->_get_xstat_cache_prop($path, $prop, 'lstat');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return a stat or lstat properity
|
||||||
|
*
|
||||||
|
* Uses cache if appropriate.
|
||||||
|
*
|
||||||
|
* @param String $path
|
||||||
|
* @param String $prop
|
||||||
|
* @return Mixed
|
||||||
|
* @access private
|
||||||
|
*/
|
||||||
|
function _get_xstat_cache_prop($path, $prop, $type)
|
||||||
{
|
{
|
||||||
if ($this->use_stat_cache) {
|
if ($this->use_stat_cache) {
|
||||||
$path = $this->_realpath($path);
|
$path = $this->_realpath($path);
|
||||||
|
|
||||||
$result = $this->_query_stat_cache($path);
|
$result = $this->_query_stat_cache($path);
|
||||||
|
|
||||||
if (is_object($result) && isset($result->$prop)) {
|
if (is_object($result) && isset($result->$type)) {
|
||||||
return $result->$prop;
|
return $result->{$type}[$prop];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$result = $this->stat($path);
|
$result = $this->$type($path);
|
||||||
|
|
||||||
if ($result === false || !isset($result[$prop])) {
|
if ($result === false || !isset($result[$prop])) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -160,7 +160,6 @@ class Functional_Net_SFTPUserStoryTest extends PhpseclibFunctionalTestCase
|
|||||||
return $sftp;
|
return $sftp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static function callback($length)
|
static function callback($length)
|
||||||
{
|
{
|
||||||
$r = substr(self::$buffer, 0, $length);
|
$r = substr(self::$buffer, 0, $length);
|
||||||
@ -174,7 +173,7 @@ class Functional_Net_SFTPUserStoryTest extends PhpseclibFunctionalTestCase
|
|||||||
*/
|
*/
|
||||||
public function testPutSizeGetFileCallback($sftp)
|
public function testPutSizeGetFileCallback($sftp)
|
||||||
{
|
{
|
||||||
self::$buffer = self::$exampleData;
|
self::$buffer = self::$exampleData;
|
||||||
$this->assertTrue(
|
$this->assertTrue(
|
||||||
$sftp->put('file1.txt', array(__CLASS__, 'callback'), $sftp::SOURCE_CALLBACK),
|
$sftp->put('file1.txt', array(__CLASS__, 'callback'), $sftp::SOURCE_CALLBACK),
|
||||||
'Failed asserting that example data could be successfully put().'
|
'Failed asserting that example data could be successfully put().'
|
||||||
@ -384,6 +383,42 @@ class Functional_Net_SFTPUserStoryTest extends PhpseclibFunctionalTestCase
|
|||||||
/**
|
/**
|
||||||
* @depends testSymlink
|
* @depends testSymlink
|
||||||
*/
|
*/
|
||||||
|
public function testStatLstatCache($sftp)
|
||||||
|
{
|
||||||
|
$stat = $sftp->stat('symlink');
|
||||||
|
$lstat = $sftp->lstat('symlink');
|
||||||
|
$this->assertNotEquals(
|
||||||
|
$stat, $lstat,
|
||||||
|
'Failed asserting that stat and lstat returned different output for a symlink'
|
||||||
|
);
|
||||||
|
|
||||||
|
return $sftp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @depends testStatLstatCache
|
||||||
|
*/
|
||||||
|
public function testLinkFile($sftp)
|
||||||
|
{
|
||||||
|
$this->assertTrue(
|
||||||
|
$sftp->is_link('symlink'),
|
||||||
|
'Failed asserting that symlink is a link'
|
||||||
|
);
|
||||||
|
$this->assertTrue(
|
||||||
|
$sftp->is_file('symlink'),
|
||||||
|
'Failed asserting that symlink is a file'
|
||||||
|
);
|
||||||
|
$this->assertFalse(
|
||||||
|
$sftp->is_dir('symlink'),
|
||||||
|
'Failed asserting that symlink is not a directory'
|
||||||
|
);
|
||||||
|
|
||||||
|
return $sftp;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @depends testLinkFile
|
||||||
|
*/
|
||||||
public function testReadlink($sftp)
|
public function testReadlink($sftp)
|
||||||
{
|
{
|
||||||
$this->assertInternalType('string', $sftp->readlink('symlink'),
|
$this->assertInternalType('string', $sftp->readlink('symlink'),
|
||||||
|
Loading…
Reference in New Issue
Block a user