From 680ba4bea18373a1a8663a9b81cfd5f599544fb4 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Bj=C3=B6rn=20Schie=C3=9Fle?= Date: Fri, 19 Apr 2013 10:35:32 +0200 Subject: [PATCH] restore encryption keys from trash bin (development snapshot) --- apps/files_trashbin/lib/trash.php | 117 ++++++++++++++++++------------ 1 file changed, 72 insertions(+), 45 deletions(-) diff --git a/apps/files_trashbin/lib/trash.php b/apps/files_trashbin/lib/trash.php index 82c4601a026..0808ed09d9b 100644 --- a/apps/files_trashbin/lib/trash.php +++ b/apps/files_trashbin/lib/trash.php @@ -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 -- 2.39.5