files_encryption: Fix getFileSize()
For certain file sizes, we rounded to the wrong chunk number and the returned bogus results. This should fix https://github.com/owncloud/mirall/issues/1009 Conflicts: apps/files_encryption/tests/util.php
This commit is contained in:
parent
959b0f9125
commit
af58360434
2 changed files with 38 additions and 3 deletions
|
@ -508,11 +508,18 @@ class Util {
|
|||
) {
|
||||
|
||||
// get the size from filesystem
|
||||
$fullPath = $this->view->getLocalFile($path);
|
||||
$size = $this->view->filesize($path);
|
||||
|
||||
// fast path, else the calculation for $lastChunkNr is bogus
|
||||
if ($size === 0) {
|
||||
\OC_FileProxy::$enabled = $proxyStatus;
|
||||
return 0;
|
||||
}
|
||||
|
||||
// calculate last chunk nr
|
||||
$lastChunkNr = floor($size / 8192);
|
||||
// next highest is end of chunks, one subtracted is last one
|
||||
// we have to read the last chunk, we can't just calculate it (because of padding etc)
|
||||
$lastChunkNr = ceil($size/ 8192) - 1;
|
||||
$lastChunkSize = $size - ($lastChunkNr * 8192);
|
||||
|
||||
// open stream
|
||||
|
|
|
@ -241,6 +241,34 @@ class Test_Encryption_Util extends \PHPUnit_Framework_TestCase {
|
|||
$this->view->unlink($this->userId . '/files/' . $filename);
|
||||
}
|
||||
|
||||
/**
|
||||
< * @brief Test that data that is read by the crypto stream wrapper
|
||||
*/
|
||||
function testGetFileSize() {
|
||||
\Test_Encryption_Util::loginHelper(\Test_Encryption_Util::TEST_ENCRYPTION_UTIL_USER1);
|
||||
|
||||
$filename = 'tmp-' . time();
|
||||
$externalFilename = '/' . $this->userId . '/files/' . $filename;
|
||||
|
||||
// Test for 0 byte files
|
||||
$problematicFileSizeData = "";
|
||||
$cryptedFile = $this->view->file_put_contents($externalFilename, $problematicFileSizeData);
|
||||
$this->assertTrue(is_int($cryptedFile));
|
||||
$this->assertEquals($this->util->getFileSize($externalFilename), 0);
|
||||
$decrypt = $this->view->file_get_contents($externalFilename);
|
||||
$this->assertEquals($problematicFileSizeData, $decrypt);
|
||||
$this->view->unlink($this->userId . '/files/' . $filename);
|
||||
|
||||
// Test a file with 18377 bytes as in https://github.com/owncloud/mirall/issues/1009
|
||||
$problematicFileSizeData = str_pad("", 18377, "abc");
|
||||
$cryptedFile = $this->view->file_put_contents($externalFilename, $problematicFileSizeData);
|
||||
$this->assertTrue(is_int($cryptedFile));
|
||||
$this->assertEquals($this->util->getFileSize($externalFilename), 18377);
|
||||
$decrypt = $this->view->file_get_contents($externalFilename);
|
||||
$this->assertEquals($problematicFileSizeData, $decrypt);
|
||||
$this->view->unlink($this->userId . '/files/' . $filename);
|
||||
}
|
||||
|
||||
/**
|
||||
* @medium
|
||||
*/
|
||||
|
@ -333,7 +361,7 @@ class Test_Encryption_Util extends \PHPUnit_Framework_TestCase {
|
|||
/**
|
||||
* helper function to set migration status to the right value
|
||||
* to be able to test the migration path
|
||||
*
|
||||
*
|
||||
* @param $status needed migration status for test
|
||||
* @param $user for which user the status should be set
|
||||
* @return boolean
|
||||
|
|
Loading…
Reference in a new issue