2013-05-01 03:43:56 +04:00
|
|
|
<?php
|
2013-05-22 02:55:16 +04:00
|
|
|
/**
|
|
|
|
* ownCloud
|
|
|
|
*
|
|
|
|
* @author Florin Peter
|
|
|
|
* @copyright 2013 Florin Peter <owncloud@florin-peter.de>
|
|
|
|
*
|
|
|
|
* This library is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
|
|
|
|
* License as published by the Free Software Foundation; either
|
|
|
|
* version 3 of the License, or any later version.
|
|
|
|
*
|
|
|
|
* This library is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Affero General Public
|
|
|
|
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
2013-08-21 12:59:31 +04:00
|
|
|
require_once __DIR__ . '/util.php';
|
2013-05-22 02:55:16 +04:00
|
|
|
|
|
|
|
use OCA\Encryption;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Class Test_Encryption_Stream
|
2014-05-19 19:50:53 +04:00
|
|
|
* this class provide basic stream tests
|
2013-05-22 02:55:16 +04:00
|
|
|
*/
|
2013-05-26 22:44:15 +04:00
|
|
|
class Test_Encryption_Stream extends \PHPUnit_Framework_TestCase {
|
|
|
|
|
|
|
|
const TEST_ENCRYPTION_STREAM_USER1 = "test-stream-user1";
|
2013-05-22 02:55:16 +04:00
|
|
|
|
|
|
|
public $userId;
|
|
|
|
public $pass;
|
|
|
|
/**
|
2014-05-12 18:30:39 +04:00
|
|
|
* @var \OC\Files\View
|
2013-05-22 02:55:16 +04:00
|
|
|
*/
|
|
|
|
public $view;
|
|
|
|
public $dataShort;
|
|
|
|
public $stateFilesTrashbin;
|
|
|
|
|
2013-05-26 05:22:16 +04:00
|
|
|
public static function setUpBeforeClass() {
|
2013-05-22 02:55:16 +04:00
|
|
|
// reset backend
|
2013-05-26 05:22:16 +04:00
|
|
|
\OC_User::clearBackends();
|
2013-05-26 22:44:15 +04:00
|
|
|
\OC_User::useBackend('database');
|
2013-05-22 02:55:16 +04:00
|
|
|
|
2013-05-26 05:22:16 +04:00
|
|
|
// Filesystem related hooks
|
|
|
|
\OCA\Encryption\Helper::registerFilesystemHooks();
|
|
|
|
|
|
|
|
// clear and register hooks
|
|
|
|
\OC_FileProxy::clearProxies();
|
2013-05-26 22:44:15 +04:00
|
|
|
\OC_FileProxy::register(new OCA\Encryption\Proxy());
|
2013-05-26 05:22:16 +04:00
|
|
|
|
2013-05-26 22:44:15 +04:00
|
|
|
// create test user
|
|
|
|
\Test_Encryption_Util::loginHelper(\Test_Encryption_Stream::TEST_ENCRYPTION_STREAM_USER1, true);
|
2013-05-26 05:22:16 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
function setUp() {
|
2013-05-22 02:55:16 +04:00
|
|
|
// set user id
|
2013-05-26 22:44:15 +04:00
|
|
|
\OC_User::setUserId(\Test_Encryption_Stream::TEST_ENCRYPTION_STREAM_USER1);
|
|
|
|
$this->userId = \Test_Encryption_Stream::TEST_ENCRYPTION_STREAM_USER1;
|
|
|
|
$this->pass = \Test_Encryption_Stream::TEST_ENCRYPTION_STREAM_USER1;
|
2013-05-22 02:55:16 +04:00
|
|
|
|
|
|
|
// init filesystem view
|
2014-05-12 18:30:39 +04:00
|
|
|
$this->view = new \OC\Files\View('/');
|
2013-05-22 02:55:16 +04:00
|
|
|
|
|
|
|
// init short data
|
|
|
|
$this->dataShort = 'hats';
|
|
|
|
|
|
|
|
// remember files_trashbin state
|
2013-05-26 22:44:15 +04:00
|
|
|
$this->stateFilesTrashbin = OC_App::isEnabled('files_trashbin');
|
2013-05-22 02:55:16 +04:00
|
|
|
|
|
|
|
// we don't want to tests with app files_trashbin enabled
|
2013-05-26 22:44:15 +04:00
|
|
|
\OC_App::disable('files_trashbin');
|
2013-05-22 02:55:16 +04:00
|
|
|
}
|
|
|
|
|
2013-05-26 05:22:16 +04:00
|
|
|
function tearDown() {
|
2013-05-22 02:55:16 +04:00
|
|
|
// reset app files_trashbin
|
2013-05-26 22:44:15 +04:00
|
|
|
if ($this->stateFilesTrashbin) {
|
|
|
|
OC_App::enable('files_trashbin');
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
OC_App::disable('files_trashbin');
|
2013-05-22 02:55:16 +04:00
|
|
|
}
|
2013-05-26 05:22:16 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
public static function tearDownAfterClass() {
|
2013-05-26 22:44:15 +04:00
|
|
|
// cleanup test user
|
|
|
|
\OC_User::deleteUser(\Test_Encryption_Stream::TEST_ENCRYPTION_STREAM_USER1);
|
2014-10-10 17:34:19 +04:00
|
|
|
|
|
|
|
\OC_Hook::clear();
|
|
|
|
\OC_FileProxy::clearProxies();
|
|
|
|
|
|
|
|
// Delete keys in /data/
|
|
|
|
$view = new \OC\Files\View('/');
|
|
|
|
$view->rmdir('public-keys');
|
|
|
|
$view->rmdir('owncloud_private_key');
|
2013-05-22 02:55:16 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
function testStreamOptions() {
|
2014-01-21 19:19:26 +04:00
|
|
|
$filename = '/tmp-' . uniqid();
|
2013-05-26 22:44:15 +04:00
|
|
|
$view = new \OC\Files\View('/' . $this->userId . '/files');
|
2013-05-22 02:55:16 +04:00
|
|
|
|
|
|
|
// Save short data as encrypted file using stream wrapper
|
2013-05-26 22:44:15 +04:00
|
|
|
$cryptedFile = $view->file_put_contents($filename, $this->dataShort);
|
2013-05-22 02:55:16 +04:00
|
|
|
|
|
|
|
// Test that data was successfully written
|
2013-05-26 22:44:15 +04:00
|
|
|
$this->assertTrue(is_int($cryptedFile));
|
2013-05-22 02:55:16 +04:00
|
|
|
|
2013-05-26 22:44:15 +04:00
|
|
|
$handle = $view->fopen($filename, 'r');
|
2013-05-22 02:55:16 +04:00
|
|
|
|
|
|
|
// check if stream is at position zero
|
2013-05-26 22:44:15 +04:00
|
|
|
$this->assertEquals(0, ftell($handle));
|
2013-05-22 02:55:16 +04:00
|
|
|
|
|
|
|
// set stream options
|
2013-05-26 22:44:15 +04:00
|
|
|
$this->assertTrue(flock($handle, LOCK_SH));
|
|
|
|
$this->assertTrue(flock($handle, LOCK_UN));
|
2013-05-22 02:55:16 +04:00
|
|
|
|
|
|
|
// tear down
|
2013-05-26 22:44:15 +04:00
|
|
|
$view->unlink($filename);
|
2013-05-22 02:55:16 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
function testStreamSetBlocking() {
|
2014-01-21 19:19:26 +04:00
|
|
|
$filename = '/tmp-' . uniqid();
|
2013-05-26 22:44:15 +04:00
|
|
|
$view = new \OC\Files\View('/' . $this->userId . '/files');
|
2013-05-22 02:55:16 +04:00
|
|
|
|
|
|
|
// Save short data as encrypted file using stream wrapper
|
2013-05-26 22:44:15 +04:00
|
|
|
$cryptedFile = $view->file_put_contents($filename, $this->dataShort);
|
2013-05-22 02:55:16 +04:00
|
|
|
|
|
|
|
// Test that data was successfully written
|
2013-05-26 22:44:15 +04:00
|
|
|
$this->assertTrue(is_int($cryptedFile));
|
2013-05-22 02:55:16 +04:00
|
|
|
|
2013-05-26 22:44:15 +04:00
|
|
|
$handle = $view->fopen($filename, 'r');
|
2013-05-22 02:55:16 +04:00
|
|
|
|
|
|
|
// set stream options
|
2013-05-26 22:44:15 +04:00
|
|
|
$this->assertTrue(stream_set_blocking($handle, 1));
|
2013-05-22 02:55:16 +04:00
|
|
|
|
2014-05-28 18:05:24 +04:00
|
|
|
fclose($handle);
|
|
|
|
|
2013-05-22 02:55:16 +04:00
|
|
|
// tear down
|
2013-05-26 22:44:15 +04:00
|
|
|
$view->unlink($filename);
|
2013-05-22 02:55:16 +04:00
|
|
|
}
|
|
|
|
|
2013-06-10 12:17:47 +04:00
|
|
|
/**
|
|
|
|
* @medium
|
|
|
|
*/
|
2013-05-22 02:55:16 +04:00
|
|
|
function testStreamSetTimeout() {
|
2014-01-21 19:19:26 +04:00
|
|
|
$filename = '/tmp-' . uniqid();
|
2013-05-26 22:44:15 +04:00
|
|
|
$view = new \OC\Files\View('/' . $this->userId . '/files');
|
2013-05-22 02:55:16 +04:00
|
|
|
|
|
|
|
// Save short data as encrypted file using stream wrapper
|
2013-05-26 22:44:15 +04:00
|
|
|
$cryptedFile = $view->file_put_contents($filename, $this->dataShort);
|
2013-05-22 02:55:16 +04:00
|
|
|
|
|
|
|
// Test that data was successfully written
|
2013-05-26 22:44:15 +04:00
|
|
|
$this->assertTrue(is_int($cryptedFile));
|
2013-05-22 02:55:16 +04:00
|
|
|
|
2013-05-26 22:44:15 +04:00
|
|
|
$handle = $view->fopen($filename, 'r');
|
2013-05-22 02:55:16 +04:00
|
|
|
|
|
|
|
// set stream options
|
2013-05-26 22:44:15 +04:00
|
|
|
$this->assertFalse(stream_set_timeout($handle, 1));
|
2013-05-22 02:55:16 +04:00
|
|
|
|
2014-05-28 18:05:24 +04:00
|
|
|
fclose($handle);
|
|
|
|
|
2013-05-22 02:55:16 +04:00
|
|
|
// tear down
|
2013-05-26 22:44:15 +04:00
|
|
|
$view->unlink($filename);
|
2013-05-22 02:55:16 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
function testStreamSetWriteBuffer() {
|
2014-01-21 19:19:26 +04:00
|
|
|
$filename = '/tmp-' . uniqid();
|
2013-05-26 22:44:15 +04:00
|
|
|
$view = new \OC\Files\View('/' . $this->userId . '/files');
|
2013-05-22 02:55:16 +04:00
|
|
|
|
|
|
|
// Save short data as encrypted file using stream wrapper
|
2013-05-26 22:44:15 +04:00
|
|
|
$cryptedFile = $view->file_put_contents($filename, $this->dataShort);
|
2013-05-22 02:55:16 +04:00
|
|
|
|
|
|
|
// Test that data was successfully written
|
2013-05-26 22:44:15 +04:00
|
|
|
$this->assertTrue(is_int($cryptedFile));
|
2013-05-22 02:55:16 +04:00
|
|
|
|
2013-05-26 22:44:15 +04:00
|
|
|
$handle = $view->fopen($filename, 'r');
|
2013-05-22 02:55:16 +04:00
|
|
|
|
|
|
|
// set stream options
|
2013-05-26 22:44:15 +04:00
|
|
|
$this->assertEquals(0, stream_set_write_buffer($handle, 1024));
|
2013-05-22 02:55:16 +04:00
|
|
|
|
2014-05-28 18:05:24 +04:00
|
|
|
fclose($handle);
|
|
|
|
|
2013-05-22 02:55:16 +04:00
|
|
|
// tear down
|
2013-05-26 22:44:15 +04:00
|
|
|
$view->unlink($filename);
|
2013-05-22 02:55:16 +04:00
|
|
|
}
|
2013-12-18 20:07:35 +04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @medium
|
2014-05-19 19:50:53 +04:00
|
|
|
* test if stream wrapper can read files outside from the data folder
|
2013-12-18 20:07:35 +04:00
|
|
|
*/
|
|
|
|
function testStreamFromLocalFile() {
|
|
|
|
|
2014-01-21 19:19:26 +04:00
|
|
|
$filename = '/' . $this->userId . '/files/' . 'tmp-' . uniqid().'.txt';
|
2013-12-18 20:07:35 +04:00
|
|
|
|
2014-01-21 19:19:26 +04:00
|
|
|
$tmpFilename = "/tmp/" . uniqid() . ".txt";
|
2013-12-18 20:07:35 +04:00
|
|
|
|
|
|
|
// write an encrypted file
|
|
|
|
$cryptedFile = $this->view->file_put_contents($filename, $this->dataShort);
|
|
|
|
|
|
|
|
// Test that data was successfully written
|
|
|
|
$this->assertTrue(is_int($cryptedFile));
|
|
|
|
|
|
|
|
// create a copy outside of the data folder in /tmp
|
|
|
|
$proxyStatus = \OC_FileProxy::$enabled;
|
|
|
|
\OC_FileProxy::$enabled = false;
|
|
|
|
$encryptedContent = $this->view->file_get_contents($filename);
|
|
|
|
\OC_FileProxy::$enabled = $proxyStatus;
|
|
|
|
|
|
|
|
file_put_contents($tmpFilename, $encryptedContent);
|
|
|
|
|
|
|
|
\OCA\Encryption\Helper::addTmpFileToMapper($tmpFilename, $filename);
|
|
|
|
|
|
|
|
// try to read the file from /tmp
|
|
|
|
$handle = fopen("crypt://".$tmpFilename, "r");
|
|
|
|
$contentFromTmpFile = stream_get_contents($handle);
|
|
|
|
|
|
|
|
// check if it was successful
|
|
|
|
$this->assertEquals($this->dataShort, $contentFromTmpFile);
|
|
|
|
|
|
|
|
// clean up
|
|
|
|
unlink($tmpFilename);
|
|
|
|
$this->view->unlink($filename);
|
|
|
|
|
|
|
|
}
|
2013-08-18 13:02:08 +04:00
|
|
|
}
|