diff --git a/phpseclib/Net/SFTP/Stream.php b/phpseclib/Net/SFTP/Stream.php index e890691c..2758e73c 100644 --- a/phpseclib/Net/SFTP/Stream.php +++ b/phpseclib/Net/SFTP/Stream.php @@ -262,14 +262,17 @@ class Stream if ($this->size === false) { if ($this->mode[0] == 'r') { return false; + } else { + $this->sftp->touch($path); + $this->size = 0; } } else { switch ($this->mode[0]) { case 'x': return false; case 'w': - case 'c': $this->sftp->truncate($path, 0); + $this->size = 0; } } diff --git a/tests/Functional/Net/SFTPLargeFileTest.php b/tests/Functional/Net/SFTPLargeFileTest.php index a1411acd..89d2c95a 100644 --- a/tests/Functional/Net/SFTPLargeFileTest.php +++ b/tests/Functional/Net/SFTPLargeFileTest.php @@ -9,11 +9,8 @@ use phpseclib\Crypt\Base; use phpseclib\Net\SFTP; -class Functional_Net_SFTPLargeFileTest extends PhpseclibFunctionalTestCase +class Functional_Net_SFTPLargeFileTest extends Functional_Net_SFTPTestCase { - protected $sftp; - protected $scratchDir; - static public function setUpBeforeClass() { if (!extension_loaded('mcrypt') && !extension_loaded('openssl')) { @@ -22,28 +19,6 @@ class Functional_Net_SFTPLargeFileTest extends PhpseclibFunctionalTestCase parent::setUpBeforeClass(); } - public function setUp() - { - $this->scratchDir = uniqid('phpseclib-sftp-large-scratch-'); - - $this->sftp = new SFTP($this->getEnv('SSH_HOSTNAME')); - $this->assertTrue($this->sftp->login( - $this->getEnv('SSH_USERNAME'), - $this->getEnv('SSH_PASSWORD') - )); - $this->assertTrue($this->sftp->mkdir($this->scratchDir)); - $this->assertTrue($this->sftp->chdir($this->scratchDir)); - } - - public function tearDown() - { - if ($this->sftp) { - $this->sftp->chdir($this->getEnv('SSH_HOME')); - $this->sftp->delete($this->scratchDir); - } - parent::tearDown(); - } - /** * @group github298 * @group github455 diff --git a/tests/Functional/Net/SFTPStreamTest.php b/tests/Functional/Net/SFTPStreamTest.php new file mode 100644 index 00000000..d8c42ca3 --- /dev/null +++ b/tests/Functional/Net/SFTPStreamTest.php @@ -0,0 +1,38 @@ + + * @copyright 2015 Andreas Fischer + * @license http://www.opensource.org/licenses/mit-license.html MIT License + */ + +use phpseclib\Net\SFTP\Stream; + +class Functional_Net_SFTPStreamTest extends Functional_Net_SFTPTestCase +{ + static public function setUpBeforeClass() + { + Stream::register(); + parent::setUpBeforeClass(); + } + + public function testFopenFcloseCreatesFile() + { + $context = stream_context_create(array( + 'sftp' => array('session' => $this->sftp), + )); + $fp = fopen($this->buildUrl('fooo.txt'), 'wb', false, $context); + $this->assertTrue(is_resource($fp)); + fclose($fp); + $this->assertSame(0, $this->sftp->size('fooo.txt')); + } + + protected function buildUrl($suffix) + { + return sprintf( + 'sftp://via-context/%s/%s', + $this->sftp->pwd(), + $suffix + ); + } +} diff --git a/tests/Functional/Net/SFTPTestCase.php b/tests/Functional/Net/SFTPTestCase.php new file mode 100644 index 00000000..abd5999d --- /dev/null +++ b/tests/Functional/Net/SFTPTestCase.php @@ -0,0 +1,41 @@ + + * @copyright 2015 Andreas Fischer + * @license http://www.opensource.org/licenses/mit-license.html MIT License + */ + +use phpseclib\Net\SFTP; + +/** + * This class provides each test method with a new and empty $this->scratchDir. + */ +abstract class Functional_Net_SFTPTestCase extends PhpseclibFunctionalTestCase +{ + protected $sftp; + protected $scratchDir; + + public function setUp() + { + parent::setUp(); + $this->scratchDir = uniqid('phpseclib-sftp-scratch-'); + + $this->sftp = new SFTP($this->getEnv('SSH_HOSTNAME')); + $this->assertTrue($this->sftp->login( + $this->getEnv('SSH_USERNAME'), + $this->getEnv('SSH_PASSWORD') + )); + $this->assertTrue($this->sftp->mkdir($this->scratchDir)); + $this->assertTrue($this->sftp->chdir($this->scratchDir)); + } + + public function tearDown() + { + if ($this->sftp) { + $this->sftp->chdir($this->getEnv('SSH_HOME')); + $this->sftp->delete($this->scratchDir); + } + parent::tearDown(); + } +}