diff options
author | Bjoern Schiessle <schiessle@owncloud.com> | 2014-05-22 15:43:42 +0200 |
---|---|---|
committer | Bjoern Schiessle <schiessle@owncloud.com> | 2014-06-02 13:15:11 +0200 |
commit | b16b17f920f0fffcf2e97762b3cd7297d6f8c43c (patch) | |
tree | 42c1c2bba60b51f210eb7c78ab3b293f0fd8fb5d /apps/files_encryption/lib | |
parent | 790c0e8e7ccc44fc859cfa5b97ef2d8aa1df87d7 (diff) | |
download | nextcloud-server-b16b17f920f0fffcf2e97762b3cd7297d6f8c43c.tar.gz nextcloud-server-b16b17f920f0fffcf2e97762b3cd7297d6f8c43c.zip |
ceanup encryption code, improved return codes
Diffstat (limited to 'apps/files_encryption/lib')
-rw-r--r-- | apps/files_encryption/lib/util.php | 203 |
1 files changed, 79 insertions, 124 deletions
diff --git a/apps/files_encryption/lib/util.php b/apps/files_encryption/lib/util.php index d20efc3ac7b..fecdef28819 100644 --- a/apps/files_encryption/lib/util.php +++ b/apps/files_encryption/lib/util.php @@ -303,7 +303,7 @@ class Util { * Find all files and their encryption status within a directory * @param string $directory The path of the parent directory to search * @param bool $found the founded files if called again - * @return mixed false if 0 found, array on success. Keys: name, path + * @return array keys: plain, encrypted, legacy, broken * @note $directory needs to be a path relative to OC data dir. e.g. * /admin/files NOT /backup OR /home/www/oc/data/admin/files */ @@ -322,11 +322,8 @@ class Util { ); } - if ( - $this->view->is_dir($directory) - && $handle = $this->view->opendir($directory) - ) { - if(is_resource($handle)) { + if ($this->view->is_dir($directory) && $handle = $this->view->opendir($directory)){ + if (is_resource($handle)) { while (false !== ($file = readdir($handle))) { if ($file !== "." && $file !== "..") { @@ -390,34 +387,16 @@ class Util { 'name' => $file, 'path' => $relPath ); - } - } - } - } } - - \OC_FileProxy::$enabled = true; - - if (empty($found)) { - - return false; - - } else { - - return $found; - - } - } \OC_FileProxy::$enabled = true; - return false; - + return $found; } /** @@ -571,28 +550,6 @@ class Util { return $result; } - - /** - * @param string $path - * @return bool - */ - public function isSharedPath($path) { - - $trimmed = ltrim($path, '/'); - $split = explode('/', $trimmed); - - if (isset($split[2]) && $split[2] === 'Shared') { - - return true; - - } else { - - return false; - - } - - } - /** * encrypt versions from given file * @param array $filelist list of encrypted files, relative to data/user/files @@ -808,121 +765,119 @@ class Util { */ public function encryptAll($dirPath, $legacyPassphrase = null, $newPassphrase = null) { + $result = true; + $found = $this->findEncFiles($dirPath); - if ($found) { + // Disable proxy to prevent file being encrypted twice + \OC_FileProxy::$enabled = false; - // Disable proxy to prevent file being encrypted twice - \OC_FileProxy::$enabled = false; + $versionStatus = \OCP\App::isEnabled('files_versions'); + \OC_App::disable('files_versions'); - $versionStatus = \OCP\App::isEnabled('files_versions'); - \OC_App::disable('files_versions'); + $encryptedFiles = array(); - $encryptedFiles = array(); + // Encrypt unencrypted files + foreach ($found['plain'] as $plainFile) { - // Encrypt unencrypted files - foreach ($found['plain'] as $plainFile) { + //get file info + $fileInfo = \OC\Files\Filesystem::getFileInfo($plainFile['path']); - //get file info - $fileInfo = \OC\Files\Filesystem::getFileInfo($plainFile['path']); + //relative to data/<user>/file + $relPath = $plainFile['path']; - //relative to data/<user>/file - $relPath = $plainFile['path']; + //relative to /data + $rawPath = '/' . $this->userId . '/files/' . $plainFile['path']; - //relative to /data - $rawPath = '/' . $this->userId . '/files/' . $plainFile['path']; - - // keep timestamp - $timestamp = $fileInfo['mtime']; + // keep timestamp + $timestamp = $fileInfo['mtime']; - // Open plain file handle for binary reading - $plainHandle = $this->view->fopen($rawPath, 'rb'); + // Open plain file handle for binary reading + $plainHandle = $this->view->fopen($rawPath, 'rb'); - // Open enc file handle for binary writing, with same filename as original plain file - $encHandle = fopen('crypt://' . $rawPath . '.part', 'wb'); + // Open enc file handle for binary writing, with same filename as original plain file + $encHandle = fopen('crypt://' . $rawPath . '.part', 'wb'); - if (is_resource($encHandle)) { - // Move plain file to a temporary location - $size = stream_copy_to_stream($plainHandle, $encHandle); + if (is_resource($encHandle) && is_resource($plainHandle)) { + // Move plain file to a temporary location + $size = stream_copy_to_stream($plainHandle, $encHandle); - fclose($encHandle); - fclose($plainHandle); + fclose($encHandle); + fclose($plainHandle); - $fakeRoot = $this->view->getRoot(); - $this->view->chroot('/' . $this->userId . '/files'); + $fakeRoot = $this->view->getRoot(); + $this->view->chroot('/' . $this->userId . '/files'); - $this->view->rename($relPath . '.part', $relPath); + $this->view->rename($relPath . '.part', $relPath); - // set timestamp - $this->view->touch($relPath, $timestamp); + // set timestamp + $this->view->touch($relPath, $timestamp); - $encSize = $this->view->filesize($relPath); + $encSize = $this->view->filesize($relPath); - $this->view->chroot($fakeRoot); + $this->view->chroot($fakeRoot); - // Add the file to the cache - \OC\Files\Filesystem::putFileInfo($relPath, array( - 'encrypted' => true, - 'size' => $encSize, - 'unencrypted_size' => $size, - 'etag' => $fileInfo['etag'] - )); + // Add the file to the cache + \OC\Files\Filesystem::putFileInfo($relPath, array( + 'encrypted' => true, + 'size' => $encSize, + 'unencrypted_size' => $size, + 'etag' => $fileInfo['etag'] + )); - $encryptedFiles[] = $relPath; - } + $encryptedFiles[] = $relPath; + } else { + \OCP\Util::writeLog('files_encryption', 'initial encryption: could not encrypt ' . $rawPath, \OCP\Util::FATAL); + $result = false; } + } - // Encrypt legacy encrypted files - if ( - !empty($legacyPassphrase) - && !empty($newPassphrase) - ) { - - foreach ($found['legacy'] as $legacyFile) { + // Encrypt legacy encrypted files + if (!empty($legacyPassphrase) && !empty($newPassphrase)) { - // Fetch data from file - $legacyData = $this->view->file_get_contents($legacyFile['path']); + foreach ($found['legacy'] as $legacyFile) { - // decrypt data, generate catfile - $decrypted = Crypt::legacyBlockDecrypt($legacyData, $legacyPassphrase); + // Fetch data from file + $legacyData = $this->view->file_get_contents($legacyFile['path']); - $rawPath = $legacyFile['path']; + // decrypt data, generate catfile + $decrypted = Crypt::legacyBlockDecrypt($legacyData, $legacyPassphrase); - // enable proxy the ensure encryption is handled - \OC_FileProxy::$enabled = true; + $rawPath = $legacyFile['path']; - // Open enc file handle for binary writing, with same filename as original plain file - $encHandle = $this->view->fopen( $rawPath, 'wb' ); + // enable proxy the ensure encryption is handled + \OC_FileProxy::$enabled = true; - if (is_resource($encHandle)) { + // Open enc file handle for binary writing, with same filename as original plain file + $encHandle = $this->view->fopen($rawPath, 'wb'); - // write data to stream - fwrite($encHandle, $decrypted); + if (is_resource($encHandle)) { - // close stream - fclose($encHandle); - } + // write data to stream + fwrite($encHandle, $decrypted); - // disable proxy to prevent file being encrypted twice - \OC_FileProxy::$enabled = false; + // close stream + fclose($encHandle); + } else { + \OCP\Util::writeLog('files_encryption', 'initial encryption: could not encrypt legacy file ' . $rawPath, \OCP\Util::FATAL); + $result = false; } + + // disable proxy to prevent file being encrypted twice + \OC_FileProxy::$enabled = false; } + } - \OC_FileProxy::$enabled = true; + \OC_FileProxy::$enabled = true; - if ($versionStatus) { - \OC_App::enable('files_versions'); - } + if ($versionStatus) { + \OC_App::enable('files_versions'); + } - $this->encryptVersions($encryptedFiles); + $result = $result && $this->encryptVersions($encryptedFiles); - // If files were found, return true - return true; - } else { + return $result; - // If no files were found, return false - return false; - } } /** |