]> source.dussan.org Git - nextcloud-server.git/commitdiff
Shared encrypted files now readable by both sharer and sharee
authorSam Tuke <samtuke@owncloud.com>
Tue, 26 Feb 2013 18:11:29 +0000 (18:11 +0000)
committerSam Tuke <samtuke@owncloud.com>
Tue, 26 Feb 2013 18:11:29 +0000 (18:11 +0000)
apps/files_encryption/lib/crypt.php
apps/files_encryption/lib/keymanager.php
apps/files_encryption/lib/proxy.php
apps/files_encryption/lib/util.php

index a677de950ae2b7229ce5a3437a1de0c4dfecf95b..5a2d99df5460dac7337f953a83d26d6453aec4d4 100755 (executable)
@@ -391,6 +391,8 @@ class Crypt {
        \r
                if( openssl_seal( $plainContent, $sealed, $shareKeys, $publicKeys ) ) {\r
                \r
+//                     trigger_error("SEALED = $sealed");\r
+                       \r
                        $i = 0;\r
                        \r
                        // Ensure each shareKey is labelled with its \r
index d35ad8f4d5e4bee48c5412bb48642bc5952dd22a..ec4057d0983c6b1422b3e69ec5889375772e6046 100755 (executable)
@@ -105,6 +105,8 @@ class Keymanager {
         */\r
        public static function setFileKey( \OC_FilesystemView $view, $path, $userId, $catfile ) {\r
                \r
+               \OC_FileProxy::$enabled = false;\r
+               \r
                \OC\Files\Filesystem::initMountPoints($userId);\r
                $basePath = '/' . $userId . '/files_encryption/keyfiles';\r
                \r
@@ -112,15 +114,19 @@ class Keymanager {
                \r
                if ( $view->is_dir( $basePath . '/' . $targetPath ) ) {\r
                \r
-                       \r
+                       // FIXME: write me\r
                \r
                } else {\r
 \r
                        // Save the keyfile in parallel directory\r
-                       return $view->file_put_contents( $basePath . '/' . $targetPath . '.key', $catfile );\r
+                       $result = $view->file_put_contents( $basePath . '/' . $targetPath . '.key', $catfile );\r
                \r
                }\r
                \r
+               \OC_FileProxy::$enabled = true;\r
+               \r
+               return $result;\r
+               \r
        }\r
        \r
        /**\r
@@ -140,16 +146,22 @@ class Keymanager {
                \r
                $keyfilePath = '/' . $userId . '/files_encryption/keyfiles/' . $filePath_f . '.key';\r
                \r
+               \OC_FileProxy::$enabled = false;\r
+               \r
                if ( $view->file_exists( $keyfilePath ) ) {\r
 \r
-                       return $view->file_get_contents( $keyfilePath );\r
+                       $result =  $view->file_get_contents( $keyfilePath );\r
                        \r
                } else {\r
                \r
-                       return false;\r
+                       $result =  false;\r
                        \r
                }\r
                \r
+               \OC_FileProxy::$enabled = true;\r
+               \r
+               return $result;\r
+               \r
        }\r
        \r
        /**\r
index 56c9000bfb036f3f2e0e7ac4090dbdcec77916f4..29207dce07d6d178e996a575567ad07c73390fda 100644 (file)
@@ -91,7 +91,8 @@ class Proxy extends \OC_FileProxy {
                return false;
        }
        
-       public function preFile_put_contents( $path, &$data ) {
+       public function preFile_put_contents( $path, &$data ) { 
+               
                // TODO check for existing key file and reuse it if possible to avoid problems with versioning etc.
                if ( self::shouldEncrypt( $path ) ) {
                
@@ -204,22 +205,22 @@ class Proxy extends \OC_FileProxy {
                        // Get the encrypted keyfile
                        $encKeyfile = Keymanager::getFileKey( $view, $fileOwner, $relPath );
                        
-                       trigger_error("\$encKeyfile = ". var_export($encKeyfile, 1));
-                       
                        // Attempt to fetch the user's shareKey
                        $shareKey = Keymanager::getShareKey( $view, $userId, $relPath );
                        
-                       trigger_error("\$shareKey = ".var_export($shareKey, 1));
-                       
                        // Check if key is shared or not
                        if ( $shareKey ) {
                                
                                \OC_FileProxy::$enabled = false;
                                
+//                             trigger_error("\$encKeyfile = $encKeyfile, \$shareKey = $shareKey, \$privateKey = $privateKey");
+                               
                                // Decrypt keyfile with shareKey
                                $plainKeyfile = Crypt::multiKeyDecrypt( $encKeyfile, $shareKey, $privateKey );
                                
-                               trigger_error("PROXY plainkeyfile = ". var_export($plainKeyfile, 1));
+//                             $plainKeyfile = $encKeyfile;
+                               
+//                             trigger_error("PROXY plainkeyfile = ". var_export($plainKeyfile, 1));
                        
                        } else {
                                
@@ -229,6 +230,8 @@ class Proxy extends \OC_FileProxy {
                        }
                        
                        $plainData = Crypt::symmetricDecryptFileContent( $data, $plainKeyfile );
+                       
+//                     trigger_error("PLAINDATA = ". var_export($plainData, 1));
 
                } elseif (
                Crypt::mode() == 'server' 
index ac098cd877d3b33b666d1b1111a126a2d6571707..920ff3eb15999faf347ef626c1fe412ec1fa3098 100644 (file)
  *
  */
 
-// Todo:
+# Bugs
+# ----
+# Sharing a file to a user without encryption set up will not provide them with access but won't notify the sharer
+# Deleting files if keyfile is missing fails
+# When encryption app is disabled files become unreadable
+# Timeouts on first login due to encryption of very large files
+# MultiKeyEncrypt() may be failing
+
+
+# Missing features
+# ----------------
+# Unshare a file
+# Re-use existing keyfiles so they don't need version control
+# Make sure user knows if large files weren't encrypted
+# Trashbin support
+
+
+// Old Todo:
 //  - Crypt/decrypt button in the userinterface
 //  - Setting if crypto should be on by default
 //  - Add a setting "DonĀ“t encrypt files larger than xx because of performance 
 //    reasons"
-//  - Transparent decrypt/encrypt in filesystem.php. Autodetect if a file is 
-//    encrypted (.encrypted extension)
-//  - Don't use a password directly as encryption key. but a key which is 
-//    stored on the server and encrypted with the user password. -> password 
-//    change faster
-//  - IMPORTANT! Check if the block lenght of the encrypted data stays the same
 
 namespace OCA\Encryption;
 
@@ -663,10 +674,14 @@ class Util {
                }
                
                // Re-enc keyfile to (additional) sharekeys
-               $newShareKeys = Crypt::multiKeyEncrypt( $plainKeyfile, $userPubKeys );
-
-               // Save new sharekeys to all necessary user folders
-               if ( ! Keymanager::setShareKeys( $this->view, $filePath, $newShareKeys['keys'] ) ) {
+               $multiEncKey = Crypt::multiKeyEncrypt( $plainKeyfile, $userPubKeys );
+               
+               // Save the recrypted key to it's owner's keyfiles directory
+               // Save new sharekeys to all necessary user directory
+               if ( 
+                       ! Keymanager::setFileKey( $this->view, $filePath, $fileOwner, $multiEncKey['data'] )
+                       || ! Keymanager::setShareKeys( $this->view, $filePath, $multiEncKey['keys'] ) 
+               ) {
 
                        trigger_error( "SET Share keys failed" );