summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjoern Schiessle <schiessle@owncloud.com>2013-07-29 17:06:05 +0200
committerBjoern Schiessle <schiessle@owncloud.com>2013-07-29 17:06:05 +0200
commitb6fa0e4eefb332dc1fb9b45df50de4621ed8e6bd (patch)
tree2ca892180568bd5c76facbfd9e6762621485a5dd
parent830f5d24c77b863bd49eda0cbc4ba812add8065d (diff)
downloadnextcloud-server-b6fa0e4eefb332dc1fb9b45df50de4621ed8e6bd.tar.gz
nextcloud-server-b6fa0e4eefb332dc1fb9b45df50de4621ed8e6bd.zip
working decrypt files method
-rw-r--r--apps/files_encryption/hooks/hooks.php13
-rw-r--r--apps/files_encryption/lib/util.php102
-rw-r--r--settings/ajax/decryptall.php23
-rw-r--r--settings/js/personal.js57
-rw-r--r--settings/personal.php5
-rw-r--r--settings/templates/personal.php10
6 files changed, 173 insertions, 37 deletions
diff --git a/apps/files_encryption/hooks/hooks.php b/apps/files_encryption/hooks/hooks.php
index b2a17f6bca5..d9c3f49b736 100644
--- a/apps/files_encryption/hooks/hooks.php
+++ b/apps/files_encryption/hooks/hooks.php
@@ -62,18 +62,7 @@ class Hooks {
return false;
}
- $encryptedKey = Keymanager::getPrivateKey($view, $params['uid']);
-
- $privateKey = Crypt::decryptPrivateKey($encryptedKey, $params['password']);
-
- if ($privateKey === false) {
- \OCP\Util::writeLog('Encryption library', 'Private key for user "' . $params['uid']
- . '" is not valid! Maybe the user password was changed from outside if so please change it back to gain access', \OCP\Util::ERROR);
- }
-
- $session = new \OCA\Encryption\Session($view);
-
- $session->setPrivateKey($privateKey);
+ $session = $util->initEncryption($params);
// Check if first-run file migration has already been performed
$ready = false;
diff --git a/apps/files_encryption/lib/util.php b/apps/files_encryption/lib/util.php
index 50e823585d7..03e2fae4c65 100644
--- a/apps/files_encryption/lib/util.php
+++ b/apps/files_encryption/lib/util.php
@@ -661,6 +661,69 @@ class Util {
}
}
+
+ /**
+ * @brief Decrypt all files
+ * @return bool
+ */
+ public function decryptAll() {
+
+ $found = $this->findEncFiles($this->userId . '/files');
+
+ if ($found) {
+
+ // Disable proxy to prevent file being encrypted twice
+ \OC_FileProxy::$enabled = false;
+
+ // Encrypt unencrypted files
+ foreach ($found['encrypted'] as $encryptedFile) {
+
+ //relative to data/<user>/file
+ $relPath = Helper::stripUserFilesPath($encryptedFile['path']);
+
+ //relative to /data
+ $rawPath = $encryptedFile['path'];
+
+ // Open enc file handle for binary reading
+ $encHandle = fopen('crypt://' . $rawPath, 'rb');
+
+ // Open plain file handle for binary writing, with same filename as original plain file
+ $plainHandle = $this->view->fopen($rawPath . '.part', 'wb');
+
+ // Move plain file to a temporary location
+ $size = stream_copy_to_stream($encHandle, $plainHandle);
+
+ fclose($encHandle);
+ fclose($plainHandle);
+
+ $fakeRoot = $this->view->getRoot();
+ $this->view->chroot('/' . $this->userId . '/files');
+
+ $this->view->rename($relPath . '.part', $relPath);
+
+ $this->view->chroot($fakeRoot);
+
+ // Add the file to the cache
+ \OC\Files\Filesystem::putFileInfo($relPath, array(
+ 'encrypted' => false,
+ 'size' => $size,
+ 'unencrypted_size' => $size
+ ));
+ }
+
+ $this->view->deleteAll($this->keyfilesPath);
+ $this->view->deleteAll($this->shareKeysPath);
+
+ \OC_FileProxy::$enabled = true;
+
+ // If files were found, return true
+ return true;
+ } else {
+
+ // If no files were found, return false
+ return false;
+ }
+ }
/**
* @brief Encrypt all files in a directory
@@ -672,7 +735,9 @@ class Util {
*/
public function encryptAll($dirPath, $legacyPassphrase = null, $newPassphrase = null) {
- if ($found = $this->findEncFiles($dirPath)) {
+ $found = $this->findEncFiles($dirPath);
+
+ if ($found) {
// Disable proxy to prevent file being encrypted twice
\OC_FileProxy::$enabled = false;
@@ -690,12 +755,13 @@ class Util {
$plainHandle = $this->view->fopen($rawPath, 'rb');
// Open enc file handle for binary writing, with same filename as original plain file
- $encHandle = fopen('crypt://' . $relPath . '.part', 'wb');
+ $encHandle = fopen('crypt://' . $rawPath . '.part', 'wb');
// Move plain file to a temporary location
$size = stream_copy_to_stream($plainHandle, $encHandle);
fclose($encHandle);
+ fclose($plainHandle);
$fakeRoot = $this->view->getRoot();
$this->view->chroot('/' . $this->userId . '/files');
@@ -706,10 +772,10 @@ class Util {
// Add the file to the cache
\OC\Files\Filesystem::putFileInfo($relPath, array(
- 'encrypted' => true,
- 'size' => $size,
- 'unencrypted_size' => $size
- ));
+ 'encrypted' => true,
+ 'size' => $size,
+ 'unencrypted_size' => $size
+ ));
}
// Encrypt legacy encrypted files
@@ -1579,4 +1645,28 @@ class Util {
return false;
}
+ /**
+ * @brief decrypt private key and add it to the current session
+ * @param array $params with 'uid' and 'password'
+ * @return mixed session or false
+ */
+ public function initEncryption($params) {
+
+ $encryptedKey = Keymanager::getPrivateKey($this->view, $params['uid']);
+
+ $privateKey = Crypt::decryptPrivateKey($encryptedKey, $params['password']);
+
+ if ($privateKey === false) {
+ \OCP\Util::writeLog('Encryption library', 'Private key for user "' . $params['uid']
+ . '" is not valid! Maybe the user password was changed from outside if so please change it back to gain access', \OCP\Util::ERROR);
+ return false;
+ }
+
+ $session = new \OCA\Encryption\Session($this->view);
+
+ $session->setPrivateKey($privateKey);
+
+ return $session;
+ }
+
}
diff --git a/settings/ajax/decryptall.php b/settings/ajax/decryptall.php
index 02a9bfe96b1..7adacb9802a 100644
--- a/settings/ajax/decryptall.php
+++ b/settings/ajax/decryptall.php
@@ -1,14 +1,21 @@
<?php
+sleep(10);
+//encryption app needs to be loaded
+OC_App::loadApp('files_encryption');
-$status = OC_App::isEnabled('files_encryption');
-OC_App::enable('files_encryption');
+// init encryption app
+$params = array('uid' => \OCP\User::getUser(),
+ 'password' => $_POST['password']);
-OCA\Encryption\Crypt::decryptAll();
-
-if ($status === false) {
- OC_App::disable('files_encryption');
-}
+$view = new OC_FilesystemView('/');
+$util = new \OCA\Encryption\Util($view, \OCP\User::getUser());
+$result = $util->initEncryption($params);
-\OCP\JSON::success(array('data' => array('message' => 'looks good')));
+if ($result !== false) {
+ $util->decryptAll();
+ \OCP\JSON::success(array('data' => array('message' => 'Files decrypted successfully')));
+} else {
+ \OCP\JSON::error(array('data' => array('message' => 'Couldn\'t decrypt files, check your password and try again')));
+}
diff --git a/settings/js/personal.js b/settings/js/personal.js
index 97342e7653e..94ef959488f 100644
--- a/settings/js/personal.js
+++ b/settings/js/personal.js
@@ -112,18 +112,59 @@ $(document).ready(function(){
});
$('button:button[name="submitDecryptAll"]').click(function() {
- console.log("click!");
- $.post('ajax/decryptall.php', {}, function(data) {
- /*
+ var privateKeyPassword = $('#decryptAll input:password[id="privateKeyPassword"]').val();
+ OC.Encryption.decryptAll(privateKeyPassword);
+ });
+
+ $('#decryptAll input:password[name="privateKeyPassword"]').keyup(function(event) {
+ var privateKeyPassword = $('#decryptAll input:password[id="privateKeyPassword"]').val();
+ if (privateKeyPassword !== '' ) {
+ $('#decryptAll button:button[name="submitDecryptAll"]').removeAttr("disabled");
+ if(event.which === 13) {
+ OC.Encryption.decryptAll(privateKeyPassword);
+ }
+ } else {
+ $('#decryptAll button:button[name="submitDecryptAll"]').attr("disabled", "true");
+ }
+ });
+
+} );
+
+OC.Encryption = {
+ decryptAll: function(password) {
+ OC.Encryption.msg.startDecrypting('#decryptAll .msg');
+ $.post('ajax/decryptall.php', {password:password}, function(data) {
if (data.status === "error") {
- OC.msg.finishedSaving('#encryption .msg', data);
+ OC.Encryption.msg.finishedDecrypting('#decryptAll .msg', data);
} else {
- OC.msg.finishedSaving('#encryption .msg', data);
- }*/
+ OC.Encryption.msg.finishedDecrypting('#decryptAll .msg', data);
+ }
}
);
- });
-} );
+ }
+}
+
+OC.Encryption.msg={
+ startDecrypting:function(selector){
+ $(selector)
+ .html( t('files_encryption', 'Decrypting files... Please wait, this can take some time.') )
+ .removeClass('success')
+ .removeClass('error')
+ .stop(true, true)
+ .show();
+ },
+ finishedDecrypting:function(selector, data){
+ if( data.status === "success" ){
+ $(selector).html( data.data.message )
+ .addClass('success')
+ .stop(true, true)
+ .delay(3000)
+ .fadeOut(900);
+ }else{
+ $(selector).html( data.data.message ).addClass('error');
+ }
+ }
+};
OC.msg={
startSaving:function(selector){
diff --git a/settings/personal.php b/settings/personal.php
index 79ce8e4576b..f10b0afb096 100644
--- a/settings/personal.php
+++ b/settings/personal.php
@@ -27,8 +27,9 @@ $languageCodes=OC_L10N::findAvailableLanguages();
//check if encryption was enabled in the past
$enableDecryptAll = false;
if (OC_App::isEnabled('files_encryption') === false) {
- $view = new OC\Files\View('/'.OC_User::getUser());
- if ($view->file_exists('files_encryption/keyfiles')) {
+ $view = new OC\Files\View('/'.OCP\User::getUser());
+ $remainingKeys = $view->getDirectoryContent('/files_encryption/keyfiles');
+ if (!empty($remainingKeys)) {
$enableDecryptAll = true;
}
}
diff --git a/settings/templates/personal.php b/settings/templates/personal.php
index c0f3600a51e..7e926ea42b0 100644
--- a/settings/templates/personal.php
+++ b/settings/templates/personal.php
@@ -111,17 +111,25 @@ if($_['passwordChangeSupported']) {
};?>
<?php if($_['enableDecryptAll']): ?>
-<form id="encryption">
+<form id="decryptAll">
<fieldset class="personalblock">
<legend>
<?php p( $l->t( 'Encryption' ) ); ?>
</legend>
<?php p($l->t( "The encryption app is no longer enabled, decrypt all your file" )); ?>
<p>
+ <input
+ type="password"
+ name="privateKeyPassword"
+ id="privateKeyPassword" />
+ <label for="privateKeyPassword"><?php p($l->t( "Log-in password" )); ?></label>
+ <br />
<button
type="button"
+ disabled
name="submitDecryptAll"><?php p($l->t( "Decrypt all Files" )); ?>
</button>
+ <span class="msg"></span>
</p>
<br />
</fieldset>