]> source.dussan.org Git - nextcloud-server.git/commitdiff
fix encryption for binary files
authorRobin Appelman <icewind@owncloud.com>
Fri, 15 Jun 2012 21:48:39 +0000 (23:48 +0200)
committerRobin Appelman <icewind@owncloud.com>
Wed, 20 Jun 2012 18:18:42 +0000 (20:18 +0200)
apps/files_encryption/lib/crypt.php
apps/files_encryption/lib/cryptstream.php
apps/files_encryption/tests/encryption.php
apps/files_encryption/tests/stream.php
lib/filesystemview.php

index 37eaedc3fc9f9916b029390e04ba184478fdffd2..62f6a8c236514cb9a3bd9381fb23bf5e2042e822 100644 (file)
@@ -44,7 +44,13 @@ class OC_Crypt {
        }
 
        public static function init($login,$password) {
+               $view1=new OC_FilesystemView('/');
+               if(!$view1->file_exists('/'.$login)){
+                       $view1->mkdir('/'.$login);
+               }
+
                $view=new OC_FilesystemView('/'.$login);
+
                OC_FileProxy::$enabled=false;
                if(!$view->file_exists('/encryption.key')){// does key exist?
                        OC_Crypt::createkey($login,$password);
@@ -133,7 +139,7 @@ class OC_Crypt {
        public static function decrypt( $content, $key='') {
                $bf = self::getBlowfish($key);
                $data=$bf->decrypt($content);
-               return rtrim($data, "\0");
+               return $data;
        }
 
        /**
@@ -174,6 +180,9 @@ class OC_Crypt {
                        while (!feof($handleread)) {
                                $content = fread($handleread, 8192);
                                $enccontent=OC_CRYPT::decrypt( $content, $key);
+                               if(feof($handleread)){
+                                       $enccontent=rtrim($enccontent, "\0");
+                               }
                                fwrite($handlewrite, $enccontent);
                        }
                        fclose($handlewrite);
@@ -202,6 +211,6 @@ class OC_Crypt {
                        $result.=self::decrypt(substr($data,0,8192),$key);
                        $data=substr($data,8192);
                }
-               return $result;
+               return rtrim($result, "\0");
        }
 }
index a698ee00335297a0e498b9157bbe27fdb918b4e3..56331cbf60135c23927f96ab4c4b8eff5c0edf89 100644 (file)
@@ -47,7 +47,6 @@ class OC_CryptStream{
                        $this->path=self::$sourceStreams[basename($path)]['path'];
                }else{
                        $this->path=$path;
-                       OCP\Util::writeLog('files_encryption','open encrypted '.$path. ' in '.$mode,OCP\Util::DEBUG);
                        OC_FileProxy::$enabled=false;//disable fileproxies so we can open the source file
                        $this->source=self::$rootView->fopen($path,$mode);
                        OC_FileProxy::$enabled=true;
@@ -84,6 +83,9 @@ class OC_CryptStream{
                }else{
                        $result='';
                }
+               if($this->stream_eof()){
+                       $result=rtrim($result, "\0");
+               }
                return $result;
        }
        
index cf24a225d28e009a187bf0815a91a8ea8a667677..70aa1daf4c3f4f83933fcf763eed5a76504777ed 100644 (file)
@@ -13,6 +13,7 @@ class Test_Encryption extends UnitTestCase {
                $source=file_get_contents($file); //nice large text file
                $encrypted=OC_Crypt::encrypt($source,$key);
                $decrypted=OC_Crypt::decrypt($encrypted,$key);
+               $decrypted=rtrim($decrypted, "\0");
                $this->assertNotEqual($encrypted,$source);
                $this->assertEqual($decrypted,$source);
 
@@ -20,6 +21,7 @@ class Test_Encryption extends UnitTestCase {
                $encrypted=OC_Crypt::encrypt($chunk,$key);
                $this->assertEqual(strlen($chunk),strlen($encrypted));
                $decrypted=OC_Crypt::decrypt($encrypted,$key);
+               $decrypted=rtrim($decrypted, "\0");
                $this->assertEqual($decrypted,$chunk);
                
                $encrypted=OC_Crypt::blockEncrypt($source,$key);
@@ -43,6 +45,7 @@ class Test_Encryption extends UnitTestCase {
                $source=file_get_contents($file); //binary file
                $encrypted=OC_Crypt::encrypt($source,$key);
                $decrypted=OC_Crypt::decrypt($encrypted,$key);
+               $decrypted=rtrim($decrypted, "\0");
                $this->assertEqual($decrypted,$source);
 
                $encrypted=OC_Crypt::blockEncrypt($source,$key);
@@ -50,4 +53,20 @@ class Test_Encryption extends UnitTestCase {
                $this->assertEqual($decrypted,$source);
 
        }
+
+       function testBinary(){
+               $key=uniqid();
+       
+               $file=__DIR__.'/binary';
+               $source=file_get_contents($file); //binary file
+               $encrypted=OC_Crypt::encrypt($source,$key);
+               $decrypted=OC_Crypt::decrypt($encrypted,$key);
+
+               $decrypted=rtrim($decrypted, "\0");
+               $this->assertEqual($decrypted,$source);
+
+               $encrypted=OC_Crypt::blockEncrypt($source,$key);
+               $decrypted=OC_Crypt::blockDecrypt($encrypted,$key);
+               $this->assertEqual($decrypted,$source);
+       }
 }
index b23805d60b00374e94583a94a6756ce02bc652e3..4ffeb6210a9d18f871b828c6396cda93cca75fbd 100644 (file)
@@ -50,7 +50,22 @@ class Test_CryptStream extends UnitTestCase {
                        $file=$this->tmpFiles[$id];
                }
                $stream=fopen($file,$mode);
-               OC_CryptStream::$sourceStreams[$id]=array('path'=>'dummy','stream'=>$stream);
+               OC_CryptStream::$sourceStreams[$id]=array('path'=>'dummy'.$id,'stream'=>$stream);
                return fopen('crypt://streams/'.$id,$mode);
        }
+
+       function testBinary(){
+               $file=__DIR__.'/binary';
+               $source=file_get_contents($file);
+
+               $stream=$this->getStream('test','w');
+               fwrite($stream,$source);
+               fclose($stream);
+
+               $stream=$this->getStream('test','r');
+               $data=stream_get_contents($stream);
+               fclose($stream);
+               $this->assertEqual(strlen($data),strlen($source));
+               $this->assertEqual($source,$data);
+       }
 }
index 7265b775ea91dacaf50ce2b027507104be98b63a..c09f1de546a68cfaf084014139837dcb52620bbb 100644 (file)
@@ -402,9 +402,9 @@ class OC_FilesystemView {
                        }
                        if($run and $storage=$this->getStorage($path)){
                                if(!is_null($extraParam)){
-                                       $result=$storage->$operation($interalPath,$extraParam);
+                                       $result=$storage->$operation($internalPath,$extraParam);
                                }else{
-                                       $result=$storage->$operation($interalPath);
+                                       $result=$storage->$operation($internalPath);
                                }
                                $result=OC_FileProxy::runPostProxies($operation,$this->getAbsolutePath($path),$result);
                                if(OC_Filesystem::$loaded and $this->fakeRoot==OC_Filesystem::getRoot()){