Merge branch 'master' into oc_preview

This commit is contained in:
Georg Ehrke 2013-06-17 12:31:02 +02:00
commit 1a933a9173
1050 changed files with 20268 additions and 11551 deletions

4
.gitignore vendored
View File

@ -6,7 +6,7 @@ config/mount.php
apps/inc.php apps/inc.php
# ignore all apps except core ones # ignore all apps except core ones
apps/* apps*
!apps/files !apps/files
!apps/files_encryption !apps/files_encryption
!apps/files_external !apps/files_external
@ -76,4 +76,4 @@ nbproject
data-autotest data-autotest
/tests/coverage* /tests/coverage*
/tests/autoconfig* /tests/autoconfig*
/tests/autotest* /tests/autotest*

@ -1 +1 @@
Subproject commit d59b017922d9ac3bf985dee0eb721ec1a901ac72 Subproject commit 3ef9f738a9107879dddc7d97842cf4d2198fae4c

View File

@ -1,11 +1,15 @@
## Submitting issues ## Submitting issues
If you have questions about how to use ownCloud, please direct these to the [mailing list][mailinglist] or our [forum][forum]. We are also available on [IRC][irc]. If you have questions about how to install or use ownCloud, please direct these to the [mailing list][mailinglist] or our [forum][forum]. We are also available on [IRC][irc].
### TL;DR
* The [issue template can be found here][template] but be aware of the different repositories! See list below.
### Guidelines ### Guidelines
* Please search the existing issues first, it's likely that your issue was already reported. * Please search the existing issues first, it's likely that your issue was already reported or even fixed.
* [Report the issue](https://github.com/owncloud/core/issues/new) using our [template][template], it includes all the informations we need to track down the issue. * This repository is *only* for issues within the ownCloud core code. This also includes the apps: files, encryption, external storage, sharing, deleted files, versions, LDAP, and WebDAV Auth
* This repository is *only* for issues within the ownCloud core code. Issues in other compontents should be reported in their own repositores: * The issues in other components should be reported in their respective repositories:
- [Android client](https://github.com/owncloud/android/issues) - [Android client](https://github.com/owncloud/android/issues)
- [iOS client](https://github.com/owncloud/ios-issues/issues) - [iOS client](https://github.com/owncloud/ios-issues/issues)
- [Desktop client](https://github.com/owncloud/mirall/issues) - [Desktop client](https://github.com/owncloud/mirall/issues)
@ -14,12 +18,12 @@ If you have questions about how to use ownCloud, please direct these to the [mai
- [Calendar](https://github.com/owncloud/calendar/issues) - [Calendar](https://github.com/owncloud/calendar/issues)
- [Contacts](https://github.com/owncloud/contacts/issues) - [Contacts](https://github.com/owncloud/contacts/issues)
- [Mail](https://github.com/owncloud/mail/issues) - [Mail](https://github.com/owncloud/mail/issues)
- [Media/Music](https://github.com/owncloud/media/issues)
- [News](https://github.com/owncloud/news/issues) - [News](https://github.com/owncloud/news/issues)
- [Notes](https://github.com/owncloud/notes/issues) - [Notes](https://github.com/owncloud/notes/issues)
- [Shorty](https://github.com/owncloud/shorty/issues) - [Shorty](https://github.com/owncloud/shorty/issues)
- [other apps](https://github.com/owncloud/apps/issues) (e.g. Pictures, Music, Tasks, ...) - [All other apps](https://github.com/owncloud/apps/issues) (e.g. Pictures, Tasks, ...)
* Report the issue using our [template][template], it includes all the information we need to track down the issue.
If your issue appears to be a bug, and hasn't been reported, open a new issue.
Help us to maximize the effort we can spend fixing issues and adding new features, by not reporting duplicate issues. Help us to maximize the effort we can spend fixing issues and adding new features, by not reporting duplicate issues.
@ -34,7 +38,7 @@ Thanks for wanting to contribute source code to ownCloud. That's great!
Before we're able to merge your code into the ownCloud core, you need to sign our [Contributor Agreement][agreement]. Before we're able to merge your code into the ownCloud core, you need to sign our [Contributor Agreement][agreement].
Please read the [Developer Manuals][devmanual] to get useful infos like how to create your first application or how to test the ownCloud code with phpunit. Please read the [Developer Manuals][devmanual] to learn how to create your first application or how to test the ownCloud code with PHPUnit.
[agreement]: http://owncloud.org/about/contributor-agreement/ [agreement]: http://owncloud.org/about/contributor-agreement/
[devmanual]: http://owncloud.org/dev/ [devmanual]: http://owncloud.org/dev/

View File

@ -63,8 +63,12 @@
} }
#filestable { position: relative; top:37px; width:100%; } #filestable { position: relative; top:37px; width:100%; }
tbody tr { background-color:#fff; height:2.5em; } tbody tr { background-color:#fff; height:2.5em; }
tbody tr:hover, tbody tr:active, tbody tr.selected { background-color:#f8f8f8; } tbody tr:hover, tbody tr:active {
tbody tr.selected { background-color:#eee; } background-color: rgb(240,240,240);
}
tbody tr.selected {
background-color: rgb(230,230,230);
}
tbody a { color:#000; } tbody a { color:#000; }
span.extension, span.uploading, td.date { color:#999; } span.extension, span.uploading, td.date { color:#999; }
span.extension { text-transform:lowercase; -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=70)"; filter:alpha(opacity=70); opacity:.7; -webkit-transition:opacity 300ms; -moz-transition:opacity 300ms; -o-transition:opacity 300ms; transition:opacity 300ms; } span.extension { text-transform:lowercase; -ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=70)"; filter:alpha(opacity=70); opacity:.7; -webkit-transition:opacity 300ms; -moz-transition:opacity 300ms; -o-transition:opacity 300ms; transition:opacity 300ms; }
@ -81,7 +85,12 @@ table th#headerDate, table td.date { min-width:11em; padding:0 .1em 0 1em; text-
/* Multiselect bar */ /* Multiselect bar */
#filestable.multiselect { top:63px; } #filestable.multiselect { top:63px; }
table.multiselect thead { position:fixed; top:82px; z-index:1; -moz-box-sizing: border-box; box-sizing: border-box; left: 0; padding-left: 64px; width:100%; } table.multiselect thead { position:fixed; top:82px; z-index:1; -moz-box-sizing: border-box; box-sizing: border-box; left: 0; padding-left: 64px; width:100%; }
table.multiselect thead th { background:rgba(230,230,230,.8); color:#000; font-weight:bold; border-bottom:0; } table.multiselect thead th {
background-color: rgba(210,210,210,.7);
color: #000;
font-weight: bold;
border-bottom: 0;
}
table.multiselect #headerName { width: 100%; } table.multiselect #headerName { width: 100%; }
table td.selection, table th.selection, table td.fileaction { width:2em; text-align:center; } table td.selection, table th.selection, table td.fileaction { width:2em; text-align:center; }
table td.filename a.name { display:block; height:1.5em; vertical-align:middle; margin-left:3em; } table td.filename a.name { display:block; height:1.5em; vertical-align:middle; margin-left:3em; }
@ -115,10 +124,12 @@ table td.filename form { font-size:.85em; margin-left:3em; margin-right:3em; }
} }
#fileList .name { position:relative; /* Firefox needs to explicitly have this default set … */ } #fileList .name { position:relative; /* Firefox needs to explicitly have this default set … */ }
#fileList tr:hover .fileactions { /* background to distinguish when overlaying with file names */ #fileList tr:hover .fileactions { /* background to distinguish when overlaying with file names */
background:rgba(248,248,248,.9); box-shadow:-5px 0 7px rgba(248,248,248,.9); background-color: rgba(240,240,240,0.898);
box-shadow: -5px 0 7px rgba(240,240,240,0.898);
} }
#fileList tr.selected:hover .fileactions, #fileList tr.mouseOver .fileactions { /* slightly darker color for selected rows */ #fileList tr.selected:hover .fileactions, #fileList tr.mouseOver .fileactions { /* slightly darker color for selected rows */
background:rgba(238,238,238,.9); box-shadow:-5px 0 7px rgba(238,238,238,.9); background-color: rgba(230,230,230,.9);
box-shadow: -5px 0 7px rgba(230,230,230,.9);
} }
#fileList .fileactions a.action img { position:relative; top:.2em; } #fileList .fileactions a.action img { position:relative; top:.2em; }
#fileList a.action { display:inline; margin:-.5em 0; padding:1em .5em 1em .5em !important; } #fileList a.action { display:inline; margin:-.5em 0; padding:1em .5em 1em .5em !important; }

View File

@ -51,7 +51,7 @@ var FileList={
}else{ }else{
simpleSize=t('files', 'Pending'); simpleSize=t('files', 'Pending');
} }
var sizeColor = Math.round(200-Math.pow((size/(1024*1024)),2)); var sizeColor = Math.round(160-Math.pow((size/(1024*1024)),2));
var lastModifiedTime = Math.round(lastModified.getTime() / 1000); var lastModifiedTime = Math.round(lastModified.getTime() / 1000);
td = $('<td></td>').attr({ td = $('<td></td>').attr({
"class": "filesize", "class": "filesize",

View File

@ -46,6 +46,7 @@
"{count} folders" => "{count} mapper", "{count} folders" => "{count} mapper",
"1 file" => "1 fil", "1 file" => "1 fil",
"{count} files" => "{count} filer", "{count} files" => "{count} filer",
"Invalid folder name. Usage of 'Shared' is reserved by ownCloud" => "Ugyldigt mappenavn. Brug af 'Shared' er forbeholdt af ownCloud",
"Unable to rename file" => "Kunne ikke omdøbe fil", "Unable to rename file" => "Kunne ikke omdøbe fil",
"Upload" => "Upload", "Upload" => "Upload",
"File handling" => "Filhåndtering", "File handling" => "Filhåndtering",

View File

@ -29,7 +29,7 @@
"'.' is an invalid file name." => "'.' är ett ogiltigt filnamn.", "'.' is an invalid file name." => "'.' är ett ogiltigt filnamn.",
"File name cannot be empty." => "Filnamn kan inte vara tomt.", "File name cannot be empty." => "Filnamn kan inte vara tomt.",
"Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Ogiltigt namn, '\\', '/', '<', '>', ':', '\"', '|', '?' och '*' är inte tillåtet.", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." => "Ogiltigt namn, '\\', '/', '<', '>', ':', '\"', '|', '?' och '*' är inte tillåtet.",
"Your storage is full, files can not be updated or synced anymore!" => "Ditt lagringsutrymme är fullt, filer kan ej längre laddas upp eller synkas!", "Your storage is full, files can not be updated or synced anymore!" => "Ditt lagringsutrymme är fullt, filer kan inte längre uppdateras eller synkroniseras!",
"Your storage is almost full ({usedSpacePercent}%)" => "Ditt lagringsutrymme är nästan fullt ({usedSpacePercent}%)", "Your storage is almost full ({usedSpacePercent}%)" => "Ditt lagringsutrymme är nästan fullt ({usedSpacePercent}%)",
"Your download is being prepared. This might take some time if the files are big." => "Din nedladdning förbereds. Det kan ta tid om det är stora filer.", "Your download is being prepared. This might take some time if the files are big." => "Din nedladdning förbereds. Det kan ta tid om det är stora filer.",
"Unable to upload your file as it is a directory or has 0 bytes" => "Kan inte ladda upp din fil eftersom det är en katalog eller har 0 bytes", "Unable to upload your file as it is a directory or has 0 bytes" => "Kan inte ladda upp din fil eftersom det är en katalog eller har 0 bytes",

View File

@ -3,12 +3,12 @@
<?php foreach($_['files'] as $file): <?php foreach($_['files'] as $file):
$simple_file_size = OCP\simple_file_size($file['size']); $simple_file_size = OCP\simple_file_size($file['size']);
// the bigger the file, the darker the shade of grey; megabytes*2 // the bigger the file, the darker the shade of grey; megabytes*2
$simple_size_color = intval(200-$file['size']/(1024*1024)*2); $simple_size_color = intval(160-$file['size']/(1024*1024)*2);
if($simple_size_color<0) $simple_size_color = 0; if($simple_size_color<0) $simple_size_color = 0;
$relative_modified_date = OCP\relative_modified_date($file['mtime']); $relative_modified_date = OCP\relative_modified_date($file['mtime']);
// the older the file, the brighter the shade of grey; days*14 // the older the file, the brighter the shade of grey; days*14
$relative_date_color = round((time()-$file['mtime'])/60/60/24*14); $relative_date_color = round((time()-$file['mtime'])/60/60/24*14);
if($relative_date_color>200) $relative_date_color = 200; if($relative_date_color>160) $relative_date_color = 160;
$name = rawurlencode($file['name']); $name = rawurlencode($file['name']);
$name = str_replace('%2F', '/', $name); $name = str_replace('%2F', '/', $name);
$directory = rawurlencode($file['directory']); $directory = rawurlencode($file['directory']);

View File

@ -22,28 +22,28 @@ $return = false;
$oldPassword = $_POST['oldPassword']; $oldPassword = $_POST['oldPassword'];
$newPassword = $_POST['newPassword']; $newPassword = $_POST['newPassword'];
$view = new \OC\Files\View('/');
$util = new \OCA\Encryption\Util(new \OC_FilesystemView('/'), \OCP\User::getUser()); $util = new \OCA\Encryption\Util(new \OC_FilesystemView('/'), \OCP\User::getUser());
$result = $util->checkRecoveryPassword($oldPassword); $proxyStatus = \OC_FileProxy::$enabled;
\OC_FileProxy::$enabled = false;
if ($result) { $keyId = $util->getRecoveryKeyId();
$keyId = $util->getRecoveryKeyId(); $keyPath = '/owncloud_private_key/' . $keyId . '.private.key';
$keyPath = '/owncloud_private_key/' . $keyId . '.private.key';
$view = new \OC\Files\View('/');
$proxyStatus = \OC_FileProxy::$enabled; $encryptedRecoveryKey = $view->file_get_contents($keyPath);
\OC_FileProxy::$enabled = false; $decryptedRecoveryKey = \OCA\Encryption\Crypt::decryptPrivateKey($encryptedRecoveryKey, $oldPassword);
if ($decryptedRecoveryKey) {
$encryptedRecoveryKey = $view->file_get_contents($keyPath);
$decryptedRecoveryKey = \OCA\Encryption\Crypt::symmetricDecryptFileContent($encryptedRecoveryKey, $oldPassword);
$encryptedRecoveryKey = \OCA\Encryption\Crypt::symmetricEncryptFileContent($decryptedRecoveryKey, $newPassword); $encryptedRecoveryKey = \OCA\Encryption\Crypt::symmetricEncryptFileContent($decryptedRecoveryKey, $newPassword);
$view->file_put_contents($keyPath, $encryptedRecoveryKey); $view->file_put_contents($keyPath, $encryptedRecoveryKey);
\OC_FileProxy::$enabled = $proxyStatus;
$return = true; $return = true;
} }
\OC_FileProxy::$enabled = $proxyStatus;
// success or failure // success or failure
if ($return) { if ($return) {
\OCP\JSON::success(array('data' => array('message' => $l->t('Password successfully changed.')))); \OCP\JSON::success(array('data' => array('message' => $l->t('Password successfully changed.'))));

View File

@ -0,0 +1,54 @@
<?php
/**
* Copyright (c) 2013, Bjoern Schiessle <schiessle@owncloud.com>
* This file is licensed under the Affero General Public License version 3 or later.
* See the COPYING-README file.
*
* @brief Script to change recovery key password
*
*/
use OCA\Encryption;
\OCP\JSON::checkLoggedIn();
\OCP\JSON::checkAppEnabled('files_encryption');
\OCP\JSON::callCheck();
$l = OC_L10N::get('core');
$return = false;
$oldPassword = $_POST['oldPassword'];
$newPassword = $_POST['newPassword'];
$view = new \OC\Files\View('/');
$session = new \OCA\Encryption\Session($view);
$user = \OCP\User::getUser();
$proxyStatus = \OC_FileProxy::$enabled;
\OC_FileProxy::$enabled = false;
$keyPath = '/' . $user . '/files_encryption/' . $user . '.private.key';
$encryptedKey = $view->file_get_contents($keyPath);
$decryptedKey = \OCA\Encryption\Crypt::decryptPrivateKey($encryptedKey, $oldPassword);
if ($decryptedKey) {
$encryptedKey = \OCA\Encryption\Crypt::symmetricEncryptFileContent($decryptedKey, $newPassword);
$view->file_put_contents($keyPath, $encryptedKey);
$session->setPrivateKey($decryptedKey);
$return = true;
}
\OC_FileProxy::$enabled = $proxyStatus;
// success or failure
if ($return) {
\OCP\JSON::success(array('data' => array('message' => $l->t('Private key password successfully updated.'))));
} else {
\OCP\JSON::error(array('data' => array('message' => $l->t('Could not update the private key password. Maybe the old password was not correct.'))));
}

View File

@ -10,45 +10,51 @@ OC::$CLASSPATH['OCA\Encryption\Session'] = 'files_encryption/lib/session.php';
OC::$CLASSPATH['OCA\Encryption\Capabilities'] = 'files_encryption/lib/capabilities.php'; OC::$CLASSPATH['OCA\Encryption\Capabilities'] = 'files_encryption/lib/capabilities.php';
OC::$CLASSPATH['OCA\Encryption\Helper'] = 'files_encryption/lib/helper.php'; OC::$CLASSPATH['OCA\Encryption\Helper'] = 'files_encryption/lib/helper.php';
OC_FileProxy::register(new OCA\Encryption\Proxy()); if (!OC_Config::getValue('maintenance', false)) {
OC_FileProxy::register(new OCA\Encryption\Proxy());
// User related hooks // User related hooks
OCA\Encryption\Helper::registerUserHooks(); OCA\Encryption\Helper::registerUserHooks();
// Sharing related hooks // Sharing related hooks
OCA\Encryption\Helper::registerShareHooks(); OCA\Encryption\Helper::registerShareHooks();
// Filesystem related hooks // Filesystem related hooks
OCA\Encryption\Helper::registerFilesystemHooks(); OCA\Encryption\Helper::registerFilesystemHooks();
stream_wrapper_register('crypt', 'OCA\Encryption\Stream'); stream_wrapper_register('crypt', 'OCA\Encryption\Stream');
// check if we are logged in // check if we are logged in
if (OCP\User::isLoggedIn()) { if (OCP\User::isLoggedIn()) {
// ensure filesystem is loaded // ensure filesystem is loaded
if(!\OC\Files\Filesystem::$loaded) { if (!\OC\Files\Filesystem::$loaded) {
\OC_Util::setupFS(); \OC_Util::setupFS();
} }
$view = new OC_FilesystemView('/'); $view = new OC_FilesystemView('/');
$session = new \OCA\Encryption\Session($view); $session = new \OCA\Encryption\Session($view);
// check if user has a private key $user = \OCP\USER::getUser();
if ( // check if user has a private key
!$session->getPrivateKey(\OCP\USER::getUser()) if (
&& OCA\Encryption\Crypt::mode() === 'server' !$view->file_exists('/' . $user . '/files_encryption/' . $user . '.private.key')
) { && OCA\Encryption\Crypt::mode() === 'server'
) {
// Force the user to log-in again if the encryption key isn't unlocked
// (happens when a user is logged in before the encryption app is // Force the user to log-in again if the encryption key isn't unlocked
// enabled) // (happens when a user is logged in before the encryption app is
OCP\User::logout(); // enabled)
OCP\User::logout();
header("Location: " . OC::$WEBROOT . '/');
header("Location: " . OC::$WEBROOT . '/');
exit();
exit();
}
} }
} else {
// logout user if we are in maintenance to force re-login
OCP\User::logout();
} }
// Register settings scripts // Register settings scripts

View File

@ -0,0 +1,24 @@
<?php
if (!isset($_)) { //also provide standalone error page
require_once '../../../lib/base.php';
$l = OC_L10N::get('files_encryption');
$errorMsg = $l->t('Your private key is not valid! Maybe your password was changed from outside. You can update your private key password in your personal settings to regain access to your files');
if(isset($_GET['p']) && $_GET['p'] === '1') {
header('HTTP/1.0 404 ' . $errorMsg);
}
// check if ajax request
if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') {
\OCP\JSON::error(array('data' => array('message' => $errorMsg)));
} else {
header('HTTP/1.0 404 ' . $errorMsg);
$tmpl = new OC_Template('files_encryption', 'invalid_private_key', 'guest');
$tmpl->printPage();
}
exit;
}
?>

View File

@ -60,17 +60,25 @@ class Hooks {
$encryptedKey = Keymanager::getPrivateKey($view, $params['uid']); $encryptedKey = Keymanager::getPrivateKey($view, $params['uid']);
$privateKey = Crypt::symmetricDecryptFileContent($encryptedKey, $params['password']); $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 = new \OCA\Encryption\Session($view);
$session->setPrivateKey($privateKey, $params['uid']); $session->setPrivateKey($privateKey);
// Check if first-run file migration has already been performed // Check if first-run file migration has already been performed
$migrationCompleted = $util->getMigrationStatus(); $ready = false;
if ($util->getMigrationStatus() === Util::MIGRATION_OPEN) {
$ready = $util->beginMigration();
}
// If migration not yet done // If migration not yet done
if (!$migrationCompleted) { if ($ready) {
$userView = new \OC_FilesystemView('/' . $params['uid']); $userView = new \OC_FilesystemView('/' . $params['uid']);
@ -81,7 +89,7 @@ class Hooks {
&& $encLegacyKey = $userView->file_get_contents('encryption.key') && $encLegacyKey = $userView->file_get_contents('encryption.key')
) { ) {
$plainLegacyKey = Crypt::legacyBlockDecrypt($encLegacyKey, $params['password']); $plainLegacyKey = Crypt::legacyDecrypt($encLegacyKey, $params['password']);
$session->setLegacyKey($plainLegacyKey); $session->setLegacyKey($plainLegacyKey);
@ -102,7 +110,7 @@ class Hooks {
} }
// Register successful migration in DB // Register successful migration in DB
$util->setMigrationStatus(1); $util->finishMigration();
} }
@ -141,6 +149,15 @@ class Hooks {
\OC_FileProxy::$enabled = $proxyStatus; \OC_FileProxy::$enabled = $proxyStatus;
} }
/**
* @brief If the password can't be changed within ownCloud, than update the key password in advance.
*/
public static function preSetPassphrase($params) {
if ( ! \OC_User::canUserChangePassword($params['uid']) ) {
self::setPassphrase($params);
}
}
/** /**
* @brief Change a user's encryption passphrase * @brief Change a user's encryption passphrase
* @param array $params keys: uid, password * @param array $params keys: uid, password
@ -148,7 +165,7 @@ class Hooks {
public static function setPassphrase($params) { public static function setPassphrase($params) {
// Only attempt to change passphrase if server-side encryption // Only attempt to change passphrase if server-side encryption
// is in use (client-side encryption does not have access to // is in use (client-side encryption does not have access to
// the necessary keys) // the necessary keys)
if (Crypt::mode() === 'server') { if (Crypt::mode() === 'server') {
@ -333,7 +350,7 @@ class Hooks {
$sharingEnabled = \OCP\Share::isEnabled(); $sharingEnabled = \OCP\Share::isEnabled();
// get the path including mount point only if not a shared folder // get the path including mount point only if not a shared folder
if(strncmp($path, '/Shared' , strlen('/Shared') !== 0)) { if (strncmp($path, '/Shared', strlen('/Shared') !== 0)) {
// get path including the the storage mount point // get path including the the storage mount point
$path = $util->getPathWithMountPoint($params['itemSource']); $path = $util->getPathWithMountPoint($params['itemSource']);
} }
@ -410,14 +427,14 @@ class Hooks {
} }
// get the path including mount point only if not a shared folder // get the path including mount point only if not a shared folder
if(strncmp($path, '/Shared' , strlen('/Shared') !== 0)) { if (strncmp($path, '/Shared', strlen('/Shared') !== 0)) {
// get path including the the storage mount point // get path including the the storage mount point
$path = $util->getPathWithMountPoint($params['itemSource']); $path = $util->getPathWithMountPoint($params['itemSource']);
} }
// if we unshare a folder we need a list of all (sub-)files // if we unshare a folder we need a list of all (sub-)files
if ($params['itemType'] === 'folder') { if ($params['itemType'] === 'folder') {
$allFiles = $util->getAllFiles( $path ); $allFiles = $util->getAllFiles($path);
} else { } else {
$allFiles = array($path); $allFiles = array($path);
} }

View File

@ -4,7 +4,25 @@
* See the COPYING-README file. * See the COPYING-README file.
*/ */
function updatePrivateKeyPasswd() {
var oldPrivateKeyPassword = $('input:password[id="oldPrivateKeyPassword"]').val();
var newPrivateKeyPassword = $('input:password[id="newPrivateKeyPassword"]').val();
OC.msg.startSaving('#encryption .msg');
$.post(
OC.filePath( 'files_encryption', 'ajax', 'updatePrivateKeyPassword.php' )
, { oldPassword: oldPrivateKeyPassword, newPassword: newPrivateKeyPassword }
, function( data ) {
if (data.status === "error") {
OC.msg.finishedSaving('#encryption .msg', data);
} else {
OC.msg.finishedSaving('#encryption .msg', data);
}
}
);
}
$(document).ready(function(){ $(document).ready(function(){
// Trigger ajax on recoveryAdmin status change // Trigger ajax on recoveryAdmin status change
$( 'input:radio[name="userEnableRecovery"]' ).change( $( 'input:radio[name="userEnableRecovery"]' ).change(
function() { function() {
@ -57,4 +75,24 @@ $(document).ready(function(){
} }
); );
// update private key password
$('input:password[name="changePrivateKeyPassword"]').keyup(function(event) {
var oldPrivateKeyPassword = $('input:password[id="oldPrivateKeyPassword"]').val();
var newPrivateKeyPassword = $('input:password[id="newPrivateKeyPassword"]').val();
if (newPrivateKeyPassword !== '' && oldPrivateKeyPassword !== '' ) {
$('button:button[name="submitChangePrivateKeyPassword"]').removeAttr("disabled");
if(event.which === 13) {
updatePrivateKeyPasswd();
}
} else {
$('button:button[name="submitChangePrivateKeyPassword"]').attr("disabled", "true");
}
});
$('button:button[name="submitChangePrivateKeyPassword"]').click(function() {
updatePrivateKeyPasswd();
});
}); });

View File

@ -5,7 +5,13 @@
"Could not disable recovery key. Please check your recovery key password!" => "No s'ha pogut desactivar la calu de recuperació. Comproveu la contrasenya de la clau de recuperació!", "Could not disable recovery key. Please check your recovery key password!" => "No s'ha pogut desactivar la calu de recuperació. Comproveu la contrasenya de la clau de recuperació!",
"Password successfully changed." => "La contrasenya s'ha canviat.", "Password successfully changed." => "La contrasenya s'ha canviat.",
"Could not change the password. Maybe the old password was not correct." => "No s'ha pogut canviar la contrasenya. Potser la contrasenya anterior no era correcta.", "Could not change the password. Maybe the old password was not correct." => "No s'ha pogut canviar la contrasenya. Potser la contrasenya anterior no era correcta.",
"Private key password successfully updated." => "La contrasenya de la clau privada s'ha actualitzat.",
"Could not update the private key password. Maybe the old password was not correct." => "No s'ha pogut actualitzar la contrasenya de la clau privada. Potser la contrasenya anterior no era correcta.",
"Your private key is not valid! Maybe your password was changed from outside. You can update your private key password in your personal settings to regain access to your files" => "La clau privada no és vàlida! Potser la contrasenya ha canviat des de fora. Podeu actualitzar la contrasenya de la clau privada a l'arranjament personal per obtenir de nou accés als vostres fitxers",
"Saving..." => "Desant...", "Saving..." => "Desant...",
"Your private key is not valid! Maybe the your password was changed from outside." => "La vostra clau privada no és vàlida! Potser la vostra contrasenya ha canviat des de fora.",
"You can unlock your private key in your " => "Podeu desbloquejar la clau privada en el vostre",
"personal settings" => "arranjament personal",
"Encryption" => "Xifrat", "Encryption" => "Xifrat",
"Enable encryption passwords recovery key (allow sharing to recovery key):" => "Activa la clau de recuperació de contrasenya (permet compartir la clau de recuperació):", "Enable encryption passwords recovery key (allow sharing to recovery key):" => "Activa la clau de recuperació de contrasenya (permet compartir la clau de recuperació):",
"Recovery account password" => "Contrasenya de recuperació del compte", "Recovery account password" => "Contrasenya de recuperació del compte",
@ -15,8 +21,14 @@
"Old Recovery account password" => "Contrasenya de recuperació anterior", "Old Recovery account password" => "Contrasenya de recuperació anterior",
"New Recovery account password" => "Nova contrasenya de recuperació de compte", "New Recovery account password" => "Nova contrasenya de recuperació de compte",
"Change Password" => "Canvia la contrasenya", "Change Password" => "Canvia la contrasenya",
"Enable password recovery by sharing all files with your administrator:" => "Activa la recuperació de contrasenya compartint tots els fitxers amb l'administrador:", "Your private key password no longer match your log-in password:" => "La clau privada ja no es correspon amb la contrasenya d'accés:",
"Enabling this option will allow you to reobtain access to your encrypted files if your password is lost" => "Activant aquesta opció us permetrà obtenir de nou accés als fitxers encriptats si perdeu la contrasenya", "Set your old private key password to your current log-in password." => "Establiu la vostra contrasenya clau en funció de la contrasenya actual d'accés.",
" If you don't remember your old password you can ask your administrator to recover your files." => "Si no recordeu la contrasenya anterior podeu demanar a l'administrador que recuperi els vostres fitxers.",
"Old log-in password" => "Contrasenya anterior d'accés",
"Current log-in password" => "Contrasenya d'accés actual",
"Update Private Key Password" => "Actualitza la contrasenya de clau privada",
"Enable password recovery:" => "Habilita la recuperació de contrasenya:",
"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" => "Activar aquesta opció us permetrà obtenir de nou accés als vostres fitxers encriptats en cas de perdre la contrasenya",
"File recovery settings updated" => "S'han actualitzat els arranjaments de recuperació de fitxers", "File recovery settings updated" => "S'han actualitzat els arranjaments de recuperació de fitxers",
"Could not update file recovery" => "No s'ha pogut actualitzar la recuperació de fitxers" "Could not update file recovery" => "No s'ha pogut actualitzar la recuperació de fitxers"
); );

View File

@ -5,6 +5,9 @@
"Could not disable recovery key. Please check your recovery key password!" => "Nelze zakázat záchranný klíč. Zkontrolujte prosím heslo vašeho záchranného klíče.", "Could not disable recovery key. Please check your recovery key password!" => "Nelze zakázat záchranný klíč. Zkontrolujte prosím heslo vašeho záchranného klíče.",
"Password successfully changed." => "Heslo bylo úspěšně změněno.", "Password successfully changed." => "Heslo bylo úspěšně změněno.",
"Could not change the password. Maybe the old password was not correct." => "Nelze změnit heslo. Pravděpodobně nebylo stávající heslo zadáno správně.", "Could not change the password. Maybe the old password was not correct." => "Nelze změnit heslo. Pravděpodobně nebylo stávající heslo zadáno správně.",
"Private key password successfully updated." => "Heslo soukromého klíče úspěšně aktualizováno.",
"Could not update the private key password. Maybe the old password was not correct." => "Nelze aktualizovat heslo soukromého klíče. Možná nebylo staré heslo správně.",
"Your private key is not valid! Maybe your password was changed from outside. You can update your private key password in your personal settings to regain access to your files" => "Váš soukromý klíč není platný. Možná bylo vaše heslo změněno z venku. Můžete aktualizovat heslo soukromého klíče v osobním nastavení pro opětovné získání přístupu k souborům",
"Saving..." => "Ukládám...", "Saving..." => "Ukládám...",
"Encryption" => "Šifrování", "Encryption" => "Šifrování",
"Enable encryption passwords recovery key (allow sharing to recovery key):" => "Povolit záchranný klíč šifrovacích hesel (povolí sdílený záchranný klíč):", "Enable encryption passwords recovery key (allow sharing to recovery key):" => "Povolit záchranný klíč šifrovacích hesel (povolí sdílený záchranný klíč):",
@ -15,8 +18,8 @@
"Old Recovery account password" => "Stávající heslo pro obnovu účtu", "Old Recovery account password" => "Stávající heslo pro obnovu účtu",
"New Recovery account password" => "Nové heslo pro obnovu účtu", "New Recovery account password" => "Nové heslo pro obnovu účtu",
"Change Password" => "Změnit heslo", "Change Password" => "Změnit heslo",
"Enable password recovery by sharing all files with your administrator:" => "Povolit obnovu hesla sdílením všech souborů s vaším správcem:", "Enable password recovery:" => "Povolit obnovu hesla:",
"Enabling this option will allow you to reobtain access to your encrypted files if your password is lost" => "Povolení vám umožní znovu získat přístup k vašim zašifrovaným souborům pokud ztratíte heslo", "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" => "Povolení vám umožní znovu získat přístup k vašim zašifrovaným souborům pokud ztratíte heslo",
"File recovery settings updated" => "Možnosti obnovy souborů aktualizovány", "File recovery settings updated" => "Možnosti obnovy souborů aktualizovány",
"Could not update file recovery" => "Nelze aktualizovat obnovu souborů" "Could not update file recovery" => "Nelze aktualizovat obnovu souborů"
); );

View File

@ -12,6 +12,5 @@
"Disabled" => "Deaktiviert", "Disabled" => "Deaktiviert",
"Change encryption passwords recovery key:" => "Wiederherstellungsschlüssel für Passwörter ändern:", "Change encryption passwords recovery key:" => "Wiederherstellungsschlüssel für Passwörter ändern:",
"Change Password" => "Passwort ändern", "Change Password" => "Passwort ändern",
"Enabling this option will allow you to reobtain access to your encrypted files if your password is lost" => "Wenn Sie diese Einstellung aktivieren, können Sie auch im Falle des Verlustes Ihres Passworts auf verschlüsselte Dateien zugreifen",
"File recovery settings updated" => "Einstellungen zur Wiederherstellung von Dateien wurden aktualisiert" "File recovery settings updated" => "Einstellungen zur Wiederherstellung von Dateien wurden aktualisiert"
); );

View File

@ -13,8 +13,6 @@
"Old Recovery account password" => "Altes Passwort für die Account-Wiederherstellung", "Old Recovery account password" => "Altes Passwort für die Account-Wiederherstellung",
"New Recovery account password" => "Neues Passwort für die Account-Wiederherstellung", "New Recovery account password" => "Neues Passwort für die Account-Wiederherstellung",
"Change Password" => "Passwort ändern", "Change Password" => "Passwort ändern",
"Enable password recovery by sharing all files with your administrator:" => "Aktiviere die Wiederherstellung deines Passwortes durch das Teilen aller Dateien mit dem Administrator:",
"Enabling this option will allow you to reobtain access to your encrypted files if your password is lost" => "Durch die Aktivierung dieser Option haben Sie die Möglichkeit, wieder auf Ihre verschlüsselten Dateien zugreifen zu können, wenn Sie Ihr Passwort verloren haben.",
"File recovery settings updated" => "Die Einstellungen für die Dateiwiederherstellung wurden aktualisiert.", "File recovery settings updated" => "Die Einstellungen für die Dateiwiederherstellung wurden aktualisiert.",
"Could not update file recovery" => "Die Dateiwiederherstellung konnte nicht aktualisiert werden." "Could not update file recovery" => "Die Dateiwiederherstellung konnte nicht aktualisiert werden."
); );

View File

@ -1,4 +1,11 @@
<?php $TRANSLATIONS = array( <?php $TRANSLATIONS = array(
"Password successfully changed." => "Ο κωδικός αλλάχτηκε επιτυχώς.",
"Could not change the password. Maybe the old password was not correct." => "Αποτυχία αλλαγής κωδικού ίσως ο παλιός κωδικός να μην ήταν σωστός.",
"Saving..." => "Γίνεται αποθήκευση...", "Saving..." => "Γίνεται αποθήκευση...",
"Encryption" => "Κρυπτογράφηση" "Encryption" => "Κρυπτογράφηση",
"Recovery account password" => "Επαναφορά κωδικού πρόσβασης λογαριασμού",
"Enabled" => "Ενεργοποιημένο",
"Disabled" => "Απενεργοποιημένο",
"Change Password" => "Αλλαγή Κωδικού Πρόσβασης",
"File recovery settings updated" => "Οι ρυθμίσεις επαναφοράς αρχείων ανανεώθηκαν"
); );

View File

@ -5,6 +5,7 @@
"Could not disable recovery key. Please check your recovery key password!" => "No se pudo deshabilitar la clave de recuperación. Por favor compruebe su contraseña!", "Could not disable recovery key. Please check your recovery key password!" => "No se pudo deshabilitar la clave de recuperación. Por favor compruebe su contraseña!",
"Password successfully changed." => "Su contraseña ha sido cambiada", "Password successfully changed." => "Su contraseña ha sido cambiada",
"Could not change the password. Maybe the old password was not correct." => "No se pudo cambiar la contraseña. Compruebe que la contraseña actual sea correcta.", "Could not change the password. Maybe the old password was not correct." => "No se pudo cambiar la contraseña. Compruebe que la contraseña actual sea correcta.",
"Private key password successfully updated." => "Contraseña de clave privada actualizada con éxito.",
"Saving..." => "Guardando...", "Saving..." => "Guardando...",
"Encryption" => "Cifrado", "Encryption" => "Cifrado",
"Enable encryption passwords recovery key (allow sharing to recovery key):" => "Habilitar clave de recuperación de contraseñas ():", "Enable encryption passwords recovery key (allow sharing to recovery key):" => "Habilitar clave de recuperación de contraseñas ():",
@ -15,8 +16,6 @@
"Old Recovery account password" => "Contraseña de recuperación actual", "Old Recovery account password" => "Contraseña de recuperación actual",
"New Recovery account password" => "Contraseña de recuperación nueva", "New Recovery account password" => "Contraseña de recuperación nueva",
"Change Password" => "Cambiar contraseña", "Change Password" => "Cambiar contraseña",
"Enable password recovery by sharing all files with your administrator:" => "Habilitar recuperación de contraseña compartiendo todos los archivos con su administrador",
"Enabling this option will allow you to reobtain access to your encrypted files if your password is lost" => "Habilitar esta opción para poder acceder a sus archivos cifrados si pierde su contraseña",
"File recovery settings updated" => "Opciones de recuperación de archivos actualizada", "File recovery settings updated" => "Opciones de recuperación de archivos actualizada",
"Could not update file recovery" => "No se pudo actualizar la recuperación de archivos" "Could not update file recovery" => "No se pudo actualizar la recuperación de archivos"
); );

View File

@ -1,4 +1,8 @@
<?php $TRANSLATIONS = array( <?php $TRANSLATIONS = array(
"Password successfully changed." => "Tu contraseña fue cambiada",
"Could not change the password. Maybe the old password was not correct." => "No se pudo cambiar la contraseña. Comprobá que la contraseña actual sea correcta.",
"Saving..." => "Guardando...", "Saving..." => "Guardando...",
"Encryption" => "Encriptación" "Encryption" => "Encriptación",
"Enable encryption passwords recovery key (allow sharing to recovery key):" => "Habilitar clave de recuperación de contraseñas (permite compartir clave de contraseñas):",
"Recovery account password" => "Recuperar contraseña"
); );

View File

@ -15,8 +15,6 @@
"Old Recovery account password" => "Konto vana taaste parool", "Old Recovery account password" => "Konto vana taaste parool",
"New Recovery account password" => "Konto uus taasteparool", "New Recovery account password" => "Konto uus taasteparool",
"Change Password" => "Muuda parooli", "Change Password" => "Muuda parooli",
"Enable password recovery by sharing all files with your administrator:" => "Luba parooli taaste jagades kõik failid administraatoriga:",
"Enabling this option will allow you to reobtain access to your encrypted files if your password is lost" => "Valiku lubamine võimaldab taastada ligipääsu krüpteeritud failidele kui parool on kadunud",
"File recovery settings updated" => "Faili taaste seaded uuendatud", "File recovery settings updated" => "Faili taaste seaded uuendatud",
"Could not update file recovery" => "Ei suuda uuendada taastefaili" "Could not update file recovery" => "Ei suuda uuendada taastefaili"
); );

View File

@ -5,7 +5,11 @@
"Could not disable recovery key. Please check your recovery key password!" => "Ne peut pas désactiver la clé de récupération. S'il vous plait vérifiez votre mot de passe de clé de récupération!", "Could not disable recovery key. Please check your recovery key password!" => "Ne peut pas désactiver la clé de récupération. S'il vous plait vérifiez votre mot de passe de clé de récupération!",
"Password successfully changed." => "Mot de passe changé avec succès ", "Password successfully changed." => "Mot de passe changé avec succès ",
"Could not change the password. Maybe the old password was not correct." => "Ne peut pas changer le mot de passe. L'ancien mot de passe est peut-être incorrect.", "Could not change the password. Maybe the old password was not correct." => "Ne peut pas changer le mot de passe. L'ancien mot de passe est peut-être incorrect.",
"Private key password successfully updated." => "Mot de passe de la clé privé mis à jour avec succès.",
"Could not update the private key password. Maybe the old password was not correct." => "Impossible de mettre à jour le mot de passe de la clé privé. Peut-être que l'ancien mot de passe n'était pas correcte.",
"Saving..." => "Enregistrement...", "Saving..." => "Enregistrement...",
"You can unlock your private key in your " => "Vous pouvez déverrouiller votre clé privée dans votre",
"personal settings" => "paramètres personnel",
"Encryption" => "Chiffrement", "Encryption" => "Chiffrement",
"Enable encryption passwords recovery key (allow sharing to recovery key):" => "Activer la clé de récupération par mots de passe de cryptage (autoriser le partage de la clé de récupération) ", "Enable encryption passwords recovery key (allow sharing to recovery key):" => "Activer la clé de récupération par mots de passe de cryptage (autoriser le partage de la clé de récupération) ",
"Recovery account password" => "Rétablissement du compte mot de passe ", "Recovery account password" => "Rétablissement du compte mot de passe ",
@ -15,8 +19,10 @@
"Old Recovery account password" => "Ancien compte de récupération de mots de passe", "Old Recovery account password" => "Ancien compte de récupération de mots de passe",
"New Recovery account password" => "Nouveau compte de récupération de mots de passe", "New Recovery account password" => "Nouveau compte de récupération de mots de passe",
"Change Password" => "Changer de mot de passe", "Change Password" => "Changer de mot de passe",
"Enable password recovery by sharing all files with your administrator:" => "Activer la récupération des mots de passe en partageant les fichiers avec votre administrateur:", "Old log-in password" => "Ancien mot de passe de connexion",
"Enabling this option will allow you to reobtain access to your encrypted files if your password is lost" => "En activant cette option cela vous autorisera à récupérer votre accès aux fichiers cryptés si votre mot de passe est perdu", "Current log-in password" => "Actuel mot de passe de connexion",
"Update Private Key Password" => "Mettre à jour le mot de passe de votre clé privée",
"Enable password recovery:" => "Activer la récupération du mot de passe:",
"File recovery settings updated" => "Mise à jour des paramètres de récupération de fichiers ", "File recovery settings updated" => "Mise à jour des paramètres de récupération de fichiers ",
"Could not update file recovery" => "Ne peut pas remettre à jour les fichiers de récupération" "Could not update file recovery" => "Ne peut pas remettre à jour les fichiers de récupération"
); );

View File

@ -5,7 +5,13 @@
"Could not disable recovery key. Please check your recovery key password!" => "Non foi posíbel desactivar a chave de recuperación. Comprobe o contrasinal da chave de recuperación!", "Could not disable recovery key. Please check your recovery key password!" => "Non foi posíbel desactivar a chave de recuperación. Comprobe o contrasinal da chave de recuperación!",
"Password successfully changed." => "O contrasinal foi cambiado satisfactoriamente", "Password successfully changed." => "O contrasinal foi cambiado satisfactoriamente",
"Could not change the password. Maybe the old password was not correct." => "Non foi posíbel cambiar o contrasinal. Probabelmente o contrasinal antigo non é o correcto.", "Could not change the password. Maybe the old password was not correct." => "Non foi posíbel cambiar o contrasinal. Probabelmente o contrasinal antigo non é o correcto.",
"Private key password successfully updated." => "A chave privada foi actualizada correctamente.",
"Could not update the private key password. Maybe the old password was not correct." => "Non foi posíbel actualizar o contrasinal da chave privada. É probábel que o contrasinal antigo non sexa correcto.",
"Your private key is not valid! Maybe your password was changed from outside. You can update your private key password in your personal settings to regain access to your files" => "A chave privada non é correcta! É probábel que o seu contrasinal teña sido cambiado desde o exterior. Vostede pode actualizar o contrasinal da súa chave privada nos seus axustes persoais para recuperar o acceso aos seus ficheiros",
"Saving..." => "Gardando...", "Saving..." => "Gardando...",
"Your private key is not valid! Maybe the your password was changed from outside." => "A chave privada non é correcta! É probábel que o seu contrasinal teña sido cambiado desde o exterior. ",
"You can unlock your private key in your " => "Pode desbloquear a chave privada nos seus",
"personal settings" => "axustes persoais",
"Encryption" => "Cifrado", "Encryption" => "Cifrado",
"Enable encryption passwords recovery key (allow sharing to recovery key):" => "Activar a chave de recuperación do cifrado de contrasinais (permite compartir a chave de recuperación):", "Enable encryption passwords recovery key (allow sharing to recovery key):" => "Activar a chave de recuperación do cifrado de contrasinais (permite compartir a chave de recuperación):",
"Recovery account password" => "Recuperación do contrasinal da conta", "Recovery account password" => "Recuperación do contrasinal da conta",
@ -15,8 +21,14 @@
"Old Recovery account password" => "Antigo contrasinal de recuperación da conta", "Old Recovery account password" => "Antigo contrasinal de recuperación da conta",
"New Recovery account password" => "Novo contrasinal de recuperación da conta", "New Recovery account password" => "Novo contrasinal de recuperación da conta",
"Change Password" => "Cambiar o contrasinal", "Change Password" => "Cambiar o contrasinal",
"Enable password recovery by sharing all files with your administrator:" => "Activar a recuperación de contrasinais compartindo todos os ficheiros co administrador:", "Your private key password no longer match your log-in password:" => "O seu contrasinal da chave privada non coincide co seu contrasinal de acceso.",
"Enabling this option will allow you to reobtain access to your encrypted files if your password is lost" => "Ao activar esta opción permitiráselle volver a obter acceso aos ficheiros cifrados se perde o contrasinal", "Set your old private key password to your current log-in password." => "Estabeleza o seu contrasinal antigo da chave de recuperación ao seu contrasinal de acceso actual",
" If you don't remember your old password you can ask your administrator to recover your files." => " Se non lembra o seu antigo contrasinal pode pedírllelo ao seu administrador para recuperar os seus ficheiros.",
"Old log-in password" => "Contrasinal de acceso antigo",
"Current log-in password" => "Contrasinal de acceso actual",
"Update Private Key Password" => "Actualizar o contrasinal da chave privada",
"Enable password recovery:" => "Activar o contrasinal de recuperación:",
"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" => "Ao activar esta opción permitiráselle volver a obter acceso aos ficheiros cifrados no caso de perda do contrasinal",
"File recovery settings updated" => "Actualizouse o ficheiro de axustes de recuperación", "File recovery settings updated" => "Actualizouse o ficheiro de axustes de recuperación",
"Could not update file recovery" => "Non foi posíbel actualizar o ficheiro de recuperación" "Could not update file recovery" => "Non foi posíbel actualizar o ficheiro de recuperación"
); );

View File

@ -5,7 +5,13 @@
"Could not disable recovery key. Please check your recovery key password!" => "Impossibile disabilitare la chiave di ripristino. Verifica la password della chiave di ripristino.", "Could not disable recovery key. Please check your recovery key password!" => "Impossibile disabilitare la chiave di ripristino. Verifica la password della chiave di ripristino.",
"Password successfully changed." => "Password modificata correttamente.", "Password successfully changed." => "Password modificata correttamente.",
"Could not change the password. Maybe the old password was not correct." => "Impossibile cambiare la password. Forse la vecchia password non era corretta.", "Could not change the password. Maybe the old password was not correct." => "Impossibile cambiare la password. Forse la vecchia password non era corretta.",
"Private key password successfully updated." => "Password della chiave privata aggiornata correttamente.",
"Could not update the private key password. Maybe the old password was not correct." => "Impossibile aggiornare la password della chiave privata. Forse la vecchia password non era corretta.",
"Your private key is not valid! Maybe your password was changed from outside. You can update your private key password in your personal settings to regain access to your files" => "La chiave privata non è valida! Forse la password è stata cambiata dall'esterno. Puoi aggiornare la password della chiave privata nelle impostazioni personali per riottenere l'accesso ai file.",
"Saving..." => "Salvataggio in corso...", "Saving..." => "Salvataggio in corso...",
"Your private key is not valid! Maybe the your password was changed from outside." => "La tua chiave privata non è valida! Forse è stata modifica dall'esterno.",
"You can unlock your private key in your " => "Puoi sbloccare la chiave privata nel tuo",
"personal settings" => "Impostazioni personali",
"Encryption" => "Cifratura", "Encryption" => "Cifratura",
"Enable encryption passwords recovery key (allow sharing to recovery key):" => "Abilita la chiave di ripristino delle password di cifratura (consente di condividere la chiave di ripristino):", "Enable encryption passwords recovery key (allow sharing to recovery key):" => "Abilita la chiave di ripristino delle password di cifratura (consente di condividere la chiave di ripristino):",
"Recovery account password" => "Password di ripristino dell'account", "Recovery account password" => "Password di ripristino dell'account",
@ -15,8 +21,14 @@
"Old Recovery account password" => "Vecchia password di ripristino dell'account", "Old Recovery account password" => "Vecchia password di ripristino dell'account",
"New Recovery account password" => "Nuova password di ripristino dell'account", "New Recovery account password" => "Nuova password di ripristino dell'account",
"Change Password" => "Modifica password", "Change Password" => "Modifica password",
"Enable password recovery by sharing all files with your administrator:" => "Abilita il ripristino della password condividendo tutti i file con l'amministratore:", "Your private key password no longer match your log-in password:" => "La password della chiave privata non corrisponde più alla password di login:",
"Enabling this option will allow you to reobtain access to your encrypted files if your password is lost" => "L'abilitazione di questa opzione ti consentirà di ottenere nuovamente accesso ai tuoi file cifrati in caso di smarrimento della password", "Set your old private key password to your current log-in password." => "Imposta la vecchia password della chiave privata sull'attuale password di login",
" If you don't remember your old password you can ask your administrator to recover your files." => "Se non ricordi la vecchia password puoi chiedere al tuo amministratore di recuperare i file",
"Old log-in password" => "Password di login vecchia",
"Current log-in password" => "Password di login corrente",
"Update Private Key Password" => "Aggiorna la Password della Chiave Privata",
"Enable password recovery:" => "Abilita il recupero della password:",
"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" => "Abilitando questa opzione potrai riaccedere ai file cifrati nel caso in cui la password venga perduta",
"File recovery settings updated" => "Impostazioni di ripristino dei file aggiornate", "File recovery settings updated" => "Impostazioni di ripristino dei file aggiornate",
"Could not update file recovery" => "Impossibile aggiornare il ripristino dei file" "Could not update file recovery" => "Impossibile aggiornare il ripristino dei file"
); );

View File

@ -5,7 +5,13 @@
"Could not disable recovery key. Please check your recovery key password!" => "リカバリ用のキーを無効化できませんでした。リカバリ用のキーのパスワードを確認して下さい!", "Could not disable recovery key. Please check your recovery key password!" => "リカバリ用のキーを無効化できませんでした。リカバリ用のキーのパスワードを確認して下さい!",
"Password successfully changed." => "パスワードを変更できました。", "Password successfully changed." => "パスワードを変更できました。",
"Could not change the password. Maybe the old password was not correct." => "パスワードを変更できませんでした。古いパスワードが間違っているかもしれません。", "Could not change the password. Maybe the old password was not correct." => "パスワードを変更できませんでした。古いパスワードが間違っているかもしれません。",
"Private key password successfully updated." => "秘密鍵のパスワードが正常に更新されました。",
"Could not update the private key password. Maybe the old password was not correct." => "秘密鍵のパスワードを更新できませんでした。古いパスワードが正確でない場合があります。",
"Your private key is not valid! Maybe your password was changed from outside. You can update your private key password in your personal settings to regain access to your files" => "秘密鍵が有効ではありません。パスワードが外部から変更された恐れがあります。。個人設定で秘密鍵のパスワードを更新して、ファイルへのアクセス権を奪還できます。",
"Saving..." => "保存中...", "Saving..." => "保存中...",
"Your private key is not valid! Maybe the your password was changed from outside." => "秘密鍵が有効ではありません。パスワードが外部から変更された恐れがあります。",
"You can unlock your private key in your " => "個人設定で",
"personal settings" => "秘密鍵をアンロックできます",
"Encryption" => "暗号化", "Encryption" => "暗号化",
"Enable encryption passwords recovery key (allow sharing to recovery key):" => "暗号化パスワードの復旧キーを有効にする(復旧キーを共有することを許可):", "Enable encryption passwords recovery key (allow sharing to recovery key):" => "暗号化パスワードの復旧キーを有効にする(復旧キーを共有することを許可):",
"Recovery account password" => "復旧アカウントのパスワード", "Recovery account password" => "復旧アカウントのパスワード",
@ -15,8 +21,14 @@
"Old Recovery account password" => "古い復旧アカウントのパスワード", "Old Recovery account password" => "古い復旧アカウントのパスワード",
"New Recovery account password" => "新しい復旧アカウントのパスワード", "New Recovery account password" => "新しい復旧アカウントのパスワード",
"Change Password" => "パスワードを変更", "Change Password" => "パスワードを変更",
"Enable password recovery by sharing all files with your administrator:" => "管理者が全ての共有ファイルに対してパスワードによる復旧を有効にする:", "Your private key password no longer match your log-in password:" => "もはや秘密鍵はログインパスワードと一致しません:",
"Enabling this option will allow you to reobtain access to your encrypted files if your password is lost" => "このオプションを有効にすると、もしパスワードが分からなくなったとしても、暗号化されたファイルに再度アクセスすることが出来るようになります。", "Set your old private key password to your current log-in password." => "古い秘密鍵のパスワードを現在のログインパスワードに設定する。",
" If you don't remember your old password you can ask your administrator to recover your files." => "古いパスワードを覚えていない場合、管理者に尋ねてファイルを回復することができます。",
"Old log-in password" => "古いログインパスワード",
"Current log-in password" => "現在のログインパスワード",
"Update Private Key Password" => "秘密鍵のパスワードを更新",
"Enable password recovery:" => "パスワード復旧を有効化:",
"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" => "このオプションを有効にすると、パスワードを紛失した場合も、暗号化されたファイルに再度アクセスすることができるようになります。",
"File recovery settings updated" => "ファイル復旧設定が更新されました", "File recovery settings updated" => "ファイル復旧設定が更新されました",
"Could not update file recovery" => "ファイル復旧を更新できませんでした" "Could not update file recovery" => "ファイル復旧を更新できませんでした"
); );

View File

@ -15,8 +15,6 @@
"Old Recovery account password" => "Seno atstatymo vartotojo slaptažodis", "Old Recovery account password" => "Seno atstatymo vartotojo slaptažodis",
"New Recovery account password" => "naujo atstatymo vartotojo slaptažodis", "New Recovery account password" => "naujo atstatymo vartotojo slaptažodis",
"Change Password" => "Pakeisti slaptažodį", "Change Password" => "Pakeisti slaptažodį",
"Enable password recovery by sharing all files with your administrator:" => "Įjungti slaptažodžio atkūrimą dalinantis visais failas su administratoriumi:",
"Enabling this option will allow you to reobtain access to your encrypted files if your password is lost" => "Įjungus šią funkciją jums bus suteiktas priėjimas prie šifruotos informacijos ir pamiršus slaptažodį.",
"File recovery settings updated" => "Failų atstatymo nustatymai pakeisti", "File recovery settings updated" => "Failų atstatymo nustatymai pakeisti",
"Could not update file recovery" => "Neišėjo atnaujinti failų atkūrimo" "Could not update file recovery" => "Neišėjo atnaujinti failų atkūrimo"
); );

View File

@ -6,6 +6,9 @@
"Password successfully changed." => "Wachtwoord succesvol gewijzigd.", "Password successfully changed." => "Wachtwoord succesvol gewijzigd.",
"Could not change the password. Maybe the old password was not correct." => "Kon wachtwoord niet wijzigen. Wellicht oude wachtwoord niet juist ingevoerd.", "Could not change the password. Maybe the old password was not correct." => "Kon wachtwoord niet wijzigen. Wellicht oude wachtwoord niet juist ingevoerd.",
"Saving..." => "Opslaan", "Saving..." => "Opslaan",
"Your private key is not valid! Maybe the your password was changed from outside." => "Uw privésleutel is niet geldig. Misschien was uw wachtwoord van buitenaf gewijzigd.",
"You can unlock your private key in your " => "U kunt uw privésleutel deblokkeren in uw",
"personal settings" => "persoonlijke instellingen",
"Encryption" => "Versleuteling", "Encryption" => "Versleuteling",
"Enable encryption passwords recovery key (allow sharing to recovery key):" => "Activeer versleuteling van wachtwoorden herstelsleutel (maak delen met herstel sleutel mogelijk):", "Enable encryption passwords recovery key (allow sharing to recovery key):" => "Activeer versleuteling van wachtwoorden herstelsleutel (maak delen met herstel sleutel mogelijk):",
"Recovery account password" => "Herstel account wachtwoord", "Recovery account password" => "Herstel account wachtwoord",
@ -15,8 +18,12 @@
"Old Recovery account password" => "Oude herstel account wachtwoord", "Old Recovery account password" => "Oude herstel account wachtwoord",
"New Recovery account password" => "Nieuwe herstel account wachtwoord", "New Recovery account password" => "Nieuwe herstel account wachtwoord",
"Change Password" => "Wijzigen wachtwoord", "Change Password" => "Wijzigen wachtwoord",
"Enable password recovery by sharing all files with your administrator:" => "Activeer wachtwoordherstel door alle bestanden met uw beheerder te delen:", " If you don't remember your old password you can ask your administrator to recover your files." => "Als u uw oude wachtwoord niet meer weet, kunt u uw beheerder vragen uw bestanden terug te halen.",
"Enabling this option will allow you to reobtain access to your encrypted files if your password is lost" => "Door deze optie te activeren kunt u toegang tot uw versleutelde bestanden krijgen als u uw wachtwoord kwijt bent", "Old log-in password" => "Oude wachtwoord",
"Current log-in password" => "Huidige wachtwoord",
"Update Private Key Password" => "Bijwerken wachtwoord Privésleutel",
"Enable password recovery:" => "Activeren wachtwoord herstel:",
"Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" => "Het activeren van deze optie maakt het mogelijk om uw versleutelde bestanden te benaderen als uw wachtwoord kwijt is",
"File recovery settings updated" => "Bestandsherstel instellingen bijgewerkt", "File recovery settings updated" => "Bestandsherstel instellingen bijgewerkt",
"Could not update file recovery" => "Kon bestandsherstel niet bijwerken" "Could not update file recovery" => "Kon bestandsherstel niet bijwerken"
); );

View File

@ -11,8 +11,6 @@
"Old Recovery account password" => "Stare hasło odzyskiwania", "Old Recovery account password" => "Stare hasło odzyskiwania",
"New Recovery account password" => "Nowe hasło odzyskiwania", "New Recovery account password" => "Nowe hasło odzyskiwania",
"Change Password" => "Zmień hasło", "Change Password" => "Zmień hasło",
"Enable password recovery by sharing all files with your administrator:" => "Włączyć hasło odzyskiwania przez udostępnianie wszystkich plików z administratorem:",
"Enabling this option will allow you to reobtain access to your encrypted files if your password is lost" => "Włączenie tej opcji umożliwia otrzymać dostęp do zaszyfrowanych plików w przypadku utraty hasła",
"File recovery settings updated" => "Ustawienia odzyskiwania plików zmienione", "File recovery settings updated" => "Ustawienia odzyskiwania plików zmienione",
"Could not update file recovery" => "Nie można zmienić pliku odzyskiwania" "Could not update file recovery" => "Nie można zmienić pliku odzyskiwania"
); );

View File

@ -15,8 +15,6 @@
"Old Recovery account password" => "Recuperação de senha de conta antiga", "Old Recovery account password" => "Recuperação de senha de conta antiga",
"New Recovery account password" => "Senha Nova da conta de Recuperação", "New Recovery account password" => "Senha Nova da conta de Recuperação",
"Change Password" => "Trocar Senha", "Change Password" => "Trocar Senha",
"Enable password recovery by sharing all files with your administrator:" => "Habilitar recuperação de senha através da partilha de todos os arquivos com o administrador:",
"Enabling this option will allow you to reobtain access to your encrypted files if your password is lost" => "Ativando esta opção irá permitir que você reobtainha acesso aos seus arquivos criptografados se sua senha for perdida",
"File recovery settings updated" => "Configurações de recuperação de arquivo atualizado", "File recovery settings updated" => "Configurações de recuperação de arquivo atualizado",
"Could not update file recovery" => "Não foi possível atualizar a recuperação de arquivos" "Could not update file recovery" => "Não foi possível atualizar a recuperação de arquivos"
); );

View File

@ -1,9 +1,20 @@
<?php $TRANSLATIONS = array( <?php $TRANSLATIONS = array(
"Recovery key successfully enabled" => "Chave de recuperação activada com sucesso",
"Could not enable recovery key. Please check your recovery key password!" => "Não foi possível activar a chave de recuperação. Por favor verifique a password da chave de recuperação!",
"Recovery key successfully disabled" => "Chave de recuperação descativada com sucesso",
"Could not disable recovery key. Please check your recovery key password!" => "Não foi possível desactivar a chave de recuperação. Por favor verifique a password da chave de recuperação.",
"Password successfully changed." => "Password alterada com sucesso.", "Password successfully changed." => "Password alterada com sucesso.",
"Could not change the password. Maybe the old password was not correct." => "Não foi possivel alterar a password. Possivelmente a password antiga não está correcta.", "Could not change the password. Maybe the old password was not correct." => "Não foi possivel alterar a password. Possivelmente a password antiga não está correcta.",
"Saving..." => "A guardar...", "Saving..." => "A guardar...",
"Encryption" => "Encriptação", "Encryption" => "Encriptação",
"Enable encryption passwords recovery key (allow sharing to recovery key):" => "Activar a chave de recuperação das passwords de encriptação (permitir partilha da chave de recuperação):",
"Recovery account password" => "Password de recuperação de conta",
"Enabled" => "Activado", "Enabled" => "Activado",
"Disabled" => "Desactivado", "Disabled" => "Desactivado",
"Change Password" => "Mudar a Password" "Change encryption passwords recovery key:" => "Alterar a chave de recuperação da password de encriptação:",
"Old Recovery account password" => "Password de recuperação de conta antiga:",
"New Recovery account password" => "Nova password de recuperação de conta",
"Change Password" => "Mudar a Password",
"File recovery settings updated" => "Actualizadas as definições de recuperação de ficheiros",
"Could not update file recovery" => "Não foi possível actualizar a recuperação de ficheiros"
); );

View File

@ -11,8 +11,6 @@
"Old Recovery account password" => "Старое Восстановление пароля учетной записи", "Old Recovery account password" => "Старое Восстановление пароля учетной записи",
"New Recovery account password" => "Новое Восстановление пароля учетной записи", "New Recovery account password" => "Новое Восстановление пароля учетной записи",
"Change Password" => "Изменить пароль", "Change Password" => "Изменить пароль",
"Enable password recovery by sharing all files with your administrator:" => "Включить восстановление пароля путем доступа Вашего администратора ко всем файлам",
"Enabling this option will allow you to reobtain access to your encrypted files if your password is lost" => "Включение этой опции позволит вам получить доступ к зашифрованным файлам, в случае утери пароля",
"File recovery settings updated" => "Настройки файла восстановления обновлены", "File recovery settings updated" => "Настройки файла восстановления обновлены",
"Could not update file recovery" => "Невозможно обновить файл восстановления" "Could not update file recovery" => "Невозможно обновить файл восстановления"
); );

View File

@ -5,7 +5,13 @@
"Could not disable recovery key. Please check your recovery key password!" => "Kunde inte inaktivera återställningsnyckeln. Vänligen kontrollera ditt lösenord för återställningsnyckeln!", "Could not disable recovery key. Please check your recovery key password!" => "Kunde inte inaktivera återställningsnyckeln. Vänligen kontrollera ditt lösenord för återställningsnyckeln!",
"Password successfully changed." => "Ändringen av lösenordet lyckades.", "Password successfully changed." => "Ändringen av lösenordet lyckades.",
"Could not change the password. Maybe the old password was not correct." => "Kunde inte ändra lösenordet. Kanske det gamla lösenordet inte var rätt.", "Could not change the password. Maybe the old password was not correct." => "Kunde inte ändra lösenordet. Kanske det gamla lösenordet inte var rätt.",
"Private key password successfully updated." => "Den privata lösenordsnyckeln uppdaterades utan problem.",
"Could not update the private key password. Maybe the old password was not correct." => "Kunde inte uppdatera den privata lösenordsnyckeln. Kanske var det gamla lösenordet fel.",
"Your private key is not valid! Maybe your password was changed from outside. You can update your private key password in your personal settings to regain access to your files" => "Din privata lösenordsnyckel är inte giltig! Kanske byttes ditt lösenord från utsidan. Du kan uppdatera din privata lösenordsnyckel under dina personliga inställningar för att återfå tillgång till dina filer",
"Saving..." => "Sparar...", "Saving..." => "Sparar...",
"Your private key is not valid! Maybe the your password was changed from outside." => "Din privata lösenordsnyckel är inte giltig! Kanske byttes ditt lösenord från utsidan.",
"You can unlock your private key in your " => "Du kan låsa upp din privata nyckel i dina",
"personal settings" => "personliga inställningar",
"Encryption" => "Kryptering", "Encryption" => "Kryptering",
"Enable encryption passwords recovery key (allow sharing to recovery key):" => "Aktivera återställningsnyckel för krypterade lösenord. (tillåt delning till återställningsnyckeln):", "Enable encryption passwords recovery key (allow sharing to recovery key):" => "Aktivera återställningsnyckel för krypterade lösenord. (tillåt delning till återställningsnyckeln):",
"Recovery account password" => "Återställning av kontolösenord", "Recovery account password" => "Återställning av kontolösenord",
@ -15,8 +21,13 @@
"Old Recovery account password" => "Gamla lösenordet för återställningskontot", "Old Recovery account password" => "Gamla lösenordet för återställningskontot",
"New Recovery account password" => "Nytt återställningslösenord för kontot", "New Recovery account password" => "Nytt återställningslösenord för kontot",
"Change Password" => "Byt lösenord", "Change Password" => "Byt lösenord",
"Enable password recovery by sharing all files with your administrator:" => "Aktivera lösenordsåterställning genom att dela alla filer med din administratör:", "Your private key password no longer match your log-in password:" => "Din privata lösenordsnyckel stämmer inte längre överrens med ditt inloggningslösenord:",
"Enabling this option will allow you to reobtain access to your encrypted files if your password is lost" => "Aktivera det här alternativet för att kunna återfå tillgång till dina krypterade filer om du skulle förlora/glömma ditt lösenord", "Set your old private key password to your current log-in password." => "Ställ in din gamla privata lösenordsnyckel till ditt aktuella inloggningslösenord.",
" If you don't remember your old password you can ask your administrator to recover your files." => "Om du inte kommer ihåg ditt gamla lösenord kan du be din administratör att återställa dina filer.",
"Old log-in password" => "Gammalt inloggningslösenord",
"Current log-in password" => "Nuvarande inloggningslösenord",
"Update Private Key Password" => "Uppdatera den privata lösenordsnyckeln",
"Enable password recovery:" => "Aktivera lösenordsåterställning",
"File recovery settings updated" => "Inställningarna för filåterställning har uppdaterats", "File recovery settings updated" => "Inställningarna för filåterställning har uppdaterats",
"Could not update file recovery" => "Kunde inte uppdatera filåterställning" "Could not update file recovery" => "Kunde inte uppdatera filåterställning"
); );

View File

@ -15,8 +15,6 @@
"Old Recovery account password" => "Eski kurtarma hesabı parolası", "Old Recovery account password" => "Eski kurtarma hesabı parolası",
"New Recovery account password" => "Yeni kurtarma hesabı parolası", "New Recovery account password" => "Yeni kurtarma hesabı parolası",
"Change Password" => "Parola değiştir", "Change Password" => "Parola değiştir",
"Enable password recovery by sharing all files with your administrator:" => "Parola kurtarmasını tüm paylaşılan dosyaları sistem yöneticiniz ile paylaşarak kurtarmayı etkinleştir:",
"Enabling this option will allow you to reobtain access to your encrypted files if your password is lost" => "Bu seçeneği etkinleştirmekle eğer parolanızı kaybederseniz şifreli dosyalara erişimi elde etmiş olursunuz",
"File recovery settings updated" => "Dosya kurtarma ayarları güncellendi", "File recovery settings updated" => "Dosya kurtarma ayarları güncellendi",
"Could not update file recovery" => "Dosya kurtarma güncellenemedi" "Could not update file recovery" => "Dosya kurtarma güncellenemedi"
); );

View File

@ -15,8 +15,6 @@
"Old Recovery account password" => "旧恢复账号密码", "Old Recovery account password" => "旧恢复账号密码",
"New Recovery account password" => "新恢复账号密码", "New Recovery account password" => "新恢复账号密码",
"Change Password" => "修改密码", "Change Password" => "修改密码",
"Enable password recovery by sharing all files with your administrator:" => "通过与系统管理员共享全部文件启用密码恢复:",
"Enabling this option will allow you to reobtain access to your encrypted files if your password is lost" => "启用该选项将允许你丢失密码时重新取得加密过的文件。",
"File recovery settings updated" => "文件恢复设置已更新", "File recovery settings updated" => "文件恢复设置已更新",
"Could not update file recovery" => "不能更新文件恢复" "Could not update file recovery" => "不能更新文件恢复"
); );

View File

@ -7,8 +7,6 @@
"Disabled" => "已停用", "Disabled" => "已停用",
"Change encryption passwords recovery key:" => "變更加密密碼還原金鑰:", "Change encryption passwords recovery key:" => "變更加密密碼還原金鑰:",
"Change Password" => "變更密碼", "Change Password" => "變更密碼",
"Enable password recovery by sharing all files with your administrator:" => "與管理員分享所有檔案以啓用密碼還原功能:",
"Enabling this option will allow you to reobtain access to your encrypted files if your password is lost" => "啓用此選項允許您未來遺失密碼時重新取得已加密的檔案",
"File recovery settings updated" => "檔案還原設定已更新", "File recovery settings updated" => "檔案還原設定已更新",
"Could not update file recovery" => "無法更新檔案還原設定" "Could not update file recovery" => "無法更新檔案還原設定"
); );

View File

@ -168,7 +168,7 @@ class Crypt {
* e.g. filename or /Docs/filename, NOT admin/files/filename * e.g. filename or /Docs/filename, NOT admin/files/filename
* @return boolean * @return boolean
*/ */
public static function isLegacyEncryptedContent($data, $relPath) { public static function isLegacyEncryptedContent($isCatFileContent, $relPath) {
// Fetch all file metadata from DB // Fetch all file metadata from DB
$metadata = \OC\Files\Filesystem::getFileInfo($relPath, ''); $metadata = \OC\Files\Filesystem::getFileInfo($relPath, '');
@ -178,7 +178,7 @@ class Crypt {
// legacy encryption system // legacy encryption system
if (isset($metadata['encrypted']) if (isset($metadata['encrypted'])
&& $metadata['encrypted'] === true && $metadata['encrypted'] === true
&& !self::isCatfileContent($data) && $isCatFileContent === false
) { ) {
return true; return true;
@ -351,6 +351,34 @@ class Crypt {
} }
/**
* @brief Decrypt private key and check if the result is a valid keyfile
* @param string $encryptedKey encrypted keyfile
* @param string $passphrase to decrypt keyfile
* @returns encrypted private key or false
*
* This function decrypts a file
*/
public static function decryptPrivateKey($encryptedKey, $passphrase) {
$plainKey = self::symmetricDecryptFileContent($encryptedKey, $passphrase);
// check if this a valid private key
$res = openssl_pkey_get_private($plainKey);
if (is_resource($res)) {
$sslInfo = openssl_pkey_get_details($res);
if (!isset($sslInfo['key'])) {
$plainKey = false;
}
} else {
$plainKey = false;
}
return $plainKey;
}
/** /**
* @brief Creates symmetric keyfile content using a generated key * @brief Creates symmetric keyfile content using a generated key
* @param string $plainContent content to be encrypted * @param string $plainContent content to be encrypted
@ -452,7 +480,7 @@ class Crypt {
} else { } else {
\OCP\Util::writeLog('Encryption library', 'Decryption (asymmetric) of sealed content failed', \OCP\Util::ERROR); \OCP\Util::writeLog('Encryption library', 'Decryption (asymmetric) of sealed content with share-key "'.$shareKey.'" failed', \OCP\Util::ERROR);
return false; return false;
@ -608,7 +636,7 @@ class Crypt {
* *
* This function decrypts an content * This function decrypts an content
*/ */
private static function legacyDecrypt($content, $passphrase = '') { public static function legacyDecrypt($content, $passphrase = '') {
$bf = self::getBlowfish($passphrase); $bf = self::getBlowfish($passphrase);
@ -637,28 +665,4 @@ class Crypt {
} }
} }
/**
* @param $legacyEncryptedContent
* @param $legacyPassphrase
* @param $publicKeys
* @return array
*/
public static function legacyKeyRecryptKeyfile($legacyEncryptedContent, $legacyPassphrase, $publicKeys) {
$decrypted = self::legacyBlockDecrypt($legacyEncryptedContent, $legacyPassphrase);
// Encrypt plain data, generate keyfile & encrypted file
$cryptedData = self::symmetricEncryptFileContentKeyfile($decrypted);
// Encrypt plain keyfile to multiple sharefiles
$multiEncrypted = Crypt::multiKeyEncrypt($cryptedData['key'], $publicKeys);
return array(
'data' => $cryptedData['encrypted'],
'filekey' => $multiEncrypted['data'],
'sharekeys' => $multiEncrypted['keys']
);
}
} }

View File

@ -48,6 +48,7 @@ class Helper {
\OCP\Util::connectHook('OC_User', 'post_login', 'OCA\Encryption\Hooks', 'login'); \OCP\Util::connectHook('OC_User', 'post_login', 'OCA\Encryption\Hooks', 'login');
\OCP\Util::connectHook('OC_User', 'post_setPassword', 'OCA\Encryption\Hooks', 'setPassphrase'); \OCP\Util::connectHook('OC_User', 'post_setPassword', 'OCA\Encryption\Hooks', 'setPassphrase');
\OCP\Util::connectHook('OC_User', 'pre_setPassword', 'OCA\Encryption\Hooks', 'preSetPassphrase');
\OCP\Util::connectHook('OC_User', 'post_createUser', 'OCA\Encryption\Hooks', 'postCreateUser'); \OCP\Util::connectHook('OC_User', 'post_createUser', 'OCA\Encryption\Hooks', 'postCreateUser');
\OCP\Util::connectHook('OC_User', 'post_deleteUser', 'OCA\Encryption\Hooks', 'postDeleteUser'); \OCP\Util::connectHook('OC_User', 'post_deleteUser', 'OCA\Encryption\Hooks', 'postDeleteUser');
} }
@ -73,7 +74,7 @@ class Helper {
if (!$util->ready()) { if (!$util->ready()) {
\OCP\Util::writeLog('Encryption library', 'User account "' . $util->getUserId() \OCP\Util::writeLog('Encryption library', 'User account "' . $util->getUserId()
. '" is not ready for encryption; configuration started', \OCP\Util::DEBUG); . '" is not ready for encryption; configuration started', \OCP\Util::DEBUG);
if (!$util->setupServerSide($password)) { if (!$util->setupServerSide($password)) {
return false; return false;
@ -93,6 +94,7 @@ class Helper {
* @return bool * @return bool
*/ */
public static function adminEnableRecovery($recoveryKeyId, $recoveryPassword) { public static function adminEnableRecovery($recoveryKeyId, $recoveryPassword) {
$view = new \OC\Files\View('/'); $view = new \OC\Files\View('/');
if ($recoveryKeyId === null) { if ($recoveryKeyId === null) {
@ -127,13 +129,6 @@ class Helper {
// Save private key // Save private key
$view->file_put_contents('/owncloud_private_key/' . $recoveryKeyId . '.private.key', $encryptedPrivateKey); $view->file_put_contents('/owncloud_private_key/' . $recoveryKeyId . '.private.key', $encryptedPrivateKey);
// create control file which let us check later on if the entered password was correct.
$encryptedControlData = \OCA\Encryption\Crypt::keyEncrypt("ownCloud", $keypair['publicKey']);
if (!$view->is_dir('/control-file')) {
$view->mkdir('/control-file');
}
$view->file_put_contents('/control-file/controlfile.enc', $encryptedControlData);
\OC_FileProxy::$enabled = true; \OC_FileProxy::$enabled = true;
// Set recoveryAdmin as enabled // Set recoveryAdmin as enabled
@ -200,4 +195,17 @@ class Helper {
return $relPath; return $relPath;
} }
/**
* @brief redirect to a error page
*/
public static function redirectToErrorPage() {
$location = \OC_Helper::linkToAbsolute('apps/files_encryption/files', 'error.php');
$post = 0;
if(count($_POST) > 0) {
$post = 1;
}
header('Location: ' . $location . '?p=' . $post);
exit();
}
} }

View File

@ -256,6 +256,8 @@ class Proxy extends \OC_FileProxy {
*/ */
public function postFopen($path, &$result) { public function postFopen($path, &$result) {
$path = \OC\Files\Filesystem::normalizePath($path);
if (!$result) { if (!$result) {
return $result; return $result;

View File

@ -88,9 +88,10 @@ class Session {
$proxyStatus = \OC_FileProxy::$enabled; $proxyStatus = \OC_FileProxy::$enabled;
\OC_FileProxy::$enabled = false; \OC_FileProxy::$enabled = false;
$encryptedKey = $this->view->file_get_contents( '/owncloud_private_key/' . $publicShareKeyId . '.private.key' ); $encryptedKey = $this->view->file_get_contents(
$privateKey = Crypt::symmetricDecryptFileContent( $encryptedKey, '' ); '/owncloud_private_key/' . $publicShareKeyId . '.private.key');
$this->setPublicSharePrivateKey( $privateKey ); $privateKey = Crypt::decryptPrivateKey($encryptedKey, '');
$this->setPublicSharePrivateKey($privateKey);
\OC_FileProxy::$enabled = $proxyStatus; \OC_FileProxy::$enabled = $proxyStatus;
} }
@ -121,7 +122,7 @@ class Session {
if (\OCA\Encryption\Helper::isPublicAccess()) { if (\OCA\Encryption\Helper::isPublicAccess()) {
return $this->getPublicSharePrivateKey(); return $this->getPublicSharePrivateKey();
} else { } else {
if (!is_null( \OC::$session->get('privateKey') )) { if (!is_null(\OC::$session->get('privateKey'))) {
return \OC::$session->get('privateKey'); return \OC::$session->get('privateKey');
} else { } else {
return false; return false;
@ -136,7 +137,7 @@ class Session {
*/ */
public function setPublicSharePrivateKey($privateKey) { public function setPublicSharePrivateKey($privateKey) {
\OC::$session->set('publicSharePrivateKey', $privateKey); \OC::$session->set('publicSharePrivateKey', $privateKey);
return true; return true;
@ -149,7 +150,7 @@ class Session {
*/ */
public function getPublicSharePrivateKey() { public function getPublicSharePrivateKey() {
if (!is_null( \OC::$session->get('publicSharePrivateKey') )) { if (!is_null(\OC::$session->get('publicSharePrivateKey'))) {
return \OC::$session->get('publicSharePrivateKey'); return \OC::$session->get('publicSharePrivateKey');
} else { } else {
return false; return false;
@ -176,7 +177,7 @@ class Session {
*/ */
public function getLegacyKey() { public function getLegacyKey() {
if ( !is_null( \OC::$session->get('legacyKey') ) ) { if (!is_null(\OC::$session->get('legacyKey'))) {
return \OC::$session->get('legacyKey'); return \OC::$session->get('legacyKey');

View File

@ -56,18 +56,21 @@ class Stream {
private $relPath; // rel path to users file dir private $relPath; // rel path to users file dir
private $userId; private $userId;
private $handle; // Resource returned by fopen private $handle; // Resource returned by fopen
private $path;
private $readBuffer; // For streams that dont support seeking
private $meta = array(); // Header / meta for source stream private $meta = array(); // Header / meta for source stream
private $count;
private $writeCache; private $writeCache;
private $size; private $size;
private $unencryptedSize; private $unencryptedSize;
private $publicKey; private $publicKey;
private $keyfile;
private $encKeyfile; private $encKeyfile;
private static $view; // a fsview object set to user dir /**
* @var \OC\Files\View
*/
private $rootView; // a fsview object set to '/' private $rootView; // a fsview object set to '/'
/**
* @var \OCA\Encryption\Session
*/
private $session;
private $privateKey;
/** /**
* @param $path * @param $path
@ -82,6 +85,10 @@ class Stream {
$this->rootView = new \OC_FilesystemView('/'); $this->rootView = new \OC_FilesystemView('/');
} }
$this->session = new \OCA\Encryption\Session($this->rootView);
$this->privateKey = $this->session->getPrivateKey($this->userId);
$util = new Util($this->rootView, \OCP\USER::getUser()); $util = new Util($this->rootView, \OCP\USER::getUser());
$this->userId = $util->getUserId(); $this->userId = $util->getUserId();
@ -109,6 +116,11 @@ class Stream {
} else { } else {
if($this->privateKey === false) {
// if private key is not valid redirect user to a error page
\OCA\Encryption\Helper::redirectToErrorPage();
}
$this->size = $this->rootView->filesize($this->rawPath, $mode); $this->size = $this->rootView->filesize($this->rawPath, $mode);
} }
@ -118,7 +130,7 @@ class Stream {
if (!is_resource($this->handle)) { if (!is_resource($this->handle)) {
\OCP\Util::writeLog('files_encryption', 'failed to open file "' . $this->rawPath . '"', \OCP\Util::ERROR); \OCP\Util::writeLog('Encryption library', 'failed to open file "' . $this->rawPath . '"', \OCP\Util::ERROR);
} else { } else {
@ -156,7 +168,7 @@ class Stream {
// $count will always be 8192 https://bugs.php.net/bug.php?id=21641 // $count will always be 8192 https://bugs.php.net/bug.php?id=21641
// This makes this function a lot simpler, but will break this class if the above 'bug' gets 'fixed' // This makes this function a lot simpler, but will break this class if the above 'bug' gets 'fixed'
\OCP\Util::writeLog('files_encryption', 'PHP "bug" 21641 no longer holds, decryption system requires refactoring', \OCP\Util::FATAL); \OCP\Util::writeLog('Encryption library', 'PHP "bug" 21641 no longer holds, decryption system requires refactoring', \OCP\Util::FATAL);
die(); die();
@ -165,7 +177,7 @@ class Stream {
// Get the data from the file handle // Get the data from the file handle
$data = fread($this->handle, 8192); $data = fread($this->handle, 8192);
$result = ''; $result = null;
if (strlen($data)) { if (strlen($data)) {
@ -175,10 +187,11 @@ class Stream {
throw new \Exception( throw new \Exception(
'Encryption key not found for "' . $this->rawPath . '" during attempted read via stream'); 'Encryption key not found for "' . $this->rawPath . '" during attempted read via stream');
} } else {
// Decrypt data // Decrypt data
$result = Crypt::symmetricDecryptFileContent($data, $this->plainKey); $result = Crypt::symmetricDecryptFileContent($data, $this->plainKey);
}
} }
@ -228,13 +241,18 @@ class Stream {
// If a keyfile already exists // If a keyfile already exists
if ($this->encKeyfile) { if ($this->encKeyfile) {
$session = new \OCA\Encryption\Session( $this->rootView ); // if there is no valid private key return false
if ($this->privateKey === false) {
$privateKey = $session->getPrivateKey($this->userId); // if private key is not valid redirect user to a error page
\OCA\Encryption\Helper::redirectToErrorPage();
return false;
}
$shareKey = Keymanager::getShareKey($this->rootView, $this->userId, $this->relPath); $shareKey = Keymanager::getShareKey($this->rootView, $this->userId, $this->relPath);
$this->plainKey = Crypt::multiKeyDecrypt($this->encKeyfile, $shareKey, $privateKey); $this->plainKey = Crypt::multiKeyDecrypt($this->encKeyfile, $shareKey, $this->privateKey);
return true; return true;
@ -257,6 +275,12 @@ class Stream {
*/ */
public function stream_write($data) { public function stream_write($data) {
// if there is no valid private key return false
if ($this->privateKey === false) {
$this->size = 0;
return strlen($data);
}
// Disable the file proxies so that encryption is not // Disable the file proxies so that encryption is not
// automatically attempted when the file is written to disk - // automatically attempted when the file is written to disk -
// we are handling that separately here and we don't want to // we are handling that separately here and we don't want to
@ -424,6 +448,28 @@ class Stream {
$this->flush(); $this->flush();
// if there is no valid private key return false
if ($this->privateKey === false) {
// cleanup
if ($this->meta['mode'] !== 'r' && $this->meta['mode'] !== 'rb') {
// Disable encryption proxy to prevent recursive calls
$proxyStatus = \OC_FileProxy::$enabled;
\OC_FileProxy::$enabled = false;
if ($this->rootView->file_exists($this->rawPath) && $this->size === 0) {
$this->rootView->unlink($this->rawPath);
}
// Re-enable proxy - our work is done
\OC_FileProxy::$enabled = $proxyStatus;
}
// if private key is not valid redirect user to a error page
\OCA\Encryption\Helper::redirectToErrorPage();
}
if ( if (
$this->meta['mode'] !== 'r' $this->meta['mode'] !== 'r'
and $this->meta['mode'] !== 'rb' and $this->meta['mode'] !== 'rb'
@ -450,16 +496,14 @@ class Stream {
// Encrypt enc key for all sharing users // Encrypt enc key for all sharing users
$this->encKeyfiles = Crypt::multiKeyEncrypt($this->plainKey, $publicKeys); $this->encKeyfiles = Crypt::multiKeyEncrypt($this->plainKey, $publicKeys);
$view = new \OC_FilesystemView('/');
// Save the new encrypted file key // Save the new encrypted file key
Keymanager::setFileKey($this->rootView, $this->relPath, $this->userId, $this->encKeyfiles['data']); Keymanager::setFileKey($this->rootView, $this->relPath, $this->userId, $this->encKeyfiles['data']);
// Save the sharekeys // Save the sharekeys
Keymanager::setShareKeys($view, $this->relPath, $this->encKeyfiles['keys']); Keymanager::setShareKeys($this->rootView, $this->relPath, $this->encKeyfiles['keys']);
// get file info // get file info
$fileInfo = $view->getFileInfo($this->rawPath); $fileInfo = $this->rootView->getFileInfo($this->rawPath);
if (!is_array($fileInfo)) { if (!is_array($fileInfo)) {
$fileInfo = array(); $fileInfo = array();
} }
@ -473,7 +517,7 @@ class Stream {
$fileInfo['unencrypted_size'] = $this->unencryptedSize; $fileInfo['unencrypted_size'] = $this->unencryptedSize;
// set fileinfo // set fileinfo
$view->putFileInfo($this->rawPath, $fileInfo); $this->rootView->putFileInfo($this->rawPath, $fileInfo);
} }
return fclose($this->handle); return fclose($this->handle);

View File

@ -96,10 +96,13 @@ class Util {
//// DONE: test new encryption with sharing //// DONE: test new encryption with sharing
//// TODO: test new encryption with proxies //// TODO: test new encryption with proxies
const MIGRATION_COMPLETED = 1; // migration to new encryption completed
const MIGRATION_IN_PROGRESS = -1; // migration is running
const MIGRATION_OPEN = 0; // user still needs to be migrated
private $view; // OC_FilesystemView object for filesystem operations private $view; // OC_FilesystemView object for filesystem operations
private $userId; // ID of the currently logged-in user private $userId; // ID of the currently logged-in user
private $pwd; // User Password
private $client; // Client side encryption mode flag private $client; // Client side encryption mode flag
private $publicKeyDir; // Dir containing all public user keys private $publicKeyDir; // Dir containing all public user keys
private $encryptionDir; // Dir containing user's files_encryption private $encryptionDir; // Dir containing user's files_encryption
@ -289,7 +292,7 @@ class Util {
*/ */
public function recoveryEnabledForUser() { public function recoveryEnabledForUser() {
$sql = 'SELECT `recovery_enabled` FROM `*PREFIX*encryption` WHERE uid = ?'; $sql = 'SELECT `recovery_enabled` FROM `*PREFIX*encryption` WHERE `uid` = ?';
$args = array($this->userId); $args = array($this->userId);
@ -302,7 +305,7 @@ class Util {
if (\OCP\DB::isError($result)) { if (\OCP\DB::isError($result)) {
\OCP\Util::writeLog('Encryption library', \OC_DB::getErrorMessage($result), \OCP\Util::ERROR); \OCP\Util::writeLog('Encryption library', \OC_DB::getErrorMessage($result), \OCP\Util::ERROR);
} else { } else {
if($result->numRows() > 0) { if ($result->numRows() > 0) {
$row = $result->fetchRow(); $row = $result->fetchRow();
if (isset($row['recovery_enabled'])) { if (isset($row['recovery_enabled'])) {
$recoveryEnabled[] = $row['recovery_enabled']; $recoveryEnabled[] = $row['recovery_enabled'];
@ -347,7 +350,7 @@ class Util {
// Create a new record instead // Create a new record instead
} else { } else {
$sql = 'UPDATE `*PREFIX*encryption` SET recovery_enabled = ? WHERE uid = ?'; $sql = 'UPDATE `*PREFIX*encryption` SET `recovery_enabled` = ? WHERE `uid` = ?';
$args = array( $args = array(
$enabled, $enabled,
@ -421,8 +424,7 @@ class Util {
// where they got re-enabled :/ // where they got re-enabled :/
\OC_FileProxy::$enabled = false; \OC_FileProxy::$enabled = false;
$data = $this->view->file_get_contents($filePath); $isEncryptedPath = $this->isEncryptedPath($filePath);
// If the file is encrypted // If the file is encrypted
// NOTE: If the userId is // NOTE: If the userId is
// empty or not set, file will // empty or not set, file will
@ -432,7 +434,7 @@ class Util {
// will eat server resources :( // will eat server resources :(
if ( if (
Keymanager::getFileKey($this->view, $this->userId, $relPath) Keymanager::getFileKey($this->view, $this->userId, $relPath)
&& Crypt::isCatfileContent($data) && $isEncryptedPath
) { ) {
$found['encrypted'][] = array( $found['encrypted'][] = array(
@ -442,7 +444,7 @@ class Util {
// If the file uses old // If the file uses old
// encryption system // encryption system
} elseif ( Crypt::isLegacyEncryptedContent( $data, $relPath ) ) { } elseif (Crypt::isLegacyEncryptedContent($isEncryptedPath, $relPath)) {
$found['legacy'][] = array( $found['legacy'][] = array(
'name' => $file, 'name' => $file,
@ -573,7 +575,9 @@ class Util {
// get relative path // get relative path
$relativePath = \OCA\Encryption\Helper::stripUserFilesPath($path); $relativePath = \OCA\Encryption\Helper::stripUserFilesPath($path);
if (isset($pathParts[2]) && $pathParts[2] === 'files' && $this->view->file_exists($path) && $this->isEncryptedPath($path)) { if (isset($pathParts[2]) && $pathParts[2] === 'files' && $this->view->file_exists($path)
&& $this->isEncryptedPath($path)
) {
// get the size from filesystem // get the size from filesystem
$fullPath = $this->view->getLocalFile($path); $fullPath = $this->view->getLocalFile($path);
@ -643,7 +647,7 @@ class Util {
return $result; return $result;
} }
/** /**
* @param $path * @param $path
* @return bool * @return bool
@ -687,28 +691,32 @@ class Util {
$relPath = $plainFile['path']; $relPath = $plainFile['path'];
//relative to /data //relative to /data
$rawPath = '/'.$this->userId . '/files/' . $plainFile['path']; $rawPath = '/' . $this->userId . '/files/' . $plainFile['path'];
// Open plain file handle for binary reading // Open plain file handle for binary reading
$plainHandle = $this->view->fopen( $rawPath, 'rb' ); $plainHandle = $this->view->fopen($rawPath, 'rb');
// Open enc file handle for binary writing, with same filename as original plain file // Open enc file handle for binary writing, with same filename as original plain file
$encHandle = fopen( 'crypt://' . $relPath.'.tmp', 'wb' ); $encHandle = fopen('crypt://' . $relPath . '.part', 'wb');
// Move plain file to a temporary location // Move plain file to a temporary location
$size = stream_copy_to_stream( $plainHandle, $encHandle ); $size = stream_copy_to_stream($plainHandle, $encHandle);
fclose($encHandle); fclose($encHandle);
$fakeRoot = $this->view->getRoot(); $fakeRoot = $this->view->getRoot();
$this->view->chroot('/'.$this->userId.'/files'); $this->view->chroot('/' . $this->userId . '/files');
$this->view->rename($relPath . '.tmp', $relPath); $this->view->rename($relPath . '.part', $relPath);
$this->view->chroot($fakeRoot); $this->view->chroot($fakeRoot);
// Add the file to the cache // Add the file to the cache
\OC\Files\Filesystem::putFileInfo( $relPath, array( 'encrypted' => true, 'size' => $size, 'unencrypted_size' => $size ) ); \OC\Files\Filesystem::putFileInfo($relPath, array(
'encrypted' => true,
'size' => $size,
'unencrypted_size' => $size
));
} }
// Encrypt legacy encrypted files // Encrypt legacy encrypted files
@ -722,40 +730,28 @@ class Util {
// Fetch data from file // Fetch data from file
$legacyData = $this->view->file_get_contents($legacyFile['path']); $legacyData = $this->view->file_get_contents($legacyFile['path']);
$sharingEnabled = \OCP\Share::isEnabled(); // decrypt data, generate catfile
$decrypted = Crypt::legacyBlockDecrypt($legacyData, $legacyPassphrase);
// if file exists try to get sharing users
if ($this->view->file_exists($legacyFile['path'])) {
$uniqueUserIds = $this->getSharingUsersArray($sharingEnabled, $legacyFile['path'], $this->userId);
} else {
$uniqueUserIds[] = $this->userId;
}
// Fetch public keys for all users who will share the file
$publicKeys = Keymanager::getPublicKeys($this->view, $uniqueUserIds);
// Recrypt data, generate catfile
$recrypted = Crypt::legacyKeyRecryptKeyfile( $legacyData, $legacyPassphrase, $publicKeys );
$rawPath = $legacyFile['path']; $rawPath = $legacyFile['path'];
$relPath = \OCA\Encryption\Helper::stripUserFilesPath($rawPath);
// Save keyfile // enable proxy the ensure encryption is handled
Keymanager::setFileKey($this->view, $relPath, $this->userId, $recrypted['filekey']); \OC_FileProxy::$enabled = true;
// Save sharekeys to user folders // Open enc file handle for binary writing, with same filename as original plain file
Keymanager::setShareKeys($this->view, $relPath, $recrypted['sharekeys']); $encHandle = $this->view->fopen( $rawPath, 'wb' );
// Overwrite the existing file with the encrypted one if (is_resource($encHandle)) {
$this->view->file_put_contents($rawPath, $recrypted['data']);
$size = strlen($recrypted['data']); // write data to stream
fwrite($encHandle, $decrypted);
// Add the file to the cache // close stream
\OC\Files\Filesystem::putFileInfo($rawPath, array( fclose($encHandle);
'encrypted' => true, }
'size' => $size
), ''); // disable proxy to prevent file being encrypted twice
\OC_FileProxy::$enabled = false;
} }
} }
@ -831,7 +827,7 @@ class Util {
if (\OCP\DB::isError($result)) { if (\OCP\DB::isError($result)) {
\OCP\Util::writeLog('Encryption library', \OC_DB::getErrorMessage($result), \OCP\Util::ERROR); \OCP\Util::writeLog('Encryption library', \OC_DB::getErrorMessage($result), \OCP\Util::ERROR);
} else { } else {
if($result->numRows() > 0) { if ($result->numRows() > 0) {
$row = $result->fetchRow(); $row = $result->fetchRow();
$path = substr($row['path'], strlen('files')); $path = substr($row['path'], strlen('files'));
} }
@ -1054,42 +1050,62 @@ class Util {
} }
/** /**
* @brief Set file migration status for user * @brief start migration mode to initially encrypt users data
* @param $status * @return boolean
* @return bool
*/ */
public function setMigrationStatus($status) { public function beginMigration() {
$sql = 'UPDATE `*PREFIX*encryption` SET migration_status = ? WHERE uid = ?'; $return = false;
$args = array(
$status,
$this->userId
);
$sql = 'UPDATE `*PREFIX*encryption` SET `migration_status` = ? WHERE `uid` = ? and `migration_status` = ?';
$args = array(self::MIGRATION_IN_PROGRESS, $this->userId, self::MIGRATION_OPEN);
$query = \OCP\DB::prepare($sql); $query = \OCP\DB::prepare($sql);
$result = $query->execute($args);
$manipulatedRows = $result->numRows();
if ($query->execute($args)) { if ($manipulatedRows === 1) {
$return = true;
return true; \OCP\Util::writeLog('Encryption library', "Start migration to encryption mode for " . $this->userId, \OCP\Util::INFO);
} else { } else {
\OCP\Util::writeLog('Encryption library', "Could not activate migration mode for " . $this->userId . ". Probably another process already started the initial encryption", \OCP\Util::WARN);
return false;
} }
return $return;
} }
/** /**
* @brief Check whether pwd recovery is enabled for a given user * @brief close migration mode after users data has been encrypted successfully
* @return bool 1 = yes, 0 = no, false = no record * @return boolean
*/
public function finishMigration() {
$return = false;
$sql = 'UPDATE `*PREFIX*encryption` SET `migration_status` = ? WHERE `uid` = ? and `migration_status` = ?';
$args = array(self::MIGRATION_COMPLETED, $this->userId, self::MIGRATION_IN_PROGRESS);
$query = \OCP\DB::prepare($sql);
$result = $query->execute($args);
$manipulatedRows = $result->numRows();
if ($manipulatedRows === 1) {
$return = true;
\OCP\Util::writeLog('Encryption library', "Finish migration successfully for " . $this->userId, \OCP\Util::INFO);
} else {
\OCP\Util::writeLog('Encryption library', "Could not deactivate migration mode for " . $this->userId, \OCP\Util::WARN);
}
return $return;
}
/**
* @brief check if files are already migrated to the encryption system
* @return migration status, false = in case of no record
* @note If records are not being returned, check for a hidden space * @note If records are not being returned, check for a hidden space
* at the start of the uid in db * at the start of the uid in db
*/ */
public function getMigrationStatus() { public function getMigrationStatus() {
$sql = 'SELECT `migration_status` FROM `*PREFIX*encryption` WHERE uid = ?'; $sql = 'SELECT `migration_status` FROM `*PREFIX*encryption` WHERE `uid` = ?';
$args = array($this->userId); $args = array($this->userId);
@ -1102,7 +1118,7 @@ class Util {
if (\OCP\DB::isError($result)) { if (\OCP\DB::isError($result)) {
\OCP\Util::writeLog('Encryption library', \OC_DB::getErrorMessage($result), \OCP\Util::ERROR); \OCP\Util::writeLog('Encryption library', \OC_DB::getErrorMessage($result), \OCP\Util::ERROR);
} else { } else {
if($result->numRows() > 0) { if ($result->numRows() > 0) {
$row = $result->fetchRow(); $row = $result->fetchRow();
if (isset($row['migration_status'])) { if (isset($row['migration_status'])) {
$migrationStatus[] = $row['migration_status']; $migrationStatus[] = $row['migration_status'];
@ -1112,14 +1128,11 @@ class Util {
// If no record is found // If no record is found
if (empty($migrationStatus)) { if (empty($migrationStatus)) {
\OCP\Util::writeLog('Encryption library', "Could not get migration status for " . $this->userId . ", no record found", \OCP\Util::ERROR);
return false; return false;
// If a record is found // If a record is found
} else { } else {
return (int)$migrationStatus[0];
return $migrationStatus[0];
} }
} }
@ -1191,7 +1204,8 @@ class Util {
$result = array(); $result = array();
$content = $this->view->getDirectoryContent(\OC\Files\Filesystem::normalizePath($this->userFilesDir . '/' . $dir)); $content = $this->view->getDirectoryContent(\OC\Files\Filesystem::normalizePath(
$this->userFilesDir . '/' . $dir));
// handling for re shared folders // handling for re shared folders
$pathSplit = explode('/', $dir); $pathSplit = explode('/', $dir);
@ -1252,7 +1266,7 @@ class Util {
if (\OCP\DB::isError($result)) { if (\OCP\DB::isError($result)) {
\OCP\Util::writeLog('Encryption library', \OC_DB::getErrorMessage($result), \OCP\Util::ERROR); \OCP\Util::writeLog('Encryption library', \OC_DB::getErrorMessage($result), \OCP\Util::ERROR);
} else { } else {
if($result->numRows() > 0) { if ($result->numRows() > 0) {
$row = $result->fetchRow(); $row = $result->fetchRow();
} }
} }
@ -1278,7 +1292,7 @@ class Util {
if (\OCP\DB::isError($result)) { if (\OCP\DB::isError($result)) {
\OCP\Util::writeLog('Encryption library', \OC_DB::getErrorMessage($result), \OCP\Util::ERROR); \OCP\Util::writeLog('Encryption library', \OC_DB::getErrorMessage($result), \OCP\Util::ERROR);
} else { } else {
if($result->numRows() > 0) { if ($result->numRows() > 0) {
$row = $result->fetchRow(); $row = $result->fetchRow();
} }
} }
@ -1303,7 +1317,7 @@ class Util {
if (\OCP\DB::isError($result)) { if (\OCP\DB::isError($result)) {
\OCP\Util::writeLog('Encryption library', \OC_DB::getErrorMessage($result), \OCP\Util::ERROR); \OCP\Util::writeLog('Encryption library', \OC_DB::getErrorMessage($result), \OCP\Util::ERROR);
} else { } else {
if($result->numRows() > 0) { if ($result->numRows() > 0) {
$source = $result->fetchRow(); $source = $result->fetchRow();
} }
} }
@ -1324,7 +1338,7 @@ class Util {
if (\OCP\DB::isError($result)) { if (\OCP\DB::isError($result)) {
\OCP\Util::writeLog('Encryption library', \OC_DB::getErrorMessage($result), \OCP\Util::ERROR); \OCP\Util::writeLog('Encryption library', \OC_DB::getErrorMessage($result), \OCP\Util::ERROR);
} else { } else {
if($result->numRows() > 0) { if ($result->numRows() > 0) {
$item = $result->fetchRow(); $item = $result->fetchRow();
} }
} }
@ -1372,26 +1386,24 @@ class Util {
*/ */
public function checkRecoveryPassword($password) { public function checkRecoveryPassword($password) {
$result = false;
$pathKey = '/owncloud_private_key/' . $this->recoveryKeyId . ".private.key"; $pathKey = '/owncloud_private_key/' . $this->recoveryKeyId . ".private.key";
$pathControlData = '/control-file/controlfile.enc';
$proxyStatus = \OC_FileProxy::$enabled; $proxyStatus = \OC_FileProxy::$enabled;
\OC_FileProxy::$enabled = false; \OC_FileProxy::$enabled = false;
$recoveryKey = $this->view->file_get_contents($pathKey); $recoveryKey = $this->view->file_get_contents($pathKey);
$decryptedRecoveryKey = Crypt::symmetricDecryptFileContent($recoveryKey, $password); $decryptedRecoveryKey = Crypt::decryptPrivateKey($recoveryKey, $password);
$controlData = $this->view->file_get_contents($pathControlData); if ($decryptedRecoveryKey) {
$decryptedControlData = Crypt::keyDecrypt($controlData, $decryptedRecoveryKey); $result = true;
}
\OC_FileProxy::$enabled = $proxyStatus; \OC_FileProxy::$enabled = $proxyStatus;
if ($decryptedControlData === 'ownCloud') {
return true;
}
return false; return $result;
} }
/** /**
@ -1520,7 +1532,7 @@ class Util {
$encryptedKey = $this->view->file_get_contents( $encryptedKey = $this->view->file_get_contents(
'/owncloud_private_key/' . $this->recoveryKeyId . '.private.key'); '/owncloud_private_key/' . $this->recoveryKeyId . '.private.key');
$privateKey = Crypt::symmetricDecryptFileContent($encryptedKey, $recoveryPassword); $privateKey = Crypt::decryptPrivateKey($encryptedKey, $recoveryPassword);
\OC_FileProxy::$enabled = $proxyStatus; \OC_FileProxy::$enabled = $proxyStatus;
@ -1536,7 +1548,7 @@ class Util {
list($storage, $internalPath) = \OC\Files\Cache\Cache::getById($id); list($storage, $internalPath) = \OC\Files\Cache\Cache::getById($id);
$mount = \OC\Files\Filesystem::getMountByStorageId($storage); $mount = \OC\Files\Filesystem::getMountByStorageId($storage);
$mountPoint = $mount[0]->getMountPoint(); $mountPoint = $mount[0]->getMountPoint();
$path = \OC\Files\Filesystem::normalizePath($mountPoint.'/'.$internalPath); $path = \OC\Files\Filesystem::normalizePath($mountPoint . '/' . $internalPath);
// reformat the path to be relative e.g. /user/files/folder becomes /folder/ // reformat the path to be relative e.g. /user/files/folder becomes /folder/
$relativePath = \OCA\Encryption\Helper::stripUserFilesPath($path); $relativePath = \OCA\Encryption\Helper::stripUserFilesPath($path);

View File

@ -14,15 +14,26 @@ $tmpl = new OCP\Template('files_encryption', 'settings-personal');
$user = \OCP\USER::getUser(); $user = \OCP\USER::getUser();
$view = new \OC_FilesystemView('/'); $view = new \OC_FilesystemView('/');
$util = new \OCA\Encryption\Util($view, $user); $util = new \OCA\Encryption\Util($view, $user);
$session = new \OCA\Encryption\Session($view);
$privateKeySet = ($session->getPrivateKey() !== false) ? true : false;
$recoveryAdminEnabled = OC_Appconfig::getValue('files_encryption', 'recoveryAdminEnabled'); $recoveryAdminEnabled = OC_Appconfig::getValue('files_encryption', 'recoveryAdminEnabled');
$recoveryEnabledForUser = $util->recoveryEnabledForUser(); $recoveryEnabledForUser = $util->recoveryEnabledForUser();
\OCP\Util::addscript('files_encryption', 'settings-personal'); $result = false;
\OCP\Util::addScript('settings', 'personal');
$tmpl->assign('recoveryEnabled', $recoveryAdminEnabled); if ($recoveryAdminEnabled || !$privateKeySet) {
$tmpl->assign('recoveryEnabledForUser', $recoveryEnabledForUser);
return $tmpl->fetchPage(); \OCP\Util::addscript('files_encryption', 'settings-personal');
\OCP\Util::addScript('settings', 'personal');
$tmpl->assign('recoveryEnabled', $recoveryAdminEnabled);
$tmpl->assign('recoveryEnabledForUser', $recoveryEnabledForUser);
$tmpl->assign('privateKeySet', $privateKeySet);
$result = $tmpl->fetchPage();
}
return $result;

View File

@ -0,0 +1,10 @@
<ul>
<li class='error'>
<?php $location = \OC_Helper::linkToRoute( "settings_personal" ).'#changePKPasswd' ?>
<?php p($l->t('Your private key is not valid! Maybe the your password was changed from outside.')); ?>
<br/>
<?php p($l->t('You can unlock your private key in your ')); ?> <a href="<?php echo $location?>"><?php p($l->t('personal settings')); ?>.</a>
<br/>
</li>
</ul>

View File

@ -1,54 +1,56 @@
<form id="encryption"> <form id="encryption">
<fieldset class="personalblock"> <fieldset class="personalblock">
<p> <p>
<strong><?php p($l->t( 'Encryption' )); ?></strong> <strong><?php p($l->t('Encryption')); ?></strong>
<br /> <br/>
</p> </p>
<p> <p>
<?php p($l->t( "Enable encryption passwords recovery key (allow sharing to recovery key):" )); ?> <?php p($l->t("Enable encryption passwords recovery key (allow sharing to recovery key):")); ?>
<br /> <br/>
<br /> <br/>
<input type="password" name="recoveryPassword" id="recoveryPassword" /> <input type="password" name="recoveryPassword" id="recoveryPassword"/>
<label for="recoveryPassword"><?php p($l->t( "Recovery account password" )); ?></label> <label for="recoveryPassword"><?php p($l->t("Recovery account password")); ?></label>
<br /> <br/>
<input <input
type='radio' type='radio'
name='adminEnableRecovery' name='adminEnableRecovery'
value='1' value='1'
<?php echo ( $_["recoveryEnabled"] == 1 ? 'checked="checked"' : 'disabled' ); ?> /> <?php echo($_["recoveryEnabled"] == 1 ? 'checked="checked"' : 'disabled'); ?> />
<?php p($l->t( "Enabled" )); ?> <?php p($l->t("Enabled")); ?>
<br /> <br/>
<input <input
type='radio' type='radio'
name='adminEnableRecovery' name='adminEnableRecovery'
value='0' value='0'
<?php echo ( $_["recoveryEnabled"] == 0 ? 'checked="checked"' : 'disabled' ); ?> /> <?php echo($_["recoveryEnabled"] == 0 ? 'checked="checked"' : 'disabled'); ?> />
<?php p($l->t( "Disabled" )); ?> <?php p($l->t("Disabled")); ?>
</p> </p>
<br /><br /> <br/><br/>
<p> <p>
<strong><?php p($l->t( "Change encryption passwords recovery key:" )); ?></strong> <strong><?php p($l->t("Change encryption passwords recovery key:")); ?></strong>
<br /><br /> <br/><br/>
<input <input
type="password" type="password"
name="changeRecoveryPassword" name="changeRecoveryPassword"
id="oldRecoveryPassword" id="oldRecoveryPassword"
<?php echo ( $_["recoveryEnabled"] == 0 ? 'disabled' : '' ); ?> /> <?php echo($_["recoveryEnabled"] == 0 ? 'disabled' : ''); ?> />
<label for="oldRecoveryPassword"><?php p($l->t( "Old Recovery account password" )); ?></label> <label for="oldRecoveryPassword"><?php p($l->t("Old Recovery account password")); ?></label>
<br /> <br/>
<input <input
type="password" type="password"
name="changeRecoveryPassword" name="changeRecoveryPassword"
id="newRecoveryPassword" id="newRecoveryPassword"
<?php echo ( $_["recoveryEnabled"] == 0 ? 'disabled' : '' ); ?> /> <?php echo($_["recoveryEnabled"] == 0 ? 'disabled' : ''); ?> />
<label for="newRecoveryPassword"><?php p($l->t( "New Recovery account password" )); ?></label> <label for="newRecoveryPassword"><?php p($l->t("New Recovery account password")); ?></label>
<br /> <br/>
<button <button
type="button" type="button"
name="submitChangeRecoveryKey" name="submitChangeRecoveryKey"
disabled><?php p($l->t( "Change Password" )); ?> disabled><?php p($l->t("Change Password")); ?>
</button> </button>
<span class="msg"></span> <span class="msg"></span>
</p> </p>

View File

@ -3,12 +3,48 @@
<legend> <legend>
<?php p( $l->t( 'Encryption' ) ); ?> <?php p( $l->t( 'Encryption' ) ); ?>
</legend> </legend>
<?php if ( $_["recoveryEnabled"] ): ?> <?php if ( ! $_["privateKeySet"] ): ?>
<p> <p>
<label for="userEnableRecovery"><?php p( $l->t( "Enable password recovery by sharing all files with your administrator:" ) ); ?></label> <a name="changePKPasswd" />
<label for="changePrivateKeyPasswd">
<?php p( $l->t( "Your private key password no longer match your log-in password:" ) ); ?>
</label>
<br /> <br />
<em><?php p( $l->t( "Enabling this option will allow you to reobtain access to your encrypted files if your password is lost" ) ); ?></em> <em><?php p( $l->t( "Set your old private key password to your current log-in password." ) ); ?>
<?php if ( $_["recoveryEnabledForUser"] ):
p( $l->t( " If you don't remember your old password you can ask your administrator to recover your files." ) );
endif; ?>
</em>
<br />
<input
type="password"
name="changePrivateKeyPassword"
id="oldPrivateKeyPassword" />
<label for="oldPrivateKeyPassword"><?php p($l->t( "Old log-in password" )); ?></label>
<br />
<input
type="password"
name="changePrivateKeyPassword"
id="newPrivateKeyPassword" />
<label for="newRecoveryPassword"><?php p($l->t( "Current log-in password" )); ?></label>
<br />
<button
type="button"
name="submitChangePrivateKeyPassword"
disabled><?php p($l->t( "Update Private Key Password" )); ?>
</button>
<span class="msg"></span>
</p>
<?php endif; ?>
<br />
<?php if ( $_["recoveryEnabled"] && $_["privateKeySet"] ): ?>
<p>
<label for="userEnableRecovery"><?php p( $l->t( "Enable password recovery:" ) ); ?></label>
<br />
<em><?php p( $l->t( "Enabling this option will allow you to reobtain access to your encrypted files in case of password loss" ) ); ?></em>
<br /> <br />
<input <input
type='radio' type='radio'
@ -28,6 +64,7 @@
<div id="recoveryEnabledError"><?php p( $l->t( 'Could not update file recovery' ) ); ?></div> <div id="recoveryEnabledError"><?php p( $l->t( 'Could not update file recovery' ) ); ?></div>
</p> </p>
<?php endif; ?> <?php endif; ?>
<br /> <br />
</fieldset> </fieldset>
</form> </form>

View File

@ -92,8 +92,7 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase {
// reset app files_trashbin // reset app files_trashbin
if ($this->stateFilesTrashbin) { if ($this->stateFilesTrashbin) {
OC_App::enable('files_trashbin'); OC_App::enable('files_trashbin');
} } else {
else {
OC_App::disable('files_trashbin'); OC_App::disable('files_trashbin');
} }
} }
@ -103,6 +102,9 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase {
\OC_User::deleteUser(\Test_Encryption_Crypt::TEST_ENCRYPTION_CRYPT_USER1); \OC_User::deleteUser(\Test_Encryption_Crypt::TEST_ENCRYPTION_CRYPT_USER1);
} }
/**
* @medium
*/
function testGenerateKey() { function testGenerateKey() {
# TODO: use more accurate (larger) string length for test confirmation # TODO: use more accurate (larger) string length for test confirmation
@ -114,6 +116,7 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase {
} }
/** /**
* @large
* @return String * @return String
*/ */
function testGenerateIv() { function testGenerateIv() {
@ -127,6 +130,7 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase {
} }
/** /**
* @large
* @depends testGenerateIv * @depends testGenerateIv
*/ */
function testConcatIv($iv) { function testConcatIv($iv) {
@ -159,6 +163,7 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase {
} }
/** /**
* @medium
* @depends testConcatIv * @depends testConcatIv
*/ */
function testSplitIv($testConcatIv) { function testSplitIv($testConcatIv) {
@ -175,6 +180,7 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase {
} }
/** /**
* @medium
* @return string padded * @return string padded
*/ */
function testAddPadding() { function testAddPadding() {
@ -190,6 +196,7 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase {
} }
/** /**
* @medium
* @depends testAddPadding * @depends testAddPadding
*/ */
function testRemovePadding($padded) { function testRemovePadding($padded) {
@ -200,6 +207,9 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase {
} }
/**
* @medium
*/
function testEncrypt() { function testEncrypt() {
$random = openssl_random_pseudo_bytes(13); $random = openssl_random_pseudo_bytes(13);
@ -212,6 +222,9 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase {
} }
/**
* @medium
*/
function testDecrypt() { function testDecrypt() {
$random = openssl_random_pseudo_bytes(13); $random = openssl_random_pseudo_bytes(13);
@ -226,6 +239,26 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase {
} }
function testDecryptPrivateKey() {
// test successful decrypt
$crypted = Encryption\Crypt::symmetricEncryptFileContent($this->genPrivateKey, 'hat');
$decrypted = Encryption\Crypt::decryptPrivateKey($crypted, 'hat');
$this->assertEquals($this->genPrivateKey, $decrypted);
//test private key decrypt with wrong password
$wrongPasswd = Encryption\Crypt::decryptPrivateKey($crypted, 'hat2');
$this->assertEquals(false, $wrongPasswd);
}
/**
* @medium
*/
function testSymmetricEncryptFileContent() { function testSymmetricEncryptFileContent() {
# TODO: search in keyfile for actual content as IV will ensure this test always passes # TODO: search in keyfile for actual content as IV will ensure this test always passes
@ -241,6 +274,9 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase {
} }
/**
* @medium
*/
function testSymmetricStreamEncryptShortFileContent() { function testSymmetricStreamEncryptShortFileContent() {
$filename = 'tmp-' . time() . '.test'; $filename = 'tmp-' . time() . '.test';
@ -291,6 +327,7 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase {
} }
/** /**
* @medium
* @brief Test that data that is written by the crypto stream wrapper * @brief Test that data that is written by the crypto stream wrapper
* @note Encrypted data is manually prepared and decrypted here to avoid dependency on success of stream_read * @note Encrypted data is manually prepared and decrypted here to avoid dependency on success of stream_read
* @note If this test fails with truncate content, check that enough array slices are being rejoined to form $e, as the crypt.php file may have gotten longer and broken the manual * @note If this test fails with truncate content, check that enough array slices are being rejoined to form $e, as the crypt.php file may have gotten longer and broken the manual
@ -377,6 +414,7 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase {
} }
/** /**
* @medium
* @brief Test that data that is read by the crypto stream wrapper * @brief Test that data that is read by the crypto stream wrapper
*/ */
function testSymmetricStreamDecryptShortFileContent() { function testSymmetricStreamDecryptShortFileContent() {
@ -406,6 +444,9 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase {
$this->view->unlink($this->userId . '/files/' . $filename); $this->view->unlink($this->userId . '/files/' . $filename);
} }
/**
* @medium
*/
function testSymmetricStreamDecryptLongFileContent() { function testSymmetricStreamDecryptLongFileContent() {
$filename = 'tmp-' . time(); $filename = 'tmp-' . time();
@ -425,6 +466,9 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase {
$this->view->unlink($this->userId . '/files/' . $filename); $this->view->unlink($this->userId . '/files/' . $filename);
} }
/**
* @medium
*/
function testSymmetricEncryptFileContentKeyfile() { function testSymmetricEncryptFileContentKeyfile() {
# TODO: search in keyfile for actual content as IV will ensure this test always passes # TODO: search in keyfile for actual content as IV will ensure this test always passes
@ -440,6 +484,9 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase {
} }
/**
* @medium
*/
function testIsEncryptedContent() { function testIsEncryptedContent() {
$this->assertFalse(Encryption\Crypt::isCatfileContent($this->dataUrl)); $this->assertFalse(Encryption\Crypt::isCatfileContent($this->dataUrl));
@ -452,6 +499,9 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase {
} }
/**
* @large
*/
function testMultiKeyEncrypt() { function testMultiKeyEncrypt() {
# TODO: search in keyfile for actual content as IV will ensure this test always passes # TODO: search in keyfile for actual content as IV will ensure this test always passes
@ -476,6 +526,9 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase {
} }
/**
* @medium
*/
function testKeyEncrypt() { function testKeyEncrypt() {
// Generate keypair // Generate keypair
@ -494,6 +547,7 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase {
} }
/** /**
* @medium
* @brief test encryption using legacy blowfish method * @brief test encryption using legacy blowfish method
*/ */
function testLegacyEncryptShort() { function testLegacyEncryptShort() {
@ -510,6 +564,7 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase {
} }
/** /**
* @medium
* @brief test decryption using legacy blowfish method * @brief test decryption using legacy blowfish method
* @depends testLegacyEncryptShort * @depends testLegacyEncryptShort
*/ */
@ -522,6 +577,7 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase {
} }
/** /**
* @medium
* @brief test encryption using legacy blowfish method * @brief test encryption using legacy blowfish method
*/ */
function testLegacyEncryptLong() { function testLegacyEncryptLong() {
@ -538,6 +594,7 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase {
} }
/** /**
* @medium
* @brief test decryption using legacy blowfish method * @brief test decryption using legacy blowfish method
* @depends testLegacyEncryptLong * @depends testLegacyEncryptLong
*/ */
@ -551,6 +608,7 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase {
} }
/** /**
* @medium
* @brief test generation of legacy encryption key * @brief test generation of legacy encryption key
* @depends testLegacyDecryptShort * @depends testLegacyDecryptShort
*/ */
@ -570,22 +628,8 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase {
} }
/** /**
* @brief test decryption using legacy blowfish method * @medium
* @depends testLegacyEncryptLong
*/ */
function testLegacyKeyRecryptKeyfileEncrypt($crypted) {
$recrypted = Encryption\Crypt::LegacyKeyRecryptKeyfile($crypted, $this->pass, array($this->genPublicKey));
$this->assertNotEquals($this->dataLong, $recrypted['data']);
return $recrypted;
# TODO: search inencrypted text for actual content to ensure it
# genuine transformation
}
function testRenameFile() { function testRenameFile() {
$filename = 'tmp-' . time(); $filename = 'tmp-' . time();
@ -614,6 +658,9 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase {
$view->unlink($newFilename); $view->unlink($newFilename);
} }
/**
* @medium
*/
function testMoveFileIntoFolder() { function testMoveFileIntoFolder() {
$filename = 'tmp-' . time(); $filename = 'tmp-' . time();
@ -644,6 +691,9 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase {
$view->unlink($newFolder); $view->unlink($newFolder);
} }
/**
* @medium
*/
function testMoveFolder() { function testMoveFolder() {
$view = new \OC\Files\View('/' . $this->userId . '/files'); $view = new \OC\Files\View('/' . $this->userId . '/files');
@ -679,6 +729,9 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase {
$view->unlink('/newfolder'); $view->unlink('/newfolder');
} }
/**
* @medium
*/
function testChangePassphrase() { function testChangePassphrase() {
$filename = 'tmp-' . time(); $filename = 'tmp-' . time();
@ -713,6 +766,9 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase {
$view->unlink($filename); $view->unlink($filename);
} }
/**
* @medium
*/
function testViewFilePutAndGetContents() { function testViewFilePutAndGetContents() {
$filename = '/tmp-' . time(); $filename = '/tmp-' . time();
@ -744,6 +800,9 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase {
$view->unlink($filename); $view->unlink($filename);
} }
/**
* @large
*/
function testTouchExistingFile() { function testTouchExistingFile() {
$filename = '/tmp-' . time(); $filename = '/tmp-' . time();
$view = new \OC\Files\View('/' . $this->userId . '/files'); $view = new \OC\Files\View('/' . $this->userId . '/files');
@ -765,6 +824,9 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase {
$view->unlink($filename); $view->unlink($filename);
} }
/**
* @medium
*/
function testTouchFile() { function testTouchFile() {
$filename = '/tmp-' . time(); $filename = '/tmp-' . time();
$view = new \OC\Files\View('/' . $this->userId . '/files'); $view = new \OC\Files\View('/' . $this->userId . '/files');
@ -786,6 +848,9 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase {
$view->unlink($filename); $view->unlink($filename);
} }
/**
* @medium
*/
function testFopenFile() { function testFopenFile() {
$filename = '/tmp-' . time(); $filename = '/tmp-' . time();
$view = new \OC\Files\View('/' . $this->userId . '/files'); $view = new \OC\Files\View('/' . $this->userId . '/files');

View File

@ -103,6 +103,9 @@ class Test_Encryption_Keymanager extends \PHPUnit_Framework_TestCase {
\OC_FileProxy::$enabled = true; \OC_FileProxy::$enabled = true;
} }
/**
* @medium
*/
function testGetPrivateKey() { function testGetPrivateKey() {
$key = Encryption\Keymanager::getPrivateKey($this->view, $this->userId); $key = Encryption\Keymanager::getPrivateKey($this->view, $this->userId);
@ -119,6 +122,9 @@ class Test_Encryption_Keymanager extends \PHPUnit_Framework_TestCase {
} }
/**
* @medium
*/
function testGetPublicKey() { function testGetPublicKey() {
$publiceKey = Encryption\Keymanager::getPublicKey($this->view, $this->userId); $publiceKey = Encryption\Keymanager::getPublicKey($this->view, $this->userId);
@ -132,6 +138,9 @@ class Test_Encryption_Keymanager extends \PHPUnit_Framework_TestCase {
$this->assertArrayHasKey('key', $sslInfo); $this->assertArrayHasKey('key', $sslInfo);
} }
/**
* @medium
*/
function testSetFileKey() { function testSetFileKey() {
# NOTE: This cannot be tested until we are able to break out # NOTE: This cannot be tested until we are able to break out
@ -165,6 +174,9 @@ class Test_Encryption_Keymanager extends \PHPUnit_Framework_TestCase {
} }
/**
* @medium
*/
function testGetUserKeys() { function testGetUserKeys() {
$keys = Encryption\Keymanager::getUserKeys($this->view, $this->userId); $keys = Encryption\Keymanager::getUserKeys($this->view, $this->userId);
@ -188,6 +200,9 @@ class Test_Encryption_Keymanager extends \PHPUnit_Framework_TestCase {
$this->assertArrayHasKey('key', $sslInfoPrivate); $this->assertArrayHasKey('key', $sslInfoPrivate);
} }
/**
* @medium
*/
function testFixPartialFilePath() { function testFixPartialFilePath() {
$partFilename = 'testfile.txt.part'; $partFilename = 'testfile.txt.part';
@ -202,6 +217,9 @@ class Test_Encryption_Keymanager extends \PHPUnit_Framework_TestCase {
$this->assertEquals('testfile.txt', Encryption\Keymanager::fixPartialFilePath($filename)); $this->assertEquals('testfile.txt', Encryption\Keymanager::fixPartialFilePath($filename));
} }
/**
* @medium
*/
function testRecursiveDelShareKeys() { function testRecursiveDelShareKeys() {
// generate filename // generate filename

View File

@ -111,8 +111,7 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
// reset app files_trashbin // reset app files_trashbin
if ($this->stateFilesTrashbin) { if ($this->stateFilesTrashbin) {
OC_App::enable('files_trashbin'); OC_App::enable('files_trashbin');
} } else {
else {
OC_App::disable('files_trashbin'); OC_App::disable('files_trashbin');
} }
} }
@ -129,6 +128,7 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
} }
/** /**
* @medium
* @param bool $withTeardown * @param bool $withTeardown
*/ */
function testShareFile($withTeardown = true) { function testShareFile($withTeardown = true) {
@ -205,6 +205,7 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
} }
/** /**
* @medium
* @param bool $withTeardown * @param bool $withTeardown
*/ */
function testReShareFile($withTeardown = true) { function testReShareFile($withTeardown = true) {
@ -275,6 +276,7 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
} }
/** /**
* @medium
* @param bool $withTeardown * @param bool $withTeardown
* @return array * @return array
*/ */
@ -363,6 +365,7 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
} }
/** /**
* @medium
* @param bool $withTeardown * @param bool $withTeardown
*/ */
function testReShareFolder($withTeardown = true) { function testReShareFolder($withTeardown = true) {
@ -564,6 +567,9 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
. $this->filename . '.' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '.shareKey')); . $this->filename . '.' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '.shareKey'));
} }
/**
* @medium
*/
function testShareFileWithGroup() { function testShareFileWithGroup() {
// login as admin // login as admin
\Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1); \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1);
@ -639,6 +645,9 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
} }
/**
* @large
*/
function testRecoveryFile() { function testRecoveryFile() {
// login as admin // login as admin
\Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1); \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1);
@ -646,9 +655,6 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
\OCA\Encryption\Helper::adminEnableRecovery(null, 'test123'); \OCA\Encryption\Helper::adminEnableRecovery(null, 'test123');
$recoveryKeyId = OC_Appconfig::getValue('files_encryption', 'recoveryKeyId'); $recoveryKeyId = OC_Appconfig::getValue('files_encryption', 'recoveryKeyId');
// check if control file created
$this->assertTrue($this->view->file_exists('/control-file/controlfile.enc'));
// login as admin // login as admin
\Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1); \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1);
@ -741,6 +747,9 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
$this->assertEquals(0, \OC_Appconfig::getValue('files_encryption', 'recoveryAdminEnabled')); $this->assertEquals(0, \OC_Appconfig::getValue('files_encryption', 'recoveryAdminEnabled'));
} }
/**
* @large
*/
function testRecoveryForUser() { function testRecoveryForUser() {
// login as admin // login as admin
\Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1); \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1);
@ -748,9 +757,6 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
\OCA\Encryption\Helper::adminEnableRecovery(null, 'test123'); \OCA\Encryption\Helper::adminEnableRecovery(null, 'test123');
$recoveryKeyId = OC_Appconfig::getValue('files_encryption', 'recoveryKeyId'); $recoveryKeyId = OC_Appconfig::getValue('files_encryption', 'recoveryKeyId');
// check if control file created
$this->assertTrue($this->view->file_exists('/control-file/controlfile.enc'));
// login as user1 // login as user1
\Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2); \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2);
@ -837,6 +843,9 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase {
$this->assertEquals(0, \OC_Appconfig::getValue('files_encryption', 'recoveryAdminEnabled')); $this->assertEquals(0, \OC_Appconfig::getValue('files_encryption', 'recoveryAdminEnabled'));
} }
/**
* @medium
*/
function testFailShareFile() { function testFailShareFile() {
// login as admin // login as admin
\Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1); \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1);

View File

@ -140,6 +140,9 @@ class Test_Encryption_Stream extends \PHPUnit_Framework_TestCase {
$view->unlink($filename); $view->unlink($filename);
} }
/**
* @medium
*/
function testStreamSetTimeout() { function testStreamSetTimeout() {
$filename = '/tmp-' . time(); $filename = '/tmp-' . time();
$view = new \OC\Files\View('/' . $this->userId . '/files'); $view = new \OC\Files\View('/' . $this->userId . '/files');

View File

@ -113,6 +113,7 @@ class Test_Encryption_Trashbin extends \PHPUnit_Framework_TestCase {
} }
/** /**
* @medium
* @brief test delete file * @brief test delete file
*/ */
function testDeleteFile() { function testDeleteFile() {
@ -184,6 +185,7 @@ class Test_Encryption_Trashbin extends \PHPUnit_Framework_TestCase {
} }
/** /**
* @medium
* @brief test restore file * @brief test restore file
* *
* @depends testDeleteFile * @depends testDeleteFile
@ -215,6 +217,7 @@ class Test_Encryption_Trashbin extends \PHPUnit_Framework_TestCase {
} }
/** /**
* @medium
* @brief test delete file forever * @brief test delete file forever
*/ */
function testPermanentDeleteFile() { function testPermanentDeleteFile() {

View File

@ -75,7 +75,7 @@ class Test_Encryption_Util extends \PHPUnit_Framework_TestCase {
$this->legacyData = realpath(dirname(__FILE__) . '/legacy-text.txt'); $this->legacyData = realpath(dirname(__FILE__) . '/legacy-text.txt');
$this->legacyEncryptedData = realpath(dirname(__FILE__) . '/legacy-encrypted-text.txt'); $this->legacyEncryptedData = realpath(dirname(__FILE__) . '/legacy-encrypted-text.txt');
$this->legacyEncryptedDataKey = realpath(dirname(__FILE__) . '/encryption.key'); $this->legacyEncryptedDataKey = realpath(dirname(__FILE__) . '/encryption.key');
$this->legacyKey = '30943623843030686906'; $this->legacyKey = "30943623843030686906\0\0\0\0";
$keypair = Encryption\Crypt::createKeypair(); $keypair = Encryption\Crypt::createKeypair();
@ -118,6 +118,7 @@ class Test_Encryption_Util extends \PHPUnit_Framework_TestCase {
} }
/** /**
* @medium
* @brief test that paths set during User construction are correct * @brief test that paths set during User construction are correct
*/ */
function testKeyPaths() { function testKeyPaths() {
@ -132,6 +133,7 @@ class Test_Encryption_Util extends \PHPUnit_Framework_TestCase {
} }
/** /**
* @medium
* @brief test setup of encryption directories * @brief test setup of encryption directories
*/ */
function testSetupServerSide() { function testSetupServerSide() {
@ -139,6 +141,7 @@ class Test_Encryption_Util extends \PHPUnit_Framework_TestCase {
} }
/** /**
* @medium
* @brief test checking whether account is ready for encryption, * @brief test checking whether account is ready for encryption,
*/ */
function testUserIsReady() { function testUserIsReady() {
@ -159,6 +162,7 @@ class Test_Encryption_Util extends \PHPUnit_Framework_TestCase {
// } // }
/** /**
* @medium
* @brief test checking whether account is not ready for encryption, * @brief test checking whether account is not ready for encryption,
*/ */
function testIsLegacyUser() { function testIsLegacyUser() {
@ -178,14 +182,16 @@ class Test_Encryption_Util extends \PHPUnit_Framework_TestCase {
$params['uid'] = \Test_Encryption_Util::TEST_ENCRYPTION_UTIL_LEGACY_USER; $params['uid'] = \Test_Encryption_Util::TEST_ENCRYPTION_UTIL_LEGACY_USER;
$params['password'] = \Test_Encryption_Util::TEST_ENCRYPTION_UTIL_LEGACY_USER; $params['password'] = \Test_Encryption_Util::TEST_ENCRYPTION_UTIL_LEGACY_USER;
$util = new Encryption\Util($this->view, \Test_Encryption_Util::TEST_ENCRYPTION_UTIL_LEGACY_USER); $this->setMigrationStatus(0, \Test_Encryption_Util::TEST_ENCRYPTION_UTIL_LEGACY_USER);
$util->setMigrationStatus(0);
$this->assertTrue(OCA\Encryption\Hooks::login($params)); $this->assertTrue(OCA\Encryption\Hooks::login($params));
$this->assertEquals($this->legacyKey, \OC::$session->get('legacyKey')); $this->assertEquals($this->legacyKey, \OC::$session->get('legacyKey'));
} }
/**
* @medium
*/
function testRecoveryEnabledForUser() { function testRecoveryEnabledForUser() {
$util = new Encryption\Util($this->view, $this->userId); $util = new Encryption\Util($this->view, $this->userId);
@ -206,6 +212,9 @@ class Test_Encryption_Util extends \PHPUnit_Framework_TestCase {
} }
/**
* @medium
*/
function testGetUidAndFilename() { function testGetUidAndFilename() {
\OC_User::setUserId(\Test_Encryption_Util::TEST_ENCRYPTION_UTIL_USER1); \OC_User::setUserId(\Test_Encryption_Util::TEST_ENCRYPTION_UTIL_USER1);
@ -232,6 +241,9 @@ class Test_Encryption_Util extends \PHPUnit_Framework_TestCase {
$this->view->unlink($this->userId . '/files/' . $filename); $this->view->unlink($this->userId . '/files/' . $filename);
} }
/**
* @medium
*/
function testIsSharedPath() { function testIsSharedPath() {
$sharedPath = '/user1/files/Shared/test'; $sharedPath = '/user1/files/Shared/test';
$path = '/user1/files/test'; $path = '/user1/files/test';
@ -241,6 +253,9 @@ class Test_Encryption_Util extends \PHPUnit_Framework_TestCase {
$this->assertFalse($this->util->isSharedPath($path)); $this->assertFalse($this->util->isSharedPath($path));
} }
/**
* @large
*/
function testEncryptLegacyFiles() { function testEncryptLegacyFiles() {
\Test_Encryption_Util::loginHelper(\Test_Encryption_Util::TEST_ENCRYPTION_UTIL_LEGACY_USER); \Test_Encryption_Util::loginHelper(\Test_Encryption_Util::TEST_ENCRYPTION_UTIL_LEGACY_USER);
@ -269,7 +284,7 @@ class Test_Encryption_Util extends \PHPUnit_Framework_TestCase {
$params['password'] = \Test_Encryption_Util::TEST_ENCRYPTION_UTIL_LEGACY_USER; $params['password'] = \Test_Encryption_Util::TEST_ENCRYPTION_UTIL_LEGACY_USER;
$util = new Encryption\Util($this->view, \Test_Encryption_Util::TEST_ENCRYPTION_UTIL_LEGACY_USER); $util = new Encryption\Util($this->view, \Test_Encryption_Util::TEST_ENCRYPTION_UTIL_LEGACY_USER);
$util->setMigrationStatus(0); $this->setMigrationStatus(0, \Test_Encryption_Util::TEST_ENCRYPTION_UTIL_LEGACY_USER);
$this->assertTrue(OCA\Encryption\Hooks::login($params)); $this->assertTrue(OCA\Encryption\Hooks::login($params));
@ -314,4 +329,28 @@ class Test_Encryption_Util extends \PHPUnit_Framework_TestCase {
$params['password'] = $password; $params['password'] = $password;
OCA\Encryption\Hooks::login($params); OCA\Encryption\Hooks::login($params);
} }
/**
* helper function to set migration status to the right value
* to be able to test the migration path
*
* @param $status needed migration status for test
* @param $user for which user the status should be set
* @return boolean
*/
private function setMigrationStatus($status, $user) {
$sql = 'UPDATE `*PREFIX*encryption` SET `migration_status` = ? WHERE `uid` = ?';
$args = array(
$status,
$user
);
$query = \OCP\DB::prepare($sql);
if ($query->execute($args)) {
return true;
} else {
return false;
}
}
} }

View File

@ -29,8 +29,12 @@ if ($isValid == false) {
// add the certificate if it could be verified // add the certificate if it could be verified
if ( $isValid ) { if ( $isValid ) {
// disable proxy to prevent multiple fopen calls
$proxyStatus = \OC_FileProxy::$enabled;
\OC_FileProxy::$enabled = false;
$view->file_put_contents($filename, $data); $view->file_put_contents($filename, $data);
OC_Mount_Config::createCertificateBundle(); OC_Mount_Config::createCertificateBundle();
\OC_FileProxy::$enabled = $proxyStatus;
} else { } else {
OCP\Util::writeLog('files_external', OCP\Util::writeLog('files_external',
'Couldn\'t import SSL root certificate ('.$filename.'), allowed formats: PEM and DER', 'Couldn\'t import SSL root certificate ('.$filename.'), allowed formats: PEM and DER',

View File

@ -88,7 +88,7 @@ OC.MountConfig={
url: OC.filePath('files_external', 'ajax', 'removeMountPoint.php'), url: OC.filePath('files_external', 'ajax', 'removeMountPoint.php'),
data: { data: {
mountPoint: mountPoint, mountPoint: mountPoint,
class: backendClass, 'class': backendClass,
classOptions: classOptions, classOptions: classOptions,
mountType: mountType, mountType: mountType,
applicable: applicable, applicable: applicable,
@ -103,7 +103,7 @@ OC.MountConfig={
url: OC.filePath('files_external', 'ajax', 'removeMountPoint.php'), url: OC.filePath('files_external', 'ajax', 'removeMountPoint.php'),
data: { data: {
mountPoint: mountPoint, mountPoint: mountPoint,
class: backendClass, 'class': backendClass,
classOptions: classOptions, classOptions: classOptions,
mountType: mountType, mountType: mountType,
applicable: applicable, applicable: applicable,
@ -247,15 +247,18 @@ $(document).ready(function() {
OC.MountConfig.saveStorage($(this).parent().parent()); OC.MountConfig.saveStorage($(this).parent().parent());
}); });
$('#sslCertificate').on('click', 'td.remove>img', function() {
var $tr = $(this).parent().parent();
var row = this.parentNode.parentNode;
$.post(OC.filePath('files_external', 'ajax', 'removeRootCertificate.php'), {cert: row.id});
$tr.remove();
return true;
});
$('#externalStorage').on('click', 'td.remove>img', function() { $('#externalStorage').on('click', 'td.remove>img', function() {
var tr = $(this).parent().parent(); var tr = $(this).parent().parent();
var mountPoint = $(tr).find('.mountPoint input').val(); var mountPoint = $(tr).find('.mountPoint input').val();
if ( ! mountPoint) {
var row=this.parentNode.parentNode;
$.post(OC.filePath('files_external', 'ajax', 'removeRootCertificate.php'), { cert: row.id });
$(tr).remove();
return true;
}
if ($('#externalStorage').data('admin') === true) { if ($('#externalStorage').data('admin') === true) {
var isPersonal = false; var isPersonal = false;
var multiselect = $(tr).find('.chzn-select').val(); var multiselect = $(tr).find('.chzn-select').val();

View File

@ -6,6 +6,7 @@
"Error configuring Google Drive storage" => "Error al configurar el almacenamiento de Google Drive", "Error configuring Google Drive storage" => "Error al configurar el almacenamiento de Google Drive",
"<b>Warning:</b> \"smbclient\" is not installed. Mounting of CIFS/SMB shares is not possible. Please ask your system administrator to install it." => "<b>Advertencia:</b> El cliente smb (smbclient) no se encuentra instalado. El montado de archivos o ficheros CIFS/SMB no es posible. Por favor pida al administrador de su sistema que lo instale.", "<b>Warning:</b> \"smbclient\" is not installed. Mounting of CIFS/SMB shares is not possible. Please ask your system administrator to install it." => "<b>Advertencia:</b> El cliente smb (smbclient) no se encuentra instalado. El montado de archivos o ficheros CIFS/SMB no es posible. Por favor pida al administrador de su sistema que lo instale.",
"<b>Warning:</b> The FTP support in PHP is not enabled or installed. Mounting of FTP shares is not possible. Please ask your system administrator to install it." => "<b>Advertencia:</b> El soporte de FTP en PHP no se encuentra instalado. El montado de archivos o ficheros FTP no es posible. Por favor pida al administrador de su sistema que lo instale.", "<b>Warning:</b> The FTP support in PHP is not enabled or installed. Mounting of FTP shares is not possible. Please ask your system administrator to install it." => "<b>Advertencia:</b> El soporte de FTP en PHP no se encuentra instalado. El montado de archivos o ficheros FTP no es posible. Por favor pida al administrador de su sistema que lo instale.",
"<b>Warning:</b> The Curl support in PHP is not enabled or installed. Mounting of ownCloud / WebDAV or GoogleDrive is not possible. Please ask your system administrator to install it." => "<b>Advertencia:</b> El soporte de Curl de PHP no está activado ni instalado. Montar servicios ownCloud, WebDAV y/o GoogleDrive no será posible. Pedile al administrador del sistema que lo instale.",
"External Storage" => "Almacenamiento externo", "External Storage" => "Almacenamiento externo",
"Folder name" => "Nombre de la carpeta", "Folder name" => "Nombre de la carpeta",
"External storage" => "Almacenamiento externo", "External storage" => "Almacenamiento externo",

View File

@ -1,4 +1,3 @@
<?php $TRANSLATIONS = array( <?php $TRANSLATIONS = array(
"Password" => "Wagwoord", "Password" => "Wagwoord"
"web services under your control" => "webdienste onder jou beheer"
); );

View File

@ -4,6 +4,5 @@
"%s shared the folder %s with you" => "%s شارك المجلد %s معك", "%s shared the folder %s with you" => "%s شارك المجلد %s معك",
"%s shared the file %s with you" => "%s شارك الملف %s معك", "%s shared the file %s with you" => "%s شارك الملف %s معك",
"Download" => "تحميل", "Download" => "تحميل",
"No preview available for" => "لا يوجد عرض مسبق لـ", "No preview available for" => "لا يوجد عرض مسبق لـ"
"web services under your control" => "خدمات الشبكة تحت سيطرتك"
); );

View File

@ -4,6 +4,5 @@
"%s shared the folder %s with you" => "%s сподели папката %s с Вас", "%s shared the folder %s with you" => "%s сподели папката %s с Вас",
"%s shared the file %s with you" => "%s сподели файла %s с Вас", "%s shared the file %s with you" => "%s сподели файла %s с Вас",
"Download" => "Изтегляне", "Download" => "Изтегляне",
"No preview available for" => "Няма наличен преглед за", "No preview available for" => "Няма наличен преглед за"
"web services under your control" => "уеб услуги под Ваш контрол"
); );

View File

@ -4,6 +4,5 @@
"%s shared the folder %s with you" => "%s আপনার সাথে %s ফোল্ডারটি ভাগাভাগি করেছেন", "%s shared the folder %s with you" => "%s আপনার সাথে %s ফোল্ডারটি ভাগাভাগি করেছেন",
"%s shared the file %s with you" => "%s আপনার সাথে %s ফাইলটি ভাগাভাগি করেছেন", "%s shared the file %s with you" => "%s আপনার সাথে %s ফাইলটি ভাগাভাগি করেছেন",
"Download" => "ডাউনলোড", "Download" => "ডাউনলোড",
"No preview available for" => "এর জন্য কোন প্রাকবীক্ষণ সুলভ নয়", "No preview available for" => "এর জন্য কোন প্রাকবীক্ষণ সুলভ নয়"
"web services under your control" => "ওয়েব সার্ভিস আপনার হাতের মুঠোয়"
); );

View File

@ -4,6 +4,5 @@
"%s shared the folder %s with you" => "%s ha compartit la carpeta %s amb vós", "%s shared the folder %s with you" => "%s ha compartit la carpeta %s amb vós",
"%s shared the file %s with you" => "%s ha compartit el fitxer %s amb vós", "%s shared the file %s with you" => "%s ha compartit el fitxer %s amb vós",
"Download" => "Baixa", "Download" => "Baixa",
"No preview available for" => "No hi ha vista prèvia disponible per a", "No preview available for" => "No hi ha vista prèvia disponible per a"
"web services under your control" => "controleu els vostres serveis web"
); );

View File

@ -4,6 +4,5 @@
"%s shared the folder %s with you" => "%s s Vámi sdílí složku %s", "%s shared the folder %s with you" => "%s s Vámi sdílí složku %s",
"%s shared the file %s with you" => "%s s Vámi sdílí soubor %s", "%s shared the file %s with you" => "%s s Vámi sdílí soubor %s",
"Download" => "Stáhnout", "Download" => "Stáhnout",
"No preview available for" => "Náhled není dostupný pro", "No preview available for" => "Náhled není dostupný pro"
"web services under your control" => "služby webu pod Vaší kontrolou"
); );

View File

@ -4,6 +4,5 @@
"%s shared the folder %s with you" => "Rhannodd %s blygell %s â chi", "%s shared the folder %s with you" => "Rhannodd %s blygell %s â chi",
"%s shared the file %s with you" => "Rhannodd %s ffeil %s â chi", "%s shared the file %s with you" => "Rhannodd %s ffeil %s â chi",
"Download" => "Llwytho i lawr", "Download" => "Llwytho i lawr",
"No preview available for" => "Does dim rhagolwg ar gael ar gyfer", "No preview available for" => "Does dim rhagolwg ar gael ar gyfer"
"web services under your control" => "gwasanaethau gwe a reolir gennych"
); );

View File

@ -4,6 +4,5 @@
"%s shared the folder %s with you" => "%s delte mappen %s med dig", "%s shared the folder %s with you" => "%s delte mappen %s med dig",
"%s shared the file %s with you" => "%s delte filen %s med dig", "%s shared the file %s with you" => "%s delte filen %s med dig",
"Download" => "Download", "Download" => "Download",
"No preview available for" => "Forhåndsvisning ikke tilgængelig for", "No preview available for" => "Forhåndsvisning ikke tilgængelig for"
"web services under your control" => "Webtjenester under din kontrol"
); );

View File

@ -4,6 +4,5 @@
"%s shared the folder %s with you" => "%s hat den Ordner %s mit Dir geteilt", "%s shared the folder %s with you" => "%s hat den Ordner %s mit Dir geteilt",
"%s shared the file %s with you" => "%s hat die Datei %s mit Dir geteilt", "%s shared the file %s with you" => "%s hat die Datei %s mit Dir geteilt",
"Download" => "Download", "Download" => "Download",
"No preview available for" => "Es ist keine Vorschau verfügbar für", "No preview available for" => "Es ist keine Vorschau verfügbar für"
"web services under your control" => "Web-Services unter Deiner Kontrolle"
); );

View File

@ -4,6 +4,5 @@
"%s shared the folder %s with you" => "%s hat den Ordner %s mit Ihnen geteilt", "%s shared the folder %s with you" => "%s hat den Ordner %s mit Ihnen geteilt",
"%s shared the file %s with you" => "%s hat die Datei %s mit Ihnen geteilt", "%s shared the file %s with you" => "%s hat die Datei %s mit Ihnen geteilt",
"Download" => "Herunterladen", "Download" => "Herunterladen",
"No preview available for" => "Es ist keine Vorschau verfügbar für", "No preview available for" => "Es ist keine Vorschau verfügbar für"
"web services under your control" => "Web-Services unter Ihrer Kontrolle"
); );

View File

@ -4,6 +4,5 @@
"%s shared the folder %s with you" => "%s μοιράστηκε τον φάκελο %s μαζί σας", "%s shared the folder %s with you" => "%s μοιράστηκε τον φάκελο %s μαζί σας",
"%s shared the file %s with you" => "%s μοιράστηκε το αρχείο %s μαζί σας", "%s shared the file %s with you" => "%s μοιράστηκε το αρχείο %s μαζί σας",
"Download" => "Λήψη", "Download" => "Λήψη",
"No preview available for" => "Δεν υπάρχει διαθέσιμη προεπισκόπηση για", "No preview available for" => "Δεν υπάρχει διαθέσιμη προεπισκόπηση για"
"web services under your control" => "υπηρεσίες δικτύου υπό τον έλεγχό σας"
); );

View File

@ -4,6 +4,5 @@
"%s shared the folder %s with you" => "%s shared the folder %s with you", "%s shared the folder %s with you" => "%s shared the folder %s with you",
"%s shared the file %s with you" => "%s shared the file %s with you", "%s shared the file %s with you" => "%s shared the file %s with you",
"Download" => "Download", "Download" => "Download",
"No preview available for" => "No preview available for", "No preview available for" => "No preview available for"
"web services under your control" => "web services under your control"
); );

View File

@ -4,6 +4,5 @@
"%s shared the folder %s with you" => "%s kunhavigis la dosierujon %s kun vi", "%s shared the folder %s with you" => "%s kunhavigis la dosierujon %s kun vi",
"%s shared the file %s with you" => "%s kunhavigis la dosieron %s kun vi", "%s shared the file %s with you" => "%s kunhavigis la dosieron %s kun vi",
"Download" => "Elŝuti", "Download" => "Elŝuti",
"No preview available for" => "Ne haveblas antaŭvido por", "No preview available for" => "Ne haveblas antaŭvido por"
"web services under your control" => "TTT-servoj regataj de vi"
); );

View File

@ -4,6 +4,5 @@
"%s shared the folder %s with you" => "%s compartió la carpeta %s contigo", "%s shared the folder %s with you" => "%s compartió la carpeta %s contigo",
"%s shared the file %s with you" => "%s compartió el fichero %s contigo", "%s shared the file %s with you" => "%s compartió el fichero %s contigo",
"Download" => "Descargar", "Download" => "Descargar",
"No preview available for" => "No hay vista previa disponible para", "No preview available for" => "No hay vista previa disponible para"
"web services under your control" => "Servicios web bajo su control"
); );

View File

@ -4,6 +4,5 @@
"%s shared the folder %s with you" => "%s compartió la carpeta %s con vos", "%s shared the folder %s with you" => "%s compartió la carpeta %s con vos",
"%s shared the file %s with you" => "%s compartió el archivo %s con vos", "%s shared the file %s with you" => "%s compartió el archivo %s con vos",
"Download" => "Descargar", "Download" => "Descargar",
"No preview available for" => "La vista preliminar no está disponible para", "No preview available for" => "La vista preliminar no está disponible para"
"web services under your control" => "servicios web controlados por vos"
); );

View File

@ -4,6 +4,5 @@
"%s shared the folder %s with you" => "%s jagas sinuga kausta %s", "%s shared the folder %s with you" => "%s jagas sinuga kausta %s",
"%s shared the file %s with you" => "%s jagas sinuga faili %s", "%s shared the file %s with you" => "%s jagas sinuga faili %s",
"Download" => "Lae alla", "Download" => "Lae alla",
"No preview available for" => "Eelvaadet pole saadaval", "No preview available for" => "Eelvaadet pole saadaval"
"web services under your control" => "veebitenused sinu kontrolli all"
); );

View File

@ -4,6 +4,5 @@
"%s shared the folder %s with you" => "%sk zurekin %s karpeta elkarbanatu du", "%s shared the folder %s with you" => "%sk zurekin %s karpeta elkarbanatu du",
"%s shared the file %s with you" => "%sk zurekin %s fitxategia elkarbanatu du", "%s shared the file %s with you" => "%sk zurekin %s fitxategia elkarbanatu du",
"Download" => "Deskargatu", "Download" => "Deskargatu",
"No preview available for" => "Ez dago aurrebista eskuragarririk hauentzat ", "No preview available for" => "Ez dago aurrebista eskuragarririk hauentzat "
"web services under your control" => "web zerbitzuak zure kontrolpean"
); );

View File

@ -4,6 +4,5 @@
"%s shared the folder %s with you" => "%sپوشه %s را با شما به اشتراک گذاشت", "%s shared the folder %s with you" => "%sپوشه %s را با شما به اشتراک گذاشت",
"%s shared the file %s with you" => "%sفایل %s را با شما به اشتراک گذاشت", "%s shared the file %s with you" => "%sفایل %s را با شما به اشتراک گذاشت",
"Download" => "دانلود", "Download" => "دانلود",
"No preview available for" => "هیچگونه پیش نمایشی موجود نیست", "No preview available for" => "هیچگونه پیش نمایشی موجود نیست"
"web services under your control" => "سرویس های تحت وب در کنترل شما"
); );

View File

@ -4,6 +4,5 @@
"%s shared the folder %s with you" => "%s jakoi kansion %s kanssasi", "%s shared the folder %s with you" => "%s jakoi kansion %s kanssasi",
"%s shared the file %s with you" => "%s jakoi tiedoston %s kanssasi", "%s shared the file %s with you" => "%s jakoi tiedoston %s kanssasi",
"Download" => "Lataa", "Download" => "Lataa",
"No preview available for" => "Ei esikatselua kohteelle", "No preview available for" => "Ei esikatselua kohteelle"
"web services under your control" => "verkkopalvelut hallinnassasi"
); );

View File

@ -4,6 +4,5 @@
"%s shared the folder %s with you" => "%s a partagé le répertoire %s avec vous", "%s shared the folder %s with you" => "%s a partagé le répertoire %s avec vous",
"%s shared the file %s with you" => "%s a partagé le fichier %s avec vous", "%s shared the file %s with you" => "%s a partagé le fichier %s avec vous",
"Download" => "Télécharger", "Download" => "Télécharger",
"No preview available for" => "Pas d'aperçu disponible pour", "No preview available for" => "Pas d'aperçu disponible pour"
"web services under your control" => "services web sous votre contrôle"
); );

View File

@ -4,6 +4,5 @@
"%s shared the folder %s with you" => "%s compartiu o cartafol %s con vostede", "%s shared the folder %s with you" => "%s compartiu o cartafol %s con vostede",
"%s shared the file %s with you" => "%s compartiu o ficheiro %s con vostede", "%s shared the file %s with you" => "%s compartiu o ficheiro %s con vostede",
"Download" => "Descargar", "Download" => "Descargar",
"No preview available for" => "Sen vista previa dispoñíbel para", "No preview available for" => "Sen vista previa dispoñíbel para"
"web services under your control" => "servizos web baixo o seu control"
); );

View File

@ -4,6 +4,5 @@
"%s shared the folder %s with you" => "%s שיתף עמך את התיקייה %s", "%s shared the folder %s with you" => "%s שיתף עמך את התיקייה %s",
"%s shared the file %s with you" => "%s שיתף עמך את הקובץ %s", "%s shared the file %s with you" => "%s שיתף עמך את הקובץ %s",
"Download" => "הורדה", "Download" => "הורדה",
"No preview available for" => "אין תצוגה מקדימה זמינה עבור", "No preview available for" => "אין תצוגה מקדימה זמינה עבור"
"web services under your control" => "שירותי רשת תחת השליטה שלך"
); );

View File

@ -1,6 +1,5 @@
<?php $TRANSLATIONS = array( <?php $TRANSLATIONS = array(
"Password" => "Lozinka", "Password" => "Lozinka",
"Submit" => "Pošalji", "Submit" => "Pošalji",
"Download" => "Preuzimanje", "Download" => "Preuzimanje"
"web services under your control" => "web usluge pod vašom kontrolom"
); );

View File

@ -4,6 +4,5 @@
"%s shared the folder %s with you" => "%s megosztotta Önnel ezt a mappát: %s", "%s shared the folder %s with you" => "%s megosztotta Önnel ezt a mappát: %s",
"%s shared the file %s with you" => "%s megosztotta Önnel ezt az állományt: %s", "%s shared the file %s with you" => "%s megosztotta Önnel ezt az állományt: %s",
"Download" => "Letöltés", "Download" => "Letöltés",
"No preview available for" => "Nem áll rendelkezésre előnézet ehhez: ", "No preview available for" => "Nem áll rendelkezésre előnézet ehhez: "
"web services under your control" => "webszolgáltatások saját kézben"
); );

View File

@ -1,6 +1,5 @@
<?php $TRANSLATIONS = array( <?php $TRANSLATIONS = array(
"Password" => "Contrasigno", "Password" => "Contrasigno",
"Submit" => "Submitter", "Submit" => "Submitter",
"Download" => "Discargar", "Download" => "Discargar"
"web services under your control" => "servicios web sub tu controlo"
); );

View File

@ -4,6 +4,5 @@
"%s shared the folder %s with you" => "%s membagikan folder %s dengan Anda", "%s shared the folder %s with you" => "%s membagikan folder %s dengan Anda",
"%s shared the file %s with you" => "%s membagikan file %s dengan Anda", "%s shared the file %s with you" => "%s membagikan file %s dengan Anda",
"Download" => "Unduh", "Download" => "Unduh",
"No preview available for" => "Tidak ada pratinjau tersedia untuk", "No preview available for" => "Tidak ada pratinjau tersedia untuk"
"web services under your control" => "layanan web dalam kontrol Anda"
); );

View File

@ -4,6 +4,5 @@
"%s shared the folder %s with you" => "%s deildi möppunni %s með þér", "%s shared the folder %s with you" => "%s deildi möppunni %s með þér",
"%s shared the file %s with you" => "%s deildi skránni %s með þér", "%s shared the file %s with you" => "%s deildi skránni %s með þér",
"Download" => "Niðurhal", "Download" => "Niðurhal",
"No preview available for" => "Yfirlit ekki í boði fyrir", "No preview available for" => "Yfirlit ekki í boði fyrir"
"web services under your control" => "vefþjónusta undir þinni stjórn"
); );

View File

@ -4,6 +4,5 @@
"%s shared the folder %s with you" => "%s ha condiviso la cartella %s con te", "%s shared the folder %s with you" => "%s ha condiviso la cartella %s con te",
"%s shared the file %s with you" => "%s ha condiviso il file %s con te", "%s shared the file %s with you" => "%s ha condiviso il file %s con te",
"Download" => "Scarica", "Download" => "Scarica",
"No preview available for" => "Nessuna anteprima disponibile per", "No preview available for" => "Nessuna anteprima disponibile per"
"web services under your control" => "servizi web nelle tue mani"
); );

View File

@ -4,6 +4,5 @@
"%s shared the folder %s with you" => "%s はフォルダー %s をあなたと共有中です", "%s shared the folder %s with you" => "%s はフォルダー %s をあなたと共有中です",
"%s shared the file %s with you" => "%s はファイル %s をあなたと共有中です", "%s shared the file %s with you" => "%s はファイル %s をあなたと共有中です",
"Download" => "ダウンロード", "Download" => "ダウンロード",
"No preview available for" => "プレビューはありません", "No preview available for" => "プレビューはありません"
"web services under your control" => "管理下のウェブサービス"
); );

View File

@ -4,6 +4,5 @@
"%s shared the folder %s with you" => "%sმა გაგიზიარათ ფოლდერი %s", "%s shared the folder %s with you" => "%sმა გაგიზიარათ ფოლდერი %s",
"%s shared the file %s with you" => "%sმა გაგიზიარათ ფაილი %s", "%s shared the file %s with you" => "%sმა გაგიზიარათ ფაილი %s",
"Download" => "ჩამოტვირთვა", "Download" => "ჩამოტვირთვა",
"No preview available for" => "წინასწარი დათვალიერება შეუძლებელია", "No preview available for" => "წინასწარი დათვალიერება შეუძლებელია"
"web services under your control" => "web services under your control"
); );

View File

@ -4,6 +4,5 @@
"%s shared the folder %s with you" => "%s 님이 폴더 %s을(를) 공유하였습니다", "%s shared the folder %s with you" => "%s 님이 폴더 %s을(를) 공유하였습니다",
"%s shared the file %s with you" => "%s 님이 파일 %s을(를) 공유하였습니다", "%s shared the file %s with you" => "%s 님이 파일 %s을(를) 공유하였습니다",
"Download" => "다운로드", "Download" => "다운로드",
"No preview available for" => "다음 항목을 미리 볼 수 없음:", "No preview available for" => "다음 항목을 미리 볼 수 없음:"
"web services under your control" => "내가 관리하는 웹 서비스"
); );

View File

@ -4,6 +4,5 @@
"%s shared the folder %s with you" => "%s دابه‌شی کردووه‌ بوخچه‌ی %s له‌گه‌ڵ تۆ", "%s shared the folder %s with you" => "%s دابه‌شی کردووه‌ بوخچه‌ی %s له‌گه‌ڵ تۆ",
"%s shared the file %s with you" => "%s دابه‌شی کردووه‌ په‌ڕگه‌یی %s له‌گه‌ڵ تۆ", "%s shared the file %s with you" => "%s دابه‌شی کردووه‌ په‌ڕگه‌یی %s له‌گه‌ڵ تۆ",
"Download" => "داگرتن", "Download" => "داگرتن",
"No preview available for" => "هیچ پێشبینیه‌ك ئاماده‌ نیه بۆ", "No preview available for" => "هیچ پێشبینیه‌ك ئاماده‌ نیه بۆ"
"web services under your control" => "ڕاژه‌ی وێب له‌ژێر چاودێریت دایه"
); );

View File

@ -1,6 +1,5 @@
<?php $TRANSLATIONS = array( <?php $TRANSLATIONS = array(
"Password" => "Passwuert", "Password" => "Passwuert",
"Submit" => "Fortschécken", "Submit" => "Fortschécken",
"Download" => "Download", "Download" => "Download"
"web services under your control" => "Web Servicer ënnert denger Kontroll"
); );

View File

@ -4,6 +4,5 @@
"%s shared the folder %s with you" => "%s pasidalino su jumis %s aplanku", "%s shared the folder %s with you" => "%s pasidalino su jumis %s aplanku",
"%s shared the file %s with you" => "%s pasidalino su jumis %s failu", "%s shared the file %s with you" => "%s pasidalino su jumis %s failu",
"Download" => "Atsisiųsti", "Download" => "Atsisiųsti",
"No preview available for" => "Peržiūra nėra galima", "No preview available for" => "Peržiūra nėra galima"
"web services under your control" => "jūsų valdomos web paslaugos"
); );

View File

@ -4,6 +4,5 @@
"%s shared the folder %s with you" => "%s ar jums dalījās ar mapi %s", "%s shared the folder %s with you" => "%s ar jums dalījās ar mapi %s",
"%s shared the file %s with you" => "%s ar jums dalījās ar datni %s", "%s shared the file %s with you" => "%s ar jums dalījās ar datni %s",
"Download" => "Lejupielādēt", "Download" => "Lejupielādēt",
"No preview available for" => "Nav pieejams priekšskatījums priekš", "No preview available for" => "Nav pieejams priekšskatījums priekš"
"web services under your control" => "tīmekļa servisi tavā varā"
); );

View File

@ -4,6 +4,5 @@
"%s shared the folder %s with you" => "%s ја сподели папката %s со Вас", "%s shared the folder %s with you" => "%s ја сподели папката %s со Вас",
"%s shared the file %s with you" => "%s ја сподели датотеката %s со Вас", "%s shared the file %s with you" => "%s ја сподели датотеката %s со Вас",
"Download" => "Преземи", "Download" => "Преземи",
"No preview available for" => "Нема достапно преглед за", "No preview available for" => "Нема достапно преглед за"
"web services under your control" => "веб сервиси под Ваша контрола"
); );

View File

@ -1,6 +1,5 @@
<?php $TRANSLATIONS = array( <?php $TRANSLATIONS = array(
"Password" => "Kata laluan", "Password" => "Kata laluan",
"Submit" => "Hantar", "Submit" => "Hantar",
"Download" => "Muat turun", "Download" => "Muat turun"
"web services under your control" => "Perkhidmatan web di bawah kawalan anda"
); );

View File

@ -1,6 +1,5 @@
<?php $TRANSLATIONS = array( <?php $TRANSLATIONS = array(
"Password" => "စကားဝှက်", "Password" => "စကားဝှက်",
"Submit" => "ထည့်သွင်းမည်", "Submit" => "ထည့်သွင်းမည်",
"Download" => "ဒေါင်းလုတ်", "Download" => "ဒေါင်းလုတ်"
"web services under your control" => "သင်၏ထိန်းချုပ်မှု့အောက်တွင်ရှိသော Web services"
); );

View File

@ -4,6 +4,5 @@
"%s shared the folder %s with you" => "%s delte mappen %s med deg", "%s shared the folder %s with you" => "%s delte mappen %s med deg",
"%s shared the file %s with you" => "%s delte filen %s med deg", "%s shared the file %s with you" => "%s delte filen %s med deg",
"Download" => "Last ned", "Download" => "Last ned",
"No preview available for" => "Forhåndsvisning ikke tilgjengelig for", "No preview available for" => "Forhåndsvisning ikke tilgjengelig for"
"web services under your control" => "web tjenester du kontrollerer"
); );

View File

@ -4,6 +4,5 @@
"%s shared the folder %s with you" => "%s deelt de map %s met u", "%s shared the folder %s with you" => "%s deelt de map %s met u",
"%s shared the file %s with you" => "%s deelt het bestand %s met u", "%s shared the file %s with you" => "%s deelt het bestand %s met u",
"Download" => "Downloaden", "Download" => "Downloaden",
"No preview available for" => "Geen voorbeeldweergave beschikbaar voor", "No preview available for" => "Geen voorbeeldweergave beschikbaar voor"
"web services under your control" => "Webdiensten in eigen beheer"
); );

View File

@ -4,6 +4,5 @@
"%s shared the folder %s with you" => "%s delte mappa %s med deg", "%s shared the folder %s with you" => "%s delte mappa %s med deg",
"%s shared the file %s with you" => "%s delte fila %s med deg", "%s shared the file %s with you" => "%s delte fila %s med deg",
"Download" => "Last ned", "Download" => "Last ned",
"No preview available for" => "Inga førehandsvising tilgjengeleg for", "No preview available for" => "Inga førehandsvising tilgjengeleg for"
"web services under your control" => "Vev tjenester under din kontroll"
); );

View File

@ -1,6 +1,5 @@
<?php $TRANSLATIONS = array( <?php $TRANSLATIONS = array(
"Password" => "Senhal", "Password" => "Senhal",
"Submit" => "Sosmetre", "Submit" => "Sosmetre",
"Download" => "Avalcarga", "Download" => "Avalcarga"
"web services under your control" => "Services web jos ton contraròtle"
); );

View File

@ -4,6 +4,5 @@
"%s shared the folder %s with you" => "%s współdzieli folder z tobą %s", "%s shared the folder %s with you" => "%s współdzieli folder z tobą %s",
"%s shared the file %s with you" => "%s współdzieli z tobą plik %s", "%s shared the file %s with you" => "%s współdzieli z tobą plik %s",
"Download" => "Pobierz", "Download" => "Pobierz",
"No preview available for" => "Podgląd nie jest dostępny dla", "No preview available for" => "Podgląd nie jest dostępny dla"
"web services under your control" => "Kontrolowane serwisy"
); );

View File

@ -4,6 +4,5 @@
"%s shared the folder %s with you" => "%s compartilhou a pasta %s com você", "%s shared the folder %s with you" => "%s compartilhou a pasta %s com você",
"%s shared the file %s with you" => "%s compartilhou o arquivo %s com você", "%s shared the file %s with you" => "%s compartilhou o arquivo %s com você",
"Download" => "Baixar", "Download" => "Baixar",
"No preview available for" => "Nenhuma visualização disponível para", "No preview available for" => "Nenhuma visualização disponível para"
"web services under your control" => "serviços web sob seu controle"
); );

View File

@ -4,6 +4,5 @@
"%s shared the folder %s with you" => "%s partilhou a pasta %s consigo", "%s shared the folder %s with you" => "%s partilhou a pasta %s consigo",
"%s shared the file %s with you" => "%s partilhou o ficheiro %s consigo", "%s shared the file %s with you" => "%s partilhou o ficheiro %s consigo",
"Download" => "Transferir", "Download" => "Transferir",
"No preview available for" => "Não há pré-visualização para", "No preview available for" => "Não há pré-visualização para"
"web services under your control" => "serviços web sob o seu controlo"
); );

Some files were not shown because too many files have changed in this diff Show More