summaryrefslogtreecommitdiffstats
path: root/apps/files_encryption/lib
diff options
context:
space:
mode:
authorBjoern Schiessle <schiessle@owncloud.com>2014-05-22 15:43:42 +0200
committerBjoern Schiessle <schiessle@owncloud.com>2014-06-02 13:15:11 +0200
commitb16b17f920f0fffcf2e97762b3cd7297d6f8c43c (patch)
tree42c1c2bba60b51f210eb7c78ab3b293f0fd8fb5d /apps/files_encryption/lib
parent790c0e8e7ccc44fc859cfa5b97ef2d8aa1df87d7 (diff)
downloadnextcloud-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.php203
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;
- }
}
/**