]> source.dussan.org Git - nextcloud-server.git/commitdiff
restore encryption keys from trash bin (development snapshot)
authorBjörn Schießle <schiessle@owncloud.com>
Fri, 19 Apr 2013 08:35:32 +0000 (10:35 +0200)
committerFlorin Peter <github@florin-peter.de>
Sun, 28 Apr 2013 18:48:29 +0000 (20:48 +0200)
apps/files_trashbin/lib/trash.php

index 82c4601a0269b8f1f78570a13e1787abe6f13ca6..0808ed09d9bd05247b0de3ec0cb6d3ee53291378 100644 (file)
@@ -212,49 +212,10 @@ class Trashbin {
                        } else {
                                $trashbinSize -= $view->filesize($target.$ext);
                        }
-                       // if versioning app is enabled, copy versions from the trash bin back to the original location
-                       if ( \OCP\App::isEnabled('files_versions') ) {
-                               if ($timestamp ) {
-                                       $versionedFile = $filename;
-                               } else {
-                                       $versionedFile = $file;
-                               }
-                               if ( $result[0]['type'] === 'dir' ) {
-                                       $trashbinSize -= self::calculateSize(new \OC\Files\View('/'.$user.'/'.'files_trashbin/versions/'. $file));
-                                       $view->rename(\OC\Files\Filesystem::normalizePath('files_trashbin/versions/'. $file), \OC\Files\Filesystem::normalizePath('files_versions/'.$location.'/'.$filename.$ext));
-                               } else if ( $versions = self::getVersionsFromTrash($versionedFile, $timestamp) ) {
-                                       foreach ($versions as $v) {
-                                               if ($timestamp ) {
-                                                       $trashbinSize -= $view->filesize('files_trashbin/versions/'.$versionedFile.'.v'.$v.'.d'.$timestamp);
-                                                       $view->rename('files_trashbin/versions/'.$versionedFile.'.v'.$v.'.d'.$timestamp, 'files_versions/'.$location.'/'.$filename.$ext.'.v'.$v);
-                                               } else {
-                                                       $trashbinSize -= $view->filesize('files_trashbin/versions/'.$versionedFile.'.v'.$v);
-                                                       $view->rename('files_trashbin/versions/'.$versionedFile.'.v'.$v, 'files_versions/'.$location.'/'.$filename.$ext.'.v'.$v);
-                                               }
-                                       }
-                               }
-                       }
-                       
-                       // Take care of encryption keys TODO! Get '.key' in file between file name and delete date (also for permanent delete!)
-                       $parts = pathinfo($file);
-                       if ( $result[0]['type'] === 'dir' ) {
-                               $keyfile = \OC\Files\Filesystem::normalizePath('files_trashbin/keyfiles/'.$parts['dirname'].'/'.$filename);
-                       } else {
-                               $keyfile = \OC\Files\Filesystem::normalizePath('files_trashbin/keyfiles/'.$parts['dirname'].'/'.$filename.'.key');
-                       }
-                       if ($timestamp) {
-                               $keyfile .= '.d'.$timestamp;
-                       }
-                       if ( \OCP\App::isEnabled('files_encryption') && $view->file_exists($keyfile) ) {
-                               if ( $result[0]['type'] === 'dir' ) {
-                                       $trashbinSize -= self::calculateSize(new \OC\Files\View('/'.$user.'/'.$keyfile));
-                                       $view->rename($keyfile, 'files_encryption/keyfiles/'. $location.'/'.$filename);
-                               } else {
-                                       $trashbinSize -= $view->filesize($keyfile);
-                                       $view->rename($keyfile, 'files_encryption/keyfiles/'. $location.'/'.$filename.'.key');
-                               }
-                       }
-                       
+
+                       $trashbinSize -= self::restoreVersions($view, $file, $filename, $ext, $location, $timestamp);
+                       $trashbinSize -= self::restoreEncryptionKeys($view, $file, $filename, $ext, $location, $timestamp);
+
                        if ( $timestamp ) {
                                $query = \OC_DB::prepare('DELETE FROM `*PREFIX*files_trash` WHERE `user`=? AND `id`=? AND `timestamp`=?');
                                $query->execute(array($user,$filename,$timestamp));
@@ -263,13 +224,79 @@ class Trashbin {
                        self::setTrashbinSize($user, $trashbinSize);
                        
                        return true;
-               } else {
-                       \OC_Log::write('files_trashbin', 'Couldn\'t restore file from trash bin, '.$filename, \OC_log::ERROR);
                }
 
                return false;
        }
 
+               /**
+        * @brief restore versions from trash bin
+        *
+        * @param $view file view
+        * @param $file complete path to file
+        * @param $filename name of file
+        * @param $ext file extension in case a file with the same $filename already exists
+        * @param $location location if file
+        * @param $timestamp deleteion time
+        * @return size of restored versions
+        */
+       private static function restoreVersions($view, $file, $filename, $ext, $location, $timestamp) {
+               $size = 0;
+               if (\OCP\App::isEnabled('files_versions')) {
+                       $user = \OCP\User::getUser();
+                       if ($timestamp) {
+                               $versionedFile = $filename;
+                       } else {
+                               $versionedFile = $file;
+                       }
+                       if ($result[0]['type'] === 'dir') {
+                               $size += self::calculateSize(new \OC\Files\View('/' . $user . '/' . 'files_trashbin/versions/' . $file));
+                               $view->rename(\OC\Files\Filesystem::normalizePath('files_trashbin/versions/' . $file), \OC\Files\Filesystem::normalizePath('files_versions/' . $location . '/' . $filename . $ext));
+                       } else if ($versions = self::getVersionsFromTrash($versionedFile, $timestamp)) {
+                               foreach ($versions as $v) {
+                                       if ($timestamp) {
+                                               $size += $view->filesize('files_trashbin/versions/' . $versionedFile . '.v' . $v . '.d' . $timestamp);
+                                               $view->rename('files_trashbin/versions/' . $versionedFile . '.v' . $v . '.d' . $timestamp, 'files_versions/' . $location . '/' . $filename . $ext . '.v' . $v);
+                                       } else {
+                                               $size += $view->filesize('files_trashbin/versions/' . $versionedFile . '.v' . $v);
+                                               $view->rename('files_trashbin/versions/' . $versionedFile . '.v' . $v, 'files_versions/' . $location . '/' . $filename . $ext . '.v' . $v);
+                                       }
+                               }
+                       }
+               }
+               return $size;
+       }
+
+       private static function restoreEncryptionKeys($view, $file, $filename, $ext, $location, $timestamp) {
+               // Take care of encryption keys TODO! Get '.key' in file between file name and delete date (also for permanent delete!)
+               $size = 0;
+               if (\OCP\App::isEnabled('files_encryption')) {
+                       $user = \OCP\User::getUser();
+                       if ($view->file_exists($keyfile)) {
+                               $parts = pathinfo($file);
+                               if ($result[0]['type'] === 'dir') {
+                                       $keyfile = \OC\Files\Filesystem::normalizePath('files_trashbin/keyfiles/' . $parts['dirname'] . '/' . $filename);
+                               } else {
+                                       $keyfile = \OC\Files\Filesystem::normalizePath('files_trashbin/keyfiles/' . $parts['dirname'] . '/' . $filename . '.key');
+                               }
+                               if ($timestamp) {
+                                       $keyfile .= '.d' . $timestamp;
+                               }
+                               if ($result[0]['type'] === 'dir') {
+                                       $size += self::calculateSize(new \OC\Files\View('/' . $user . '/' . $keyfile));
+                                       $view->rename($keyfile, 'files_encryption/keyfiles/' . $location . '/' . $filename);
+                               } else {
+                                       $size += $view->filesize($keyfile);
+                                       $view->rename($keyfile, 'files_encryption/keyfiles/' . $location . '/' . $filename . '.key');
+                               }
+                       }
+
+                       //TODO restore share-keys
+                       //...
+               }
+               return $size;
+       }
+
        /**
         * delete file from trash bin permanently
         * @param $filename path to the file