]> source.dussan.org Git - nextcloud-server.git/commitdiff
files_encryption: Fix getFileSize()
authorMarkus Goetz <markus@woboq.com>
Sat, 5 Oct 2013 16:00:46 +0000 (18:00 +0200)
committerBjoern Schiessle <schiessle@owncloud.com>
Wed, 23 Oct 2013 14:28:43 +0000 (16:28 +0200)
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

apps/files_encryption/lib/util.php
apps/files_encryption/tests/util.php

index b9592a32cb2038bf8900a206556a987fed776c4b..0d34af043a13457d744935de41a6a04931934ccf 100644 (file)
@@ -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
index eddc4c6b3ffc795c25b9a15b960fe186bbd69b6b..1b93bc36c8e47a0e3777cefe7f40ab8c10e262a7 100755 (executable)
@@ -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