]> source.dussan.org Git - nextcloud-server.git/commitdiff
removed preRename and moved postRename to hooks.php
authorFlorin Peter <github@florin-peter.de>
Sat, 27 Apr 2013 18:21:46 +0000 (20:21 +0200)
committerFlorin Peter <github@florin-peter.de>
Sat, 27 Apr 2013 18:21:46 +0000 (20:21 +0200)
added postWrite and postTouch to fix file size and sharing keys

apps/files_encryption/lib/proxy.php

index 24821d8a05c901aa4e536b4581bf78d856cee092..439aa0da25104b265a1acf695d7d8b6eb8478683 100644 (file)
@@ -273,96 +273,20 @@ class Proxy extends \OC_FileProxy {
        }
 
        /**
-        * @brief When a file is renamed, rename its keyfile also
-        * @return bool Result of rename()
-        * @note This is pre rather than post because using post didn't work
-        */
-       public function preRename( $oldPath, $newPath )
-    {
-
-        // Disable encryption proxy to prevent recursive calls
-        $proxyStatus = \OC_FileProxy::$enabled;
-        \OC_FileProxy::$enabled = false;
-
-        $view = new \OC_FilesystemView('/');
-
-        $userId = \OCP\USER::getUser();
-
-        // Format paths to be relative to user files dir
-        $oldTrimmed = ltrim($oldPath, '/');
-        $oldSplit = explode('/', $oldTrimmed);
-        $oldSliced = array_slice($oldSplit, 2);
-        $oldRelPath = implode('/', $oldSliced);
-        $oldKeyfilePath = $userId . '/' . 'files_encryption' . '/' . 'keyfiles' . '/' . $oldRelPath;
-
-        $newTrimmed = ltrim($newPath, '/');
-        $newSplit = explode('/', $newTrimmed);
-        $newSliced = array_slice($newSplit, 2);
-        $newRelPath = implode('/', $newSliced);
-        $newKeyfilePath = $userId . '/' . 'files_encryption' . '/' . 'keyfiles' . '/' . $newRelPath;
-
-        // add key ext if this is not an folder
-        if (!$view->is_dir($oldKeyfilePath)) {
-            $oldKeyfilePath .= '.key';
-            $newKeyfilePath .= '.key';
-
-            // handle share-keys
-            $localKeyPath = $view->getLocalFile($userId.'/files_encryption/share-keys/'.$oldRelPath);
-            $matches = glob(preg_quote($localKeyPath).'*.shareKey');
-            foreach ($matches as $src) {
-                $dst = str_replace($oldRelPath, $newRelPath, $src);
-                rename($src, $dst);
-            }
-
-        } else {
-            // handle share-keys folders
-            $oldShareKeyfilePath = $userId . '/' . 'files_encryption' . '/' . 'share-keys' . '/' . $oldRelPath;
-            $newShareKeyfilePath = $userId . '/' . 'files_encryption' . '/' . 'share-keys' . '/' . $newRelPath;
-            $view->rename($oldShareKeyfilePath, $newShareKeyfilePath);
-        }
-
-        // Rename keyfile so it isn't orphaned
-        $result = $view->rename($oldKeyfilePath, $newKeyfilePath);
-
-        \OC_FileProxy::$enabled = $proxyStatus;
-
-        return $result;
-
-    }
-
-    /**
      * @brief When a file is renamed, rename its keyfile also
      * @return bool Result of rename()
      * @note This is pre rather than post because using post didn't work
      */
-    public function postRename( $oldPath, $newPath )
+    public function postWrite( $path )
     {
+        $this->handleFile($path);
 
-        // Disable encryption proxy to prevent recursive calls
-        $proxyStatus = \OC_FileProxy::$enabled;
-        \OC_FileProxy::$enabled = false;
-
-        $view = new \OC_FilesystemView('/');
-        $session = new Session($view);
-        $userId = \OCP\User::getUser();
-        $util = new Util( $view, $userId );
-
-        // Reformat path for use with OC_FSV
-        $newPathSplit = explode( '/', $newPath );
-        $newPathRelative = implode( '/', array_slice( $newPathSplit, 3 ) );
-
-        if($util->fixFileSize($newPath)) {
-            // get sharing app state
-            $sharingEnabled = \OCP\Share::isEnabled();
-
-            // get users
-            $usersSharing = $util->getSharingUsersArray($sharingEnabled, $newPathRelative);
-
-            // update sharing-keys
-            $util->setSharedFileKeyfiles($session, $usersSharing, $newPathRelative);
-        }
+        return true;
+    }
 
-        \OC_FileProxy::$enabled = $proxyStatus;
+    public function postTouch( $path )
+    {
+        $this->handleFile($path);
 
         return true;
     }
@@ -480,25 +404,28 @@ class Proxy extends \OC_FileProxy {
         return $data;
     }
 
-       public function postStat( $path, $data ) {
+    public function postStat($path, $data)
+    {
+        // check if file is encrypted
+        if (Crypt::isCatfileContent($path)) {
 
-        if ( Crypt::isCatfileContent( $path ) ) {
-               
-                       $cached = \OC\Files\Filesystem::getFileInfo( $path, '' );
-                       
-                       $data['size'] = $cached['unencrypted_size'];
-                       
-               }
-               
-               return $data;
-       }
+            // get file info from cache
+            $cached = \OC\Files\Filesystem::getFileInfo($path, '');
 
-       public function postFileSize( $path, $size ) {
+            // set the real file size
+            $data['size'] = $cached['unencrypted_size'];
+        }
 
-        $view = new \OC_FilesystemView( '/' );
+        return $data;
+    }
+
+    public function postFileSize($path, $size)
+    {
+
+        $view = new \OC_FilesystemView('/');
 
         // if path is a folder do nothing
-        if($view->is_dir($path)) {
+        if ($view->is_dir($path)) {
             return $size;
         }
 
@@ -510,10 +437,41 @@ class Proxy extends \OC_FileProxy {
         $fileInfo = \OC\Files\Filesystem::getFileInfo($path_f);
 
         // if file is encrypted return real file size
-        if(is_array($fileInfo) && $fileInfo['encrypted'] == 1) {
+        if (is_array($fileInfo) && $fileInfo['encrypted'] == 1) {
             return $fileInfo['unencrypted_size'];
         } else {
             return $size;
         }
-       }
-}
+    }
+
+    public function handleFile($path) {
+
+        // Disable encryption proxy to prevent recursive calls
+        $proxyStatus = \OC_FileProxy::$enabled;
+        \OC_FileProxy::$enabled = false;
+
+        $view = new \OC_FilesystemView('/');
+        $session = new Session($view);
+        $userId = \OCP\User::getUser();
+        $util = new Util( $view, $userId );
+
+        // Reformat path for use with OC_FSV
+        $path_split = explode( '/', $path );
+        $path_f = implode( '/', array_slice( $path_split, 3 ) );
+
+        // only if file is on 'files' folder fix file size and sharing
+        if($path_split[2] == 'files' && $util->fixFileSize($path)) {
+
+            // get sharing app state
+            $sharingEnabled = \OCP\Share::isEnabled();
+
+            // get users
+            $usersSharing = $util->getSharingUsersArray($sharingEnabled, $path_f);
+
+            // update sharing-keys
+            $util->setSharedFileKeyfiles($session, $usersSharing, $path_f);
+        }
+
+        \OC_FileProxy::$enabled = $proxyStatus;
+    }
+ }