diff options
Diffstat (limited to 'apps')
1085 files changed, 29602 insertions, 13374 deletions
diff --git a/apps/files/ajax/delete.php b/apps/files/ajax/delete.php index 323b70706ce..4d4232e872e 100644 --- a/apps/files/ajax/delete.php +++ b/apps/files/ajax/delete.php @@ -27,7 +27,9 @@ $success = true; //Now delete foreach ($files as $file) { if (\OC\Files\Filesystem::file_exists($dir . '/' . $file) && - !\OC\Files\Filesystem::unlink($dir . '/' . $file)) { + !(\OC\Files\Filesystem::isDeletable($dir . '/' . $file) && + \OC\Files\Filesystem::unlink($dir . '/' . $file)) + ) { $filesWithError .= $file . "\n"; $success = false; } diff --git a/apps/files/ajax/getstoragestats.php b/apps/files/ajax/getstoragestats.php index 4ab5b9a779c..fb7ccdc86cc 100644 --- a/apps/files/ajax/getstoragestats.php +++ b/apps/files/ajax/getstoragestats.php @@ -10,4 +10,8 @@ OCP\JSON::checkLoggedIn(); \OC::$server->getSession()->close(); // send back json -OCP\JSON::success(array('data' => \OCA\Files\Helper::buildFileStorageStatistics($dir))); +try { + OCP\JSON::success(array('data' => \OCA\Files\Helper::buildFileStorageStatistics($dir))); +} catch (\OCP\Files\NotFoundException $e) { + OCP\JSON::error(['data' => ['message' => 'Folder not found']]); +} diff --git a/apps/files/ajax/list.php b/apps/files/ajax/list.php index 4abf5ad7607..4aed79d70f7 100644 --- a/apps/files/ajax/list.php +++ b/apps/files/ajax/list.php @@ -26,6 +26,7 @@ try { // make filelist $files = \OCA\Files\Helper::getFiles($dir, $sortAttribute, $sortDirection); + $files = \OCA\Files\Helper::populateTags($files); $data['directory'] = $dir; $data['files'] = \OCA\Files\Helper::formatFileInfos($files); $data['permissions'] = $permissions; diff --git a/apps/files/ajax/mimeicon.php b/apps/files/ajax/mimeicon.php index fdbcc441a78..c531f5a3e81 100644 --- a/apps/files/ajax/mimeicon.php +++ b/apps/files/ajax/mimeicon.php @@ -1,4 +1,6 @@ <?php \OC::$server->getSession()->close(); -print OC_Helper::mimetypeIcon($_GET['mime']); +$mime = isset($_GET['mime']) ? $_GET['mime'] : ''; + +print OC_Helper::mimetypeIcon($mime); diff --git a/apps/files/ajax/newfile.php b/apps/files/ajax/newfile.php index b4d91514a2a..c162237fe92 100644 --- a/apps/files/ajax/newfile.php +++ b/apps/files/ajax/newfile.php @@ -120,6 +120,9 @@ if($source) { $freeSpace = $storageStats['freeSpace']; foreach($meta['wrapper_data'] as $header) { + if (strpos($header, ':') === false){ + continue; + } list($name, $value) = explode(':', $header); if ('content-length' === strtolower(trim($name))) { $length = (int) trim($value); diff --git a/apps/files/ajax/upload.php b/apps/files/ajax/upload.php index b960e02ced7..fcee0166da6 100644 --- a/apps/files/ajax/upload.php +++ b/apps/files/ajax/upload.php @@ -1,5 +1,7 @@ <?php +\OC::$server->getSession()->close(); + // Firefox and Konqueror tries to download application/json for me. --Arthur OCP\JSON::setContentTypeHeader('text/plain'); @@ -7,7 +9,7 @@ OCP\JSON::setContentTypeHeader('text/plain'); // If not, check the login. // If no token is sent along, rely on login only -$allowedPermissions = OCP\PERMISSION_ALL; +$allowedPermissions = \OCP\Constants::PERMISSION_ALL; $errorCode = null; $l = \OC::$server->getL10N('files'); @@ -27,7 +29,7 @@ if (empty($_POST['dirToken'])) { \OC_User::setIncognitoMode(true); // return only read permissions for public upload - $allowedPermissions = OCP\PERMISSION_READ; + $allowedPermissions = \OCP\Constants::PERMISSION_READ; $publicDirectory = !empty($_POST['subdir']) ? $_POST['subdir'] : '/'; $linkItem = OCP\Share::getShareByToken($_POST['dirToken']); @@ -36,7 +38,7 @@ if (empty($_POST['dirToken'])) { die(); } - if (!($linkItem['permissions'] & OCP\PERMISSION_CREATE)) { + if (!($linkItem['permissions'] & \OCP\Constants::PERMISSION_CREATE)) { OCP\JSON::checkLoggedIn(); } else { // resolve reshares @@ -64,13 +66,7 @@ if (empty($_POST['dirToken'])) { } } - OCP\JSON::callCheck(); -if (!\OCP\App::isEnabled('files_encryption')) { - // encryption app need to create keys later, so can't close too early - \OC::$server->getSession()->close(); -} - // get array with current storage stats (e.g. max file size) $storageStats = \OCA\Files\Helper::buildFileStorageStatistics($dir); @@ -121,6 +117,12 @@ if (strpos($dir, '..') === false) { $fileCount = count($files['name']); for ($i = 0; $i < $fileCount; $i++) { + if (isset($_POST['resolution'])) { + $resolution = $_POST['resolution']; + } else { + $resolution = null; + } + // target directory for when uploading folders $relativePath = ''; if(!empty($_POST['file_directory'])) { @@ -128,7 +130,7 @@ if (strpos($dir, '..') === false) { } // $path needs to be normalized - this failed within drag'n'drop upload to a sub-folder - if (isset($_POST['resolution']) && $_POST['resolution']==='autorename') { + if ($resolution === 'autorename') { // append a number in brackets like 'filename (2).ext' $target = OCP\Files::buildNotExistingFileName(stripslashes($dir . $relativePath), $files['name'][$i]); } else { @@ -145,9 +147,12 @@ if (strpos($dir, '..') === false) { } $returnedDir = \OC\Files\Filesystem::normalizePath($returnedDir); - if ( ! \OC\Files\Filesystem::file_exists($target) - || (isset($_POST['resolution']) && $_POST['resolution']==='replace') - ) { + + $exists = \OC\Files\Filesystem::file_exists($target); + if ($exists) { + $updatable = \OC\Files\Filesystem::isUpdatable($target); + } + if ( ! $exists || ($updatable && $resolution === 'replace' ) ) { // upload and overwrite file try { @@ -185,8 +190,11 @@ if (strpos($dir, '..') === false) { $error = $l->t('Upload failed. Could not get file info.'); } else { $data = \OCA\Files\Helper::formatFileInfo($meta); - $data['permissions'] = $data['permissions'] & $allowedPermissions; - $data['status'] = 'existserror'; + if ($updatable) { + $data['status'] = 'existserror'; + } else { + $data['status'] = 'readonly'; + } $data['originalname'] = $files['tmp_name'][$i]; $data['uploadMaxFilesize'] = $maxUploadFileSize; $data['maxHumanFilesize'] = $maxHumanFileSize; diff --git a/apps/files/appinfo/app.php b/apps/files/appinfo/app.php index 3567bc26def..62c205add52 100644 --- a/apps/files/appinfo/app.php +++ b/apps/files/appinfo/app.php @@ -10,7 +10,7 @@ OCP\App::addNavigationEntry(array("id" => "files_index", "icon" => OCP\Util::imagePath("core", "places/files.svg"), "name" => $l->t("Files"))); -\OC::$server->getSearch()->registerProvider('OC\Search\Provider\File'); +\OC::$server->getSearch()->registerProvider('OC\Search\Provider\File', array('apps' => array('files'))); $templateManager = OC_Helper::getFileTemplateManager(); $templateManager->registerTemplate('text/html', 'core/templates/filetemplates/template.html'); diff --git a/apps/files/appinfo/application.php b/apps/files/appinfo/application.php index 7ca48bab474..13ff60daf89 100644 --- a/apps/files/appinfo/application.php +++ b/apps/files/appinfo/application.php @@ -11,6 +11,8 @@ namespace OCA\Files\Appinfo; use OC\AppFramework\Utility\SimpleContainer; use OCA\Files\Controller\ApiController; use OCP\AppFramework\App; +use \OCA\Files\Service\TagService; +use \OCP\IContainer; class Application extends App { public function __construct(array $urlParams=array()) { @@ -21,10 +23,44 @@ class Application extends App { /** * Controllers */ - $container->registerService('APIController', function (SimpleContainer $c) { + $container->registerService('APIController', function (IContainer $c) { return new ApiController( $c->query('AppName'), - $c->query('Request') + $c->query('Request'), + $c->query('TagService') + ); + }); + + /** + * Core + */ + $container->registerService('L10N', function(IContainer $c) { + return $c->query('ServerContainer')->getL10N($c->query('AppName')); + }); + + /** + * Services + */ + $container->registerService('Tagger', function(IContainer $c) { + return $c->query('ServerContainer')->getTagManager()->load('files'); + }); + $container->registerService('TagService', function(IContainer $c) { + $homeFolder = $c->query('ServerContainer')->getUserFolder(); + return new TagService( + $c->query('ServerContainer')->getUserSession(), + $c->query('Tagger'), + $homeFolder + ); + }); + + /** + * Controllers + */ + $container->registerService('APIController', function (IContainer $c) { + return new ApiController( + $c->query('AppName'), + $c->query('Request'), + $c->query('TagService') ); }); } diff --git a/apps/files/appinfo/remote.php b/apps/files/appinfo/remote.php index 3ba25085bad..c622f083958 100644 --- a/apps/files/appinfo/remote.php +++ b/apps/files/appinfo/remote.php @@ -38,7 +38,7 @@ $server->setBaseUri($baseuri); $defaults = new OC_Defaults(); $server->addPlugin(new \Sabre\DAV\Auth\Plugin($authBackend, $defaults->getName())); $server->addPlugin(new \Sabre\DAV\Locks\Plugin($lockBackend)); -$server->addPlugin(new \Sabre\DAV\Browser\Plugin(false)); // Show something in the Browser, but no upload +$server->addPlugin(new \Sabre\DAV\Browser\Plugin(false, false)); // Show something in the Browser, but no upload $server->addPlugin(new OC_Connector_Sabre_FilesPlugin()); $server->addPlugin(new OC_Connector_Sabre_MaintenancePlugin()); $server->addPlugin(new OC_Connector_Sabre_ExceptionLoggerPlugin('webdav')); @@ -53,6 +53,7 @@ $server->subscribeEvent('beforeMethod', function () use ($server, $objectTree) { $rootDir = new OC_Connector_Sabre_Directory($view, $rootInfo); $objectTree->init($rootDir, $view, $mountManager); + $server->addPlugin(new \OC\Connector\Sabre\TagsPlugin($objectTree, \OC::$server->getTagManager())); $server->addPlugin(new OC_Connector_Sabre_QuotaPlugin($view)); }, 30); // priority 30: after auth (10) and acl(20), before lock(50) and handling the request diff --git a/apps/files/appinfo/routes.php b/apps/files/appinfo/routes.php index 96790a04855..349284ec52d 100644 --- a/apps/files/appinfo/routes.php +++ b/apps/files/appinfo/routes.php @@ -9,10 +9,31 @@ namespace OCA\Files\Appinfo; $application = new Application(); -$application->registerRoutes($this, array('routes' => array( - array('name' => 'API#getThumbnail', 'url' => '/api/v1/thumbnail/{x}/{y}/{file}', 'verb' => 'GET', 'requirements' => array('file' => '.+')), -))); - +$application->registerRoutes( + $this, + array( + 'routes' => array( + array( + 'name' => 'API#getThumbnail', + 'url' => '/api/v1/thumbnail/{x}/{y}/{file}', + 'verb' => 'GET', + 'requirements' => array('file' => '.+') + ), + array( + 'name' => 'API#updateFileTags', + 'url' => '/api/v1/files/{path}', + 'verb' => 'POST', + 'requirements' => array('path' => '.+'), + ), + array( + 'name' => 'API#getFilesByTag', + 'url' => '/api/v1/tags/{tagName}/files', + 'verb' => 'GET', + 'requirements' => array('tagName' => '.+'), + ), + ) + ) +); /** @var $this \OC\Route\Router */ diff --git a/apps/files/appinfo/update.php b/apps/files/appinfo/update.php deleted file mode 100644 index de635e5ce6b..00000000000 --- a/apps/files/appinfo/update.php +++ /dev/null @@ -1,8 +0,0 @@ -<?php - -// this drops the keys below, because they aren't needed anymore -// core related -if (version_compare(\OCP\Config::getSystemValue('version', '0.0.0'), '7.0.0', '<')) { - \OCP\Config::deleteSystemValue('allowZipDownload'); - \OCP\Config::deleteSystemValue('maxZipInputSize'); -} diff --git a/apps/files/command/scan.php b/apps/files/command/scan.php index 2dca0e0e67c..87f799a0187 100644 --- a/apps/files/command/scan.php +++ b/apps/files/command/scan.php @@ -38,6 +38,18 @@ class Scan extends Command { 'will rescan all files of the given user(s)' ) ->addOption( + 'path', + 'p', + InputArgument::OPTIONAL, + 'limit rescan to this path, eg. --path="/alice/files/Music", the user_id is determined by the path and the user_id parameter and --all are ignored' + ) + ->addOption( + 'quiet', + 'q', + InputOption::VALUE_NONE, + 'suppress output' + ) + ->addOption( 'all', null, InputOption::VALUE_NONE, @@ -45,16 +57,18 @@ class Scan extends Command { ); } - protected function scanFiles($user, OutputInterface $output) { + protected function scanFiles($user, $path, $quiet, OutputInterface $output) { $scanner = new \OC\Files\Utils\Scanner($user, \OC::$server->getDatabaseConnection()); - $scanner->listen('\OC\Files\Utils\Scanner', 'scanFile', function ($path) use ($output) { - $output->writeln("Scanning <info>$path</info>"); - }); - $scanner->listen('\OC\Files\Utils\Scanner', 'scanFolder', function ($path) use ($output) { - $output->writeln("Scanning <info>$path</info>"); - }); + if (!$quiet) { + $scanner->listen('\OC\Files\Utils\Scanner', 'scanFile', function ($path) use ($output) { + $output->writeln("Scanning file <info>$path</info>"); + }); + $scanner->listen('\OC\Files\Utils\Scanner', 'scanFolder', function ($path) use ($output) { + $output->writeln("Scanning folder <info>$path</info>"); + }); + } try { - $scanner->scan(''); + $scanner->scan($path); } catch (ForbiddenException $e) { $output->writeln("<error>Home storage for user $user not writable</error>"); $output->writeln("Make sure you're running the scan command only as the user the web server runs as"); @@ -62,14 +76,21 @@ class Scan extends Command { } protected function execute(InputInterface $input, OutputInterface $output) { - if ($input->getOption('all')) { + $path = $input->getOption('path'); + if ($path) { + $path = '/'.trim($path, '/'); + list (, $user, ) = explode('/', $path, 3); + $users = array($user); + } else if ($input->getOption('all')) { $users = $this->userManager->search(''); } else { $users = $input->getArgument('user_id'); } + $quiet = $input->getOption('quiet'); + if (count($users) === 0) { - $output->writeln("<error>Please specify the user id to scan or \"--all\" to scan for all users</error>"); + $output->writeln("<error>Please specify the user id to scan, \"--all\" to scan for all users or \"--path=...\"</error>"); return; } @@ -78,7 +99,7 @@ class Scan extends Command { $user = $user->getUID(); } if ($this->userManager->userExists($user)) { - $this->scanFiles($user, $output); + $this->scanFiles($user, $path, $quiet, $output); } else { $output->writeln("<error>Unknown user $user</error>"); } diff --git a/apps/files/controller/apicontroller.php b/apps/files/controller/apicontroller.php index 89d24a5c47f..902731a0492 100644 --- a/apps/files/controller/apicontroller.php +++ b/apps/files/controller/apicontroller.php @@ -12,13 +12,21 @@ use OCP\AppFramework\Http; use OCP\AppFramework\Controller; use OCP\IRequest; use OCP\AppFramework\Http\JSONResponse; +use OCP\AppFramework\Http\DataResponse; use OCP\AppFramework\Http\DownloadResponse; use OC\Preview; +use OCA\Files\Service\TagService; class ApiController extends Controller { - public function __construct($appName, IRequest $request){ + /** + * @var TagService $tagService + */ + private $tagService; + + public function __construct($appName, IRequest $request, TagService $tagService){ parent::__construct($appName, $request); + $this->tagService = $tagService; } @@ -49,4 +57,50 @@ class ApiController extends Controller { } } + /** + * Updates the info of the specified file path + * The passed tags are absolute, which means they will + * replace the actual tag selection. + * + * @NoAdminRequired + * @CORS + * + * @param string $path path + * @param array $tags array of tags + */ + public function updateFileTags($path, $tags = null) { + $result = array(); + // if tags specified or empty array, update tags + if (!is_null($tags)) { + try { + $this->tagService->updateFileTags($path, $tags); + } catch (\OCP\Files\NotFoundException $e) { + return new DataResponse($e->getMessage(), Http::STATUS_NOT_FOUND); + } + $result['tags'] = $tags; + } + return new DataResponse($result, Http::STATUS_OK); + } + + /** + * Returns a list of all files tagged with the given tag. + * + * @NoAdminRequired + * @CORS + * + * @param array $tagName tag name to filter by + */ + public function getFilesByTag($tagName) { + $files = array(); + $fileInfos = $this->tagService->getFilesByTag($tagName); + foreach ($fileInfos as &$fileInfo) { + $file = \OCA\Files\Helper::formatFileInfo($fileInfo); + $parts = explode('/', dirname($fileInfo->getPath()), 4); + $file['path'] = '/' . $parts[3]; + $file['tags'] = array($tagName); + $files[] = $file; + } + return new DataResponse(array('files' => $files), Http::STATUS_OK); + } + } diff --git a/apps/files/css/files.css b/apps/files/css/files.css index fddfd02caa6..5b947fa326c 100644 --- a/apps/files/css/files.css +++ b/apps/files/css/files.css @@ -6,7 +6,11 @@ .actions { padding:5px; height:32px; display: inline-block; float: left; } .actions input, .actions button, .actions .button { margin:0; float:left; } .actions .button a { color: #555; } -.actions .button a:hover, .actions .button a:active { color: #333; } +.actions .button a:hover, +.actions .button a:focus, +.actions .button a:active { + color: #333; +} .actions.hidden { display: none; } #new { @@ -99,7 +103,10 @@ } #filestable tbody tr { background-color:#fff; height:40px; } -#filestable tbody tr:hover, tbody tr:active { +#filestable tbody tr:hover, +#filestable tbody tr:focus, +#filestable tbody .name:focus, +#filestable tbody tr:active { background-color: rgb(240,240,240); } #filestable tbody tr.selected { @@ -123,7 +130,8 @@ span.extension { transition: opacity 300ms; vertical-align: top; } -tr:hover span.extension { +tr:hover span.extension, +tr:focus span.extension { -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; filter: alpha(opacity=100); opacity: 1; @@ -166,7 +174,8 @@ table th .sort-indicator { .sort-indicator.hidden { visibility: hidden; } -table th:hover .sort-indicator.hidden { +table th:hover .sort-indicator.hidden, +table th:focus .sort-indicator.hidden { visibility: visible; } @@ -183,10 +192,15 @@ table th#headerName { width: 9999px; /* not really sure why this works better than 100% … table styling */ padding: 0; } + #headerName-container { position: relative; height: 50px; } +.has-favorites #headerName-container { + padding-left: 50px; +} + table th#headerSize, table td.filesize { text-align: right; } @@ -236,12 +250,25 @@ table td.filename a.name { line-height: 50px; padding: 0; } +table td.filename .thumbnail { + display: inline-block; + width: 32px; + height: 32px; + margin-left: 8px; + margin-top: 9px; + cursor: pointer; + float: left; +} table td.filename input.filename { width: 70%; - margin-top: 1px; - margin-left: 48px; + margin-top: 9px; + margin-left: 8px; cursor: text; } +.has-favorites table td.filename input.filename { + margin-left: 52px; +} + table td.filename a, table td.login, table td.logout, table td.download, table td.upload, table td.create, table td.delete { padding:3px 8px 8px 3px; } table td.filename .nametext, .uploadtext, .modified, .column-last>span:first-child { float:left; padding:15px 0; } @@ -252,8 +279,10 @@ table td.filename .nametext, .uploadtext, .modified, .column-last>span:first-chi width: 90%; } /* ellipsize long modified dates to make room for showing delete button */ -#fileList tr:hover .modified, #fileList tr:hover .column-last>span:first-child, -#fileList tr:focus .modified, #fileList tr:focus .column-last>span:first-child { +#fileList tr:hover .modified, +#fileList tr:focus .modified, +#fileList tr:hover .column-last>span:first-child, +#fileList tr:focus .column-last>span:first-child { width: 75%; } @@ -267,6 +296,10 @@ table td.filename .nametext { max-width: 800px; height: 100%; } +.has-favorites #fileList td.filename a.name { + left: 50px; + margin-right: 50px; +} table td.filename .nametext .innernametext { text-overflow: ellipsis; @@ -280,7 +313,8 @@ table td.filename .nametext .innernametext { max-width: 760px; } - table tr:hover td.filename .nametext .innernametext { + table tr:hover td.filename .nametext .innernametext, + table tr:focus td.filename .nametext .innernametext { max-width: 480px; } } @@ -290,7 +324,8 @@ table td.filename .nametext .innernametext { max-width: 600px; } - table tr:hover td.filename .nametext .innernametext { + table tr:hover td.filename .nametext .innernametext, + table tr:focus td.filename .nametext .innernametext { max-width: 320px; } } @@ -300,7 +335,8 @@ table td.filename .nametext .innernametext { max-width: 400px; } - table tr:hover td.filename .nametext .innernametext { + table tr:hover td.filename .nametext .innernametext, + table tr:focus td.filename .nametext .innernametext { max-width: 120px; } } @@ -310,7 +346,8 @@ table td.filename .nametext .innernametext { max-width: 320px; } - table tr:hover td.filename .nametext .innernametext { + table tr:hover td.filename .nametext .innernametext, + table tr:focus td.filename .nametext .innernametext { max-width: 40px; } } @@ -334,7 +371,7 @@ table td.filename .uploadtext { } /* File checkboxes */ -#fileList tr td.filename>input[type="checkbox"]:first-child { +#fileList tr td.filename>.selectCheckBox { -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; filter: alpha(opacity=0); opacity: 0; @@ -343,34 +380,33 @@ table td.filename .uploadtext { margin: 32px 0 4px 32px; /* bigger clickable area doesn’t work in FF width:2.8em; height:2.4em;*/ } /* Show checkbox when hovering, checked, or selected */ -#fileList tr:hover td.filename>input[type="checkbox"]:first-child, -#fileList tr td.filename>input[type="checkbox"]:checked:first-child, -#fileList tr.selected td.filename>input[type="checkbox"]:first-child { +#fileList tr:hover td.filename>.selectCheckBox, +#fileList tr:focus td.filename>.selectCheckBox, +#fileList tr td.filename>.selectCheckBox:checked, +#fileList tr.selected td.filename>.selectCheckBox { opacity: 1; } -.lte9 #fileList tr:hover td.filename>input[type="checkbox"]:first-child, -.lte9 #fileList tr td.filename>input[type="checkbox"][checked=checked]:first-child, -.lte9 #fileList tr.selected td.filename>input[type="checkbox"]:first-child { +.lte9 #fileList tr:hover td.filename>.selectCheckBox, +.lte9 #fileList tr:focus td.filename>.selectCheckBox, +.lte9 #fileList tr td.filename>.selectCheckBox[checked=checked], +.lte9 #fileList tr.selected td.filename>.selectCheckBox { -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; filter: alpha(opacity=100); } /* Use label to have bigger clickable size for checkbox */ -#fileList tr td.filename>input[type="checkbox"] + label, +#fileList tr td.filename>.selectCheckBox + label, .select-all + label { height: 50px; position: absolute; width: 50px; z-index: 5; } -#fileList tr td.filename>input[type="checkbox"]{ +#fileList tr td.filename>.selectCheckBox { /* sometimes checkbox height is bigger (KDE/Qt), so setting to absolute * to prevent it to increase the height */ position: absolute; -} -#fileList tr td.filename>input[type="checkbox"] + label { - left: 0; - top: 0; + z-index: 10; } .select-all + label { top: 0; @@ -379,6 +415,10 @@ table td.filename .uploadtext { position: absolute; top: 18px; left: 18px; + z-index: 10; +} +.has-favorites .select-all { + left: 68px; } #fileList tr td.filename { @@ -394,6 +434,18 @@ table td.filename .uploadtext { height: 50px; } +#fileList tr td.filename .favorite { + display: inline-block; + float: left; +} +#fileList tr td.filename .action-favorite { + display: block; + float: left; + width: 30px; + line-height: 100%; + text-align: center; +} + #uploadsize-message,#delete-confirm { display:none; } /* File actions */ @@ -419,7 +471,7 @@ table td.filename .uploadtext { padding: 17px 14px; } -#fileList .action.action-share-notification span, #fileList a { +#fileList .action.action-share-notification span, #fileList a.name { cursor: default !important; } @@ -456,7 +508,7 @@ a.action>img { #fileList a.action { display: inline; - padding: 18px 8px; + padding: 17px 8px; line-height: 50px; -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; filter: alpha(opacity=0); @@ -469,13 +521,19 @@ a.action>img { position: relative; top: -21px; } -#fileList tr:hover a.action, #fileList a.action.permanent { +#fileList tr:hover a.action, +#fileList a.action.permanent, +#fileList tr:focus a.action, +#fileList a.action.permanent +/*#fileList .name:focus .action*/ { -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)"; filter: alpha(opacity=50); opacity: .5; display:inline; } -#fileList tr:hover a.action:hover { +#fileList tr:hover a.action:hover, +#fileList tr:focus a.action:focus, +#fileList .name:focus a.action:focus { -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; filter: alpha(opacity=100); opacity: 1; @@ -486,16 +544,17 @@ a.action>img { -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=30)"; filter: alpha(opacity=30); opacity: .3; - height: 70px; + height: 60px; } -.summary:hover, .summary, table tr.summary td { +.summary:hover, +.summary:focus, +.summary, +table tr.summary td { background-color: transparent; } .summary td { - padding-top: 20px; - padding-bottom: 150px; border-bottom: none; } .summary .info { @@ -544,3 +603,26 @@ table.dragshadow td.size { .mask.transparent{ opacity: 0; } + +.nofilterresults { + font-size: 16px; + color: #888; + position: absolute; + text-align: center; + top: 30%; + width: 100%; +} +.nofilterresults h2 { + font-size: 22px; + margin-bottom: 10px; +} +.nofilterresults [class^="icon-"], +.nofilterresults [class*=" icon-"] { + background-size: 64px; + height: 64px; + width: 64px; + margin: 0 auto 15px; + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=50)"; + filter: alpha(opacity=50); + opacity: .5; +}
\ No newline at end of file diff --git a/apps/files/css/mobile.css b/apps/files/css/mobile.css index 780b7ac8443..4881f7c70e4 100644 --- a/apps/files/css/mobile.css +++ b/apps/files/css/mobile.css @@ -24,7 +24,7 @@ table td { } /* and accordingly fix left margin of file list summary on mobile */ .summary .info { - margin-left: 55px; + margin-left: 105px; } /* remove shift for multiselect bar to account for missing navigation */ diff --git a/apps/files/css/upload.css b/apps/files/css/upload.css index 98754b910de..adf1e9d13f8 100644 --- a/apps/files/css/upload.css +++ b/apps/files/css/upload.css @@ -9,7 +9,7 @@ overflow: hidden; vertical-align: top; } -#upload a { +#upload .icon-upload { position: relative; display: block; width: 100%; @@ -64,6 +64,28 @@ font-size: 13px; } +.oc-dialog .fileexists { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.oc-dialog .fileexists .conflict .filename, +.oc-dialog .fileexists .conflict .mtime, +.oc-dialog .fileexists .conflict .size { + -webkit-touch-callout: initial; + -webkit-user-select: initial; + -khtml-user-select: initial; + -moz-user-select: initial; + -ms-user-select: initial; + user-select: initial; +} +.oc-dialog .fileexists .conflict .message { + color: #e9322d; +} .oc-dialog .fileexists table { width: 100%; } diff --git a/apps/files/index.php b/apps/files/index.php index 4142a02b97e..767cb156ca2 100644 --- a/apps/files/index.php +++ b/apps/files/index.php @@ -20,6 +20,7 @@ * License along with this library. If not, see <http://www.gnu.org/licenses/>. * */ +use OCA\Files\Appinfo\Application; // Check if we are a user OCP\User::checkLoggedIn(); @@ -37,9 +38,18 @@ OCP\Util::addscript('files', 'jquery-visibility'); OCP\Util::addscript('files', 'filesummary'); OCP\Util::addscript('files', 'breadcrumb'); OCP\Util::addscript('files', 'filelist'); +OCP\Util::addscript('files', 'search'); + +\OCP\Util::addScript('files', 'favoritesfilelist'); +\OCP\Util::addScript('files', 'tagsplugin'); +\OCP\Util::addScript('files', 'favoritesplugin'); + +\OC_Util::addVendorScript('core', 'handlebars/handlebars'); OCP\App::setActiveNavigationEntry('files_index'); +$l = \OC::$server->getL10N('files'); + $isIE8 = false; preg_match('/MSIE (.*?);/', $_SERVER['HTTP_USER_AGENT'], $matches); if (count($matches) > 0 && $matches[1] <= 9) { @@ -69,7 +79,7 @@ $storageInfo=OC_Helper::getStorageInfo('/', $dirInfo); // if the encryption app is disabled, than everything is fine (INIT_SUCCESSFUL status code) $encryptionInitStatus = 2; if (OC_App::isEnabled('files_encryption')) { - $session = new \OCA\Encryption\Session(new \OC\Files\View('/')); + $session = new \OCA\Files_Encryption\Session(new \OC\Files\View('/')); $encryptionInitStatus = $session->getInitialized(); } @@ -79,6 +89,16 @@ function sortNavigationItems($item1, $item2) { return $item1['order'] - $item2['order']; } +\OCA\Files\App::getNavigationManager()->add( + array( + 'id' => 'favorites', + 'appname' => 'files', + 'script' => 'simplelist.php', + 'order' => 5, + 'name' => $l->t('Favorites') + ) +); + $navItems = \OCA\Files\App::getNavigationManager()->getAll(); usort($navItems, 'sortNavigationItems'); $nav->assign('navigationItems', $navItems); @@ -120,6 +140,7 @@ $tmpl->assign('usedSpacePercent', (int)$storageInfo['relative']); $tmpl->assign('isPublic', false); $tmpl->assign("encryptedFiles", \OCP\Util::encryptedFiles()); $tmpl->assign("mailNotificationEnabled", $config->getAppValue('core', 'shareapi_allow_mail_notification', 'no')); +$tmpl->assign("mailPublicNotificationEnabled", $config->getAppValue('core', 'shareapi_allow_public_notification', 'no')); $tmpl->assign("allowShareWithLink", $config->getAppValue('core', 'shareapi_allow_links', 'yes')); $tmpl->assign("encryptionInitStatus", $encryptionInitStatus); $tmpl->assign('appNavigation', $nav); diff --git a/apps/files/js/app.js b/apps/files/js/app.js index 89098e3a8a3..adb1893bb0e 100644 --- a/apps/files/js/app.js +++ b/apps/files/js/app.js @@ -15,12 +15,34 @@ (function() { if (!OCA.Files) { + /** + * Namespace for the files app + * @namespace OCA.Files + */ OCA.Files = {}; } - var App = { + /** + * @namespace OCA.Files.App + */ + OCA.Files.App = { + /** + * Navigation control + * + * @member {OCA.Files.Navigation} + */ navigation: null, + /** + * File list for the "All files" section. + * + * @member {OCA.Files.FileList} + */ + fileList: null, + + /** + * Initializes the files app + */ initialize: function() { this.navigation = new OCA.Files.Navigation($('#app-navigation')); @@ -58,6 +80,8 @@ // refer to the one of the "files" view window.FileList = this.fileList; + OC.Plugins.attach('OCA.Files.App', this); + this._setupEvents(); // trigger URL change event handlers this._onPopState(urlParams); @@ -191,7 +215,6 @@ OC.Util.History.pushState(params); } }; - OCA.Files.App = App; })(); $(document).ready(function() { diff --git a/apps/files/js/breadcrumb.js b/apps/files/js/breadcrumb.js index 8df9b7ee6fe..5cea2639c7d 100644 --- a/apps/files/js/breadcrumb.js +++ b/apps/files/js/breadcrumb.js @@ -19,10 +19,17 @@ * */ -/* global OC */ (function() { /** - * Creates an breadcrumb element in the given container + * @class BreadCrumb + * @memberof OCA.Files + * @classdesc Breadcrumbs that represent the current path. + * + * @param {Object} [options] options + * @param {Function} [options.onClick] click event handler + * @param {Function} [options.onDrop] drop event handler + * @param {Function} [options.getCrumbUrl] callback that returns + * the URL of a given breadcrumb */ var BreadCrumb = function(options){ this.$el = $('<div class="breadcrumb"></div>'); @@ -37,12 +44,17 @@ this.getCrumbUrl = options.getCrumbUrl; } }; + /** + * @memberof OCA.Files + */ BreadCrumb.prototype = { $el: null, dir: null, /** * Total width of all breadcrumbs + * @type int + * @private */ totalWidth: 0, breadcrumbs: [], @@ -64,8 +76,9 @@ /** * Returns the full URL to the given directory - * @param part crumb data as map - * @param index crumb index + * + * @param {Object.<String, String>} part crumb data as map + * @param {int} index crumb index * @return full URL */ getCrumbUrl: function(part, index) { @@ -93,6 +106,7 @@ if (part.img) { $image = $('<img class="svg"></img>'); $image.attr('src', part.img); + $image.attr('alt', part.alt); $link.append($image); } this.breadcrumbs.push($crumb); @@ -121,8 +135,9 @@ /** * Makes a breadcrumb structure based on the given path - * @param dir path to split into a breadcrumb structure - * @return array of map {dir: path, name: displayName} + * + * @param {String} dir path to split into a breadcrumb structure + * @return {Object.<String, String>} map of {dir: path, name: displayName} */ _makeCrumbs: function(dir) { var crumbs = []; @@ -137,6 +152,7 @@ crumbs.push({ dir: '/', name: '', + alt: t('files', 'Home'), img: OC.imagePath('core', 'places/home.svg') }); for (var i = 0; i < parts.length; i++) { @@ -166,6 +182,8 @@ /** * Show/hide breadcrumbs to fit the given width + * + * @param {int} availableWidth available width */ setMaxWidth: function (availableWidth) { if (this.availableWidth !== availableWidth) { diff --git a/apps/files/js/favoritesfilelist.js b/apps/files/js/favoritesfilelist.js new file mode 100644 index 00000000000..0d555ce609d --- /dev/null +++ b/apps/files/js/favoritesfilelist.js @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2014 Vincent Petry <pvince81@owncloud.com> + * + * This file is licensed under the Affero General Public License version 3 + * or later. + * + * See the COPYING-README file. + * + */ + +// HACK: this piece needs to be loaded AFTER the files app (for unit tests) +$(document).ready(function() { + (function(OCA) { + /** + * @class OCA.Files.FavoritesFileList + * @augments OCA.Files.FavoritesFileList + * + * @classdesc Favorites file list. + * Displays the list of files marked as favorites + * + * @param $el container element with existing markup for the #controls + * and a table + * @param [options] map of options, see other parameters + */ + var FavoritesFileList = function($el, options) { + this.initialize($el, options); + }; + FavoritesFileList.prototype = _.extend({}, OCA.Files.FileList.prototype, + /** @lends OCA.Files.FavoritesFileList.prototype */ { + id: 'favorites', + appName: 'Favorites', + + _clientSideSort: true, + _allowSelection: false, + + /** + * @private + */ + initialize: function($el, options) { + OCA.Files.FileList.prototype.initialize.apply(this, arguments); + if (this.initialized) { + return; + } + OC.Plugins.attach('OCA.Files.FavoritesFileList', this); + }, + + updateEmptyContent: function() { + var dir = this.getCurrentDirectory(); + if (dir === '/') { + // root has special permissions + this.$el.find('#emptycontent').toggleClass('hidden', !this.isEmpty); + this.$el.find('#filestable thead th').toggleClass('hidden', this.isEmpty); + } + else { + OCA.Files.FileList.prototype.updateEmptyContent.apply(this, arguments); + } + }, + + getDirectoryPermissions: function() { + return OC.PERMISSION_READ | OC.PERMISSION_DELETE; + }, + + updateStorageStatistics: function() { + // no op because it doesn't have + // storage info like free space / used space + }, + + reload: function() { + var tagName = OC.TAG_FAVORITE; + this.showMask(); + if (this._reloadCall) { + this._reloadCall.abort(); + } + this._reloadCall = $.ajax({ + url: OC.generateUrl('/apps/files/api/v1/tags/{tagName}/files', {tagName: tagName}), + type: 'GET', + dataType: 'json' + }); + var callBack = this.reloadCallback.bind(this); + return this._reloadCall.then(callBack, callBack); + }, + + reloadCallback: function(result) { + delete this._reloadCall; + this.hideMask(); + + if (result.files) { + this.setFiles(result.files.sort(this._sortComparator)); + } + else { + // TODO: error handling + } + } + }); + + OCA.Files.FavoritesFileList = FavoritesFileList; + })(OCA); +}); + diff --git a/apps/files/js/favoritesplugin.js b/apps/files/js/favoritesplugin.js new file mode 100644 index 00000000000..417a32ef804 --- /dev/null +++ b/apps/files/js/favoritesplugin.js @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2014 Vincent Petry <pvince81@owncloud.com> + * + * This file is licensed under the Affero General Public License version 3 + * or later. + * + * See the COPYING-README file. + * + */ + +(function(OCA) { + /** + * @namespace OCA.Files.FavoritesPlugin + * + * Registers the favorites file list from the files app sidebar. + */ + OCA.Files.FavoritesPlugin = { + name: 'Favorites', + + /** + * @type OCA.Files.FavoritesFileList + */ + favoritesFileList: null, + + attach: function() { + var self = this; + $('#app-content-favorites').on('show.plugin-favorites', function(e) { + self.showFileList($(e.target)); + }); + $('#app-content-favorites').on('hide.plugin-favorites', function() { + self.hideFileList(); + }); + }, + + detach: function() { + if (this.favoritesFileList) { + this.favoritesFileList.destroy(); + OCA.Files.fileActions.off('setDefault.plugin-favorites', this._onActionsUpdated); + OCA.Files.fileActions.off('registerAction.plugin-favorites', this._onActionsUpdated); + $('#app-content-favorites').off('.plugin-favorites'); + this.favoritesFileList = null; + } + }, + + showFileList: function($el) { + if (!this.favoritesFileList) { + this.favoritesFileList = this._createFavoritesFileList($el); + } + return this.favoritesFileList; + }, + + hideFileList: function() { + if (this.favoritesFileList) { + this.favoritesFileList.$fileList.empty(); + } + }, + + /** + * Creates the favorites file list. + * + * @param $el container for the file list + * @return {OCA.Files.FavoritesFileList} file list + */ + _createFavoritesFileList: function($el) { + var fileActions = this._createFileActions(); + // register favorite list for sidebar section + return new OCA.Files.FavoritesFileList( + $el, { + fileActions: fileActions, + scrollContainer: $('#app-content') + } + ); + }, + + _createFileActions: function() { + // inherit file actions from the files app + var fileActions = new OCA.Files.FileActions(); + // note: not merging the legacy actions because legacy apps are not + // compatible with the sharing overview and need to be adapted first + fileActions.registerDefaultActions(); + fileActions.merge(OCA.Files.fileActions); + + if (!this._globalActionsInitialized) { + // in case actions are registered later + this._onActionsUpdated = _.bind(this._onActionsUpdated, this); + OCA.Files.fileActions.on('setDefault.plugin-favorites', this._onActionsUpdated); + OCA.Files.fileActions.on('registerAction.plugin-favorites', this._onActionsUpdated); + this._globalActionsInitialized = true; + } + + // when the user clicks on a folder, redirect to the corresponding + // folder in the files app instead of opening it directly + fileActions.register('dir', 'Open', OC.PERMISSION_READ, '', function (filename, context) { + OCA.Files.App.setActiveView('files', {silent: true}); + OCA.Files.App.fileList.changeDirectory(context.$file.attr('data-path') + '/' + filename, true, true); + }); + fileActions.setDefault('dir', 'Open'); + return fileActions; + }, + + _onActionsUpdated: function(ev) { + if (ev.action) { + this.favoritesFileList.fileActions.registerAction(ev.action); + } else if (ev.defaultAction) { + this.favoritesFileList.fileActions.setDefault( + ev.defaultAction.mime, + ev.defaultAction.name + ); + } + } + }; + +})(OCA); + +OC.Plugins.register('OCA.Files.App', OCA.Files.FavoritesPlugin); + diff --git a/apps/files/js/file-upload.js b/apps/files/js/file-upload.js index 460c2435642..8b0753fc647 100644 --- a/apps/files/js/file-upload.js +++ b/apps/files/js/file-upload.js @@ -49,7 +49,7 @@ function supportAjaxUploadWithProgress() { /** * keeps track of uploads in progress and implements callbacks for the conflicts dialog - * @type {OC.Upload} + * @namespace */ OC.Upload = { _uploads: [], @@ -175,12 +175,19 @@ OC.Upload = { * @param {function} callbacks.onCancel */ checkExistingFiles: function (selection, callbacks) { - // TODO check filelist before uploading and show dialog on conflicts, use callbacks + /* + $.each(selection.uploads, function(i, upload) { + var $row = OCA.Files.App.fileList.findFileEl(upload.files[0].name); + if ($row) { + // TODO check filelist before uploading and show dialog on conflicts, use callbacks + } + }); + */ callbacks.onNoConflicts(selection); }, _hideProgressBar: function() { - $('#uploadprogresswrapper input.stop').fadeOut(); + $('#uploadprogresswrapper .stop').fadeOut(); $('#uploadprogressbar').fadeOut(function() { $('#file_upload_start').trigger(new $.Event('resized')); }); @@ -417,11 +424,15 @@ OC.Upload = { data.textStatus = 'servererror'; data.errorThrown = t('files', 'Could not get result from server.'); fu._trigger('fail', e, data); + } else if (result[0].status === 'readonly') { + var original = result[0]; + var replacement = data.files[0]; + OC.dialogs.fileexists(data, original, replacement, OC.Upload); } else if (result[0].status === 'existserror') { //show "file already exists" dialog var original = result[0]; var replacement = data.files[0]; - OC.dialogs.fileexists(data, original, replacement, OC.Upload, fu); + OC.dialogs.fileexists(data, original, replacement, OC.Upload); } else if (result[0].status !== 'success') { //delete data.jqXHR; data.textStatus = 'servererror'; @@ -458,13 +469,13 @@ OC.Upload = { OC.Upload.log('progress handle fileuploadadd', e, data); //show cancel button //if (data.dataType !== 'iframe') { //FIXME when is iframe used? only for ie? - // $('#uploadprogresswrapper input.stop').show(); + // $('#uploadprogresswrapper .stop').show(); //} }); // add progress handlers fileupload.on('fileuploadstart', function(e, data) { OC.Upload.log('progress handle fileuploadstart', e, data); - $('#uploadprogresswrapper input.stop').show(); + $('#uploadprogresswrapper .stop').show(); $('#uploadprogressbar').progressbar({value: 0}); OC.Upload._showProgressBar(); }); @@ -490,6 +501,21 @@ OC.Upload = { } }); + } else { + // for all browsers that don't support the progress bar + // IE 8 & 9 + + // show a spinner + fileupload.on('fileuploadstart', function() { + $('#upload').addClass('icon-loading'); + $('#upload .icon-upload').hide(); + }); + + // hide a spinner + fileupload.on('fileuploadstop fileuploadfail', function() { + $('#upload').removeClass('icon-loading'); + $('#upload .icon-upload').show(); + }); } } @@ -563,10 +589,15 @@ OC.Upload = { var form = $('<form></form>'); var input = $('<input type="text">'); var newName = $(this).attr('data-newname') || ''; + var fileType = 'input-' + $(this).attr('data-type'); if (newName) { input.val(newName); + input.attr('id', fileType); } - form.append(input); + var label = $('<label class="hidden-visually" for="">' + escapeHTML(newName) + '</label>'); + label.attr('for', fileType); + + form.append(label).append(input); $(this).append(form); var lastPos; var checkInput = function () { diff --git a/apps/files/js/fileactions.js b/apps/files/js/fileactions.js index 8ae0d8f1b2e..875857745b8 100644 --- a/apps/files/js/fileactions.js +++ b/apps/files/js/fileactions.js @@ -8,16 +8,18 @@ * */ -/* global trashBinApp */ (function() { /** * Construct a new FileActions instance + * @constructs FileActions + * @memberof OCA.Files */ var FileActions = function() { this.initialize(); - } + }; FileActions.prototype = { + /** @lends FileActions.prototype */ actions: {}, defaults: {}, icons: {}, @@ -31,9 +33,14 @@ /** * List of handlers to be notified whenever a register() or * setDefault() was called. + * + * @member {Function[]} */ _updateListeners: {}, + /** + * @private + */ initialize: function() { this.clear(); // abusing jquery for events until we get a real event lib @@ -45,7 +52,7 @@ * Adds an event handler * * @param {String} eventName event name - * @param Function callback + * @param {Function} callback */ on: function(eventName, callback) { this.$el.on(eventName, callback); @@ -75,7 +82,7 @@ * Merges the actions from the given fileActions into * this instance. * - * @param fileActions instance of OCA.Files.FileActions + * @param {OCA.Files.FileActions} fileActions instance of OCA.Files.FileActions */ merge: function(fileActions) { var self = this; @@ -101,35 +108,43 @@ permissions: permissions, icon: icon, actionHandler: action, - displayName: displayName + displayName: displayName || name }); }, /** * Register action * - * @param {Object} action action object - * @param {String} action.name identifier of the action - * @param {String} action.displayName display name of the action, defaults - * to the name given in action.name - * @param {String} action.mime mime type - * @param {int} action.permissions permissions - * @param {(Function|String)} action.icon icon - * @param {Function} action.actionHandler function that performs the action + * @param {OCA.Files.FileAction} action object */ registerAction: function (action) { var mime = action.mime; var name = action.name; + var actionSpec = { + action: action.actionHandler, + name: name, + displayName: action.displayName, + mime: mime, + icon: action.icon, + permissions: action.permissions + }; + if (_.isUndefined(action.displayName)) { + actionSpec.displayName = t('files', name); + } + if (_.isFunction(action.render)) { + actionSpec.render = action.render; + } else { + actionSpec.render = _.bind(this._defaultRenderAction, this); + } if (!this.actions[mime]) { this.actions[mime] = {}; } - this.actions[mime][name] = { - action: action.actionHandler, - permissions: action.permissions, - displayName: action.displayName || t('files', name) - }; + this.actions[mime][name] = actionSpec; this.icons[name] = action.icon; this._notifyUpdateListeners('registerAction', {action: action}); }, + /** + * Clears all registered file actions. + */ clear: function() { this.actions = {}; this.defaults = {}; @@ -137,6 +152,12 @@ this.currentFile = null; this._updateListeners = []; }, + /** + * Sets the default action for a given mime type. + * + * @param {String} mime mime type + * @param {String} name action name + */ setDefault: function (mime, name) { this.defaults[mime] = name; this._notifyUpdateListeners('setDefault', {defaultAction: {mime: mime, name: name}}); @@ -195,6 +216,130 @@ return actions[name]; }, /** + * Default function to render actions + * + * @param {OCA.Files.FileAction} actionSpec file action spec + * @param {boolean} isDefault true if the action is a default one, + * false otherwise + * @param {OCA.Files.FileActionContext} context action context + */ + _defaultRenderAction: function(actionSpec, isDefault, context) { + var name = actionSpec.name; + if (name === 'Download' || !isDefault) { + var $actionLink = this._makeActionLink(actionSpec, context); + context.$file.find('a.name>span.fileactions').append($actionLink); + return $actionLink; + } + }, + /** + * Renders the action link element + * + * @param {OCA.Files.FileAction} actionSpec action object + * @param {OCA.Files.FileActionContext} context action context + */ + _makeActionLink: function(actionSpec, context) { + var img = actionSpec.icon; + if (img && img.call) { + img = img(context.$file.attr('data-file')); + } + var html = '<a href="#">'; + if (img) { + html += '<img class="svg" alt="" src="' + img + '" />'; + } + if (actionSpec.displayName) { + html += '<span> ' + actionSpec.displayName + '</span></a>'; + } + + return $(html); + }, + /** + * Custom renderer for the "Rename" action. + * Displays the rename action as an icon behind the file name. + * + * @param {OCA.Files.FileAction} actionSpec file action to render + * @param {boolean} isDefault true if the action is a default action, + * false otherwise + * @param {OCAFiles.FileActionContext} context rendering context + */ + _renderRenameAction: function(actionSpec, isDefault, context) { + var $actionEl = this._makeActionLink(actionSpec, context); + var $container = context.$file.find('a.name span.nametext'); + $actionEl.find('img').attr('alt', t('files', 'Rename')); + $container.find('.action-rename').remove(); + $container.append($actionEl); + return $actionEl; + }, + /** + * Custom renderer for the "Delete" action. + * Displays the "Delete" action as a trash icon at the end of + * the table row. + * + * @param {OCA.Files.FileAction} actionSpec file action to render + * @param {boolean} isDefault true if the action is a default action, + * false otherwise + * @param {OCAFiles.FileActionContext} context rendering context + */ + _renderDeleteAction: function(actionSpec, isDefault, context) { + var mountType = context.$file.attr('data-mounttype'); + var deleteTitle = t('files', 'Delete'); + if (mountType === 'external-root') { + deleteTitle = t('files', 'Disconnect storage'); + } else if (mountType === 'shared-root') { + deleteTitle = t('files', 'Unshare'); + } + var $actionLink = $('<a href="#" original-title="' + + escapeHTML(deleteTitle) + + '" class="action delete icon-delete">' + + '<span class="hidden-visually">' + escapeHTML(deleteTitle) + '</span>' + + '</a>' + ); + var $container = context.$file.find('td:last'); + $container.find('.delete').remove(); + $container.append($actionLink); + return $actionLink; + }, + /** + * Renders the action element by calling actionSpec.render() and + * registers the click event to process the action. + * + * @param {OCA.Files.FileAction} actionSpec file action to render + * @param {boolean} isDefault true if the action is a default action, + * false otherwise + * @param {OCAFiles.FileActionContext} context rendering context + */ + _renderAction: function(actionSpec, isDefault, context) { + var $actionEl = actionSpec.render(actionSpec, isDefault, context); + if (!$actionEl || !$actionEl.length) { + return; + } + $actionEl.addClass('action action-' + actionSpec.name.toLowerCase()); + $actionEl.attr('data-action', actionSpec.name); + $actionEl.on( + 'click', { + a: null + }, + function(event) { + var $file = $(event.target).closest('tr'); + var currentFile = $file.find('td.filename'); + var fileName = $file.attr('data-file'); + event.stopPropagation(); + event.preventDefault(); + + context.fileActions.currentFile = currentFile; + // also set on global object for legacy apps + window.FileActions.currentFile = currentFile; + + actionSpec.action( + fileName, + _.extend(context, { + dir: $file.attr('data-path') || context.fileList.getCurrentDirectory() + }) + ); + } + ); + return $actionEl; + }, + /** * Display file actions for the given element * @param parent "td" element of the file for which to display actions * @param triggerEvent if true, triggers the fileActionsReady on the file @@ -208,107 +353,51 @@ return; } this.currentFile = parent; - var $tr = parent.closest('tr'); var self = this; - var actions = this.getActions(this.getCurrentMimeType(), this.getCurrentType(), this.getCurrentPermissions()); - var file = this.getCurrentFile(); + var $tr = parent.closest('tr'); + var actions = this.getActions( + this.getCurrentMimeType(), + this.getCurrentType(), + this.getCurrentPermissions() + ); var nameLinks; if ($tr.data('renaming')) { return; } - // recreate fileactions + // recreate fileactions container nameLinks = parent.children('a.name'); nameLinks.find('.fileactions, .nametext .action').remove(); nameLinks.append('<span class="fileactions" />'); - var defaultAction = this.getDefault(this.getCurrentMimeType(), this.getCurrentType(), this.getCurrentPermissions()); - - var actionHandler = function (event) { - event.stopPropagation(); - event.preventDefault(); - - self.currentFile = event.data.elem; - // also set on global object for legacy apps - window.FileActions.currentFile = self.currentFile; - - var file = self.getCurrentFile(); - var $tr = $(this).closest('tr'); - - event.data.actionFunc(file, { - $file: $tr, - fileList: fileList, - fileActions: self, - dir: $tr.attr('data-path') || fileList.getCurrentDirectory() - }); - }; - - var addAction = function (name, action, displayName) { - - if ((name === 'Download' || action !== defaultAction) && name !== 'Delete') { + var defaultAction = this.getDefault( + this.getCurrentMimeType(), + this.getCurrentType(), + this.getCurrentPermissions() + ); - var img = self.icons[name], - actionText = displayName, - actionContainer = 'a.name>span.fileactions'; - - if (name === 'Rename') { - // rename has only an icon which appears behind - // the file name - actionText = ''; - actionContainer = 'a.name span.nametext'; - } - if (img.call) { - img = img(file); - } - var html = '<a href="#" class="action action-' + name.toLowerCase() + '" data-action="' + name + '">'; - if (img) { - html += '<img class ="svg" src="' + img + '" />'; - } - html += '<span> ' + actionText + '</span></a>'; - - var element = $(html); - element.data('action', name); - element.on('click', {a: null, elem: parent, actionFunc: actions[name].action}, actionHandler); - parent.find(actionContainer).append(element); - } - - }; - - $.each(actions, function (name, action) { + $.each(actions, function (name, actionSpec) { if (name !== 'Share') { - displayName = action.displayName; - ah = action.action; - - addAction(name, ah, displayName); + self._renderAction( + actionSpec, + actionSpec.action === defaultAction, { + $file: $tr, + fileActions: this, + fileList : fileList + } + ); } }); - if(actions.Share){ - displayName = t('files', 'Share'); - addAction('Share', actions.Share, displayName); - } - - // remove the existing delete action - parent.parent().children().last().find('.action.delete').remove(); - if (actions['Delete']) { - var img = self.icons['Delete']; - var html; - var mountType = $tr.attr('data-mounttype'); - var deleteTitle = t('files', 'Delete'); - if (mountType === 'external-root') { - deleteTitle = t('files', 'Disconnect storage'); - } else if (mountType === 'shared-root') { - deleteTitle = t('files', 'Unshare'); - } else if (fileList.id === 'trashbin') { - deleteTitle = t('files', 'Delete permanently'); - } - - if (img.call) { - img = img(file); - } - html = '<a href="#" original-title="' + escapeHTML(deleteTitle) + '" class="action delete icon-delete" />'; - var element = $(html); - element.data('action', actions['Delete']); - element.on('click', {a: null, elem: parent, actionFunc: actions['Delete'].action}, actionHandler); - parent.parent().children().last().append(element); + // added here to make sure it's always the last action + var shareActionSpec = actions.Share; + if (shareActionSpec){ + this._renderAction( + shareActionSpec, + shareActionSpec.action === defaultAction, { + $file: $tr, + fileActions: this, + fileList: fileList + } + ); } if (triggerEvent){ @@ -332,18 +421,34 @@ * Register the actions that are used by default for the files app. */ registerDefaultActions: function() { - this.register('all', 'Delete', OC.PERMISSION_DELETE, function () { - return OC.imagePath('core', 'actions/delete'); - }, function (filename, context) { - context.fileList.do_delete(filename, context.dir); - $('.tipsy').remove(); + this.registerAction({ + name: 'Delete', + displayName: '', + mime: 'all', + permissions: OC.PERMISSION_DELETE, + icon: function() { + return OC.imagePath('core', 'actions/delete'); + }, + render: _.bind(this._renderDeleteAction, this), + actionHandler: function(fileName, context) { + context.fileList.do_delete(fileName, context.dir); + $('.tipsy').remove(); + } }); // t('files', 'Rename') - this.register('all', 'Rename', OC.PERMISSION_UPDATE, function () { - return OC.imagePath('core', 'actions/rename'); - }, function (filename, context) { - context.fileList.rename(filename); + this.registerAction({ + name: 'Rename', + displayName: '', + mime: 'all', + permissions: OC.PERMISSION_UPDATE, + icon: function() { + return OC.imagePath('core', 'actions/rename'); + }, + render: _.bind(this._renderRenameAction, this), + actionHandler: function (filename, context) { + context.fileList.rename(filename); + } }); this.register('dir', 'Open', OC.PERMISSION_READ, '', function (filename, context) { @@ -370,6 +475,59 @@ OCA.Files.FileActions = FileActions; + /** + * File action attributes. + * + * @todo make this a real class in the future + * @typedef {Object} OCA.Files.FileAction + * + * @property {String} name identifier of the action + * @property {String} displayName display name of the action, defaults + * to the name given in name property + * @property {String} mime mime type + * @property {int} permissions permissions + * @property {(Function|String)} icon icon path to the icon or function + * that returns it + * @property {OCA.Files.FileActions~renderActionFunction} [render] optional rendering function + * @property {OCA.Files.FileActions~actionHandler} actionHandler action handler function + */ + + /** + * File action context attributes. + * + * @typedef {Object} OCA.Files.FileActionContext + * + * @property {Object} $file jQuery file row element + * @property {OCA.Files.FileActions} fileActions file actions object + * @property {OCA.Files.FileList} fileList file list object + */ + + /** + * Render function for actions. + * The function must render a link element somewhere in the DOM + * and return it. The function should NOT register the event handler + * as this will be done after the link was returned. + * + * @callback OCA.Files.FileActions~renderActionFunction + * @param {OCA.Files.FileAction} actionSpec action definition + * @param {Object} $row row container + * @param {boolean} isDefault true if the action is the default one, + * false otherwise + * @return {Object} jQuery link object + */ + + /** + * Action handler function for file actions + * + * @callback OCA.Files.FileActions~actionHandler + * @param {String} fileName name of the clicked file + * @param context context + * @param {String} context.dir directory of the file + * @param context.$file jQuery element of the file + * @param {OCA.Files.FileList} context.fileList the FileList instance on which the action occurred + * @param {OCA.Files.FileActions} context.fileActions the FileActions instance on which the action occurred + */ + // global file actions to be used by all lists OCA.Files.fileActions = new OCA.Files.FileActions(); OCA.Files.legacyFileActions = new OCA.Files.FileActions(); @@ -380,6 +538,7 @@ // their actions on. Since legacy apps are very likely to break with other // FileList views than the main one ("All files"), actions registered // through window.FileActions will be limited to the main file list. + // @deprecated use OCA.Files.FileActions instead window.FileActions = OCA.Files.legacyFileActions; window.FileActions.register = function (mime, name, permissions, icon, action, displayName) { console.warn('FileActions.register() is deprecated, please use OCA.Files.fileActions.register() instead', arguments); diff --git a/apps/files/js/filelist.js b/apps/files/js/filelist.js index cf1d9780d99..e680ef4b3ed 100644 --- a/apps/files/js/filelist.js +++ b/apps/files/js/filelist.js @@ -10,13 +10,26 @@ (function() { /** + * @class OCA.Files.FileList + * @classdesc + * * The FileList class manages a file list view. * A file list view consists of a controls bar and * a file list table. + * + * @param $el container element with existing markup for the #controls + * and a table + * @param [options] map of options, see other parameters + * @param [options.scrollContainer] scrollable container, defaults to $(window) + * @param [options.dragOptions] drag options, disabled by default + * @param [options.folderDropOptions] folder drop options, disabled by default */ var FileList = function($el, options) { this.initialize($el, options); }; + /** + * @memberof OCA.Files + */ FileList.prototype = { SORT_INDICATOR_ASC_CLASS: 'icon-triangle-n', SORT_INDICATOR_DESC_CLASS: 'icon-triangle-s', @@ -41,15 +54,27 @@ */ $fileList: null, + /** + * @type OCA.Files.BreadCrumb + */ breadcrumb: null, /** - * Instance of FileSummary + * @type OCA.Files.FileSummary */ fileSummary: null, + + /** + * Whether the file list was initialized already. + * @type boolean + */ initialized: false, - // number of files per page, calculated dynamically + /** + * Number of files per page + * + * @return {int} page size + */ pageSize: function() { return Math.ceil(this.$container.height() / 50); }, @@ -57,37 +82,56 @@ /** * Array of files in the current folder. * The entries are of file data. + * + * @type Array.<Object> */ files: [], /** * File actions handler, defaults to OCA.Files.FileActions + * @type OCA.Files.FileActions */ fileActions: null, /** + * Whether selection is allowed, checkboxes and selection overlay will + * be rendered + */ + _allowSelection: true, + + /** * Map of file id to file data + * @type Object.<int, Object> */ _selectedFiles: {}, /** * Summary of selected files. - * Instance of FileSummary. + * @type OCA.Files.FileSummary */ _selectionSummary: null, /** + * If not empty, only files containing this string will be shown + * @type String + */ + _filter: '', + + /** * Sort attribute + * @type String */ _sort: 'name', /** * Sort direction: 'asc' or 'desc' + * @type String */ _sortDirection: 'asc', /** * Sort comparator function for the current sort + * @type Function */ _sortComparator: null, @@ -100,6 +144,7 @@ /** * Current directory + * @type String */ _currentDirectory: null, @@ -116,6 +161,7 @@ * @param options.dragOptions drag options, disabled by default * @param options.folderDropOptions folder drop options, disabled by default * @param options.scrollTo name of file to scroll to after the first load + * @private */ initialize: function($el, options) { var self = this; @@ -132,6 +178,9 @@ } this.$el = $el; + if (options.id) { + this.id = options.id; + } this.$container = options.scrollContainer || $(window); this.$table = $el.find('table:first'); this.$fileList = $el.find('#fileList'); @@ -165,8 +214,10 @@ this.$el.on('show', this._onResize); + this.updateSearch(); + this.$fileList.on('click','td.filename>a.name', _.bind(this._onClickFile, this)); - this.$fileList.on('change', 'td.filename>input:checkbox', _.bind(this._onClickFileCheckbox, this)); + this.$fileList.on('change', 'td.filename>.selectCheckBox', _.bind(this._onClickFileCheckbox, this)); this.$el.on('urlChanged', _.bind(this._onUrlChanged, this)); this.$el.find('.select-all').click(_.bind(this._onClickSelectAll, this)); this.$el.find('.download').click(_.bind(this._onClickDownloadSelected, this)); @@ -181,6 +232,8 @@ self.scrollTo(options.scrollTo); }); } + + OC.Plugins.attach('OCA.Files.FileList', this); }, /** @@ -190,8 +243,14 @@ // TODO: also unregister other event handlers this.fileActions.off('registerAction', this._onFileActionsUpdated); this.fileActions.off('setDefault', this._onFileActionsUpdated); + OC.Plugins.detach('OCA.Files.FileList', this); }, + /** + * Initializes the file actions, set up listeners. + * + * @param {OCA.Files.FileActions} fileActions file actions + */ _initFileActions: function(fileActions) { this.fileActions = fileActions; if (!this.fileActions) { @@ -217,6 +276,8 @@ containerWidth -= $('#app-navigation-toggle').width(); this.breadcrumb.setMaxWidth(containerWidth - actionsWidth - 10); + + this.updateSearch(); }, /** @@ -236,7 +297,7 @@ * @param state true to select, false to deselect */ _selectFileEl: function($tr, state) { - var $checkbox = $tr.find('td.filename>input:checkbox'); + var $checkbox = $tr.find('td.filename>.selectCheckBox'); var oldData = !!this._selectedFiles[$tr.data('id')]; var data; $checkbox.prop('checked', state); @@ -285,7 +346,7 @@ else { this._lastChecked = $tr; } - var $checkbox = $tr.find('td.filename>input:checkbox'); + var $checkbox = $tr.find('td.filename>.selectCheckBox'); this._selectFileEl($tr, !$checkbox.prop('checked')); this.updateSelectionSummary(); } else { @@ -327,7 +388,7 @@ */ _onClickSelectAll: function(e) { var checked = $(e.target).prop('checked'); - this.$fileList.find('td.filename>input:checkbox').prop('checked', checked) + this.$fileList.find('td.filename>.selectCheckBox').prop('checked', checked) .closest('tr').toggleClass('selected', checked); this._selectedFiles = {}; this._selectionSummary.clear(); @@ -407,6 +468,7 @@ e.preventDefault(); this.changeDirectory($targetDir); } + this.updateSearch(); }, /** @@ -487,7 +549,8 @@ mimetype: $el.attr('data-mime'), type: $el.attr('data-type'), size: parseInt($el.attr('data-size'), 10), - etag: $el.attr('data-etag') + etag: $el.attr('data-etag'), + permissions: parseInt($el.attr('data-permissions'), 10) }; }, @@ -499,6 +562,7 @@ _nextPage: function(animate) { var index = this.$fileList.children().length, count = this.pageSize(), + hidden, tr, fileData, newTrs = [], @@ -510,11 +574,16 @@ while (count > 0 && index < this.files.length) { fileData = this.files[index]; - tr = this._renderRow(fileData, {updateSummary: false, silent: true}); + if (this._filter) { + hidden = fileData.name.toLowerCase().indexOf(this._filter.toLowerCase()) === -1; + } else { + hidden = false; + } + tr = this._renderRow(fileData, {updateSummary: false, silent: true, hidden: hidden}); this.$fileList.append(tr); if (isAllSelected || this._selectedFiles[fileData.id]) { tr.addClass('selected'); - tr.find('input:checkbox').prop('checked', true); + tr.find('.selectCheckBox').prop('checked', true); } if (animate) { tr.addClass('appear transparent'); @@ -588,8 +657,8 @@ }, /** * Creates a new table row element using the given file data. - * @param fileData map of file attributes - * @param options map of attribute "loading" whether the entry is currently loading + * @param {OCA.Files.FileInfo} fileData file info attributes + * @param options map of attributes * @return new tr element (not appended to the table) */ _createRow: function(fileData, options) { @@ -597,12 +666,16 @@ icon = OC.Util.replaceSVGIcon(fileData.icon), name = fileData.name, type = fileData.type || 'file', - mtime = parseInt(fileData.mtime, 10) || new Date().getTime(), + mtime = parseInt(fileData.mtime, 10), mime = fileData.mimetype, path = fileData.path, linkUrl; options = options || {}; + if (isNaN(mtime)) { + mtime = new Date().getTime() + } + if (type === 'dir') { mime = mime || 'httpd/unix-directory'; } @@ -639,10 +712,8 @@ } // filename td - td = $('<td></td>').attr({ - "class": "filename", - "style": 'background-image:url(' + icon + '); background-size: 32px;' - }); + td = $('<td class="filename"></td>'); + // linkUrl if (type === 'dir') { @@ -651,8 +722,17 @@ else { linkUrl = this.getDownloadUrl(name, path); } - td.append('<input id="select-' + this.id + '-' + fileData.id + - '" type="checkbox" /><label for="select-' + this.id + '-' + fileData.id + '"></label>'); + if (this._allowSelection) { + td.append( + '<input id="select-' + this.id + '-' + fileData.id + + '" type="checkbox" class="selectCheckBox"/><label for="select-' + this.id + '-' + fileData.id + '">' + + '<div class="thumbnail" style="background-image:url(' + icon + '); background-size: 32px;"></div>' + + '<span class="hidden-visually">' + t('files', 'Select') + '</span>' + + '</label>' + ); + } else { + td.append('<div class="thumbnail" style="background-image:url(' + icon + '); background-size: 32px;"></div>'); + } var linkElem = $('<a></a>').attr({ "class": "name", "href": linkUrl @@ -713,12 +793,21 @@ if (modifiedColor >= '160') { modifiedColor = 160; } + var formatted; + var text; + if (mtime > 0) { + formatted = formatDate(mtime); + text = OC.Util.relativeModifiedDate(mtime); + } else { + formatted = t('files', 'Unable to determine date'); + text = '?'; + } td = $('<td></td>').attr({ "class": "date" }); td.append($('<span></span>').attr({ "class": "modified", - "title": formatDate(mtime), + "title": formatted, "style": 'color:rgb('+modifiedColor+','+modifiedColor+','+modifiedColor+')' - }).text(OC.Util.relativeModifiedDate(mtime))); + }).text(text)); tr.find('.filesize').text(simpleSize); tr.append(td); return tr; @@ -728,12 +817,14 @@ * Adds an entry to the files array and also into the DOM * in a sorted manner. * - * @param fileData map of file attributes - * @param options map of attributes: - * @param options.updateSummary true to update the summary after adding (default), false otherwise - * @param options.silent true to prevent firing events like "fileActionsReady" - * @param options.animate true to animate preview loading (defaults to true here) - * @param options.scrollTo true to automatically scroll to the file's location + * @param {OCA.Files.FileInfo} fileData map of file attributes + * @param {Object} [options] map of attributes + * @param {boolean} [options.updateSummary] true to update the summary + * after adding (default), false otherwise. Defaults to true. + * @param {boolean} [options.silent] true to prevent firing events like "fileActionsReady", + * defaults to false. + * @param {boolean} [options.animate] true to animate the thumbnail image after load + * defaults to true. * @return new tr element (not appended to the table) */ add: function(fileData, options) { @@ -799,11 +890,13 @@ * Creates a new row element based on the given attributes * and returns it. * - * @param fileData map of file attributes - * @param options map of attributes: - * - "index" optional index at which to insert the element - * - "updateSummary" true to update the summary after adding (default), false otherwise - * - "animate" true to animate the preview rendering + * @param {OCA.Files.FileInfo} fileData map of file attributes + * @param {Object} [options] map of attributes + * @param {int} [options.index] index at which to insert the element + * @param {boolean} [options.updateSummary] true to update the summary + * after adding (default), false otherwise. Defaults to true. + * @param {boolean} [options.animate] true to animate the thumbnail image after load + * defaults to true. * @return new tr element (not appended to the table) */ _renderRow: function(fileData, options) { @@ -844,6 +937,7 @@ this.fileActions.display(filenameTd, !options.silent, this); if (fileData.isPreviewAvailable) { + var iconDiv = filenameTd.find('.thumbnail'); // lazy load / newly inserted td ? if (options.animate) { this.lazyLoadPreview({ @@ -851,7 +945,7 @@ mime: mime, etag: fileData.etag, callback: function(url) { - filenameTd.css('background-image', 'url(' + url + ')'); + iconDiv.css('background-image', 'url(' + url + ')'); } }); } @@ -863,13 +957,14 @@ }; var previewUrl = this.generatePreviewUrl(urlSpec); previewUrl = previewUrl.replace('(', '%28').replace(')', '%29'); - filenameTd.css('background-image', 'url(' + previewUrl + ')'); + iconDiv.css('background-image', 'url(' + previewUrl + ')'); } } return tr; }, /** * Returns the current directory + * @method getCurrentDirectory * @return current directory */ getCurrentDirectory: function(){ @@ -1051,7 +1146,10 @@ /** * Generates a preview URL based on the URL space. - * @param urlSpec map with {x: width, y: height, file: file path} + * @param urlSpec attributes for the URL + * @param {int} urlSpec.x width + * @param {int} urlSpec.y height + * @param {String} urlSpec.file path to the file * @return preview URL */ generatePreviewUrl: function(urlSpec) { @@ -1158,8 +1256,9 @@ /** * Removes a file entry from the list * @param name name of the file to remove - * @param options optional options as map: - * "updateSummary": true to update the summary (default), false otherwise + * @param {Object} [options] map of attributes + * @param {boolean} [options.updateSummary] true to update the summary + * after removing, false otherwise. Defaults to true. * @return deleted element */ remove: function(name, options){ @@ -1201,6 +1300,8 @@ * Finds the index of the row before which the given * fileData should be inserted, considering the current * sorting + * + * @param {OCA.Files.FileInfo} fileData file info */ _findInsertionIndex: function(fileData) { var index = 0; @@ -1224,9 +1325,9 @@ } _.each(fileNames, function(fileName) { var $tr = self.findFileEl(fileName); - var $td = $tr.children('td.filename'); - var oldBackgroundImage = $td.css('background-image'); - $td.css('background-image', 'url('+ OC.imagePath('core', 'loading.gif') + ')'); + var $thumbEl = $tr.find('.thumbnail'); + var oldBackgroundImage = $thumbEl.css('background-image'); + $thumbEl.css('background-image', 'url('+ OC.imagePath('core', 'loading.gif') + ')'); // TODO: improve performance by sending all file names in a single call $.post( OC.filePath('files', 'ajax', 'move.php'), @@ -1268,7 +1369,7 @@ } else { OC.dialogs.alert(t('files', 'Error moving file'), t('files', 'Error')); } - $td.css('background-image', oldBackgroundImage); + $thumbEl.css('background-image', oldBackgroundImage); } ); }); @@ -1329,13 +1430,14 @@ try { var newName = input.val(); + var $thumbEl = tr.find('.thumbnail'); input.tipsy('hide'); form.remove(); if (newName !== oldname) { checkInput(); // mark as loading (temp element) - td.css('background-image', 'url('+ OC.imagePath('core', 'loading.gif') + ')'); + $thumbEl.css('background-image', 'url('+ OC.imagePath('core', 'loading.gif') + ')'); tr.attr('data-file', newName); var basename = newName; if (newName.indexOf('.') > 0 && tr.data('type') !== 'dir') { @@ -1462,7 +1564,7 @@ var fileEl = self.remove(file, {updateSummary: false}); // FIXME: not sure why we need this after the // element isn't even in the DOM any more - fileEl.find('input[type="checkbox"]').prop('checked', false); + fileEl.find('.selectCheckBox').prop('checked', false); fileEl.removeClass('selected'); self.fileSummary.remove({type: fileEl.attr('data-type'), size: fileEl.attr('data-size')}); }); @@ -1515,7 +1617,7 @@ /** * Shows the loading mask. * - * @see #hideMask + * @see OCA.Files.FileList#hideMask */ showMask: function() { // in case one was shown before @@ -1536,7 +1638,7 @@ }, /** * Hide the loading mask. - * @see #showMask + * @see OCA.Files.FileList#showMask */ hideMask: function() { this.$el.find('.mask').remove(); @@ -1553,24 +1655,68 @@ }); }); }, + /** + * @deprecated use setFilter(filter) + */ filter:function(query) { + this.setFilter(''); + }, + /** + * @deprecated use setFilter('') + */ + unfilter:function() { + this.setFilter(''); + }, + /** + * hide files matching the given filter + * @param filter + */ + setFilter:function(filter) { + this._filter = filter; + this.fileSummary.setFilter(filter, this.files); + this.hideIrrelevantUIWhenNoFilesMatch(); + var that = this; this.$fileList.find('tr').each(function(i,e) { - if ($(e).data('file').toString().toLowerCase().indexOf(query.toLowerCase()) !== -1) { - $(e).addClass("searchresult"); + var $e = $(e); + if ($e.data('file').toString().toLowerCase().indexOf(filter.toLowerCase()) === -1) { + $e.addClass('hidden'); + that.$container.trigger('scroll'); } else { - $(e).removeClass("searchresult"); + $e.removeClass('hidden'); } }); - //do not use scrollto to prevent removing searchresult css class - var first = this.$fileList.find('tr.searchresult').first(); - if (first.exists()) { - $(window).scrollTop(first.position().top); + }, + hideIrrelevantUIWhenNoFilesMatch:function() { + if (this._filter && this.fileSummary.summary.totalDirs + this.fileSummary.summary.totalFiles === 0) { + this.$el.find('#filestable thead th').addClass('hidden'); + this.$el.find('#emptycontent').addClass('hidden'); + if ( $('#searchresults').length === 0 || $('#searchresults').hasClass('hidden')) { + this.$el.find('.nofilterresults').removeClass('hidden'). + find('p').text(t('files', "No entries in this folder match '{filter}'", {filter:this._filter})); + } + } else { + this.$el.find('#filestable thead th').toggleClass('hidden', this.isEmpty); + this.$el.find('#emptycontent').toggleClass('hidden', !this.isEmpty); + this.$el.find('.nofilterresults').addClass('hidden'); } }, - unfilter:function() { - this.$fileList.find('tr.searchresult').each(function(i,e) { - $(e).removeClass("searchresult"); - }); + /** + * get the current filter + * @param filter + */ + getFilter:function(filter) { + return this._filter; + }, + /** + * update the search object to use this filelist when filtering + */ + updateSearch:function() { + if (OCA.Search.files) { + OCA.Search.files.setFileList(this); + } + if (OC.Search) { + OC.Search.clear(); + } }, /** * Update UI based on the current selection @@ -1586,7 +1732,7 @@ this.$el.find('.selectedActions').addClass('hidden'); } else { - canDelete = (this.getDirectoryPermissions() & OC.PERMISSION_DELETE); + canDelete = (this.getDirectoryPermissions() & OC.PERMISSION_DELETE) && this.isSelectedDeletable(); this.$el.find('.selectedActions').removeClass('hidden'); this.$el.find('#headerSize a>span:first').text(OC.Util.humanFileSize(summary.totalSize)); var selection = ''; @@ -1607,6 +1753,15 @@ }, /** + * Check whether all selected files are deletable + */ + isSelectedDeletable: function() { + return _.reduce(this.getSelectedFiles(), function(deletable, file) { + return deletable && (file.permissions & OC.PERMISSION_DELETE); + }, true); + }, + + /** * Returns whether all files are selected * @return true if all files are selected, false otherwise */ @@ -1749,7 +1904,7 @@ var translatedText = n('files', 'Uploading %n file', 'Uploading %n files', currentUploads); if (currentUploads === 1) { var img = OC.imagePath('core', 'loading.gif'); - data.context.find('td.filename').attr('style','background-image:url('+img+')'); + data.context.find('.thumbnail').css('background-image', 'url(' + img + ')'); uploadText.text(translatedText); uploadText.show(); } else { @@ -1788,7 +1943,7 @@ var translatedText = n('files', 'Uploading %n file', 'Uploading %n files', currentUploads); if (currentUploads === 0) { var img = OC.imagePath('core', 'filetypes/folder'); - data.context.find('td.filename').attr('style','background-image:url('+img+')'); + data.context.find('.thumbnail').css('background-image', 'url(' + img + ')'); uploadText.text(translatedText); uploadText.hide(); } else { @@ -1873,7 +2028,7 @@ //cleanup uploading to a dir var uploadText = $('tr .uploadtext'); var img = OC.imagePath('core', 'filetypes/folder'); - uploadText.parents('td.filename').attr('style','background-image:url('+img+')'); + uploadText.parents('td.filename').find('.thumbnail').css('background-image', 'url(' + img + ')'); uploadText.fadeOut(); uploadText.attr('currentUploads', 0); } @@ -1887,7 +2042,7 @@ //cleanup uploading to a dir var uploadText = $('tr .uploadtext'); var img = OC.imagePath('core', 'filetypes/folder'); - uploadText.parents('td.filename').attr('style','background-image:url('+img+')'); + uploadText.parents('td.filename').find('.thumbnail').css('background-image', 'url(' + img + ')'); uploadText.fadeOut(); uploadText.attr('currentUploads', 0); } @@ -1961,15 +2116,17 @@ /** * Sort comparators. + * @namespace OCA.Files.FileList.Comparators + * @private */ FileList.Comparators = { /** * Compares two file infos by name, making directories appear * first. * - * @param fileInfo1 file info - * @param fileInfo2 file info - * @return -1 if the first file must appear before the second one, + * @param {OCA.Files.FileInfo} fileInfo1 file info + * @param {OCA.Files.FileInfo} fileInfo2 file info + * @return {int} -1 if the first file must appear before the second one, * 0 if they are identify, 1 otherwise. */ name: function(fileInfo1, fileInfo2) { @@ -1984,9 +2141,9 @@ /** * Compares two file infos by size. * - * @param fileInfo1 file info - * @param fileInfo2 file info - * @return -1 if the first file must appear before the second one, + * @param {OCA.Files.FileInfo} fileInfo1 file info + * @param {OCA.Files.FileInfo} fileInfo2 file info + * @return {int} -1 if the first file must appear before the second one, * 0 if they are identify, 1 otherwise. */ size: function(fileInfo1, fileInfo2) { @@ -1995,9 +2152,9 @@ /** * Compares two file infos by timestamp. * - * @param fileInfo1 file info - * @param fileInfo2 file info - * @return -1 if the first file must appear before the second one, + * @param {OCA.Files.FileInfo} fileInfo1 file info + * @param {OCA.Files.FileInfo} fileInfo2 file info + * @return {int} -1 if the first file must appear before the second one, * 0 if they are identify, 1 otherwise. */ mtime: function(fileInfo1, fileInfo2) { @@ -2005,6 +2162,27 @@ } }; + /** + * File info attributes. + * + * @todo make this a real class in the future + * @typedef {Object} OCA.Files.FileInfo + * + * @property {int} id file id + * @property {String} name file name + * @property {String} [path] file path, defaults to the list's current path + * @property {String} mimetype mime type + * @property {String} type "file" for files or "dir" for directories + * @property {int} permissions file permissions + * @property {int} mtime modification time in milliseconds + * @property {boolean} [isShareMountPoint] whether the file is a share mount + * point + * @property {boolean} [isPreviewAvailable] whether a preview is available + * for the given file type + * @property {String} [icon] path to the mime type icon + * @property {String} etag etag of the file + */ + OCA.Files.FileList = FileList; })(); diff --git a/apps/files/js/files.js b/apps/files/js/files.js index df268fea6de..314b8bf39c6 100644 --- a/apps/files/js/files.js +++ b/apps/files/js/files.js @@ -195,7 +195,10 @@ /** * Generates a preview URL based on the URL space. - * @param urlSpec map with {x: width, y: height, file: file path} + * @param urlSpec attributes for the URL + * @param {int} urlSpec.x width + * @param {int} urlSpec.y height + * @param {String} urlSpec.file path to the file * @return preview URL * @deprecated used OCA.Files.FileList.generatePreviewUrl instead */ @@ -366,19 +369,22 @@ var createDragShadow = function(event) { var dir = FileList.getCurrentDirectory(); $(selectedFiles).each(function(i,elem) { + // TODO: refactor this with the table row creation code var newtr = $('<tr/>') .attr('data-dir', dir) .attr('data-file', elem.name) .attr('data-origin', elem.origin); - newtr.append($('<td/>').addClass('filename').text(elem.name)); - newtr.append($('<td/>').addClass('size').text(OC.Util.humanFileSize(elem.size))); + newtr.append($('<td class="filename" />').text(elem.name).css('background-size', 32)); + newtr.append($('<td class="size" />').text(OC.Util.humanFileSize(elem.size))); tbody.append(newtr); if (elem.type === 'dir') { - newtr.find('td.filename').attr('style','background-image:url('+OC.imagePath('core', 'filetypes/folder.png')+')'); + newtr.find('td.filename') + .css('background-image', 'url(' + OC.imagePath('core', 'filetypes/folder.png') + ')'); } else { var path = dir + '/' + elem.name; OCA.Files.App.files.lazyLoadPreview(path, elem.mime, function(previewpath) { - newtr.find('td.filename').attr('style','background-image:url('+previewpath+')'); + newtr.find('td.filename') + .css('background-image', 'url(' + previewpath + ')'); }, null, null, elem.etag); } }); diff --git a/apps/files/js/filesummary.js b/apps/files/js/filesummary.js index ca70259335c..65187276b2b 100644 --- a/apps/files/js/filesummary.js +++ b/apps/files/js/filesummary.js @@ -19,14 +19,15 @@ * */ -/* global OC, n, t */ - (function() { /** * The FileSummary class encapsulates the file summary values and * the logic to render it in the given container + * + * @constructs FileSummary + * @memberof OCA.Files + * * @param $tr table row element - * $param summary optional initial summary value */ var FileSummary = function($tr) { this.$el = $tr; @@ -38,7 +39,8 @@ summary: { totalFiles: 0, totalDirs: 0, - totalSize: 0 + totalSize: 0, + filter:'' }, /** @@ -47,6 +49,9 @@ * @param update whether to update the display */ add: function(file, update) { + if (file.name && file.name.toLowerCase().indexOf(this.summary.filter) === -1) { + return; + } if (file.type === 'dir' || file.mime === 'httpd/unix-directory') { this.summary.totalDirs++; } @@ -64,6 +69,9 @@ * @param update whether to update the display */ remove: function(file, update) { + if (file.name && file.name.toLowerCase().indexOf(this.summary.filter) === -1) { + return; + } if (file.type === 'dir' || file.mime === 'httpd/unix-directory') { this.summary.totalDirs--; } @@ -75,6 +83,10 @@ this.update(); } }, + setFilter: function(filter, files){ + this.summary.filter = filter.toLowerCase(); + this.calculate(files); + }, /** * Returns the total of files and directories */ @@ -90,11 +102,15 @@ var summary = { totalDirs: 0, totalFiles: 0, - totalSize: 0 + totalSize: 0, + filter: this.summary.filter }; for (var i = 0; i < files.length; i++) { file = files[i]; + if (file.name && file.name.toLowerCase().indexOf(this.summary.filter) === -1) { + continue; + } if (file.type === 'dir' || file.mime === 'httpd/unix-directory') { summary.totalDirs++; } @@ -117,6 +133,9 @@ */ setSummary: function(summary) { this.summary = summary; + if (typeof this.summary.filter === 'undefined') { + this.summary.filter = ''; + } this.update(); }, @@ -136,6 +155,7 @@ var $dirInfo = this.$el.find('.dirinfo'); var $fileInfo = this.$el.find('.fileinfo'); var $connector = this.$el.find('.connector'); + var $filterInfo = this.$el.find('.filter'); // Substitute old content with new translations $dirInfo.html(n('files', '%n folder', '%n folders', this.summary.totalDirs)); @@ -158,6 +178,13 @@ if (this.summary.totalDirs > 0 && this.summary.totalFiles > 0) { $connector.removeClass('hidden'); } + if (this.summary.filter === '') { + $filterInfo.html(''); + $filterInfo.addClass('hidden'); + } else { + $filterInfo.html(n('files', ' matches \'{filter}\'', ' match \'{filter}\'', this.summary.totalDirs + this.summary.totalFiles, {filter: this.summary.filter})); + $filterInfo.removeClass('hidden'); + } }, render: function() { if (!this.$el) { @@ -167,6 +194,11 @@ var summary = this.summary; var directoryInfo = n('files', '%n folder', '%n folders', summary.totalDirs); var fileInfo = n('files', '%n file', '%n files', summary.totalFiles); + if (this.summary.filter === '') { + var filterInfo = ''; + } else { + var filterInfo = n('files', ' matches \'{filter}\'', ' match \'{filter}\'', summary.totalFiles + summary.totalDirs, {filter: summary.filter}); + } var infoVars = { dirs: '<span class="dirinfo">'+directoryInfo+'</span><span class="connector">', @@ -179,9 +211,9 @@ fileSize = '<td class="filesize">' + OC.Util.humanFileSize(summary.totalSize) + '</td>'; } - var info = t('files', '{dirs} and {files}', infoVars); + var info = t('files', '{dirs} and {files}', infoVars, null, {'escape': false}); - var $summary = $('<td><span class="info">'+info+'</span></td>'+fileSize+'<td class="date"></td>'); + var $summary = $('<td><span class="info">'+info+'<span class="filter">'+filterInfo+'</span></span></td>'+fileSize+'<td class="date"></td>'); if (!this.summary.totalFiles && !this.summary.totalDirs) { this.$el.addClass('hidden'); diff --git a/apps/files/js/navigation.js b/apps/files/js/navigation.js index b959e016e8c..be385f21f50 100644 --- a/apps/files/js/navigation.js +++ b/apps/files/js/navigation.js @@ -13,10 +13,19 @@ (function() { + /** + * @class OCA.Files.Navigation + * @classdesc Navigation control for the files app sidebar. + * + * @param $el element containing the navigation + */ var Navigation = function($el) { this.initialize($el); }; + /** + * @memberof OCA.Files + */ Navigation.prototype = { /** @@ -31,6 +40,8 @@ /** * Initializes the navigation from the given container + * + * @private * @param $el element containing the navigation */ initialize: function($el) { diff --git a/apps/files/js/search.js b/apps/files/js/search.js new file mode 100644 index 00000000000..394bcb48603 --- /dev/null +++ b/apps/files/js/search.js @@ -0,0 +1,191 @@ +/* + * Copyright (c) 2014 + * + * This file is licensed under the Affero General Public License version 3 + * or later. + * + * See the COPYING-README file. + * + */ +(function() { + + /** + * Construct a new FileActions instance + * @constructs Files + */ + var Files = function() { + this.initialize(); + }; + /** + * @memberof OCA.Search + */ + Files.prototype = { + + fileList: null, + + /** + * Initialize the file search + */ + initialize: function() { + + var self = this; + + this.fileAppLoaded = function() { + return !!OCA.Files && !!OCA.Files.App; + }; + function inFileList($row, result) { + if (! self.fileAppLoaded()) { + return false; + } + var dir = self.fileList.getCurrentDirectory().replace(/\/+$/,''); + var resultDir = OC.dirname(result.path); + return dir === resultDir && self.fileList.inList(result.name); + } + function updateLegacyMimetype(result) { + // backward compatibility: + if (!result.mime && result.mime_type) { + result.mime = result.mime_type; + } + } + function hideNoFilterResults() { + var $nofilterresults = $('.nofilterresults'); + if ( ! $nofilterresults.hasClass('hidden') ) { + $nofilterresults.addClass('hidden'); + } + } + + this.renderFolderResult = function($row, result) { + if (inFileList($row, result)) { + return null; + } + hideNoFilterResults(); + /*render folder icon, show path beneath filename, + show size and last modified date on the right */ + this.updateLegacyMimetype(result); + + var $pathDiv = $('<div class="path"></div>').text(result.path); + $row.find('td.info div.name').after($pathDiv).text(result.name); + + $row.find('td.result a').attr('href', result.link); + $row.find('td.icon').css('background-image', 'url(' + OC.imagePath('core', 'filetypes/folder') + ')'); + return $row; + }; + + this.renderFileResult = function($row, result) { + if (inFileList($row, result)) { + return null; + } + hideNoFilterResults(); + /*render preview icon, show path beneath filename, + show size and last modified date on the right */ + this.updateLegacyMimetype(result); + + var $pathDiv = $('<div class="path"></div>').text(result.path); + $row.find('td.info div.name').after($pathDiv).text(result.name); + + $row.find('td.result a').attr('href', result.link); + + if (self.fileAppLoaded()) { + self.fileList.lazyLoadPreview({ + path: result.path, + mime: result.mime, + callback: function (url) { + $row.find('td.icon').css('background-image', 'url(' + url + ')'); + } + }); + } else { + // FIXME how to get mime icon if not in files app + var mimeicon = result.mime.replace('/', '-'); + $row.find('td.icon').css('background-image', 'url(' + OC.imagePath('core', 'filetypes/' + mimeicon) + ')'); + var dir = OC.dirname(result.path); + if (dir === '') { + dir = '/'; + } + $row.find('td.info a').attr('href', + OC.generateUrl('/apps/files/?dir={dir}&scrollto={scrollto}', {dir: dir, scrollto: result.name}) + ); + } + return $row; + }; + + this.renderAudioResult = function($row, result) { + /*render preview icon, show path beneath filename, + show size and last modified date on the right + show Artist and Album */ + $row = this.renderFileResult($row, result); + if ($row) { + $row.find('td.icon').css('background-image', 'url(' + OC.imagePath('core', 'filetypes/audio') + ')'); + } + return $row; + }; + + this.renderImageResult = function($row, result) { + /*render preview icon, show path beneath filename, + show size and last modified date on the right + show width and height */ + $row = this.renderFileResult($row, result); + if ($row && !self.fileAppLoaded()) { + $row.find('td.icon').css('background-image', 'url(' + OC.imagePath('core', 'filetypes/image') + ')'); + } + return $row; + }; + + + this.handleFolderClick = function($row, result, event) { + // open folder + if (self.fileAppLoaded()) { + self.fileList.changeDirectory(result.path); + return false; + } else { + return true; + } + }; + + this.handleFileClick = function($row, result, event) { + if (self.fileAppLoaded()) { + self.fileList.changeDirectory(OC.dirname(result.path)); + self.fileList.scrollTo(result.name); + return false; + } else { + return true; + } + }; + + this.updateLegacyMimetype = function (result) { + // backward compatibility: + if (!result.mime && result.mime_type) { + result.mime = result.mime_type; + } + }; + this.setFileList = function (fileList) { + this.fileList = fileList; + }; + + OC.Plugins.register('OCA.Search', this); + }, + attach: function(search) { + var self = this; + search.setFilter('files', function (query) { + if (self.fileAppLoaded()) { + self.fileList.setFilter(query); + if (query.length > 2) { + //search is not started until 500msec have passed + window.setTimeout(function() { + $('.nofilterresults').addClass('hidden'); + }, 500); + } + } + }); + + search.setRenderer('folder', this.renderFolderResult.bind(this)); + search.setRenderer('file', this.renderFileResult.bind(this)); + search.setRenderer('audio', this.renderAudioResult.bind(this)); + search.setRenderer('image', this.renderImageResult.bind(this)); + + search.setHandler('folder', this.handleFolderClick.bind(this)); + search.setHandler(['file', 'audio', 'image'], this.handleFileClick.bind(this)); + } + }; + OCA.Search.Files = Files; + OCA.Search.files = new Files(); +})(); diff --git a/apps/files/js/tagsplugin.js b/apps/files/js/tagsplugin.js new file mode 100644 index 00000000000..a6757431ffa --- /dev/null +++ b/apps/files/js/tagsplugin.js @@ -0,0 +1,172 @@ +/* + * Copyright (c) 2014 Vincent Petry <pvince81@owncloud.com> + * + * This file is licensed under the Affero General Public License version 3 + * or later. + * + * See the COPYING-README file. + * + */ + +/* global Handlebars */ + +(function(OCA) { + + var TEMPLATE_FAVORITE_ACTION = + '<a href="#" ' + + 'class="action action-favorite {{#isFavorite}}permanent{{/isFavorite}}">' + + '<img class="svg" alt="{{altText}}" src="{{imgFile}}" />' + + '</a>'; + + /** + * Returns the path to the star image + * + * @param {boolean} state true if starred, false otherwise + * @return {string} path to star image + */ + function getStarImage(state) { + return OC.imagePath('core', state ? 'actions/starred' : 'actions/star'); + } + + /** + * Render the star icon with the given state + * + * @param {boolean} state true if starred, false otherwise + * @return {Object} jQuery object + */ + function renderStar(state) { + if (!this._template) { + this._template = Handlebars.compile(TEMPLATE_FAVORITE_ACTION); + } + return this._template({ + isFavorite: state, + altText: state ? t('core', 'Favorited') : t('core', 'Favorite'), + imgFile: getStarImage(state) + }); + } + + /** + * Toggle star icon on action element + * + * @param {Object} action element + * @param {boolean} state true if starred, false otherwise + */ + function toggleStar($actionEl, state) { + $actionEl.find('img').attr('src', getStarImage(state)); + $actionEl.toggleClass('permanent', state); + } + + OCA.Files = OCA.Files || {}; + + /** + * @namespace OCA.Files.TagsPlugin + * + * Extends the file actions and file list to include a favorite action icon + * and addition "data-tags" and "data-favorite" attributes. + */ + OCA.Files.TagsPlugin = { + name: 'Tags', + + allowedLists: [ + 'files', + 'favorites' + ], + + _extendFileActions: function(fileActions) { + var self = this; + // register "star" action + fileActions.registerAction({ + name: 'favorite', + displayName: 'Favorite', + mime: 'all', + permissions: OC.PERMISSION_READ, + render: function(actionSpec, isDefault, context) { + var $file = context.$file; + var isFavorite = $file.data('favorite') === true; + var $icon = $(renderStar(isFavorite)); + $file.find('td:first>.favorite').replaceWith($icon); + return $icon; + }, + actionHandler: function(fileName, context) { + var $actionEl = context.$file.find('.action-favorite'); + var $file = context.$file; + var dir = context.dir || context.fileList.getCurrentDirectory(); + var tags = $file.attr('data-tags'); + if (_.isUndefined(tags)) { + tags = ''; + } + tags = tags.split('|'); + tags = _.without(tags, ''); + var isFavorite = tags.indexOf(OC.TAG_FAVORITE) >= 0; + if (isFavorite) { + // remove tag from list + tags = _.without(tags, OC.TAG_FAVORITE); + } else { + tags.push(OC.TAG_FAVORITE); + } + toggleStar($actionEl, !isFavorite); + + self.applyFileTags( + dir + '/' + fileName, + tags + ).then(function(result) { + // read latest state from result + toggleStar($actionEl, (result.tags.indexOf(OC.TAG_FAVORITE) >= 0)); + $file.attr('data-tags', tags.join('|')); + $file.attr('data-favorite', !isFavorite); + }); + } + }); + }, + + _extendFileList: function(fileList) { + // extend row prototype + fileList.$el.addClass('has-favorites'); + var oldCreateRow = fileList._createRow; + fileList._createRow = function(fileData) { + var $tr = oldCreateRow.apply(this, arguments); + if (fileData.tags) { + $tr.attr('data-tags', fileData.tags.join('|')); + if (fileData.tags.indexOf(OC.TAG_FAVORITE) >= 0) { + $tr.attr('data-favorite', true); + } + } + $tr.find('td:first').prepend('<div class="favorite"></div>'); + return $tr; + }; + }, + + attach: function(fileList) { + if (this.allowedLists.indexOf(fileList.id) < 0) { + return; + } + this._extendFileActions(fileList.fileActions); + this._extendFileList(fileList); + }, + + /** + * Replaces the given files' tags with the specified ones. + * + * @param {String} fileName path to the file or folder to tag + * @param {Array.<String>} tagNames array of tag names + */ + applyFileTags: function(fileName, tagNames) { + var encodedPath = OC.encodePath(fileName); + while (encodedPath[0] === '/') { + encodedPath = encodedPath.substr(1); + } + return $.ajax({ + url: OC.generateUrl('/apps/files/api/v1/files/') + encodedPath, + contentType: 'application/json', + data: JSON.stringify({ + tags: tagNames || [] + }), + dataType: 'json', + type: 'POST' + }); + } + }; +})(OCA); + +OC.Plugins.register('OCA.Files.FileList', OCA.Files.TagsPlugin); + diff --git a/apps/files/js/upload.js b/apps/files/js/upload.js index 617cf4b1c1d..518608615e0 100644 --- a/apps/files/js/upload.js +++ b/apps/files/js/upload.js @@ -8,7 +8,6 @@ * */ -/* global OC */ function Upload(fileSelector) { if ($.support.xhrFileUpload) { return new XHRUpload(fileSelector.target.files); diff --git a/apps/files/l10n/ach.js b/apps/files/l10n/ach.js index f085469f731..deae17398bd 100644 --- a/apps/files/l10n/ach.js +++ b/apps/files/l10n/ach.js @@ -3,6 +3,7 @@ OC.L10N.register( { "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""] }, "nplurals=2; plural=(n > 1);"); diff --git a/apps/files/l10n/ach.json b/apps/files/l10n/ach.json index ba9792477cd..dd9cfe83135 100644 --- a/apps/files/l10n/ach.json +++ b/apps/files/l10n/ach.json @@ -1,6 +1,7 @@ { "translations": { "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""] },"pluralForm" :"nplurals=2; plural=(n > 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/ady.js b/apps/files/l10n/ady.js index 329844854f1..560042b3efd 100644 --- a/apps/files/l10n/ady.js +++ b/apps/files/l10n/ady.js @@ -3,6 +3,7 @@ OC.L10N.register( { "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""] }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/ady.json b/apps/files/l10n/ady.json index 37156658a86..4cfa6a31b6e 100644 --- a/apps/files/l10n/ady.json +++ b/apps/files/l10n/ady.json @@ -1,6 +1,7 @@ { "translations": { "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""] },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/af_ZA.js b/apps/files/l10n/af_ZA.js index 1a4639183ed..8ac92002885 100644 --- a/apps/files/l10n/af_ZA.js +++ b/apps/files/l10n/af_ZA.js @@ -1,11 +1,13 @@ OC.L10N.register( "files", { - "Share" : "Deel", "Unshare" : "Deel terug neem", + "Error" : "Fout", "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], + "Settings" : "Instellings", "Folder" : "Omslag" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/af_ZA.json b/apps/files/l10n/af_ZA.json index 0e7116887f0..a1d6d1b69ed 100644 --- a/apps/files/l10n/af_ZA.json +++ b/apps/files/l10n/af_ZA.json @@ -1,9 +1,11 @@ { "translations": { - "Share" : "Deel", "Unshare" : "Deel terug neem", + "Error" : "Fout", "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], + "Settings" : "Instellings", "Folder" : "Omslag" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/ak.js b/apps/files/l10n/ak.js index 8ffacdcf2f3..46c5e83b98e 100644 --- a/apps/files/l10n/ak.js +++ b/apps/files/l10n/ak.js @@ -3,6 +3,7 @@ OC.L10N.register( { "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""] }, "nplurals=2; plural=n > 1;"); diff --git a/apps/files/l10n/ak.json b/apps/files/l10n/ak.json index 63d087f769b..d9cd8e42001 100644 --- a/apps/files/l10n/ak.json +++ b/apps/files/l10n/ak.json @@ -1,6 +1,7 @@ { "translations": { "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""] },"pluralForm" :"nplurals=2; plural=n > 1;" }
\ No newline at end of file diff --git a/apps/files/l10n/am_ET.js b/apps/files/l10n/am_ET.js index 329844854f1..560042b3efd 100644 --- a/apps/files/l10n/am_ET.js +++ b/apps/files/l10n/am_ET.js @@ -3,6 +3,7 @@ OC.L10N.register( { "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""] }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/am_ET.json b/apps/files/l10n/am_ET.json index 37156658a86..4cfa6a31b6e 100644 --- a/apps/files/l10n/am_ET.json +++ b/apps/files/l10n/am_ET.json @@ -1,6 +1,7 @@ { "translations": { "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""] },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/ar.js b/apps/files/l10n/ar.js index aaa4f1aa2be..a8da49aca92 100644 --- a/apps/files/l10n/ar.js +++ b/apps/files/l10n/ar.js @@ -21,16 +21,16 @@ OC.L10N.register( "Upload failed. Could not get file info." : "فشلت عملية الرفع. تعذر الحصول على معلومات الملف.", "Invalid directory." : "مسار غير صحيح.", "Files" : "الملفات", + "Favorites" : "المفضلة ", + "Home" : "البيت", "Unable to upload {filename} as it is a directory or has 0 bytes" : "تعذر رفع الملف {filename} إما لأنه مجلد أو لان حجم الملف 0 بايت", "Upload cancelled." : "تم إلغاء عملية رفع الملفات .", "Could not get result from server." : "تعذر الحصول على نتيجة من الخادم", "File upload is in progress. Leaving the page now will cancel the upload." : "عملية رفع الملفات قيد التنفيذ. اغلاق الصفحة سوف يلغي عملية رفع الملفات.", "{new_name} already exists" : "{new_name} موجود مسبقا", - "Share" : "شارك", + "Rename" : "إعادة تسميه", "Delete" : "إلغاء", "Unshare" : "إلغاء المشاركة", - "Delete permanently" : "حذف بشكل دائم", - "Rename" : "إعادة تسميه", "Pending" : "قيد الانتظار", "Error moving file" : "حدث خطأ أثناء نقل الملف", "Error" : "خطأ", @@ -45,12 +45,15 @@ OC.L10N.register( "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "تم تمكين تشفير البرامج لكن لم يتم تهيئة المفاتيح لذا يرجى تسجيل الخروج ثم تسجيل الدخول مرة آخرى.", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "المفتاح الخاص بتشفير التطبيقات غير صالح. يرجى تحديث كلمة السر الخاصة بالمفتاح الخاص من الإعدادت الشخصية حتى تتمكن من الوصول للملفات المشفرة.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "تم تعطيل التشفير لكن ملفاتك لا تزال مشفرة. فضلا اذهب إلى الإعدادات الشخصية لإزالة التشفير عن ملفاتك.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["","","","","",""], "{dirs} and {files}" : "{dirs} و {files}", + "Favorite" : "المفضلة", "%s could not be renamed" : "%s لا يمكن إعادة تسميته. ", "File handling" : "التعامل مع الملف", "Maximum upload size" : "الحد الأقصى لحجم الملفات التي يمكن رفعها", "max. possible: " : "الحد الأقصى المسموح به", "Save" : "حفظ", + "Settings" : "إعدادات", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "استخدم هذا العنوان لـ <a href=\"%s\" target=\"_blank\">الدخول الى ملفاتك عن طريق WebDAV</a>", "New" : "جديد", @@ -58,7 +61,8 @@ OC.L10N.register( "New folder" : "مجلد جديد", "Folder" : "مجلد", "From link" : "من رابط", - "Nothing in here. Upload something!" : "لا يوجد شيء هنا. إرفع بعض الملفات!", + "Upload" : "رفع", + "Cancel upload" : "إلغاء الرفع", "Download" : "تحميل", "Upload too large" : "حجم الترفيع أعلى من المسموح", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "حجم الملفات التي تريد ترفيعها أعلى من المسموح على الخادم.", diff --git a/apps/files/l10n/ar.json b/apps/files/l10n/ar.json index 8e6b863bb0d..9b35b4fd136 100644 --- a/apps/files/l10n/ar.json +++ b/apps/files/l10n/ar.json @@ -19,16 +19,16 @@ "Upload failed. Could not get file info." : "فشلت عملية الرفع. تعذر الحصول على معلومات الملف.", "Invalid directory." : "مسار غير صحيح.", "Files" : "الملفات", + "Favorites" : "المفضلة ", + "Home" : "البيت", "Unable to upload {filename} as it is a directory or has 0 bytes" : "تعذر رفع الملف {filename} إما لأنه مجلد أو لان حجم الملف 0 بايت", "Upload cancelled." : "تم إلغاء عملية رفع الملفات .", "Could not get result from server." : "تعذر الحصول على نتيجة من الخادم", "File upload is in progress. Leaving the page now will cancel the upload." : "عملية رفع الملفات قيد التنفيذ. اغلاق الصفحة سوف يلغي عملية رفع الملفات.", "{new_name} already exists" : "{new_name} موجود مسبقا", - "Share" : "شارك", + "Rename" : "إعادة تسميه", "Delete" : "إلغاء", "Unshare" : "إلغاء المشاركة", - "Delete permanently" : "حذف بشكل دائم", - "Rename" : "إعادة تسميه", "Pending" : "قيد الانتظار", "Error moving file" : "حدث خطأ أثناء نقل الملف", "Error" : "خطأ", @@ -43,12 +43,15 @@ "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "تم تمكين تشفير البرامج لكن لم يتم تهيئة المفاتيح لذا يرجى تسجيل الخروج ثم تسجيل الدخول مرة آخرى.", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "المفتاح الخاص بتشفير التطبيقات غير صالح. يرجى تحديث كلمة السر الخاصة بالمفتاح الخاص من الإعدادت الشخصية حتى تتمكن من الوصول للملفات المشفرة.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "تم تعطيل التشفير لكن ملفاتك لا تزال مشفرة. فضلا اذهب إلى الإعدادات الشخصية لإزالة التشفير عن ملفاتك.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["","","","","",""], "{dirs} and {files}" : "{dirs} و {files}", + "Favorite" : "المفضلة", "%s could not be renamed" : "%s لا يمكن إعادة تسميته. ", "File handling" : "التعامل مع الملف", "Maximum upload size" : "الحد الأقصى لحجم الملفات التي يمكن رفعها", "max. possible: " : "الحد الأقصى المسموح به", "Save" : "حفظ", + "Settings" : "إعدادات", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "استخدم هذا العنوان لـ <a href=\"%s\" target=\"_blank\">الدخول الى ملفاتك عن طريق WebDAV</a>", "New" : "جديد", @@ -56,7 +59,8 @@ "New folder" : "مجلد جديد", "Folder" : "مجلد", "From link" : "من رابط", - "Nothing in here. Upload something!" : "لا يوجد شيء هنا. إرفع بعض الملفات!", + "Upload" : "رفع", + "Cancel upload" : "إلغاء الرفع", "Download" : "تحميل", "Upload too large" : "حجم الترفيع أعلى من المسموح", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "حجم الملفات التي تريد ترفيعها أعلى من المسموح على الخادم.", diff --git a/apps/files/l10n/ast.js b/apps/files/l10n/ast.js index ae0b0731572..60fb6c6f684 100644 --- a/apps/files/l10n/ast.js +++ b/apps/files/l10n/ast.js @@ -35,6 +35,8 @@ OC.L10N.register( "Invalid directory." : "Direutoriu non válidu.", "Files" : "Ficheros", "All files" : "Tolos ficheros", + "Favorites" : "Favoritos", + "Home" : "Casa", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Nun pudo xubise {filename}, paez que ye un directoriu o tien 0 bytes", "Total file size {size1} exceeds upload limit {size2}" : "El tamañu de ficheru total {size1} perpasa la llende de xuba {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nun hai abondu espaciu llibre, tas xubiendo {size1} pero namái falta {size2}", @@ -46,12 +48,10 @@ OC.L10N.register( "Could not create file" : "Nun pudo crease'l ficheru", "Could not create folder" : "Nun pudo crease la carpeta", "Error fetching URL" : "Fallu obteniendo URL", - "Share" : "Compartir", + "Rename" : "Renomar", "Delete" : "Desaniciar", "Disconnect storage" : "Desconeutar almacenamientu", "Unshare" : "Dexar de compartir", - "Delete permanently" : "Desaniciar dafechu", - "Rename" : "Renomar", "Pending" : "Pendiente", "Error moving file." : "Fallu moviendo'l ficheru.", "Error moving file" : "Fallu moviendo'l ficheru", @@ -71,7 +71,9 @@ OC.L10N.register( "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "L'aplicación Encryption ta habilitada pero les tos claves nun s'aniciaron, por favor zarra sesión y aníciala de nueves", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Clave privada non válida pa Encryption. Por favor, anueva la to contraseña de clave nos tos axustes personales pa recuperar l'accesu a los tos ficheros cifraos.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Deshabilitose'l cifráu pero los tos ficheros tovía tán cifraos. Por favor, vete a los axustes personales pa descrifrar los tos ficheros.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "{dirs} and {files}" : "{dirs} y {files}", + "Favorite" : "Favoritu", "%s could not be renamed as it has been deleted" : "%s nun pue renomase dempués de desaniciase", "%s could not be renamed" : "Nun se puede renomar %s ", "Upload (max. %s)" : "Xuba (máx. %s)", @@ -79,6 +81,7 @@ OC.L10N.register( "Maximum upload size" : "Tamañu máximu de xubida", "max. possible: " : "máx. posible:", "Save" : "Guardar", + "Settings" : "Axustes", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Usa esta direición <a href=\"%s\" target=\"_blank\">p'acceder a los ficheros a traviés de WebDAV</a>", "New" : "Nuevu", @@ -87,7 +90,8 @@ OC.L10N.register( "New folder" : "Nueva carpeta", "Folder" : "Carpeta", "From link" : "Dende enllaz", - "Nothing in here. Upload something!" : "Nun hai nada equí. ¡Xubi daqué!", + "Upload" : "Xubir", + "Cancel upload" : "Encaboxar xuba", "Download" : "Descargar", "Upload too large" : "La xuba ye abondo grande", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los ficheros que tas intentando xubir perpasen el tamañu máximu pa les xubíes de ficheros nesti servidor.", diff --git a/apps/files/l10n/ast.json b/apps/files/l10n/ast.json index 81d20a51c36..07dfc88c027 100644 --- a/apps/files/l10n/ast.json +++ b/apps/files/l10n/ast.json @@ -33,6 +33,8 @@ "Invalid directory." : "Direutoriu non válidu.", "Files" : "Ficheros", "All files" : "Tolos ficheros", + "Favorites" : "Favoritos", + "Home" : "Casa", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Nun pudo xubise {filename}, paez que ye un directoriu o tien 0 bytes", "Total file size {size1} exceeds upload limit {size2}" : "El tamañu de ficheru total {size1} perpasa la llende de xuba {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nun hai abondu espaciu llibre, tas xubiendo {size1} pero namái falta {size2}", @@ -44,12 +46,10 @@ "Could not create file" : "Nun pudo crease'l ficheru", "Could not create folder" : "Nun pudo crease la carpeta", "Error fetching URL" : "Fallu obteniendo URL", - "Share" : "Compartir", + "Rename" : "Renomar", "Delete" : "Desaniciar", "Disconnect storage" : "Desconeutar almacenamientu", "Unshare" : "Dexar de compartir", - "Delete permanently" : "Desaniciar dafechu", - "Rename" : "Renomar", "Pending" : "Pendiente", "Error moving file." : "Fallu moviendo'l ficheru.", "Error moving file" : "Fallu moviendo'l ficheru", @@ -69,7 +69,9 @@ "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "L'aplicación Encryption ta habilitada pero les tos claves nun s'aniciaron, por favor zarra sesión y aníciala de nueves", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Clave privada non válida pa Encryption. Por favor, anueva la to contraseña de clave nos tos axustes personales pa recuperar l'accesu a los tos ficheros cifraos.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Deshabilitose'l cifráu pero los tos ficheros tovía tán cifraos. Por favor, vete a los axustes personales pa descrifrar los tos ficheros.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "{dirs} and {files}" : "{dirs} y {files}", + "Favorite" : "Favoritu", "%s could not be renamed as it has been deleted" : "%s nun pue renomase dempués de desaniciase", "%s could not be renamed" : "Nun se puede renomar %s ", "Upload (max. %s)" : "Xuba (máx. %s)", @@ -77,6 +79,7 @@ "Maximum upload size" : "Tamañu máximu de xubida", "max. possible: " : "máx. posible:", "Save" : "Guardar", + "Settings" : "Axustes", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Usa esta direición <a href=\"%s\" target=\"_blank\">p'acceder a los ficheros a traviés de WebDAV</a>", "New" : "Nuevu", @@ -85,7 +88,8 @@ "New folder" : "Nueva carpeta", "Folder" : "Carpeta", "From link" : "Dende enllaz", - "Nothing in here. Upload something!" : "Nun hai nada equí. ¡Xubi daqué!", + "Upload" : "Xubir", + "Cancel upload" : "Encaboxar xuba", "Download" : "Descargar", "Upload too large" : "La xuba ye abondo grande", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los ficheros que tas intentando xubir perpasen el tamañu máximu pa les xubíes de ficheros nesti servidor.", diff --git a/apps/files/l10n/az.js b/apps/files/l10n/az.js index 08e19809811..b4e44362ba5 100644 --- a/apps/files/l10n/az.js +++ b/apps/files/l10n/az.js @@ -46,19 +46,21 @@ OC.L10N.register( "Could not create file" : "Faylı yaratmaq olmur", "Could not create folder" : "Qovluğu yaratmaq olmur", "Error fetching URL" : "URL-in gətirilməsində səhv baş verdi", - "Share" : "Yayımla", - "Delete" : "Sil", "Rename" : "Adı dəyiş", + "Delete" : "Sil", "Error" : "Səhv", "Name" : "Ad", "Size" : "Həcm", "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "Save" : "Saxlamaq", + "Settings" : "Quraşdırmalar", "New folder" : "Yeni qovluq", "Folder" : "Qovluq", - "Nothing in here. Upload something!" : "Burda heçnə yoxdur. Nese yükləyin!", + "Upload" : "Serverə yüklə", + "Cancel upload" : "Yüklənməni dayandır", "Download" : "Yüklə" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/az.json b/apps/files/l10n/az.json index 591ec63e31e..d0e6808e9eb 100644 --- a/apps/files/l10n/az.json +++ b/apps/files/l10n/az.json @@ -44,19 +44,21 @@ "Could not create file" : "Faylı yaratmaq olmur", "Could not create folder" : "Qovluğu yaratmaq olmur", "Error fetching URL" : "URL-in gətirilməsində səhv baş verdi", - "Share" : "Yayımla", - "Delete" : "Sil", "Rename" : "Adı dəyiş", + "Delete" : "Sil", "Error" : "Səhv", "Name" : "Ad", "Size" : "Həcm", "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "Save" : "Saxlamaq", + "Settings" : "Quraşdırmalar", "New folder" : "Yeni qovluq", "Folder" : "Qovluq", - "Nothing in here. Upload something!" : "Burda heçnə yoxdur. Nese yükləyin!", + "Upload" : "Serverə yüklə", + "Cancel upload" : "Yüklənməni dayandır", "Download" : "Yüklə" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/be.js b/apps/files/l10n/be.js index bf634ae5aef..40597a72ea5 100644 --- a/apps/files/l10n/be.js +++ b/apps/files/l10n/be.js @@ -4,6 +4,8 @@ OC.L10N.register( "Error" : "Памылка", "_%n folder_::_%n folders_" : ["","","",""], "_%n file_::_%n files_" : ["","","",""], - "_Uploading %n file_::_Uploading %n files_" : ["","","",""] + "_Uploading %n file_::_Uploading %n files_" : ["","","",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["","","",""], + "Settings" : "Налады" }, "nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/apps/files/l10n/be.json b/apps/files/l10n/be.json index 0718404760d..fa807003af8 100644 --- a/apps/files/l10n/be.json +++ b/apps/files/l10n/be.json @@ -2,6 +2,8 @@ "Error" : "Памылка", "_%n folder_::_%n folders_" : ["","","",""], "_%n file_::_%n files_" : ["","","",""], - "_Uploading %n file_::_Uploading %n files_" : ["","","",""] + "_Uploading %n file_::_Uploading %n files_" : ["","","",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["","","",""], + "Settings" : "Налады" },"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" }
\ No newline at end of file diff --git a/apps/files/l10n/bg_BG.js b/apps/files/l10n/bg_BG.js index 24e148c9c63..3b6a85822a3 100644 --- a/apps/files/l10n/bg_BG.js +++ b/apps/files/l10n/bg_BG.js @@ -35,6 +35,8 @@ OC.L10N.register( "Invalid directory." : "Невалидна директория.", "Files" : "Файлове", "All files" : "Всички файлове", + "Favorites" : "Любими", + "Home" : "Домашен", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Неуспешно качване на {filename}, защото е директория или е с размер от 0 байта.", "Total file size {size1} exceeds upload limit {size2}" : "Общия размер {size1} надминава лимита за качване {size2}.", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Няма достатъчно свободно място, ти се опитваш да качиш {size1}, но са останали само {size2}.", @@ -46,12 +48,10 @@ OC.L10N.register( "Could not create file" : "Несупешно създаване на файла.", "Could not create folder" : "Неуспешно създаване на папка.", "Error fetching URL" : "Грешка при отварянето на интернет адреса.", - "Share" : "Сподели", + "Rename" : "Преименуване", "Delete" : "Изтрий", "Disconnect storage" : "Извади дисковото устройство.", "Unshare" : "Премахни Споделяне", - "Delete permanently" : "Изтрий завинаги", - "Rename" : "Преименуване", "Pending" : "Чакащо", "Error moving file." : "Грешка при местенето на файла.", "Error moving file" : "Грешка при преместването на файла.", @@ -71,7 +71,9 @@ OC.L10N.register( "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Програмата за криптиране е включена, но твоите ключове не са зададени, моля отпиши си и се впиши отново.", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Невалиден личен ключ за Криптиращата Програма. Моля, обнови личния си ключ в Лични настройки, за да възстановиш достъпа до криптираните си файловете.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Криптирането е изключено, но файлове ти са все още защитени. Моля, отиди на лични найстройки, за да разшфроваш файловете.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "{dirs} and {files}" : "{dirs} и {files}", + "Favorite" : "Любими", "%s could not be renamed as it has been deleted" : "%s не може да бъде преименуван, защото е вече изтрит", "%s could not be renamed" : "%s не може да бъде преименуван.", "Upload (max. %s)" : "Качи (макс. %s)", @@ -79,6 +81,7 @@ OC.L10N.register( "Maximum upload size" : "Максимален размер", "max. possible: " : "максимално:", "Save" : "Запис", + "Settings" : "Настройки", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Използвай този адрес, за да получиш <a href=\"%s\" target=\"_blank\">достъп до своите файлове чрез WebDAV</a>.", "New" : "Създай", @@ -87,11 +90,12 @@ OC.L10N.register( "New folder" : "Нова папка", "Folder" : "Папка", "From link" : "От връзка", - "Nothing in here. Upload something!" : "Тук няма нищо. Качи нещо!", + "Upload" : "Качване", + "Cancel upload" : "Отказване на качването", "Download" : "Изтегли", "Upload too large" : "Прекалено голям файл за качване.", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Файловете, които се опитваш да качиш са по-големи от позволеното на този сървър.", "Files are being scanned, please wait." : "Файловете се сканирват, изчакайте.", - "Currently scanning" : "В момента се сканирва." + "Currently scanning" : "В момента се търси" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/bg_BG.json b/apps/files/l10n/bg_BG.json index 451cc21ae7b..eb63096dd4d 100644 --- a/apps/files/l10n/bg_BG.json +++ b/apps/files/l10n/bg_BG.json @@ -33,6 +33,8 @@ "Invalid directory." : "Невалидна директория.", "Files" : "Файлове", "All files" : "Всички файлове", + "Favorites" : "Любими", + "Home" : "Домашен", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Неуспешно качване на {filename}, защото е директория или е с размер от 0 байта.", "Total file size {size1} exceeds upload limit {size2}" : "Общия размер {size1} надминава лимита за качване {size2}.", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Няма достатъчно свободно място, ти се опитваш да качиш {size1}, но са останали само {size2}.", @@ -44,12 +46,10 @@ "Could not create file" : "Несупешно създаване на файла.", "Could not create folder" : "Неуспешно създаване на папка.", "Error fetching URL" : "Грешка при отварянето на интернет адреса.", - "Share" : "Сподели", + "Rename" : "Преименуване", "Delete" : "Изтрий", "Disconnect storage" : "Извади дисковото устройство.", "Unshare" : "Премахни Споделяне", - "Delete permanently" : "Изтрий завинаги", - "Rename" : "Преименуване", "Pending" : "Чакащо", "Error moving file." : "Грешка при местенето на файла.", "Error moving file" : "Грешка при преместването на файла.", @@ -69,7 +69,9 @@ "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Програмата за криптиране е включена, но твоите ключове не са зададени, моля отпиши си и се впиши отново.", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Невалиден личен ключ за Криптиращата Програма. Моля, обнови личния си ключ в Лични настройки, за да възстановиш достъпа до криптираните си файловете.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Криптирането е изключено, но файлове ти са все още защитени. Моля, отиди на лични найстройки, за да разшфроваш файловете.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "{dirs} and {files}" : "{dirs} и {files}", + "Favorite" : "Любими", "%s could not be renamed as it has been deleted" : "%s не може да бъде преименуван, защото е вече изтрит", "%s could not be renamed" : "%s не може да бъде преименуван.", "Upload (max. %s)" : "Качи (макс. %s)", @@ -77,6 +79,7 @@ "Maximum upload size" : "Максимален размер", "max. possible: " : "максимално:", "Save" : "Запис", + "Settings" : "Настройки", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Използвай този адрес, за да получиш <a href=\"%s\" target=\"_blank\">достъп до своите файлове чрез WebDAV</a>.", "New" : "Създай", @@ -85,11 +88,12 @@ "New folder" : "Нова папка", "Folder" : "Папка", "From link" : "От връзка", - "Nothing in here. Upload something!" : "Тук няма нищо. Качи нещо!", + "Upload" : "Качване", + "Cancel upload" : "Отказване на качването", "Download" : "Изтегли", "Upload too large" : "Прекалено голям файл за качване.", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Файловете, които се опитваш да качиш са по-големи от позволеното на този сървър.", "Files are being scanned, please wait." : "Файловете се сканирват, изчакайте.", - "Currently scanning" : "В момента се сканирва." + "Currently scanning" : "В момента се търси" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/bn_BD.js b/apps/files/l10n/bn_BD.js index bf2ecc2f660..376d1dc9d50 100644 --- a/apps/files/l10n/bn_BD.js +++ b/apps/files/l10n/bn_BD.js @@ -29,13 +29,14 @@ OC.L10N.register( "Invalid directory." : "ভুল ডিরেক্টরি", "Files" : "ফাইল", "All files" : "সব ফাইল", + "Favorites" : "প্রিয়জন", + "Home" : "নিবাস", "Upload cancelled." : "আপলোড বাতিল করা হয়েছে।", "File upload is in progress. Leaving the page now will cancel the upload." : "ফাইল আপলোড চলমান। এই পৃষ্ঠা পরিত্যাগ করলে আপলোড বাতিল করা হবে।", "{new_name} already exists" : "{new_name} টি বিদ্যমান", - "Share" : "ভাগাভাগি কর", + "Rename" : "পূনঃনামকরণ", "Delete" : "মুছে", "Unshare" : "ভাগাভাগি বাতিল ", - "Rename" : "পূনঃনামকরণ", "Pending" : "মুলতুবি", "Error moving file." : "ফাইল সরাতে সমস্যা হলো।", "Error moving file" : "ফাইল সরাতে সমস্যা হলো", @@ -49,17 +50,21 @@ OC.L10N.register( "_Uploading %n file_::_Uploading %n files_" : ["%n ফাইল আপলোড হচ্ছে","%n ফাইল আপলোড হচ্ছে"], "\"{name}\" is an invalid file name." : "\"{name}\" টি একটি অননুমোদিত ফাইল নাম।", "Your storage is almost full ({usedSpacePercent}%)" : "আপনার সংরক্ষণাধার প্রায় পরিপূর্ণ ({usedSpacePercent}%) ", + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], + "Favorite" : "প্রিয়জন", "File handling" : "ফাইল হ্যার্ডলিং", "Maximum upload size" : "আপলোডের সর্বোচ্চ আকার", "max. possible: " : "অনুমোদিত সর্বোচ্চ আকার", "Save" : "সংরক্ষণ", + "Settings" : "নিয়ামকসমূহ", "WebDAV" : "WebDAV", "New" : "নতুন", "Text file" : "টেক্সট ফাইল", "New folder" : "নব ফােলডার", "Folder" : "ফোল্ডার", "From link" : " লিংক থেকে", - "Nothing in here. Upload something!" : "এখানে কিছুই নেই। কিছু আপলোড করুন !", + "Upload" : "আপলোড", + "Cancel upload" : "আপলোড বাতিল কর", "Download" : "ডাউনলোড", "Upload too large" : "আপলোডের আকারটি অনেক বড়", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "আপনি এই সার্ভারে আপলোড করার জন্য অনুমোদিত ফাইলের সর্বোচ্চ আকারের চেয়ে বৃহদাকার ফাইল আপলোড করার চেষ্টা করছেন ", diff --git a/apps/files/l10n/bn_BD.json b/apps/files/l10n/bn_BD.json index 35db36b61fa..bea260ae8a3 100644 --- a/apps/files/l10n/bn_BD.json +++ b/apps/files/l10n/bn_BD.json @@ -27,13 +27,14 @@ "Invalid directory." : "ভুল ডিরেক্টরি", "Files" : "ফাইল", "All files" : "সব ফাইল", + "Favorites" : "প্রিয়জন", + "Home" : "নিবাস", "Upload cancelled." : "আপলোড বাতিল করা হয়েছে।", "File upload is in progress. Leaving the page now will cancel the upload." : "ফাইল আপলোড চলমান। এই পৃষ্ঠা পরিত্যাগ করলে আপলোড বাতিল করা হবে।", "{new_name} already exists" : "{new_name} টি বিদ্যমান", - "Share" : "ভাগাভাগি কর", + "Rename" : "পূনঃনামকরণ", "Delete" : "মুছে", "Unshare" : "ভাগাভাগি বাতিল ", - "Rename" : "পূনঃনামকরণ", "Pending" : "মুলতুবি", "Error moving file." : "ফাইল সরাতে সমস্যা হলো।", "Error moving file" : "ফাইল সরাতে সমস্যা হলো", @@ -47,17 +48,21 @@ "_Uploading %n file_::_Uploading %n files_" : ["%n ফাইল আপলোড হচ্ছে","%n ফাইল আপলোড হচ্ছে"], "\"{name}\" is an invalid file name." : "\"{name}\" টি একটি অননুমোদিত ফাইল নাম।", "Your storage is almost full ({usedSpacePercent}%)" : "আপনার সংরক্ষণাধার প্রায় পরিপূর্ণ ({usedSpacePercent}%) ", + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], + "Favorite" : "প্রিয়জন", "File handling" : "ফাইল হ্যার্ডলিং", "Maximum upload size" : "আপলোডের সর্বোচ্চ আকার", "max. possible: " : "অনুমোদিত সর্বোচ্চ আকার", "Save" : "সংরক্ষণ", + "Settings" : "নিয়ামকসমূহ", "WebDAV" : "WebDAV", "New" : "নতুন", "Text file" : "টেক্সট ফাইল", "New folder" : "নব ফােলডার", "Folder" : "ফোল্ডার", "From link" : " লিংক থেকে", - "Nothing in here. Upload something!" : "এখানে কিছুই নেই। কিছু আপলোড করুন !", + "Upload" : "আপলোড", + "Cancel upload" : "আপলোড বাতিল কর", "Download" : "ডাউনলোড", "Upload too large" : "আপলোডের আকারটি অনেক বড়", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "আপনি এই সার্ভারে আপলোড করার জন্য অনুমোদিত ফাইলের সর্বোচ্চ আকারের চেয়ে বৃহদাকার ফাইল আপলোড করার চেষ্টা করছেন ", diff --git a/apps/files/l10n/bn_IN.js b/apps/files/l10n/bn_IN.js index 320ef37a8f9..ff8fb32f86c 100644 --- a/apps/files/l10n/bn_IN.js +++ b/apps/files/l10n/bn_IN.js @@ -14,10 +14,8 @@ OC.L10N.register( "Not enough storage available" : "যথেষ্ট স্টোরেজ পাওয়া যায় না", "Invalid directory." : "অবৈধ ডিরেক্টরি।", "Files" : "ফাইলস", - "Share" : "শেয়ার", - "Delete" : "মুছে ফেলা", - "Delete permanently" : "স্থায়ীভাবে মুছে দিন", "Rename" : "পুনঃনামকরণ", + "Delete" : "মুছে ফেলা", "Pending" : "মুলতুবি", "Error" : "ভুল", "Name" : "নাম", @@ -25,7 +23,9 @@ OC.L10N.register( "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "Save" : "সেভ", + "Settings" : "সেটিংস", "New folder" : "নতুন ফোল্ডার", "Folder" : "ফোল্ডার", "Download" : "ডাউনলোড করুন" diff --git a/apps/files/l10n/bn_IN.json b/apps/files/l10n/bn_IN.json index 7b6528c38a9..92051318585 100644 --- a/apps/files/l10n/bn_IN.json +++ b/apps/files/l10n/bn_IN.json @@ -12,10 +12,8 @@ "Not enough storage available" : "যথেষ্ট স্টোরেজ পাওয়া যায় না", "Invalid directory." : "অবৈধ ডিরেক্টরি।", "Files" : "ফাইলস", - "Share" : "শেয়ার", - "Delete" : "মুছে ফেলা", - "Delete permanently" : "স্থায়ীভাবে মুছে দিন", "Rename" : "পুনঃনামকরণ", + "Delete" : "মুছে ফেলা", "Pending" : "মুলতুবি", "Error" : "ভুল", "Name" : "নাম", @@ -23,7 +21,9 @@ "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "Save" : "সেভ", + "Settings" : "সেটিংস", "New folder" : "নতুন ফোল্ডার", "Folder" : "ফোল্ডার", "Download" : "ডাউনলোড করুন" diff --git a/apps/files/l10n/bs.js b/apps/files/l10n/bs.js index 1ce26f916a2..11bc8d73580 100644 --- a/apps/files/l10n/bs.js +++ b/apps/files/l10n/bs.js @@ -1,14 +1,109 @@ OC.L10N.register( "files", { - "Share" : "Podijeli", + "Storage not available" : "Pohrana je nedostupna", + "Storage invalid" : "Pohrana je neispravna", + "Unknown error" : "Nepoznata greška", + "Could not move %s - File with this name already exists" : "Nemoguće premjestiti %s - Datoteka takvog naziva već postoji", + "Could not move %s" : "Nemoguće premjestiti %s", + "Permission denied" : "Nemate ovlaštenje", + "File name cannot be empty." : "Naziv datoteke ne može biti prazan", + "\"%s\" is an invalid file name." : "\"%s\" nije validan naziv datoteke.", + "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." : "Neispravan naziv, '\\', '/', '<', '>', ':', '\"', '|', '?' i '*' nisu dozvoljeni.", + "The target folder has been moved or deleted." : "Ciljni direktorij je premješten ili izbrisan.", + "The name %s is already used in the folder %s. Please choose a different name." : "Naziv %s je već iskorišten u direktoriju %s. Molim odaberite drugi naziv.", + "Not a valid source" : "Izvor nije valjan", + "Server is not allowed to open URLs, please check the server configuration" : "Server nema dozvolu za otvaranje URL-ova, molim provjerite konfiguraciju servera", + "The file exceeds your quota by %s" : "Datoteka prelazi vašu kvotu za %s", + "Error while downloading %s to %s" : "Greška pri prenošenju %s u %s", + "Error when creating the file" : "Greška pri kreiranju datoteke", + "Folder name cannot be empty." : "Naziv direktorija ne može biti prazan.", + "Error when creating the folder" : "Greška pri kreiranju direktorija", + "Unable to set upload directory." : "Odredba direktorija učitavanja nije moguća.", + "Invalid Token" : "Neispravan Znak", + "No file was uploaded. Unknown error" : "Nijedna datoteka nije učitana. Nepoznata greška.", + "There is no error, the file uploaded with success" : "Nema greške, datoteka je uspješno učitana.", + "The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "Učitana datoteka prelazi maksimalnu dopuštenu veličinu datoteke upload_max_filesize navedenu u php. ini: ", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Učitana datoteka premašuje maksimalnu dopuštenu veličinu datoteke MAX_FILE_SIZE navedenu u HTML formi", + "The uploaded file was only partially uploaded" : "Učitana datoteka je samo djelomično učitana", + "No file was uploaded" : "Nijedna datoteka nije učitana.", + "Missing a temporary folder" : "Nedostaje privremeni direktorij.", + "Failed to write to disk" : "Zapisivanje na disk nije uspjelo.", + "Not enough storage available" : "Prostor za pohranu je nedovoljan", + "Upload failed. Could not find uploaded file" : "Neuspješno učitavanje. Nije pronađena učitana dataoteka", + "Upload failed. Could not get file info." : "Neuspješno učitavanje. Nedostupne informacije o datoteci.", + "Invalid directory." : "Neispravan direktorij.", + "Files" : "Datoteke", + "All files" : "Sve datoteke", + "Favorites" : "Favoriti", + "Home" : "Kuća", + "Unable to upload {filename} as it is a directory or has 0 bytes" : "Nemoguće učitati {filename} jer je ili direktorij ili ima 0 bajta", + "Total file size {size1} exceeds upload limit {size2}" : "Ukupna veličina datoteke {size1} prelazi ograničenje unosa {size2}", + "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nedovoljno slobodnog prostora, vi učitavate {size1} a samo je {size2} preostalo", + "Upload cancelled." : "Učitavanje je prekinuto.", + "Could not get result from server." : "Nemoguće dobiti rezultat od servera.", + "File upload is in progress. Leaving the page now will cancel the upload." : "Učitavanje datoteke je u toku. Napuštanje stranice prekinut će učitavanje.", + "URL cannot be empty" : "URL ne može biti prazan", + "{new_name} already exists" : "{new_name} već postoji", + "Could not create file" : "Datoteku nije moguće kreirati", + "Could not create folder" : "Direktorij nije moguće kreirati", + "Error fetching URL" : "Pogrešan dohvat URL", + "Rename" : "Preimenuj", + "Delete" : "Izbriši", + "Disconnect storage" : "Diskonektuj pohranu", + "Unshare" : "Prestani dijeliti", + "Select" : "Izaberi", + "Pending" : "Na čekanju", + "Unable to determine date" : "Nemoguće odrediti datum", + "Error moving file." : "Greška pri premještanju datoteke", + "Error moving file" : "Greška pri premještanju datoteke", + "Error" : "Greška", + "Could not rename file" : "Nemoguće preimenovati datoteku", + "Error deleting file." : "Greška pri brisanju datoteke", "Name" : "Ime", "Size" : "Veličina", - "_%n folder_::_%n folders_" : ["","",""], - "_%n file_::_%n files_" : ["","",""], - "_Uploading %n file_::_Uploading %n files_" : ["","",""], + "Modified" : "Izmijenjeno", + "_%n folder_::_%n folders_" : ["direktorij","direktoriji","direktoriji"], + "_%n file_::_%n files_" : ["%n datoteka","%n datoteke","%n datoteke"], + "You don’t have permission to upload or create files here" : "Ovdje niste ovlašteni učitavati ili kreirati datoteke", + "_Uploading %n file_::_Uploading %n files_" : ["Prenosim %n datoteku","Prenosim %n datoteke","Prenosim %n datoteke"], + "\"{name}\" is an invalid file name." : "\"{name}\" je neispravno ime datoteke.", + "Your storage is full, files can not be updated or synced anymore!" : "Vaša pohrana je puna, datoteke više nije moguće ažurirati niti sinhronizirati!", + "Your storage is almost full ({usedSpacePercent}%)" : "Vaš prostor za pohranu je skoro pun ({usedSpacePercent}%)", + "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Aplikacija šifriranja je uključena, ali vaši ključevi nisu inicializirani, molim odjavite se i ponovno prijavite", + "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Neispravan privatni ključ za šifriranje. Molim ažurirajte lozinku svoga privatnog ključa u svojim osobnim postavkama da biste obnovili pristup svojim šifriranim datotekama.", + "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Šifriranje je onemogućeno, ali vaše su datoteke još uvijek šifrirane. Molimo, odite u osobne postavke da biste dešifrirali svoje datoteke.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["","",""], + "{dirs} and {files}" : "{dirs} i {files}", + "Favorited" : "Favorizovano", + "Favorite" : "Favorit", + "%s could not be renamed as it has been deleted" : "%s nije moguće preimenovati jer je izbrisan", + "%s could not be renamed" : "%s nije moguće preimenovati", + "Upload (max. %s)" : "Učitaj (max. %s)", + "File handling" : "Obrada datoteke", + "Maximum upload size" : "Maksimalna veličina učitavanja", + "max. possible: " : "max. moguće: ", "Save" : "Spasi", - "New folder" : "Nova fascikla", - "Folder" : "Fasikla" + "Settings" : "Postavke", + "WebDAV" : "WebDAV", + "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Koristi slijedeću adresu za <a href=\"%s\" target=\"_blank\">pristup vašim datotekama putem WebDAV-a</a>", + "New" : "Novo", + "New text file" : "Nova tekstualna datoteka", + "Text file" : "Tekstualna datoteka", + "New folder" : "Novi direktorij", + "Folder" : "Direktorij", + "From link" : "Od veze", + "Upload" : "Učitaj", + "Cancel upload" : "Prekini učitavanje", + "No files yet" : "Još nema datoteki", + "Upload some content or sync with your devices!" : "Učitaj neki sadržaj ili sinhronizuj sa tvojim uređajima!", + "Select all" : "Označi sve", + "Download" : "Preuzmi", + "Upload too large" : "Učitavanje je preveliko", + "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Datoteke koje pokušavate učitati prelaze maksimalnu veličinu za učitavanje datoteka na ovom serveru.", + "Files are being scanned, please wait." : "Datoteke se provjeravaju, molim pričekajte.", + "Currently scanning" : "Provjera u toku", + "No favorites" : "Nema favorita", + "Files and folders you mark as favorite will show up here" : "Datoteke i direktorij koje ste označili kao favorite će biti prikazane ovdje" }, "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/apps/files/l10n/bs.json b/apps/files/l10n/bs.json index 7c2d782d01c..6d122e5b294 100644 --- a/apps/files/l10n/bs.json +++ b/apps/files/l10n/bs.json @@ -1,12 +1,107 @@ { "translations": { - "Share" : "Podijeli", + "Storage not available" : "Pohrana je nedostupna", + "Storage invalid" : "Pohrana je neispravna", + "Unknown error" : "Nepoznata greška", + "Could not move %s - File with this name already exists" : "Nemoguće premjestiti %s - Datoteka takvog naziva već postoji", + "Could not move %s" : "Nemoguće premjestiti %s", + "Permission denied" : "Nemate ovlaštenje", + "File name cannot be empty." : "Naziv datoteke ne može biti prazan", + "\"%s\" is an invalid file name." : "\"%s\" nije validan naziv datoteke.", + "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." : "Neispravan naziv, '\\', '/', '<', '>', ':', '\"', '|', '?' i '*' nisu dozvoljeni.", + "The target folder has been moved or deleted." : "Ciljni direktorij je premješten ili izbrisan.", + "The name %s is already used in the folder %s. Please choose a different name." : "Naziv %s je već iskorišten u direktoriju %s. Molim odaberite drugi naziv.", + "Not a valid source" : "Izvor nije valjan", + "Server is not allowed to open URLs, please check the server configuration" : "Server nema dozvolu za otvaranje URL-ova, molim provjerite konfiguraciju servera", + "The file exceeds your quota by %s" : "Datoteka prelazi vašu kvotu za %s", + "Error while downloading %s to %s" : "Greška pri prenošenju %s u %s", + "Error when creating the file" : "Greška pri kreiranju datoteke", + "Folder name cannot be empty." : "Naziv direktorija ne može biti prazan.", + "Error when creating the folder" : "Greška pri kreiranju direktorija", + "Unable to set upload directory." : "Odredba direktorija učitavanja nije moguća.", + "Invalid Token" : "Neispravan Znak", + "No file was uploaded. Unknown error" : "Nijedna datoteka nije učitana. Nepoznata greška.", + "There is no error, the file uploaded with success" : "Nema greške, datoteka je uspješno učitana.", + "The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "Učitana datoteka prelazi maksimalnu dopuštenu veličinu datoteke upload_max_filesize navedenu u php. ini: ", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Učitana datoteka premašuje maksimalnu dopuštenu veličinu datoteke MAX_FILE_SIZE navedenu u HTML formi", + "The uploaded file was only partially uploaded" : "Učitana datoteka je samo djelomično učitana", + "No file was uploaded" : "Nijedna datoteka nije učitana.", + "Missing a temporary folder" : "Nedostaje privremeni direktorij.", + "Failed to write to disk" : "Zapisivanje na disk nije uspjelo.", + "Not enough storage available" : "Prostor za pohranu je nedovoljan", + "Upload failed. Could not find uploaded file" : "Neuspješno učitavanje. Nije pronađena učitana dataoteka", + "Upload failed. Could not get file info." : "Neuspješno učitavanje. Nedostupne informacije o datoteci.", + "Invalid directory." : "Neispravan direktorij.", + "Files" : "Datoteke", + "All files" : "Sve datoteke", + "Favorites" : "Favoriti", + "Home" : "Kuća", + "Unable to upload {filename} as it is a directory or has 0 bytes" : "Nemoguće učitati {filename} jer je ili direktorij ili ima 0 bajta", + "Total file size {size1} exceeds upload limit {size2}" : "Ukupna veličina datoteke {size1} prelazi ograničenje unosa {size2}", + "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nedovoljno slobodnog prostora, vi učitavate {size1} a samo je {size2} preostalo", + "Upload cancelled." : "Učitavanje je prekinuto.", + "Could not get result from server." : "Nemoguće dobiti rezultat od servera.", + "File upload is in progress. Leaving the page now will cancel the upload." : "Učitavanje datoteke je u toku. Napuštanje stranice prekinut će učitavanje.", + "URL cannot be empty" : "URL ne može biti prazan", + "{new_name} already exists" : "{new_name} već postoji", + "Could not create file" : "Datoteku nije moguće kreirati", + "Could not create folder" : "Direktorij nije moguće kreirati", + "Error fetching URL" : "Pogrešan dohvat URL", + "Rename" : "Preimenuj", + "Delete" : "Izbriši", + "Disconnect storage" : "Diskonektuj pohranu", + "Unshare" : "Prestani dijeliti", + "Select" : "Izaberi", + "Pending" : "Na čekanju", + "Unable to determine date" : "Nemoguće odrediti datum", + "Error moving file." : "Greška pri premještanju datoteke", + "Error moving file" : "Greška pri premještanju datoteke", + "Error" : "Greška", + "Could not rename file" : "Nemoguće preimenovati datoteku", + "Error deleting file." : "Greška pri brisanju datoteke", "Name" : "Ime", "Size" : "Veličina", - "_%n folder_::_%n folders_" : ["","",""], - "_%n file_::_%n files_" : ["","",""], - "_Uploading %n file_::_Uploading %n files_" : ["","",""], + "Modified" : "Izmijenjeno", + "_%n folder_::_%n folders_" : ["direktorij","direktoriji","direktoriji"], + "_%n file_::_%n files_" : ["%n datoteka","%n datoteke","%n datoteke"], + "You don’t have permission to upload or create files here" : "Ovdje niste ovlašteni učitavati ili kreirati datoteke", + "_Uploading %n file_::_Uploading %n files_" : ["Prenosim %n datoteku","Prenosim %n datoteke","Prenosim %n datoteke"], + "\"{name}\" is an invalid file name." : "\"{name}\" je neispravno ime datoteke.", + "Your storage is full, files can not be updated or synced anymore!" : "Vaša pohrana je puna, datoteke više nije moguće ažurirati niti sinhronizirati!", + "Your storage is almost full ({usedSpacePercent}%)" : "Vaš prostor za pohranu je skoro pun ({usedSpacePercent}%)", + "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Aplikacija šifriranja je uključena, ali vaši ključevi nisu inicializirani, molim odjavite se i ponovno prijavite", + "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Neispravan privatni ključ za šifriranje. Molim ažurirajte lozinku svoga privatnog ključa u svojim osobnim postavkama da biste obnovili pristup svojim šifriranim datotekama.", + "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Šifriranje je onemogućeno, ali vaše su datoteke još uvijek šifrirane. Molimo, odite u osobne postavke da biste dešifrirali svoje datoteke.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["","",""], + "{dirs} and {files}" : "{dirs} i {files}", + "Favorited" : "Favorizovano", + "Favorite" : "Favorit", + "%s could not be renamed as it has been deleted" : "%s nije moguće preimenovati jer je izbrisan", + "%s could not be renamed" : "%s nije moguće preimenovati", + "Upload (max. %s)" : "Učitaj (max. %s)", + "File handling" : "Obrada datoteke", + "Maximum upload size" : "Maksimalna veličina učitavanja", + "max. possible: " : "max. moguće: ", "Save" : "Spasi", - "New folder" : "Nova fascikla", - "Folder" : "Fasikla" + "Settings" : "Postavke", + "WebDAV" : "WebDAV", + "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Koristi slijedeću adresu za <a href=\"%s\" target=\"_blank\">pristup vašim datotekama putem WebDAV-a</a>", + "New" : "Novo", + "New text file" : "Nova tekstualna datoteka", + "Text file" : "Tekstualna datoteka", + "New folder" : "Novi direktorij", + "Folder" : "Direktorij", + "From link" : "Od veze", + "Upload" : "Učitaj", + "Cancel upload" : "Prekini učitavanje", + "No files yet" : "Još nema datoteki", + "Upload some content or sync with your devices!" : "Učitaj neki sadržaj ili sinhronizuj sa tvojim uređajima!", + "Select all" : "Označi sve", + "Download" : "Preuzmi", + "Upload too large" : "Učitavanje je preveliko", + "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Datoteke koje pokušavate učitati prelaze maksimalnu veličinu za učitavanje datoteka na ovom serveru.", + "Files are being scanned, please wait." : "Datoteke se provjeravaju, molim pričekajte.", + "Currently scanning" : "Provjera u toku", + "No favorites" : "Nema favorita", + "Files and folders you mark as favorite will show up here" : "Datoteke i direktorij koje ste označili kao favorite će biti prikazane ovdje" },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" }
\ No newline at end of file diff --git a/apps/files/l10n/ca.js b/apps/files/l10n/ca.js index 8a4b5c42d24..e83f0c34137 100644 --- a/apps/files/l10n/ca.js +++ b/apps/files/l10n/ca.js @@ -6,6 +6,7 @@ OC.L10N.register( "Unknown error" : "Error desconegut", "Could not move %s - File with this name already exists" : "No s'ha pogut moure %s - Ja hi ha un fitxer amb aquest nom", "Could not move %s" : " No s'ha pogut moure %s", + "Permission denied" : "Permís denegat", "File name cannot be empty." : "El nom del fitxer no pot ser buit.", "\"%s\" is an invalid file name." : "\"%s\" no es un fitxer vàlid.", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." : "El nóm no és vàlid, '\\', '/', '<', '>', ':', '\"', '|', '?' i '*' no estan permesos.", @@ -34,6 +35,8 @@ OC.L10N.register( "Invalid directory." : "Directori no vàlid.", "Files" : "Fitxers", "All files" : "Tots els fitxers", + "Favorites" : "Preferits", + "Home" : "Casa", "Unable to upload {filename} as it is a directory or has 0 bytes" : "No es pot pujar {filename} perquè és una carpeta o té 0 bytes", "Total file size {size1} exceeds upload limit {size2}" : "Mida total del fitxer {size1} excedeix el límit de pujada {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "No hi ha prou espai lliure, està carregant {size1} però només pot {size2}", @@ -45,12 +48,11 @@ OC.L10N.register( "Could not create file" : "No s'ha pogut crear el fitxer", "Could not create folder" : "No s'ha pogut crear la carpeta", "Error fetching URL" : "Error en obtenir la URL", - "Share" : "Comparteix", + "Rename" : "Reanomena", "Delete" : "Esborra", "Disconnect storage" : "Desonnecta l'emmagatzematge", "Unshare" : "Deixa de compartir", - "Delete permanently" : "Esborra permanentment", - "Rename" : "Reanomena", + "Select" : "Selecciona", "Pending" : "Pendent", "Error moving file." : "Error en moure el fitxer.", "Error moving file" : "Error en moure el fitxer", @@ -70,7 +72,9 @@ OC.L10N.register( "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "L'aplicació d'encriptació està activada però les claus no estan inicialitzades, sortiu i acrediteu-vos de nou.", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "La clau privada de l'aplicació d'encriptació no és vàlida! Actualitzeu la contrasenya de la clau privada a l'arranjament personal per recuperar els fitxers encriptats.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "L'encriptació s'ha desactivat però els vostres fitxers segueixen encriptats. Aneu a la vostra configuració personal per desencriptar els vostres fitxers.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "{dirs} and {files}" : "{dirs} i {files}", + "Favorite" : "Preferits", "%s could not be renamed as it has been deleted" : "No s'ha pogut renombrar %s ja que ha estat borrat", "%s could not be renamed" : "%s no es pot canviar el nom", "Upload (max. %s)" : "Pujada (màx. %s)", @@ -78,6 +82,7 @@ OC.L10N.register( "Maximum upload size" : "Mida màxima de pujada", "max. possible: " : "màxim possible:", "Save" : "Desa", + "Settings" : "Arranjament", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Useu aquesta adreça per <a href=\"%s\" target=\"_blank\">accedir als fitxers via WebDAV</a>", "New" : "Nou", @@ -86,7 +91,8 @@ OC.L10N.register( "New folder" : "Carpeta nova", "Folder" : "Carpeta", "From link" : "Des d'enllaç", - "Nothing in here. Upload something!" : "Res per aquí. Pugeu alguna cosa!", + "Upload" : "Puja", + "Cancel upload" : "Cancel·la la pujada", "Download" : "Baixa", "Upload too large" : "La pujada és massa gran", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Els fitxers que esteu intentant pujar excedeixen la mida màxima de pujada del servidor", diff --git a/apps/files/l10n/ca.json b/apps/files/l10n/ca.json index 91e96f5742d..03ca0ce7094 100644 --- a/apps/files/l10n/ca.json +++ b/apps/files/l10n/ca.json @@ -4,6 +4,7 @@ "Unknown error" : "Error desconegut", "Could not move %s - File with this name already exists" : "No s'ha pogut moure %s - Ja hi ha un fitxer amb aquest nom", "Could not move %s" : " No s'ha pogut moure %s", + "Permission denied" : "Permís denegat", "File name cannot be empty." : "El nom del fitxer no pot ser buit.", "\"%s\" is an invalid file name." : "\"%s\" no es un fitxer vàlid.", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." : "El nóm no és vàlid, '\\', '/', '<', '>', ':', '\"', '|', '?' i '*' no estan permesos.", @@ -32,6 +33,8 @@ "Invalid directory." : "Directori no vàlid.", "Files" : "Fitxers", "All files" : "Tots els fitxers", + "Favorites" : "Preferits", + "Home" : "Casa", "Unable to upload {filename} as it is a directory or has 0 bytes" : "No es pot pujar {filename} perquè és una carpeta o té 0 bytes", "Total file size {size1} exceeds upload limit {size2}" : "Mida total del fitxer {size1} excedeix el límit de pujada {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "No hi ha prou espai lliure, està carregant {size1} però només pot {size2}", @@ -43,12 +46,11 @@ "Could not create file" : "No s'ha pogut crear el fitxer", "Could not create folder" : "No s'ha pogut crear la carpeta", "Error fetching URL" : "Error en obtenir la URL", - "Share" : "Comparteix", + "Rename" : "Reanomena", "Delete" : "Esborra", "Disconnect storage" : "Desonnecta l'emmagatzematge", "Unshare" : "Deixa de compartir", - "Delete permanently" : "Esborra permanentment", - "Rename" : "Reanomena", + "Select" : "Selecciona", "Pending" : "Pendent", "Error moving file." : "Error en moure el fitxer.", "Error moving file" : "Error en moure el fitxer", @@ -68,7 +70,9 @@ "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "L'aplicació d'encriptació està activada però les claus no estan inicialitzades, sortiu i acrediteu-vos de nou.", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "La clau privada de l'aplicació d'encriptació no és vàlida! Actualitzeu la contrasenya de la clau privada a l'arranjament personal per recuperar els fitxers encriptats.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "L'encriptació s'ha desactivat però els vostres fitxers segueixen encriptats. Aneu a la vostra configuració personal per desencriptar els vostres fitxers.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "{dirs} and {files}" : "{dirs} i {files}", + "Favorite" : "Preferits", "%s could not be renamed as it has been deleted" : "No s'ha pogut renombrar %s ja que ha estat borrat", "%s could not be renamed" : "%s no es pot canviar el nom", "Upload (max. %s)" : "Pujada (màx. %s)", @@ -76,6 +80,7 @@ "Maximum upload size" : "Mida màxima de pujada", "max. possible: " : "màxim possible:", "Save" : "Desa", + "Settings" : "Arranjament", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Useu aquesta adreça per <a href=\"%s\" target=\"_blank\">accedir als fitxers via WebDAV</a>", "New" : "Nou", @@ -84,7 +89,8 @@ "New folder" : "Carpeta nova", "Folder" : "Carpeta", "From link" : "Des d'enllaç", - "Nothing in here. Upload something!" : "Res per aquí. Pugeu alguna cosa!", + "Upload" : "Puja", + "Cancel upload" : "Cancel·la la pujada", "Download" : "Baixa", "Upload too large" : "La pujada és massa gran", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Els fitxers que esteu intentant pujar excedeixen la mida màxima de pujada del servidor", diff --git a/apps/files/l10n/ca@valencia.js b/apps/files/l10n/ca@valencia.js index 329844854f1..560042b3efd 100644 --- a/apps/files/l10n/ca@valencia.js +++ b/apps/files/l10n/ca@valencia.js @@ -3,6 +3,7 @@ OC.L10N.register( { "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""] }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/ca@valencia.json b/apps/files/l10n/ca@valencia.json index 37156658a86..4cfa6a31b6e 100644 --- a/apps/files/l10n/ca@valencia.json +++ b/apps/files/l10n/ca@valencia.json @@ -1,6 +1,7 @@ { "translations": { "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""] },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/cs_CZ.js b/apps/files/l10n/cs_CZ.js index 58467d9c68f..0e523f5110c 100644 --- a/apps/files/l10n/cs_CZ.js +++ b/apps/files/l10n/cs_CZ.js @@ -35,6 +35,8 @@ OC.L10N.register( "Invalid directory." : "Neplatný adresář", "Files" : "Soubory", "All files" : "Všechny soubory", + "Favorites" : "Oblíbené", + "Home" : "Domů", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Nelze nahrát soubor {filename}, protože je to buď adresář nebo má velikost 0 bytů", "Total file size {size1} exceeds upload limit {size2}" : "Celková velikost souboru {size1} překračuje povolenou velikost pro nahrávání {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Není dostatek místa pro uložení, velikost souboru je {size1}, zbývá pouze {size2}", @@ -46,18 +48,19 @@ OC.L10N.register( "Could not create file" : "Nepodařilo se vytvořit soubor", "Could not create folder" : "Nepodařilo se vytvořit složku", "Error fetching URL" : "Chyba při načítání URL", - "Share" : "Sdílet", + "Rename" : "Přejmenovat", "Delete" : "Smazat", "Disconnect storage" : "Odpojit úložiště", "Unshare" : "Zrušit sdílení", - "Delete permanently" : "Trvale odstranit", - "Rename" : "Přejmenovat", + "Select" : "Vybrat", "Pending" : "Nevyřízené", + "Unable to determine date" : "Nelze určit datum", "Error moving file." : "Chyba při přesunu souboru.", "Error moving file" : "Chyba při přesunu souboru", "Error" : "Chyba", "Could not rename file" : "Nepodařilo se přejmenovat soubor", "Error deleting file." : "Chyba při mazání souboru.", + "No entries in this folder match '{filter}'" : "V tomto adresáři nic nesouhlasí s '{filter}'", "Name" : "Název", "Size" : "Velikost", "Modified" : "Upraveno", @@ -71,7 +74,10 @@ OC.L10N.register( "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Aplikace pro šifrování je zapnuta, ale vaše klíče nejsou inicializované. Prosím odhlaste se a znovu přihlaste", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Chybný soukromý klíč pro šifrovací aplikaci. Aktualizujte prosím heslo svého soukromého klíče ve vašem osobním nastavení, abyste znovu získali přístup k vašim zašifrovaným souborům.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Šifrování bylo vypnuto, vaše soubory jsou však stále zašifrované. Běžte prosím do osobního nastavení, kde soubory odšifrujete.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["odpovídá '{filter}'","odpovídají '{filter}'","odpovídá '{filter}'"], "{dirs} and {files}" : "{dirs} a {files}", + "Favorited" : "Přidáno k oblíbeným", + "Favorite" : "Oblíbené", "%s could not be renamed as it has been deleted" : "%s nelze přejmenovat, protože byl smazán", "%s could not be renamed" : "%s nemůže být přejmenován", "Upload (max. %s)" : "Nahrát (max. %s)", @@ -79,6 +85,7 @@ OC.L10N.register( "Maximum upload size" : "Maximální velikost pro odesílání", "max. possible: " : "největší možná: ", "Save" : "Uložit", + "Settings" : "Nastavení", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Použijte tuto adresu pro <a href=\"%s\" target=\"_blank\">přístup k vašim souborům přes WebDAV</a>", "New" : "Nový", @@ -87,11 +94,18 @@ OC.L10N.register( "New folder" : "Nová složka", "Folder" : "Složka", "From link" : "Z odkazu", - "Nothing in here. Upload something!" : "Žádný obsah. Nahrajte něco.", + "Upload" : "Odeslat", + "Cancel upload" : "Zrušit odesílání", + "No files yet" : "Zatím žádné soubory", + "Upload some content or sync with your devices!" : "Nahrajte nějaký obsah nebo synchronizujte se svými přístroji!", + "No entries found in this folder" : "V tomto adresáři nebylo nic nalezeno", + "Select all" : "Vybrat vše", "Download" : "Stáhnout", "Upload too large" : "Odesílaný soubor je příliš velký", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Soubory, které se snažíte odeslat, překračují limit velikosti odesílání na tomto serveru.", "Files are being scanned, please wait." : "Soubory se prohledávají, prosím čekejte.", - "Currently scanning" : "Prohledává se" + "Currently scanning" : "Prohledává se", + "No favorites" : "Žádné oblíbené", + "Files and folders you mark as favorite will show up here" : "Soubory a adresáře označené jako oblíbené budou zobrazeny zde" }, "nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"); diff --git a/apps/files/l10n/cs_CZ.json b/apps/files/l10n/cs_CZ.json index 98cad1c70f5..a7ae492b370 100644 --- a/apps/files/l10n/cs_CZ.json +++ b/apps/files/l10n/cs_CZ.json @@ -33,6 +33,8 @@ "Invalid directory." : "Neplatný adresář", "Files" : "Soubory", "All files" : "Všechny soubory", + "Favorites" : "Oblíbené", + "Home" : "Domů", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Nelze nahrát soubor {filename}, protože je to buď adresář nebo má velikost 0 bytů", "Total file size {size1} exceeds upload limit {size2}" : "Celková velikost souboru {size1} překračuje povolenou velikost pro nahrávání {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Není dostatek místa pro uložení, velikost souboru je {size1}, zbývá pouze {size2}", @@ -44,18 +46,19 @@ "Could not create file" : "Nepodařilo se vytvořit soubor", "Could not create folder" : "Nepodařilo se vytvořit složku", "Error fetching URL" : "Chyba při načítání URL", - "Share" : "Sdílet", + "Rename" : "Přejmenovat", "Delete" : "Smazat", "Disconnect storage" : "Odpojit úložiště", "Unshare" : "Zrušit sdílení", - "Delete permanently" : "Trvale odstranit", - "Rename" : "Přejmenovat", + "Select" : "Vybrat", "Pending" : "Nevyřízené", + "Unable to determine date" : "Nelze určit datum", "Error moving file." : "Chyba při přesunu souboru.", "Error moving file" : "Chyba při přesunu souboru", "Error" : "Chyba", "Could not rename file" : "Nepodařilo se přejmenovat soubor", "Error deleting file." : "Chyba při mazání souboru.", + "No entries in this folder match '{filter}'" : "V tomto adresáři nic nesouhlasí s '{filter}'", "Name" : "Název", "Size" : "Velikost", "Modified" : "Upraveno", @@ -69,7 +72,10 @@ "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Aplikace pro šifrování je zapnuta, ale vaše klíče nejsou inicializované. Prosím odhlaste se a znovu přihlaste", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Chybný soukromý klíč pro šifrovací aplikaci. Aktualizujte prosím heslo svého soukromého klíče ve vašem osobním nastavení, abyste znovu získali přístup k vašim zašifrovaným souborům.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Šifrování bylo vypnuto, vaše soubory jsou však stále zašifrované. Běžte prosím do osobního nastavení, kde soubory odšifrujete.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["odpovídá '{filter}'","odpovídají '{filter}'","odpovídá '{filter}'"], "{dirs} and {files}" : "{dirs} a {files}", + "Favorited" : "Přidáno k oblíbeným", + "Favorite" : "Oblíbené", "%s could not be renamed as it has been deleted" : "%s nelze přejmenovat, protože byl smazán", "%s could not be renamed" : "%s nemůže být přejmenován", "Upload (max. %s)" : "Nahrát (max. %s)", @@ -77,6 +83,7 @@ "Maximum upload size" : "Maximální velikost pro odesílání", "max. possible: " : "největší možná: ", "Save" : "Uložit", + "Settings" : "Nastavení", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Použijte tuto adresu pro <a href=\"%s\" target=\"_blank\">přístup k vašim souborům přes WebDAV</a>", "New" : "Nový", @@ -85,11 +92,18 @@ "New folder" : "Nová složka", "Folder" : "Složka", "From link" : "Z odkazu", - "Nothing in here. Upload something!" : "Žádný obsah. Nahrajte něco.", + "Upload" : "Odeslat", + "Cancel upload" : "Zrušit odesílání", + "No files yet" : "Zatím žádné soubory", + "Upload some content or sync with your devices!" : "Nahrajte nějaký obsah nebo synchronizujte se svými přístroji!", + "No entries found in this folder" : "V tomto adresáři nebylo nic nalezeno", + "Select all" : "Vybrat vše", "Download" : "Stáhnout", "Upload too large" : "Odesílaný soubor je příliš velký", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Soubory, které se snažíte odeslat, překračují limit velikosti odesílání na tomto serveru.", "Files are being scanned, please wait." : "Soubory se prohledávají, prosím čekejte.", - "Currently scanning" : "Prohledává se" + "Currently scanning" : "Prohledává se", + "No favorites" : "Žádné oblíbené", + "Files and folders you mark as favorite will show up here" : "Soubory a adresáře označené jako oblíbené budou zobrazeny zde" },"pluralForm" :"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/files/l10n/cy_GB.js b/apps/files/l10n/cy_GB.js index a9c4ddeba28..884a879ac08 100644 --- a/apps/files/l10n/cy_GB.js +++ b/apps/files/l10n/cy_GB.js @@ -16,14 +16,13 @@ OC.L10N.register( "Not enough storage available" : "Dim digon o le storio ar gael", "Invalid directory." : "Cyfeiriadur annilys.", "Files" : "Ffeiliau", + "Home" : "Cartref", "Upload cancelled." : "Diddymwyd llwytho i fyny.", "File upload is in progress. Leaving the page now will cancel the upload." : "Mae ffeiliau'n cael eu llwytho i fyny. Bydd gadael y dudalen hon nawr yn diddymu'r broses.", "{new_name} already exists" : "{new_name} yn bodoli'n barod", - "Share" : "Rhannu", + "Rename" : "Ailenwi", "Delete" : "Dileu", "Unshare" : "Dad-rannu", - "Delete permanently" : "Dileu'n barhaol", - "Rename" : "Ailenwi", "Pending" : "I ddod", "Error" : "Gwall", "Name" : "Enw", @@ -34,15 +33,18 @@ OC.L10N.register( "_Uploading %n file_::_Uploading %n files_" : ["","","",""], "Your storage is full, files can not be updated or synced anymore!" : "Mae eich storfa'n llawn, ni ellir diweddaru a chydweddu ffeiliau mwyach!", "Your storage is almost full ({usedSpacePercent}%)" : "Mae eich storfa bron a bod yn llawn ({usedSpacePercent}%)", + "_ matches '{filter}'_::_ match '{filter}'_" : ["","","",""], "File handling" : "Trafod ffeiliau", "Maximum upload size" : "Maint mwyaf llwytho i fyny", "max. possible: " : "mwyaf. posib:", "Save" : "Cadw", + "Settings" : "Gosodiadau", "New" : "Newydd", "Text file" : "Ffeil destun", "Folder" : "Plygell", "From link" : "Dolen o", - "Nothing in here. Upload something!" : "Does dim byd fan hyn. Llwythwch rhywbeth i fyny!", + "Upload" : "Llwytho i fyny", + "Cancel upload" : "Diddymu llwytho i fyny", "Download" : "Llwytho i lawr", "Upload too large" : "Maint llwytho i fyny'n rhy fawr", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Mae'r ffeiliau rydych yn ceisio llwytho i fyny'n fwy na maint mwyaf llwytho ffeiliau i fyny ar y gweinydd hwn.", diff --git a/apps/files/l10n/cy_GB.json b/apps/files/l10n/cy_GB.json index dc583d0a333..5114abb7eee 100644 --- a/apps/files/l10n/cy_GB.json +++ b/apps/files/l10n/cy_GB.json @@ -14,14 +14,13 @@ "Not enough storage available" : "Dim digon o le storio ar gael", "Invalid directory." : "Cyfeiriadur annilys.", "Files" : "Ffeiliau", + "Home" : "Cartref", "Upload cancelled." : "Diddymwyd llwytho i fyny.", "File upload is in progress. Leaving the page now will cancel the upload." : "Mae ffeiliau'n cael eu llwytho i fyny. Bydd gadael y dudalen hon nawr yn diddymu'r broses.", "{new_name} already exists" : "{new_name} yn bodoli'n barod", - "Share" : "Rhannu", + "Rename" : "Ailenwi", "Delete" : "Dileu", "Unshare" : "Dad-rannu", - "Delete permanently" : "Dileu'n barhaol", - "Rename" : "Ailenwi", "Pending" : "I ddod", "Error" : "Gwall", "Name" : "Enw", @@ -32,15 +31,18 @@ "_Uploading %n file_::_Uploading %n files_" : ["","","",""], "Your storage is full, files can not be updated or synced anymore!" : "Mae eich storfa'n llawn, ni ellir diweddaru a chydweddu ffeiliau mwyach!", "Your storage is almost full ({usedSpacePercent}%)" : "Mae eich storfa bron a bod yn llawn ({usedSpacePercent}%)", + "_ matches '{filter}'_::_ match '{filter}'_" : ["","","",""], "File handling" : "Trafod ffeiliau", "Maximum upload size" : "Maint mwyaf llwytho i fyny", "max. possible: " : "mwyaf. posib:", "Save" : "Cadw", + "Settings" : "Gosodiadau", "New" : "Newydd", "Text file" : "Ffeil destun", "Folder" : "Plygell", "From link" : "Dolen o", - "Nothing in here. Upload something!" : "Does dim byd fan hyn. Llwythwch rhywbeth i fyny!", + "Upload" : "Llwytho i fyny", + "Cancel upload" : "Diddymu llwytho i fyny", "Download" : "Llwytho i lawr", "Upload too large" : "Maint llwytho i fyny'n rhy fawr", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Mae'r ffeiliau rydych yn ceisio llwytho i fyny'n fwy na maint mwyaf llwytho ffeiliau i fyny ar y gweinydd hwn.", diff --git a/apps/files/l10n/da.js b/apps/files/l10n/da.js index 7b636c63409..88e4388164b 100644 --- a/apps/files/l10n/da.js +++ b/apps/files/l10n/da.js @@ -35,6 +35,8 @@ OC.L10N.register( "Invalid directory." : "Ugyldig mappe.", "Files" : "Filer", "All files" : "Alle filer", + "Favorites" : "Foretrukne", + "Home" : "Hjemme", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Kan ikke upload {filename} da det er enten en mappe eller indholder 0 bytes.", "Total file size {size1} exceeds upload limit {size2}" : "Den totale filstørrelse {size1} er større end uploadgrænsen {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Der er ikke tilstrækkeligt friplads. Du uplaoder {size1} men der er kun {size2} tilbage", @@ -46,13 +48,13 @@ OC.L10N.register( "Could not create file" : "Kunne ikke oprette fil", "Could not create folder" : "Kunne ikke oprette mappe", "Error fetching URL" : "Fejl ved URL", - "Share" : "Del", + "Rename" : "Omdøb", "Delete" : "Slet", "Disconnect storage" : "Frakobl lager", "Unshare" : "Fjern deling", - "Delete permanently" : "Slet permanent", - "Rename" : "Omdøb", + "Select" : "Vælg", "Pending" : "Afventer", + "Unable to determine date" : "Kan ikke fastslå datoen", "Error moving file." : "Fejl ved flytning af fil", "Error moving file" : "Fejl ved flytning af fil", "Error" : "Fejl", @@ -71,7 +73,10 @@ OC.L10N.register( "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Krypteringsprogrammet er aktiveret, men din nøgle er ikke igangsat. Log venligst ud og ind igen.", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Ugyldig privat nøgle for krypteringsprogrammet. Opdater venligst dit kodeord for den private nøgle i dine personlige indstillinger. Det kræves for at få adgang til dine krypterede filer.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Krypteringen blev deaktiveret, men dine filer er stadig krypteret. Gå venligst til dine personlige indstillinger for at dekryptere dine filer. ", + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "{dirs} and {files}" : "{dirs} og {files}", + "Favorited" : "Gjort til favorit", + "Favorite" : "Foretrukken", "%s could not be renamed as it has been deleted" : "%s kunne ikke omdøbes, da den er blevet slettet", "%s could not be renamed" : "%s kunne ikke omdøbes", "Upload (max. %s)" : "Upload (max. %s)", @@ -79,6 +84,7 @@ OC.L10N.register( "Maximum upload size" : "Maksimal upload-størrelse", "max. possible: " : "max. mulige: ", "Save" : "Gem", + "Settings" : "Indstillinger", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Brug denne adresse for at <a href=\"%s\" target=\"_blank\">tilgå dine filer via WebDAV</a>", "New" : "Ny", @@ -87,11 +93,17 @@ OC.L10N.register( "New folder" : "Ny Mappe", "Folder" : "Mappe", "From link" : "Fra link", - "Nothing in here. Upload something!" : "Her er tomt. Upload noget!", + "Upload" : "Upload", + "Cancel upload" : "Fortryd upload", + "No files yet" : "Endnu ingen filer", + "Upload some content or sync with your devices!" : "Overfør indhold eller synkronisér med dine enheder!", + "Select all" : "Vælg alle", "Download" : "Download", "Upload too large" : "Upload er for stor", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Filerne, du prøver at uploade, er større end den maksimale størrelse for fil-upload på denne server.", "Files are being scanned, please wait." : "Filerne bliver indlæst, vent venligst.", - "Currently scanning" : "Indlæser" + "Currently scanning" : "Indlæser", + "No favorites" : "Ingen favoritter", + "Files and folders you mark as favorite will show up here" : "Filer og mapper som du har markeret som favoritter, vil blive vist her" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/da.json b/apps/files/l10n/da.json index 81b658bef2e..04914c9dd8d 100644 --- a/apps/files/l10n/da.json +++ b/apps/files/l10n/da.json @@ -33,6 +33,8 @@ "Invalid directory." : "Ugyldig mappe.", "Files" : "Filer", "All files" : "Alle filer", + "Favorites" : "Foretrukne", + "Home" : "Hjemme", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Kan ikke upload {filename} da det er enten en mappe eller indholder 0 bytes.", "Total file size {size1} exceeds upload limit {size2}" : "Den totale filstørrelse {size1} er større end uploadgrænsen {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Der er ikke tilstrækkeligt friplads. Du uplaoder {size1} men der er kun {size2} tilbage", @@ -44,13 +46,13 @@ "Could not create file" : "Kunne ikke oprette fil", "Could not create folder" : "Kunne ikke oprette mappe", "Error fetching URL" : "Fejl ved URL", - "Share" : "Del", + "Rename" : "Omdøb", "Delete" : "Slet", "Disconnect storage" : "Frakobl lager", "Unshare" : "Fjern deling", - "Delete permanently" : "Slet permanent", - "Rename" : "Omdøb", + "Select" : "Vælg", "Pending" : "Afventer", + "Unable to determine date" : "Kan ikke fastslå datoen", "Error moving file." : "Fejl ved flytning af fil", "Error moving file" : "Fejl ved flytning af fil", "Error" : "Fejl", @@ -69,7 +71,10 @@ "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Krypteringsprogrammet er aktiveret, men din nøgle er ikke igangsat. Log venligst ud og ind igen.", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Ugyldig privat nøgle for krypteringsprogrammet. Opdater venligst dit kodeord for den private nøgle i dine personlige indstillinger. Det kræves for at få adgang til dine krypterede filer.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Krypteringen blev deaktiveret, men dine filer er stadig krypteret. Gå venligst til dine personlige indstillinger for at dekryptere dine filer. ", + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "{dirs} and {files}" : "{dirs} og {files}", + "Favorited" : "Gjort til favorit", + "Favorite" : "Foretrukken", "%s could not be renamed as it has been deleted" : "%s kunne ikke omdøbes, da den er blevet slettet", "%s could not be renamed" : "%s kunne ikke omdøbes", "Upload (max. %s)" : "Upload (max. %s)", @@ -77,6 +82,7 @@ "Maximum upload size" : "Maksimal upload-størrelse", "max. possible: " : "max. mulige: ", "Save" : "Gem", + "Settings" : "Indstillinger", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Brug denne adresse for at <a href=\"%s\" target=\"_blank\">tilgå dine filer via WebDAV</a>", "New" : "Ny", @@ -85,11 +91,17 @@ "New folder" : "Ny Mappe", "Folder" : "Mappe", "From link" : "Fra link", - "Nothing in here. Upload something!" : "Her er tomt. Upload noget!", + "Upload" : "Upload", + "Cancel upload" : "Fortryd upload", + "No files yet" : "Endnu ingen filer", + "Upload some content or sync with your devices!" : "Overfør indhold eller synkronisér med dine enheder!", + "Select all" : "Vælg alle", "Download" : "Download", "Upload too large" : "Upload er for stor", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Filerne, du prøver at uploade, er større end den maksimale størrelse for fil-upload på denne server.", "Files are being scanned, please wait." : "Filerne bliver indlæst, vent venligst.", - "Currently scanning" : "Indlæser" + "Currently scanning" : "Indlæser", + "No favorites" : "Ingen favoritter", + "Files and folders you mark as favorite will show up here" : "Filer og mapper som du har markeret som favoritter, vil blive vist her" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/de.js b/apps/files/l10n/de.js index b4ffa90c89b..ddfc8f9b597 100644 --- a/apps/files/l10n/de.js +++ b/apps/files/l10n/de.js @@ -35,6 +35,8 @@ OC.L10N.register( "Invalid directory." : "Ungültiges Verzeichnis.", "Files" : "Dateien", "All files" : "Alle Dateien", + "Favorites" : "Favoriten", + "Home" : "Home", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Die Datei {filename} kann nicht hochgeladen werden, da sie entweder ein Verzeichnis oder 0 Bytes groß ist", "Total file size {size1} exceeds upload limit {size2}" : "Die Gesamt-Größe {size1} überschreitet die Upload-Begrenzung {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nicht genügend freier Speicherplatz, du möchtest {size1} hochladen, es sind jedoch nur noch {size2} verfügbar.", @@ -46,18 +48,19 @@ OC.L10N.register( "Could not create file" : "Die Datei konnte nicht erstellt werden", "Could not create folder" : "Der Ordner konnte nicht erstellt werden", "Error fetching URL" : "Fehler beim Abrufen der URL", - "Share" : "Teilen", + "Rename" : "Umbenennen", "Delete" : "Löschen", "Disconnect storage" : "Speicher trennen", "Unshare" : "Freigabe aufheben", - "Delete permanently" : "Endgültig löschen", - "Rename" : "Umbenennen", + "Select" : "Auswählen", "Pending" : "Ausstehend", + "Unable to determine date" : "Datum konnte nicht ermittelt werden", "Error moving file." : "Fehler beim Verschieben der Datei.", "Error moving file" : "Fehler beim Verschieben der Datei", "Error" : "Fehler", "Could not rename file" : "Die Datei konnte nicht umbenannt werden", "Error deleting file." : "Fehler beim Löschen der Datei.", + "No entries in this folder match '{filter}'" : "Keine Einträge in diesem Ordner stimmen mit '{filter}' überein", "Name" : "Name", "Size" : "Größe", "Modified" : "Geändert", @@ -71,7 +74,10 @@ OC.L10N.register( "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Die Verschlüsselung-App ist aktiviert, aber Deine Schlüssel sind nicht initialisiert. Bitte melden Dich nochmals ab und wieder an.", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Ungültiger privater Schlüssel für die Verschlüsselung-App. Bitte aktualisiere Dein privates Schlüssel-Passwort, um den Zugriff auf Deine verschlüsselten Dateien wiederherzustellen.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Die Verschlüsselung wurde deaktiviert, jedoch sind Deine Dateien nach wie vor verschlüsselt. Bitte gehe zu Deinen persönlichen Einstellungen, um Deine Dateien zu entschlüsseln.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["stimmt mit '{filter}' überein","stimmen mit '{filter}' überein"], "{dirs} and {files}" : "{dirs} und {files}", + "Favorited" : "Favorisiert", + "Favorite" : "Favorit", "%s could not be renamed as it has been deleted" : "%s konnte nicht umbenannt werden, da es gelöscht wurde", "%s could not be renamed" : "%s konnte nicht umbenannt werden", "Upload (max. %s)" : "Hochladen (max. %s)", @@ -79,6 +85,7 @@ OC.L10N.register( "Maximum upload size" : "Maximale Upload-Größe", "max. possible: " : "maximal möglich:", "Save" : "Speichern", + "Settings" : "Einstellungen", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Diese Adresse benutzen, um <a href=\"%s\" target=\"_blank\">über WebDAV auf Ihre Dateien zuzugreifen</a>", "New" : "Neu", @@ -87,11 +94,18 @@ OC.L10N.register( "New folder" : "Neuer Ordner", "Folder" : "Ordner", "From link" : "Von einem Link", - "Nothing in here. Upload something!" : "Alles leer. Lade etwas hoch!", + "Upload" : "Hochladen", + "Cancel upload" : "Upload abbrechen", + "No files yet" : "Noch keine Dateien", + "Upload some content or sync with your devices!" : "Lade Inhalte hoch oder synchronisiere mit Deinen Geräten!", + "No entries found in this folder" : "Keine Einträge in diesem Ordner", + "Select all" : "Alle auswählen", "Download" : "Herunterladen", "Upload too large" : "Der Upload ist zu groß", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Die Datei überschreitet die Maximalgröße für Uploads auf diesem Server.", "Files are being scanned, please wait." : "Dateien werden gescannt, bitte warten.", - "Currently scanning" : "Durchsuchen läuft" + "Currently scanning" : "Durchsuchen läuft", + "No favorites" : "Keine Favoriten", + "Files and folders you mark as favorite will show up here" : "Dateien und Ordner, die Du als Favoriten markierst, werden hier erscheinen" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/de.json b/apps/files/l10n/de.json index 600a60ddfd7..fb9e3983ad8 100644 --- a/apps/files/l10n/de.json +++ b/apps/files/l10n/de.json @@ -33,6 +33,8 @@ "Invalid directory." : "Ungültiges Verzeichnis.", "Files" : "Dateien", "All files" : "Alle Dateien", + "Favorites" : "Favoriten", + "Home" : "Home", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Die Datei {filename} kann nicht hochgeladen werden, da sie entweder ein Verzeichnis oder 0 Bytes groß ist", "Total file size {size1} exceeds upload limit {size2}" : "Die Gesamt-Größe {size1} überschreitet die Upload-Begrenzung {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nicht genügend freier Speicherplatz, du möchtest {size1} hochladen, es sind jedoch nur noch {size2} verfügbar.", @@ -44,18 +46,19 @@ "Could not create file" : "Die Datei konnte nicht erstellt werden", "Could not create folder" : "Der Ordner konnte nicht erstellt werden", "Error fetching URL" : "Fehler beim Abrufen der URL", - "Share" : "Teilen", + "Rename" : "Umbenennen", "Delete" : "Löschen", "Disconnect storage" : "Speicher trennen", "Unshare" : "Freigabe aufheben", - "Delete permanently" : "Endgültig löschen", - "Rename" : "Umbenennen", + "Select" : "Auswählen", "Pending" : "Ausstehend", + "Unable to determine date" : "Datum konnte nicht ermittelt werden", "Error moving file." : "Fehler beim Verschieben der Datei.", "Error moving file" : "Fehler beim Verschieben der Datei", "Error" : "Fehler", "Could not rename file" : "Die Datei konnte nicht umbenannt werden", "Error deleting file." : "Fehler beim Löschen der Datei.", + "No entries in this folder match '{filter}'" : "Keine Einträge in diesem Ordner stimmen mit '{filter}' überein", "Name" : "Name", "Size" : "Größe", "Modified" : "Geändert", @@ -69,7 +72,10 @@ "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Die Verschlüsselung-App ist aktiviert, aber Deine Schlüssel sind nicht initialisiert. Bitte melden Dich nochmals ab und wieder an.", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Ungültiger privater Schlüssel für die Verschlüsselung-App. Bitte aktualisiere Dein privates Schlüssel-Passwort, um den Zugriff auf Deine verschlüsselten Dateien wiederherzustellen.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Die Verschlüsselung wurde deaktiviert, jedoch sind Deine Dateien nach wie vor verschlüsselt. Bitte gehe zu Deinen persönlichen Einstellungen, um Deine Dateien zu entschlüsseln.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["stimmt mit '{filter}' überein","stimmen mit '{filter}' überein"], "{dirs} and {files}" : "{dirs} und {files}", + "Favorited" : "Favorisiert", + "Favorite" : "Favorit", "%s could not be renamed as it has been deleted" : "%s konnte nicht umbenannt werden, da es gelöscht wurde", "%s could not be renamed" : "%s konnte nicht umbenannt werden", "Upload (max. %s)" : "Hochladen (max. %s)", @@ -77,6 +83,7 @@ "Maximum upload size" : "Maximale Upload-Größe", "max. possible: " : "maximal möglich:", "Save" : "Speichern", + "Settings" : "Einstellungen", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Diese Adresse benutzen, um <a href=\"%s\" target=\"_blank\">über WebDAV auf Ihre Dateien zuzugreifen</a>", "New" : "Neu", @@ -85,11 +92,18 @@ "New folder" : "Neuer Ordner", "Folder" : "Ordner", "From link" : "Von einem Link", - "Nothing in here. Upload something!" : "Alles leer. Lade etwas hoch!", + "Upload" : "Hochladen", + "Cancel upload" : "Upload abbrechen", + "No files yet" : "Noch keine Dateien", + "Upload some content or sync with your devices!" : "Lade Inhalte hoch oder synchronisiere mit Deinen Geräten!", + "No entries found in this folder" : "Keine Einträge in diesem Ordner", + "Select all" : "Alle auswählen", "Download" : "Herunterladen", "Upload too large" : "Der Upload ist zu groß", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Die Datei überschreitet die Maximalgröße für Uploads auf diesem Server.", "Files are being scanned, please wait." : "Dateien werden gescannt, bitte warten.", - "Currently scanning" : "Durchsuchen läuft" + "Currently scanning" : "Durchsuchen läuft", + "No favorites" : "Keine Favoriten", + "Files and folders you mark as favorite will show up here" : "Dateien und Ordner, die Du als Favoriten markierst, werden hier erscheinen" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/de_AT.js b/apps/files/l10n/de_AT.js index 00e929683cc..0d9dc1b7042 100644 --- a/apps/files/l10n/de_AT.js +++ b/apps/files/l10n/de_AT.js @@ -2,14 +2,15 @@ OC.L10N.register( "files", { "Files" : "Dateien", - "Share" : "Freigeben", "Delete" : "Löschen", "Unshare" : "Teilung zurücknehmen", "Error" : "Fehler", "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "Save" : "Speichern", + "Settings" : "Einstellungen", "Download" : "Herunterladen" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/de_AT.json b/apps/files/l10n/de_AT.json index 190e5c1d3b1..957de19a535 100644 --- a/apps/files/l10n/de_AT.json +++ b/apps/files/l10n/de_AT.json @@ -1,13 +1,14 @@ { "translations": { "Files" : "Dateien", - "Share" : "Freigeben", "Delete" : "Löschen", "Unshare" : "Teilung zurücknehmen", "Error" : "Fehler", "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "Save" : "Speichern", + "Settings" : "Einstellungen", "Download" : "Herunterladen" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/de_DE.js b/apps/files/l10n/de_DE.js index 3e64aa3c990..65789545c39 100644 --- a/apps/files/l10n/de_DE.js +++ b/apps/files/l10n/de_DE.js @@ -35,6 +35,8 @@ OC.L10N.register( "Invalid directory." : "Ungültiges Verzeichnis.", "Files" : "Dateien", "All files" : "Alle Dateien", + "Favorites" : "Favoriten", + "Home" : "Zuhause", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Die Datei {filename} kann nicht hochgeladen werden, da sie entweder ein Verzeichnis oder 0 Bytes groß ist", "Total file size {size1} exceeds upload limit {size2}" : "Die Gesamt-Größe {size1} überschreitet die Upload-Begrenzung {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nicht genügend freier Speicherplatz, Sie möchten {size1} hochladen, es sind jedoch nur noch {size2} verfügbar.", @@ -46,18 +48,19 @@ OC.L10N.register( "Could not create file" : "Die Datei konnte nicht erstellt werden", "Could not create folder" : "Der Ordner konnte nicht erstellt werden", "Error fetching URL" : "Fehler beim Abrufen der URL", - "Share" : "Teilen", + "Rename" : "Umbenennen", "Delete" : "Löschen", "Disconnect storage" : "Speicher trennen", "Unshare" : "Freigabe aufheben", - "Delete permanently" : "Endgültig löschen", - "Rename" : "Umbenennen", + "Select" : "Auswählen", "Pending" : "Ausstehend", + "Unable to determine date" : "Datum konnte nicht ermittelt werden", "Error moving file." : "Fehler beim Verschieben der Datei.", "Error moving file" : "Fehler beim Verschieben der Datei", "Error" : "Fehler", "Could not rename file" : "Die Datei konnte nicht umbenannt werden", "Error deleting file." : "Fehler beim Löschen der Datei.", + "No entries in this folder match '{filter}'" : "Keine Einträge in diesem Ordner stimmen mit '{filter}' überein", "Name" : "Name", "Size" : "Größe", "Modified" : "Geändert", @@ -71,7 +74,10 @@ OC.L10N.register( "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Verschlüsselungs-App ist aktiviert, aber Ihre Schlüssel sind nicht initialisiert. Bitte melden Sie sich nochmals ab und wieder an.", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Ungültiger privater Schlüssel für die Verschlüsselungs-App. Bitte aktualisieren Sie Ihr privates Schlüsselpasswort, um den Zugriff auf Ihre verschlüsselten Dateien wiederherzustellen.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Die Verschlüsselung wurde deaktiviert, jedoch sind Ihre Dateien nach wie vor verschlüsselt. Bitte gehen Sie zu Ihren persönlichen Einstellungen, um Ihre Dateien zu entschlüsseln.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["stimmt mit '{filter}' überein","stimmen mit '{filter}' überein"], "{dirs} and {files}" : "{dirs} und {files}", + "Favorited" : "Favorisiert", + "Favorite" : "Favorit", "%s could not be renamed as it has been deleted" : "%s konnte nicht umbenannt werden, da es gelöscht wurde", "%s could not be renamed" : "%s konnte nicht umbenannt werden", "Upload (max. %s)" : "Hochladen (max. %s)", @@ -79,6 +85,7 @@ OC.L10N.register( "Maximum upload size" : "Maximale Upload-Größe", "max. possible: " : "maximal möglich:", "Save" : "Speichern", + "Settings" : "Einstellungen", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Diese Adresse benutzen, um <a href=\"%s\" target=\"_blank\">über WebDAV auf Ihre Dateien zuzugreifen</a>", "New" : "Neu", @@ -87,11 +94,18 @@ OC.L10N.register( "New folder" : "Neuer Ordner", "Folder" : "Ordner", "From link" : "Von einem Link", - "Nothing in here. Upload something!" : "Alles leer. Laden Sie etwas hoch!", + "Upload" : "Hochladen", + "Cancel upload" : "Upload abbrechen", + "No files yet" : "Noch keine Dateien", + "Upload some content or sync with your devices!" : "Laden Sie Inhalte hoch oder synchronisieren Sie mit Ihren Geräten!", + "No entries found in this folder" : "Keine Einträge in diesem Ordner gefunden", + "Select all" : "Alle auswählen", "Download" : "Herunterladen", "Upload too large" : "Der Upload ist zu groß", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Die Datei überschreitet die Maximalgröße für Uploads auf diesem Server.", "Files are being scanned, please wait." : "Dateien werden gescannt, bitte warten.", - "Currently scanning" : "Durchsuchen läuft" + "Currently scanning" : "Durchsuchen läuft", + "No favorites" : "Keine Favoriten", + "Files and folders you mark as favorite will show up here" : "Dateien und Ordner, die Sie als Favoriten kennzeichnen, werden hier erscheinen" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/de_DE.json b/apps/files/l10n/de_DE.json index df3433251c6..6785a72e54c 100644 --- a/apps/files/l10n/de_DE.json +++ b/apps/files/l10n/de_DE.json @@ -33,6 +33,8 @@ "Invalid directory." : "Ungültiges Verzeichnis.", "Files" : "Dateien", "All files" : "Alle Dateien", + "Favorites" : "Favoriten", + "Home" : "Zuhause", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Die Datei {filename} kann nicht hochgeladen werden, da sie entweder ein Verzeichnis oder 0 Bytes groß ist", "Total file size {size1} exceeds upload limit {size2}" : "Die Gesamt-Größe {size1} überschreitet die Upload-Begrenzung {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nicht genügend freier Speicherplatz, Sie möchten {size1} hochladen, es sind jedoch nur noch {size2} verfügbar.", @@ -44,18 +46,19 @@ "Could not create file" : "Die Datei konnte nicht erstellt werden", "Could not create folder" : "Der Ordner konnte nicht erstellt werden", "Error fetching URL" : "Fehler beim Abrufen der URL", - "Share" : "Teilen", + "Rename" : "Umbenennen", "Delete" : "Löschen", "Disconnect storage" : "Speicher trennen", "Unshare" : "Freigabe aufheben", - "Delete permanently" : "Endgültig löschen", - "Rename" : "Umbenennen", + "Select" : "Auswählen", "Pending" : "Ausstehend", + "Unable to determine date" : "Datum konnte nicht ermittelt werden", "Error moving file." : "Fehler beim Verschieben der Datei.", "Error moving file" : "Fehler beim Verschieben der Datei", "Error" : "Fehler", "Could not rename file" : "Die Datei konnte nicht umbenannt werden", "Error deleting file." : "Fehler beim Löschen der Datei.", + "No entries in this folder match '{filter}'" : "Keine Einträge in diesem Ordner stimmen mit '{filter}' überein", "Name" : "Name", "Size" : "Größe", "Modified" : "Geändert", @@ -69,7 +72,10 @@ "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Verschlüsselungs-App ist aktiviert, aber Ihre Schlüssel sind nicht initialisiert. Bitte melden Sie sich nochmals ab und wieder an.", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Ungültiger privater Schlüssel für die Verschlüsselungs-App. Bitte aktualisieren Sie Ihr privates Schlüsselpasswort, um den Zugriff auf Ihre verschlüsselten Dateien wiederherzustellen.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Die Verschlüsselung wurde deaktiviert, jedoch sind Ihre Dateien nach wie vor verschlüsselt. Bitte gehen Sie zu Ihren persönlichen Einstellungen, um Ihre Dateien zu entschlüsseln.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["stimmt mit '{filter}' überein","stimmen mit '{filter}' überein"], "{dirs} and {files}" : "{dirs} und {files}", + "Favorited" : "Favorisiert", + "Favorite" : "Favorit", "%s could not be renamed as it has been deleted" : "%s konnte nicht umbenannt werden, da es gelöscht wurde", "%s could not be renamed" : "%s konnte nicht umbenannt werden", "Upload (max. %s)" : "Hochladen (max. %s)", @@ -77,6 +83,7 @@ "Maximum upload size" : "Maximale Upload-Größe", "max. possible: " : "maximal möglich:", "Save" : "Speichern", + "Settings" : "Einstellungen", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Diese Adresse benutzen, um <a href=\"%s\" target=\"_blank\">über WebDAV auf Ihre Dateien zuzugreifen</a>", "New" : "Neu", @@ -85,11 +92,18 @@ "New folder" : "Neuer Ordner", "Folder" : "Ordner", "From link" : "Von einem Link", - "Nothing in here. Upload something!" : "Alles leer. Laden Sie etwas hoch!", + "Upload" : "Hochladen", + "Cancel upload" : "Upload abbrechen", + "No files yet" : "Noch keine Dateien", + "Upload some content or sync with your devices!" : "Laden Sie Inhalte hoch oder synchronisieren Sie mit Ihren Geräten!", + "No entries found in this folder" : "Keine Einträge in diesem Ordner gefunden", + "Select all" : "Alle auswählen", "Download" : "Herunterladen", "Upload too large" : "Der Upload ist zu groß", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Die Datei überschreitet die Maximalgröße für Uploads auf diesem Server.", "Files are being scanned, please wait." : "Dateien werden gescannt, bitte warten.", - "Currently scanning" : "Durchsuchen läuft" + "Currently scanning" : "Durchsuchen läuft", + "No favorites" : "Keine Favoriten", + "Files and folders you mark as favorite will show up here" : "Dateien und Ordner, die Sie als Favoriten kennzeichnen, werden hier erscheinen" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/el.js b/apps/files/l10n/el.js index eaf4eb65ebd..68e56a761fd 100644 --- a/apps/files/l10n/el.js +++ b/apps/files/l10n/el.js @@ -35,6 +35,8 @@ OC.L10N.register( "Invalid directory." : "Μη έγκυρος φάκελος.", "Files" : "Αρχεία", "All files" : "Όλα τα αρχεία", + "Favorites" : "Αγαπημένες", + "Home" : "Σπίτι", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Αδυναμία φόρτωσης {filename} καθώς είναι κατάλογος αρχείων ή έχει 0 bytes", "Total file size {size1} exceeds upload limit {size2}" : "Το συνολικό μέγεθος αρχείου {size1} υπερβαίνει το όριο μεταφόρτωσης {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Δεν υπάρχει αρκετός ελεύθερος χώρος, μεταφορτώνετε μέγεθος {size1} αλλά υπάρχει χώρος μόνο {size2}", @@ -46,12 +48,11 @@ OC.L10N.register( "Could not create file" : "Αδυναμία δημιουργίας αρχείου", "Could not create folder" : "Αδυναμία δημιουργίας φακέλου", "Error fetching URL" : "Σφάλμα φόρτωσης URL", - "Share" : "Διαμοιρασμός", + "Rename" : "Μετονομασία", "Delete" : "Διαγραφή", "Disconnect storage" : "Αποσυνδεδεμένος αποθηκευτικός χώρος", "Unshare" : "Διακοπή διαμοιρασμού", - "Delete permanently" : "Μόνιμη διαγραφή", - "Rename" : "Μετονομασία", + "Select" : "Επιλογή", "Pending" : "Εκκρεμεί", "Error moving file." : "Σφάλμα κατά τη μετακίνηση του αρχείου.", "Error moving file" : "Σφάλμα κατά τη μετακίνηση του αρχείου", @@ -71,7 +72,9 @@ OC.L10N.register( "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Η εφαρμογή κρυπτογράφησης είναι ενεργοποιημένη αλλά τα κλειδιά σας δεν έχουν καταγραφεί, παρακαλώ αποσυνδεθείτε και επανασυνδεθείτε.", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Άκυρο προσωπικό κλειδί για την εφαρμογή κρυπτογράφησης. Παρακαλώ ενημερώστε τον κωδικό του προσωπικού κλειδίου σας στις προσωπικές ρυθμίσεις για να επανακτήσετε πρόσβαση στα κρυπτογραφημένα σας αρχεία.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Η κρυπτογράφηση απενεργοποιήθηκε, αλλά τα αρχεία σας είναι ακόμα κρυπτογραφημένα. Παρακαλούμε απενεργοποιήσετε την κρυπτογράφηση αρχείων από τις προσωπικές σας ρυθμίσεις", + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "{dirs} and {files}" : "{Κατάλογοι αρχείων} και {αρχεία}", + "Favorite" : "Αγαπημένο", "%s could not be renamed as it has been deleted" : "%s δεν μπορούσε να μετονομαστεί εφόσον είχε διαγραφεί", "%s could not be renamed" : "Αδυναμία μετονομασίας του %s", "Upload (max. %s)" : "Διαμοιρασμός (max. %s)", @@ -79,6 +82,7 @@ OC.L10N.register( "Maximum upload size" : "Μέγιστο μέγεθος αποστολής", "max. possible: " : "μέγιστο δυνατό:", "Save" : "Αποθήκευση", + "Settings" : "Ρυθμίσεις", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Χρησιμοποιήστε αυτήν την διεύθυνση για να αποκτήσετε <a href=\"%s\" target=\"_blank\">πρόσβαση στα αρχεία σας μέσω WebDAV</a>", "New" : "Νέο", @@ -87,7 +91,9 @@ OC.L10N.register( "New folder" : "Νέος κατάλογος", "Folder" : "Φάκελος", "From link" : "Από σύνδεσμο", - "Nothing in here. Upload something!" : "Δεν υπάρχει τίποτα εδώ. Ανεβάστε κάτι!", + "Upload" : "Μεταφόρτωση", + "Cancel upload" : "Ακύρωση μεταφόρτωσης", + "Select all" : "Επιλογή όλων", "Download" : "Λήψη", "Upload too large" : "Πολύ μεγάλο αρχείο προς αποστολή", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Τα αρχεία που προσπαθείτε να ανεβάσετε υπερβαίνουν το μέγιστο μέγεθος αποστολής αρχείων σε αυτόν τον διακομιστή.", diff --git a/apps/files/l10n/el.json b/apps/files/l10n/el.json index 5c9b763b5e1..d84ce3d14ff 100644 --- a/apps/files/l10n/el.json +++ b/apps/files/l10n/el.json @@ -33,6 +33,8 @@ "Invalid directory." : "Μη έγκυρος φάκελος.", "Files" : "Αρχεία", "All files" : "Όλα τα αρχεία", + "Favorites" : "Αγαπημένες", + "Home" : "Σπίτι", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Αδυναμία φόρτωσης {filename} καθώς είναι κατάλογος αρχείων ή έχει 0 bytes", "Total file size {size1} exceeds upload limit {size2}" : "Το συνολικό μέγεθος αρχείου {size1} υπερβαίνει το όριο μεταφόρτωσης {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Δεν υπάρχει αρκετός ελεύθερος χώρος, μεταφορτώνετε μέγεθος {size1} αλλά υπάρχει χώρος μόνο {size2}", @@ -44,12 +46,11 @@ "Could not create file" : "Αδυναμία δημιουργίας αρχείου", "Could not create folder" : "Αδυναμία δημιουργίας φακέλου", "Error fetching URL" : "Σφάλμα φόρτωσης URL", - "Share" : "Διαμοιρασμός", + "Rename" : "Μετονομασία", "Delete" : "Διαγραφή", "Disconnect storage" : "Αποσυνδεδεμένος αποθηκευτικός χώρος", "Unshare" : "Διακοπή διαμοιρασμού", - "Delete permanently" : "Μόνιμη διαγραφή", - "Rename" : "Μετονομασία", + "Select" : "Επιλογή", "Pending" : "Εκκρεμεί", "Error moving file." : "Σφάλμα κατά τη μετακίνηση του αρχείου.", "Error moving file" : "Σφάλμα κατά τη μετακίνηση του αρχείου", @@ -69,7 +70,9 @@ "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Η εφαρμογή κρυπτογράφησης είναι ενεργοποιημένη αλλά τα κλειδιά σας δεν έχουν καταγραφεί, παρακαλώ αποσυνδεθείτε και επανασυνδεθείτε.", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Άκυρο προσωπικό κλειδί για την εφαρμογή κρυπτογράφησης. Παρακαλώ ενημερώστε τον κωδικό του προσωπικού κλειδίου σας στις προσωπικές ρυθμίσεις για να επανακτήσετε πρόσβαση στα κρυπτογραφημένα σας αρχεία.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Η κρυπτογράφηση απενεργοποιήθηκε, αλλά τα αρχεία σας είναι ακόμα κρυπτογραφημένα. Παρακαλούμε απενεργοποιήσετε την κρυπτογράφηση αρχείων από τις προσωπικές σας ρυθμίσεις", + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "{dirs} and {files}" : "{Κατάλογοι αρχείων} και {αρχεία}", + "Favorite" : "Αγαπημένο", "%s could not be renamed as it has been deleted" : "%s δεν μπορούσε να μετονομαστεί εφόσον είχε διαγραφεί", "%s could not be renamed" : "Αδυναμία μετονομασίας του %s", "Upload (max. %s)" : "Διαμοιρασμός (max. %s)", @@ -77,6 +80,7 @@ "Maximum upload size" : "Μέγιστο μέγεθος αποστολής", "max. possible: " : "μέγιστο δυνατό:", "Save" : "Αποθήκευση", + "Settings" : "Ρυθμίσεις", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Χρησιμοποιήστε αυτήν την διεύθυνση για να αποκτήσετε <a href=\"%s\" target=\"_blank\">πρόσβαση στα αρχεία σας μέσω WebDAV</a>", "New" : "Νέο", @@ -85,7 +89,9 @@ "New folder" : "Νέος κατάλογος", "Folder" : "Φάκελος", "From link" : "Από σύνδεσμο", - "Nothing in here. Upload something!" : "Δεν υπάρχει τίποτα εδώ. Ανεβάστε κάτι!", + "Upload" : "Μεταφόρτωση", + "Cancel upload" : "Ακύρωση μεταφόρτωσης", + "Select all" : "Επιλογή όλων", "Download" : "Λήψη", "Upload too large" : "Πολύ μεγάλο αρχείο προς αποστολή", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Τα αρχεία που προσπαθείτε να ανεβάσετε υπερβαίνουν το μέγιστο μέγεθος αποστολής αρχείων σε αυτόν τον διακομιστή.", diff --git a/apps/files/l10n/en@pirate.js b/apps/files/l10n/en@pirate.js index 92b310a0964..dcea419024a 100644 --- a/apps/files/l10n/en@pirate.js +++ b/apps/files/l10n/en@pirate.js @@ -4,6 +4,7 @@ OC.L10N.register( "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "Download" : "Download" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/en@pirate.json b/apps/files/l10n/en@pirate.json index 9d489a29829..e5f11e5504c 100644 --- a/apps/files/l10n/en@pirate.json +++ b/apps/files/l10n/en@pirate.json @@ -2,6 +2,7 @@ "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "Download" : "Download" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/en_GB.js b/apps/files/l10n/en_GB.js index 494358d3363..526aa2f2bb5 100644 --- a/apps/files/l10n/en_GB.js +++ b/apps/files/l10n/en_GB.js @@ -35,6 +35,8 @@ OC.L10N.register( "Invalid directory." : "Invalid directory.", "Files" : "Files", "All files" : "All files", + "Favorites" : "Favourites", + "Home" : "Home", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Unable to upload {filename} as it is a directory or has 0 bytes", "Total file size {size1} exceeds upload limit {size2}" : "Total file size {size1} exceeds upload limit {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Not enough free space, you are uploading {size1} but only {size2} is left", @@ -46,18 +48,19 @@ OC.L10N.register( "Could not create file" : "Could not create file", "Could not create folder" : "Could not create folder", "Error fetching URL" : "Error fetching URL", - "Share" : "Share", + "Rename" : "Rename", "Delete" : "Delete", "Disconnect storage" : "Disconnect storage", "Unshare" : "Unshare", - "Delete permanently" : "Delete permanently", - "Rename" : "Rename", + "Select" : "Select", "Pending" : "Pending", + "Unable to determine date" : "Unable to determine date", "Error moving file." : "Error moving file.", "Error moving file" : "Error moving file", "Error" : "Error", "Could not rename file" : "Could not rename file", "Error deleting file." : "Error deleting file.", + "No entries in this folder match '{filter}'" : "No entries in this folder match '{filter}'", "Name" : "Name", "Size" : "Size", "Modified" : "Modified", @@ -71,7 +74,10 @@ OC.L10N.register( "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Encryption App is enabled but your keys are not initialised, please log-out and log-in again", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files.", + "_ matches '{filter}'_::_ match '{filter}'_" : [" matches '{filter}'"," match '{filter}'"], "{dirs} and {files}" : "{dirs} and {files}", + "Favorited" : "Favourited", + "Favorite" : "Favourite", "%s could not be renamed as it has been deleted" : "%s could not be renamed as it has been deleted", "%s could not be renamed" : "%s could not be renamed", "Upload (max. %s)" : "Upload (max. %s)", @@ -79,6 +85,7 @@ OC.L10N.register( "Maximum upload size" : "Maximum upload size", "max. possible: " : "max. possible: ", "Save" : "Save", + "Settings" : "Settings", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>", "New" : "New", @@ -87,11 +94,18 @@ OC.L10N.register( "New folder" : "New folder", "Folder" : "Folder", "From link" : "From link", - "Nothing in here. Upload something!" : "Nothing in here. Upload something!", + "Upload" : "Upload", + "Cancel upload" : "Cancel upload", + "No files yet" : "No files yet", + "Upload some content or sync with your devices!" : "Upload some content or sync with your devices!", + "No entries found in this folder" : "No entries found in this folder", + "Select all" : "Select all", "Download" : "Download", "Upload too large" : "Upload too large", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "The files you are trying to upload exceed the maximum size for file uploads on this server.", "Files are being scanned, please wait." : "Files are being scanned, please wait.", - "Currently scanning" : "Currently scanning" + "Currently scanning" : "Currently scanning", + "No favorites" : "No favourites", + "Files and folders you mark as favorite will show up here" : "Files and folders you mark as favourite will show up here" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/en_GB.json b/apps/files/l10n/en_GB.json index bdda9bf4faf..f494726e425 100644 --- a/apps/files/l10n/en_GB.json +++ b/apps/files/l10n/en_GB.json @@ -33,6 +33,8 @@ "Invalid directory." : "Invalid directory.", "Files" : "Files", "All files" : "All files", + "Favorites" : "Favourites", + "Home" : "Home", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Unable to upload {filename} as it is a directory or has 0 bytes", "Total file size {size1} exceeds upload limit {size2}" : "Total file size {size1} exceeds upload limit {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Not enough free space, you are uploading {size1} but only {size2} is left", @@ -44,18 +46,19 @@ "Could not create file" : "Could not create file", "Could not create folder" : "Could not create folder", "Error fetching URL" : "Error fetching URL", - "Share" : "Share", + "Rename" : "Rename", "Delete" : "Delete", "Disconnect storage" : "Disconnect storage", "Unshare" : "Unshare", - "Delete permanently" : "Delete permanently", - "Rename" : "Rename", + "Select" : "Select", "Pending" : "Pending", + "Unable to determine date" : "Unable to determine date", "Error moving file." : "Error moving file.", "Error moving file" : "Error moving file", "Error" : "Error", "Could not rename file" : "Could not rename file", "Error deleting file." : "Error deleting file.", + "No entries in this folder match '{filter}'" : "No entries in this folder match '{filter}'", "Name" : "Name", "Size" : "Size", "Modified" : "Modified", @@ -69,7 +72,10 @@ "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Encryption App is enabled but your keys are not initialised, please log-out and log-in again", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files.", + "_ matches '{filter}'_::_ match '{filter}'_" : [" matches '{filter}'"," match '{filter}'"], "{dirs} and {files}" : "{dirs} and {files}", + "Favorited" : "Favourited", + "Favorite" : "Favourite", "%s could not be renamed as it has been deleted" : "%s could not be renamed as it has been deleted", "%s could not be renamed" : "%s could not be renamed", "Upload (max. %s)" : "Upload (max. %s)", @@ -77,6 +83,7 @@ "Maximum upload size" : "Maximum upload size", "max. possible: " : "max. possible: ", "Save" : "Save", + "Settings" : "Settings", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>", "New" : "New", @@ -85,11 +92,18 @@ "New folder" : "New folder", "Folder" : "Folder", "From link" : "From link", - "Nothing in here. Upload something!" : "Nothing in here. Upload something!", + "Upload" : "Upload", + "Cancel upload" : "Cancel upload", + "No files yet" : "No files yet", + "Upload some content or sync with your devices!" : "Upload some content or sync with your devices!", + "No entries found in this folder" : "No entries found in this folder", + "Select all" : "Select all", "Download" : "Download", "Upload too large" : "Upload too large", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "The files you are trying to upload exceed the maximum size for file uploads on this server.", "Files are being scanned, please wait." : "Files are being scanned, please wait.", - "Currently scanning" : "Currently scanning" + "Currently scanning" : "Currently scanning", + "No favorites" : "No favourites", + "Files and folders you mark as favorite will show up here" : "Files and folders you mark as favourite will show up here" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/en_NZ.js b/apps/files/l10n/en_NZ.js index 329844854f1..560042b3efd 100644 --- a/apps/files/l10n/en_NZ.js +++ b/apps/files/l10n/en_NZ.js @@ -3,6 +3,7 @@ OC.L10N.register( { "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""] }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/en_NZ.json b/apps/files/l10n/en_NZ.json index 37156658a86..4cfa6a31b6e 100644 --- a/apps/files/l10n/en_NZ.json +++ b/apps/files/l10n/en_NZ.json @@ -1,6 +1,7 @@ { "translations": { "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""] },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/eo.js b/apps/files/l10n/eo.js index 43acaae6ba4..67991c769ea 100644 --- a/apps/files/l10n/eo.js +++ b/apps/files/l10n/eo.js @@ -26,6 +26,8 @@ OC.L10N.register( "Upload failed. Could not get file info." : "La alŝuto malsukcesis. Ne povis ekhaviĝi informo pri dosiero.", "Invalid directory." : "Nevalida dosierujo.", "Files" : "Dosieroj", + "Favorites" : "Favoratoj", + "Home" : "Hejmo", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Ne povis alŝutiĝi {filename} ĉar ĝi estas dosierujo aŭ ĝi havas 0 duumokojn", "Upload cancelled." : "La alŝuto nuliĝis.", "Could not get result from server." : "Ne povis ekhaviĝi rezulto el la servilo.", @@ -34,11 +36,10 @@ OC.L10N.register( "{new_name} already exists" : "{new_name} jam ekzistas", "Could not create file" : "Ne povis kreiĝi dosiero", "Could not create folder" : "Ne povis kreiĝi dosierujo", - "Share" : "Kunhavigi", + "Rename" : "Alinomigi", "Delete" : "Forigi", "Unshare" : "Malkunhavigi", - "Delete permanently" : "Forigi por ĉiam", - "Rename" : "Alinomigi", + "Select" : "Elekti", "Pending" : "Traktotaj", "Error moving file" : "Eraris movo de dosiero", "Error" : "Eraro", @@ -52,20 +53,24 @@ OC.L10N.register( "_Uploading %n file_::_Uploading %n files_" : ["Alŝutatas %n dosiero","Alŝutatas %n dosieroj"], "Your storage is full, files can not be updated or synced anymore!" : "Via memoro plenas, ne plu eblas ĝisdatigi aŭ sinkronigi dosierojn!", "Your storage is almost full ({usedSpacePercent}%)" : "Via memoro preskaŭ plenas ({usedSpacePercent}%)", + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "{dirs} and {files}" : "{dirs} kaj {files}", + "Favorite" : "Favorato", "%s could not be renamed" : "%s ne povis alinomiĝi", "Upload (max. %s)" : "Alŝuti (maks. %s)", "File handling" : "Dosieradministro", "Maximum upload size" : "Maksimuma alŝutogrando", "max. possible: " : "maks. ebla: ", "Save" : "Konservi", + "Settings" : "Agordo", "WebDAV" : "WebDAV", "New" : "Nova", "Text file" : "Tekstodosiero", "New folder" : "Nova dosierujo", "Folder" : "Dosierujo", "From link" : "El ligilo", - "Nothing in here. Upload something!" : "Nenio estas ĉi tie. Alŝutu ion!", + "Upload" : "Alŝuti", + "Cancel upload" : "Nuligi alŝuton", "Download" : "Elŝuti", "Upload too large" : "Alŝuto tro larĝa", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "La dosieroj, kiujn vi provas alŝuti, transpasas la maksimuman grandon por dosieralŝutoj en ĉi tiu servilo.", diff --git a/apps/files/l10n/eo.json b/apps/files/l10n/eo.json index 96338a90c11..18bd4da5d91 100644 --- a/apps/files/l10n/eo.json +++ b/apps/files/l10n/eo.json @@ -24,6 +24,8 @@ "Upload failed. Could not get file info." : "La alŝuto malsukcesis. Ne povis ekhaviĝi informo pri dosiero.", "Invalid directory." : "Nevalida dosierujo.", "Files" : "Dosieroj", + "Favorites" : "Favoratoj", + "Home" : "Hejmo", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Ne povis alŝutiĝi {filename} ĉar ĝi estas dosierujo aŭ ĝi havas 0 duumokojn", "Upload cancelled." : "La alŝuto nuliĝis.", "Could not get result from server." : "Ne povis ekhaviĝi rezulto el la servilo.", @@ -32,11 +34,10 @@ "{new_name} already exists" : "{new_name} jam ekzistas", "Could not create file" : "Ne povis kreiĝi dosiero", "Could not create folder" : "Ne povis kreiĝi dosierujo", - "Share" : "Kunhavigi", + "Rename" : "Alinomigi", "Delete" : "Forigi", "Unshare" : "Malkunhavigi", - "Delete permanently" : "Forigi por ĉiam", - "Rename" : "Alinomigi", + "Select" : "Elekti", "Pending" : "Traktotaj", "Error moving file" : "Eraris movo de dosiero", "Error" : "Eraro", @@ -50,20 +51,24 @@ "_Uploading %n file_::_Uploading %n files_" : ["Alŝutatas %n dosiero","Alŝutatas %n dosieroj"], "Your storage is full, files can not be updated or synced anymore!" : "Via memoro plenas, ne plu eblas ĝisdatigi aŭ sinkronigi dosierojn!", "Your storage is almost full ({usedSpacePercent}%)" : "Via memoro preskaŭ plenas ({usedSpacePercent}%)", + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "{dirs} and {files}" : "{dirs} kaj {files}", + "Favorite" : "Favorato", "%s could not be renamed" : "%s ne povis alinomiĝi", "Upload (max. %s)" : "Alŝuti (maks. %s)", "File handling" : "Dosieradministro", "Maximum upload size" : "Maksimuma alŝutogrando", "max. possible: " : "maks. ebla: ", "Save" : "Konservi", + "Settings" : "Agordo", "WebDAV" : "WebDAV", "New" : "Nova", "Text file" : "Tekstodosiero", "New folder" : "Nova dosierujo", "Folder" : "Dosierujo", "From link" : "El ligilo", - "Nothing in here. Upload something!" : "Nenio estas ĉi tie. Alŝutu ion!", + "Upload" : "Alŝuti", + "Cancel upload" : "Nuligi alŝuton", "Download" : "Elŝuti", "Upload too large" : "Alŝuto tro larĝa", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "La dosieroj, kiujn vi provas alŝuti, transpasas la maksimuman grandon por dosieralŝutoj en ĉi tiu servilo.", diff --git a/apps/files/l10n/es.js b/apps/files/l10n/es.js index 0e1ac9aede9..3eacdc8261d 100644 --- a/apps/files/l10n/es.js +++ b/apps/files/l10n/es.js @@ -35,6 +35,8 @@ OC.L10N.register( "Invalid directory." : "Directorio inválido.", "Files" : "Archivos", "All files" : "Todos los archivos", + "Favorites" : "Favoritos", + "Home" : "Particular", "Unable to upload {filename} as it is a directory or has 0 bytes" : "No ha sido posible subir {filename} porque es un directorio o tiene 0 bytes", "Total file size {size1} exceeds upload limit {size2}" : "El tamaño total del archivo {size1} excede el límite {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "No hay suficiente espacio libre. Quiere subir {size1} pero solo quedan {size2}", @@ -46,18 +48,19 @@ OC.L10N.register( "Could not create file" : "No se pudo crear el archivo", "Could not create folder" : "No se pudo crear la carpeta", "Error fetching URL" : "Error al descargar URL.", - "Share" : "Compartir", + "Rename" : "Renombrar", "Delete" : "Eliminar", "Disconnect storage" : "Desconectar almacenamiento", "Unshare" : "Dejar de compartir", - "Delete permanently" : "Eliminar permanentemente", - "Rename" : "Renombrar", + "Select" : "Seleccionar", "Pending" : "Pendiente", + "Unable to determine date" : "No se pudo determinar la fecha", "Error moving file." : "Error al mover el archivo.", "Error moving file" : "Error moviendo archivo", "Error" : "Error", "Could not rename file" : "No se pudo renombrar el archivo", "Error deleting file." : "Error al borrar el archivo", + "No entries in this folder match '{filter}'" : "No hay resultados que coincidan con '{filter}'", "Name" : "Nombre", "Size" : "Tamaño", "Modified" : "Modificado", @@ -71,7 +74,10 @@ OC.L10N.register( "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "La app de crifrado está habilitada pero tus claves no han sido inicializadas, por favor, cierra la sesión y vuelva a iniciarla de nuevo.", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "La clave privada no es válida para la app de cifrado. Por favor, actualiza la contraseña de tu clave privada en tus ajustes personales para recuperar el acceso a tus archivos cifrados.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "El cifrado ha sido deshabilitado pero tus archivos permanecen cifrados. Por favor, ve a tus ajustes personales para descifrar tus archivos.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["coinciden '{filter}'","coincide '{filter}'"], "{dirs} and {files}" : "{dirs} y {files}", + "Favorited" : "Agregado a favoritos", + "Favorite" : "Favorito", "%s could not be renamed as it has been deleted" : "%s no se pudo renombrar pues ha sido eliminado", "%s could not be renamed" : "%s no pudo ser renombrado", "Upload (max. %s)" : "Subida (máx. %s)", @@ -79,6 +85,7 @@ OC.L10N.register( "Maximum upload size" : "Tamaño máximo de subida", "max. possible: " : "máx. posible:", "Save" : "Guardar", + "Settings" : "Ajustes", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Use esta URL <a href=\"%s\" target=\"_blank\">para acceder via WebDAV</a>", "New" : "Nuevo", @@ -87,11 +94,18 @@ OC.L10N.register( "New folder" : "Nueva carpeta", "Folder" : "Carpeta", "From link" : "Desde enlace", - "Nothing in here. Upload something!" : "No hay nada aquí. ¡Suba algo!", + "Upload" : "Subir", + "Cancel upload" : "Cancelar subida", + "No files yet" : "Aún no hay archivos", + "Upload some content or sync with your devices!" : "Suba contenidos o sincronice sus dispositivos.", + "No entries found in this folder" : "No hay entradas en esta carpeta", + "Select all" : "Seleccionar todo", "Download" : "Descargar", "Upload too large" : "Subida demasido grande", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que estás intentando subir sobrepasan el tamaño máximo permitido en este servidor.", "Files are being scanned, please wait." : "Los archivos están siendo escaneados, por favor espere.", - "Currently scanning" : "Escaneando en este momento" + "Currently scanning" : "Escaneando en este momento", + "No favorites" : "No hay favoritos", + "Files and folders you mark as favorite will show up here" : "Aquí aparecerán los archivos y carpetas que usted marque como favoritos" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/es.json b/apps/files/l10n/es.json index 5b45a869b54..bb1828236ae 100644 --- a/apps/files/l10n/es.json +++ b/apps/files/l10n/es.json @@ -33,6 +33,8 @@ "Invalid directory." : "Directorio inválido.", "Files" : "Archivos", "All files" : "Todos los archivos", + "Favorites" : "Favoritos", + "Home" : "Particular", "Unable to upload {filename} as it is a directory or has 0 bytes" : "No ha sido posible subir {filename} porque es un directorio o tiene 0 bytes", "Total file size {size1} exceeds upload limit {size2}" : "El tamaño total del archivo {size1} excede el límite {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "No hay suficiente espacio libre. Quiere subir {size1} pero solo quedan {size2}", @@ -44,18 +46,19 @@ "Could not create file" : "No se pudo crear el archivo", "Could not create folder" : "No se pudo crear la carpeta", "Error fetching URL" : "Error al descargar URL.", - "Share" : "Compartir", + "Rename" : "Renombrar", "Delete" : "Eliminar", "Disconnect storage" : "Desconectar almacenamiento", "Unshare" : "Dejar de compartir", - "Delete permanently" : "Eliminar permanentemente", - "Rename" : "Renombrar", + "Select" : "Seleccionar", "Pending" : "Pendiente", + "Unable to determine date" : "No se pudo determinar la fecha", "Error moving file." : "Error al mover el archivo.", "Error moving file" : "Error moviendo archivo", "Error" : "Error", "Could not rename file" : "No se pudo renombrar el archivo", "Error deleting file." : "Error al borrar el archivo", + "No entries in this folder match '{filter}'" : "No hay resultados que coincidan con '{filter}'", "Name" : "Nombre", "Size" : "Tamaño", "Modified" : "Modificado", @@ -69,7 +72,10 @@ "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "La app de crifrado está habilitada pero tus claves no han sido inicializadas, por favor, cierra la sesión y vuelva a iniciarla de nuevo.", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "La clave privada no es válida para la app de cifrado. Por favor, actualiza la contraseña de tu clave privada en tus ajustes personales para recuperar el acceso a tus archivos cifrados.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "El cifrado ha sido deshabilitado pero tus archivos permanecen cifrados. Por favor, ve a tus ajustes personales para descifrar tus archivos.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["coinciden '{filter}'","coincide '{filter}'"], "{dirs} and {files}" : "{dirs} y {files}", + "Favorited" : "Agregado a favoritos", + "Favorite" : "Favorito", "%s could not be renamed as it has been deleted" : "%s no se pudo renombrar pues ha sido eliminado", "%s could not be renamed" : "%s no pudo ser renombrado", "Upload (max. %s)" : "Subida (máx. %s)", @@ -77,6 +83,7 @@ "Maximum upload size" : "Tamaño máximo de subida", "max. possible: " : "máx. posible:", "Save" : "Guardar", + "Settings" : "Ajustes", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Use esta URL <a href=\"%s\" target=\"_blank\">para acceder via WebDAV</a>", "New" : "Nuevo", @@ -85,11 +92,18 @@ "New folder" : "Nueva carpeta", "Folder" : "Carpeta", "From link" : "Desde enlace", - "Nothing in here. Upload something!" : "No hay nada aquí. ¡Suba algo!", + "Upload" : "Subir", + "Cancel upload" : "Cancelar subida", + "No files yet" : "Aún no hay archivos", + "Upload some content or sync with your devices!" : "Suba contenidos o sincronice sus dispositivos.", + "No entries found in this folder" : "No hay entradas en esta carpeta", + "Select all" : "Seleccionar todo", "Download" : "Descargar", "Upload too large" : "Subida demasido grande", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que estás intentando subir sobrepasan el tamaño máximo permitido en este servidor.", "Files are being scanned, please wait." : "Los archivos están siendo escaneados, por favor espere.", - "Currently scanning" : "Escaneando en este momento" + "Currently scanning" : "Escaneando en este momento", + "No favorites" : "No hay favoritos", + "Files and folders you mark as favorite will show up here" : "Aquí aparecerán los archivos y carpetas que usted marque como favoritos" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/es_AR.js b/apps/files/l10n/es_AR.js index fd9f9bd05e1..053f3bfbf01 100644 --- a/apps/files/l10n/es_AR.js +++ b/apps/files/l10n/es_AR.js @@ -28,6 +28,8 @@ OC.L10N.register( "Upload failed. Could not get file info." : "Falló la carga. No se pudo obtener la información del archivo.", "Invalid directory." : "Directorio inválido.", "Files" : "Archivos", + "Favorites" : "Favoritos", + "Home" : "Particular", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Imposible cargar {filename} puesto que es un directoro o tiene 0 bytes.", "Upload cancelled." : "La subida fue cancelada", "Could not get result from server." : "No se pudo obtener resultados del servidor.", @@ -37,11 +39,10 @@ OC.L10N.register( "Could not create file" : "No se pudo crear el archivo", "Could not create folder" : "No se pudo crear el directorio", "Error fetching URL" : "Error al obtener la URL", - "Share" : "Compartir", + "Rename" : "Cambiar nombre", "Delete" : "Borrar", "Unshare" : "Dejar de compartir", - "Delete permanently" : "Borrar permanentemente", - "Rename" : "Cambiar nombre", + "Select" : "Seleccionar", "Pending" : "Pendientes", "Error moving file" : "Error moviendo el archivo", "Error" : "Error", @@ -59,12 +60,15 @@ OC.L10N.register( "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "La aplicación de encriptación está habilitada pero las llaves no fueron inicializadas, por favor termine y vuelva a iniciar la sesión", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Llave privada inválida para la aplicación de encriptación. Por favor actualice la clave de la llave privada en las configuraciones personales para recobrar el acceso a sus archivos encriptados.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "El proceso de cifrado se ha desactivado, pero los archivos aún están encriptados. Por favor, vaya a la configuración personal para descifrar los archivos.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "{dirs} and {files}" : "{carpetas} y {archivos}", + "Favorite" : "Favorito", "%s could not be renamed" : "No se pudo renombrar %s", "File handling" : "Tratamiento de archivos", "Maximum upload size" : "Tamaño máximo de subida", "max. possible: " : "máx. posible:", "Save" : "Guardar", + "Settings" : "Configuración", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Usar esta dirección para <a href=\"%s\" target=\"_blank\">acceder a tus archivos vía WebDAV</a>", "New" : "Nuevo", @@ -73,7 +77,8 @@ OC.L10N.register( "New folder" : "Nueva Carpeta", "Folder" : "Carpeta", "From link" : "Desde enlace", - "Nothing in here. Upload something!" : "No hay nada. ¡Subí contenido!", + "Upload" : "Subir", + "Cancel upload" : "Cancelar subida", "Download" : "Descargar", "Upload too large" : "El tamaño del archivo que querés subir es demasiado grande", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que intentás subir sobrepasan el tamaño máximo ", diff --git a/apps/files/l10n/es_AR.json b/apps/files/l10n/es_AR.json index aa701390e68..16079c8feb6 100644 --- a/apps/files/l10n/es_AR.json +++ b/apps/files/l10n/es_AR.json @@ -26,6 +26,8 @@ "Upload failed. Could not get file info." : "Falló la carga. No se pudo obtener la información del archivo.", "Invalid directory." : "Directorio inválido.", "Files" : "Archivos", + "Favorites" : "Favoritos", + "Home" : "Particular", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Imposible cargar {filename} puesto que es un directoro o tiene 0 bytes.", "Upload cancelled." : "La subida fue cancelada", "Could not get result from server." : "No se pudo obtener resultados del servidor.", @@ -35,11 +37,10 @@ "Could not create file" : "No se pudo crear el archivo", "Could not create folder" : "No se pudo crear el directorio", "Error fetching URL" : "Error al obtener la URL", - "Share" : "Compartir", + "Rename" : "Cambiar nombre", "Delete" : "Borrar", "Unshare" : "Dejar de compartir", - "Delete permanently" : "Borrar permanentemente", - "Rename" : "Cambiar nombre", + "Select" : "Seleccionar", "Pending" : "Pendientes", "Error moving file" : "Error moviendo el archivo", "Error" : "Error", @@ -57,12 +58,15 @@ "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "La aplicación de encriptación está habilitada pero las llaves no fueron inicializadas, por favor termine y vuelva a iniciar la sesión", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Llave privada inválida para la aplicación de encriptación. Por favor actualice la clave de la llave privada en las configuraciones personales para recobrar el acceso a sus archivos encriptados.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "El proceso de cifrado se ha desactivado, pero los archivos aún están encriptados. Por favor, vaya a la configuración personal para descifrar los archivos.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "{dirs} and {files}" : "{carpetas} y {archivos}", + "Favorite" : "Favorito", "%s could not be renamed" : "No se pudo renombrar %s", "File handling" : "Tratamiento de archivos", "Maximum upload size" : "Tamaño máximo de subida", "max. possible: " : "máx. posible:", "Save" : "Guardar", + "Settings" : "Configuración", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Usar esta dirección para <a href=\"%s\" target=\"_blank\">acceder a tus archivos vía WebDAV</a>", "New" : "Nuevo", @@ -71,7 +75,8 @@ "New folder" : "Nueva Carpeta", "Folder" : "Carpeta", "From link" : "Desde enlace", - "Nothing in here. Upload something!" : "No hay nada. ¡Subí contenido!", + "Upload" : "Subir", + "Cancel upload" : "Cancelar subida", "Download" : "Descargar", "Upload too large" : "El tamaño del archivo que querés subir es demasiado grande", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que intentás subir sobrepasan el tamaño máximo ", diff --git a/apps/files/l10n/es_BO.js b/apps/files/l10n/es_BO.js index 329844854f1..560042b3efd 100644 --- a/apps/files/l10n/es_BO.js +++ b/apps/files/l10n/es_BO.js @@ -3,6 +3,7 @@ OC.L10N.register( { "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""] }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/es_BO.json b/apps/files/l10n/es_BO.json index 37156658a86..4cfa6a31b6e 100644 --- a/apps/files/l10n/es_BO.json +++ b/apps/files/l10n/es_BO.json @@ -1,6 +1,7 @@ { "translations": { "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""] },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/es_CL.js b/apps/files/l10n/es_CL.js index 7a6f60c2961..e919f070a71 100644 --- a/apps/files/l10n/es_CL.js +++ b/apps/files/l10n/es_CL.js @@ -3,13 +3,16 @@ OC.L10N.register( { "Unknown error" : "Error desconocido", "Files" : "Archivos", - "Share" : "Compartir", "Rename" : "Renombrar", "Error" : "Error", "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], + "Settings" : "Configuración", "New folder" : "Nuevo directorio", + "Upload" : "Subir", + "Cancel upload" : "cancelar subida", "Download" : "Descargar" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/es_CL.json b/apps/files/l10n/es_CL.json index bb2cd206077..1fb55eeee8c 100644 --- a/apps/files/l10n/es_CL.json +++ b/apps/files/l10n/es_CL.json @@ -1,13 +1,16 @@ { "translations": { "Unknown error" : "Error desconocido", "Files" : "Archivos", - "Share" : "Compartir", "Rename" : "Renombrar", "Error" : "Error", "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], + "Settings" : "Configuración", "New folder" : "Nuevo directorio", + "Upload" : "Subir", + "Cancel upload" : "cancelar subida", "Download" : "Descargar" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/es_CO.js b/apps/files/l10n/es_CO.js index 329844854f1..560042b3efd 100644 --- a/apps/files/l10n/es_CO.js +++ b/apps/files/l10n/es_CO.js @@ -3,6 +3,7 @@ OC.L10N.register( { "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""] }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/es_CO.json b/apps/files/l10n/es_CO.json index 37156658a86..4cfa6a31b6e 100644 --- a/apps/files/l10n/es_CO.json +++ b/apps/files/l10n/es_CO.json @@ -1,6 +1,7 @@ { "translations": { "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""] },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/es_CR.js b/apps/files/l10n/es_CR.js index 329844854f1..560042b3efd 100644 --- a/apps/files/l10n/es_CR.js +++ b/apps/files/l10n/es_CR.js @@ -3,6 +3,7 @@ OC.L10N.register( { "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""] }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/es_CR.json b/apps/files/l10n/es_CR.json index 37156658a86..4cfa6a31b6e 100644 --- a/apps/files/l10n/es_CR.json +++ b/apps/files/l10n/es_CR.json @@ -1,6 +1,7 @@ { "translations": { "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""] },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/es_EC.js b/apps/files/l10n/es_EC.js index 329844854f1..560042b3efd 100644 --- a/apps/files/l10n/es_EC.js +++ b/apps/files/l10n/es_EC.js @@ -3,6 +3,7 @@ OC.L10N.register( { "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""] }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/es_EC.json b/apps/files/l10n/es_EC.json index 37156658a86..4cfa6a31b6e 100644 --- a/apps/files/l10n/es_EC.json +++ b/apps/files/l10n/es_EC.json @@ -1,6 +1,7 @@ { "translations": { "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""] },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/es_MX.js b/apps/files/l10n/es_MX.js index 9d353e84a25..710ddaf9e02 100644 --- a/apps/files/l10n/es_MX.js +++ b/apps/files/l10n/es_MX.js @@ -28,6 +28,8 @@ OC.L10N.register( "Upload failed. Could not get file info." : "Actualización fallida. No se pudo obtener información del archivo.", "Invalid directory." : "Directorio inválido.", "Files" : "Archivos", + "Favorites" : "Favoritos", + "Home" : "Particular", "Unable to upload {filename} as it is a directory or has 0 bytes" : "No ha sido posible subir {filename} porque es un directorio o tiene 0 bytes", "Upload cancelled." : "Subida cancelada.", "Could not get result from server." : "No se pudo obtener respuesta del servidor.", @@ -37,11 +39,9 @@ OC.L10N.register( "Could not create file" : "No se pudo crear el archivo", "Could not create folder" : "No se pudo crear la carpeta", "Error fetching URL" : "Error al descargar URL.", - "Share" : "Compartir", + "Rename" : "Renombrar", "Delete" : "Eliminar", "Unshare" : "Dejar de compartir", - "Delete permanently" : "Eliminar permanentemente", - "Rename" : "Renombrar", "Pending" : "Pendiente", "Error moving file" : "Error moviendo archivo", "Error" : "Error", @@ -59,12 +59,15 @@ OC.L10N.register( "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "La aplicación de crifrado está habilitada pero tus claves no han sido inicializadas, por favor, cierra la sesión y vuelva a iniciarla de nuevo.", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "La clave privada no es válida para la aplicación de cifrado. Por favor, actualiza la contraseña de tu clave privada en tus ajustes personales para recuperar el acceso a tus archivos cifrados.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "El cifrado ha sido deshabilitado pero tus archivos permanecen cifrados. Por favor, ve a tus ajustes personales para descifrar tus archivos.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "{dirs} and {files}" : "{dirs} y {files}", + "Favorite" : "Favorito", "%s could not be renamed" : "%s no pudo ser renombrado", "File handling" : "Administración de archivos", "Maximum upload size" : "Tamaño máximo de subida", "max. possible: " : "máx. posible:", "Save" : "Guardar", + "Settings" : "Ajustes", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Utilice esta dirección para <a href=\"%s\" target=\"_blank\">acceder a sus archivos vía WebDAV</a>", "New" : "Nuevo", @@ -73,7 +76,8 @@ OC.L10N.register( "New folder" : "Nueva carpeta", "Folder" : "Carpeta", "From link" : "Desde enlace", - "Nothing in here. Upload something!" : "No hay nada aquí. ¡Suba algo!", + "Upload" : "Subir archivo", + "Cancel upload" : "Cancelar subida", "Download" : "Descargar", "Upload too large" : "Subida demasido grande", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que estás intentando subir sobrepasan el tamaño máximo permitido en este servidor.", diff --git a/apps/files/l10n/es_MX.json b/apps/files/l10n/es_MX.json index f08223b70c7..a12416a339b 100644 --- a/apps/files/l10n/es_MX.json +++ b/apps/files/l10n/es_MX.json @@ -26,6 +26,8 @@ "Upload failed. Could not get file info." : "Actualización fallida. No se pudo obtener información del archivo.", "Invalid directory." : "Directorio inválido.", "Files" : "Archivos", + "Favorites" : "Favoritos", + "Home" : "Particular", "Unable to upload {filename} as it is a directory or has 0 bytes" : "No ha sido posible subir {filename} porque es un directorio o tiene 0 bytes", "Upload cancelled." : "Subida cancelada.", "Could not get result from server." : "No se pudo obtener respuesta del servidor.", @@ -35,11 +37,9 @@ "Could not create file" : "No se pudo crear el archivo", "Could not create folder" : "No se pudo crear la carpeta", "Error fetching URL" : "Error al descargar URL.", - "Share" : "Compartir", + "Rename" : "Renombrar", "Delete" : "Eliminar", "Unshare" : "Dejar de compartir", - "Delete permanently" : "Eliminar permanentemente", - "Rename" : "Renombrar", "Pending" : "Pendiente", "Error moving file" : "Error moviendo archivo", "Error" : "Error", @@ -57,12 +57,15 @@ "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "La aplicación de crifrado está habilitada pero tus claves no han sido inicializadas, por favor, cierra la sesión y vuelva a iniciarla de nuevo.", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "La clave privada no es válida para la aplicación de cifrado. Por favor, actualiza la contraseña de tu clave privada en tus ajustes personales para recuperar el acceso a tus archivos cifrados.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "El cifrado ha sido deshabilitado pero tus archivos permanecen cifrados. Por favor, ve a tus ajustes personales para descifrar tus archivos.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "{dirs} and {files}" : "{dirs} y {files}", + "Favorite" : "Favorito", "%s could not be renamed" : "%s no pudo ser renombrado", "File handling" : "Administración de archivos", "Maximum upload size" : "Tamaño máximo de subida", "max. possible: " : "máx. posible:", "Save" : "Guardar", + "Settings" : "Ajustes", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Utilice esta dirección para <a href=\"%s\" target=\"_blank\">acceder a sus archivos vía WebDAV</a>", "New" : "Nuevo", @@ -71,7 +74,8 @@ "New folder" : "Nueva carpeta", "Folder" : "Carpeta", "From link" : "Desde enlace", - "Nothing in here. Upload something!" : "No hay nada aquí. ¡Suba algo!", + "Upload" : "Subir archivo", + "Cancel upload" : "Cancelar subida", "Download" : "Descargar", "Upload too large" : "Subida demasido grande", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los archivos que estás intentando subir sobrepasan el tamaño máximo permitido en este servidor.", diff --git a/apps/files/l10n/es_PE.js b/apps/files/l10n/es_PE.js index 329844854f1..560042b3efd 100644 --- a/apps/files/l10n/es_PE.js +++ b/apps/files/l10n/es_PE.js @@ -3,6 +3,7 @@ OC.L10N.register( { "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""] }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/es_PE.json b/apps/files/l10n/es_PE.json index 37156658a86..4cfa6a31b6e 100644 --- a/apps/files/l10n/es_PE.json +++ b/apps/files/l10n/es_PE.json @@ -1,6 +1,7 @@ { "translations": { "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""] },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/es_PY.js b/apps/files/l10n/es_PY.js index 8a7f665016d..436cba0b2a1 100644 --- a/apps/files/l10n/es_PY.js +++ b/apps/files/l10n/es_PY.js @@ -4,6 +4,7 @@ OC.L10N.register( "Files" : "Archivos", "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""] }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/es_PY.json b/apps/files/l10n/es_PY.json index 85d1fa4e4c0..b5b022f5c0e 100644 --- a/apps/files/l10n/es_PY.json +++ b/apps/files/l10n/es_PY.json @@ -2,6 +2,7 @@ "Files" : "Archivos", "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""] },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/es_US.js b/apps/files/l10n/es_US.js index 329844854f1..560042b3efd 100644 --- a/apps/files/l10n/es_US.js +++ b/apps/files/l10n/es_US.js @@ -3,6 +3,7 @@ OC.L10N.register( { "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""] }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/es_US.json b/apps/files/l10n/es_US.json index 37156658a86..4cfa6a31b6e 100644 --- a/apps/files/l10n/es_US.json +++ b/apps/files/l10n/es_US.json @@ -1,6 +1,7 @@ { "translations": { "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""] },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/es_UY.js b/apps/files/l10n/es_UY.js index 329844854f1..560042b3efd 100644 --- a/apps/files/l10n/es_UY.js +++ b/apps/files/l10n/es_UY.js @@ -3,6 +3,7 @@ OC.L10N.register( { "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""] }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/es_UY.json b/apps/files/l10n/es_UY.json index 37156658a86..4cfa6a31b6e 100644 --- a/apps/files/l10n/es_UY.json +++ b/apps/files/l10n/es_UY.json @@ -1,6 +1,7 @@ { "translations": { "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""] },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/et_EE.js b/apps/files/l10n/et_EE.js index 0ffbb81f63c..e0718bd443c 100644 --- a/apps/files/l10n/et_EE.js +++ b/apps/files/l10n/et_EE.js @@ -35,6 +35,8 @@ OC.L10N.register( "Invalid directory." : "Vigane kaust.", "Files" : "Failid", "All files" : "Kõik failid", + "Favorites" : "Lemmikud", + "Home" : "Kodu", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Ei saa üles laadida {filename}, kuna see on kataloog või selle suurus on 0 baiti", "Total file size {size1} exceeds upload limit {size2}" : "Faili suurus {size1} ületab faili üleslaadimise mahu piirangu {size2}.", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Pole piisavalt vaba ruumi. Sa laadid üles {size1}, kuid ainult {size2} on saadaval.", @@ -46,12 +48,11 @@ OC.L10N.register( "Could not create file" : "Ei suuda luua faili", "Could not create folder" : "Ei suuda luua kataloogi", "Error fetching URL" : "Viga URL-i haaramisel", - "Share" : "Jaga", + "Rename" : "Nimeta ümber", "Delete" : "Kustuta", "Disconnect storage" : "Ühenda andmehoidla lahti.", "Unshare" : "Lõpeta jagamine", - "Delete permanently" : "Kustuta jäädavalt", - "Rename" : "Nimeta ümber", + "Select" : "Vali", "Pending" : "Ootel", "Error moving file." : "Viga faili liigutamisel.", "Error moving file" : "Viga faili eemaldamisel", @@ -71,7 +72,9 @@ OC.L10N.register( "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Krüpteerimisrakend on lubatud, kuid võtmeid pole lähtestatud. Palun logi välja ning uuesti sisse.", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Vigane Krüpteerimisrakendi privaatvõti . Palun uuenda oma privaatse võtme parool oma personaasete seadete all taastamaks ligipääsu oma krüpteeritud failidele.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Krüpteering on keelatud, kuid sinu failid on endiselt krüpteeritud. Palun vaata oma personaalseid seadeid oma failide dekrüpteerimiseks.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "{dirs} and {files}" : "{dirs} ja {files}", + "Favorite" : "Lemmik", "%s could not be renamed as it has been deleted" : "%s ei saa ümber nimetada, kuna see on kustutatud", "%s could not be renamed" : "%s ümbernimetamine ebaõnnestus", "Upload (max. %s)" : "Üleslaadimine (max. %s)", @@ -79,6 +82,7 @@ OC.L10N.register( "Maximum upload size" : "Maksimaalne üleslaadimise suurus", "max. possible: " : "maks. võimalik: ", "Save" : "Salvesta", + "Settings" : "Seaded", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Kasuta seda aadressi <a href=\"%s\" target=\"_blank\">oma failidele ligipääsuks WebDAV kaudu</a>", "New" : "Uus", @@ -87,7 +91,8 @@ OC.L10N.register( "New folder" : "Uus kaust", "Folder" : "Kaust", "From link" : "Allikast", - "Nothing in here. Upload something!" : "Siin pole midagi. Lae midagi üles!", + "Upload" : "Lae üles", + "Cancel upload" : "Tühista üleslaadimine", "Download" : "Lae alla", "Upload too large" : "Üleslaadimine on liiga suur", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Failid, mida sa proovid üles laadida, ületab serveri poolt üleslaetavatele failidele määratud maksimaalse suuruse.", diff --git a/apps/files/l10n/et_EE.json b/apps/files/l10n/et_EE.json index fdb5bdcb4f2..e9a9647d96d 100644 --- a/apps/files/l10n/et_EE.json +++ b/apps/files/l10n/et_EE.json @@ -33,6 +33,8 @@ "Invalid directory." : "Vigane kaust.", "Files" : "Failid", "All files" : "Kõik failid", + "Favorites" : "Lemmikud", + "Home" : "Kodu", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Ei saa üles laadida {filename}, kuna see on kataloog või selle suurus on 0 baiti", "Total file size {size1} exceeds upload limit {size2}" : "Faili suurus {size1} ületab faili üleslaadimise mahu piirangu {size2}.", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Pole piisavalt vaba ruumi. Sa laadid üles {size1}, kuid ainult {size2} on saadaval.", @@ -44,12 +46,11 @@ "Could not create file" : "Ei suuda luua faili", "Could not create folder" : "Ei suuda luua kataloogi", "Error fetching URL" : "Viga URL-i haaramisel", - "Share" : "Jaga", + "Rename" : "Nimeta ümber", "Delete" : "Kustuta", "Disconnect storage" : "Ühenda andmehoidla lahti.", "Unshare" : "Lõpeta jagamine", - "Delete permanently" : "Kustuta jäädavalt", - "Rename" : "Nimeta ümber", + "Select" : "Vali", "Pending" : "Ootel", "Error moving file." : "Viga faili liigutamisel.", "Error moving file" : "Viga faili eemaldamisel", @@ -69,7 +70,9 @@ "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Krüpteerimisrakend on lubatud, kuid võtmeid pole lähtestatud. Palun logi välja ning uuesti sisse.", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Vigane Krüpteerimisrakendi privaatvõti . Palun uuenda oma privaatse võtme parool oma personaasete seadete all taastamaks ligipääsu oma krüpteeritud failidele.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Krüpteering on keelatud, kuid sinu failid on endiselt krüpteeritud. Palun vaata oma personaalseid seadeid oma failide dekrüpteerimiseks.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "{dirs} and {files}" : "{dirs} ja {files}", + "Favorite" : "Lemmik", "%s could not be renamed as it has been deleted" : "%s ei saa ümber nimetada, kuna see on kustutatud", "%s could not be renamed" : "%s ümbernimetamine ebaõnnestus", "Upload (max. %s)" : "Üleslaadimine (max. %s)", @@ -77,6 +80,7 @@ "Maximum upload size" : "Maksimaalne üleslaadimise suurus", "max. possible: " : "maks. võimalik: ", "Save" : "Salvesta", + "Settings" : "Seaded", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Kasuta seda aadressi <a href=\"%s\" target=\"_blank\">oma failidele ligipääsuks WebDAV kaudu</a>", "New" : "Uus", @@ -85,7 +89,8 @@ "New folder" : "Uus kaust", "Folder" : "Kaust", "From link" : "Allikast", - "Nothing in here. Upload something!" : "Siin pole midagi. Lae midagi üles!", + "Upload" : "Lae üles", + "Cancel upload" : "Tühista üleslaadimine", "Download" : "Lae alla", "Upload too large" : "Üleslaadimine on liiga suur", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Failid, mida sa proovid üles laadida, ületab serveri poolt üleslaetavatele failidele määratud maksimaalse suuruse.", diff --git a/apps/files/l10n/eu.js b/apps/files/l10n/eu.js index 5fb2ac32f7c..d8fc54f1d71 100644 --- a/apps/files/l10n/eu.js +++ b/apps/files/l10n/eu.js @@ -35,6 +35,8 @@ OC.L10N.register( "Invalid directory." : "Baliogabeko karpeta.", "Files" : "Fitxategiak", "All files" : "Fitxategi guztiak", + "Favorites" : "Gogokoak", + "Home" : "Etxekoa", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Ezin da {filename} igo karpeta bat delako edo 0 byte dituelako", "Total file size {size1} exceeds upload limit {size2}" : "Fitxategiaren tamainak {size1} igotzeko muga {size2} gainditzen du", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Ez dago leku nahikorik, zu {size1} igotzen ari zara baina bakarrik {size2} libre dago", @@ -46,12 +48,11 @@ OC.L10N.register( "Could not create file" : "Ezin izan da fitxategia sortu", "Could not create folder" : "Ezin izan da karpeta sortu", "Error fetching URL" : "Errorea URLa eskuratzerakoan", - "Share" : "Elkarbanatu", + "Rename" : "Berrizendatu", "Delete" : "Ezabatu", "Disconnect storage" : "Deskonektatu biltegia", "Unshare" : "Ez elkarbanatu", - "Delete permanently" : "Ezabatu betirako", - "Rename" : "Berrizendatu", + "Select" : "hautatu", "Pending" : "Zain", "Error moving file." : "Errorea fitxategia mugitzean.", "Error moving file" : "Errorea fitxategia mugitzean", @@ -71,7 +72,9 @@ OC.L10N.register( "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Enkriptazio aplikazioa gaituta dago baina zure gakoak ez daude konfiguratuta, mesedez saioa bukatu eta berriro hasi", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Enkriptazio aplikaziorako gako pribatu okerra. Mesedez eguneratu zure gako pribatuaren pasahitza zure ezarpen pertsonaletan zure enkriptatuko fitxategietarako sarrera berreskuratzeko.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Enkriptazioa desgaitua izan da baina zure fitxategiak oraindik enkriptatuta daude. Mesedez jo zure ezarpen pertsonaletara zure fitxategiak dekodifikatzeko.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "{dirs} and {files}" : "{dirs} eta {files}", + "Favorite" : "Gogokoa", "%s could not be renamed as it has been deleted" : "%s ezin izan da berrizendatu ezabatua zegoen eta", "%s could not be renamed" : "%s ezin da berrizendatu", "Upload (max. %s)" : "Igo (max. %s)", @@ -79,6 +82,7 @@ OC.L10N.register( "Maximum upload size" : "Igo daitekeen gehienezko tamaina", "max. possible: " : "max, posiblea:", "Save" : "Gorde", + "Settings" : "Ezarpenak", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "<a href=\"%s\" target=\"_blank\">helbidea erabili zure fitxategiak WebDAV bidez eskuratzeko</a>", "New" : "Berria", @@ -87,7 +91,8 @@ OC.L10N.register( "New folder" : "Karpeta berria", "Folder" : "Karpeta", "From link" : "Estekatik", - "Nothing in here. Upload something!" : "Ez dago ezer. Igo zerbait!", + "Upload" : "Igo", + "Cancel upload" : "Ezeztatu igoera", "Download" : "Deskargatu", "Upload too large" : "Igoera handiegia da", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Igotzen saiatzen ari zaren fitxategiak zerbitzari honek igotzeko onartzen duena baino handiagoak dira.", diff --git a/apps/files/l10n/eu.json b/apps/files/l10n/eu.json index fadc0218477..bbbbb2ba447 100644 --- a/apps/files/l10n/eu.json +++ b/apps/files/l10n/eu.json @@ -33,6 +33,8 @@ "Invalid directory." : "Baliogabeko karpeta.", "Files" : "Fitxategiak", "All files" : "Fitxategi guztiak", + "Favorites" : "Gogokoak", + "Home" : "Etxekoa", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Ezin da {filename} igo karpeta bat delako edo 0 byte dituelako", "Total file size {size1} exceeds upload limit {size2}" : "Fitxategiaren tamainak {size1} igotzeko muga {size2} gainditzen du", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Ez dago leku nahikorik, zu {size1} igotzen ari zara baina bakarrik {size2} libre dago", @@ -44,12 +46,11 @@ "Could not create file" : "Ezin izan da fitxategia sortu", "Could not create folder" : "Ezin izan da karpeta sortu", "Error fetching URL" : "Errorea URLa eskuratzerakoan", - "Share" : "Elkarbanatu", + "Rename" : "Berrizendatu", "Delete" : "Ezabatu", "Disconnect storage" : "Deskonektatu biltegia", "Unshare" : "Ez elkarbanatu", - "Delete permanently" : "Ezabatu betirako", - "Rename" : "Berrizendatu", + "Select" : "hautatu", "Pending" : "Zain", "Error moving file." : "Errorea fitxategia mugitzean.", "Error moving file" : "Errorea fitxategia mugitzean", @@ -69,7 +70,9 @@ "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Enkriptazio aplikazioa gaituta dago baina zure gakoak ez daude konfiguratuta, mesedez saioa bukatu eta berriro hasi", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Enkriptazio aplikaziorako gako pribatu okerra. Mesedez eguneratu zure gako pribatuaren pasahitza zure ezarpen pertsonaletan zure enkriptatuko fitxategietarako sarrera berreskuratzeko.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Enkriptazioa desgaitua izan da baina zure fitxategiak oraindik enkriptatuta daude. Mesedez jo zure ezarpen pertsonaletara zure fitxategiak dekodifikatzeko.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "{dirs} and {files}" : "{dirs} eta {files}", + "Favorite" : "Gogokoa", "%s could not be renamed as it has been deleted" : "%s ezin izan da berrizendatu ezabatua zegoen eta", "%s could not be renamed" : "%s ezin da berrizendatu", "Upload (max. %s)" : "Igo (max. %s)", @@ -77,6 +80,7 @@ "Maximum upload size" : "Igo daitekeen gehienezko tamaina", "max. possible: " : "max, posiblea:", "Save" : "Gorde", + "Settings" : "Ezarpenak", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "<a href=\"%s\" target=\"_blank\">helbidea erabili zure fitxategiak WebDAV bidez eskuratzeko</a>", "New" : "Berria", @@ -85,7 +89,8 @@ "New folder" : "Karpeta berria", "Folder" : "Karpeta", "From link" : "Estekatik", - "Nothing in here. Upload something!" : "Ez dago ezer. Igo zerbait!", + "Upload" : "Igo", + "Cancel upload" : "Ezeztatu igoera", "Download" : "Deskargatu", "Upload too large" : "Igoera handiegia da", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Igotzen saiatzen ari zaren fitxategiak zerbitzari honek igotzeko onartzen duena baino handiagoak dira.", diff --git a/apps/files/l10n/fa.js b/apps/files/l10n/fa.js index 1e403418ab1..617201108d9 100644 --- a/apps/files/l10n/fa.js +++ b/apps/files/l10n/fa.js @@ -19,14 +19,14 @@ OC.L10N.register( "Not enough storage available" : "فضای کافی در دسترس نیست", "Invalid directory." : "فهرست راهنما نامعتبر می باشد.", "Files" : "پروندهها", + "Favorites" : "موارد محبوب", + "Home" : "خانه", "Upload cancelled." : "بار گذاری لغو شد", "File upload is in progress. Leaving the page now will cancel the upload." : "آپلودکردن پرونده در حال پیشرفت است. در صورت خروج از صفحه آپلود لغو میگردد. ", "{new_name} already exists" : "{نام _جدید} در حال حاضر وجود دارد.", - "Share" : "اشتراکگذاری", + "Rename" : "تغییرنام", "Delete" : "حذف", "Unshare" : "لغو اشتراک", - "Delete permanently" : "حذف قطعی", - "Rename" : "تغییرنام", "Pending" : "در انتظار", "Error" : "خطا", "Name" : "نام", @@ -37,11 +37,13 @@ OC.L10N.register( "_Uploading %n file_::_Uploading %n files_" : ["در حال بارگذاری %n فایل"], "Your storage is full, files can not be updated or synced anymore!" : "فضای ذخیره ی شما کاملا پر است، بیش از این فایلها بهنگام یا همگام سازی نمی توانند بشوند!", "Your storage is almost full ({usedSpacePercent}%)" : "فضای ذخیره ی شما تقریبا پر است ({usedSpacePercent}%)", + "_ matches '{filter}'_::_ match '{filter}'_" : [""], "%s could not be renamed" : "%s نمیتواند تغییر نام دهد.", "File handling" : "اداره پرونده ها", "Maximum upload size" : "حداکثر اندازه بارگزاری", "max. possible: " : "حداکثرمقدارممکن:", "Save" : "ذخیره", + "Settings" : "تنظیمات", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "از این آدرس استفاده کنید تا <a href=\"%s\" target=\"_blank\">بتوانید به فایلهای خود توسط WebDAV دسترسی پیدا کنید</a>", "New" : "جدید", @@ -49,7 +51,8 @@ OC.L10N.register( "New folder" : "پوشه جدید", "Folder" : "پوشه", "From link" : "از پیوند", - "Nothing in here. Upload something!" : "اینجا هیچ چیز نیست.", + "Upload" : "بارگزاری", + "Cancel upload" : "متوقف کردن بار گذاری", "Download" : "دانلود", "Upload too large" : "سایز فایل برای آپلود زیاد است(م.تنظیمات در php.ini)", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "فایلها بیش از حد تعیین شده در این سرور هستند\nمترجم:با تغییر فایل php,ini میتوان این محدودیت را برطرف کرد", diff --git a/apps/files/l10n/fa.json b/apps/files/l10n/fa.json index 872cef839a7..9e5ae8ca3f2 100644 --- a/apps/files/l10n/fa.json +++ b/apps/files/l10n/fa.json @@ -17,14 +17,14 @@ "Not enough storage available" : "فضای کافی در دسترس نیست", "Invalid directory." : "فهرست راهنما نامعتبر می باشد.", "Files" : "پروندهها", + "Favorites" : "موارد محبوب", + "Home" : "خانه", "Upload cancelled." : "بار گذاری لغو شد", "File upload is in progress. Leaving the page now will cancel the upload." : "آپلودکردن پرونده در حال پیشرفت است. در صورت خروج از صفحه آپلود لغو میگردد. ", "{new_name} already exists" : "{نام _جدید} در حال حاضر وجود دارد.", - "Share" : "اشتراکگذاری", + "Rename" : "تغییرنام", "Delete" : "حذف", "Unshare" : "لغو اشتراک", - "Delete permanently" : "حذف قطعی", - "Rename" : "تغییرنام", "Pending" : "در انتظار", "Error" : "خطا", "Name" : "نام", @@ -35,11 +35,13 @@ "_Uploading %n file_::_Uploading %n files_" : ["در حال بارگذاری %n فایل"], "Your storage is full, files can not be updated or synced anymore!" : "فضای ذخیره ی شما کاملا پر است، بیش از این فایلها بهنگام یا همگام سازی نمی توانند بشوند!", "Your storage is almost full ({usedSpacePercent}%)" : "فضای ذخیره ی شما تقریبا پر است ({usedSpacePercent}%)", + "_ matches '{filter}'_::_ match '{filter}'_" : [""], "%s could not be renamed" : "%s نمیتواند تغییر نام دهد.", "File handling" : "اداره پرونده ها", "Maximum upload size" : "حداکثر اندازه بارگزاری", "max. possible: " : "حداکثرمقدارممکن:", "Save" : "ذخیره", + "Settings" : "تنظیمات", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "از این آدرس استفاده کنید تا <a href=\"%s\" target=\"_blank\">بتوانید به فایلهای خود توسط WebDAV دسترسی پیدا کنید</a>", "New" : "جدید", @@ -47,7 +49,8 @@ "New folder" : "پوشه جدید", "Folder" : "پوشه", "From link" : "از پیوند", - "Nothing in here. Upload something!" : "اینجا هیچ چیز نیست.", + "Upload" : "بارگزاری", + "Cancel upload" : "متوقف کردن بار گذاری", "Download" : "دانلود", "Upload too large" : "سایز فایل برای آپلود زیاد است(م.تنظیمات در php.ini)", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "فایلها بیش از حد تعیین شده در این سرور هستند\nمترجم:با تغییر فایل php,ini میتوان این محدودیت را برطرف کرد", diff --git a/apps/files/l10n/fi.js b/apps/files/l10n/fi.js new file mode 100644 index 00000000000..e71703fe357 --- /dev/null +++ b/apps/files/l10n/fi.js @@ -0,0 +1,17 @@ +OC.L10N.register( + "files", + { + "Rename" : "Nimeä uudelleen", + "Delete" : "Poista", + "Error" : "Virhe", + "_%n folder_::_%n folders_" : ["",""], + "_%n file_::_%n files_" : ["",""], + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "Favorite" : "Suosikit", + "Save" : "Tallenna", + "Settings" : "Asetukset", + "New folder" : "Luo kansio", + "Folder" : "Kansio", + "Upload" : "Lähetä" +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/fi.json b/apps/files/l10n/fi.json new file mode 100644 index 00000000000..f46767e171b --- /dev/null +++ b/apps/files/l10n/fi.json @@ -0,0 +1,15 @@ +{ "translations": { + "Rename" : "Nimeä uudelleen", + "Delete" : "Poista", + "Error" : "Virhe", + "_%n folder_::_%n folders_" : ["",""], + "_%n file_::_%n files_" : ["",""], + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "Favorite" : "Suosikit", + "Save" : "Tallenna", + "Settings" : "Asetukset", + "New folder" : "Luo kansio", + "Folder" : "Kansio", + "Upload" : "Lähetä" +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/files/l10n/fi_FI.js b/apps/files/l10n/fi_FI.js index 3c94a518774..545216e04aa 100644 --- a/apps/files/l10n/fi_FI.js +++ b/apps/files/l10n/fi_FI.js @@ -35,6 +35,8 @@ OC.L10N.register( "Invalid directory." : "Virheellinen kansio.", "Files" : "Tiedostot", "All files" : "Kaikki tiedostot", + "Favorites" : "Suosikit", + "Home" : "Koti", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Kohdetta {filename} ei voi lähettää, koska se on joko kansio tai sen koko on 0 tavua", "Total file size {size1} exceeds upload limit {size2}" : "Yhteiskoko {size1} ylittää lähetysrajan {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Ei riittävästi vapaata tilaa. Lähetyksesi koko on {size1}, mutta vain {size2} on jäljellä", @@ -46,18 +48,19 @@ OC.L10N.register( "Could not create file" : "Tiedoston luominen epäonnistui", "Could not create folder" : "Kansion luominen epäonnistui", "Error fetching URL" : "Virhe noutaessa verkko-osoitetta", - "Share" : "Jaa", + "Rename" : "Nimeä uudelleen", "Delete" : "Poista", "Disconnect storage" : "Katkaise yhteys tallennustilaan", "Unshare" : "Peru jakaminen", - "Delete permanently" : "Poista pysyvästi", - "Rename" : "Nimeä uudelleen", + "Select" : "Valitse", "Pending" : "Odottaa", + "Unable to determine date" : "Päivämäärän määrittäminen epäonnistui", "Error moving file." : "Virhe tiedostoa siirrettäessä.", "Error moving file" : "Virhe tiedostoa siirrettäessä", "Error" : "Virhe", "Could not rename file" : "Tiedoston nimeäminen uudelleen epäonnistui", "Error deleting file." : "Virhe tiedostoa poistaessa.", + "No entries in this folder match '{filter}'" : "Mikään tässä kansiossa ei vastaa suodatusta '{filter}'", "Name" : "Nimi", "Size" : "Koko", "Modified" : "Muokattu", @@ -71,7 +74,10 @@ OC.L10N.register( "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Salaussovellus on käytössä, mutta salausavaimia ei ole alustettu. Ole hyvä ja kirjaudu sisään uudelleen.", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Salaussovelluksen salausavain on virheellinen. Ole hyvä ja päivitä salausavain henkilökohtaisissa asetuksissasi jotta voit taas avata salatuskirjoitetut tiedostosi.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Salaus poistettiin käytöstä, mutta tiedostosi ovat edelleen salattuina. Siirry henkilökohtaisiin asetuksiin avataksesi tiedostojesi salauksen.", + "_ matches '{filter}'_::_ match '{filter}'_" : [" vastaa suodatusta '{filter}'"," vastaa suodatusta '{filter}'"], "{dirs} and {files}" : "{dirs} ja {files}", + "Favorited" : "Lisätty suosikkeihin", + "Favorite" : "Suosikki", "%s could not be renamed as it has been deleted" : "Kohdetta %s ei voitu nimetä uudelleen, koska se on poistettu", "%s could not be renamed" : "kohteen %s nimeäminen uudelleen epäonnistui", "Upload (max. %s)" : "Lähetys (enintään %s)", @@ -79,6 +85,7 @@ OC.L10N.register( "Maximum upload size" : "Lähetettävän tiedoston suurin sallittu koko", "max. possible: " : "suurin mahdollinen:", "Save" : "Tallenna", + "Settings" : "Asetukset", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Käytä tätä osoitetta <a href=\"%s\" target=\"_blank\">käyttääksesi tiedostojasi WebDAVin kautta</a>", "New" : "Uusi", @@ -87,11 +94,18 @@ OC.L10N.register( "New folder" : "Uusi kansio", "Folder" : "Kansio", "From link" : "Linkistä", - "Nothing in here. Upload something!" : "Täällä ei ole mitään. Lähetä tänne jotakin!", + "Upload" : "Lähetä", + "Cancel upload" : "Peru lähetys", + "No files yet" : "EI yhtäkään tiedostoa vielä", + "Upload some content or sync with your devices!" : "Lähetä tiedostoja tai synkronoi sisältö laitteidesi kanssa!", + "No entries found in this folder" : "Ei kohteita tässä kansiossa", + "Select all" : "Valitse kaikki", "Download" : "Lataa", "Upload too large" : "Lähetettävä tiedosto on liian suuri", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Lähetettäväksi valitsemasi tiedostot ylittävät palvelimen salliman tiedostokoon rajan.", "Files are being scanned, please wait." : "Tiedostoja tarkistetaan, odota hetki.", - "Currently scanning" : "Tutkitaan parhaillaan" + "Currently scanning" : "Tutkitaan parhaillaan", + "No favorites" : "Ei suosikkeja", + "Files and folders you mark as favorite will show up here" : "Suosikeiksi merkitsemäsi tiedostot ja kansiot näkyvät täällä" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/fi_FI.json b/apps/files/l10n/fi_FI.json index 8628607793b..81fac88172d 100644 --- a/apps/files/l10n/fi_FI.json +++ b/apps/files/l10n/fi_FI.json @@ -33,6 +33,8 @@ "Invalid directory." : "Virheellinen kansio.", "Files" : "Tiedostot", "All files" : "Kaikki tiedostot", + "Favorites" : "Suosikit", + "Home" : "Koti", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Kohdetta {filename} ei voi lähettää, koska se on joko kansio tai sen koko on 0 tavua", "Total file size {size1} exceeds upload limit {size2}" : "Yhteiskoko {size1} ylittää lähetysrajan {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Ei riittävästi vapaata tilaa. Lähetyksesi koko on {size1}, mutta vain {size2} on jäljellä", @@ -44,18 +46,19 @@ "Could not create file" : "Tiedoston luominen epäonnistui", "Could not create folder" : "Kansion luominen epäonnistui", "Error fetching URL" : "Virhe noutaessa verkko-osoitetta", - "Share" : "Jaa", + "Rename" : "Nimeä uudelleen", "Delete" : "Poista", "Disconnect storage" : "Katkaise yhteys tallennustilaan", "Unshare" : "Peru jakaminen", - "Delete permanently" : "Poista pysyvästi", - "Rename" : "Nimeä uudelleen", + "Select" : "Valitse", "Pending" : "Odottaa", + "Unable to determine date" : "Päivämäärän määrittäminen epäonnistui", "Error moving file." : "Virhe tiedostoa siirrettäessä.", "Error moving file" : "Virhe tiedostoa siirrettäessä", "Error" : "Virhe", "Could not rename file" : "Tiedoston nimeäminen uudelleen epäonnistui", "Error deleting file." : "Virhe tiedostoa poistaessa.", + "No entries in this folder match '{filter}'" : "Mikään tässä kansiossa ei vastaa suodatusta '{filter}'", "Name" : "Nimi", "Size" : "Koko", "Modified" : "Muokattu", @@ -69,7 +72,10 @@ "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Salaussovellus on käytössä, mutta salausavaimia ei ole alustettu. Ole hyvä ja kirjaudu sisään uudelleen.", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Salaussovelluksen salausavain on virheellinen. Ole hyvä ja päivitä salausavain henkilökohtaisissa asetuksissasi jotta voit taas avata salatuskirjoitetut tiedostosi.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Salaus poistettiin käytöstä, mutta tiedostosi ovat edelleen salattuina. Siirry henkilökohtaisiin asetuksiin avataksesi tiedostojesi salauksen.", + "_ matches '{filter}'_::_ match '{filter}'_" : [" vastaa suodatusta '{filter}'"," vastaa suodatusta '{filter}'"], "{dirs} and {files}" : "{dirs} ja {files}", + "Favorited" : "Lisätty suosikkeihin", + "Favorite" : "Suosikki", "%s could not be renamed as it has been deleted" : "Kohdetta %s ei voitu nimetä uudelleen, koska se on poistettu", "%s could not be renamed" : "kohteen %s nimeäminen uudelleen epäonnistui", "Upload (max. %s)" : "Lähetys (enintään %s)", @@ -77,6 +83,7 @@ "Maximum upload size" : "Lähetettävän tiedoston suurin sallittu koko", "max. possible: " : "suurin mahdollinen:", "Save" : "Tallenna", + "Settings" : "Asetukset", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Käytä tätä osoitetta <a href=\"%s\" target=\"_blank\">käyttääksesi tiedostojasi WebDAVin kautta</a>", "New" : "Uusi", @@ -85,11 +92,18 @@ "New folder" : "Uusi kansio", "Folder" : "Kansio", "From link" : "Linkistä", - "Nothing in here. Upload something!" : "Täällä ei ole mitään. Lähetä tänne jotakin!", + "Upload" : "Lähetä", + "Cancel upload" : "Peru lähetys", + "No files yet" : "EI yhtäkään tiedostoa vielä", + "Upload some content or sync with your devices!" : "Lähetä tiedostoja tai synkronoi sisältö laitteidesi kanssa!", + "No entries found in this folder" : "Ei kohteita tässä kansiossa", + "Select all" : "Valitse kaikki", "Download" : "Lataa", "Upload too large" : "Lähetettävä tiedosto on liian suuri", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Lähetettäväksi valitsemasi tiedostot ylittävät palvelimen salliman tiedostokoon rajan.", "Files are being scanned, please wait." : "Tiedostoja tarkistetaan, odota hetki.", - "Currently scanning" : "Tutkitaan parhaillaan" + "Currently scanning" : "Tutkitaan parhaillaan", + "No favorites" : "Ei suosikkeja", + "Files and folders you mark as favorite will show up here" : "Suosikeiksi merkitsemäsi tiedostot ja kansiot näkyvät täällä" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/fil.js b/apps/files/l10n/fil.js index f085469f731..deae17398bd 100644 --- a/apps/files/l10n/fil.js +++ b/apps/files/l10n/fil.js @@ -3,6 +3,7 @@ OC.L10N.register( { "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""] }, "nplurals=2; plural=(n > 1);"); diff --git a/apps/files/l10n/fil.json b/apps/files/l10n/fil.json index ba9792477cd..dd9cfe83135 100644 --- a/apps/files/l10n/fil.json +++ b/apps/files/l10n/fil.json @@ -1,6 +1,7 @@ { "translations": { "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""] },"pluralForm" :"nplurals=2; plural=(n > 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/fr.js b/apps/files/l10n/fr.js index 967908eaca0..734d2bc6958 100644 --- a/apps/files/l10n/fr.js +++ b/apps/files/l10n/fr.js @@ -2,42 +2,44 @@ OC.L10N.register( "files", { "Storage not available" : "Support de stockage non disponible", - "Storage invalid" : "Support de stockage invalide", + "Storage invalid" : "Support de stockage non valable", "Unknown error" : "Erreur Inconnue ", - "Could not move %s - File with this name already exists" : "Impossible de déplacer %s - Un fichier possédant ce nom existe déjà", + "Could not move %s - File with this name already exists" : "Impossible de déplacer %s - Un fichier portant ce nom existe déjà", "Could not move %s" : "Impossible de déplacer %s", "Permission denied" : "Permission refusée", "File name cannot be empty." : "Le nom de fichier ne peut être vide.", "\"%s\" is an invalid file name." : "\"%s\" n'est pas un nom de fichier valide.", - "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." : "Nom invalide, les caractères '\\', '/', '<', '>', ':', '\"', '|', '?' et '*' ne sont pas autorisés.", + "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." : "Ce nom n'est pas valable : les caractères '\\', '/', '<', '>', ':', '\"', '|', '?' et '*' ne sont pas autorisés.", "The target folder has been moved or deleted." : "Le dossier cible a été déplacé ou supprimé.", "The name %s is already used in the folder %s. Please choose a different name." : "Le nom %s est déjà utilisé dans le dossier %s. Merci de choisir un nom différent.", "Not a valid source" : "La source n'est pas valide", "Server is not allowed to open URLs, please check the server configuration" : "Le serveur n'est pas autorisé à ouvrir des URL, veuillez vérifier la configuration du serveur", "The file exceeds your quota by %s" : "Le fichier excède votre quota de %s", - "Error while downloading %s to %s" : "Erreur pendant le téléchargement de %s à %s", + "Error while downloading %s to %s" : "Erreur pendant le téléchargement de %s vers %s", "Error when creating the file" : "Erreur pendant la création du fichier", - "Folder name cannot be empty." : "Le nom de dossier ne peux pas être vide.", + "Folder name cannot be empty." : "Le nom de dossier ne peut pas être vide.", "Error when creating the folder" : "Erreur pendant la création du dossier", - "Unable to set upload directory." : "Impossible de définir le dossier pour l'upload, charger.", + "Unable to set upload directory." : "Impossible de définir le dossier de destination.", "Invalid Token" : "Jeton non valide", "No file was uploaded. Unknown error" : "Aucun fichier n'a été envoyé. Erreur inconnue", "There is no error, the file uploaded with success" : "Aucune erreur, le fichier a été envoyé avec succès.", - "The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "Le fichier envoyé dépasse l'instruction upload_max_filesize située dans le fichier php.ini:", - "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Le fichier envoyé dépasse l'instruction MAX_FILE_SIZE qui est spécifiée dans le formulaire HTML.", + "The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "Le fichier envoyé dépasse l'instruction upload_max_filesize située dans le fichier php.ini :", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Le fichier envoyé dépasse la valeur MAX_FILE_SIZE qui est spécifiée dans le formulaire HTML.", "The uploaded file was only partially uploaded" : "Le fichier n'a été que partiellement envoyé.", "No file was uploaded" : "Pas de fichier envoyé.", - "Missing a temporary folder" : "Absence de dossier temporaire.", + "Missing a temporary folder" : "Absence de dossier temporaire", "Failed to write to disk" : "Erreur d'écriture sur le disque", - "Not enough storage available" : "Plus assez d'espace de stockage disponible", + "Not enough storage available" : "Trop peu d'espace de stockage disponible", "Upload failed. Could not find uploaded file" : "L'envoi a échoué. Impossible de trouver le fichier envoyé.", "Upload failed. Could not get file info." : "L'envoi a échoué. Impossible d'obtenir les informations du fichier.", - "Invalid directory." : "Dossier invalide.", + "Invalid directory." : "Dossier non valide.", "Files" : "Fichiers", "All files" : "Tous les fichiers", + "Favorites" : "Favoris", + "Home" : "Mes fichiers", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Impossible d'envoyer {filename} car il s'agit d'un répertoire ou d'un fichier de taille nulle", "Total file size {size1} exceeds upload limit {size2}" : "La taille totale du fichier {size1} excède la taille maximale d'envoi {size2}", - "Not enough free space, you are uploading {size1} but only {size2} is left" : "Espace insuffisant : vous tentez d'envoyer {size1} mais seulement {size2} sont disponibles", + "Not enough free space, you are uploading {size1} but only {size2} is left" : "Espace libre insuffisant : vous tentez d'envoyer {size1} mais seulement {size2} sont disponibles", "Upload cancelled." : "Envoi annulé.", "Could not get result from server." : "Ne peut recevoir les résultats du serveur.", "File upload is in progress. Leaving the page now will cancel the upload." : "L'envoi du fichier est en cours. Quitter cette page maintenant annulera l'envoi du fichier.", @@ -46,13 +48,13 @@ OC.L10N.register( "Could not create file" : "Impossible de créer le fichier", "Could not create folder" : "Impossible de créer le dossier", "Error fetching URL" : "Erreur d'accès à l'URL", - "Share" : "Partager", + "Rename" : "Renommer", "Delete" : "Supprimer", "Disconnect storage" : "Déconnecter ce support de stockage", "Unshare" : "Ne plus partager", - "Delete permanently" : "Supprimer de façon définitive", - "Rename" : "Renommer", + "Select" : "Sélectionner", "Pending" : "En attente", + "Unable to determine date" : "Impossible de déterminer la date", "Error moving file." : "Erreur lors du déplacement du fichier.", "Error moving file" : "Erreur lors du déplacement du fichier", "Error" : "Erreur", @@ -63,22 +65,26 @@ OC.L10N.register( "Modified" : "Modifié", "_%n folder_::_%n folders_" : ["%n dossier","%n dossiers"], "_%n file_::_%n files_" : ["%n fichier","%n fichiers"], - "You don’t have permission to upload or create files here" : "Vous n'avez pas la permission de téléverser ou de créer des fichiers ici", + "You don’t have permission to upload or create files here" : "Vous n'avez pas la permission d'ajouter des fichiers ici", "_Uploading %n file_::_Uploading %n files_" : ["Téléversement de %n fichier","Téléversement de %n fichiers"], "\"{name}\" is an invalid file name." : "\"{name}\" n'est pas un nom de fichier valide.", - "Your storage is full, files can not be updated or synced anymore!" : "Votre espage de stockage est plein, les fichiers ne peuvent plus être téléversés ou synchronisés !", + "Your storage is full, files can not be updated or synced anymore!" : "Votre espage de stockage est plein, les fichiers ne peuvent plus être ajoutés ou synchronisés !", "Your storage is almost full ({usedSpacePercent}%)" : "Votre espace de stockage est presque plein ({usedSpacePercent}%)", - "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "L'application de chiffrement est activée mais vos clés ne sont pas initialisées, veuillez vous déconnecter et ensuite vous reconnecter.", - "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Votre clef privée pour l'application de chiffrement est invalide ! Veuillez mettre à jour le mot de passe de votre clef privée dans vos paramètres personnels pour récupérer l'accès à vos fichiers chiffrés.", - "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Le chiffrement était désactivé mais vos fichiers sont toujours chiffrés. Veuillez vous rendre sur vos Paramètres personnels pour déchiffrer vos fichiers.", + "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Le chiffrement est activé, mais vos clés ne sont pas initialisées. Veuillez vous déconnecter et ensuite vous reconnecter.", + "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Votre clef privée pour le chiffrement n'est pas valide ! Veuillez mettre à jour le mot de passe de votre clef privée dans vos paramètres personnels pour récupérer l'accès à vos fichiers chiffrés.", + "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Le chiffrement a été désactivé mais vos fichiers sont toujours chiffrés. Veuillez vous rendre sur vos paramètres personnels pour déchiffrer vos fichiers.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "{dirs} and {files}" : "{dirs} et {files}", + "Favorited" : "Marqué comme favori", + "Favorite" : "Favoris", "%s could not be renamed as it has been deleted" : "%s ne peut être renommé car il a été supprimé ", "%s could not be renamed" : "%s ne peut être renommé", "Upload (max. %s)" : "Envoi (max. %s)", - "File handling" : "Gestion des fichiers", + "File handling" : "Gestion de fichiers", "Maximum upload size" : "Taille max. d'envoi", "max. possible: " : "Max. possible :", "Save" : "Sauvegarder", + "Settings" : "Paramètres", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Utilisez cette adresse pour <a href=\"%s\" target=\"_blank\">accéder à vos fichiers par WebDAV</a>", "New" : "Nouveau", @@ -87,11 +93,17 @@ OC.L10N.register( "New folder" : "Nouveau dossier", "Folder" : "Dossier", "From link" : "Depuis un lien", - "Nothing in here. Upload something!" : "Il n'y a rien ici ! Envoyez donc quelque chose :)", + "Upload" : "Chargement", + "Cancel upload" : "Annuler l'envoi", + "No files yet" : "Aucun fichier pour l'instant", + "Upload some content or sync with your devices!" : "Envoyez des fichiers ou synchronisez en depuis vos appareils", + "Select all" : "Tout sélectionner", "Download" : "Télécharger", "Upload too large" : "Téléversement trop volumineux", - "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Les fichiers que vous essayez d'envoyer dépassent la taille maximale permise par ce serveur.", + "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Les fichiers que vous essayez d'envoyer dépassent la taille maximale d'envoi permise par ce serveur.", "Files are being scanned, please wait." : "Les fichiers sont en cours d'analyse, veuillez patienter.", - "Currently scanning" : "Analyse en cours" + "Currently scanning" : "Analyse en cours", + "No favorites" : "Pas de favori", + "Files and folders you mark as favorite will show up here" : "Les fichiers et dossiers ajoutés à vos favoris apparaîtront ici" }, "nplurals=2; plural=(n > 1);"); diff --git a/apps/files/l10n/fr.json b/apps/files/l10n/fr.json index 19c9154dc79..3964860a6cc 100644 --- a/apps/files/l10n/fr.json +++ b/apps/files/l10n/fr.json @@ -1,41 +1,43 @@ { "translations": { "Storage not available" : "Support de stockage non disponible", - "Storage invalid" : "Support de stockage invalide", + "Storage invalid" : "Support de stockage non valable", "Unknown error" : "Erreur Inconnue ", - "Could not move %s - File with this name already exists" : "Impossible de déplacer %s - Un fichier possédant ce nom existe déjà", + "Could not move %s - File with this name already exists" : "Impossible de déplacer %s - Un fichier portant ce nom existe déjà", "Could not move %s" : "Impossible de déplacer %s", "Permission denied" : "Permission refusée", "File name cannot be empty." : "Le nom de fichier ne peut être vide.", "\"%s\" is an invalid file name." : "\"%s\" n'est pas un nom de fichier valide.", - "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." : "Nom invalide, les caractères '\\', '/', '<', '>', ':', '\"', '|', '?' et '*' ne sont pas autorisés.", + "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." : "Ce nom n'est pas valable : les caractères '\\', '/', '<', '>', ':', '\"', '|', '?' et '*' ne sont pas autorisés.", "The target folder has been moved or deleted." : "Le dossier cible a été déplacé ou supprimé.", "The name %s is already used in the folder %s. Please choose a different name." : "Le nom %s est déjà utilisé dans le dossier %s. Merci de choisir un nom différent.", "Not a valid source" : "La source n'est pas valide", "Server is not allowed to open URLs, please check the server configuration" : "Le serveur n'est pas autorisé à ouvrir des URL, veuillez vérifier la configuration du serveur", "The file exceeds your quota by %s" : "Le fichier excède votre quota de %s", - "Error while downloading %s to %s" : "Erreur pendant le téléchargement de %s à %s", + "Error while downloading %s to %s" : "Erreur pendant le téléchargement de %s vers %s", "Error when creating the file" : "Erreur pendant la création du fichier", - "Folder name cannot be empty." : "Le nom de dossier ne peux pas être vide.", + "Folder name cannot be empty." : "Le nom de dossier ne peut pas être vide.", "Error when creating the folder" : "Erreur pendant la création du dossier", - "Unable to set upload directory." : "Impossible de définir le dossier pour l'upload, charger.", + "Unable to set upload directory." : "Impossible de définir le dossier de destination.", "Invalid Token" : "Jeton non valide", "No file was uploaded. Unknown error" : "Aucun fichier n'a été envoyé. Erreur inconnue", "There is no error, the file uploaded with success" : "Aucune erreur, le fichier a été envoyé avec succès.", - "The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "Le fichier envoyé dépasse l'instruction upload_max_filesize située dans le fichier php.ini:", - "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Le fichier envoyé dépasse l'instruction MAX_FILE_SIZE qui est spécifiée dans le formulaire HTML.", + "The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "Le fichier envoyé dépasse l'instruction upload_max_filesize située dans le fichier php.ini :", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Le fichier envoyé dépasse la valeur MAX_FILE_SIZE qui est spécifiée dans le formulaire HTML.", "The uploaded file was only partially uploaded" : "Le fichier n'a été que partiellement envoyé.", "No file was uploaded" : "Pas de fichier envoyé.", - "Missing a temporary folder" : "Absence de dossier temporaire.", + "Missing a temporary folder" : "Absence de dossier temporaire", "Failed to write to disk" : "Erreur d'écriture sur le disque", - "Not enough storage available" : "Plus assez d'espace de stockage disponible", + "Not enough storage available" : "Trop peu d'espace de stockage disponible", "Upload failed. Could not find uploaded file" : "L'envoi a échoué. Impossible de trouver le fichier envoyé.", "Upload failed. Could not get file info." : "L'envoi a échoué. Impossible d'obtenir les informations du fichier.", - "Invalid directory." : "Dossier invalide.", + "Invalid directory." : "Dossier non valide.", "Files" : "Fichiers", "All files" : "Tous les fichiers", + "Favorites" : "Favoris", + "Home" : "Mes fichiers", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Impossible d'envoyer {filename} car il s'agit d'un répertoire ou d'un fichier de taille nulle", "Total file size {size1} exceeds upload limit {size2}" : "La taille totale du fichier {size1} excède la taille maximale d'envoi {size2}", - "Not enough free space, you are uploading {size1} but only {size2} is left" : "Espace insuffisant : vous tentez d'envoyer {size1} mais seulement {size2} sont disponibles", + "Not enough free space, you are uploading {size1} but only {size2} is left" : "Espace libre insuffisant : vous tentez d'envoyer {size1} mais seulement {size2} sont disponibles", "Upload cancelled." : "Envoi annulé.", "Could not get result from server." : "Ne peut recevoir les résultats du serveur.", "File upload is in progress. Leaving the page now will cancel the upload." : "L'envoi du fichier est en cours. Quitter cette page maintenant annulera l'envoi du fichier.", @@ -44,13 +46,13 @@ "Could not create file" : "Impossible de créer le fichier", "Could not create folder" : "Impossible de créer le dossier", "Error fetching URL" : "Erreur d'accès à l'URL", - "Share" : "Partager", + "Rename" : "Renommer", "Delete" : "Supprimer", "Disconnect storage" : "Déconnecter ce support de stockage", "Unshare" : "Ne plus partager", - "Delete permanently" : "Supprimer de façon définitive", - "Rename" : "Renommer", + "Select" : "Sélectionner", "Pending" : "En attente", + "Unable to determine date" : "Impossible de déterminer la date", "Error moving file." : "Erreur lors du déplacement du fichier.", "Error moving file" : "Erreur lors du déplacement du fichier", "Error" : "Erreur", @@ -61,22 +63,26 @@ "Modified" : "Modifié", "_%n folder_::_%n folders_" : ["%n dossier","%n dossiers"], "_%n file_::_%n files_" : ["%n fichier","%n fichiers"], - "You don’t have permission to upload or create files here" : "Vous n'avez pas la permission de téléverser ou de créer des fichiers ici", + "You don’t have permission to upload or create files here" : "Vous n'avez pas la permission d'ajouter des fichiers ici", "_Uploading %n file_::_Uploading %n files_" : ["Téléversement de %n fichier","Téléversement de %n fichiers"], "\"{name}\" is an invalid file name." : "\"{name}\" n'est pas un nom de fichier valide.", - "Your storage is full, files can not be updated or synced anymore!" : "Votre espage de stockage est plein, les fichiers ne peuvent plus être téléversés ou synchronisés !", + "Your storage is full, files can not be updated or synced anymore!" : "Votre espage de stockage est plein, les fichiers ne peuvent plus être ajoutés ou synchronisés !", "Your storage is almost full ({usedSpacePercent}%)" : "Votre espace de stockage est presque plein ({usedSpacePercent}%)", - "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "L'application de chiffrement est activée mais vos clés ne sont pas initialisées, veuillez vous déconnecter et ensuite vous reconnecter.", - "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Votre clef privée pour l'application de chiffrement est invalide ! Veuillez mettre à jour le mot de passe de votre clef privée dans vos paramètres personnels pour récupérer l'accès à vos fichiers chiffrés.", - "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Le chiffrement était désactivé mais vos fichiers sont toujours chiffrés. Veuillez vous rendre sur vos Paramètres personnels pour déchiffrer vos fichiers.", + "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Le chiffrement est activé, mais vos clés ne sont pas initialisées. Veuillez vous déconnecter et ensuite vous reconnecter.", + "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Votre clef privée pour le chiffrement n'est pas valide ! Veuillez mettre à jour le mot de passe de votre clef privée dans vos paramètres personnels pour récupérer l'accès à vos fichiers chiffrés.", + "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Le chiffrement a été désactivé mais vos fichiers sont toujours chiffrés. Veuillez vous rendre sur vos paramètres personnels pour déchiffrer vos fichiers.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "{dirs} and {files}" : "{dirs} et {files}", + "Favorited" : "Marqué comme favori", + "Favorite" : "Favoris", "%s could not be renamed as it has been deleted" : "%s ne peut être renommé car il a été supprimé ", "%s could not be renamed" : "%s ne peut être renommé", "Upload (max. %s)" : "Envoi (max. %s)", - "File handling" : "Gestion des fichiers", + "File handling" : "Gestion de fichiers", "Maximum upload size" : "Taille max. d'envoi", "max. possible: " : "Max. possible :", "Save" : "Sauvegarder", + "Settings" : "Paramètres", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Utilisez cette adresse pour <a href=\"%s\" target=\"_blank\">accéder à vos fichiers par WebDAV</a>", "New" : "Nouveau", @@ -85,11 +91,17 @@ "New folder" : "Nouveau dossier", "Folder" : "Dossier", "From link" : "Depuis un lien", - "Nothing in here. Upload something!" : "Il n'y a rien ici ! Envoyez donc quelque chose :)", + "Upload" : "Chargement", + "Cancel upload" : "Annuler l'envoi", + "No files yet" : "Aucun fichier pour l'instant", + "Upload some content or sync with your devices!" : "Envoyez des fichiers ou synchronisez en depuis vos appareils", + "Select all" : "Tout sélectionner", "Download" : "Télécharger", "Upload too large" : "Téléversement trop volumineux", - "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Les fichiers que vous essayez d'envoyer dépassent la taille maximale permise par ce serveur.", + "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Les fichiers que vous essayez d'envoyer dépassent la taille maximale d'envoi permise par ce serveur.", "Files are being scanned, please wait." : "Les fichiers sont en cours d'analyse, veuillez patienter.", - "Currently scanning" : "Analyse en cours" + "Currently scanning" : "Analyse en cours", + "No favorites" : "Pas de favori", + "Files and folders you mark as favorite will show up here" : "Les fichiers et dossiers ajoutés à vos favoris apparaîtront ici" },"pluralForm" :"nplurals=2; plural=(n > 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/fr_CA.js b/apps/files/l10n/fr_CA.js index f085469f731..deae17398bd 100644 --- a/apps/files/l10n/fr_CA.js +++ b/apps/files/l10n/fr_CA.js @@ -3,6 +3,7 @@ OC.L10N.register( { "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""] }, "nplurals=2; plural=(n > 1);"); diff --git a/apps/files/l10n/fr_CA.json b/apps/files/l10n/fr_CA.json index ba9792477cd..dd9cfe83135 100644 --- a/apps/files/l10n/fr_CA.json +++ b/apps/files/l10n/fr_CA.json @@ -1,6 +1,7 @@ { "translations": { "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""] },"pluralForm" :"nplurals=2; plural=(n > 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/fy_NL.js b/apps/files/l10n/fy_NL.js index 329844854f1..560042b3efd 100644 --- a/apps/files/l10n/fy_NL.js +++ b/apps/files/l10n/fy_NL.js @@ -3,6 +3,7 @@ OC.L10N.register( { "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""] }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/fy_NL.json b/apps/files/l10n/fy_NL.json index 37156658a86..4cfa6a31b6e 100644 --- a/apps/files/l10n/fy_NL.json +++ b/apps/files/l10n/fy_NL.json @@ -1,6 +1,7 @@ { "translations": { "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""] },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/gl.js b/apps/files/l10n/gl.js index a169f5c21cf..e968d58f9e0 100644 --- a/apps/files/l10n/gl.js +++ b/apps/files/l10n/gl.js @@ -6,6 +6,7 @@ OC.L10N.register( "Unknown error" : "Produciuse un erro descoñecido", "Could not move %s - File with this name already exists" : "Non foi posíbel mover %s; Xa existe un ficheiro con ese nome.", "Could not move %s" : "Non foi posíbel mover %s", + "Permission denied" : "Permiso denegado", "File name cannot be empty." : "O nome de ficheiro non pode estar baleiro", "\"%s\" is an invalid file name." : "«%s» é un nome incorrecto de ficheiro.", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." : "Nome incorrecto, non se permite «\\», «/», «<», «>», «:», «\"», «|», «?» e «*».", @@ -34,6 +35,8 @@ OC.L10N.register( "Invalid directory." : "O directorio é incorrecto.", "Files" : "Ficheiros", "All files" : "Todos os ficheiros", + "Favorites" : "Favoritos", + "Home" : "Inicio", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Non é posíbel enviar {filename}, xa que ou é un directorio ou ten 0 bytes", "Total file size {size1} exceeds upload limit {size2}" : "O tamaño total do ficheiro {size1} excede do límite de envío {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Non hai espazo libre abondo, o seu envío é de {size1} mais só dispón de {size2}", @@ -45,18 +48,19 @@ OC.L10N.register( "Could not create file" : "Non foi posíbel crear o ficheiro", "Could not create folder" : "Non foi posíbel crear o cartafol", "Error fetching URL" : "Produciuse un erro ao obter o URL", - "Share" : "Compartir", + "Rename" : "Renomear", "Delete" : "Eliminar", "Disconnect storage" : "Desconectar o almacenamento", "Unshare" : "Deixar de compartir", - "Delete permanently" : "Eliminar permanentemente", - "Rename" : "Renomear", + "Select" : "Seleccionar", "Pending" : "Pendentes", + "Unable to determine date" : "Non é posíbel determinar a data", "Error moving file." : "Produciuse un erro ao mover o ficheiro.", "Error moving file" : "Produciuse un erro ao mover o ficheiro", "Error" : "Erro", "Could not rename file" : "Non foi posíbel renomear o ficheiro", "Error deleting file." : "Produciuse un erro ao eliminar o ficheiro.", + "No entries in this folder match '{filter}'" : "Non hai entradas neste cartafol coincidentes con «{filter}»", "Name" : "Nome", "Size" : "Tamaño", "Modified" : "Modificado", @@ -70,7 +74,10 @@ OC.L10N.register( "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "A aplicación de cifrado está activada, mais as chaves non foron inicializadas, saia da sesión e volva a acceder de novo", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "A chave privada para a aplicación de cifrado non é correcta. Actualice o contrasinal da súa chave privada nos seus axustes persoais para recuperar o acceso aos seus ficheiros cifrados.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "O cifrado foi desactivado, mais os ficheiros están cifrados. Vaia á configuración persoal para descifrar os ficheiros.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["coincidente con «{filter}»","coincidentes con «{filter}»"], "{dirs} and {files}" : "{dirs} e {files}", + "Favorited" : "Marcado como favorito", + "Favorite" : "Favorito", "%s could not be renamed as it has been deleted" : "Non é posíbel renomear %s xa que foi eliminado", "%s could not be renamed" : "%s non pode cambiar de nome", "Upload (max. %s)" : "Envío (máx. %s)", @@ -78,6 +85,7 @@ OC.L10N.register( "Maximum upload size" : "Tamaño máximo do envío", "max. possible: " : "máx. posíbel: ", "Save" : "Gardar", + "Settings" : "Axustes", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Empregue esta ligazón para <a href=\"%s\" target=\"_blank\">acceder aos seus ficheiros mediante WebDAV</a>", "New" : "Novo", @@ -86,11 +94,18 @@ OC.L10N.register( "New folder" : "Novo cartafol", "Folder" : "Cartafol", "From link" : "Desde a ligazón", - "Nothing in here. Upload something!" : "Aquí non hai nada. Envíe algo.", + "Upload" : "Enviar", + "Cancel upload" : "Cancelar o envío", + "No files yet" : "Aínda non hai ficheiros", + "Upload some content or sync with your devices!" : "Envíe algún contido ou sincronice cos seus dispositivos!", + "No entries found in this folder" : "Non se atoparon entradas neste cartafol", + "Select all" : "Seleccionar todo", "Download" : "Descargar", "Upload too large" : "Envío grande de máis", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Os ficheiros que tenta enviar exceden do tamaño máximo permitido neste servidor", "Files are being scanned, please wait." : "Estanse analizando os ficheiros. Agarde.", - "Currently scanning" : "Análise actual" + "Currently scanning" : "Análise actual", + "No favorites" : "Non hai favoritos", + "Files and folders you mark as favorite will show up here" : "Os ficheiros e cartafoles que marque como favoritos amosaranse aquí" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/gl.json b/apps/files/l10n/gl.json index cf1f30dcfc4..e459feef8d0 100644 --- a/apps/files/l10n/gl.json +++ b/apps/files/l10n/gl.json @@ -4,6 +4,7 @@ "Unknown error" : "Produciuse un erro descoñecido", "Could not move %s - File with this name already exists" : "Non foi posíbel mover %s; Xa existe un ficheiro con ese nome.", "Could not move %s" : "Non foi posíbel mover %s", + "Permission denied" : "Permiso denegado", "File name cannot be empty." : "O nome de ficheiro non pode estar baleiro", "\"%s\" is an invalid file name." : "«%s» é un nome incorrecto de ficheiro.", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." : "Nome incorrecto, non se permite «\\», «/», «<», «>», «:», «\"», «|», «?» e «*».", @@ -32,6 +33,8 @@ "Invalid directory." : "O directorio é incorrecto.", "Files" : "Ficheiros", "All files" : "Todos os ficheiros", + "Favorites" : "Favoritos", + "Home" : "Inicio", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Non é posíbel enviar {filename}, xa que ou é un directorio ou ten 0 bytes", "Total file size {size1} exceeds upload limit {size2}" : "O tamaño total do ficheiro {size1} excede do límite de envío {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Non hai espazo libre abondo, o seu envío é de {size1} mais só dispón de {size2}", @@ -43,18 +46,19 @@ "Could not create file" : "Non foi posíbel crear o ficheiro", "Could not create folder" : "Non foi posíbel crear o cartafol", "Error fetching URL" : "Produciuse un erro ao obter o URL", - "Share" : "Compartir", + "Rename" : "Renomear", "Delete" : "Eliminar", "Disconnect storage" : "Desconectar o almacenamento", "Unshare" : "Deixar de compartir", - "Delete permanently" : "Eliminar permanentemente", - "Rename" : "Renomear", + "Select" : "Seleccionar", "Pending" : "Pendentes", + "Unable to determine date" : "Non é posíbel determinar a data", "Error moving file." : "Produciuse un erro ao mover o ficheiro.", "Error moving file" : "Produciuse un erro ao mover o ficheiro", "Error" : "Erro", "Could not rename file" : "Non foi posíbel renomear o ficheiro", "Error deleting file." : "Produciuse un erro ao eliminar o ficheiro.", + "No entries in this folder match '{filter}'" : "Non hai entradas neste cartafol coincidentes con «{filter}»", "Name" : "Nome", "Size" : "Tamaño", "Modified" : "Modificado", @@ -68,7 +72,10 @@ "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "A aplicación de cifrado está activada, mais as chaves non foron inicializadas, saia da sesión e volva a acceder de novo", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "A chave privada para a aplicación de cifrado non é correcta. Actualice o contrasinal da súa chave privada nos seus axustes persoais para recuperar o acceso aos seus ficheiros cifrados.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "O cifrado foi desactivado, mais os ficheiros están cifrados. Vaia á configuración persoal para descifrar os ficheiros.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["coincidente con «{filter}»","coincidentes con «{filter}»"], "{dirs} and {files}" : "{dirs} e {files}", + "Favorited" : "Marcado como favorito", + "Favorite" : "Favorito", "%s could not be renamed as it has been deleted" : "Non é posíbel renomear %s xa que foi eliminado", "%s could not be renamed" : "%s non pode cambiar de nome", "Upload (max. %s)" : "Envío (máx. %s)", @@ -76,6 +83,7 @@ "Maximum upload size" : "Tamaño máximo do envío", "max. possible: " : "máx. posíbel: ", "Save" : "Gardar", + "Settings" : "Axustes", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Empregue esta ligazón para <a href=\"%s\" target=\"_blank\">acceder aos seus ficheiros mediante WebDAV</a>", "New" : "Novo", @@ -84,11 +92,18 @@ "New folder" : "Novo cartafol", "Folder" : "Cartafol", "From link" : "Desde a ligazón", - "Nothing in here. Upload something!" : "Aquí non hai nada. Envíe algo.", + "Upload" : "Enviar", + "Cancel upload" : "Cancelar o envío", + "No files yet" : "Aínda non hai ficheiros", + "Upload some content or sync with your devices!" : "Envíe algún contido ou sincronice cos seus dispositivos!", + "No entries found in this folder" : "Non se atoparon entradas neste cartafol", + "Select all" : "Seleccionar todo", "Download" : "Descargar", "Upload too large" : "Envío grande de máis", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Os ficheiros que tenta enviar exceden do tamaño máximo permitido neste servidor", "Files are being scanned, please wait." : "Estanse analizando os ficheiros. Agarde.", - "Currently scanning" : "Análise actual" + "Currently scanning" : "Análise actual", + "No favorites" : "Non hai favoritos", + "Files and folders you mark as favorite will show up here" : "Os ficheiros e cartafoles que marque como favoritos amosaranse aquí" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/gu.js b/apps/files/l10n/gu.js index 329844854f1..560042b3efd 100644 --- a/apps/files/l10n/gu.js +++ b/apps/files/l10n/gu.js @@ -3,6 +3,7 @@ OC.L10N.register( { "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""] }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/gu.json b/apps/files/l10n/gu.json index 37156658a86..4cfa6a31b6e 100644 --- a/apps/files/l10n/gu.json +++ b/apps/files/l10n/gu.json @@ -1,6 +1,7 @@ { "translations": { "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""] },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/he.js b/apps/files/l10n/he.js index 4db22fef4ed..6dce479219f 100644 --- a/apps/files/l10n/he.js +++ b/apps/files/l10n/he.js @@ -18,15 +18,16 @@ OC.L10N.register( "Upload failed. Could not get file info." : "העלאה נכשלה. לא ניתן להשיג את פרטי הקובץ.", "Invalid directory." : "תיקייה שגויה.", "Files" : "קבצים", + "Favorites" : "מועדפים", + "Home" : "בית", "Upload cancelled." : "ההעלאה בוטלה.", "Could not get result from server." : "לא ניתן לגשת לתוצאות מהשרת.", "File upload is in progress. Leaving the page now will cancel the upload." : "מתבצעת כעת העלאת קבצים. עזיבה של העמוד תבטל את ההעלאה.", "{new_name} already exists" : "{new_name} כבר קיים", - "Share" : "שתף", + "Rename" : "שינוי שם", "Delete" : "מחיקה", "Unshare" : "הסר שיתוף", - "Delete permanently" : "מחק לצמיתות", - "Rename" : "שינוי שם", + "Select" : "בחר", "Pending" : "ממתין", "Error" : "שגיאה", "Name" : "שם", @@ -36,18 +37,22 @@ OC.L10N.register( "_%n file_::_%n files_" : ["",""], "_Uploading %n file_::_Uploading %n files_" : ["",""], "Your storage is almost full ({usedSpacePercent}%)" : "שטח האחסון שלך כמעט מלא ({usedSpacePercent}%)", + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], + "Favorite" : "מועדף", "Upload (max. %s)" : "העלאה (מקסימום %s)", "File handling" : "טיפול בקבצים", "Maximum upload size" : "גודל העלאה מקסימלי", "max. possible: " : "המרבי האפשרי: ", "Save" : "שמירה", + "Settings" : "הגדרות", "WebDAV" : "WebDAV", "New" : "חדש", "Text file" : "קובץ טקסט", "New folder" : "תיקייה חדשה", "Folder" : "תיקייה", "From link" : "מקישור", - "Nothing in here. Upload something!" : "אין כאן שום דבר. אולי ברצונך להעלות משהו?", + "Upload" : "העלאה", + "Cancel upload" : "ביטול ההעלאה", "Download" : "הורדה", "Upload too large" : "העלאה גדולה מידי", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "הקבצים שניסית להעלות חרגו מהגודל המקסימלי להעלאת קבצים על שרת זה.", diff --git a/apps/files/l10n/he.json b/apps/files/l10n/he.json index b876983cbbb..6c1ff592317 100644 --- a/apps/files/l10n/he.json +++ b/apps/files/l10n/he.json @@ -16,15 +16,16 @@ "Upload failed. Could not get file info." : "העלאה נכשלה. לא ניתן להשיג את פרטי הקובץ.", "Invalid directory." : "תיקייה שגויה.", "Files" : "קבצים", + "Favorites" : "מועדפים", + "Home" : "בית", "Upload cancelled." : "ההעלאה בוטלה.", "Could not get result from server." : "לא ניתן לגשת לתוצאות מהשרת.", "File upload is in progress. Leaving the page now will cancel the upload." : "מתבצעת כעת העלאת קבצים. עזיבה של העמוד תבטל את ההעלאה.", "{new_name} already exists" : "{new_name} כבר קיים", - "Share" : "שתף", + "Rename" : "שינוי שם", "Delete" : "מחיקה", "Unshare" : "הסר שיתוף", - "Delete permanently" : "מחק לצמיתות", - "Rename" : "שינוי שם", + "Select" : "בחר", "Pending" : "ממתין", "Error" : "שגיאה", "Name" : "שם", @@ -34,18 +35,22 @@ "_%n file_::_%n files_" : ["",""], "_Uploading %n file_::_Uploading %n files_" : ["",""], "Your storage is almost full ({usedSpacePercent}%)" : "שטח האחסון שלך כמעט מלא ({usedSpacePercent}%)", + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], + "Favorite" : "מועדף", "Upload (max. %s)" : "העלאה (מקסימום %s)", "File handling" : "טיפול בקבצים", "Maximum upload size" : "גודל העלאה מקסימלי", "max. possible: " : "המרבי האפשרי: ", "Save" : "שמירה", + "Settings" : "הגדרות", "WebDAV" : "WebDAV", "New" : "חדש", "Text file" : "קובץ טקסט", "New folder" : "תיקייה חדשה", "Folder" : "תיקייה", "From link" : "מקישור", - "Nothing in here. Upload something!" : "אין כאן שום דבר. אולי ברצונך להעלות משהו?", + "Upload" : "העלאה", + "Cancel upload" : "ביטול ההעלאה", "Download" : "הורדה", "Upload too large" : "העלאה גדולה מידי", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "הקבצים שניסית להעלות חרגו מהגודל המקסימלי להעלאת קבצים על שרת זה.", diff --git a/apps/files/l10n/hi.js b/apps/files/l10n/hi.js index 21b409ce9ef..2064fa2c7e3 100644 --- a/apps/files/l10n/hi.js +++ b/apps/files/l10n/hi.js @@ -2,12 +2,14 @@ OC.L10N.register( "files", { "Files" : "फाइलें ", - "Share" : "साझा करें", "Error" : "त्रुटि", "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "Save" : "सहेजें", - "New folder" : "नया फ़ोल्डर" + "Settings" : "सेटिंग्स", + "New folder" : "नया फ़ोल्डर", + "Upload" : "अपलोड " }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/hi.json b/apps/files/l10n/hi.json index 093b80ce700..ae2e3550df3 100644 --- a/apps/files/l10n/hi.json +++ b/apps/files/l10n/hi.json @@ -1,11 +1,13 @@ { "translations": { "Files" : "फाइलें ", - "Share" : "साझा करें", "Error" : "त्रुटि", "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "Save" : "सहेजें", - "New folder" : "नया फ़ोल्डर" + "Settings" : "सेटिंग्स", + "New folder" : "नया फ़ोल्डर", + "Upload" : "अपलोड " },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/hr.js b/apps/files/l10n/hr.js index ad4eead41cc..b4bf0606629 100644 --- a/apps/files/l10n/hr.js +++ b/apps/files/l10n/hr.js @@ -35,6 +35,8 @@ OC.L10N.register( "Invalid directory." : "Neispravan direktorij", "Files" : "Datoteke", "All files" : "Sve datoteke", + "Favorites" : "Favoriti", + "Home" : "Kuća", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Nije moguće učitati {filename} jer je ili direktorij ili ima 0 bajta", "Total file size {size1} exceeds upload limit {size2}" : "Ukupna veličina datoteke {size1} premašuje ograničenje unosa {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nedovoljno slobodnog prostora, vi učitavate {size1} a samo je {size2} preostalo", @@ -46,12 +48,10 @@ OC.L10N.register( "Could not create file" : "Datoteku nije moguće kreirati", "Could not create folder" : "Mapu nije moguće kreirati", "Error fetching URL" : "Pogrešan dohvat URL", - "Share" : "Podijelite resurs", + "Rename" : "Preimenujte", "Delete" : "Izbrišite", "Disconnect storage" : "Isključite pohranu", "Unshare" : "Prestanite dijeliti", - "Delete permanently" : "Trajno izbrišite", - "Rename" : "Preimenujte", "Pending" : "Na čekanju", "Error moving file." : "Pogrešno premještanje datoteke", "Error moving file" : "Pogrešno premještanje datoteke", @@ -71,7 +71,9 @@ OC.L10N.register( "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Aplikacija šifriranja je onemogućena, ali vaši ključevi nisu inicijalizirani, molimo odjavite se i ponovno prijavite", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Neispravan privatni ključ za šifriranje. Molimo ažurirajte lozinku svoga privatnog ključa u svojim osobnimpostavkama da biste obnovili pristup svojim šifriranim datotekama.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Šifriranje je onemogućeno, ali vaše su datoteke još uvijek šifrirane. Molimo, otiđite u svojeosobne postavke da biste dešifrirali svoje datoteke.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["","",""], "{dirs} and {files}" : "{dirs} i {files}", + "Favorite" : "Favorit", "%s could not be renamed as it has been deleted" : "%s nije moguće preimenovati jer je izbrisan", "%s could not be renamed" : "%s nije moguće preimenovati", "Upload (max. %s)" : "Prijenos (max. %s)", @@ -79,6 +81,7 @@ OC.L10N.register( "Maximum upload size" : "Maksimalna veličina učitanog sadržaja", "max. possible: " : "max. moguće: ", "Save" : "Spremite", + "Settings" : "Postavke", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Koristitet slijedeću adresu za <a href=\"%s\" target=\"_blank\">pristup vašim datotekama putem WebDAV-a</a>", "New" : "Novo", @@ -87,7 +90,8 @@ OC.L10N.register( "New folder" : "Nova mapa", "Folder" : "Mapa", "From link" : "Od veze", - "Nothing in here. Upload something!" : "Ovdje nema ničega. Učitajte nešto!", + "Upload" : "Učitavanje", + "Cancel upload" : "Prekini upload", "Download" : "Preuzimanje", "Upload too large" : "Unos je prevelik", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Datoteke koje pokušavate učitati premašuju maksimalnu veličinu za unos datoteka na ovom poslužitelju.", diff --git a/apps/files/l10n/hr.json b/apps/files/l10n/hr.json index 482796da4a1..704c5080d47 100644 --- a/apps/files/l10n/hr.json +++ b/apps/files/l10n/hr.json @@ -33,6 +33,8 @@ "Invalid directory." : "Neispravan direktorij", "Files" : "Datoteke", "All files" : "Sve datoteke", + "Favorites" : "Favoriti", + "Home" : "Kuća", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Nije moguće učitati {filename} jer je ili direktorij ili ima 0 bajta", "Total file size {size1} exceeds upload limit {size2}" : "Ukupna veličina datoteke {size1} premašuje ograničenje unosa {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nedovoljno slobodnog prostora, vi učitavate {size1} a samo je {size2} preostalo", @@ -44,12 +46,10 @@ "Could not create file" : "Datoteku nije moguće kreirati", "Could not create folder" : "Mapu nije moguće kreirati", "Error fetching URL" : "Pogrešan dohvat URL", - "Share" : "Podijelite resurs", + "Rename" : "Preimenujte", "Delete" : "Izbrišite", "Disconnect storage" : "Isključite pohranu", "Unshare" : "Prestanite dijeliti", - "Delete permanently" : "Trajno izbrišite", - "Rename" : "Preimenujte", "Pending" : "Na čekanju", "Error moving file." : "Pogrešno premještanje datoteke", "Error moving file" : "Pogrešno premještanje datoteke", @@ -69,7 +69,9 @@ "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Aplikacija šifriranja je onemogućena, ali vaši ključevi nisu inicijalizirani, molimo odjavite se i ponovno prijavite", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Neispravan privatni ključ za šifriranje. Molimo ažurirajte lozinku svoga privatnog ključa u svojim osobnimpostavkama da biste obnovili pristup svojim šifriranim datotekama.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Šifriranje je onemogućeno, ali vaše su datoteke još uvijek šifrirane. Molimo, otiđite u svojeosobne postavke da biste dešifrirali svoje datoteke.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["","",""], "{dirs} and {files}" : "{dirs} i {files}", + "Favorite" : "Favorit", "%s could not be renamed as it has been deleted" : "%s nije moguće preimenovati jer je izbrisan", "%s could not be renamed" : "%s nije moguće preimenovati", "Upload (max. %s)" : "Prijenos (max. %s)", @@ -77,6 +79,7 @@ "Maximum upload size" : "Maksimalna veličina učitanog sadržaja", "max. possible: " : "max. moguće: ", "Save" : "Spremite", + "Settings" : "Postavke", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Koristitet slijedeću adresu za <a href=\"%s\" target=\"_blank\">pristup vašim datotekama putem WebDAV-a</a>", "New" : "Novo", @@ -85,7 +88,8 @@ "New folder" : "Nova mapa", "Folder" : "Mapa", "From link" : "Od veze", - "Nothing in here. Upload something!" : "Ovdje nema ničega. Učitajte nešto!", + "Upload" : "Učitavanje", + "Cancel upload" : "Prekini upload", "Download" : "Preuzimanje", "Upload too large" : "Unos je prevelik", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Datoteke koje pokušavate učitati premašuju maksimalnu veličinu za unos datoteka na ovom poslužitelju.", diff --git a/apps/files/l10n/hu_HU.js b/apps/files/l10n/hu_HU.js index 34a9c73aa08..fe4a138040d 100644 --- a/apps/files/l10n/hu_HU.js +++ b/apps/files/l10n/hu_HU.js @@ -35,6 +35,8 @@ OC.L10N.register( "Invalid directory." : "Érvénytelen mappa.", "Files" : "Fájlkezelő", "All files" : "Az összes állomány", + "Favorites" : "Kedvencek", + "Home" : "Otthoni", "Unable to upload {filename} as it is a directory or has 0 bytes" : "A(z) {filename} állomány nem tölthető fel, mert ez vagy egy mappa, vagy pedig 0 bájtból áll.", "Total file size {size1} exceeds upload limit {size2}" : "A teljes fájlméret: {size1} meghaladja a feltöltési limitet: {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nincs elég szabad hely. A feltöltés mérete {size1}, de csak ennyi hely van: {size2}.", @@ -46,12 +48,11 @@ OC.L10N.register( "Could not create file" : "Az állomány nem hozható létre", "Could not create folder" : "A mappa nem hozható létre", "Error fetching URL" : "A megadott URL-ről nem sikerül adatokat kapni", - "Share" : "Megosztás", + "Rename" : "Átnevezés", "Delete" : "Törlés", "Disconnect storage" : "Tároló leválasztása", "Unshare" : "A megosztás visszavonása", - "Delete permanently" : "Végleges törlés", - "Rename" : "Átnevezés", + "Select" : "Kiválaszt", "Pending" : "Folyamatban", "Error moving file." : "Hiba történt a fájl áthelyezése közben.", "Error moving file" : "Az állomány áthelyezése nem sikerült.", @@ -71,7 +72,10 @@ OC.L10N.register( "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Az állományok titkosítása engedélyezve van, de az Ön titkos kulcsai nincsenek beállítva. Ezért kérjük, hogy jelentkezzen ki, és lépjen be újra!", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Az állományok titkosításához használt titkos kulcsa érvénytelen. Kérjük frissítse a titkos kulcs jelszót a személyes beállításokban, hogy ismét hozzáférjen a titkosított állományaihoz!", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "A titkosítási funkciót kikapcsolták, de az Ön állományai még mindig titkosított állapotban vannak. A személyes beállításoknál tudja a titkosítást feloldani.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "{dirs} and {files}" : "{dirs} és {files}", + "Favorited" : "Kedvenc", + "Favorite" : "Kedvenc", "%s could not be renamed as it has been deleted" : "%s nem lehet átnevezni, mivel törölve lett", "%s could not be renamed" : "%s átnevezése nem sikerült", "Upload (max. %s)" : "Feltöltés (max. %s)", @@ -79,6 +83,7 @@ OC.L10N.register( "Maximum upload size" : "Maximális feltölthető fájlméret", "max. possible: " : "max. lehetséges: ", "Save" : "Mentés", + "Settings" : "Beállítások", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Ezt a címet használja, ha <a href=\"%s\" target=\"_blank\">WebDAV-on keresztül szeretné elérni a fájljait</a>", "New" : "Új", @@ -87,11 +92,16 @@ OC.L10N.register( "New folder" : "Új mappa", "Folder" : "Mappa", "From link" : "Feltöltés linkről", - "Nothing in here. Upload something!" : "Itt nincs semmi. Töltsön fel valamit!", + "Upload" : "Feltöltés", + "Cancel upload" : "A feltöltés megszakítása", + "No files yet" : "Még nincsenek fájlok", + "Select all" : "Összes kijelölése", "Download" : "Letöltés", "Upload too large" : "A feltöltés túl nagy", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "A feltöltendő állományok mérete meghaladja a kiszolgálón megengedett maximális méretet.", "Files are being scanned, please wait." : "A fájllista ellenőrzése zajlik, kis türelmet!", - "Currently scanning" : "Mappaellenőrzés: " + "Currently scanning" : "Mappaellenőrzés: ", + "No favorites" : "Nincsenek kedvencek", + "Files and folders you mark as favorite will show up here" : "A kedvencnek jelölt fájlokat és mappákat itt találod meg" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/hu_HU.json b/apps/files/l10n/hu_HU.json index 10ff167fd46..81c9469161d 100644 --- a/apps/files/l10n/hu_HU.json +++ b/apps/files/l10n/hu_HU.json @@ -33,6 +33,8 @@ "Invalid directory." : "Érvénytelen mappa.", "Files" : "Fájlkezelő", "All files" : "Az összes állomány", + "Favorites" : "Kedvencek", + "Home" : "Otthoni", "Unable to upload {filename} as it is a directory or has 0 bytes" : "A(z) {filename} állomány nem tölthető fel, mert ez vagy egy mappa, vagy pedig 0 bájtból áll.", "Total file size {size1} exceeds upload limit {size2}" : "A teljes fájlméret: {size1} meghaladja a feltöltési limitet: {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nincs elég szabad hely. A feltöltés mérete {size1}, de csak ennyi hely van: {size2}.", @@ -44,12 +46,11 @@ "Could not create file" : "Az állomány nem hozható létre", "Could not create folder" : "A mappa nem hozható létre", "Error fetching URL" : "A megadott URL-ről nem sikerül adatokat kapni", - "Share" : "Megosztás", + "Rename" : "Átnevezés", "Delete" : "Törlés", "Disconnect storage" : "Tároló leválasztása", "Unshare" : "A megosztás visszavonása", - "Delete permanently" : "Végleges törlés", - "Rename" : "Átnevezés", + "Select" : "Kiválaszt", "Pending" : "Folyamatban", "Error moving file." : "Hiba történt a fájl áthelyezése közben.", "Error moving file" : "Az állomány áthelyezése nem sikerült.", @@ -69,7 +70,10 @@ "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Az állományok titkosítása engedélyezve van, de az Ön titkos kulcsai nincsenek beállítva. Ezért kérjük, hogy jelentkezzen ki, és lépjen be újra!", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Az állományok titkosításához használt titkos kulcsa érvénytelen. Kérjük frissítse a titkos kulcs jelszót a személyes beállításokban, hogy ismét hozzáférjen a titkosított állományaihoz!", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "A titkosítási funkciót kikapcsolták, de az Ön állományai még mindig titkosított állapotban vannak. A személyes beállításoknál tudja a titkosítást feloldani.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "{dirs} and {files}" : "{dirs} és {files}", + "Favorited" : "Kedvenc", + "Favorite" : "Kedvenc", "%s could not be renamed as it has been deleted" : "%s nem lehet átnevezni, mivel törölve lett", "%s could not be renamed" : "%s átnevezése nem sikerült", "Upload (max. %s)" : "Feltöltés (max. %s)", @@ -77,6 +81,7 @@ "Maximum upload size" : "Maximális feltölthető fájlméret", "max. possible: " : "max. lehetséges: ", "Save" : "Mentés", + "Settings" : "Beállítások", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Ezt a címet használja, ha <a href=\"%s\" target=\"_blank\">WebDAV-on keresztül szeretné elérni a fájljait</a>", "New" : "Új", @@ -85,11 +90,16 @@ "New folder" : "Új mappa", "Folder" : "Mappa", "From link" : "Feltöltés linkről", - "Nothing in here. Upload something!" : "Itt nincs semmi. Töltsön fel valamit!", + "Upload" : "Feltöltés", + "Cancel upload" : "A feltöltés megszakítása", + "No files yet" : "Még nincsenek fájlok", + "Select all" : "Összes kijelölése", "Download" : "Letöltés", "Upload too large" : "A feltöltés túl nagy", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "A feltöltendő állományok mérete meghaladja a kiszolgálón megengedett maximális méretet.", "Files are being scanned, please wait." : "A fájllista ellenőrzése zajlik, kis türelmet!", - "Currently scanning" : "Mappaellenőrzés: " + "Currently scanning" : "Mappaellenőrzés: ", + "No favorites" : "Nincsenek kedvencek", + "Files and folders you mark as favorite will show up here" : "A kedvencnek jelölt fájlokat és mappákat itt találod meg" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/hy.js b/apps/files/l10n/hy.js index 5772fd20c72..bb4a362d12d 100644 --- a/apps/files/l10n/hy.js +++ b/apps/files/l10n/hy.js @@ -5,6 +5,7 @@ OC.L10N.register( "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "Save" : "Պահպանել", "Download" : "Բեռնել" }, diff --git a/apps/files/l10n/hy.json b/apps/files/l10n/hy.json index 3cbee75121a..d433cc5b5c9 100644 --- a/apps/files/l10n/hy.json +++ b/apps/files/l10n/hy.json @@ -3,6 +3,7 @@ "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "Save" : "Պահպանել", "Download" : "Բեռնել" },"pluralForm" :"nplurals=2; plural=(n != 1);" diff --git a/apps/files/l10n/ia.js b/apps/files/l10n/ia.js index 8c93abf1bef..901a12cd538 100644 --- a/apps/files/l10n/ia.js +++ b/apps/files/l10n/ia.js @@ -7,7 +7,7 @@ OC.L10N.register( "No file was uploaded" : "Nulle file esseva incargate.", "Missing a temporary folder" : "Manca un dossier temporari", "Files" : "Files", - "Share" : "Compartir", + "Home" : "Domo", "Delete" : "Deler", "Unshare" : "Leva compartir", "Error" : "Error", @@ -17,14 +17,16 @@ OC.L10N.register( "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "Upload (max. %s)" : "Incargar (max. %s)", "Maximum upload size" : "Dimension maxime de incargamento", "Save" : "Salveguardar", + "Settings" : "Configurationes", "New" : "Nove", "Text file" : "File de texto", "New folder" : "Nove dossier", "Folder" : "Dossier", - "Nothing in here. Upload something!" : "Nihil hic. Incarga alcun cosa!", + "Upload" : "Incargar", "Download" : "Discargar", "Upload too large" : "Incargamento troppo longe" }, diff --git a/apps/files/l10n/ia.json b/apps/files/l10n/ia.json index 962419f288b..2384c23a6fc 100644 --- a/apps/files/l10n/ia.json +++ b/apps/files/l10n/ia.json @@ -5,7 +5,7 @@ "No file was uploaded" : "Nulle file esseva incargate.", "Missing a temporary folder" : "Manca un dossier temporari", "Files" : "Files", - "Share" : "Compartir", + "Home" : "Domo", "Delete" : "Deler", "Unshare" : "Leva compartir", "Error" : "Error", @@ -15,14 +15,16 @@ "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "Upload (max. %s)" : "Incargar (max. %s)", "Maximum upload size" : "Dimension maxime de incargamento", "Save" : "Salveguardar", + "Settings" : "Configurationes", "New" : "Nove", "Text file" : "File de texto", "New folder" : "Nove dossier", "Folder" : "Dossier", - "Nothing in here. Upload something!" : "Nihil hic. Incarga alcun cosa!", + "Upload" : "Incargar", "Download" : "Discargar", "Upload too large" : "Incargamento troppo longe" },"pluralForm" :"nplurals=2; plural=(n != 1);" diff --git a/apps/files/l10n/id.js b/apps/files/l10n/id.js index 8ae4c822ea8..884d600625a 100644 --- a/apps/files/l10n/id.js +++ b/apps/files/l10n/id.js @@ -35,6 +35,8 @@ OC.L10N.register( "Invalid directory." : "Direktori tidak valid.", "Files" : "Berkas", "All files" : "Semua berkas", + "Favorites" : "Favorit", + "Home" : "Rumah", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Tidak dapat mengunggah {filename} karena ini sebuah direktori atau memiliki ukuran 0 byte", "Total file size {size1} exceeds upload limit {size2}" : "Jumlah ukuran berkas {size1} melampaui batas unggah {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Ruang bebas tidak mencukupi, Anda mengunggah {size1} tetapi hanya {size2} yang tersisa", @@ -46,12 +48,10 @@ OC.L10N.register( "Could not create file" : "Tidak dapat membuat berkas", "Could not create folder" : "Tidak dapat membuat folder", "Error fetching URL" : "Kesalahan saat mengambil URL", - "Share" : "Bagikan", + "Rename" : "Ubah nama", "Delete" : "Hapus", "Disconnect storage" : "Memutuskan penyimpaan", "Unshare" : "Batalkan berbagi", - "Delete permanently" : "Hapus secara permanen", - "Rename" : "Ubah nama", "Pending" : "Menunggu", "Error moving file." : "Kesalahan saat memindahkan berkas.", "Error moving file" : "Kesalahan saat memindahkan berkas", @@ -71,7 +71,9 @@ OC.L10N.register( "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Aplikasi Enskripsi telah diaktifkan tetapi kunci tidak diinisialisasi, silakan log-out dan log-in lagi", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Kunci privat tidak sah untuk Aplikasi Enskripsi. Silakan perbarui sandi kunci privat anda pada pengaturan pribadi untuk memulihkan akses ke berkas anda yang dienskripsi.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Enskripi telah dinonaktifkan tetapi berkas anda tetap dienskripsi. Silakan menuju ke pengaturan pribadi untuk deskrip berkas anda.", + "_ matches '{filter}'_::_ match '{filter}'_" : [""], "{dirs} and {files}" : "{dirs} dan {files}", + "Favorite" : "Favorit", "%s could not be renamed as it has been deleted" : "%s tidak dapat diubah namanya kerena telah dihapus", "%s could not be renamed" : "%s tidak dapat diubah nama", "Upload (max. %s)" : "Unggah (maks. %s)", @@ -79,6 +81,7 @@ OC.L10N.register( "Maximum upload size" : "Ukuran pengunggahan maksimum", "max. possible: " : "Kemungkinan maks.:", "Save" : "Simpan", + "Settings" : "Pengaturan", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Gunakan alamat ini untuk <a href=\"%s\" target=\"_blank\">mengakses Berkas via WebDAV</a>", "New" : "Baru", @@ -87,7 +90,8 @@ OC.L10N.register( "New folder" : "Map baru", "Folder" : "Folder", "From link" : "Dari tautan", - "Nothing in here. Upload something!" : "Tidak ada apa-apa di sini. Unggah sesuatu!", + "Upload" : "Unggah", + "Cancel upload" : "Batal unggah", "Download" : "Unduh", "Upload too large" : "Yang diunggah terlalu besar", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Berkas yang dicoba untuk diunggah melebihi ukuran maksimum pengunggahan berkas di server ini.", diff --git a/apps/files/l10n/id.json b/apps/files/l10n/id.json index d644aa22ec4..bd17646a1a9 100644 --- a/apps/files/l10n/id.json +++ b/apps/files/l10n/id.json @@ -33,6 +33,8 @@ "Invalid directory." : "Direktori tidak valid.", "Files" : "Berkas", "All files" : "Semua berkas", + "Favorites" : "Favorit", + "Home" : "Rumah", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Tidak dapat mengunggah {filename} karena ini sebuah direktori atau memiliki ukuran 0 byte", "Total file size {size1} exceeds upload limit {size2}" : "Jumlah ukuran berkas {size1} melampaui batas unggah {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Ruang bebas tidak mencukupi, Anda mengunggah {size1} tetapi hanya {size2} yang tersisa", @@ -44,12 +46,10 @@ "Could not create file" : "Tidak dapat membuat berkas", "Could not create folder" : "Tidak dapat membuat folder", "Error fetching URL" : "Kesalahan saat mengambil URL", - "Share" : "Bagikan", + "Rename" : "Ubah nama", "Delete" : "Hapus", "Disconnect storage" : "Memutuskan penyimpaan", "Unshare" : "Batalkan berbagi", - "Delete permanently" : "Hapus secara permanen", - "Rename" : "Ubah nama", "Pending" : "Menunggu", "Error moving file." : "Kesalahan saat memindahkan berkas.", "Error moving file" : "Kesalahan saat memindahkan berkas", @@ -69,7 +69,9 @@ "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Aplikasi Enskripsi telah diaktifkan tetapi kunci tidak diinisialisasi, silakan log-out dan log-in lagi", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Kunci privat tidak sah untuk Aplikasi Enskripsi. Silakan perbarui sandi kunci privat anda pada pengaturan pribadi untuk memulihkan akses ke berkas anda yang dienskripsi.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Enskripi telah dinonaktifkan tetapi berkas anda tetap dienskripsi. Silakan menuju ke pengaturan pribadi untuk deskrip berkas anda.", + "_ matches '{filter}'_::_ match '{filter}'_" : [""], "{dirs} and {files}" : "{dirs} dan {files}", + "Favorite" : "Favorit", "%s could not be renamed as it has been deleted" : "%s tidak dapat diubah namanya kerena telah dihapus", "%s could not be renamed" : "%s tidak dapat diubah nama", "Upload (max. %s)" : "Unggah (maks. %s)", @@ -77,6 +79,7 @@ "Maximum upload size" : "Ukuran pengunggahan maksimum", "max. possible: " : "Kemungkinan maks.:", "Save" : "Simpan", + "Settings" : "Pengaturan", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Gunakan alamat ini untuk <a href=\"%s\" target=\"_blank\">mengakses Berkas via WebDAV</a>", "New" : "Baru", @@ -85,7 +88,8 @@ "New folder" : "Map baru", "Folder" : "Folder", "From link" : "Dari tautan", - "Nothing in here. Upload something!" : "Tidak ada apa-apa di sini. Unggah sesuatu!", + "Upload" : "Unggah", + "Cancel upload" : "Batal unggah", "Download" : "Unduh", "Upload too large" : "Yang diunggah terlalu besar", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Berkas yang dicoba untuk diunggah melebihi ukuran maksimum pengunggahan berkas di server ini.", diff --git a/apps/files/l10n/io.js b/apps/files/l10n/io.js index 329844854f1..560042b3efd 100644 --- a/apps/files/l10n/io.js +++ b/apps/files/l10n/io.js @@ -3,6 +3,7 @@ OC.L10N.register( { "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""] }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/io.json b/apps/files/l10n/io.json index 37156658a86..4cfa6a31b6e 100644 --- a/apps/files/l10n/io.json +++ b/apps/files/l10n/io.json @@ -1,6 +1,7 @@ { "translations": { "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""] },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/is.js b/apps/files/l10n/is.js index 5f3e2e78f26..129d381c117 100644 --- a/apps/files/l10n/is.js +++ b/apps/files/l10n/is.js @@ -18,10 +18,10 @@ OC.L10N.register( "Upload cancelled." : "Hætt við innsendingu.", "File upload is in progress. Leaving the page now will cancel the upload." : "Innsending í gangi. Ef þú ferð af þessari síðu mun innsending misheppnast.", "{new_name} already exists" : "{new_name} er þegar til", - "Share" : "Deila", + "Rename" : "Endurskýra", "Delete" : "Eyða", "Unshare" : "Hætta deilingu", - "Rename" : "Endurskýra", + "Select" : "Velja", "Pending" : "Bíður", "Error" : "Villa", "Name" : "Nafn", @@ -30,16 +30,19 @@ OC.L10N.register( "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "File handling" : "Meðhöndlun skrár", "Maximum upload size" : "Hámarks stærð innsendingar", "max. possible: " : "hámark mögulegt: ", "Save" : "Vista", + "Settings" : "Stillingar", "WebDAV" : "WebDAV", "New" : "Nýtt", "Text file" : "Texta skrá", "Folder" : "Mappa", "From link" : "Af tengli", - "Nothing in here. Upload something!" : "Ekkert hér. Settu eitthvað inn!", + "Upload" : "Senda inn", + "Cancel upload" : "Hætta við innsendingu", "Download" : "Niðurhal", "Upload too large" : "Innsend skrá er of stór", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Skrárnar sem þú ert að senda inn eru stærri en hámarks innsendingarstærð á þessum netþjóni.", diff --git a/apps/files/l10n/is.json b/apps/files/l10n/is.json index 0a6afcb0b64..48e0aa4c501 100644 --- a/apps/files/l10n/is.json +++ b/apps/files/l10n/is.json @@ -16,10 +16,10 @@ "Upload cancelled." : "Hætt við innsendingu.", "File upload is in progress. Leaving the page now will cancel the upload." : "Innsending í gangi. Ef þú ferð af þessari síðu mun innsending misheppnast.", "{new_name} already exists" : "{new_name} er þegar til", - "Share" : "Deila", + "Rename" : "Endurskýra", "Delete" : "Eyða", "Unshare" : "Hætta deilingu", - "Rename" : "Endurskýra", + "Select" : "Velja", "Pending" : "Bíður", "Error" : "Villa", "Name" : "Nafn", @@ -28,16 +28,19 @@ "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "File handling" : "Meðhöndlun skrár", "Maximum upload size" : "Hámarks stærð innsendingar", "max. possible: " : "hámark mögulegt: ", "Save" : "Vista", + "Settings" : "Stillingar", "WebDAV" : "WebDAV", "New" : "Nýtt", "Text file" : "Texta skrá", "Folder" : "Mappa", "From link" : "Af tengli", - "Nothing in here. Upload something!" : "Ekkert hér. Settu eitthvað inn!", + "Upload" : "Senda inn", + "Cancel upload" : "Hætta við innsendingu", "Download" : "Niðurhal", "Upload too large" : "Innsend skrá er of stór", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Skrárnar sem þú ert að senda inn eru stærri en hámarks innsendingarstærð á þessum netþjóni.", diff --git a/apps/files/l10n/it.js b/apps/files/l10n/it.js index 939f5e55dac..7ad4bcf787f 100644 --- a/apps/files/l10n/it.js +++ b/apps/files/l10n/it.js @@ -21,10 +21,10 @@ OC.L10N.register( "Error when creating the folder" : "Errore durante la creazione della cartella", "Unable to set upload directory." : "Impossibile impostare una cartella di caricamento.", "Invalid Token" : "Token non valido", - "No file was uploaded. Unknown error" : "Nessun file è stato inviato. Errore sconosciuto", + "No file was uploaded. Unknown error" : "Nessun file è stato caricato. Errore sconosciuto", "There is no error, the file uploaded with success" : "Non ci sono errori, il file è stato caricato correttamente", "The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "Il file caricato supera la direttiva upload_max_filesize in php.ini:", - "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Il file inviato supera la direttiva MAX_FILE_SIZE specificata nel modulo HTML", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Il file caricato supera la direttiva MAX_FILE_SIZE specificata nel modulo HTML", "The uploaded file was only partially uploaded" : "Il file è stato caricato solo parzialmente", "No file was uploaded" : "Nessun file è stato caricato", "Missing a temporary folder" : "Manca una cartella temporanea", @@ -35,10 +35,12 @@ OC.L10N.register( "Invalid directory." : "Cartella non valida.", "Files" : "File", "All files" : "Tutti i file", + "Favorites" : "Preferiti", + "Home" : "Casa", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Impossibile caricare {filename} poiché è una cartella oppure ha una dimensione di 0 byte.", "Total file size {size1} exceeds upload limit {size2}" : "La dimensione totale del file {size1} supera il limite di caricamento {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Spazio insufficiente, stai caricando {size1}, ma è rimasto solo {size2}", - "Upload cancelled." : "Invio annullato", + "Upload cancelled." : "Caricamento annullato.", "Could not get result from server." : "Impossibile ottenere il risultato dal server.", "File upload is in progress. Leaving the page now will cancel the upload." : "Caricamento del file in corso. La chiusura della pagina annullerà il caricamento.", "URL cannot be empty" : "L'URL non può essere vuoto.", @@ -46,18 +48,19 @@ OC.L10N.register( "Could not create file" : "Impossibile creare il file", "Could not create folder" : "Impossibile creare la cartella", "Error fetching URL" : "Errore durante il recupero dello URL", - "Share" : "Condividi", + "Rename" : "Rinomina", "Delete" : "Elimina", "Disconnect storage" : "Disconnetti archiviazione", "Unshare" : "Rimuovi condivisione", - "Delete permanently" : "Elimina definitivamente", - "Rename" : "Rinomina", + "Select" : "Seleziona", "Pending" : "In corso", + "Unable to determine date" : "Impossibile determinare la data", "Error moving file." : "Errore durante lo spostamento del file.", "Error moving file" : "Errore durante lo spostamento del file", "Error" : "Errore", "Could not rename file" : "Impossibile rinominare il file", "Error deleting file." : "Errore durante l'eliminazione del file.", + "No entries in this folder match '{filter}'" : "Nessuna voce in questa cartella corrisponde a '{filter}'", "Name" : "Nome", "Size" : "Dimensione", "Modified" : "Modificato", @@ -71,14 +74,18 @@ OC.L10N.register( "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "L'applicazione di cifratura è abilitata, ma le chiavi non sono state inizializzate, disconnettiti ed effettua nuovamente l'accesso", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Chiave privata non valida per l'applicazione di cifratura. Aggiorna la password della chiave privata nelle impostazioni personali per ripristinare l'accesso ai tuoi file cifrati.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "La cifratura è stata disabilitata ma i tuoi file sono ancora cifrati. Vai nelle impostazioni personali per decifrare i file.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["corrisponde a '{filter}'","corrispondono a '{filter}'"], "{dirs} and {files}" : "{dirs} e {files}", + "Favorited" : "Preferiti", + "Favorite" : "Preferito", "%s could not be renamed as it has been deleted" : "%s non può essere rinominato poiché è stato eliminato", "%s could not be renamed" : "%s non può essere rinominato", "Upload (max. %s)" : "Carica (massimo %s)", "File handling" : "Gestione file", - "Maximum upload size" : "Dimensione massima upload", + "Maximum upload size" : "Dimensione massima caricamento", "max. possible: " : "numero mass.: ", "Save" : "Salva", + "Settings" : "Impostazioni", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Utilizza questo indirizzo per <a href=\"%s\" target=\"_blank\">accedere ai tuoi file con WebDAV</a>", "New" : "Nuovo", @@ -87,11 +94,18 @@ OC.L10N.register( "New folder" : "Nuova cartella", "Folder" : "Cartella", "From link" : "Da collegamento", - "Nothing in here. Upload something!" : "Non c'è niente qui. Carica qualcosa!", + "Upload" : "Carica", + "Cancel upload" : "Annulla caricamento", + "No files yet" : "Nessun file ancora", + "Upload some content or sync with your devices!" : "Carica alcuni contenuti o sincronizza con i tuoi dispositivi!", + "No entries found in this folder" : "Nessuna voce trovata in questa cartella", + "Select all" : "Seleziona tutto", "Download" : "Scarica", "Upload too large" : "Caricamento troppo grande", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "I file che stai provando a caricare superano la dimensione massima consentita su questo server.", "Files are being scanned, please wait." : "Scansione dei file in corso, attendi", - "Currently scanning" : "Scansione in corso" + "Currently scanning" : "Scansione in corso", + "No favorites" : "Nessun preferito", + "Files and folders you mark as favorite will show up here" : "I file e le cartelle che marchi come preferiti saranno mostrati qui" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/it.json b/apps/files/l10n/it.json index 8686051f461..3e799998d77 100644 --- a/apps/files/l10n/it.json +++ b/apps/files/l10n/it.json @@ -19,10 +19,10 @@ "Error when creating the folder" : "Errore durante la creazione della cartella", "Unable to set upload directory." : "Impossibile impostare una cartella di caricamento.", "Invalid Token" : "Token non valido", - "No file was uploaded. Unknown error" : "Nessun file è stato inviato. Errore sconosciuto", + "No file was uploaded. Unknown error" : "Nessun file è stato caricato. Errore sconosciuto", "There is no error, the file uploaded with success" : "Non ci sono errori, il file è stato caricato correttamente", "The uploaded file exceeds the upload_max_filesize directive in php.ini: " : "Il file caricato supera la direttiva upload_max_filesize in php.ini:", - "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Il file inviato supera la direttiva MAX_FILE_SIZE specificata nel modulo HTML", + "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" : "Il file caricato supera la direttiva MAX_FILE_SIZE specificata nel modulo HTML", "The uploaded file was only partially uploaded" : "Il file è stato caricato solo parzialmente", "No file was uploaded" : "Nessun file è stato caricato", "Missing a temporary folder" : "Manca una cartella temporanea", @@ -33,10 +33,12 @@ "Invalid directory." : "Cartella non valida.", "Files" : "File", "All files" : "Tutti i file", + "Favorites" : "Preferiti", + "Home" : "Casa", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Impossibile caricare {filename} poiché è una cartella oppure ha una dimensione di 0 byte.", "Total file size {size1} exceeds upload limit {size2}" : "La dimensione totale del file {size1} supera il limite di caricamento {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Spazio insufficiente, stai caricando {size1}, ma è rimasto solo {size2}", - "Upload cancelled." : "Invio annullato", + "Upload cancelled." : "Caricamento annullato.", "Could not get result from server." : "Impossibile ottenere il risultato dal server.", "File upload is in progress. Leaving the page now will cancel the upload." : "Caricamento del file in corso. La chiusura della pagina annullerà il caricamento.", "URL cannot be empty" : "L'URL non può essere vuoto.", @@ -44,18 +46,19 @@ "Could not create file" : "Impossibile creare il file", "Could not create folder" : "Impossibile creare la cartella", "Error fetching URL" : "Errore durante il recupero dello URL", - "Share" : "Condividi", + "Rename" : "Rinomina", "Delete" : "Elimina", "Disconnect storage" : "Disconnetti archiviazione", "Unshare" : "Rimuovi condivisione", - "Delete permanently" : "Elimina definitivamente", - "Rename" : "Rinomina", + "Select" : "Seleziona", "Pending" : "In corso", + "Unable to determine date" : "Impossibile determinare la data", "Error moving file." : "Errore durante lo spostamento del file.", "Error moving file" : "Errore durante lo spostamento del file", "Error" : "Errore", "Could not rename file" : "Impossibile rinominare il file", "Error deleting file." : "Errore durante l'eliminazione del file.", + "No entries in this folder match '{filter}'" : "Nessuna voce in questa cartella corrisponde a '{filter}'", "Name" : "Nome", "Size" : "Dimensione", "Modified" : "Modificato", @@ -69,14 +72,18 @@ "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "L'applicazione di cifratura è abilitata, ma le chiavi non sono state inizializzate, disconnettiti ed effettua nuovamente l'accesso", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Chiave privata non valida per l'applicazione di cifratura. Aggiorna la password della chiave privata nelle impostazioni personali per ripristinare l'accesso ai tuoi file cifrati.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "La cifratura è stata disabilitata ma i tuoi file sono ancora cifrati. Vai nelle impostazioni personali per decifrare i file.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["corrisponde a '{filter}'","corrispondono a '{filter}'"], "{dirs} and {files}" : "{dirs} e {files}", + "Favorited" : "Preferiti", + "Favorite" : "Preferito", "%s could not be renamed as it has been deleted" : "%s non può essere rinominato poiché è stato eliminato", "%s could not be renamed" : "%s non può essere rinominato", "Upload (max. %s)" : "Carica (massimo %s)", "File handling" : "Gestione file", - "Maximum upload size" : "Dimensione massima upload", + "Maximum upload size" : "Dimensione massima caricamento", "max. possible: " : "numero mass.: ", "Save" : "Salva", + "Settings" : "Impostazioni", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Utilizza questo indirizzo per <a href=\"%s\" target=\"_blank\">accedere ai tuoi file con WebDAV</a>", "New" : "Nuovo", @@ -85,11 +92,18 @@ "New folder" : "Nuova cartella", "Folder" : "Cartella", "From link" : "Da collegamento", - "Nothing in here. Upload something!" : "Non c'è niente qui. Carica qualcosa!", + "Upload" : "Carica", + "Cancel upload" : "Annulla caricamento", + "No files yet" : "Nessun file ancora", + "Upload some content or sync with your devices!" : "Carica alcuni contenuti o sincronizza con i tuoi dispositivi!", + "No entries found in this folder" : "Nessuna voce trovata in questa cartella", + "Select all" : "Seleziona tutto", "Download" : "Scarica", "Upload too large" : "Caricamento troppo grande", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "I file che stai provando a caricare superano la dimensione massima consentita su questo server.", "Files are being scanned, please wait." : "Scansione dei file in corso, attendi", - "Currently scanning" : "Scansione in corso" + "Currently scanning" : "Scansione in corso", + "No favorites" : "Nessun preferito", + "Files and folders you mark as favorite will show up here" : "I file e le cartelle che marchi come preferiti saranno mostrati qui" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/ja.js b/apps/files/l10n/ja.js index 201da49664b..828ff65287b 100644 --- a/apps/files/l10n/ja.js +++ b/apps/files/l10n/ja.js @@ -35,6 +35,8 @@ OC.L10N.register( "Invalid directory." : "無効なディレクトリです。", "Files" : "ファイル", "All files" : "すべてのファイル", + "Favorites" : "お気に入り", + "Home" : "住居", "Unable to upload {filename} as it is a directory or has 0 bytes" : "ディレクトリもしくは0バイトのため {filename} をアップロードできません", "Total file size {size1} exceeds upload limit {size2}" : "合計ファイルサイズ {size1} はアップロード制限 {size2} を超過しています。", "Not enough free space, you are uploading {size1} but only {size2} is left" : "空き容量が十分でなく、 {size1} をアップロードしていますが、 {size2} しか残っていません。", @@ -46,13 +48,13 @@ OC.L10N.register( "Could not create file" : "ファイルを作成できませんでした", "Could not create folder" : "フォルダーを作成できませんでした", "Error fetching URL" : "URL取得エラー", - "Share" : "共有", + "Rename" : "名前の変更", "Delete" : "削除", "Disconnect storage" : "ストレージを切断する", "Unshare" : "共有解除", - "Delete permanently" : "完全に削除する", - "Rename" : "名前の変更", + "Select" : "選択", "Pending" : "中断", + "Unable to determine date" : "更新日不明", "Error moving file." : "ファイル移動でエラー", "Error moving file" : "ファイルの移動エラー", "Error" : "エラー", @@ -71,7 +73,10 @@ OC.L10N.register( "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "暗号化アプリは有効ですが、あなたの暗号化キーは初期化されていません。ログアウトした後に、再度ログインしてください", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "暗号化アプリの無効なプライベートキーです。あなたの暗号化されたファイルへアクセスするために、個人設定からプライベートキーのパスワードを更新してください。", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "暗号化の機能は無効化されましたが、ファイルはすでに暗号化されています。個人設定からファイルを複合を行ってください。", + "_ matches '{filter}'_::_ match '{filter}'_" : [""], "{dirs} and {files}" : "{dirs} と {files}", + "Favorited" : "お気に入り済", + "Favorite" : "お気に入り", "%s could not be renamed as it has been deleted" : "%s は削除された為、ファイル名を変更できません", "%s could not be renamed" : "%sの名前を変更できませんでした", "Upload (max. %s)" : "アップロード ( 最大 %s )", @@ -79,6 +84,7 @@ OC.L10N.register( "Maximum upload size" : "最大アップロードサイズ", "max. possible: " : "最大容量: ", "Save" : "保存", + "Settings" : "設定", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "<a href=\"%s\" target=\"_blank\">WebDAV経由でのファイルアクセス</a>にはこのアドレスを利用してください", "New" : "新規作成", @@ -87,11 +93,17 @@ OC.L10N.register( "New folder" : "新しいフォルダー", "Folder" : "フォルダー", "From link" : "リンク", - "Nothing in here. Upload something!" : "ここには何もありません。何かアップロードしてください。", + "Upload" : "アップロード", + "Cancel upload" : "アップロードをキャンセル", + "No files yet" : "ファイルなし", + "Upload some content or sync with your devices!" : "何かコンテンツをアップロードするか、デバイスからファイルを同期してください。", + "Select all" : "すべて選択", "Download" : "ダウンロード", "Upload too large" : "アップロードには大きすぎます。", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "アップロードしようとしているファイルは、サーバーで規定された最大サイズを超えています。", "Files are being scanned, please wait." : "ファイルをスキャンしています、しばらくお待ちください。", - "Currently scanning" : "現在スキャン中" + "Currently scanning" : "現在スキャン中", + "No favorites" : "お気に入りなし", + "Files and folders you mark as favorite will show up here" : "お気に入りに登録されたファイルやフォルダは、ここに表示されます。" }, "nplurals=1; plural=0;"); diff --git a/apps/files/l10n/ja.json b/apps/files/l10n/ja.json index 314bc723322..7f83bb57797 100644 --- a/apps/files/l10n/ja.json +++ b/apps/files/l10n/ja.json @@ -33,6 +33,8 @@ "Invalid directory." : "無効なディレクトリです。", "Files" : "ファイル", "All files" : "すべてのファイル", + "Favorites" : "お気に入り", + "Home" : "住居", "Unable to upload {filename} as it is a directory or has 0 bytes" : "ディレクトリもしくは0バイトのため {filename} をアップロードできません", "Total file size {size1} exceeds upload limit {size2}" : "合計ファイルサイズ {size1} はアップロード制限 {size2} を超過しています。", "Not enough free space, you are uploading {size1} but only {size2} is left" : "空き容量が十分でなく、 {size1} をアップロードしていますが、 {size2} しか残っていません。", @@ -44,13 +46,13 @@ "Could not create file" : "ファイルを作成できませんでした", "Could not create folder" : "フォルダーを作成できませんでした", "Error fetching URL" : "URL取得エラー", - "Share" : "共有", + "Rename" : "名前の変更", "Delete" : "削除", "Disconnect storage" : "ストレージを切断する", "Unshare" : "共有解除", - "Delete permanently" : "完全に削除する", - "Rename" : "名前の変更", + "Select" : "選択", "Pending" : "中断", + "Unable to determine date" : "更新日不明", "Error moving file." : "ファイル移動でエラー", "Error moving file" : "ファイルの移動エラー", "Error" : "エラー", @@ -69,7 +71,10 @@ "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "暗号化アプリは有効ですが、あなたの暗号化キーは初期化されていません。ログアウトした後に、再度ログインしてください", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "暗号化アプリの無効なプライベートキーです。あなたの暗号化されたファイルへアクセスするために、個人設定からプライベートキーのパスワードを更新してください。", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "暗号化の機能は無効化されましたが、ファイルはすでに暗号化されています。個人設定からファイルを複合を行ってください。", + "_ matches '{filter}'_::_ match '{filter}'_" : [""], "{dirs} and {files}" : "{dirs} と {files}", + "Favorited" : "お気に入り済", + "Favorite" : "お気に入り", "%s could not be renamed as it has been deleted" : "%s は削除された為、ファイル名を変更できません", "%s could not be renamed" : "%sの名前を変更できませんでした", "Upload (max. %s)" : "アップロード ( 最大 %s )", @@ -77,6 +82,7 @@ "Maximum upload size" : "最大アップロードサイズ", "max. possible: " : "最大容量: ", "Save" : "保存", + "Settings" : "設定", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "<a href=\"%s\" target=\"_blank\">WebDAV経由でのファイルアクセス</a>にはこのアドレスを利用してください", "New" : "新規作成", @@ -85,11 +91,17 @@ "New folder" : "新しいフォルダー", "Folder" : "フォルダー", "From link" : "リンク", - "Nothing in here. Upload something!" : "ここには何もありません。何かアップロードしてください。", + "Upload" : "アップロード", + "Cancel upload" : "アップロードをキャンセル", + "No files yet" : "ファイルなし", + "Upload some content or sync with your devices!" : "何かコンテンツをアップロードするか、デバイスからファイルを同期してください。", + "Select all" : "すべて選択", "Download" : "ダウンロード", "Upload too large" : "アップロードには大きすぎます。", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "アップロードしようとしているファイルは、サーバーで規定された最大サイズを超えています。", "Files are being scanned, please wait." : "ファイルをスキャンしています、しばらくお待ちください。", - "Currently scanning" : "現在スキャン中" + "Currently scanning" : "現在スキャン中", + "No favorites" : "お気に入りなし", + "Files and folders you mark as favorite will show up here" : "お気に入りに登録されたファイルやフォルダは、ここに表示されます。" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/files/l10n/jv.js b/apps/files/l10n/jv.js index b9de258aa2c..73f597c17c2 100644 --- a/apps/files/l10n/jv.js +++ b/apps/files/l10n/jv.js @@ -4,6 +4,7 @@ OC.L10N.register( "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "Download" : "Njipuk" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/jv.json b/apps/files/l10n/jv.json index c5064a9ff57..42528a5aeab 100644 --- a/apps/files/l10n/jv.json +++ b/apps/files/l10n/jv.json @@ -2,6 +2,7 @@ "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "Download" : "Njipuk" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/ka_GE.js b/apps/files/l10n/ka_GE.js index 9845b12b129..2b5339fa774 100644 --- a/apps/files/l10n/ka_GE.js +++ b/apps/files/l10n/ka_GE.js @@ -17,14 +17,14 @@ OC.L10N.register( "Not enough storage available" : "საცავში საკმარისი ადგილი არ არის", "Invalid directory." : "დაუშვებელი დირექტორია.", "Files" : "ფაილები", + "Favorites" : "ფავორიტები", + "Home" : "სახლი", "Upload cancelled." : "ატვირთვა შეჩერებულ იქნა.", "File upload is in progress. Leaving the page now will cancel the upload." : "მიმდინარეობს ფაილის ატვირთვა. სხვა გვერდზე გადასვლა გამოიწვევს ატვირთვის შეჩერებას", "{new_name} already exists" : "{new_name} უკვე არსებობს", - "Share" : "გაზიარება", + "Rename" : "გადარქმევა", "Delete" : "წაშლა", "Unshare" : "გაუზიარებადი", - "Delete permanently" : "სრულად წაშლა", - "Rename" : "გადარქმევა", "Pending" : "მოცდის რეჟიმში", "Error" : "შეცდომა", "Name" : "სახელი", @@ -35,17 +35,21 @@ OC.L10N.register( "_Uploading %n file_::_Uploading %n files_" : [""], "Your storage is full, files can not be updated or synced anymore!" : "თქვენი საცავი გადაივსო. ფაილების განახლება და სინქრონიზირება ვერ მოხერხდება!", "Your storage is almost full ({usedSpacePercent}%)" : "თქვენი საცავი თითქმის გადაივსო ({usedSpacePercent}%)", + "_ matches '{filter}'_::_ match '{filter}'_" : [""], + "Favorite" : "ფავორიტი", "File handling" : "ფაილის დამუშავება", "Maximum upload size" : "მაქსიმუმ ატვირთის ზომა", "max. possible: " : "მაქს. შესაძლებელი:", "Save" : "შენახვა", + "Settings" : "პარამეტრები", "WebDAV" : "WebDAV", "New" : "ახალი", "Text file" : "ტექსტური ფაილი", "New folder" : "ახალი ფოლდერი", "Folder" : "საქაღალდე", "From link" : "მისამართიდან", - "Nothing in here. Upload something!" : "აქ არაფერი არ არის. ატვირთე რამე!", + "Upload" : "ატვირთვა", + "Cancel upload" : "ატვირთვის გაუქმება", "Download" : "ჩამოტვირთვა", "Upload too large" : "ასატვირთი ფაილი ძალიან დიდია", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "ფაილის ზომა რომლის ატვირთვასაც თქვენ აპირებთ, აჭარბებს სერვერზე დაშვებულ მაქსიმუმს.", diff --git a/apps/files/l10n/ka_GE.json b/apps/files/l10n/ka_GE.json index 65dde81cfc4..664c8e3c0e0 100644 --- a/apps/files/l10n/ka_GE.json +++ b/apps/files/l10n/ka_GE.json @@ -15,14 +15,14 @@ "Not enough storage available" : "საცავში საკმარისი ადგილი არ არის", "Invalid directory." : "დაუშვებელი დირექტორია.", "Files" : "ფაილები", + "Favorites" : "ფავორიტები", + "Home" : "სახლი", "Upload cancelled." : "ატვირთვა შეჩერებულ იქნა.", "File upload is in progress. Leaving the page now will cancel the upload." : "მიმდინარეობს ფაილის ატვირთვა. სხვა გვერდზე გადასვლა გამოიწვევს ატვირთვის შეჩერებას", "{new_name} already exists" : "{new_name} უკვე არსებობს", - "Share" : "გაზიარება", + "Rename" : "გადარქმევა", "Delete" : "წაშლა", "Unshare" : "გაუზიარებადი", - "Delete permanently" : "სრულად წაშლა", - "Rename" : "გადარქმევა", "Pending" : "მოცდის რეჟიმში", "Error" : "შეცდომა", "Name" : "სახელი", @@ -33,17 +33,21 @@ "_Uploading %n file_::_Uploading %n files_" : [""], "Your storage is full, files can not be updated or synced anymore!" : "თქვენი საცავი გადაივსო. ფაილების განახლება და სინქრონიზირება ვერ მოხერხდება!", "Your storage is almost full ({usedSpacePercent}%)" : "თქვენი საცავი თითქმის გადაივსო ({usedSpacePercent}%)", + "_ matches '{filter}'_::_ match '{filter}'_" : [""], + "Favorite" : "ფავორიტი", "File handling" : "ფაილის დამუშავება", "Maximum upload size" : "მაქსიმუმ ატვირთის ზომა", "max. possible: " : "მაქს. შესაძლებელი:", "Save" : "შენახვა", + "Settings" : "პარამეტრები", "WebDAV" : "WebDAV", "New" : "ახალი", "Text file" : "ტექსტური ფაილი", "New folder" : "ახალი ფოლდერი", "Folder" : "საქაღალდე", "From link" : "მისამართიდან", - "Nothing in here. Upload something!" : "აქ არაფერი არ არის. ატვირთე რამე!", + "Upload" : "ატვირთვა", + "Cancel upload" : "ატვირთვის გაუქმება", "Download" : "ჩამოტვირთვა", "Upload too large" : "ასატვირთი ფაილი ძალიან დიდია", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "ფაილის ზომა რომლის ატვირთვასაც თქვენ აპირებთ, აჭარბებს სერვერზე დაშვებულ მაქსიმუმს.", diff --git a/apps/files/l10n/km.js b/apps/files/l10n/km.js index 5a44796d1e7..1efaad9e034 100644 --- a/apps/files/l10n/km.js +++ b/apps/files/l10n/km.js @@ -11,11 +11,9 @@ OC.L10N.register( "Files" : "ឯកសារ", "Upload cancelled." : "បានបោះបង់ការផ្ទុកឡើង។", "{new_name} already exists" : "មានឈ្មោះ {new_name} រួចហើយ", - "Share" : "ចែករំលែក", + "Rename" : "ប្ដូរឈ្មោះ", "Delete" : "លុប", "Unshare" : "លែងចែករំលែក", - "Delete permanently" : "លុបជាអចិន្ត្រៃយ៍", - "Rename" : "ប្ដូរឈ្មោះ", "Pending" : "កំពុងរង់ចាំ", "Error" : "កំហុស", "Name" : "ឈ្មោះ", @@ -24,15 +22,18 @@ OC.L10N.register( "_%n folder_::_%n folders_" : [""], "_%n file_::_%n files_" : [""], "_Uploading %n file_::_Uploading %n files_" : [""], + "_ matches '{filter}'_::_ match '{filter}'_" : [""], "Maximum upload size" : "ទំហំផ្ទុកឡើងជាអតិបរមា", "Save" : "រក្សាទុក", + "Settings" : "ការកំណត់", "WebDAV" : "WebDAV", "New" : "ថ្មី", "Text file" : "ឯកសារអក្សរ", "New folder" : "ថតថ្មី", "Folder" : "ថត", "From link" : "ពីតំណ", - "Nothing in here. Upload something!" : "គ្មានអ្វីនៅទីនេះទេ។ ផ្ទុកឡើងអ្វីមួយ!", + "Upload" : "ផ្ទុកឡើង", + "Cancel upload" : "បោះបង់ការផ្ទុកឡើង", "Download" : "ទាញយក", "Upload too large" : "ផ្ទុកឡើងធំពេក" }, diff --git a/apps/files/l10n/km.json b/apps/files/l10n/km.json index 6ed24afe47a..1a94fd13d3d 100644 --- a/apps/files/l10n/km.json +++ b/apps/files/l10n/km.json @@ -9,11 +9,9 @@ "Files" : "ឯកសារ", "Upload cancelled." : "បានបោះបង់ការផ្ទុកឡើង។", "{new_name} already exists" : "មានឈ្មោះ {new_name} រួចហើយ", - "Share" : "ចែករំលែក", + "Rename" : "ប្ដូរឈ្មោះ", "Delete" : "លុប", "Unshare" : "លែងចែករំលែក", - "Delete permanently" : "លុបជាអចិន្ត្រៃយ៍", - "Rename" : "ប្ដូរឈ្មោះ", "Pending" : "កំពុងរង់ចាំ", "Error" : "កំហុស", "Name" : "ឈ្មោះ", @@ -22,15 +20,18 @@ "_%n folder_::_%n folders_" : [""], "_%n file_::_%n files_" : [""], "_Uploading %n file_::_Uploading %n files_" : [""], + "_ matches '{filter}'_::_ match '{filter}'_" : [""], "Maximum upload size" : "ទំហំផ្ទុកឡើងជាអតិបរមា", "Save" : "រក្សាទុក", + "Settings" : "ការកំណត់", "WebDAV" : "WebDAV", "New" : "ថ្មី", "Text file" : "ឯកសារអក្សរ", "New folder" : "ថតថ្មី", "Folder" : "ថត", "From link" : "ពីតំណ", - "Nothing in here. Upload something!" : "គ្មានអ្វីនៅទីនេះទេ។ ផ្ទុកឡើងអ្វីមួយ!", + "Upload" : "ផ្ទុកឡើង", + "Cancel upload" : "បោះបង់ការផ្ទុកឡើង", "Download" : "ទាញយក", "Upload too large" : "ផ្ទុកឡើងធំពេក" },"pluralForm" :"nplurals=1; plural=0;" diff --git a/apps/files/l10n/kn.js b/apps/files/l10n/kn.js index d1bbfca2dd4..783eb4dc14c 100644 --- a/apps/files/l10n/kn.js +++ b/apps/files/l10n/kn.js @@ -1,8 +1,89 @@ OC.L10N.register( "files", { - "_%n folder_::_%n folders_" : [""], - "_%n file_::_%n files_" : [""], - "_Uploading %n file_::_Uploading %n files_" : [""] + "Storage not available" : "ಲಭ್ಯವಿಲ್ಲ ಸಂಗ್ರಹ", + "Storage invalid" : "ಸಂಗ್ರಹ ಅಮಾನ್ಯವಾಗಿದೆ", + "Unknown error" : "ಗೊತ್ತಿಲ್ಲದ ದೋಷ", + "Could not move %s - File with this name already exists" : "%s ಹೆಸರು ಈಗಾಗಲೇ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ - ಸ್ಥಳ ಬದಲಾವಣೆ ಸಾಧ್ಯವಿಲ್ಲ", + "Could not move %s" : "%s ಸ್ಥಳ ಬದಲಾವಣೆ ಸಾಧ್ಯವಿಲ್ಲ", + "Permission denied" : "ಅನುಮತಿ ನಿರಾಕರಿಸಲಾಗಿದೆ", + "File name cannot be empty." : "ಕಡತ ಹೆಸರು ಖಾಲಿ ಇರುವಂತಿಲ್ಲ.", + "\"%s\" is an invalid file name." : "\"%s\" ಅಮಾನ್ಯ ಕಡತ ಹೆಸರು.", + "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." : "ಅಮಾನ್ಯವಾದ ಹೆಸರು, '\\', '/', '<', '>', ':', '\"', '|', '?' ಮತ್ತು '*' ಅನುಮತಿ ಇಲ್ಲ.", + "The target folder has been moved or deleted." : "ಕೋಶದ ಉದ್ದೇಶಿತ ಸ್ಥಳ ಬದಲಾವಣೆ ಮಾಡಲಾಗಿದೆ ಅಥವಾ ಅಳಿಸಲಾಗಿದೆ.", + "The name %s is already used in the folder %s. Please choose a different name." : "%s ಹೆಸರಿನ ಕೋಶವನ್ನು %s ಈಗಾಗಲೇ ಬಳಸಲಾಗುತ್ತದೆ. ಬೇರೆ ಹೆಸರನ್ನು ಆಯ್ಕೆಮಾಡಿ.", + "Not a valid source" : "ತೋರಿಸಲಾದ ಸ್ಥಾನ ಅಮಾನ್ಯ", + "Server is not allowed to open URLs, please check the server configuration" : "ಸರ್ವರ್ URL ಗಳನ್ನು ತೆರೆಯಲು ಅನುಮತಿ ಇಲ್ಲ, ಸರ್ವರ್ ಕಾನ್ಫಿಗರೇಶನ್ ಪರಿಶೀಲಿಸಿ", + "The file exceeds your quota by %s" : "ಕಡತ ಪ್ರಮಾಣ ನಿಮಗಿರುವ ಮಿತಿಗಿಂತ %s ಹೆಚ್ಚಾಗಿದೆ", + "Error while downloading %s to %s" : "%s ರಿಂದ %s ವರ್ಗಾವಾಣೆ ಮಾಡುವಾಗ ಲೋಪವಾದೆ", + "Error when creating the file" : "ಕಡತವನ್ನು ರಚಿಸುವಾಗ ದೋಷವಾಗಿದೆ", + "Folder name cannot be empty." : "ಕೊಶದ ಹೆಸರು ಖಾಲಿ ಇರುವಂತಿಲ್ಲ.", + "Error when creating the folder" : "ಕೊಶವನ್ನು ರಚಿಸುವಾಗ ದೋಷವಾಗಿದೆ", + "Unable to set upload directory." : "ಪೇರಿಸವ ಕೋಶವನ್ನು ಹೊಂದಿಸಲಾಗಲಿಲ್ಲ.", + "Invalid Token" : "ಅಮಾನ್ಯ ಸಾಂಕೇತಿಕ", + "No file was uploaded. Unknown error" : "ಕಡತ ವರ್ಗಾವಣೆ ಅಜ್ಞಾತ ದೋಷದಿಂದ ವಿಪುಲವಾಗಿದೆ", + "There is no error, the file uploaded with success" : "ವರ್ಗಾವಣೆ ಯಾವುದೇ ದೋಷ ಕಂಡುಬರದೆ ಯಶಸ್ವಿಯಾಗಿದೆ", + "The uploaded file was only partially uploaded" : "ವರ್ಗಾವಣೆ ಮಾಡಲಾಗುತ್ತಿದ್ದ ಕಡತವನ್ನು ಭಾಗಶಃ ಮಾತ್ರ ಪೇರಿಸಲು ಸಾದ್ಯವಾಗಿದೆ", + "No file was uploaded" : "ವರ್ಗಾವಣೆಗೆ ಯಾವುದೇ ಕಡತಗಳು ಕಂಡುಬಂದಿಲ್ಲ", + "Missing a temporary folder" : "ತಾತ್ಕಾಲಿಕ ಕಡತಕೋಶ ದೊರೆಕುತ್ತಿಲ್ಲ", + "Failed to write to disk" : "ಸ್ಮರಣೆ ಸಾಧನಕ್ಕೇಬರೆಯಲು ವಿಫಲವಾಗಿದೆ", + "Not enough storage available" : "ಲಭ್ಯವಿರುವ ಸಂಗ್ರಹ ಸಾಕಾಗುವುದಿಲ್ಲ", + "Invalid directory." : "ಅಮಾನ್ಯ ಕಡತಕೋಶ.", + "Files" : "ಕಡತಗಳು", + "All files" : "ಎಲ್ಲಾ ಕಡತಗಳು", + "Favorites" : "ಅಚ್ಚುಮೆಚ್ಚಿನ", + "Home" : "ಮುಖಪುಟ", + "Upload cancelled." : "ವರ್ಗಾವಣೆಯನ್ನು ರದ್ದು ಮಾಡಲಾಯಿತು.", + "Could not get result from server." : "ಪರಿಚಾರಕ ಕಣಕದಿಂದ ಫಲಿತಾಂಶವನ್ನು ಪಡೆಯಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ.", + "URL cannot be empty" : "ಜಾಲದ ಕೊಂಡಿಯ ಹೆಸರು ಖಾಲಿ ಇರುವಂತಿಲ್ಲ", + "{new_name} already exists" : "ಈಗಾಗಲೇ {new_name} ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ", + "Could not create file" : "ಕಡತ ರಚಿಸಲಾಗಲಿಲ್ಲ", + "Could not create folder" : "ಕೋಶವನ್ನು ರಚಿಸಲಾಗಿಲ್ಲ", + "Rename" : "ಮರುಹೆಸರಿಸು", + "Delete" : "ಅಳಿಸಿ", + "Disconnect storage" : "ಸಂಗ್ರಹ ಸಾಧನವನ್ನು ತೆಗೆದುಹಾಕಿ", + "Unshare" : "ಹಂಚಿಕೆಯನ್ನು ಹಿಂತೆಗೆ", + "Select" : "ಆಯ್ಕೆ ಮಾಡಿ", + "Pending" : "ಬಾಕಿ ಇದೆ", + "Unable to determine date" : "ಮುಕ್ತಾಯ ದಿನಾಂಕ ನಿರ್ಧರಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ", + "Error moving file." : "ಕಡತದ ಸ್ಥಾನವನ್ನು ಬದಲಾಯಿಸುವಾಗ ದೋಷವಾಗಿದೆ.", + "Error moving file" : "ಕಡತದ ಸ್ಥಾನವನ್ನು ಬದಲಾಯಿಸುವಾಗ ದೋಷವಾಗಿದೆ", + "Error" : "ತಪ್ಪಾಗಿದೆ", + "Could not rename file" : "ಕಡತ ಮರುಹೆಸರಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ", + "Error deleting file." : "ಕಡತವನ್ನು ಅಳಿಸುವಲ್ಲಿ ಲೋಪವಾದೆ", + "Name" : "ಹೆಸರು", + "Size" : " ಪ್ರಮಾಣ", + "Modified" : "ಬದಲಾಯಿಸಿದ", + "_%n folder_::_%n folders_" : ["%n ಕೋಶ(ಗಳು)"], + "_%n file_::_%n files_" : ["%n ಕಡತ"], + "You don’t have permission to upload or create files here" : "ನಿಮಗೆ ಇಲ್ಲಿ ಅಪ್ಲೋಡ್ ಅಥವಾ ಕಡತಗಳನ್ನು ರಚಿಸವ ಅನುಮತಿ ಇಲ್ಲ", + "_Uploading %n file_::_Uploading %n files_" : ["%n 'ನೆ ಕಡತವನ್ನು ವರ್ಗಾಯಿಸಲಾಗುತ್ತಿದೆ"], + "_ matches '{filter}'_::_ match '{filter}'_" : [""], + "Favorited" : "ಅಚ್ಚುಮೆಚ್ಚಿನವು", + "Favorite" : "ಅಚ್ಚುಮೆಚ್ಚಿನ", + "Upload (max. %s)" : "ವರ್ಗಾವಣೆ (ಗರಿಷ್ಠ %s)", + "File handling" : "ಕಡತ ನಿರ್ವಹಣೆ", + "Maximum upload size" : "ಗರಿಷ್ಠ ವರ್ಗಾವಣೆ ಗಾತ್ರ", + "max. possible: " : "ಗರಿಷ್ಠ. ಸಾಧ್ಯ:", + "Save" : "ಉಳಿಸಿ", + "Settings" : "ಆಯ್ಕೆ", + "WebDAV" : "WebDAV", + "New" : "ಹೊಸ", + "New text file" : "ಹೊಸ ಸರಳಾಕ್ಷರದ ಕಡತ ", + "Text file" : "ಸರಳಾಕ್ಷರದ ಕಡತ", + "New folder" : "ಹೊಸ ಕಡತಕೋಶ", + "Folder" : "ಕಡತಕೋಶ", + "From link" : "ಸಂಪರ್ಕ ಕೊಂಡಿ", + "Upload" : "ವರ್ಗಾಯಿಸಿ", + "Cancel upload" : "ವರ್ಗಾವಣೆ ರದ್ದು ಮಾಡಿ", + "No files yet" : "ಇನ್ನೂ ಯಾವುದೇ ಕಡತಗಳು ಇಲ್ಲಿಲ", + "Select all" : "ಎಲ್ಲಾ ಆಯ್ಕೆ ಮಾಡಿ", + "Download" : "ಪ್ರತಿಯನ್ನು ಸ್ಥಳೀಯವಾಗಿ ಉಳಿಸಿಕೊಳ್ಳಿ", + "Upload too large" : "ದೊಡ್ಡ ಪ್ರಮಾಣದ ಪ್ರತಿಗಳನ್ನು ವರ್ಗಾವಣೆ ಮಾಡಲು ಸಾದ್ಯವಿಲ್ಲ", + "The files you are trying to upload exceed the maximum size for file uploads on this server." : "ನೀವು ವರ್ಗಾಯಿಸಲು ಪ್ರಯತ್ನಿಸುತ್ತಿರುವ ಕಡತಗಳ ಗಾತ್ರ, ಈ ಗಣಕ ಕೋಶದ ಗರಿಷ್ಠ ಕಡತ ಮೀತಿಯಾನ್ನು ಮೀರುವಂತಿಲ್ಲ.", + "Files are being scanned, please wait." : "ಕಡತಗಳನ್ನು ಪರೀಕ್ಷಿಸಲಾಗುತ್ತಿದೆ, ದಯವಿಟ್ಟು ನಿರೀಕ್ಷಿಸಿ.", + "Currently scanning" : "ಪ್ರಸ್ತುತ ಪರೀಕ್ಷೆ", + "No favorites" : "ಯಾವ ಅಚ್ಚುಮೆಚ್ಚಿನವುಗಳು ಇಲ್ಲ", + "Files and folders you mark as favorite will show up here" : "ನೀವು ಗುರುತು ಮಾಡಿರುವ ನೆಚ್ಚಿನ ಕಡತ ಮತ್ತು ಕಡತಕೋಶಗಳನ್ನು ಇಲ್ಲಿ ತೋರಿಸಲಾಗುತ್ತಿದೆ" }, "nplurals=1; plural=0;"); diff --git a/apps/files/l10n/kn.json b/apps/files/l10n/kn.json index e493054d78a..4d25a6b9cb5 100644 --- a/apps/files/l10n/kn.json +++ b/apps/files/l10n/kn.json @@ -1,6 +1,87 @@ { "translations": { - "_%n folder_::_%n folders_" : [""], - "_%n file_::_%n files_" : [""], - "_Uploading %n file_::_Uploading %n files_" : [""] + "Storage not available" : "ಲಭ್ಯವಿಲ್ಲ ಸಂಗ್ರಹ", + "Storage invalid" : "ಸಂಗ್ರಹ ಅಮಾನ್ಯವಾಗಿದೆ", + "Unknown error" : "ಗೊತ್ತಿಲ್ಲದ ದೋಷ", + "Could not move %s - File with this name already exists" : "%s ಹೆಸರು ಈಗಾಗಲೇ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ - ಸ್ಥಳ ಬದಲಾವಣೆ ಸಾಧ್ಯವಿಲ್ಲ", + "Could not move %s" : "%s ಸ್ಥಳ ಬದಲಾವಣೆ ಸಾಧ್ಯವಿಲ್ಲ", + "Permission denied" : "ಅನುಮತಿ ನಿರಾಕರಿಸಲಾಗಿದೆ", + "File name cannot be empty." : "ಕಡತ ಹೆಸರು ಖಾಲಿ ಇರುವಂತಿಲ್ಲ.", + "\"%s\" is an invalid file name." : "\"%s\" ಅಮಾನ್ಯ ಕಡತ ಹೆಸರು.", + "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." : "ಅಮಾನ್ಯವಾದ ಹೆಸರು, '\\', '/', '<', '>', ':', '\"', '|', '?' ಮತ್ತು '*' ಅನುಮತಿ ಇಲ್ಲ.", + "The target folder has been moved or deleted." : "ಕೋಶದ ಉದ್ದೇಶಿತ ಸ್ಥಳ ಬದಲಾವಣೆ ಮಾಡಲಾಗಿದೆ ಅಥವಾ ಅಳಿಸಲಾಗಿದೆ.", + "The name %s is already used in the folder %s. Please choose a different name." : "%s ಹೆಸರಿನ ಕೋಶವನ್ನು %s ಈಗಾಗಲೇ ಬಳಸಲಾಗುತ್ತದೆ. ಬೇರೆ ಹೆಸರನ್ನು ಆಯ್ಕೆಮಾಡಿ.", + "Not a valid source" : "ತೋರಿಸಲಾದ ಸ್ಥಾನ ಅಮಾನ್ಯ", + "Server is not allowed to open URLs, please check the server configuration" : "ಸರ್ವರ್ URL ಗಳನ್ನು ತೆರೆಯಲು ಅನುಮತಿ ಇಲ್ಲ, ಸರ್ವರ್ ಕಾನ್ಫಿಗರೇಶನ್ ಪರಿಶೀಲಿಸಿ", + "The file exceeds your quota by %s" : "ಕಡತ ಪ್ರಮಾಣ ನಿಮಗಿರುವ ಮಿತಿಗಿಂತ %s ಹೆಚ್ಚಾಗಿದೆ", + "Error while downloading %s to %s" : "%s ರಿಂದ %s ವರ್ಗಾವಾಣೆ ಮಾಡುವಾಗ ಲೋಪವಾದೆ", + "Error when creating the file" : "ಕಡತವನ್ನು ರಚಿಸುವಾಗ ದೋಷವಾಗಿದೆ", + "Folder name cannot be empty." : "ಕೊಶದ ಹೆಸರು ಖಾಲಿ ಇರುವಂತಿಲ್ಲ.", + "Error when creating the folder" : "ಕೊಶವನ್ನು ರಚಿಸುವಾಗ ದೋಷವಾಗಿದೆ", + "Unable to set upload directory." : "ಪೇರಿಸವ ಕೋಶವನ್ನು ಹೊಂದಿಸಲಾಗಲಿಲ್ಲ.", + "Invalid Token" : "ಅಮಾನ್ಯ ಸಾಂಕೇತಿಕ", + "No file was uploaded. Unknown error" : "ಕಡತ ವರ್ಗಾವಣೆ ಅಜ್ಞಾತ ದೋಷದಿಂದ ವಿಪುಲವಾಗಿದೆ", + "There is no error, the file uploaded with success" : "ವರ್ಗಾವಣೆ ಯಾವುದೇ ದೋಷ ಕಂಡುಬರದೆ ಯಶಸ್ವಿಯಾಗಿದೆ", + "The uploaded file was only partially uploaded" : "ವರ್ಗಾವಣೆ ಮಾಡಲಾಗುತ್ತಿದ್ದ ಕಡತವನ್ನು ಭಾಗಶಃ ಮಾತ್ರ ಪೇರಿಸಲು ಸಾದ್ಯವಾಗಿದೆ", + "No file was uploaded" : "ವರ್ಗಾವಣೆಗೆ ಯಾವುದೇ ಕಡತಗಳು ಕಂಡುಬಂದಿಲ್ಲ", + "Missing a temporary folder" : "ತಾತ್ಕಾಲಿಕ ಕಡತಕೋಶ ದೊರೆಕುತ್ತಿಲ್ಲ", + "Failed to write to disk" : "ಸ್ಮರಣೆ ಸಾಧನಕ್ಕೇಬರೆಯಲು ವಿಫಲವಾಗಿದೆ", + "Not enough storage available" : "ಲಭ್ಯವಿರುವ ಸಂಗ್ರಹ ಸಾಕಾಗುವುದಿಲ್ಲ", + "Invalid directory." : "ಅಮಾನ್ಯ ಕಡತಕೋಶ.", + "Files" : "ಕಡತಗಳು", + "All files" : "ಎಲ್ಲಾ ಕಡತಗಳು", + "Favorites" : "ಅಚ್ಚುಮೆಚ್ಚಿನ", + "Home" : "ಮುಖಪುಟ", + "Upload cancelled." : "ವರ್ಗಾವಣೆಯನ್ನು ರದ್ದು ಮಾಡಲಾಯಿತು.", + "Could not get result from server." : "ಪರಿಚಾರಕ ಕಣಕದಿಂದ ಫಲಿತಾಂಶವನ್ನು ಪಡೆಯಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ.", + "URL cannot be empty" : "ಜಾಲದ ಕೊಂಡಿಯ ಹೆಸರು ಖಾಲಿ ಇರುವಂತಿಲ್ಲ", + "{new_name} already exists" : "ಈಗಾಗಲೇ {new_name} ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ", + "Could not create file" : "ಕಡತ ರಚಿಸಲಾಗಲಿಲ್ಲ", + "Could not create folder" : "ಕೋಶವನ್ನು ರಚಿಸಲಾಗಿಲ್ಲ", + "Rename" : "ಮರುಹೆಸರಿಸು", + "Delete" : "ಅಳಿಸಿ", + "Disconnect storage" : "ಸಂಗ್ರಹ ಸಾಧನವನ್ನು ತೆಗೆದುಹಾಕಿ", + "Unshare" : "ಹಂಚಿಕೆಯನ್ನು ಹಿಂತೆಗೆ", + "Select" : "ಆಯ್ಕೆ ಮಾಡಿ", + "Pending" : "ಬಾಕಿ ಇದೆ", + "Unable to determine date" : "ಮುಕ್ತಾಯ ದಿನಾಂಕ ನಿರ್ಧರಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ", + "Error moving file." : "ಕಡತದ ಸ್ಥಾನವನ್ನು ಬದಲಾಯಿಸುವಾಗ ದೋಷವಾಗಿದೆ.", + "Error moving file" : "ಕಡತದ ಸ್ಥಾನವನ್ನು ಬದಲಾಯಿಸುವಾಗ ದೋಷವಾಗಿದೆ", + "Error" : "ತಪ್ಪಾಗಿದೆ", + "Could not rename file" : "ಕಡತ ಮರುಹೆಸರಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ", + "Error deleting file." : "ಕಡತವನ್ನು ಅಳಿಸುವಲ್ಲಿ ಲೋಪವಾದೆ", + "Name" : "ಹೆಸರು", + "Size" : " ಪ್ರಮಾಣ", + "Modified" : "ಬದಲಾಯಿಸಿದ", + "_%n folder_::_%n folders_" : ["%n ಕೋಶ(ಗಳು)"], + "_%n file_::_%n files_" : ["%n ಕಡತ"], + "You don’t have permission to upload or create files here" : "ನಿಮಗೆ ಇಲ್ಲಿ ಅಪ್ಲೋಡ್ ಅಥವಾ ಕಡತಗಳನ್ನು ರಚಿಸವ ಅನುಮತಿ ಇಲ್ಲ", + "_Uploading %n file_::_Uploading %n files_" : ["%n 'ನೆ ಕಡತವನ್ನು ವರ್ಗಾಯಿಸಲಾಗುತ್ತಿದೆ"], + "_ matches '{filter}'_::_ match '{filter}'_" : [""], + "Favorited" : "ಅಚ್ಚುಮೆಚ್ಚಿನವು", + "Favorite" : "ಅಚ್ಚುಮೆಚ್ಚಿನ", + "Upload (max. %s)" : "ವರ್ಗಾವಣೆ (ಗರಿಷ್ಠ %s)", + "File handling" : "ಕಡತ ನಿರ್ವಹಣೆ", + "Maximum upload size" : "ಗರಿಷ್ಠ ವರ್ಗಾವಣೆ ಗಾತ್ರ", + "max. possible: " : "ಗರಿಷ್ಠ. ಸಾಧ್ಯ:", + "Save" : "ಉಳಿಸಿ", + "Settings" : "ಆಯ್ಕೆ", + "WebDAV" : "WebDAV", + "New" : "ಹೊಸ", + "New text file" : "ಹೊಸ ಸರಳಾಕ್ಷರದ ಕಡತ ", + "Text file" : "ಸರಳಾಕ್ಷರದ ಕಡತ", + "New folder" : "ಹೊಸ ಕಡತಕೋಶ", + "Folder" : "ಕಡತಕೋಶ", + "From link" : "ಸಂಪರ್ಕ ಕೊಂಡಿ", + "Upload" : "ವರ್ಗಾಯಿಸಿ", + "Cancel upload" : "ವರ್ಗಾವಣೆ ರದ್ದು ಮಾಡಿ", + "No files yet" : "ಇನ್ನೂ ಯಾವುದೇ ಕಡತಗಳು ಇಲ್ಲಿಲ", + "Select all" : "ಎಲ್ಲಾ ಆಯ್ಕೆ ಮಾಡಿ", + "Download" : "ಪ್ರತಿಯನ್ನು ಸ್ಥಳೀಯವಾಗಿ ಉಳಿಸಿಕೊಳ್ಳಿ", + "Upload too large" : "ದೊಡ್ಡ ಪ್ರಮಾಣದ ಪ್ರತಿಗಳನ್ನು ವರ್ಗಾವಣೆ ಮಾಡಲು ಸಾದ್ಯವಿಲ್ಲ", + "The files you are trying to upload exceed the maximum size for file uploads on this server." : "ನೀವು ವರ್ಗಾಯಿಸಲು ಪ್ರಯತ್ನಿಸುತ್ತಿರುವ ಕಡತಗಳ ಗಾತ್ರ, ಈ ಗಣಕ ಕೋಶದ ಗರಿಷ್ಠ ಕಡತ ಮೀತಿಯಾನ್ನು ಮೀರುವಂತಿಲ್ಲ.", + "Files are being scanned, please wait." : "ಕಡತಗಳನ್ನು ಪರೀಕ್ಷಿಸಲಾಗುತ್ತಿದೆ, ದಯವಿಟ್ಟು ನಿರೀಕ್ಷಿಸಿ.", + "Currently scanning" : "ಪ್ರಸ್ತುತ ಪರೀಕ್ಷೆ", + "No favorites" : "ಯಾವ ಅಚ್ಚುಮೆಚ್ಚಿನವುಗಳು ಇಲ್ಲ", + "Files and folders you mark as favorite will show up here" : "ನೀವು ಗುರುತು ಮಾಡಿರುವ ನೆಚ್ಚಿನ ಕಡತ ಮತ್ತು ಕಡತಕೋಶಗಳನ್ನು ಇಲ್ಲಿ ತೋರಿಸಲಾಗುತ್ತಿದೆ" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/files/l10n/ko.js b/apps/files/l10n/ko.js index 519652e4796..2146addc20b 100644 --- a/apps/files/l10n/ko.js +++ b/apps/files/l10n/ko.js @@ -28,6 +28,8 @@ OC.L10N.register( "Upload failed. Could not get file info." : "업로드에 실패했습니다. 파일 정보를 가져올 수 없습니다.", "Invalid directory." : "올바르지 않은 디렉터리입니다.", "Files" : "파일", + "Favorites" : "즐겨찾기", + "Home" : "가정", "Unable to upload {filename} as it is a directory or has 0 bytes" : "{filename}을(를) 업로드할 수 없습니다. 폴더이거나 0 바이트 파일입니다.", "Upload cancelled." : "업로드가 취소되었습니다.", "Could not get result from server." : "서버에서 결과를 가져올 수 없습니다.", @@ -37,11 +39,10 @@ OC.L10N.register( "Could not create file" : "파일을 만들 수 없음", "Could not create folder" : "폴더를 만들 수 없음", "Error fetching URL" : "URL을 가져올 수 없음", - "Share" : "공유", + "Rename" : "이름 바꾸기", "Delete" : "삭제", "Unshare" : "공유 해제", - "Delete permanently" : "영구히 삭제", - "Rename" : "이름 바꾸기", + "Select" : "선택", "Pending" : "대기 중", "Error moving file" : "파일 이동 오류", "Error" : "오류", @@ -59,12 +60,15 @@ OC.L10N.register( "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "암호화 앱이 활성화되어 있지만 키가 초기화되지 않았습니다. 로그아웃한 후 다시 로그인하십시오", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "암호화 앱의 개인 키가 잘못되었습니다. 암호화된 파일에 다시 접근하려면 개인 설정에서 개인 키 암호를 업데이트해야 합니다.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "암호화는 해제되어 있지만, 파일은 아직 암호화되어 있습니다. 개인 설정에서 파일을 복호화하십시오.", + "_ matches '{filter}'_::_ match '{filter}'_" : [""], "{dirs} and {files}" : "{dirs} 그리고 {files}", + "Favorite" : "즐겨찾기", "%s could not be renamed" : "%s의 이름을 변경할 수 없습니다", "File handling" : "파일 처리", "Maximum upload size" : "최대 업로드 크기", "max. possible: " : "최대 가능:", "Save" : "저장", + "Settings" : "설정", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "WebDAV로 파일에 접근하려면 <a href=\"%s\" target=\"_blank\">이 주소를 사용하십시오</a>", "New" : "새로 만들기", @@ -73,7 +77,8 @@ OC.L10N.register( "New folder" : "새 폴더", "Folder" : "폴더", "From link" : "링크에서", - "Nothing in here. Upload something!" : "내용이 없습니다. 업로드할 수 있습니다!", + "Upload" : "업로드", + "Cancel upload" : "업로드 취소", "Download" : "다운로드", "Upload too large" : "업로드한 파일이 너무 큼", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "이 파일이 서버에서 허용하는 최대 업로드 가능 용량보다 큽니다.", diff --git a/apps/files/l10n/ko.json b/apps/files/l10n/ko.json index afcda78ecd0..2086a83f2f5 100644 --- a/apps/files/l10n/ko.json +++ b/apps/files/l10n/ko.json @@ -26,6 +26,8 @@ "Upload failed. Could not get file info." : "업로드에 실패했습니다. 파일 정보를 가져올 수 없습니다.", "Invalid directory." : "올바르지 않은 디렉터리입니다.", "Files" : "파일", + "Favorites" : "즐겨찾기", + "Home" : "가정", "Unable to upload {filename} as it is a directory or has 0 bytes" : "{filename}을(를) 업로드할 수 없습니다. 폴더이거나 0 바이트 파일입니다.", "Upload cancelled." : "업로드가 취소되었습니다.", "Could not get result from server." : "서버에서 결과를 가져올 수 없습니다.", @@ -35,11 +37,10 @@ "Could not create file" : "파일을 만들 수 없음", "Could not create folder" : "폴더를 만들 수 없음", "Error fetching URL" : "URL을 가져올 수 없음", - "Share" : "공유", + "Rename" : "이름 바꾸기", "Delete" : "삭제", "Unshare" : "공유 해제", - "Delete permanently" : "영구히 삭제", - "Rename" : "이름 바꾸기", + "Select" : "선택", "Pending" : "대기 중", "Error moving file" : "파일 이동 오류", "Error" : "오류", @@ -57,12 +58,15 @@ "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "암호화 앱이 활성화되어 있지만 키가 초기화되지 않았습니다. 로그아웃한 후 다시 로그인하십시오", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "암호화 앱의 개인 키가 잘못되었습니다. 암호화된 파일에 다시 접근하려면 개인 설정에서 개인 키 암호를 업데이트해야 합니다.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "암호화는 해제되어 있지만, 파일은 아직 암호화되어 있습니다. 개인 설정에서 파일을 복호화하십시오.", + "_ matches '{filter}'_::_ match '{filter}'_" : [""], "{dirs} and {files}" : "{dirs} 그리고 {files}", + "Favorite" : "즐겨찾기", "%s could not be renamed" : "%s의 이름을 변경할 수 없습니다", "File handling" : "파일 처리", "Maximum upload size" : "최대 업로드 크기", "max. possible: " : "최대 가능:", "Save" : "저장", + "Settings" : "설정", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "WebDAV로 파일에 접근하려면 <a href=\"%s\" target=\"_blank\">이 주소를 사용하십시오</a>", "New" : "새로 만들기", @@ -71,7 +75,8 @@ "New folder" : "새 폴더", "Folder" : "폴더", "From link" : "링크에서", - "Nothing in here. Upload something!" : "내용이 없습니다. 업로드할 수 있습니다!", + "Upload" : "업로드", + "Cancel upload" : "업로드 취소", "Download" : "다운로드", "Upload too large" : "업로드한 파일이 너무 큼", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "이 파일이 서버에서 허용하는 최대 업로드 가능 용량보다 큽니다.", diff --git a/apps/files/l10n/ku_IQ.js b/apps/files/l10n/ku_IQ.js index 5236669f239..f8d68030265 100644 --- a/apps/files/l10n/ku_IQ.js +++ b/apps/files/l10n/ku_IQ.js @@ -2,14 +2,17 @@ OC.L10N.register( "files", { "Files" : "پهڕگەکان", - "Share" : "هاوبەشی کردن", + "Select" : "دیاریکردنی", "Error" : "ههڵه", "Name" : "ناو", "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "Save" : "پاشکهوتکردن", + "Settings" : "ڕێکخستنهکان", "Folder" : "بوخچه", + "Upload" : "بارکردن", "Download" : "داگرتن" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/ku_IQ.json b/apps/files/l10n/ku_IQ.json index c11984e29d7..057f5df0a85 100644 --- a/apps/files/l10n/ku_IQ.json +++ b/apps/files/l10n/ku_IQ.json @@ -1,13 +1,16 @@ { "translations": { "Files" : "پهڕگەکان", - "Share" : "هاوبەشی کردن", + "Select" : "دیاریکردنی", "Error" : "ههڵه", "Name" : "ناو", "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "Save" : "پاشکهوتکردن", + "Settings" : "ڕێکخستنهکان", "Folder" : "بوخچه", + "Upload" : "بارکردن", "Download" : "داگرتن" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/lb.js b/apps/files/l10n/lb.js index 05c3ff1e7e4..00bcd569b51 100644 --- a/apps/files/l10n/lb.js +++ b/apps/files/l10n/lb.js @@ -9,12 +9,14 @@ OC.L10N.register( "Missing a temporary folder" : "Et feelt en temporären Dossier", "Failed to write to disk" : "Konnt net op den Disk schreiwen", "Files" : "Dateien", + "Favorites" : "Favoriten", + "Home" : "Doheem", "Upload cancelled." : "Upload ofgebrach.", "File upload is in progress. Leaving the page now will cancel the upload." : "File Upload am gaang. Wann's de des Säit verléiss gëtt den Upload ofgebrach.", - "Share" : "Deelen", + "Rename" : "Ëm-benennen", "Delete" : "Läschen", "Unshare" : "Net méi deelen", - "Rename" : "Ëm-benennen", + "Select" : "Auswielen", "Error" : "Fehler", "Name" : "Numm", "Size" : "Gréisst", @@ -22,14 +24,17 @@ OC.L10N.register( "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "File handling" : "Fichier handling", "Maximum upload size" : "Maximum Upload Gréisst ", "max. possible: " : "max. méiglech:", "Save" : "Späicheren", + "Settings" : "Astellungen", "New" : "Nei", "Text file" : "Text Fichier", "Folder" : "Dossier", - "Nothing in here. Upload something!" : "Hei ass näischt. Lued eppes rop!", + "Upload" : "Eroplueden", + "Cancel upload" : "Upload ofbriechen", "Download" : "Download", "Upload too large" : "Upload ze grouss", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Déi Dateien déi Dir probéiert erop ze lueden sinn méi grouss wei déi Maximal Gréisst déi op dësem Server erlaabt ass.", diff --git a/apps/files/l10n/lb.json b/apps/files/l10n/lb.json index 868141071f3..d63026bedb6 100644 --- a/apps/files/l10n/lb.json +++ b/apps/files/l10n/lb.json @@ -7,12 +7,14 @@ "Missing a temporary folder" : "Et feelt en temporären Dossier", "Failed to write to disk" : "Konnt net op den Disk schreiwen", "Files" : "Dateien", + "Favorites" : "Favoriten", + "Home" : "Doheem", "Upload cancelled." : "Upload ofgebrach.", "File upload is in progress. Leaving the page now will cancel the upload." : "File Upload am gaang. Wann's de des Säit verléiss gëtt den Upload ofgebrach.", - "Share" : "Deelen", + "Rename" : "Ëm-benennen", "Delete" : "Läschen", "Unshare" : "Net méi deelen", - "Rename" : "Ëm-benennen", + "Select" : "Auswielen", "Error" : "Fehler", "Name" : "Numm", "Size" : "Gréisst", @@ -20,14 +22,17 @@ "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "File handling" : "Fichier handling", "Maximum upload size" : "Maximum Upload Gréisst ", "max. possible: " : "max. méiglech:", "Save" : "Späicheren", + "Settings" : "Astellungen", "New" : "Nei", "Text file" : "Text Fichier", "Folder" : "Dossier", - "Nothing in here. Upload something!" : "Hei ass näischt. Lued eppes rop!", + "Upload" : "Eroplueden", + "Cancel upload" : "Upload ofbriechen", "Download" : "Download", "Upload too large" : "Upload ze grouss", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Déi Dateien déi Dir probéiert erop ze lueden sinn méi grouss wei déi Maximal Gréisst déi op dësem Server erlaabt ass.", diff --git a/apps/files/l10n/lo.js b/apps/files/l10n/lo.js new file mode 100644 index 00000000000..8c5bb3bc949 --- /dev/null +++ b/apps/files/l10n/lo.js @@ -0,0 +1,9 @@ +OC.L10N.register( + "files", + { + "_%n folder_::_%n folders_" : [""], + "_%n file_::_%n files_" : [""], + "_Uploading %n file_::_Uploading %n files_" : [""], + "_ matches '{filter}'_::_ match '{filter}'_" : [""] +}, +"nplurals=1; plural=0;"); diff --git a/apps/files/l10n/lo.json b/apps/files/l10n/lo.json new file mode 100644 index 00000000000..e03a2942ff2 --- /dev/null +++ b/apps/files/l10n/lo.json @@ -0,0 +1,7 @@ +{ "translations": { + "_%n folder_::_%n folders_" : [""], + "_%n file_::_%n files_" : [""], + "_Uploading %n file_::_Uploading %n files_" : [""], + "_ matches '{filter}'_::_ match '{filter}'_" : [""] +},"pluralForm" :"nplurals=1; plural=0;" +}
\ No newline at end of file diff --git a/apps/files/l10n/lt_LT.js b/apps/files/l10n/lt_LT.js index c4b391bee67..5e81bf8b82a 100644 --- a/apps/files/l10n/lt_LT.js +++ b/apps/files/l10n/lt_LT.js @@ -1,14 +1,20 @@ OC.L10N.register( "files", { + "Storage not available" : "Saugykla nepasiekiama", + "Storage invalid" : "Saugykla neteisinga", "Unknown error" : "Neatpažinta klaida", "Could not move %s - File with this name already exists" : "Nepavyko perkelti %s - failas su tokiu pavadinimu jau egzistuoja", "Could not move %s" : "Nepavyko perkelti %s", + "Permission denied" : "Neturite teisių", "File name cannot be empty." : "Failo pavadinimas negali būti tuščias.", + "\"%s\" is an invalid file name." : "„%s“ yra netinkamas failo pavadinimas.", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." : "Neleistinas pavadinimas, '\\', '/', '<', '>', ':', '\"', '|', '?' ir '*' yra neleidžiami.", + "The target folder has been moved or deleted." : "Tikslo aplankas buvo perkeltas ar ištrintas.", "The name %s is already used in the folder %s. Please choose a different name." : "Pavadinimas %s jau naudojamas aplanke %s. Prašome pasirinkti kitokį pavadinimą.", "Not a valid source" : "Netinkamas šaltinis", "Server is not allowed to open URLs, please check the server configuration" : "Serveriui neleidžiama atverti URL, prašome patikrinti serverio konfigūraciją", + "The file exceeds your quota by %s" : "Failai viršyja jūsų kvotą per %s", "Error while downloading %s to %s" : "Klaida siunčiant %s į %s", "Error when creating the file" : "Klaida kuriant failą", "Folder name cannot be empty." : "Aplanko pavadinimas negali būti tuščias.", @@ -28,7 +34,12 @@ OC.L10N.register( "Upload failed. Could not get file info." : "Įkėlimas nepavyko. Nepavyko gauti failo informacijos.", "Invalid directory." : "Neteisingas aplankas", "Files" : "Failai", + "All files" : "Visi failai", + "Favorites" : "Mėgstamiausi", + "Home" : "Namų", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Nepavyksta įkelti {filename}, nes tai katalogas arba yra 0 baitų dydžio", + "Total file size {size1} exceeds upload limit {size2}" : "Visas failo dydis {size1} viršyja įkėlimo limitą {size2}", + "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nepakanka laisvos vietos. Keliate {size1}, bet tik {size2} yra likę", "Upload cancelled." : "Įkėlimas atšauktas.", "Could not get result from server." : "Nepavyko gauti rezultato iš serverio.", "File upload is in progress. Leaving the page now will cancel the upload." : "Failo įkėlimas pradėtas. Jei paliksite šį puslapį, įkėlimas nutrūks.", @@ -37,12 +48,14 @@ OC.L10N.register( "Could not create file" : "Neįmanoma sukurti failo", "Could not create folder" : "Neįmanoma sukurti aplanko", "Error fetching URL" : "Klauda gaunant URL", - "Share" : "Dalintis", + "Rename" : "Pervadinti", "Delete" : "Ištrinti", + "Disconnect storage" : "Atjungti saugyklą", "Unshare" : "Nebesidalinti", - "Delete permanently" : "Ištrinti negrįžtamai", - "Rename" : "Pervadinti", + "Select" : "Pasirinkiti", "Pending" : "Laukiantis", + "Unable to determine date" : "Nepavyksta nustatyti datos", + "Error moving file." : "Klaida perkeliant failą.", "Error moving file" : "Klaida perkeliant failą", "Error" : "Klaida", "Could not rename file" : "Neįmanoma pervadinti failo", @@ -54,17 +67,24 @@ OC.L10N.register( "_%n file_::_%n files_" : ["%n failas","%n failai","%n failų"], "You don’t have permission to upload or create files here" : "Jūs neturite leidimo čia įkelti arba kurti failus", "_Uploading %n file_::_Uploading %n files_" : ["Įkeliamas %n failas","Įkeliami %n failai","Įkeliama %n failų"], + "\"{name}\" is an invalid file name." : "„{name}“ yra netinkamas failo pavadinime.", "Your storage is full, files can not be updated or synced anymore!" : "Jūsų visa vieta serveryje užimta", "Your storage is almost full ({usedSpacePercent}%)" : "Jūsų vieta serveryje beveik visa užimta ({usedSpacePercent}%)", "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Šifravimo programa įjungta, bet Jūsų raktai nėra pritaikyti. Prašome atsijungti ir vėl prisijungti", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Netinkamas privatus raktas Šifravimo programai. Prašome atnaujinti savo privataus rakto slaptažodį asmeniniuose nustatymuose, kad atkurti prieigą prie šifruotų failų.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Šifravimas buvo išjungtas, bet Jūsų failai vis dar užšifruoti. Prašome eiti į asmeninius nustatymus ir iššifruoti savo failus.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["","",""], "{dirs} and {files}" : "{dirs} ir {files}", + "Favorited" : "Pažymėta mėgstamu", + "Favorite" : "Mėgiamas", + "%s could not be renamed as it has been deleted" : "%s negalėjo būti pervadintas, nes buvo ištrintas", "%s could not be renamed" : "%s negali būti pervadintas", + "Upload (max. %s)" : "Įkelti (maks. %s)", "File handling" : "Failų tvarkymas", "Maximum upload size" : "Maksimalus įkeliamo failo dydis", "max. possible: " : "maks. galima:", "Save" : "Išsaugoti", + "Settings" : "Nustatymai", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Naudokite šį adresą, kad <a href=\"%s\" target=\"_blank\">pasiektumėte savo failus per WebDAV</a>", "New" : "Naujas", @@ -73,10 +93,17 @@ OC.L10N.register( "New folder" : "Naujas aplankas", "Folder" : "Katalogas", "From link" : "Iš nuorodos", - "Nothing in here. Upload something!" : "Čia tuščia. Įkelkite ką nors!", + "Upload" : "Įkelti", + "Cancel upload" : "Atšaukti siuntimą", + "No files yet" : "Dar nėra failų", + "Upload some content or sync with your devices!" : "Įkelkite kokį nors turinį, arba sinchronizuokite su savo įrenginiais!", + "Select all" : "Pažymėti viską", "Download" : "Atsisiųsti", "Upload too large" : "Įkėlimui failas per didelis", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Bandomų įkelti failų dydis viršija maksimalų, kuris leidžiamas šiame serveryje", - "Files are being scanned, please wait." : "Skenuojami failai, prašome palaukti." + "Files are being scanned, please wait." : "Skenuojami failai, prašome palaukti.", + "Currently scanning" : "Šiuo metu skenuojama", + "No favorites" : "Nėra mėgstamiausių", + "Files and folders you mark as favorite will show up here" : "Failai ir aplankai, kuriuos pažymite mėgstamais, atsiras čia" }, "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/apps/files/l10n/lt_LT.json b/apps/files/l10n/lt_LT.json index 6baaa79c92c..e5f787063cb 100644 --- a/apps/files/l10n/lt_LT.json +++ b/apps/files/l10n/lt_LT.json @@ -1,12 +1,18 @@ { "translations": { + "Storage not available" : "Saugykla nepasiekiama", + "Storage invalid" : "Saugykla neteisinga", "Unknown error" : "Neatpažinta klaida", "Could not move %s - File with this name already exists" : "Nepavyko perkelti %s - failas su tokiu pavadinimu jau egzistuoja", "Could not move %s" : "Nepavyko perkelti %s", + "Permission denied" : "Neturite teisių", "File name cannot be empty." : "Failo pavadinimas negali būti tuščias.", + "\"%s\" is an invalid file name." : "„%s“ yra netinkamas failo pavadinimas.", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." : "Neleistinas pavadinimas, '\\', '/', '<', '>', ':', '\"', '|', '?' ir '*' yra neleidžiami.", + "The target folder has been moved or deleted." : "Tikslo aplankas buvo perkeltas ar ištrintas.", "The name %s is already used in the folder %s. Please choose a different name." : "Pavadinimas %s jau naudojamas aplanke %s. Prašome pasirinkti kitokį pavadinimą.", "Not a valid source" : "Netinkamas šaltinis", "Server is not allowed to open URLs, please check the server configuration" : "Serveriui neleidžiama atverti URL, prašome patikrinti serverio konfigūraciją", + "The file exceeds your quota by %s" : "Failai viršyja jūsų kvotą per %s", "Error while downloading %s to %s" : "Klaida siunčiant %s į %s", "Error when creating the file" : "Klaida kuriant failą", "Folder name cannot be empty." : "Aplanko pavadinimas negali būti tuščias.", @@ -26,7 +32,12 @@ "Upload failed. Could not get file info." : "Įkėlimas nepavyko. Nepavyko gauti failo informacijos.", "Invalid directory." : "Neteisingas aplankas", "Files" : "Failai", + "All files" : "Visi failai", + "Favorites" : "Mėgstamiausi", + "Home" : "Namų", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Nepavyksta įkelti {filename}, nes tai katalogas arba yra 0 baitų dydžio", + "Total file size {size1} exceeds upload limit {size2}" : "Visas failo dydis {size1} viršyja įkėlimo limitą {size2}", + "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nepakanka laisvos vietos. Keliate {size1}, bet tik {size2} yra likę", "Upload cancelled." : "Įkėlimas atšauktas.", "Could not get result from server." : "Nepavyko gauti rezultato iš serverio.", "File upload is in progress. Leaving the page now will cancel the upload." : "Failo įkėlimas pradėtas. Jei paliksite šį puslapį, įkėlimas nutrūks.", @@ -35,12 +46,14 @@ "Could not create file" : "Neįmanoma sukurti failo", "Could not create folder" : "Neįmanoma sukurti aplanko", "Error fetching URL" : "Klauda gaunant URL", - "Share" : "Dalintis", + "Rename" : "Pervadinti", "Delete" : "Ištrinti", + "Disconnect storage" : "Atjungti saugyklą", "Unshare" : "Nebesidalinti", - "Delete permanently" : "Ištrinti negrįžtamai", - "Rename" : "Pervadinti", + "Select" : "Pasirinkiti", "Pending" : "Laukiantis", + "Unable to determine date" : "Nepavyksta nustatyti datos", + "Error moving file." : "Klaida perkeliant failą.", "Error moving file" : "Klaida perkeliant failą", "Error" : "Klaida", "Could not rename file" : "Neįmanoma pervadinti failo", @@ -52,17 +65,24 @@ "_%n file_::_%n files_" : ["%n failas","%n failai","%n failų"], "You don’t have permission to upload or create files here" : "Jūs neturite leidimo čia įkelti arba kurti failus", "_Uploading %n file_::_Uploading %n files_" : ["Įkeliamas %n failas","Įkeliami %n failai","Įkeliama %n failų"], + "\"{name}\" is an invalid file name." : "„{name}“ yra netinkamas failo pavadinime.", "Your storage is full, files can not be updated or synced anymore!" : "Jūsų visa vieta serveryje užimta", "Your storage is almost full ({usedSpacePercent}%)" : "Jūsų vieta serveryje beveik visa užimta ({usedSpacePercent}%)", "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Šifravimo programa įjungta, bet Jūsų raktai nėra pritaikyti. Prašome atsijungti ir vėl prisijungti", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Netinkamas privatus raktas Šifravimo programai. Prašome atnaujinti savo privataus rakto slaptažodį asmeniniuose nustatymuose, kad atkurti prieigą prie šifruotų failų.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Šifravimas buvo išjungtas, bet Jūsų failai vis dar užšifruoti. Prašome eiti į asmeninius nustatymus ir iššifruoti savo failus.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["","",""], "{dirs} and {files}" : "{dirs} ir {files}", + "Favorited" : "Pažymėta mėgstamu", + "Favorite" : "Mėgiamas", + "%s could not be renamed as it has been deleted" : "%s negalėjo būti pervadintas, nes buvo ištrintas", "%s could not be renamed" : "%s negali būti pervadintas", + "Upload (max. %s)" : "Įkelti (maks. %s)", "File handling" : "Failų tvarkymas", "Maximum upload size" : "Maksimalus įkeliamo failo dydis", "max. possible: " : "maks. galima:", "Save" : "Išsaugoti", + "Settings" : "Nustatymai", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Naudokite šį adresą, kad <a href=\"%s\" target=\"_blank\">pasiektumėte savo failus per WebDAV</a>", "New" : "Naujas", @@ -71,10 +91,17 @@ "New folder" : "Naujas aplankas", "Folder" : "Katalogas", "From link" : "Iš nuorodos", - "Nothing in here. Upload something!" : "Čia tuščia. Įkelkite ką nors!", + "Upload" : "Įkelti", + "Cancel upload" : "Atšaukti siuntimą", + "No files yet" : "Dar nėra failų", + "Upload some content or sync with your devices!" : "Įkelkite kokį nors turinį, arba sinchronizuokite su savo įrenginiais!", + "Select all" : "Pažymėti viską", "Download" : "Atsisiųsti", "Upload too large" : "Įkėlimui failas per didelis", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Bandomų įkelti failų dydis viršija maksimalų, kuris leidžiamas šiame serveryje", - "Files are being scanned, please wait." : "Skenuojami failai, prašome palaukti." + "Files are being scanned, please wait." : "Skenuojami failai, prašome palaukti.", + "Currently scanning" : "Šiuo metu skenuojama", + "No favorites" : "Nėra mėgstamiausių", + "Files and folders you mark as favorite will show up here" : "Failai ir aplankai, kuriuos pažymite mėgstamais, atsiras čia" },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);" }
\ No newline at end of file diff --git a/apps/files/l10n/lv.js b/apps/files/l10n/lv.js index d01f2894d94..fc0e3646c78 100644 --- a/apps/files/l10n/lv.js +++ b/apps/files/l10n/lv.js @@ -1,11 +1,24 @@ OC.L10N.register( "files", { + "Storage not available" : "Glabātuve nav pieejama", + "Storage invalid" : "Nepareiza krātuve", "Unknown error" : "Nezināma kļūda", "Could not move %s - File with this name already exists" : "Nevarēja pārvietot %s — jau eksistē datne ar tādu nosaukumu", "Could not move %s" : "Nevarēja pārvietot %s", + "Permission denied" : "Pieeja liegta", "File name cannot be empty." : "Datnes nosaukums nevar būt tukšs.", + "\"%s\" is an invalid file name." : "\"%s\" ir nepareizs datnes nosaukums.", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." : "Nederīgs nosaukums, nav atļauti '\\', '/', '<', '>', ':', '\"', '|', '?' un '*'.", + "The target folder has been moved or deleted." : "Mērķa mape ir pārvietota vai dzēsta", + "The name %s is already used in the folder %s. Please choose a different name." : "Nosaukums '%s' jau tiek izmantots mapē '%s'. Lūdzu izvēlieties citu nosaukumu.", + "Not a valid source" : "Avots nav derīgs", + "Server is not allowed to open URLs, please check the server configuration" : "Serverim netiek atļauts atvērt saites, plūdzu pārbaudiet servera uzstādījumus", + "The file exceeds your quota by %s" : "Faila izmērs ir par %s lielāks par atļauto kvotu", + "Error while downloading %s to %s" : "Kļūda, lejupielādējot %s uz %s", + "Error when creating the file" : "Kļūda veidojot datni", + "Folder name cannot be empty." : "Mape nevar būt tukša", + "Error when creating the folder" : "Kļūda, veidojot mapi", "Unable to set upload directory." : "Nevar uzstādīt augšupielādes mapi.", "Invalid Token" : "Nepareiza pilnvara", "No file was uploaded. Unknown error" : "Netika augšupielādēta neviena datne. Nezināma kļūda", @@ -17,42 +30,80 @@ OC.L10N.register( "Missing a temporary folder" : "Trūkst pagaidu mapes", "Failed to write to disk" : "Neizdevās saglabāt diskā", "Not enough storage available" : "Nav pietiekami daudz vietas", + "Upload failed. Could not find uploaded file" : "Augšupielāde nesekmīga. Neizdevās atrast augšupielādēto failu.", + "Upload failed. Could not get file info." : "Augšupielāde nesekmīga. Neizdevās iegūt informāciju par failu.", "Invalid directory." : "Nederīga direktorija.", "Files" : "Datnes", + "All files" : "Visas datnes", + "Favorites" : "Iecienītie", + "Home" : "Mājas", + "Unable to upload {filename} as it is a directory or has 0 bytes" : "Neizdodas augšupielādēt {filename}, jo tā ir vai nu mape vai 0 baitu saturošs fails.", + "Total file size {size1} exceeds upload limit {size2}" : "Kopējais faila izmērs {size1} pārsniedz augšupielādes ierobežojumu {size2}", + "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nav pietiekami daudz brīvas vietas. Tiek augšupielādēti {size1}, bet pieejami tikai {size2}", "Upload cancelled." : "Augšupielāde ir atcelta.", + "Could not get result from server." : "Nevar saņemt rezultātus no servera", "File upload is in progress. Leaving the page now will cancel the upload." : "Notiek augšupielāde. Pametot lapu tagad, tiks atcelta augšupielāde.", + "URL cannot be empty" : "URL nevar būt tukšs", "{new_name} already exists" : "{new_name} jau eksistē", - "Share" : "Dalīties", + "Could not create file" : "Neizdevās izveidot datni", + "Could not create folder" : "Neizdevās izveidot mapi", + "Error fetching URL" : "Kļūda apstrādājot URL", + "Rename" : "Pārsaukt", "Delete" : "Dzēst", + "Disconnect storage" : "Atvienot krātuvi", "Unshare" : "Pārtraukt dalīšanos", - "Delete permanently" : "Dzēst pavisam", - "Rename" : "Pārsaukt", + "Select" : "Norādīt", "Pending" : "Gaida savu kārtu", + "Unable to determine date" : "Neizdevās noteikt datumu", + "Error moving file." : "Kļūda, pārvietojot datni.", + "Error moving file" : "Kļūda, pārvietojot datni", "Error" : "Kļūda", + "Could not rename file" : "Neizdevās pārsaukt datni", + "Error deleting file." : "Kļūda, dzēšot datni.", "Name" : "Nosaukums", "Size" : "Izmērs", "Modified" : "Mainīts", "_%n folder_::_%n folders_" : ["%n mapes","%n mape","%n mapes"], "_%n file_::_%n files_" : ["%n faili","%n fails","%n faili"], + "You don’t have permission to upload or create files here" : "Jums nav tiesību, augšupielādēt vai veidot, šeit datnes", "_Uploading %n file_::_Uploading %n files_" : ["%n","Augšupielāde %n failu","Augšupielāde %n failus"], + "\"{name}\" is an invalid file name." : "\"{name}\" ir nepareizs datnes nosaukums.", "Your storage is full, files can not be updated or synced anymore!" : "Jūsu krātuve ir pilna, datnes vairs nevar augšupielādēt vai sinhronizēt!", "Your storage is almost full ({usedSpacePercent}%)" : "Jūsu krātuve ir gandrīz pilna ({usedSpacePercent}%)", + "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Šifrēšanas lietotnes ir pieslēgta, bet šifrēšanas atslēgas nav uzstādītas. Lūdzu izejiet no sistēmas un ieejiet sistēmā atpakaļ.", + "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Šifrēšanas lietotnei nepareiza privātā atslēga. Lūdzu atjaunojiet savu privāto atslēgu personīgo uzstādījumu sadaļā, lai atjaunot pieeju šifrētajiem failiem.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Šifrēšana tika atslēgta, tomēr jūsu faili joprojām ir šifrēti. Atšifrēt failus var Personiskajos uzstādījumos.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["","",""], + "{dirs} and {files}" : "{dirs} un {files}", + "Favorited" : "Favorīti", + "Favorite" : "Iecienītais", + "%s could not be renamed as it has been deleted" : "Nevarēja pārsaukt %s, jo tas ir dzēsts", "%s could not be renamed" : "%s nevar tikt pārsaukts", + "Upload (max. %s)" : "Augšupielādēt (maks. %s)", "File handling" : "Datņu pārvaldība", "Maximum upload size" : "Maksimālais datņu augšupielādes apjoms", "max. possible: " : "maksimālais iespējamais:", "Save" : "Saglabāt", + "Settings" : "Iestatījumi", "WebDAV" : "WebDAV", + "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Izmantojot šo adresi, <a href=\"%s\" target=\"_blank\">piekļūstiet saviem failiem, izmantojot WebDAV</a>", "New" : "Jauna", + "New text file" : "Jauna teksta datne", "Text file" : "Teksta datne", "New folder" : "Jauna mape", "Folder" : "Mape", "From link" : "No saites", - "Nothing in here. Upload something!" : "Te vēl nekas nav. Rīkojies, sāc augšupielādēt!", + "Upload" : "Augšupielādēt", + "Cancel upload" : "Atcelt augšupielādi", + "No files yet" : "Vēl nav neviena datne", + "Upload some content or sync with your devices!" : "Augšupielādē kaut ko vai sinhronizē saturu ar savām ierīcēm!", + "Select all" : "Atzīmēt visu", "Download" : "Lejupielādēt", "Upload too large" : "Datne ir par lielu, lai to augšupielādētu", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Augšupielādējamās datnes pārsniedz servera pieļaujamo datņu augšupielādes apjomu", - "Files are being scanned, please wait." : "Datnes šobrīd tiek caurskatītas, lūdzu, uzgaidiet." + "Files are being scanned, please wait." : "Datnes šobrīd tiek caurskatītas, lūdzu, uzgaidiet.", + "Currently scanning" : "Pašlaik skenē", + "No favorites" : "Nav favorītu", + "Files and folders you mark as favorite will show up here" : "Faili un mapes, ko atzīmēsit kā favorītus, tiks rādīti šeit" }, "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);"); diff --git a/apps/files/l10n/lv.json b/apps/files/l10n/lv.json index 39a0caea5b2..ef93ad39455 100644 --- a/apps/files/l10n/lv.json +++ b/apps/files/l10n/lv.json @@ -1,9 +1,22 @@ { "translations": { + "Storage not available" : "Glabātuve nav pieejama", + "Storage invalid" : "Nepareiza krātuve", "Unknown error" : "Nezināma kļūda", "Could not move %s - File with this name already exists" : "Nevarēja pārvietot %s — jau eksistē datne ar tādu nosaukumu", "Could not move %s" : "Nevarēja pārvietot %s", + "Permission denied" : "Pieeja liegta", "File name cannot be empty." : "Datnes nosaukums nevar būt tukšs.", + "\"%s\" is an invalid file name." : "\"%s\" ir nepareizs datnes nosaukums.", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." : "Nederīgs nosaukums, nav atļauti '\\', '/', '<', '>', ':', '\"', '|', '?' un '*'.", + "The target folder has been moved or deleted." : "Mērķa mape ir pārvietota vai dzēsta", + "The name %s is already used in the folder %s. Please choose a different name." : "Nosaukums '%s' jau tiek izmantots mapē '%s'. Lūdzu izvēlieties citu nosaukumu.", + "Not a valid source" : "Avots nav derīgs", + "Server is not allowed to open URLs, please check the server configuration" : "Serverim netiek atļauts atvērt saites, plūdzu pārbaudiet servera uzstādījumus", + "The file exceeds your quota by %s" : "Faila izmērs ir par %s lielāks par atļauto kvotu", + "Error while downloading %s to %s" : "Kļūda, lejupielādējot %s uz %s", + "Error when creating the file" : "Kļūda veidojot datni", + "Folder name cannot be empty." : "Mape nevar būt tukša", + "Error when creating the folder" : "Kļūda, veidojot mapi", "Unable to set upload directory." : "Nevar uzstādīt augšupielādes mapi.", "Invalid Token" : "Nepareiza pilnvara", "No file was uploaded. Unknown error" : "Netika augšupielādēta neviena datne. Nezināma kļūda", @@ -15,42 +28,80 @@ "Missing a temporary folder" : "Trūkst pagaidu mapes", "Failed to write to disk" : "Neizdevās saglabāt diskā", "Not enough storage available" : "Nav pietiekami daudz vietas", + "Upload failed. Could not find uploaded file" : "Augšupielāde nesekmīga. Neizdevās atrast augšupielādēto failu.", + "Upload failed. Could not get file info." : "Augšupielāde nesekmīga. Neizdevās iegūt informāciju par failu.", "Invalid directory." : "Nederīga direktorija.", "Files" : "Datnes", + "All files" : "Visas datnes", + "Favorites" : "Iecienītie", + "Home" : "Mājas", + "Unable to upload {filename} as it is a directory or has 0 bytes" : "Neizdodas augšupielādēt {filename}, jo tā ir vai nu mape vai 0 baitu saturošs fails.", + "Total file size {size1} exceeds upload limit {size2}" : "Kopējais faila izmērs {size1} pārsniedz augšupielādes ierobežojumu {size2}", + "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nav pietiekami daudz brīvas vietas. Tiek augšupielādēti {size1}, bet pieejami tikai {size2}", "Upload cancelled." : "Augšupielāde ir atcelta.", + "Could not get result from server." : "Nevar saņemt rezultātus no servera", "File upload is in progress. Leaving the page now will cancel the upload." : "Notiek augšupielāde. Pametot lapu tagad, tiks atcelta augšupielāde.", + "URL cannot be empty" : "URL nevar būt tukšs", "{new_name} already exists" : "{new_name} jau eksistē", - "Share" : "Dalīties", + "Could not create file" : "Neizdevās izveidot datni", + "Could not create folder" : "Neizdevās izveidot mapi", + "Error fetching URL" : "Kļūda apstrādājot URL", + "Rename" : "Pārsaukt", "Delete" : "Dzēst", + "Disconnect storage" : "Atvienot krātuvi", "Unshare" : "Pārtraukt dalīšanos", - "Delete permanently" : "Dzēst pavisam", - "Rename" : "Pārsaukt", + "Select" : "Norādīt", "Pending" : "Gaida savu kārtu", + "Unable to determine date" : "Neizdevās noteikt datumu", + "Error moving file." : "Kļūda, pārvietojot datni.", + "Error moving file" : "Kļūda, pārvietojot datni", "Error" : "Kļūda", + "Could not rename file" : "Neizdevās pārsaukt datni", + "Error deleting file." : "Kļūda, dzēšot datni.", "Name" : "Nosaukums", "Size" : "Izmērs", "Modified" : "Mainīts", "_%n folder_::_%n folders_" : ["%n mapes","%n mape","%n mapes"], "_%n file_::_%n files_" : ["%n faili","%n fails","%n faili"], + "You don’t have permission to upload or create files here" : "Jums nav tiesību, augšupielādēt vai veidot, šeit datnes", "_Uploading %n file_::_Uploading %n files_" : ["%n","Augšupielāde %n failu","Augšupielāde %n failus"], + "\"{name}\" is an invalid file name." : "\"{name}\" ir nepareizs datnes nosaukums.", "Your storage is full, files can not be updated or synced anymore!" : "Jūsu krātuve ir pilna, datnes vairs nevar augšupielādēt vai sinhronizēt!", "Your storage is almost full ({usedSpacePercent}%)" : "Jūsu krātuve ir gandrīz pilna ({usedSpacePercent}%)", + "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Šifrēšanas lietotnes ir pieslēgta, bet šifrēšanas atslēgas nav uzstādītas. Lūdzu izejiet no sistēmas un ieejiet sistēmā atpakaļ.", + "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Šifrēšanas lietotnei nepareiza privātā atslēga. Lūdzu atjaunojiet savu privāto atslēgu personīgo uzstādījumu sadaļā, lai atjaunot pieeju šifrētajiem failiem.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Šifrēšana tika atslēgta, tomēr jūsu faili joprojām ir šifrēti. Atšifrēt failus var Personiskajos uzstādījumos.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["","",""], + "{dirs} and {files}" : "{dirs} un {files}", + "Favorited" : "Favorīti", + "Favorite" : "Iecienītais", + "%s could not be renamed as it has been deleted" : "Nevarēja pārsaukt %s, jo tas ir dzēsts", "%s could not be renamed" : "%s nevar tikt pārsaukts", + "Upload (max. %s)" : "Augšupielādēt (maks. %s)", "File handling" : "Datņu pārvaldība", "Maximum upload size" : "Maksimālais datņu augšupielādes apjoms", "max. possible: " : "maksimālais iespējamais:", "Save" : "Saglabāt", + "Settings" : "Iestatījumi", "WebDAV" : "WebDAV", + "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Izmantojot šo adresi, <a href=\"%s\" target=\"_blank\">piekļūstiet saviem failiem, izmantojot WebDAV</a>", "New" : "Jauna", + "New text file" : "Jauna teksta datne", "Text file" : "Teksta datne", "New folder" : "Jauna mape", "Folder" : "Mape", "From link" : "No saites", - "Nothing in here. Upload something!" : "Te vēl nekas nav. Rīkojies, sāc augšupielādēt!", + "Upload" : "Augšupielādēt", + "Cancel upload" : "Atcelt augšupielādi", + "No files yet" : "Vēl nav neviena datne", + "Upload some content or sync with your devices!" : "Augšupielādē kaut ko vai sinhronizē saturu ar savām ierīcēm!", + "Select all" : "Atzīmēt visu", "Download" : "Lejupielādēt", "Upload too large" : "Datne ir par lielu, lai to augšupielādētu", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Augšupielādējamās datnes pārsniedz servera pieļaujamo datņu augšupielādes apjomu", - "Files are being scanned, please wait." : "Datnes šobrīd tiek caurskatītas, lūdzu, uzgaidiet." + "Files are being scanned, please wait." : "Datnes šobrīd tiek caurskatītas, lūdzu, uzgaidiet.", + "Currently scanning" : "Pašlaik skenē", + "No favorites" : "Nav favorītu", + "Files and folders you mark as favorite will show up here" : "Faili un mapes, ko atzīmēsit kā favorītus, tiks rādīti šeit" },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);" }
\ No newline at end of file diff --git a/apps/files/l10n/mg.js b/apps/files/l10n/mg.js index f085469f731..deae17398bd 100644 --- a/apps/files/l10n/mg.js +++ b/apps/files/l10n/mg.js @@ -3,6 +3,7 @@ OC.L10N.register( { "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""] }, "nplurals=2; plural=(n > 1);"); diff --git a/apps/files/l10n/mg.json b/apps/files/l10n/mg.json index ba9792477cd..dd9cfe83135 100644 --- a/apps/files/l10n/mg.json +++ b/apps/files/l10n/mg.json @@ -1,6 +1,7 @@ { "translations": { "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""] },"pluralForm" :"nplurals=2; plural=(n > 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/mk.js b/apps/files/l10n/mk.js index 57a717ceaf6..a74b38113ad 100644 --- a/apps/files/l10n/mk.js +++ b/apps/files/l10n/mk.js @@ -25,6 +25,8 @@ OC.L10N.register( "Upload failed. Could not find uploaded file" : "Префрлањето е неуспешно. Не можам да го најдам префрлената датотека.", "Invalid directory." : "Погрешна папка.", "Files" : "Датотеки", + "Favorites" : "Омилени", + "Home" : "Дома", "Upload cancelled." : "Преземањето е прекинато.", "Could not get result from server." : "Не можам да добијам резултат од серверот.", "File upload is in progress. Leaving the page now will cancel the upload." : "Подигање на датотека е во тек. Напуштење на страницата ќе го прекине.", @@ -32,11 +34,10 @@ OC.L10N.register( "{new_name} already exists" : "{new_name} веќе постои", "Could not create file" : "Не множам да креирам датотека", "Could not create folder" : "Не можам да креирам папка", - "Share" : "Сподели", + "Rename" : "Преименувај", "Delete" : "Избриши", "Unshare" : "Не споделувај", - "Delete permanently" : "Трајно избришани", - "Rename" : "Преименувај", + "Select" : "Избери", "Pending" : "Чека", "Error moving file" : "Грешка при префрлање на датотека", "Error" : "Грешка", @@ -49,19 +50,22 @@ OC.L10N.register( "_Uploading %n file_::_Uploading %n files_" : ["",""], "Your storage is full, files can not be updated or synced anymore!" : "Вашиот сториџ е полн, датотеките веќе не можат да се освежуваат или синхронизираат!", "Your storage is almost full ({usedSpacePercent}%)" : "Вашиот сториџ е скоро полн ({usedSpacePercent}%)", + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "{dirs} and {files}" : "{dirs} и {files}", "%s could not be renamed" : "%s не може да биде преименуван", "File handling" : "Ракување со датотеки", "Maximum upload size" : "Максимална големина за подигање", "max. possible: " : "макс. можно:", "Save" : "Сними", + "Settings" : "Подесувања", "WebDAV" : "WebDAV", "New" : "Ново", "Text file" : "Текстуална датотека", "New folder" : "Нова папка", "Folder" : "Папка", "From link" : "Од врска", - "Nothing in here. Upload something!" : "Тука нема ништо. Снимете нешто!", + "Upload" : "Подигни", + "Cancel upload" : "Откажи прикачување", "Download" : "Преземи", "Upload too large" : "Фајлот кој се вчитува е преголем", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Датотеките кои се обидувате да ги подигнете ја надминуваат максималната големина за подигнување датотеки на овој сервер.", diff --git a/apps/files/l10n/mk.json b/apps/files/l10n/mk.json index 2d3df73a75f..74b1717b65c 100644 --- a/apps/files/l10n/mk.json +++ b/apps/files/l10n/mk.json @@ -23,6 +23,8 @@ "Upload failed. Could not find uploaded file" : "Префрлањето е неуспешно. Не можам да го најдам префрлената датотека.", "Invalid directory." : "Погрешна папка.", "Files" : "Датотеки", + "Favorites" : "Омилени", + "Home" : "Дома", "Upload cancelled." : "Преземањето е прекинато.", "Could not get result from server." : "Не можам да добијам резултат од серверот.", "File upload is in progress. Leaving the page now will cancel the upload." : "Подигање на датотека е во тек. Напуштење на страницата ќе го прекине.", @@ -30,11 +32,10 @@ "{new_name} already exists" : "{new_name} веќе постои", "Could not create file" : "Не множам да креирам датотека", "Could not create folder" : "Не можам да креирам папка", - "Share" : "Сподели", + "Rename" : "Преименувај", "Delete" : "Избриши", "Unshare" : "Не споделувај", - "Delete permanently" : "Трајно избришани", - "Rename" : "Преименувај", + "Select" : "Избери", "Pending" : "Чека", "Error moving file" : "Грешка при префрлање на датотека", "Error" : "Грешка", @@ -47,19 +48,22 @@ "_Uploading %n file_::_Uploading %n files_" : ["",""], "Your storage is full, files can not be updated or synced anymore!" : "Вашиот сториџ е полн, датотеките веќе не можат да се освежуваат или синхронизираат!", "Your storage is almost full ({usedSpacePercent}%)" : "Вашиот сториџ е скоро полн ({usedSpacePercent}%)", + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "{dirs} and {files}" : "{dirs} и {files}", "%s could not be renamed" : "%s не може да биде преименуван", "File handling" : "Ракување со датотеки", "Maximum upload size" : "Максимална големина за подигање", "max. possible: " : "макс. можно:", "Save" : "Сними", + "Settings" : "Подесувања", "WebDAV" : "WebDAV", "New" : "Ново", "Text file" : "Текстуална датотека", "New folder" : "Нова папка", "Folder" : "Папка", "From link" : "Од врска", - "Nothing in here. Upload something!" : "Тука нема ништо. Снимете нешто!", + "Upload" : "Подигни", + "Cancel upload" : "Откажи прикачување", "Download" : "Преземи", "Upload too large" : "Фајлот кој се вчитува е преголем", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Датотеките кои се обидувате да ги подигнете ја надминуваат максималната големина за подигнување датотеки на овој сервер.", diff --git a/apps/files/l10n/ml.js b/apps/files/l10n/ml.js index 329844854f1..560042b3efd 100644 --- a/apps/files/l10n/ml.js +++ b/apps/files/l10n/ml.js @@ -3,6 +3,7 @@ OC.L10N.register( { "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""] }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/ml.json b/apps/files/l10n/ml.json index 37156658a86..4cfa6a31b6e 100644 --- a/apps/files/l10n/ml.json +++ b/apps/files/l10n/ml.json @@ -1,6 +1,7 @@ { "translations": { "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""] },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/ml_IN.js b/apps/files/l10n/ml_IN.js index a7af6e02c73..d37e940eee1 100644 --- a/apps/files/l10n/ml_IN.js +++ b/apps/files/l10n/ml_IN.js @@ -4,6 +4,7 @@ OC.L10N.register( "Files" : "ഫയലുകൾ", "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""] }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/ml_IN.json b/apps/files/l10n/ml_IN.json index e140756a6bd..1def6b0b49c 100644 --- a/apps/files/l10n/ml_IN.json +++ b/apps/files/l10n/ml_IN.json @@ -2,6 +2,7 @@ "Files" : "ഫയലുകൾ", "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""] },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/mn.js b/apps/files/l10n/mn.js index 329844854f1..1499e7762d3 100644 --- a/apps/files/l10n/mn.js +++ b/apps/files/l10n/mn.js @@ -1,8 +1,13 @@ OC.L10N.register( "files", { + "Files" : "Файлууд", "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], + "Save" : "Хадгалах", + "Settings" : "Тохиргоо", + "Upload" : "Байршуулах" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/mn.json b/apps/files/l10n/mn.json index 37156658a86..a0faca10bbd 100644 --- a/apps/files/l10n/mn.json +++ b/apps/files/l10n/mn.json @@ -1,6 +1,11 @@ { "translations": { + "Files" : "Файлууд", "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], + "Save" : "Хадгалах", + "Settings" : "Тохиргоо", + "Upload" : "Байршуулах" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/ms_MY.js b/apps/files/l10n/ms_MY.js index 50e95b4bca2..65e26847c18 100644 --- a/apps/files/l10n/ms_MY.js +++ b/apps/files/l10n/ms_MY.js @@ -9,10 +9,10 @@ OC.L10N.register( "Missing a temporary folder" : "Direktori sementara hilang", "Failed to write to disk" : "Gagal untuk disimpan", "Files" : "Fail-fail", + "Home" : "Rumah", "Upload cancelled." : "Muatnaik dibatalkan.", - "Share" : "Kongsi", - "Delete" : "Padam", "Rename" : "Namakan", + "Delete" : "Padam", "Pending" : "Dalam proses", "Error" : "Ralat", "Name" : "Nama", @@ -21,14 +21,17 @@ OC.L10N.register( "_%n folder_::_%n folders_" : [""], "_%n file_::_%n files_" : [""], "_Uploading %n file_::_Uploading %n files_" : [""], + "_ matches '{filter}'_::_ match '{filter}'_" : [""], "File handling" : "Pengendalian fail", "Maximum upload size" : "Saiz maksimum muat naik", "max. possible: " : "maksimum:", "Save" : "Simpan", + "Settings" : "Tetapan", "New" : "Baru", "Text file" : "Fail teks", "Folder" : "Folder", - "Nothing in here. Upload something!" : "Tiada apa-apa di sini. Muat naik sesuatu!", + "Upload" : "Muat naik", + "Cancel upload" : "Batal muat naik", "Download" : "Muat turun", "Upload too large" : "Muatnaik terlalu besar", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Fail yang cuba dimuat naik melebihi saiz maksimum fail upload server", diff --git a/apps/files/l10n/ms_MY.json b/apps/files/l10n/ms_MY.json index 6f085a76a68..4a36155fea1 100644 --- a/apps/files/l10n/ms_MY.json +++ b/apps/files/l10n/ms_MY.json @@ -7,10 +7,10 @@ "Missing a temporary folder" : "Direktori sementara hilang", "Failed to write to disk" : "Gagal untuk disimpan", "Files" : "Fail-fail", + "Home" : "Rumah", "Upload cancelled." : "Muatnaik dibatalkan.", - "Share" : "Kongsi", - "Delete" : "Padam", "Rename" : "Namakan", + "Delete" : "Padam", "Pending" : "Dalam proses", "Error" : "Ralat", "Name" : "Nama", @@ -19,14 +19,17 @@ "_%n folder_::_%n folders_" : [""], "_%n file_::_%n files_" : [""], "_Uploading %n file_::_Uploading %n files_" : [""], + "_ matches '{filter}'_::_ match '{filter}'_" : [""], "File handling" : "Pengendalian fail", "Maximum upload size" : "Saiz maksimum muat naik", "max. possible: " : "maksimum:", "Save" : "Simpan", + "Settings" : "Tetapan", "New" : "Baru", "Text file" : "Fail teks", "Folder" : "Folder", - "Nothing in here. Upload something!" : "Tiada apa-apa di sini. Muat naik sesuatu!", + "Upload" : "Muat naik", + "Cancel upload" : "Batal muat naik", "Download" : "Muat turun", "Upload too large" : "Muatnaik terlalu besar", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Fail yang cuba dimuat naik melebihi saiz maksimum fail upload server", diff --git a/apps/files/l10n/mt_MT.js b/apps/files/l10n/mt_MT.js index 82ce643895a..143288144c0 100644 --- a/apps/files/l10n/mt_MT.js +++ b/apps/files/l10n/mt_MT.js @@ -3,6 +3,7 @@ OC.L10N.register( { "_%n folder_::_%n folders_" : ["","","",""], "_%n file_::_%n files_" : ["","","",""], - "_Uploading %n file_::_Uploading %n files_" : ["","","",""] + "_Uploading %n file_::_Uploading %n files_" : ["","","",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["","","",""] }, "nplurals=4; plural=(n==1 ? 0 : n==0 || ( n%100>1 && n%100<11) ? 1 : (n%100>10 && n%100<20 ) ? 2 : 3);"); diff --git a/apps/files/l10n/mt_MT.json b/apps/files/l10n/mt_MT.json index 8bcf5b69eab..d595e2e00af 100644 --- a/apps/files/l10n/mt_MT.json +++ b/apps/files/l10n/mt_MT.json @@ -1,6 +1,7 @@ { "translations": { "_%n folder_::_%n folders_" : ["","","",""], "_%n file_::_%n files_" : ["","","",""], - "_Uploading %n file_::_Uploading %n files_" : ["","","",""] + "_Uploading %n file_::_Uploading %n files_" : ["","","",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["","","",""] },"pluralForm" :"nplurals=4; plural=(n==1 ? 0 : n==0 || ( n%100>1 && n%100<11) ? 1 : (n%100>10 && n%100<20 ) ? 2 : 3);" }
\ No newline at end of file diff --git a/apps/files/l10n/my_MM.js b/apps/files/l10n/my_MM.js index 0a7ff3bb31c..059be79f4ac 100644 --- a/apps/files/l10n/my_MM.js +++ b/apps/files/l10n/my_MM.js @@ -5,6 +5,7 @@ OC.L10N.register( "_%n folder_::_%n folders_" : [""], "_%n file_::_%n files_" : [""], "_Uploading %n file_::_Uploading %n files_" : [""], + "_ matches '{filter}'_::_ match '{filter}'_" : [""], "Download" : "ဒေါင်းလုတ်" }, "nplurals=1; plural=0;"); diff --git a/apps/files/l10n/my_MM.json b/apps/files/l10n/my_MM.json index d4b9b3d0fa8..30eb8a20782 100644 --- a/apps/files/l10n/my_MM.json +++ b/apps/files/l10n/my_MM.json @@ -3,6 +3,7 @@ "_%n folder_::_%n folders_" : [""], "_%n file_::_%n files_" : [""], "_Uploading %n file_::_Uploading %n files_" : [""], + "_ matches '{filter}'_::_ match '{filter}'_" : [""], "Download" : "ဒေါင်းလုတ်" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/files/l10n/nb_NO.js b/apps/files/l10n/nb_NO.js index d9c59b1bdd7..e14a84a35dc 100644 --- a/apps/files/l10n/nb_NO.js +++ b/apps/files/l10n/nb_NO.js @@ -35,6 +35,8 @@ OC.L10N.register( "Invalid directory." : "Ugyldig katalog.", "Files" : "Filer", "All files" : "Alle filer", + "Favorites" : "Favoritter", + "Home" : "Hjem", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Kan ikke laste opp {filename} fordi det er en mappe eller har 0 bytes", "Total file size {size1} exceeds upload limit {size2}" : "Total filstørrelse {size1} overstiger grense for opplasting {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Ikke nok ledig plass. Du laster opp size1} men bare {size2} er ledig", @@ -46,13 +48,13 @@ OC.L10N.register( "Could not create file" : "Klarte ikke å opprette fil", "Could not create folder" : "Klarte ikke å opprette mappe", "Error fetching URL" : "Feil ved henting av URL", - "Share" : "Del", + "Rename" : "Gi nytt navn", "Delete" : "Slett", "Disconnect storage" : "Koble fra lagring", "Unshare" : "Avslutt deling", - "Delete permanently" : "Slett permanent", - "Rename" : "Gi nytt navn", + "Select" : "Velg", "Pending" : "Ventende", + "Unable to determine date" : "Kan ikke fastslå datoen", "Error moving file." : "Feil ved flytting av fil.", "Error moving file" : "Feil ved flytting av fil", "Error" : "Feil", @@ -71,7 +73,10 @@ OC.L10N.register( "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "App for kryptering er aktivert men nøklene dine er ikke satt opp. Logg ut og logg inn igjen.", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Ugyldig privat nøkkel for Krypterings-app. Oppdater passordet for din private nøkkel i dine personlige innstillinger for å gjenopprette tilgang til de krypterte filene dine.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Kryptering ble slått av men filene dine er fremdeles kryptert. Gå til dine personlige innstillinger for å dekryptere filene dine.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "{dirs} and {files}" : "{dirs} og {files}", + "Favorited" : "Er favoritt", + "Favorite" : "Gjør til favoritt", "%s could not be renamed as it has been deleted" : "%s kunne ikke gis nytt navn da den er blitt slettet", "%s could not be renamed" : "Kunne ikke gi nytt navn til %s", "Upload (max. %s)" : "Opplasting (maks. %s)", @@ -79,6 +84,7 @@ OC.L10N.register( "Maximum upload size" : "Maksimum opplastingsstørrelse", "max. possible: " : "max. mulige:", "Save" : "Lagre", + "Settings" : "Innstillinger", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Bruk denne adressen for å <a href=\"%s\" target=\"_blank\">få tilgang til filene dine via WebDAV</a>", "New" : "Ny", @@ -87,11 +93,17 @@ OC.L10N.register( "New folder" : "Ny mappe", "Folder" : "Mappe", "From link" : "Fra lenke", - "Nothing in here. Upload something!" : "Ingenting her. Last opp noe!", + "Upload" : "Last opp", + "Cancel upload" : "Avbryt opplasting", + "No files yet" : "Ingen filer ennå", + "Upload some content or sync with your devices!" : "Last opp noe innhold eller synkroniser med enhetene dine!", + "Select all" : "Velg alle", "Download" : "Last ned", "Upload too large" : "Filen er for stor", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Filene du prøver å laste opp er for store for å laste opp til denne serveren.", "Files are being scanned, please wait." : "Skanner filer, vennligst vent.", - "Currently scanning" : "Skanner nå" + "Currently scanning" : "Skanner nå", + "No favorites" : "Ingen favoritter", + "Files and folders you mark as favorite will show up here" : "Filer og mapper som du gjør til favoritter vises her" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/nb_NO.json b/apps/files/l10n/nb_NO.json index ab3dfc782e6..d61e2c63de7 100644 --- a/apps/files/l10n/nb_NO.json +++ b/apps/files/l10n/nb_NO.json @@ -33,6 +33,8 @@ "Invalid directory." : "Ugyldig katalog.", "Files" : "Filer", "All files" : "Alle filer", + "Favorites" : "Favoritter", + "Home" : "Hjem", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Kan ikke laste opp {filename} fordi det er en mappe eller har 0 bytes", "Total file size {size1} exceeds upload limit {size2}" : "Total filstørrelse {size1} overstiger grense for opplasting {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Ikke nok ledig plass. Du laster opp size1} men bare {size2} er ledig", @@ -44,13 +46,13 @@ "Could not create file" : "Klarte ikke å opprette fil", "Could not create folder" : "Klarte ikke å opprette mappe", "Error fetching URL" : "Feil ved henting av URL", - "Share" : "Del", + "Rename" : "Gi nytt navn", "Delete" : "Slett", "Disconnect storage" : "Koble fra lagring", "Unshare" : "Avslutt deling", - "Delete permanently" : "Slett permanent", - "Rename" : "Gi nytt navn", + "Select" : "Velg", "Pending" : "Ventende", + "Unable to determine date" : "Kan ikke fastslå datoen", "Error moving file." : "Feil ved flytting av fil.", "Error moving file" : "Feil ved flytting av fil", "Error" : "Feil", @@ -69,7 +71,10 @@ "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "App for kryptering er aktivert men nøklene dine er ikke satt opp. Logg ut og logg inn igjen.", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Ugyldig privat nøkkel for Krypterings-app. Oppdater passordet for din private nøkkel i dine personlige innstillinger for å gjenopprette tilgang til de krypterte filene dine.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Kryptering ble slått av men filene dine er fremdeles kryptert. Gå til dine personlige innstillinger for å dekryptere filene dine.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "{dirs} and {files}" : "{dirs} og {files}", + "Favorited" : "Er favoritt", + "Favorite" : "Gjør til favoritt", "%s could not be renamed as it has been deleted" : "%s kunne ikke gis nytt navn da den er blitt slettet", "%s could not be renamed" : "Kunne ikke gi nytt navn til %s", "Upload (max. %s)" : "Opplasting (maks. %s)", @@ -77,6 +82,7 @@ "Maximum upload size" : "Maksimum opplastingsstørrelse", "max. possible: " : "max. mulige:", "Save" : "Lagre", + "Settings" : "Innstillinger", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Bruk denne adressen for å <a href=\"%s\" target=\"_blank\">få tilgang til filene dine via WebDAV</a>", "New" : "Ny", @@ -85,11 +91,17 @@ "New folder" : "Ny mappe", "Folder" : "Mappe", "From link" : "Fra lenke", - "Nothing in here. Upload something!" : "Ingenting her. Last opp noe!", + "Upload" : "Last opp", + "Cancel upload" : "Avbryt opplasting", + "No files yet" : "Ingen filer ennå", + "Upload some content or sync with your devices!" : "Last opp noe innhold eller synkroniser med enhetene dine!", + "Select all" : "Velg alle", "Download" : "Last ned", "Upload too large" : "Filen er for stor", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Filene du prøver å laste opp er for store for å laste opp til denne serveren.", "Files are being scanned, please wait." : "Skanner filer, vennligst vent.", - "Currently scanning" : "Skanner nå" + "Currently scanning" : "Skanner nå", + "No favorites" : "Ingen favoritter", + "Files and folders you mark as favorite will show up here" : "Filer og mapper som du gjør til favoritter vises her" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/nds.js b/apps/files/l10n/nds.js index 329844854f1..560042b3efd 100644 --- a/apps/files/l10n/nds.js +++ b/apps/files/l10n/nds.js @@ -3,6 +3,7 @@ OC.L10N.register( { "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""] }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/nds.json b/apps/files/l10n/nds.json index 37156658a86..4cfa6a31b6e 100644 --- a/apps/files/l10n/nds.json +++ b/apps/files/l10n/nds.json @@ -1,6 +1,7 @@ { "translations": { "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""] },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/ne.js b/apps/files/l10n/ne.js index 329844854f1..560042b3efd 100644 --- a/apps/files/l10n/ne.js +++ b/apps/files/l10n/ne.js @@ -3,6 +3,7 @@ OC.L10N.register( { "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""] }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/ne.json b/apps/files/l10n/ne.json index 37156658a86..4cfa6a31b6e 100644 --- a/apps/files/l10n/ne.json +++ b/apps/files/l10n/ne.json @@ -1,6 +1,7 @@ { "translations": { "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""] },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/nl.js b/apps/files/l10n/nl.js index 75f1e26ec0b..f762a33d8bc 100644 --- a/apps/files/l10n/nl.js +++ b/apps/files/l10n/nl.js @@ -35,6 +35,8 @@ OC.L10N.register( "Invalid directory." : "Ongeldige directory.", "Files" : "Bestanden", "All files" : "Alle bestanden", + "Favorites" : "Favorieten", + "Home" : "Thuis", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Kan {filename} niet uploaden omdat het een map is of 0 bytes groot is", "Total file size {size1} exceeds upload limit {size2}" : "Totale bestandsgrootte {size1} groter dan uploadlimiet {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Niet genoeg vrije ruimte. U upload {size1}, maar is is slechts {size2} beschikbaar", @@ -46,18 +48,19 @@ OC.L10N.register( "Could not create file" : "Kon bestand niet creëren", "Could not create folder" : "Kon niet creëren map", "Error fetching URL" : "Fout bij ophalen URL", - "Share" : "Delen", + "Rename" : "Naam wijzigen", "Delete" : "Verwijderen", "Disconnect storage" : "Verbinding met opslag verbreken", "Unshare" : "Stop met delen", - "Delete permanently" : "Definitief verwijderen", - "Rename" : "Naam wijzigen", + "Select" : "Selecteer", "Pending" : "In behandeling", + "Unable to determine date" : "Kon datum niet vaststellen", "Error moving file." : "Fout bij verplaatsen bestand.", "Error moving file" : "Fout bij verplaatsen bestand", "Error" : "Fout", "Could not rename file" : "Kon de naam van het bestand niet wijzigen", "Error deleting file." : "Fout bij verwijderen bestand.", + "No entries in this folder match '{filter}'" : "Niets in deze map komt overeen met '{filter}'", "Name" : "Naam", "Size" : "Grootte", "Modified" : "Aangepast", @@ -71,7 +74,10 @@ OC.L10N.register( "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Crypto app is geactiveerd, maar uw sleutels werden niet geïnitialiseerd. Log uit en log daarna opnieuw in.", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Ongeldige privésleutel voor crypto app. Werk het privésleutel wachtwoord bij in uw persoonlijke instellingen om opnieuw toegang te krijgen tot uw versleutelde bestanden.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Encryptie is uitgeschakeld maar uw bestanden zijn nog steeds versleuteld. Ga naar uw persoonlijke instellingen om uw bestanden te decoderen.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["komt overeen met '{filter}'","komt overeen met '{filter}'"], "{dirs} and {files}" : "{dirs} en {files}", + "Favorited" : "Favoriet", + "Favorite" : "Favoriet", "%s could not be renamed as it has been deleted" : "%s kon niet worden hernoemd, omdat het verwijderd is", "%s could not be renamed" : "%s kon niet worden hernoemd", "Upload (max. %s)" : "Upload (max. %s)", @@ -79,6 +85,7 @@ OC.L10N.register( "Maximum upload size" : "Maximale bestandsgrootte voor uploads", "max. possible: " : "max. mogelijk: ", "Save" : "Bewaren", + "Settings" : "Instellingen", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Gebruik deze link <a href=\"%s\" target=\"_blank\">om uw bestanden via WebDAV te benaderen</a>", "New" : "Nieuw", @@ -87,11 +94,18 @@ OC.L10N.register( "New folder" : "Nieuwe map", "Folder" : "Map", "From link" : "Vanaf link", - "Nothing in here. Upload something!" : "Niets te zien hier. Upload iets!", + "Upload" : "Uploaden", + "Cancel upload" : "Upload afbreken", + "No files yet" : "Nog geen bestanden.", + "Upload some content or sync with your devices!" : "Upload bestanden of synchroniseer met uw apparaten!", + "No entries found in this folder" : "Niets", + "Select all" : "Alles selecteren", "Download" : "Downloaden", "Upload too large" : "Upload is te groot", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "De bestanden die u probeert te uploaden zijn groter dan de maximaal toegestane bestandsgrootte voor deze server.", "Files are being scanned, please wait." : "Bestanden worden gescand, even wachten.", - "Currently scanning" : "Nu aan het scannen" + "Currently scanning" : "Nu aan het scannen", + "No favorites" : "Geen favorieten", + "Files and folders you mark as favorite will show up here" : "Bestanden en mappen die u favoriet vindt worden hier getoont" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/nl.json b/apps/files/l10n/nl.json index 58416264c9a..4eeec0c31ee 100644 --- a/apps/files/l10n/nl.json +++ b/apps/files/l10n/nl.json @@ -33,6 +33,8 @@ "Invalid directory." : "Ongeldige directory.", "Files" : "Bestanden", "All files" : "Alle bestanden", + "Favorites" : "Favorieten", + "Home" : "Thuis", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Kan {filename} niet uploaden omdat het een map is of 0 bytes groot is", "Total file size {size1} exceeds upload limit {size2}" : "Totale bestandsgrootte {size1} groter dan uploadlimiet {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Niet genoeg vrije ruimte. U upload {size1}, maar is is slechts {size2} beschikbaar", @@ -44,18 +46,19 @@ "Could not create file" : "Kon bestand niet creëren", "Could not create folder" : "Kon niet creëren map", "Error fetching URL" : "Fout bij ophalen URL", - "Share" : "Delen", + "Rename" : "Naam wijzigen", "Delete" : "Verwijderen", "Disconnect storage" : "Verbinding met opslag verbreken", "Unshare" : "Stop met delen", - "Delete permanently" : "Definitief verwijderen", - "Rename" : "Naam wijzigen", + "Select" : "Selecteer", "Pending" : "In behandeling", + "Unable to determine date" : "Kon datum niet vaststellen", "Error moving file." : "Fout bij verplaatsen bestand.", "Error moving file" : "Fout bij verplaatsen bestand", "Error" : "Fout", "Could not rename file" : "Kon de naam van het bestand niet wijzigen", "Error deleting file." : "Fout bij verwijderen bestand.", + "No entries in this folder match '{filter}'" : "Niets in deze map komt overeen met '{filter}'", "Name" : "Naam", "Size" : "Grootte", "Modified" : "Aangepast", @@ -69,7 +72,10 @@ "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Crypto app is geactiveerd, maar uw sleutels werden niet geïnitialiseerd. Log uit en log daarna opnieuw in.", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Ongeldige privésleutel voor crypto app. Werk het privésleutel wachtwoord bij in uw persoonlijke instellingen om opnieuw toegang te krijgen tot uw versleutelde bestanden.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Encryptie is uitgeschakeld maar uw bestanden zijn nog steeds versleuteld. Ga naar uw persoonlijke instellingen om uw bestanden te decoderen.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["komt overeen met '{filter}'","komt overeen met '{filter}'"], "{dirs} and {files}" : "{dirs} en {files}", + "Favorited" : "Favoriet", + "Favorite" : "Favoriet", "%s could not be renamed as it has been deleted" : "%s kon niet worden hernoemd, omdat het verwijderd is", "%s could not be renamed" : "%s kon niet worden hernoemd", "Upload (max. %s)" : "Upload (max. %s)", @@ -77,6 +83,7 @@ "Maximum upload size" : "Maximale bestandsgrootte voor uploads", "max. possible: " : "max. mogelijk: ", "Save" : "Bewaren", + "Settings" : "Instellingen", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Gebruik deze link <a href=\"%s\" target=\"_blank\">om uw bestanden via WebDAV te benaderen</a>", "New" : "Nieuw", @@ -85,11 +92,18 @@ "New folder" : "Nieuwe map", "Folder" : "Map", "From link" : "Vanaf link", - "Nothing in here. Upload something!" : "Niets te zien hier. Upload iets!", + "Upload" : "Uploaden", + "Cancel upload" : "Upload afbreken", + "No files yet" : "Nog geen bestanden.", + "Upload some content or sync with your devices!" : "Upload bestanden of synchroniseer met uw apparaten!", + "No entries found in this folder" : "Niets", + "Select all" : "Alles selecteren", "Download" : "Downloaden", "Upload too large" : "Upload is te groot", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "De bestanden die u probeert te uploaden zijn groter dan de maximaal toegestane bestandsgrootte voor deze server.", "Files are being scanned, please wait." : "Bestanden worden gescand, even wachten.", - "Currently scanning" : "Nu aan het scannen" + "Currently scanning" : "Nu aan het scannen", + "No favorites" : "Geen favorieten", + "Files and folders you mark as favorite will show up here" : "Bestanden en mappen die u favoriet vindt worden hier getoont" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/nn_NO.js b/apps/files/l10n/nn_NO.js index 6d17a9458c5..bde31ce1118 100644 --- a/apps/files/l10n/nn_NO.js +++ b/apps/files/l10n/nn_NO.js @@ -21,16 +21,16 @@ OC.L10N.register( "Upload failed. Could not get file info." : "Feil ved opplasting. Klarte ikkje å henta filinfo.", "Invalid directory." : "Ugyldig mappe.", "Files" : "Filer", + "Favorites" : "Favorittar", + "Home" : "Heime", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Klarte ikkje å lasta opp {filename} sidan det er ei mappe eller er 0 byte.", "Upload cancelled." : "Opplasting avbroten.", "Could not get result from server." : "Klarte ikkje å henta resultat frå tenaren.", "File upload is in progress. Leaving the page now will cancel the upload." : "Fila lastar no opp. Viss du forlèt sida no vil opplastinga verta avbroten.", "{new_name} already exists" : "{new_name} finst allereie", - "Share" : "Del", + "Rename" : "Endra namn", "Delete" : "Slett", "Unshare" : "Udel", - "Delete permanently" : "Slett for godt", - "Rename" : "Endra namn", "Pending" : "Under vegs", "Error moving file" : "Feil ved flytting av fil", "Error" : "Feil", @@ -43,19 +43,23 @@ OC.L10N.register( "Your storage is full, files can not be updated or synced anymore!" : "Lagringa di er full, kan ikkje lenger oppdatera eller synkronisera!", "Your storage is almost full ({usedSpacePercent}%)" : "Lagringa di er nesten full ({usedSpacePercent} %)", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Kryptering er skrudd av, men filene dine er enno krypterte. Du kan dekryptera filene i personlege innstillingar.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "{dirs} and {files}" : "{dirs} og {files}", + "Favorite" : "Favoritt", "%s could not be renamed" : "Klarte ikkje å omdøypa på %s", "File handling" : "Filhandtering", "Maximum upload size" : "Maksimal opplastingsstorleik", "max. possible: " : "maks. moglege:", "Save" : "Lagre", + "Settings" : "Innstillingar", "WebDAV" : "WebDAV", "New" : "Ny", "Text file" : "Tekst fil", "New folder" : "Ny mappe", "Folder" : "Mappe", "From link" : "Frå lenkje", - "Nothing in here. Upload something!" : "Ingenting her. Last noko opp!", + "Upload" : "Last opp", + "Cancel upload" : "Avbryt opplasting", "Download" : "Last ned", "Upload too large" : "For stor opplasting", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Filene du prøver å lasta opp er større enn maksgrensa til denne tenaren.", diff --git a/apps/files/l10n/nn_NO.json b/apps/files/l10n/nn_NO.json index 4008ab0778c..79a358b550d 100644 --- a/apps/files/l10n/nn_NO.json +++ b/apps/files/l10n/nn_NO.json @@ -19,16 +19,16 @@ "Upload failed. Could not get file info." : "Feil ved opplasting. Klarte ikkje å henta filinfo.", "Invalid directory." : "Ugyldig mappe.", "Files" : "Filer", + "Favorites" : "Favorittar", + "Home" : "Heime", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Klarte ikkje å lasta opp {filename} sidan det er ei mappe eller er 0 byte.", "Upload cancelled." : "Opplasting avbroten.", "Could not get result from server." : "Klarte ikkje å henta resultat frå tenaren.", "File upload is in progress. Leaving the page now will cancel the upload." : "Fila lastar no opp. Viss du forlèt sida no vil opplastinga verta avbroten.", "{new_name} already exists" : "{new_name} finst allereie", - "Share" : "Del", + "Rename" : "Endra namn", "Delete" : "Slett", "Unshare" : "Udel", - "Delete permanently" : "Slett for godt", - "Rename" : "Endra namn", "Pending" : "Under vegs", "Error moving file" : "Feil ved flytting av fil", "Error" : "Feil", @@ -41,19 +41,23 @@ "Your storage is full, files can not be updated or synced anymore!" : "Lagringa di er full, kan ikkje lenger oppdatera eller synkronisera!", "Your storage is almost full ({usedSpacePercent}%)" : "Lagringa di er nesten full ({usedSpacePercent} %)", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Kryptering er skrudd av, men filene dine er enno krypterte. Du kan dekryptera filene i personlege innstillingar.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "{dirs} and {files}" : "{dirs} og {files}", + "Favorite" : "Favoritt", "%s could not be renamed" : "Klarte ikkje å omdøypa på %s", "File handling" : "Filhandtering", "Maximum upload size" : "Maksimal opplastingsstorleik", "max. possible: " : "maks. moglege:", "Save" : "Lagre", + "Settings" : "Innstillingar", "WebDAV" : "WebDAV", "New" : "Ny", "Text file" : "Tekst fil", "New folder" : "Ny mappe", "Folder" : "Mappe", "From link" : "Frå lenkje", - "Nothing in here. Upload something!" : "Ingenting her. Last noko opp!", + "Upload" : "Last opp", + "Cancel upload" : "Avbryt opplasting", "Download" : "Last ned", "Upload too large" : "For stor opplasting", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Filene du prøver å lasta opp er større enn maksgrensa til denne tenaren.", diff --git a/apps/files/l10n/nqo.js b/apps/files/l10n/nqo.js index d1bbfca2dd4..8c5bb3bc949 100644 --- a/apps/files/l10n/nqo.js +++ b/apps/files/l10n/nqo.js @@ -3,6 +3,7 @@ OC.L10N.register( { "_%n folder_::_%n folders_" : [""], "_%n file_::_%n files_" : [""], - "_Uploading %n file_::_Uploading %n files_" : [""] + "_Uploading %n file_::_Uploading %n files_" : [""], + "_ matches '{filter}'_::_ match '{filter}'_" : [""] }, "nplurals=1; plural=0;"); diff --git a/apps/files/l10n/nqo.json b/apps/files/l10n/nqo.json index e493054d78a..e03a2942ff2 100644 --- a/apps/files/l10n/nqo.json +++ b/apps/files/l10n/nqo.json @@ -1,6 +1,7 @@ { "translations": { "_%n folder_::_%n folders_" : [""], "_%n file_::_%n files_" : [""], - "_Uploading %n file_::_Uploading %n files_" : [""] + "_Uploading %n file_::_Uploading %n files_" : [""], + "_ matches '{filter}'_::_ match '{filter}'_" : [""] },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/files/l10n/oc.js b/apps/files/l10n/oc.js index deb447f57d9..99c3e8e0742 100644 --- a/apps/files/l10n/oc.js +++ b/apps/files/l10n/oc.js @@ -10,10 +10,9 @@ OC.L10N.register( "Files" : "Fichièrs", "Upload cancelled." : "Amontcargar anullat.", "File upload is in progress. Leaving the page now will cancel the upload." : "Un amontcargar es a se far. Daissar aquesta pagina ara tamparà lo cargament. ", - "Share" : "Parteja", + "Rename" : "Torna nomenar", "Delete" : "Escafa", "Unshare" : "Pas partejador", - "Rename" : "Torna nomenar", "Pending" : "Al esperar", "Error" : "Error", "Name" : "Nom", @@ -22,14 +21,17 @@ OC.L10N.register( "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "File handling" : "Manejament de fichièr", "Maximum upload size" : "Talha maximum d'amontcargament", "max. possible: " : "max. possible: ", "Save" : "Enregistra", + "Settings" : "Paramètres", "New" : "Nòu", "Text file" : "Fichièr de tèxte", "Folder" : "Dorsièr", - "Nothing in here. Upload something!" : "Pas res dedins. Amontcarga qualquaren", + "Upload" : "Amontcarga", + "Cancel upload" : " Anulla l'amontcargar", "Download" : "Avalcarga", "Upload too large" : "Amontcargament tròp gròs", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los fichièrs que sias a amontcargar son tròp pesucs per la talha maxi pel servidor.", diff --git a/apps/files/l10n/oc.json b/apps/files/l10n/oc.json index 994cb0055ea..7a1185c4002 100644 --- a/apps/files/l10n/oc.json +++ b/apps/files/l10n/oc.json @@ -8,10 +8,9 @@ "Files" : "Fichièrs", "Upload cancelled." : "Amontcargar anullat.", "File upload is in progress. Leaving the page now will cancel the upload." : "Un amontcargar es a se far. Daissar aquesta pagina ara tamparà lo cargament. ", - "Share" : "Parteja", + "Rename" : "Torna nomenar", "Delete" : "Escafa", "Unshare" : "Pas partejador", - "Rename" : "Torna nomenar", "Pending" : "Al esperar", "Error" : "Error", "Name" : "Nom", @@ -20,14 +19,17 @@ "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "File handling" : "Manejament de fichièr", "Maximum upload size" : "Talha maximum d'amontcargament", "max. possible: " : "max. possible: ", "Save" : "Enregistra", + "Settings" : "Paramètres", "New" : "Nòu", "Text file" : "Fichièr de tèxte", "Folder" : "Dorsièr", - "Nothing in here. Upload something!" : "Pas res dedins. Amontcarga qualquaren", + "Upload" : "Amontcarga", + "Cancel upload" : " Anulla l'amontcargar", "Download" : "Avalcarga", "Upload too large" : "Amontcargament tròp gròs", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Los fichièrs que sias a amontcargar son tròp pesucs per la talha maxi pel servidor.", diff --git a/apps/files/l10n/or_IN.js b/apps/files/l10n/or_IN.js index 329844854f1..560042b3efd 100644 --- a/apps/files/l10n/or_IN.js +++ b/apps/files/l10n/or_IN.js @@ -3,6 +3,7 @@ OC.L10N.register( { "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""] }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/or_IN.json b/apps/files/l10n/or_IN.json index 37156658a86..4cfa6a31b6e 100644 --- a/apps/files/l10n/or_IN.json +++ b/apps/files/l10n/or_IN.json @@ -1,6 +1,7 @@ { "translations": { "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""] },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/pa.js b/apps/files/l10n/pa.js index 84216361960..951695545ee 100644 --- a/apps/files/l10n/pa.js +++ b/apps/files/l10n/pa.js @@ -3,13 +3,16 @@ OC.L10N.register( { "Unknown error" : "ਅਣਜਾਣ ਗਲਤੀ", "Files" : "ਫਾਇਲਾਂ", - "Share" : "ਸਾਂਝਾ ਕਰੋ", - "Delete" : "ਹਟਾਓ", "Rename" : "ਨਾਂ ਬਦਲੋ", + "Delete" : "ਹਟਾਓ", "Error" : "ਗਲਤੀ", "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], + "Settings" : "ਸੈਟਿੰਗ", + "Upload" : "ਅੱਪਲੋਡ", + "Cancel upload" : "ਅੱਪਲੋਡ ਰੱਦ ਕਰੋ", "Download" : "ਡਾਊਨਲੋਡ" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/pa.json b/apps/files/l10n/pa.json index b429b4ab19b..601c6edbb27 100644 --- a/apps/files/l10n/pa.json +++ b/apps/files/l10n/pa.json @@ -1,13 +1,16 @@ { "translations": { "Unknown error" : "ਅਣਜਾਣ ਗਲਤੀ", "Files" : "ਫਾਇਲਾਂ", - "Share" : "ਸਾਂਝਾ ਕਰੋ", - "Delete" : "ਹਟਾਓ", "Rename" : "ਨਾਂ ਬਦਲੋ", + "Delete" : "ਹਟਾਓ", "Error" : "ਗਲਤੀ", "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], + "Settings" : "ਸੈਟਿੰਗ", + "Upload" : "ਅੱਪਲੋਡ", + "Cancel upload" : "ਅੱਪਲੋਡ ਰੱਦ ਕਰੋ", "Download" : "ਡਾਊਨਲੋਡ" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/pl.js b/apps/files/l10n/pl.js index 1a0fb57ec30..b548af4b58d 100644 --- a/apps/files/l10n/pl.js +++ b/apps/files/l10n/pl.js @@ -35,6 +35,8 @@ OC.L10N.register( "Invalid directory." : "Zła ścieżka.", "Files" : "Pliki", "All files" : "Wszystkie pliki", + "Favorites" : "Ulubione", + "Home" : "Dom", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Nie można przesłać {filename} być może jest katalogiem lub posiada 0 bajtów", "Total file size {size1} exceeds upload limit {size2}" : "Całkowity rozmiar {size1} przekracza limit uploadu {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Brak wolnej przestrzeni, przesyłasz {size1} a pozostało tylko {size2}", @@ -46,12 +48,11 @@ OC.L10N.register( "Could not create file" : "Nie można utworzyć pliku", "Could not create folder" : "Nie można utworzyć folderu", "Error fetching URL" : "Błąd przy pobieraniu adresu URL", - "Share" : "Udostępnij", + "Rename" : "Zmień nazwę", "Delete" : "Usuń", "Disconnect storage" : "Odłącz magazyn", "Unshare" : "Zatrzymaj współdzielenie", - "Delete permanently" : "Trwale usuń", - "Rename" : "Zmień nazwę", + "Select" : "Wybierz", "Pending" : "Oczekujące", "Error moving file." : "Błąd podczas przenoszenia pliku.", "Error moving file" : "Błąd prz przenoszeniu pliku", @@ -71,7 +72,9 @@ OC.L10N.register( "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Aplikacja szyfrująca jest aktywna, ale twoje klucze nie zostały zainicjowane, prosze wyloguj się i zaloguj ponownie.", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Klucz prywatny nie jest poprawny! Może Twoje hasło zostało zmienione z zewnątrz. Można zaktualizować hasło klucza prywatnego w ustawieniach osobistych w celu odzyskania dostępu do plików", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Szyfrowanie zostało wyłączone, ale nadal pliki są zaszyfrowane. Przejdź do ustawień osobistych i tam odszyfruj pliki.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["","",""], "{dirs} and {files}" : "{dirs} i {files}", + "Favorite" : "Ulubione", "%s could not be renamed as it has been deleted" : "%s nie może mieć zmienionej nazwy, ponieważ został usunięty", "%s could not be renamed" : "%s nie można zmienić nazwy", "Upload (max. %s)" : "Wysyłka (max. %s)", @@ -79,6 +82,7 @@ OC.L10N.register( "Maximum upload size" : "Maksymalny rozmiar wysyłanego pliku", "max. possible: " : "maks. możliwy:", "Save" : "Zapisz", + "Settings" : "Ustawienia", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Użyj tego adresu do <a href=\"%s\" target=\"_blank\">dostępu do twoich plików przez WebDAV</a>", "New" : "Nowy", @@ -87,7 +91,8 @@ OC.L10N.register( "New folder" : "Nowy folder", "Folder" : "Folder", "From link" : "Z odnośnika", - "Nothing in here. Upload something!" : "Pusto. Wyślij coś!", + "Upload" : "Wyślij", + "Cancel upload" : "Anuluj wysyłanie", "Download" : "Pobierz", "Upload too large" : "Ładowany plik jest za duży", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Pliki, które próbujesz przesłać, przekraczają maksymalną dopuszczalną wielkość.", diff --git a/apps/files/l10n/pl.json b/apps/files/l10n/pl.json index b073141e3d1..9d651ffe648 100644 --- a/apps/files/l10n/pl.json +++ b/apps/files/l10n/pl.json @@ -33,6 +33,8 @@ "Invalid directory." : "Zła ścieżka.", "Files" : "Pliki", "All files" : "Wszystkie pliki", + "Favorites" : "Ulubione", + "Home" : "Dom", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Nie można przesłać {filename} być może jest katalogiem lub posiada 0 bajtów", "Total file size {size1} exceeds upload limit {size2}" : "Całkowity rozmiar {size1} przekracza limit uploadu {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Brak wolnej przestrzeni, przesyłasz {size1} a pozostało tylko {size2}", @@ -44,12 +46,11 @@ "Could not create file" : "Nie można utworzyć pliku", "Could not create folder" : "Nie można utworzyć folderu", "Error fetching URL" : "Błąd przy pobieraniu adresu URL", - "Share" : "Udostępnij", + "Rename" : "Zmień nazwę", "Delete" : "Usuń", "Disconnect storage" : "Odłącz magazyn", "Unshare" : "Zatrzymaj współdzielenie", - "Delete permanently" : "Trwale usuń", - "Rename" : "Zmień nazwę", + "Select" : "Wybierz", "Pending" : "Oczekujące", "Error moving file." : "Błąd podczas przenoszenia pliku.", "Error moving file" : "Błąd prz przenoszeniu pliku", @@ -69,7 +70,9 @@ "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Aplikacja szyfrująca jest aktywna, ale twoje klucze nie zostały zainicjowane, prosze wyloguj się i zaloguj ponownie.", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Klucz prywatny nie jest poprawny! Może Twoje hasło zostało zmienione z zewnątrz. Można zaktualizować hasło klucza prywatnego w ustawieniach osobistych w celu odzyskania dostępu do plików", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Szyfrowanie zostało wyłączone, ale nadal pliki są zaszyfrowane. Przejdź do ustawień osobistych i tam odszyfruj pliki.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["","",""], "{dirs} and {files}" : "{dirs} i {files}", + "Favorite" : "Ulubione", "%s could not be renamed as it has been deleted" : "%s nie może mieć zmienionej nazwy, ponieważ został usunięty", "%s could not be renamed" : "%s nie można zmienić nazwy", "Upload (max. %s)" : "Wysyłka (max. %s)", @@ -77,6 +80,7 @@ "Maximum upload size" : "Maksymalny rozmiar wysyłanego pliku", "max. possible: " : "maks. możliwy:", "Save" : "Zapisz", + "Settings" : "Ustawienia", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Użyj tego adresu do <a href=\"%s\" target=\"_blank\">dostępu do twoich plików przez WebDAV</a>", "New" : "Nowy", @@ -85,7 +89,8 @@ "New folder" : "Nowy folder", "Folder" : "Folder", "From link" : "Z odnośnika", - "Nothing in here. Upload something!" : "Pusto. Wyślij coś!", + "Upload" : "Wyślij", + "Cancel upload" : "Anuluj wysyłanie", "Download" : "Pobierz", "Upload too large" : "Ładowany plik jest za duży", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Pliki, które próbujesz przesłać, przekraczają maksymalną dopuszczalną wielkość.", diff --git a/apps/files/l10n/pt_BR.js b/apps/files/l10n/pt_BR.js index b4c97887362..4dd65c0202c 100644 --- a/apps/files/l10n/pt_BR.js +++ b/apps/files/l10n/pt_BR.js @@ -35,6 +35,8 @@ OC.L10N.register( "Invalid directory." : "Diretório inválido.", "Files" : "Arquivos", "All files" : "Todos os arquivos", + "Favorites" : "Favoritos", + "Home" : "Home", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Incapaz de fazer o envio de {filename}, pois é um diretório ou tem 0 bytes", "Total file size {size1} exceeds upload limit {size2}" : "O tamanho total do arquivo {size1} excede o limite de envio {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Não há espaço suficiente, você está enviando {size1} mas resta apenas {size2}", @@ -46,18 +48,19 @@ OC.L10N.register( "Could not create file" : "Não foi possível criar o arquivo", "Could not create folder" : "Não foi possível criar a pasta", "Error fetching URL" : "Erro ao buscar URL", - "Share" : "Compartilhar", + "Rename" : "Renomear", "Delete" : "Excluir", "Disconnect storage" : "Desconectar armazenagem", "Unshare" : "Descompartilhar", - "Delete permanently" : "Excluir permanentemente", - "Rename" : "Renomear", + "Select" : "Selecionar", "Pending" : "Pendente", + "Unable to determine date" : "Impossível determinar a data", "Error moving file." : "Erro movendo o arquivo.", "Error moving file" : "Erro movendo o arquivo", "Error" : "Erro", "Could not rename file" : "Não foi possível renomear o arquivo", "Error deleting file." : "Erro eliminando o arquivo.", + "No entries in this folder match '{filter}'" : "Nenhuma entrada nesta pasta coincide com '{filter}'", "Name" : "Nome", "Size" : "Tamanho", "Modified" : "Modificado", @@ -71,7 +74,10 @@ OC.L10N.register( "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "App de criptografia está ativado, mas as chaves não estão inicializadas, por favor log-out e faça login novamente", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Chave do App de Criptografia é inválida. Por favor, atualize sua senha de chave privada em suas configurações pessoais para recuperar o acesso a seus arquivos criptografados.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Criptografia foi desabilitada mas seus arquivos continuam criptografados. Por favor vá a suas configurações pessoais para descriptar seus arquivos.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "{dirs} and {files}" : "{dirs} e {files}", + "Favorited" : "Favorito", + "Favorite" : "Favorito", "%s could not be renamed as it has been deleted" : "%s não pode ser renomeado pois foi apagado", "%s could not be renamed" : "%s não pode ser renomeado", "Upload (max. %s)" : "Envio (max. %s)", @@ -79,6 +85,7 @@ OC.L10N.register( "Maximum upload size" : "Tamanho máximo para envio", "max. possible: " : "max. possível:", "Save" : "Salvar", + "Settings" : "Configurações", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Use este endereço <a href=\"%s\" target=\"_blank\">para ter acesso aos seus Arquivos via WebDAV</a>", "New" : "Novo", @@ -87,11 +94,18 @@ OC.L10N.register( "New folder" : "Nova pasta", "Folder" : "Pasta", "From link" : "Do link", - "Nothing in here. Upload something!" : "Nada aqui. Carregue alguma coisa!", + "Upload" : "Enviar", + "Cancel upload" : "Cancelar envio", + "No files yet" : "Nenhum arquivo até agora", + "Upload some content or sync with your devices!" : "Carregue algum conteúdo ou sincronize com seus dispositivos!", + "No entries found in this folder" : "Nenhuma entrada foi encontrada nesta pasta", + "Select all" : "Selecionar tudo", "Download" : "Baixar", "Upload too large" : "Arquivo muito grande para envio", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Os arquivos que você está tentando enviar excedeu o tamanho máximo para arquivos no servidor.", "Files are being scanned, please wait." : "Arquivos sendo escaneados, por favor aguarde.", - "Currently scanning" : "Atualmente escaneando" + "Currently scanning" : "Atualmente escaneando", + "No favorites" : "Sem favoritos", + "Files and folders you mark as favorite will show up here" : "Arquivos e pastas que você marcou como favorito são mostrados aqui" }, "nplurals=2; plural=(n > 1);"); diff --git a/apps/files/l10n/pt_BR.json b/apps/files/l10n/pt_BR.json index 8c303c234ae..1dc5c598321 100644 --- a/apps/files/l10n/pt_BR.json +++ b/apps/files/l10n/pt_BR.json @@ -33,6 +33,8 @@ "Invalid directory." : "Diretório inválido.", "Files" : "Arquivos", "All files" : "Todos os arquivos", + "Favorites" : "Favoritos", + "Home" : "Home", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Incapaz de fazer o envio de {filename}, pois é um diretório ou tem 0 bytes", "Total file size {size1} exceeds upload limit {size2}" : "O tamanho total do arquivo {size1} excede o limite de envio {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Não há espaço suficiente, você está enviando {size1} mas resta apenas {size2}", @@ -44,18 +46,19 @@ "Could not create file" : "Não foi possível criar o arquivo", "Could not create folder" : "Não foi possível criar a pasta", "Error fetching URL" : "Erro ao buscar URL", - "Share" : "Compartilhar", + "Rename" : "Renomear", "Delete" : "Excluir", "Disconnect storage" : "Desconectar armazenagem", "Unshare" : "Descompartilhar", - "Delete permanently" : "Excluir permanentemente", - "Rename" : "Renomear", + "Select" : "Selecionar", "Pending" : "Pendente", + "Unable to determine date" : "Impossível determinar a data", "Error moving file." : "Erro movendo o arquivo.", "Error moving file" : "Erro movendo o arquivo", "Error" : "Erro", "Could not rename file" : "Não foi possível renomear o arquivo", "Error deleting file." : "Erro eliminando o arquivo.", + "No entries in this folder match '{filter}'" : "Nenhuma entrada nesta pasta coincide com '{filter}'", "Name" : "Nome", "Size" : "Tamanho", "Modified" : "Modificado", @@ -69,7 +72,10 @@ "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "App de criptografia está ativado, mas as chaves não estão inicializadas, por favor log-out e faça login novamente", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Chave do App de Criptografia é inválida. Por favor, atualize sua senha de chave privada em suas configurações pessoais para recuperar o acesso a seus arquivos criptografados.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Criptografia foi desabilitada mas seus arquivos continuam criptografados. Por favor vá a suas configurações pessoais para descriptar seus arquivos.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "{dirs} and {files}" : "{dirs} e {files}", + "Favorited" : "Favorito", + "Favorite" : "Favorito", "%s could not be renamed as it has been deleted" : "%s não pode ser renomeado pois foi apagado", "%s could not be renamed" : "%s não pode ser renomeado", "Upload (max. %s)" : "Envio (max. %s)", @@ -77,6 +83,7 @@ "Maximum upload size" : "Tamanho máximo para envio", "max. possible: " : "max. possível:", "Save" : "Salvar", + "Settings" : "Configurações", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Use este endereço <a href=\"%s\" target=\"_blank\">para ter acesso aos seus Arquivos via WebDAV</a>", "New" : "Novo", @@ -85,11 +92,18 @@ "New folder" : "Nova pasta", "Folder" : "Pasta", "From link" : "Do link", - "Nothing in here. Upload something!" : "Nada aqui. Carregue alguma coisa!", + "Upload" : "Enviar", + "Cancel upload" : "Cancelar envio", + "No files yet" : "Nenhum arquivo até agora", + "Upload some content or sync with your devices!" : "Carregue algum conteúdo ou sincronize com seus dispositivos!", + "No entries found in this folder" : "Nenhuma entrada foi encontrada nesta pasta", + "Select all" : "Selecionar tudo", "Download" : "Baixar", "Upload too large" : "Arquivo muito grande para envio", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Os arquivos que você está tentando enviar excedeu o tamanho máximo para arquivos no servidor.", "Files are being scanned, please wait." : "Arquivos sendo escaneados, por favor aguarde.", - "Currently scanning" : "Atualmente escaneando" + "Currently scanning" : "Atualmente escaneando", + "No favorites" : "Sem favoritos", + "Files and folders you mark as favorite will show up here" : "Arquivos e pastas que você marcou como favorito são mostrados aqui" },"pluralForm" :"nplurals=2; plural=(n > 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/pt_PT.js b/apps/files/l10n/pt_PT.js index 2ce2038d661..509c85ad58c 100644 --- a/apps/files/l10n/pt_PT.js +++ b/apps/files/l10n/pt_PT.js @@ -35,6 +35,8 @@ OC.L10N.register( "Invalid directory." : "Diretoria inválida.", "Files" : "Ficheiros", "All files" : "Todos os ficheiros", + "Favorites" : "Favoritos", + "Home" : "Casa", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Incapaz de enviar {filename}, dado que é uma pasta, ou tem 0 bytes", "Total file size {size1} exceeds upload limit {size2}" : "O tamanho total do ficheiro {size1} excede o limite de carregamento {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Não existe espaço suficiente. Está a enviar {size1} mas apenas existe {size2} disponível", @@ -46,13 +48,13 @@ OC.L10N.register( "Could not create file" : "Não pôde criar ficheiro", "Could not create folder" : "Não pôde criar pasta", "Error fetching URL" : "Erro ao obter URL", - "Share" : "Compartilhar", + "Rename" : "Renomear", "Delete" : "Apagar", "Disconnect storage" : "Desconete o armazenamento", "Unshare" : "Deixar de partilhar", - "Delete permanently" : "Apagar Para Sempre", - "Rename" : "Renomear", + "Select" : "Selecionar", "Pending" : "Pendente", + "Unable to determine date" : "Impossível determinar a data", "Error moving file." : "Erro a mover o ficheiro.", "Error moving file" : "Erro ao mover o ficheiro", "Error" : "Erro", @@ -71,7 +73,9 @@ OC.L10N.register( "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "A Aplicação de Encriptação está ativada, mas as suas chaves não inicializaram. Por favor termine e inicie a sessão novamente", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Chave privada inválida da Aplicação de Encriptação. Por favor atualize a sua senha de chave privada nas definições pessoais, para recuperar o acesso aos seus ficheiros encriptados.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "A encriptação foi desactivada mas os seus ficheiros continuam encriptados. Por favor consulte as suas definições pessoais para desencriptar os ficheiros.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "{dirs} and {files}" : "{dirs} e {files}", + "Favorite" : "Favorito", "%s could not be renamed as it has been deleted" : "Não foi possível renomear %s devido a ter sido eliminado", "%s could not be renamed" : "%s não pode ser renomeada", "Upload (max. %s)" : "Enviar (max. %s)", @@ -79,6 +83,7 @@ OC.L10N.register( "Maximum upload size" : "Tamanho máximo de envio", "max. possible: " : "Máx. possível: ", "Save" : "Guardar", + "Settings" : "Definições", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Utilize esta ligação para <a href=\"%s\" target=\"_blank\">aceder aos seus ficheiros via WebDAV</a>", "New" : "Novo", @@ -87,11 +92,14 @@ OC.L10N.register( "New folder" : "Nova Pasta", "Folder" : "Pasta", "From link" : "Da hiperligação", - "Nothing in here. Upload something!" : "Vazio. Envie alguma coisa!", + "Upload" : "Enviar", + "Cancel upload" : "Cancelar o envio", + "Select all" : "Seleccionar todos", "Download" : "Transferir", "Upload too large" : "Upload muito grande", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Os ficheiro que está a tentar enviar excedem o tamanho máximo de envio neste servidor.", "Files are being scanned, please wait." : "Os ficheiros estão a ser analisados, por favor aguarde.", - "Currently scanning" : "A analisar" + "Currently scanning" : "A analisar", + "No favorites" : "Sem favoritos" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/pt_PT.json b/apps/files/l10n/pt_PT.json index 4be9e4306dc..fb333fa23b0 100644 --- a/apps/files/l10n/pt_PT.json +++ b/apps/files/l10n/pt_PT.json @@ -33,6 +33,8 @@ "Invalid directory." : "Diretoria inválida.", "Files" : "Ficheiros", "All files" : "Todos os ficheiros", + "Favorites" : "Favoritos", + "Home" : "Casa", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Incapaz de enviar {filename}, dado que é uma pasta, ou tem 0 bytes", "Total file size {size1} exceeds upload limit {size2}" : "O tamanho total do ficheiro {size1} excede o limite de carregamento {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Não existe espaço suficiente. Está a enviar {size1} mas apenas existe {size2} disponível", @@ -44,13 +46,13 @@ "Could not create file" : "Não pôde criar ficheiro", "Could not create folder" : "Não pôde criar pasta", "Error fetching URL" : "Erro ao obter URL", - "Share" : "Compartilhar", + "Rename" : "Renomear", "Delete" : "Apagar", "Disconnect storage" : "Desconete o armazenamento", "Unshare" : "Deixar de partilhar", - "Delete permanently" : "Apagar Para Sempre", - "Rename" : "Renomear", + "Select" : "Selecionar", "Pending" : "Pendente", + "Unable to determine date" : "Impossível determinar a data", "Error moving file." : "Erro a mover o ficheiro.", "Error moving file" : "Erro ao mover o ficheiro", "Error" : "Erro", @@ -69,7 +71,9 @@ "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "A Aplicação de Encriptação está ativada, mas as suas chaves não inicializaram. Por favor termine e inicie a sessão novamente", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Chave privada inválida da Aplicação de Encriptação. Por favor atualize a sua senha de chave privada nas definições pessoais, para recuperar o acesso aos seus ficheiros encriptados.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "A encriptação foi desactivada mas os seus ficheiros continuam encriptados. Por favor consulte as suas definições pessoais para desencriptar os ficheiros.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "{dirs} and {files}" : "{dirs} e {files}", + "Favorite" : "Favorito", "%s could not be renamed as it has been deleted" : "Não foi possível renomear %s devido a ter sido eliminado", "%s could not be renamed" : "%s não pode ser renomeada", "Upload (max. %s)" : "Enviar (max. %s)", @@ -77,6 +81,7 @@ "Maximum upload size" : "Tamanho máximo de envio", "max. possible: " : "Máx. possível: ", "Save" : "Guardar", + "Settings" : "Definições", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Utilize esta ligação para <a href=\"%s\" target=\"_blank\">aceder aos seus ficheiros via WebDAV</a>", "New" : "Novo", @@ -85,11 +90,14 @@ "New folder" : "Nova Pasta", "Folder" : "Pasta", "From link" : "Da hiperligação", - "Nothing in here. Upload something!" : "Vazio. Envie alguma coisa!", + "Upload" : "Enviar", + "Cancel upload" : "Cancelar o envio", + "Select all" : "Seleccionar todos", "Download" : "Transferir", "Upload too large" : "Upload muito grande", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Os ficheiro que está a tentar enviar excedem o tamanho máximo de envio neste servidor.", "Files are being scanned, please wait." : "Os ficheiros estão a ser analisados, por favor aguarde.", - "Currently scanning" : "A analisar" + "Currently scanning" : "A analisar", + "No favorites" : "Sem favoritos" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/ro.js b/apps/files/l10n/ro.js index 2b3e662aafd..32475b5eb0f 100644 --- a/apps/files/l10n/ro.js +++ b/apps/files/l10n/ro.js @@ -35,6 +35,8 @@ OC.L10N.register( "Invalid directory." : "Dosar nevalid.", "Files" : "Fișiere", "All files" : "Toate fișierele.", + "Favorites" : "Favorite", + "Home" : "Acasă", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Nu se poate încărca {filename} deoarece este un director sau are mărimea de 0 octeți", "Total file size {size1} exceeds upload limit {size2}" : "Mărimea fișierului este {size1} ce depășește limita de incarcare de {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Spațiu liber insuficient, încărcați {size1} însă doar {size2} disponibil rămas", @@ -46,12 +48,11 @@ OC.L10N.register( "Could not create file" : "Nu s-a putut crea fisierul", "Could not create folder" : "Nu s-a putut crea folderul", "Error fetching URL" : "Eroare încarcare URL", - "Share" : "Partajează", + "Rename" : "Redenumește", "Delete" : "Șterge", "Disconnect storage" : "Stocare deconectata", "Unshare" : "Anulare", - "Delete permanently" : "Șterge permanent", - "Rename" : "Redenumește", + "Select" : "Selectează", "Pending" : "În așteptare", "Error moving file." : "Eroare la mutarea fișierului.", "Error moving file" : "Eroare la mutarea fișierului", @@ -71,7 +72,9 @@ OC.L10N.register( "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Aplicatia de criptare este activata dar tastatura nu este initializata , va rugam deconectati-va si reconectati-va", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Cheie privată nevalidă pentru aplicația Încriptare. Te rog, actualizează-ți parola cheii private folosind setările personale pentru a reaccesa fișierele tale încriptate.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "criptarea a fost disactivata dar fisierele sant inca criptate.va rog intrati in setarile personale pentru a decripta fisierele", + "_ matches '{filter}'_::_ match '{filter}'_" : ["","",""], "{dirs} and {files}" : "{dirs} și {files}", + "Favorite" : "Favorit", "%s could not be renamed as it has been deleted" : "%s nu a putut fi redenumit deoarece a fost sters", "%s could not be renamed" : "%s nu a putut fi redenumit", "Upload (max. %s)" : "Încarcă (max. %s)", @@ -79,6 +82,7 @@ OC.L10N.register( "Maximum upload size" : "Dimensiune maximă admisă la încărcare", "max. possible: " : "max. posibil:", "Save" : "Salvează", + "Settings" : "Setări", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Folosește această adresă <a href=\"%s\" target=\"_blank\">pentru acces la fișierele tale folosind WebDAV</a>", "New" : "Nou", @@ -87,7 +91,8 @@ OC.L10N.register( "New folder" : "Un nou dosar", "Folder" : "Dosar", "From link" : "De la adresa", - "Nothing in here. Upload something!" : "Nimic aici. Încarcă ceva!", + "Upload" : "Încărcă", + "Cancel upload" : "Anulează încărcarea", "Download" : "Descarcă", "Upload too large" : "Fișierul încărcat este prea mare", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Fișierele pe care încerci să le încarci depășesc limita de încărcare maximă admisă pe acest server.", diff --git a/apps/files/l10n/ro.json b/apps/files/l10n/ro.json index c0e85b4b916..a05cd39881e 100644 --- a/apps/files/l10n/ro.json +++ b/apps/files/l10n/ro.json @@ -33,6 +33,8 @@ "Invalid directory." : "Dosar nevalid.", "Files" : "Fișiere", "All files" : "Toate fișierele.", + "Favorites" : "Favorite", + "Home" : "Acasă", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Nu se poate încărca {filename} deoarece este un director sau are mărimea de 0 octeți", "Total file size {size1} exceeds upload limit {size2}" : "Mărimea fișierului este {size1} ce depășește limita de incarcare de {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Spațiu liber insuficient, încărcați {size1} însă doar {size2} disponibil rămas", @@ -44,12 +46,11 @@ "Could not create file" : "Nu s-a putut crea fisierul", "Could not create folder" : "Nu s-a putut crea folderul", "Error fetching URL" : "Eroare încarcare URL", - "Share" : "Partajează", + "Rename" : "Redenumește", "Delete" : "Șterge", "Disconnect storage" : "Stocare deconectata", "Unshare" : "Anulare", - "Delete permanently" : "Șterge permanent", - "Rename" : "Redenumește", + "Select" : "Selectează", "Pending" : "În așteptare", "Error moving file." : "Eroare la mutarea fișierului.", "Error moving file" : "Eroare la mutarea fișierului", @@ -69,7 +70,9 @@ "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Aplicatia de criptare este activata dar tastatura nu este initializata , va rugam deconectati-va si reconectati-va", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Cheie privată nevalidă pentru aplicația Încriptare. Te rog, actualizează-ți parola cheii private folosind setările personale pentru a reaccesa fișierele tale încriptate.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "criptarea a fost disactivata dar fisierele sant inca criptate.va rog intrati in setarile personale pentru a decripta fisierele", + "_ matches '{filter}'_::_ match '{filter}'_" : ["","",""], "{dirs} and {files}" : "{dirs} și {files}", + "Favorite" : "Favorit", "%s could not be renamed as it has been deleted" : "%s nu a putut fi redenumit deoarece a fost sters", "%s could not be renamed" : "%s nu a putut fi redenumit", "Upload (max. %s)" : "Încarcă (max. %s)", @@ -77,6 +80,7 @@ "Maximum upload size" : "Dimensiune maximă admisă la încărcare", "max. possible: " : "max. posibil:", "Save" : "Salvează", + "Settings" : "Setări", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Folosește această adresă <a href=\"%s\" target=\"_blank\">pentru acces la fișierele tale folosind WebDAV</a>", "New" : "Nou", @@ -85,7 +89,8 @@ "New folder" : "Un nou dosar", "Folder" : "Dosar", "From link" : "De la adresa", - "Nothing in here. Upload something!" : "Nimic aici. Încarcă ceva!", + "Upload" : "Încărcă", + "Cancel upload" : "Anulează încărcarea", "Download" : "Descarcă", "Upload too large" : "Fișierul încărcat este prea mare", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Fișierele pe care încerci să le încarci depășesc limita de încărcare maximă admisă pe acest server.", diff --git a/apps/files/l10n/ru.js b/apps/files/l10n/ru.js index cd982266155..8494f913794 100644 --- a/apps/files/l10n/ru.js +++ b/apps/files/l10n/ru.js @@ -8,18 +8,18 @@ OC.L10N.register( "Could not move %s" : "Невозможно переместить %s", "Permission denied" : "В доступе отказано", "File name cannot be empty." : "Имя файла не может быть пустым.", - "\"%s\" is an invalid file name." : "\"%s\" это не правильное имя файла.", - "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." : "Неправильное имя: символы '\\', '/', '<', '>', ':', '\"', '|', '?' и '*' недопустимы.", + "\"%s\" is an invalid file name." : "\"%s\" недопустимое имя файла.", + "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." : "Неправильное имя, символы '\\', '/', '<', '>', ':', '\"', '|', '?' и '*' недопустимы.", "The target folder has been moved or deleted." : "Целевой каталог был перемещен или удален.", - "The name %s is already used in the folder %s. Please choose a different name." : "Имя %s уже используется для каталога %s. Пожалуйста, выберите другое имя.", + "The name %s is already used in the folder %s. Please choose a different name." : "Имя %s уже используется для каталога %s. Укажите другое имя.", "Not a valid source" : "Неправильный источник", - "Server is not allowed to open URLs, please check the server configuration" : "Сервер не позволяет открывать URL-адреса, пожалуйста, проверьте настройки сервера", - "The file exceeds your quota by %s" : "Файл превышает вашу квоту на %s", + "Server is not allowed to open URLs, please check the server configuration" : "Сервер не позволяет открывать URL-адреса, проверьте настройки сервера", + "The file exceeds your quota by %s" : "Размер файла превышает квоту на %s", "Error while downloading %s to %s" : "Ошибка при скачивании %s в %s", "Error when creating the file" : "Ошибка при создании файла", - "Folder name cannot be empty." : "Имя папки не может быть пустым.", + "Folder name cannot be empty." : "Имя каталога не может быть пустым.", "Error when creating the folder" : "Ошибка создания каталога", - "Unable to set upload directory." : "Не удалось установить каталог загрузки.", + "Unable to set upload directory." : "Невозможно установить каталог загрузки.", "Invalid Token" : "Недопустимый маркер", "No file was uploaded. Unknown error" : "Файл не был загружен. Неизвестная ошибка", "There is no error, the file uploaded with success" : "Файл загружен успешно.", @@ -35,6 +35,8 @@ OC.L10N.register( "Invalid directory." : "Неверный каталог.", "Files" : "Файлы", "All files" : "Все файлы", + "Favorites" : "Избранное", + "Home" : "Домашний", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Невозможно загрузить {filename}, так как это либо каталог, либо файл нулевого размера", "Total file size {size1} exceeds upload limit {size2}" : "Полный размер файла {size1} превышает лимит по загрузке {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Не достаточно свободного места, Вы загружаете {size1} но осталось только {size2}", @@ -46,18 +48,19 @@ OC.L10N.register( "Could not create file" : "Не удалось создать файл", "Could not create folder" : "Не удалось создать каталог", "Error fetching URL" : "Ошибка получения URL", - "Share" : "Открыть доступ", + "Rename" : "Переименовать", "Delete" : "Удалить", "Disconnect storage" : "Отсоединиться от хранилища", "Unshare" : "Закрыть доступ", - "Delete permanently" : "Удалить окончательно", - "Rename" : "Переименовать", + "Select" : "Выбрать", "Pending" : "Ожидание", + "Unable to determine date" : "Невозможно определить дату", "Error moving file." : "Ошибка перемещения файла.", "Error moving file" : "Ошибка при перемещении файла", "Error" : "Ошибка", "Could not rename file" : "Не удалось переименовать файл", "Error deleting file." : "Ошибка при удалении файла.", + "No entries in this folder match '{filter}'" : "В данном каталоге нет ничего соответствующего '{filter}'", "Name" : "Имя", "Size" : "Размер", "Modified" : "Изменён", @@ -68,10 +71,13 @@ OC.L10N.register( "\"{name}\" is an invalid file name." : "\"{name}\" это не правильное имя файла.", "Your storage is full, files can not be updated or synced anymore!" : "Ваше хранилище заполнено, произведите очистку перед загрузкой новых файлов.", "Your storage is almost full ({usedSpacePercent}%)" : "Ваше хранилище почти заполнено ({usedSpacePercent}%)", - "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Приложение для шифрования активно, но ваши ключи не инициализированы, пожалуйста, перелогиньтесь", + "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Приложение для шифрования активно, но ваши ключи не инициализированы, выйдите из системы и войдите вновь", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Закрытый ключ приложения шифрования недействителен. Обновите закрытый ключ в личных настройках, чтобы восстановить доступ к зашифрованным файлам.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Шифрование было отключено, но ваши файлы остались зашифрованными. Зайдите на страницу личных настроек для того, чтобы расшифровать их.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["соответствует '{filter}'","соответствуют '{filter}'","соответствует '{filter}'"], "{dirs} and {files}" : "{dirs} и {files}", + "Favorited" : "Избранное", + "Favorite" : "Избранное", "%s could not be renamed as it has been deleted" : "Невозможно переименовать %s, поскольку объект удалён.", "%s could not be renamed" : "%s не может быть переименован", "Upload (max. %s)" : "Загрузка (Максимум: %s)", @@ -79,6 +85,7 @@ OC.L10N.register( "Maximum upload size" : "Максимальный размер загружаемого файла", "max. possible: " : "макс. возможно: ", "Save" : "Сохранить", + "Settings" : "Настройки", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Используйте этот адрес для <a href=\"%s\" target=\"_blank\">доступа файлам через WebDAV</a>", "New" : "Новый", @@ -87,11 +94,18 @@ OC.L10N.register( "New folder" : "Новый каталог", "Folder" : "Каталог", "From link" : "Объект по ссылке", - "Nothing in here. Upload something!" : "Здесь ничего нет. Загрузите что-нибудь!", + "Upload" : "Загрузить", + "Cancel upload" : "Отменить загрузку", + "No files yet" : "Пока ещё нет файлов", + "Upload some content or sync with your devices!" : "Загрузите что-нибудь или синхронизируйте со своими устройствами!", + "No entries found in this folder" : "Каталог пуст", + "Select all" : "Выбрать все", "Download" : "Скачать", "Upload too large" : "Файл слишком велик", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Файлы, которые вы пытаетесь загрузить, превышают лимит максимального размера на этом сервере.", - "Files are being scanned, please wait." : "Подождите, файлы сканируются.", - "Currently scanning" : "В настоящее время сканируется" + "Files are being scanned, please wait." : "Идет сканирование файлов. Пожалуйста подождите.", + "Currently scanning" : "В настоящее время сканируется", + "No favorites" : "Нет избранного", + "Files and folders you mark as favorite will show up here" : "Здесь появятся файлы и каталоги, отмеченные как избранные" }, "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/apps/files/l10n/ru.json b/apps/files/l10n/ru.json index 7ac4fb7c3c3..c16452f7e11 100644 --- a/apps/files/l10n/ru.json +++ b/apps/files/l10n/ru.json @@ -6,18 +6,18 @@ "Could not move %s" : "Невозможно переместить %s", "Permission denied" : "В доступе отказано", "File name cannot be empty." : "Имя файла не может быть пустым.", - "\"%s\" is an invalid file name." : "\"%s\" это не правильное имя файла.", - "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." : "Неправильное имя: символы '\\', '/', '<', '>', ':', '\"', '|', '?' и '*' недопустимы.", + "\"%s\" is an invalid file name." : "\"%s\" недопустимое имя файла.", + "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." : "Неправильное имя, символы '\\', '/', '<', '>', ':', '\"', '|', '?' и '*' недопустимы.", "The target folder has been moved or deleted." : "Целевой каталог был перемещен или удален.", - "The name %s is already used in the folder %s. Please choose a different name." : "Имя %s уже используется для каталога %s. Пожалуйста, выберите другое имя.", + "The name %s is already used in the folder %s. Please choose a different name." : "Имя %s уже используется для каталога %s. Укажите другое имя.", "Not a valid source" : "Неправильный источник", - "Server is not allowed to open URLs, please check the server configuration" : "Сервер не позволяет открывать URL-адреса, пожалуйста, проверьте настройки сервера", - "The file exceeds your quota by %s" : "Файл превышает вашу квоту на %s", + "Server is not allowed to open URLs, please check the server configuration" : "Сервер не позволяет открывать URL-адреса, проверьте настройки сервера", + "The file exceeds your quota by %s" : "Размер файла превышает квоту на %s", "Error while downloading %s to %s" : "Ошибка при скачивании %s в %s", "Error when creating the file" : "Ошибка при создании файла", - "Folder name cannot be empty." : "Имя папки не может быть пустым.", + "Folder name cannot be empty." : "Имя каталога не может быть пустым.", "Error when creating the folder" : "Ошибка создания каталога", - "Unable to set upload directory." : "Не удалось установить каталог загрузки.", + "Unable to set upload directory." : "Невозможно установить каталог загрузки.", "Invalid Token" : "Недопустимый маркер", "No file was uploaded. Unknown error" : "Файл не был загружен. Неизвестная ошибка", "There is no error, the file uploaded with success" : "Файл загружен успешно.", @@ -33,6 +33,8 @@ "Invalid directory." : "Неверный каталог.", "Files" : "Файлы", "All files" : "Все файлы", + "Favorites" : "Избранное", + "Home" : "Домашний", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Невозможно загрузить {filename}, так как это либо каталог, либо файл нулевого размера", "Total file size {size1} exceeds upload limit {size2}" : "Полный размер файла {size1} превышает лимит по загрузке {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Не достаточно свободного места, Вы загружаете {size1} но осталось только {size2}", @@ -44,18 +46,19 @@ "Could not create file" : "Не удалось создать файл", "Could not create folder" : "Не удалось создать каталог", "Error fetching URL" : "Ошибка получения URL", - "Share" : "Открыть доступ", + "Rename" : "Переименовать", "Delete" : "Удалить", "Disconnect storage" : "Отсоединиться от хранилища", "Unshare" : "Закрыть доступ", - "Delete permanently" : "Удалить окончательно", - "Rename" : "Переименовать", + "Select" : "Выбрать", "Pending" : "Ожидание", + "Unable to determine date" : "Невозможно определить дату", "Error moving file." : "Ошибка перемещения файла.", "Error moving file" : "Ошибка при перемещении файла", "Error" : "Ошибка", "Could not rename file" : "Не удалось переименовать файл", "Error deleting file." : "Ошибка при удалении файла.", + "No entries in this folder match '{filter}'" : "В данном каталоге нет ничего соответствующего '{filter}'", "Name" : "Имя", "Size" : "Размер", "Modified" : "Изменён", @@ -66,10 +69,13 @@ "\"{name}\" is an invalid file name." : "\"{name}\" это не правильное имя файла.", "Your storage is full, files can not be updated or synced anymore!" : "Ваше хранилище заполнено, произведите очистку перед загрузкой новых файлов.", "Your storage is almost full ({usedSpacePercent}%)" : "Ваше хранилище почти заполнено ({usedSpacePercent}%)", - "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Приложение для шифрования активно, но ваши ключи не инициализированы, пожалуйста, перелогиньтесь", + "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Приложение для шифрования активно, но ваши ключи не инициализированы, выйдите из системы и войдите вновь", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Закрытый ключ приложения шифрования недействителен. Обновите закрытый ключ в личных настройках, чтобы восстановить доступ к зашифрованным файлам.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Шифрование было отключено, но ваши файлы остались зашифрованными. Зайдите на страницу личных настроек для того, чтобы расшифровать их.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["соответствует '{filter}'","соответствуют '{filter}'","соответствует '{filter}'"], "{dirs} and {files}" : "{dirs} и {files}", + "Favorited" : "Избранное", + "Favorite" : "Избранное", "%s could not be renamed as it has been deleted" : "Невозможно переименовать %s, поскольку объект удалён.", "%s could not be renamed" : "%s не может быть переименован", "Upload (max. %s)" : "Загрузка (Максимум: %s)", @@ -77,6 +83,7 @@ "Maximum upload size" : "Максимальный размер загружаемого файла", "max. possible: " : "макс. возможно: ", "Save" : "Сохранить", + "Settings" : "Настройки", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Используйте этот адрес для <a href=\"%s\" target=\"_blank\">доступа файлам через WebDAV</a>", "New" : "Новый", @@ -85,11 +92,18 @@ "New folder" : "Новый каталог", "Folder" : "Каталог", "From link" : "Объект по ссылке", - "Nothing in here. Upload something!" : "Здесь ничего нет. Загрузите что-нибудь!", + "Upload" : "Загрузить", + "Cancel upload" : "Отменить загрузку", + "No files yet" : "Пока ещё нет файлов", + "Upload some content or sync with your devices!" : "Загрузите что-нибудь или синхронизируйте со своими устройствами!", + "No entries found in this folder" : "Каталог пуст", + "Select all" : "Выбрать все", "Download" : "Скачать", "Upload too large" : "Файл слишком велик", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Файлы, которые вы пытаетесь загрузить, превышают лимит максимального размера на этом сервере.", - "Files are being scanned, please wait." : "Подождите, файлы сканируются.", - "Currently scanning" : "В настоящее время сканируется" + "Files are being scanned, please wait." : "Идет сканирование файлов. Пожалуйста подождите.", + "Currently scanning" : "В настоящее время сканируется", + "No favorites" : "Нет избранного", + "Files and folders you mark as favorite will show up here" : "Здесь появятся файлы и каталоги, отмеченные как избранные" },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" }
\ No newline at end of file diff --git a/apps/files/l10n/si_LK.js b/apps/files/l10n/si_LK.js index 80df02a9ada..2b0bd0d3d2b 100644 --- a/apps/files/l10n/si_LK.js +++ b/apps/files/l10n/si_LK.js @@ -9,12 +9,13 @@ OC.L10N.register( "Missing a temporary folder" : "තාවකාලික ෆොල්ඩරයක් අතුරුදහන්", "Failed to write to disk" : "තැටිගත කිරීම අසාර්ථකයි", "Files" : "ගොනු", + "Home" : "නිවස", "Upload cancelled." : "උඩුගත කිරීම අත් හරින්න ලදී", "File upload is in progress. Leaving the page now will cancel the upload." : "උඩුගතකිරීමක් සිදුවේ. පිටුව හැර යාමෙන් එය නැවතෙනු ඇත", - "Share" : "බෙදා හදා ගන්න", + "Rename" : "නැවත නම් කරන්න", "Delete" : "මකා දමන්න", "Unshare" : "නොබෙදු", - "Rename" : "නැවත නම් කරන්න", + "Select" : "තෝරන්න", "Error" : "දෝෂයක්", "Name" : "නම", "Size" : "ප්රමාණය", @@ -22,15 +23,18 @@ OC.L10N.register( "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "File handling" : "ගොනු පරිහරණය", "Maximum upload size" : "උඩුගත කිරීමක උපරිම ප්රමාණය", "max. possible: " : "හැකි උපරිමය:", "Save" : "සුරකින්න", + "Settings" : "සිටුවම්", "New" : "නව", "Text file" : "පෙළ ගොනුව", "Folder" : "ෆෝල්ඩරය", "From link" : "යොමුවෙන්", - "Nothing in here. Upload something!" : "මෙහි කිසිවක් නොමැත. යමක් උඩුගත කරන්න", + "Upload" : "උඩුගත කරන්න", + "Cancel upload" : "උඩුගත කිරීම අත් හරින්න", "Download" : "බාන්න", "Upload too large" : "උඩුගත කිරීම විශාල වැඩිය", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "ඔබ උඩුගත කිරීමට තැත් කරන ගොනු මෙම සේවාදායකයා උඩුගත කිරීමට ඉඩදී ඇති උපරිම ගොනු විශාලත්වයට වඩා වැඩිය", diff --git a/apps/files/l10n/si_LK.json b/apps/files/l10n/si_LK.json index e66d5c2a1f1..67538b76f59 100644 --- a/apps/files/l10n/si_LK.json +++ b/apps/files/l10n/si_LK.json @@ -7,12 +7,13 @@ "Missing a temporary folder" : "තාවකාලික ෆොල්ඩරයක් අතුරුදහන්", "Failed to write to disk" : "තැටිගත කිරීම අසාර්ථකයි", "Files" : "ගොනු", + "Home" : "නිවස", "Upload cancelled." : "උඩුගත කිරීම අත් හරින්න ලදී", "File upload is in progress. Leaving the page now will cancel the upload." : "උඩුගතකිරීමක් සිදුවේ. පිටුව හැර යාමෙන් එය නැවතෙනු ඇත", - "Share" : "බෙදා හදා ගන්න", + "Rename" : "නැවත නම් කරන්න", "Delete" : "මකා දමන්න", "Unshare" : "නොබෙදු", - "Rename" : "නැවත නම් කරන්න", + "Select" : "තෝරන්න", "Error" : "දෝෂයක්", "Name" : "නම", "Size" : "ප්රමාණය", @@ -20,15 +21,18 @@ "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "File handling" : "ගොනු පරිහරණය", "Maximum upload size" : "උඩුගත කිරීමක උපරිම ප්රමාණය", "max. possible: " : "හැකි උපරිමය:", "Save" : "සුරකින්න", + "Settings" : "සිටුවම්", "New" : "නව", "Text file" : "පෙළ ගොනුව", "Folder" : "ෆෝල්ඩරය", "From link" : "යොමුවෙන්", - "Nothing in here. Upload something!" : "මෙහි කිසිවක් නොමැත. යමක් උඩුගත කරන්න", + "Upload" : "උඩුගත කරන්න", + "Cancel upload" : "උඩුගත කිරීම අත් හරින්න", "Download" : "බාන්න", "Upload too large" : "උඩුගත කිරීම විශාල වැඩිය", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "ඔබ උඩුගත කිරීමට තැත් කරන ගොනු මෙම සේවාදායකයා උඩුගත කිරීමට ඉඩදී ඇති උපරිම ගොනු විශාලත්වයට වඩා වැඩිය", diff --git a/apps/files/l10n/sk_SK.js b/apps/files/l10n/sk_SK.js index b29bc7e2c0f..cdff3280b4d 100644 --- a/apps/files/l10n/sk_SK.js +++ b/apps/files/l10n/sk_SK.js @@ -35,6 +35,8 @@ OC.L10N.register( "Invalid directory." : "Neplatný priečinok.", "Files" : "Súbory", "All files" : "Všetky súbory", + "Favorites" : "Obľúbené", + "Home" : "Domov", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Nemožno nahrať súbor {filename}, pretože je to priečinok, alebo má 0 bitov", "Total file size {size1} exceeds upload limit {size2}" : "Celková veľkosť súboru {size1} prekračuje upload limit {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nie je dostatok voľného miesta, chcete nahrať {size1} ale k dispozíciji je len {size2}", @@ -46,12 +48,11 @@ OC.L10N.register( "Could not create file" : "Nemožno vytvoriť súbor", "Could not create folder" : "Nemožno vytvoriť priečinok", "Error fetching URL" : "Chyba pri načítavaní URL", - "Share" : "Zdieľať", + "Rename" : "Premenovať", "Delete" : "Zmazať", "Disconnect storage" : "Odpojiť úložisko", "Unshare" : "Zrušiť zdieľanie", - "Delete permanently" : "Zmazať trvalo", - "Rename" : "Premenovať", + "Select" : "Vybrať", "Pending" : "Čaká", "Error moving file." : "Chyba pri presune súboru.", "Error moving file" : "Chyba pri presúvaní súboru", @@ -71,7 +72,9 @@ OC.L10N.register( "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Aplikácia na šifrovanie je zapnutá, ale vaše kľúče nie sú inicializované. Odhláste sa a znovu sa prihláste.", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Chybný súkromný kľúč na šifrovanie aplikácií. Zaktualizujte si heslo súkromného kľúča v svojom osobnom nastavení, aby ste znovu získali prístup k svojim zašifrovaným súborom.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Šifrovanie bolo zakázané, ale vaše súbory sú stále zašifrované. Prosím, choďte do osobného nastavenia pre dešifrovanie súborov.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["","",""], "{dirs} and {files}" : "{dirs} a {files}", + "Favorite" : "Obľúbené", "%s could not be renamed as it has been deleted" : "%s nebolo možné premenovať, pretože bol zmazaný", "%s could not be renamed" : "%s nemohol byť premenovaný", "Upload (max. %s)" : "Nahrať (max. %s)", @@ -79,6 +82,7 @@ OC.L10N.register( "Maximum upload size" : "Maximálna veľkosť odosielaného súboru", "max. possible: " : "najväčšie možné:", "Save" : "Uložiť", + "Settings" : "Nastavenia", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Použite túto linku <a href=\"%s\" target=\"_blank\">pre prístup k vašim súborom cez WebDAV</a>", "New" : "Nový", @@ -87,7 +91,8 @@ OC.L10N.register( "New folder" : "Nový priečinok", "Folder" : "Priečinok", "From link" : "Z odkazu", - "Nothing in here. Upload something!" : "Žiadny súbor. Nahrajte niečo!", + "Upload" : "Nahrať", + "Cancel upload" : "Zrušiť nahrávanie", "Download" : "Sťahovanie", "Upload too large" : "Nahrávanie je príliš veľké", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Súbory, ktoré sa snažíte nahrať, presahujú maximálnu veľkosť pre nahratie súborov na tento server.", diff --git a/apps/files/l10n/sk_SK.json b/apps/files/l10n/sk_SK.json index a61a5ac06ad..8484602b886 100644 --- a/apps/files/l10n/sk_SK.json +++ b/apps/files/l10n/sk_SK.json @@ -33,6 +33,8 @@ "Invalid directory." : "Neplatný priečinok.", "Files" : "Súbory", "All files" : "Všetky súbory", + "Favorites" : "Obľúbené", + "Home" : "Domov", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Nemožno nahrať súbor {filename}, pretože je to priečinok, alebo má 0 bitov", "Total file size {size1} exceeds upload limit {size2}" : "Celková veľkosť súboru {size1} prekračuje upload limit {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nie je dostatok voľného miesta, chcete nahrať {size1} ale k dispozíciji je len {size2}", @@ -44,12 +46,11 @@ "Could not create file" : "Nemožno vytvoriť súbor", "Could not create folder" : "Nemožno vytvoriť priečinok", "Error fetching URL" : "Chyba pri načítavaní URL", - "Share" : "Zdieľať", + "Rename" : "Premenovať", "Delete" : "Zmazať", "Disconnect storage" : "Odpojiť úložisko", "Unshare" : "Zrušiť zdieľanie", - "Delete permanently" : "Zmazať trvalo", - "Rename" : "Premenovať", + "Select" : "Vybrať", "Pending" : "Čaká", "Error moving file." : "Chyba pri presune súboru.", "Error moving file" : "Chyba pri presúvaní súboru", @@ -69,7 +70,9 @@ "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Aplikácia na šifrovanie je zapnutá, ale vaše kľúče nie sú inicializované. Odhláste sa a znovu sa prihláste.", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Chybný súkromný kľúč na šifrovanie aplikácií. Zaktualizujte si heslo súkromného kľúča v svojom osobnom nastavení, aby ste znovu získali prístup k svojim zašifrovaným súborom.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Šifrovanie bolo zakázané, ale vaše súbory sú stále zašifrované. Prosím, choďte do osobného nastavenia pre dešifrovanie súborov.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["","",""], "{dirs} and {files}" : "{dirs} a {files}", + "Favorite" : "Obľúbené", "%s could not be renamed as it has been deleted" : "%s nebolo možné premenovať, pretože bol zmazaný", "%s could not be renamed" : "%s nemohol byť premenovaný", "Upload (max. %s)" : "Nahrať (max. %s)", @@ -77,6 +80,7 @@ "Maximum upload size" : "Maximálna veľkosť odosielaného súboru", "max. possible: " : "najväčšie možné:", "Save" : "Uložiť", + "Settings" : "Nastavenia", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Použite túto linku <a href=\"%s\" target=\"_blank\">pre prístup k vašim súborom cez WebDAV</a>", "New" : "Nový", @@ -85,7 +89,8 @@ "New folder" : "Nový priečinok", "Folder" : "Priečinok", "From link" : "Z odkazu", - "Nothing in here. Upload something!" : "Žiadny súbor. Nahrajte niečo!", + "Upload" : "Nahrať", + "Cancel upload" : "Zrušiť nahrávanie", "Download" : "Sťahovanie", "Upload too large" : "Nahrávanie je príliš veľké", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Súbory, ktoré sa snažíte nahrať, presahujú maximálnu veľkosť pre nahratie súborov na tento server.", diff --git a/apps/files/l10n/sl.js b/apps/files/l10n/sl.js index 6a8bcbe68a6..d942f2fdc06 100644 --- a/apps/files/l10n/sl.js +++ b/apps/files/l10n/sl.js @@ -35,6 +35,8 @@ OC.L10N.register( "Invalid directory." : "Neveljavna mapa.", "Files" : "Datoteke", "All files" : "Vse datoteke", + "Favorites" : "Priljubljene", + "Home" : "Domači naslov", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Ni mogoče poslati datoteke {filename}, saj je to ali mapa ali pa je velikost datoteke 0 bajtov.", "Total file size {size1} exceeds upload limit {size2}" : "Skupna velikost {size1} presega omejitev velikosti {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Na voljo ni dovolj prostora. Velikost poslane datoteke je {size1}, na voljo pa je je {size2}.", @@ -46,13 +48,13 @@ OC.L10N.register( "Could not create file" : "Ni mogoče ustvariti datoteke", "Could not create folder" : "Ni mogoče ustvariti mape", "Error fetching URL" : "Napaka pridobivanja naslova URL", - "Share" : "Souporaba", + "Rename" : "Preimenuj", "Delete" : "Izbriši", "Disconnect storage" : "Odklopi shrambo", "Unshare" : "Prekini souporabo", - "Delete permanently" : "Izbriši dokončno", - "Rename" : "Preimenuj", + "Select" : "Izberi", "Pending" : "V čakanju ...", + "Unable to determine date" : "Ni mogoče določiti datuma", "Error moving file." : "Napaka premikanja datoteke.", "Error moving file" : "Napaka premikanja datoteke", "Error" : "Napaka", @@ -71,7 +73,10 @@ OC.L10N.register( "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Program za šifriranje je omogočen, vendar ni začet. Odjavite se in nato ponovno prijavite.", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Ni ustreznega osebnega ključa za program za šifriranje. Posodobite osebni ključ za dostop do šifriranih datotek med nastavitvami.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Šifriranje je onemogočeno, datoteke pa so še vedno šifrirane. Odšifrirajte jih med nastavitvami.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["","","",""], "{dirs} and {files}" : "{dirs} in {files}", + "Favorited" : "Označeno kot priljubljeno", + "Favorite" : "Priljubljene", "%s could not be renamed as it has been deleted" : "Datoteke %s ni mogoče preimenovati, ker je bila že prej izbrisana.", "%s could not be renamed" : "%s ni mogoče preimenovati", "Upload (max. %s)" : "Pošiljanje (omejitev %s)", @@ -79,6 +84,7 @@ OC.L10N.register( "Maximum upload size" : "Največja velikost za pošiljanja", "max. possible: " : "največ mogoče:", "Save" : "Shrani", + "Settings" : "Nastavitve", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Uporabite naslov <a href=\"%s\" target=\"_blank\"> za dostop do datotek peko sistema WebDAV</a>.", "New" : "Novo", @@ -87,11 +93,17 @@ OC.L10N.register( "New folder" : "Nova mapa", "Folder" : "Mapa", "From link" : "Iz povezave", - "Nothing in here. Upload something!" : "Tukaj še ni ničesar. Najprej je treba kakšno datoteko poslati v oblak!", + "Upload" : "Pošlji", + "Cancel upload" : "Prekliči pošiljanje", + "No files yet" : "Ni datotek", + "Upload some content or sync with your devices!" : "Uvozite vsebino ali pa omogočite usklajevanje z napravami!", + "Select all" : "izberi vse", "Download" : "Prejmi", "Upload too large" : "Prekoračenje omejitve velikosti", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Datoteke, ki jih želite poslati, presegajo največjo dovoljeno velikost na strežniku.", "Files are being scanned, please wait." : "Poteka preučevanje datotek, počakajte ...", - "Currently scanning" : "Poteka preverjanje" + "Currently scanning" : "Poteka preverjanje", + "No favorites" : "Ni priljubljenih", + "Files and folders you mark as favorite will show up here" : "Datoteke ali mape, ki so označene kot priljubljene, bodo izpisane tukaj." }, "nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);"); diff --git a/apps/files/l10n/sl.json b/apps/files/l10n/sl.json index c759bd2abfe..7ef8b666fe8 100644 --- a/apps/files/l10n/sl.json +++ b/apps/files/l10n/sl.json @@ -33,6 +33,8 @@ "Invalid directory." : "Neveljavna mapa.", "Files" : "Datoteke", "All files" : "Vse datoteke", + "Favorites" : "Priljubljene", + "Home" : "Domači naslov", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Ni mogoče poslati datoteke {filename}, saj je to ali mapa ali pa je velikost datoteke 0 bajtov.", "Total file size {size1} exceeds upload limit {size2}" : "Skupna velikost {size1} presega omejitev velikosti {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Na voljo ni dovolj prostora. Velikost poslane datoteke je {size1}, na voljo pa je je {size2}.", @@ -44,13 +46,13 @@ "Could not create file" : "Ni mogoče ustvariti datoteke", "Could not create folder" : "Ni mogoče ustvariti mape", "Error fetching URL" : "Napaka pridobivanja naslova URL", - "Share" : "Souporaba", + "Rename" : "Preimenuj", "Delete" : "Izbriši", "Disconnect storage" : "Odklopi shrambo", "Unshare" : "Prekini souporabo", - "Delete permanently" : "Izbriši dokončno", - "Rename" : "Preimenuj", + "Select" : "Izberi", "Pending" : "V čakanju ...", + "Unable to determine date" : "Ni mogoče določiti datuma", "Error moving file." : "Napaka premikanja datoteke.", "Error moving file" : "Napaka premikanja datoteke", "Error" : "Napaka", @@ -69,7 +71,10 @@ "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Program za šifriranje je omogočen, vendar ni začet. Odjavite se in nato ponovno prijavite.", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Ni ustreznega osebnega ključa za program za šifriranje. Posodobite osebni ključ za dostop do šifriranih datotek med nastavitvami.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Šifriranje je onemogočeno, datoteke pa so še vedno šifrirane. Odšifrirajte jih med nastavitvami.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["","","",""], "{dirs} and {files}" : "{dirs} in {files}", + "Favorited" : "Označeno kot priljubljeno", + "Favorite" : "Priljubljene", "%s could not be renamed as it has been deleted" : "Datoteke %s ni mogoče preimenovati, ker je bila že prej izbrisana.", "%s could not be renamed" : "%s ni mogoče preimenovati", "Upload (max. %s)" : "Pošiljanje (omejitev %s)", @@ -77,6 +82,7 @@ "Maximum upload size" : "Največja velikost za pošiljanja", "max. possible: " : "največ mogoče:", "Save" : "Shrani", + "Settings" : "Nastavitve", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Uporabite naslov <a href=\"%s\" target=\"_blank\"> za dostop do datotek peko sistema WebDAV</a>.", "New" : "Novo", @@ -85,11 +91,17 @@ "New folder" : "Nova mapa", "Folder" : "Mapa", "From link" : "Iz povezave", - "Nothing in here. Upload something!" : "Tukaj še ni ničesar. Najprej je treba kakšno datoteko poslati v oblak!", + "Upload" : "Pošlji", + "Cancel upload" : "Prekliči pošiljanje", + "No files yet" : "Ni datotek", + "Upload some content or sync with your devices!" : "Uvozite vsebino ali pa omogočite usklajevanje z napravami!", + "Select all" : "izberi vse", "Download" : "Prejmi", "Upload too large" : "Prekoračenje omejitve velikosti", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Datoteke, ki jih želite poslati, presegajo največjo dovoljeno velikost na strežniku.", "Files are being scanned, please wait." : "Poteka preučevanje datotek, počakajte ...", - "Currently scanning" : "Poteka preverjanje" + "Currently scanning" : "Poteka preverjanje", + "No favorites" : "Ni priljubljenih", + "Files and folders you mark as favorite will show up here" : "Datoteke ali mape, ki so označene kot priljubljene, bodo izpisane tukaj." },"pluralForm" :"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);" }
\ No newline at end of file diff --git a/apps/files/l10n/sq.js b/apps/files/l10n/sq.js index 14caaa15140..b69335ed845 100644 --- a/apps/files/l10n/sq.js +++ b/apps/files/l10n/sq.js @@ -1,11 +1,24 @@ OC.L10N.register( "files", { + "Storage not available" : "Hapësira e memorizimit nuk është e disponueshme", + "Storage invalid" : "Hapësirë memorizimi e pavlefshme", "Unknown error" : "Gabim panjohur", "Could not move %s - File with this name already exists" : "E pa mundur zhvendosja e %s - ekziston nje skedar me te njetin emer", "Could not move %s" : "Nuk mund të zhvendoset %s", + "Permission denied" : "Nuk ka të drejtë", "File name cannot be empty." : "Emri i skedarit nuk mund të jetë bosh.", + "\"%s\" is an invalid file name." : "\"%s\" është i pavlefshëm si emër skedari.", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." : "Emër jo i vlefshëm, '\\', '/', '<', '>', ':', '\"', '|', '?' dhe '*' nuk lejohen.", + "The target folder has been moved or deleted." : "Dosja e destinacionit është zhvendosur ose fshirë.", + "The name %s is already used in the folder %s. Please choose a different name." : "Emri %s është i përdorur në dosjen %s. Ju lutem zgjidhni një emër tjetër.", + "Not a valid source" : "Burim i pavlefshëm", + "Server is not allowed to open URLs, please check the server configuration" : "Serverit nuk i lejohet të hapë URL, ju lutem kontrolloni konfigurimin e serverit", + "The file exceeds your quota by %s" : "Ky skedar tejkalon kuotën tuaj me %s", + "Error while downloading %s to %s" : "Gabim gjatë shkarkimit të %s në %s", + "Error when creating the file" : "Gabim gjatë krijimit të skedarit", + "Folder name cannot be empty." : "Emri i dosjes nuk mund të jetë bosh.", + "Error when creating the folder" : "Gabim gjatë krijimit të dosjes", "Unable to set upload directory." : "E pa mundur të vendoset dosja e ngarkimit", "Invalid Token" : "Shenjë e gabuar", "No file was uploaded. Unknown error" : "Asnjë skedar nuk u dërgua. Gabim i pa njohur", @@ -17,46 +30,70 @@ OC.L10N.register( "Missing a temporary folder" : "Mungon dosja e përkohshme", "Failed to write to disk" : "Dështoi shkrimi në disk", "Not enough storage available" : "Hapsira e arkivimit e pamjaftueshme", + "Upload failed. Could not find uploaded file" : "Ngarkimi dështoi. Nuk mund të gjendet skedari i ngarkuar", + "Upload failed. Could not get file info." : "Ngarkimi dështoi. Nuk mund të gjej informacion mbi skedarin.", "Invalid directory." : "Dosje e pavlefshme", "Files" : "Skedarë", + "All files" : "Të gjithë", + "Home" : "Shtëpi", + "Unable to upload {filename} as it is a directory or has 0 bytes" : "Nuk mund të ngarkohet {filename} sepse është dosje ose ka 0 byte", + "Total file size {size1} exceeds upload limit {size2}" : "Përmasa totale {size1} e skedarit tejkalon limitin e ngarkimit {size2}", + "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nuk ka hapësirë të mjaftueshme, ju po ngarkoni {size1} por vetëm {size2} është e lirë", "Upload cancelled." : "Ngarkimi u anullua", + "Could not get result from server." : "Nuk mund të merret ndonjë rezultat nga serveri.", "File upload is in progress. Leaving the page now will cancel the upload." : "Skedari duke u ngarkuar. Largimi nga faqja do të anullojë ngarkimin", "URL cannot be empty" : "URL-i nuk mund të jetë bosh", "{new_name} already exists" : "{new_name} është ekzistues ", + "Could not create file" : "Skedari nuk mund të krijohet", "Could not create folder" : "I pamundur krijimi i kartelës", - "Share" : "Ndaj", + "Error fetching URL" : "Gabim në ngarkimin e URL", + "Rename" : "Riemëro", "Delete" : "Fshi", + "Disconnect storage" : "Shkëput hapësirën e memorizimit", "Unshare" : "Hiq ndarjen", - "Delete permanently" : "Fshi përfundimisht", - "Rename" : "Riemëro", "Pending" : "Në vijim", + "Error moving file." : "Gabim në lëvizjen e skedarëve.", "Error moving file" : "Gabim lëvizjen dokumentave", "Error" : "Gabim", + "Could not rename file" : "Riemërtimi i skedarit nuk është i mundur", + "Error deleting file." : "Gabim gjatë fshirjes së skedarit.", "Name" : "Emri", "Size" : "Madhësia", "Modified" : "Ndryshuar", "_%n folder_::_%n folders_" : ["%n dosje","%n dosje"], "_%n file_::_%n files_" : ["%n skedar","%n skedarë"], + "You don’t have permission to upload or create files here" : "Ju nuk keni të drejta për të ngarkuar apo krijuar skedarë këtu", "_Uploading %n file_::_Uploading %n files_" : ["Po ngarkoj %n skedar","Po ngarkoj %n skedarë"], + "\"{name}\" is an invalid file name." : "\"{name}\" është emër i pavlefshëm.", "Your storage is full, files can not be updated or synced anymore!" : "Hapsira juaj e arkivimit është plot, skedarët nuk mund të përditësohen ose sinkronizohen!", "Your storage is almost full ({usedSpacePercent}%)" : "Hapsira juaj e arkivimit është pothuajse në fund ({usedSpacePercent}%)", + "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Aplikacioni i Shifrimit është i aktivizuar por çelësat tuaj nuk janë aktivizuar, ju lutem dilni dhe ri-hyni përseri në sistem", + "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Çelësi privat për Aplikacionin e Shifrimit është i pavlefshëm. Ju lutem përditësoni fjalëkalimin e çelësit tuaj privat në parametrat tuaj për të rimarrë qasje në skedarët tuaj të shifruar.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Kodifikimi u çaktivizua por skedarët tuaj vazhdojnë të jenë të kodifikuar. Ju lutem shkoni tek parametrat personale për të dekodifikuar skedarët tuaj.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "{dirs} and {files}" : "{dirs} dhe {files}", + "%s could not be renamed as it has been deleted" : "%s nuk mund të riemërtohet sepse është fshirë", "%s could not be renamed" : "Nuk është i mundur riemërtimi i %s", + "Upload (max. %s)" : "Ngarko (maks. %s)", "File handling" : "Trajtimi i Skedarëve", "Maximum upload size" : "Madhësia maksimale e nagarkimit", "max. possible: " : "maks i mundshëm", "Save" : "Ruaj", + "Settings" : "Konfigurime", "WebDAV" : "WebDAV", + "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Përdorni këtë adresë për <a href=\"%s\" target=\"_blank\">qasje në skedarët tuaj me anë të WebDAV</a>", "New" : "E re", + "New text file" : "Skedar i ri tekst", "Text file" : "Skedar tekst", "New folder" : "Dosje e're", "Folder" : "Dosje", "From link" : "Nga lidhja", - "Nothing in here. Upload something!" : "Këtu nuk ka asgje. Ngarko dicka", + "Upload" : "Ngarko", + "Cancel upload" : "Anullo ngarkimin", "Download" : "Shkarko", "Upload too large" : "Ngarkimi shumë i madh", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Skedarët që po mundoheni të ngarkoni e tejkalojnë madhësinë maksimale të lejuar nga serveri.", - "Files are being scanned, please wait." : "Skanerizimi i skedarit në proces. Ju lutem prisni." + "Files are being scanned, please wait." : "Skanerizimi i skedarit në proces. Ju lutem prisni.", + "Currently scanning" : "Duke skanuar" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/sq.json b/apps/files/l10n/sq.json index ec666c96ee4..3281d5bcd81 100644 --- a/apps/files/l10n/sq.json +++ b/apps/files/l10n/sq.json @@ -1,9 +1,22 @@ { "translations": { + "Storage not available" : "Hapësira e memorizimit nuk është e disponueshme", + "Storage invalid" : "Hapësirë memorizimi e pavlefshme", "Unknown error" : "Gabim panjohur", "Could not move %s - File with this name already exists" : "E pa mundur zhvendosja e %s - ekziston nje skedar me te njetin emer", "Could not move %s" : "Nuk mund të zhvendoset %s", + "Permission denied" : "Nuk ka të drejtë", "File name cannot be empty." : "Emri i skedarit nuk mund të jetë bosh.", + "\"%s\" is an invalid file name." : "\"%s\" është i pavlefshëm si emër skedari.", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." : "Emër jo i vlefshëm, '\\', '/', '<', '>', ':', '\"', '|', '?' dhe '*' nuk lejohen.", + "The target folder has been moved or deleted." : "Dosja e destinacionit është zhvendosur ose fshirë.", + "The name %s is already used in the folder %s. Please choose a different name." : "Emri %s është i përdorur në dosjen %s. Ju lutem zgjidhni një emër tjetër.", + "Not a valid source" : "Burim i pavlefshëm", + "Server is not allowed to open URLs, please check the server configuration" : "Serverit nuk i lejohet të hapë URL, ju lutem kontrolloni konfigurimin e serverit", + "The file exceeds your quota by %s" : "Ky skedar tejkalon kuotën tuaj me %s", + "Error while downloading %s to %s" : "Gabim gjatë shkarkimit të %s në %s", + "Error when creating the file" : "Gabim gjatë krijimit të skedarit", + "Folder name cannot be empty." : "Emri i dosjes nuk mund të jetë bosh.", + "Error when creating the folder" : "Gabim gjatë krijimit të dosjes", "Unable to set upload directory." : "E pa mundur të vendoset dosja e ngarkimit", "Invalid Token" : "Shenjë e gabuar", "No file was uploaded. Unknown error" : "Asnjë skedar nuk u dërgua. Gabim i pa njohur", @@ -15,46 +28,70 @@ "Missing a temporary folder" : "Mungon dosja e përkohshme", "Failed to write to disk" : "Dështoi shkrimi në disk", "Not enough storage available" : "Hapsira e arkivimit e pamjaftueshme", + "Upload failed. Could not find uploaded file" : "Ngarkimi dështoi. Nuk mund të gjendet skedari i ngarkuar", + "Upload failed. Could not get file info." : "Ngarkimi dështoi. Nuk mund të gjej informacion mbi skedarin.", "Invalid directory." : "Dosje e pavlefshme", "Files" : "Skedarë", + "All files" : "Të gjithë", + "Home" : "Shtëpi", + "Unable to upload {filename} as it is a directory or has 0 bytes" : "Nuk mund të ngarkohet {filename} sepse është dosje ose ka 0 byte", + "Total file size {size1} exceeds upload limit {size2}" : "Përmasa totale {size1} e skedarit tejkalon limitin e ngarkimit {size2}", + "Not enough free space, you are uploading {size1} but only {size2} is left" : "Nuk ka hapësirë të mjaftueshme, ju po ngarkoni {size1} por vetëm {size2} është e lirë", "Upload cancelled." : "Ngarkimi u anullua", + "Could not get result from server." : "Nuk mund të merret ndonjë rezultat nga serveri.", "File upload is in progress. Leaving the page now will cancel the upload." : "Skedari duke u ngarkuar. Largimi nga faqja do të anullojë ngarkimin", "URL cannot be empty" : "URL-i nuk mund të jetë bosh", "{new_name} already exists" : "{new_name} është ekzistues ", + "Could not create file" : "Skedari nuk mund të krijohet", "Could not create folder" : "I pamundur krijimi i kartelës", - "Share" : "Ndaj", + "Error fetching URL" : "Gabim në ngarkimin e URL", + "Rename" : "Riemëro", "Delete" : "Fshi", + "Disconnect storage" : "Shkëput hapësirën e memorizimit", "Unshare" : "Hiq ndarjen", - "Delete permanently" : "Fshi përfundimisht", - "Rename" : "Riemëro", "Pending" : "Në vijim", + "Error moving file." : "Gabim në lëvizjen e skedarëve.", "Error moving file" : "Gabim lëvizjen dokumentave", "Error" : "Gabim", + "Could not rename file" : "Riemërtimi i skedarit nuk është i mundur", + "Error deleting file." : "Gabim gjatë fshirjes së skedarit.", "Name" : "Emri", "Size" : "Madhësia", "Modified" : "Ndryshuar", "_%n folder_::_%n folders_" : ["%n dosje","%n dosje"], "_%n file_::_%n files_" : ["%n skedar","%n skedarë"], + "You don’t have permission to upload or create files here" : "Ju nuk keni të drejta për të ngarkuar apo krijuar skedarë këtu", "_Uploading %n file_::_Uploading %n files_" : ["Po ngarkoj %n skedar","Po ngarkoj %n skedarë"], + "\"{name}\" is an invalid file name." : "\"{name}\" është emër i pavlefshëm.", "Your storage is full, files can not be updated or synced anymore!" : "Hapsira juaj e arkivimit është plot, skedarët nuk mund të përditësohen ose sinkronizohen!", "Your storage is almost full ({usedSpacePercent}%)" : "Hapsira juaj e arkivimit është pothuajse në fund ({usedSpacePercent}%)", + "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Aplikacioni i Shifrimit është i aktivizuar por çelësat tuaj nuk janë aktivizuar, ju lutem dilni dhe ri-hyni përseri në sistem", + "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Çelësi privat për Aplikacionin e Shifrimit është i pavlefshëm. Ju lutem përditësoni fjalëkalimin e çelësit tuaj privat në parametrat tuaj për të rimarrë qasje në skedarët tuaj të shifruar.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Kodifikimi u çaktivizua por skedarët tuaj vazhdojnë të jenë të kodifikuar. Ju lutem shkoni tek parametrat personale për të dekodifikuar skedarët tuaj.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "{dirs} and {files}" : "{dirs} dhe {files}", + "%s could not be renamed as it has been deleted" : "%s nuk mund të riemërtohet sepse është fshirë", "%s could not be renamed" : "Nuk është i mundur riemërtimi i %s", + "Upload (max. %s)" : "Ngarko (maks. %s)", "File handling" : "Trajtimi i Skedarëve", "Maximum upload size" : "Madhësia maksimale e nagarkimit", "max. possible: " : "maks i mundshëm", "Save" : "Ruaj", + "Settings" : "Konfigurime", "WebDAV" : "WebDAV", + "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Përdorni këtë adresë për <a href=\"%s\" target=\"_blank\">qasje në skedarët tuaj me anë të WebDAV</a>", "New" : "E re", + "New text file" : "Skedar i ri tekst", "Text file" : "Skedar tekst", "New folder" : "Dosje e're", "Folder" : "Dosje", "From link" : "Nga lidhja", - "Nothing in here. Upload something!" : "Këtu nuk ka asgje. Ngarko dicka", + "Upload" : "Ngarko", + "Cancel upload" : "Anullo ngarkimin", "Download" : "Shkarko", "Upload too large" : "Ngarkimi shumë i madh", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Skedarët që po mundoheni të ngarkoni e tejkalojnë madhësinë maksimale të lejuar nga serveri.", - "Files are being scanned, please wait." : "Skanerizimi i skedarit në proces. Ju lutem prisni." + "Files are being scanned, please wait." : "Skanerizimi i skedarit në proces. Ju lutem prisni.", + "Currently scanning" : "Duke skanuar" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/sr.js b/apps/files/l10n/sr.js index a758c833ff5..7c226734943 100644 --- a/apps/files/l10n/sr.js +++ b/apps/files/l10n/sr.js @@ -16,14 +16,13 @@ OC.L10N.register( "Not enough storage available" : "Нема довољно простора", "Invalid directory." : "неисправна фасцикла.", "Files" : "Датотеке", + "Home" : "Кућа", "Upload cancelled." : "Отпремање је прекинуто.", "File upload is in progress. Leaving the page now will cancel the upload." : "Отпремање датотеке је у току. Ако сада напустите страницу, прекинућете отпремање.", "{new_name} already exists" : "{new_name} већ постоји", - "Share" : "Дели", + "Rename" : "Преименуј", "Delete" : "Обриши", "Unshare" : "Укини дељење", - "Delete permanently" : "Обриши за стално", - "Rename" : "Преименуј", "Pending" : "На чекању", "Error" : "Грешка", "Name" : "Име", @@ -34,16 +33,19 @@ OC.L10N.register( "_Uploading %n file_::_Uploading %n files_" : ["","",""], "Your storage is full, files can not be updated or synced anymore!" : "Ваше складиште је пуно. Датотеке више не могу бити ажуриране ни синхронизоване.", "Your storage is almost full ({usedSpacePercent}%)" : "Ваше складиште је скоро па пуно ({usedSpacePercent}%)", + "_ matches '{filter}'_::_ match '{filter}'_" : ["","",""], "File handling" : "Управљање датотекама", "Maximum upload size" : "Највећа величина датотеке", "max. possible: " : "највећа величина:", "Save" : "Сачувај", + "Settings" : "Поставке", "WebDAV" : "WebDAV", "New" : "Нова", "Text file" : "текстуална датотека", "Folder" : "фасцикла", "From link" : "Са везе", - "Nothing in here. Upload something!" : "Овде нема ничег. Отпремите нешто!", + "Upload" : "Отпреми", + "Cancel upload" : "Прекини отпремање", "Download" : "Преузми", "Upload too large" : "Датотека је превелика", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Датотеке које желите да отпремите прелазе ограничење у величини.", diff --git a/apps/files/l10n/sr.json b/apps/files/l10n/sr.json index a68c3f8ad8d..2452ac613dd 100644 --- a/apps/files/l10n/sr.json +++ b/apps/files/l10n/sr.json @@ -14,14 +14,13 @@ "Not enough storage available" : "Нема довољно простора", "Invalid directory." : "неисправна фасцикла.", "Files" : "Датотеке", + "Home" : "Кућа", "Upload cancelled." : "Отпремање је прекинуто.", "File upload is in progress. Leaving the page now will cancel the upload." : "Отпремање датотеке је у току. Ако сада напустите страницу, прекинућете отпремање.", "{new_name} already exists" : "{new_name} већ постоји", - "Share" : "Дели", + "Rename" : "Преименуј", "Delete" : "Обриши", "Unshare" : "Укини дељење", - "Delete permanently" : "Обриши за стално", - "Rename" : "Преименуј", "Pending" : "На чекању", "Error" : "Грешка", "Name" : "Име", @@ -32,16 +31,19 @@ "_Uploading %n file_::_Uploading %n files_" : ["","",""], "Your storage is full, files can not be updated or synced anymore!" : "Ваше складиште је пуно. Датотеке више не могу бити ажуриране ни синхронизоване.", "Your storage is almost full ({usedSpacePercent}%)" : "Ваше складиште је скоро па пуно ({usedSpacePercent}%)", + "_ matches '{filter}'_::_ match '{filter}'_" : ["","",""], "File handling" : "Управљање датотекама", "Maximum upload size" : "Највећа величина датотеке", "max. possible: " : "највећа величина:", "Save" : "Сачувај", + "Settings" : "Поставке", "WebDAV" : "WebDAV", "New" : "Нова", "Text file" : "текстуална датотека", "Folder" : "фасцикла", "From link" : "Са везе", - "Nothing in here. Upload something!" : "Овде нема ничег. Отпремите нешто!", + "Upload" : "Отпреми", + "Cancel upload" : "Прекини отпремање", "Download" : "Преузми", "Upload too large" : "Датотека је превелика", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Датотеке које желите да отпремите прелазе ограничење у величини.", diff --git a/apps/files/l10n/sr@latin.js b/apps/files/l10n/sr@latin.js index 2209b673abd..9552854edab 100644 --- a/apps/files/l10n/sr@latin.js +++ b/apps/files/l10n/sr@latin.js @@ -7,10 +7,10 @@ OC.L10N.register( "No file was uploaded" : "Nijedan fajl nije poslat", "Missing a temporary folder" : "Nedostaje privremena fascikla", "Files" : "Fajlovi", - "Share" : "Podeli", + "Home" : "Kuća", + "Rename" : "Preimenij", "Delete" : "Obriši", "Unshare" : "Ukljoni deljenje", - "Rename" : "Preimenij", "Error" : "Greška", "Name" : "Ime", "Size" : "Veličina", @@ -18,10 +18,12 @@ OC.L10N.register( "_%n folder_::_%n folders_" : ["","",""], "_%n file_::_%n files_" : ["","",""], "_Uploading %n file_::_Uploading %n files_" : ["","",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["","",""], "Maximum upload size" : "Maksimalna veličina pošiljke", "Save" : "Snimi", + "Settings" : "Podešavanja", "Folder" : "Direktorijum", - "Nothing in here. Upload something!" : "Ovde nema ničeg. Pošaljite nešto!", + "Upload" : "Pošalji", "Download" : "Preuzmi", "Upload too large" : "Pošiljka je prevelika", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Fajlovi koje želite da pošaljete prevazilaze ograničenje maksimalne veličine pošiljke na ovom serveru." diff --git a/apps/files/l10n/sr@latin.json b/apps/files/l10n/sr@latin.json index f130138bc55..5f0914cbb12 100644 --- a/apps/files/l10n/sr@latin.json +++ b/apps/files/l10n/sr@latin.json @@ -5,10 +5,10 @@ "No file was uploaded" : "Nijedan fajl nije poslat", "Missing a temporary folder" : "Nedostaje privremena fascikla", "Files" : "Fajlovi", - "Share" : "Podeli", + "Home" : "Kuća", + "Rename" : "Preimenij", "Delete" : "Obriši", "Unshare" : "Ukljoni deljenje", - "Rename" : "Preimenij", "Error" : "Greška", "Name" : "Ime", "Size" : "Veličina", @@ -16,10 +16,12 @@ "_%n folder_::_%n folders_" : ["","",""], "_%n file_::_%n files_" : ["","",""], "_Uploading %n file_::_Uploading %n files_" : ["","",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["","",""], "Maximum upload size" : "Maksimalna veličina pošiljke", "Save" : "Snimi", + "Settings" : "Podešavanja", "Folder" : "Direktorijum", - "Nothing in here. Upload something!" : "Ovde nema ničeg. Pošaljite nešto!", + "Upload" : "Pošalji", "Download" : "Preuzmi", "Upload too large" : "Pošiljka je prevelika", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Fajlovi koje želite da pošaljete prevazilaze ograničenje maksimalne veličine pošiljke na ovom serveru." diff --git a/apps/files/l10n/su.js b/apps/files/l10n/su.js index d1bbfca2dd4..8c5bb3bc949 100644 --- a/apps/files/l10n/su.js +++ b/apps/files/l10n/su.js @@ -3,6 +3,7 @@ OC.L10N.register( { "_%n folder_::_%n folders_" : [""], "_%n file_::_%n files_" : [""], - "_Uploading %n file_::_Uploading %n files_" : [""] + "_Uploading %n file_::_Uploading %n files_" : [""], + "_ matches '{filter}'_::_ match '{filter}'_" : [""] }, "nplurals=1; plural=0;"); diff --git a/apps/files/l10n/su.json b/apps/files/l10n/su.json index e493054d78a..e03a2942ff2 100644 --- a/apps/files/l10n/su.json +++ b/apps/files/l10n/su.json @@ -1,6 +1,7 @@ { "translations": { "_%n folder_::_%n folders_" : [""], "_%n file_::_%n files_" : [""], - "_Uploading %n file_::_Uploading %n files_" : [""] + "_Uploading %n file_::_Uploading %n files_" : [""], + "_ matches '{filter}'_::_ match '{filter}'_" : [""] },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/files/l10n/sv.js b/apps/files/l10n/sv.js index 234731fec2b..f0981c9981b 100644 --- a/apps/files/l10n/sv.js +++ b/apps/files/l10n/sv.js @@ -1,9 +1,12 @@ OC.L10N.register( "files", { + "Storage not available" : "Lagring inte tillgänglig", + "Storage invalid" : "Lagring ogiltig", "Unknown error" : "Okänt fel", "Could not move %s - File with this name already exists" : "Kunde inte flytta %s - Det finns redan en fil med detta namn", "Could not move %s" : "Kan inte flytta %s", + "Permission denied" : "Behörighet nekad.", "File name cannot be empty." : "Filnamn kan inte vara tomt.", "\"%s\" is an invalid file name." : "\"%s\" är ett ogiltigt filnamn.", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." : "Ogiltigt namn, '\\', '/', '<', '>', ':', '\"', '|', '?' och '*' är inte tillåtet.", @@ -11,6 +14,7 @@ OC.L10N.register( "The name %s is already used in the folder %s. Please choose a different name." : "Namnet %s används redan i katalogen %s. Välj ett annat namn.", "Not a valid source" : "Inte en giltig källa", "Server is not allowed to open URLs, please check the server configuration" : "Servern är inte tillåten att öppna URL:er, vänligen kontrollera server konfigurationen", + "The file exceeds your quota by %s" : "Filen överstiger din tilldelade kvot med %s", "Error while downloading %s to %s" : "Fel under nerladdning från %s till %s", "Error when creating the file" : "Fel under skapande utav filen", "Folder name cannot be empty." : "Katalognamn kan ej vara tomt.", @@ -31,6 +35,8 @@ OC.L10N.register( "Invalid directory." : "Felaktig mapp.", "Files" : "Filer", "All files" : "Alla filer", + "Favorites" : "Favoriter", + "Home" : "Hem", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Kan inte ladda upp {filename} eftersom den antingen är en mapp eller har 0 bytes.", "Total file size {size1} exceeds upload limit {size2}" : "Totala filstorleken {size1} överskrider uppladdningsgränsen {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Inte tillräckligt med ledigt utrymme, du laddar upp {size1} men endast {size2} finns kvar.", @@ -42,12 +48,13 @@ OC.L10N.register( "Could not create file" : "Kunde ej skapa fil", "Could not create folder" : "Kunde ej skapa katalog", "Error fetching URL" : "Fel vid hämtning av URL", - "Share" : "Dela", + "Rename" : "Byt namn", "Delete" : "Radera", + "Disconnect storage" : "Koppla bort lagring", "Unshare" : "Sluta dela", - "Delete permanently" : "Radera permanent", - "Rename" : "Byt namn", + "Select" : "Välj", "Pending" : "Väntar", + "Unable to determine date" : "Misslyckades avgöra datum", "Error moving file." : "Fel vid flytt av fil.", "Error moving file" : "Fel uppstod vid flyttning av fil", "Error" : "Fel", @@ -66,13 +73,18 @@ OC.L10N.register( "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Krypteringsprogrammet är aktiverat men dina nycklar är inte initierade. Vänligen logga ut och in igen", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Ogiltig privat nyckel i krypteringsprogrammet. Vänligen uppdatera lösenordet till din privata nyckel under dina personliga inställningar för att återfå tillgång till dina krypterade filer.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Kryptering inaktiverades men dina filer är fortfarande krypterade. Vänligen gå till sidan för dina personliga inställningar för att dekryptera dina filer.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "{dirs} and {files}" : "{dirs} och {files}", + "Favorited" : "Favoritiserad", + "Favorite" : "Favorit", + "%s could not be renamed as it has been deleted" : "%s kan inte döpas om eftersom den har raderats", "%s could not be renamed" : "%s kunde inte namnändras", "Upload (max. %s)" : "Ladda upp (max. %s)", "File handling" : "Filhantering", "Maximum upload size" : "Maximal storlek att ladda upp", "max. possible: " : "max. möjligt:", "Save" : "Spara", + "Settings" : "Inställningar", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Använd denna adress till <a href=\"%s\" target=\"_blank\">nå dina Filer via WebDAV</a>", "New" : "Ny", @@ -81,11 +93,17 @@ OC.L10N.register( "New folder" : "Ny mapp", "Folder" : "Mapp", "From link" : "Från länk", - "Nothing in here. Upload something!" : "Ingenting här. Ladda upp något!", + "Upload" : "Ladda upp", + "Cancel upload" : "Avbryt uppladdning", + "No files yet" : "Inga filer ännu", + "Upload some content or sync with your devices!" : "Ladda upp innehåll eller synkronisera med dina enheter!", + "Select all" : "Välj allt", "Download" : "Ladda ner", "Upload too large" : "För stor uppladdning", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Filerna du försöker ladda upp överstiger den maximala storleken för filöverföringar på servern.", "Files are being scanned, please wait." : "Filer skannas, var god vänta", - "Currently scanning" : "sökning pågår" + "Currently scanning" : "sökning pågår", + "No favorites" : "Inga favoriter", + "Files and folders you mark as favorite will show up here" : "Filer och mappar du markerat som favoriter kommer visas här" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/sv.json b/apps/files/l10n/sv.json index 36aa5d5984f..72cf045a8d2 100644 --- a/apps/files/l10n/sv.json +++ b/apps/files/l10n/sv.json @@ -1,7 +1,10 @@ { "translations": { + "Storage not available" : "Lagring inte tillgänglig", + "Storage invalid" : "Lagring ogiltig", "Unknown error" : "Okänt fel", "Could not move %s - File with this name already exists" : "Kunde inte flytta %s - Det finns redan en fil med detta namn", "Could not move %s" : "Kan inte flytta %s", + "Permission denied" : "Behörighet nekad.", "File name cannot be empty." : "Filnamn kan inte vara tomt.", "\"%s\" is an invalid file name." : "\"%s\" är ett ogiltigt filnamn.", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." : "Ogiltigt namn, '\\', '/', '<', '>', ':', '\"', '|', '?' och '*' är inte tillåtet.", @@ -9,6 +12,7 @@ "The name %s is already used in the folder %s. Please choose a different name." : "Namnet %s används redan i katalogen %s. Välj ett annat namn.", "Not a valid source" : "Inte en giltig källa", "Server is not allowed to open URLs, please check the server configuration" : "Servern är inte tillåten att öppna URL:er, vänligen kontrollera server konfigurationen", + "The file exceeds your quota by %s" : "Filen överstiger din tilldelade kvot med %s", "Error while downloading %s to %s" : "Fel under nerladdning från %s till %s", "Error when creating the file" : "Fel under skapande utav filen", "Folder name cannot be empty." : "Katalognamn kan ej vara tomt.", @@ -29,6 +33,8 @@ "Invalid directory." : "Felaktig mapp.", "Files" : "Filer", "All files" : "Alla filer", + "Favorites" : "Favoriter", + "Home" : "Hem", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Kan inte ladda upp {filename} eftersom den antingen är en mapp eller har 0 bytes.", "Total file size {size1} exceeds upload limit {size2}" : "Totala filstorleken {size1} överskrider uppladdningsgränsen {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Inte tillräckligt med ledigt utrymme, du laddar upp {size1} men endast {size2} finns kvar.", @@ -40,12 +46,13 @@ "Could not create file" : "Kunde ej skapa fil", "Could not create folder" : "Kunde ej skapa katalog", "Error fetching URL" : "Fel vid hämtning av URL", - "Share" : "Dela", + "Rename" : "Byt namn", "Delete" : "Radera", + "Disconnect storage" : "Koppla bort lagring", "Unshare" : "Sluta dela", - "Delete permanently" : "Radera permanent", - "Rename" : "Byt namn", + "Select" : "Välj", "Pending" : "Väntar", + "Unable to determine date" : "Misslyckades avgöra datum", "Error moving file." : "Fel vid flytt av fil.", "Error moving file" : "Fel uppstod vid flyttning av fil", "Error" : "Fel", @@ -64,13 +71,18 @@ "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Krypteringsprogrammet är aktiverat men dina nycklar är inte initierade. Vänligen logga ut och in igen", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Ogiltig privat nyckel i krypteringsprogrammet. Vänligen uppdatera lösenordet till din privata nyckel under dina personliga inställningar för att återfå tillgång till dina krypterade filer.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Kryptering inaktiverades men dina filer är fortfarande krypterade. Vänligen gå till sidan för dina personliga inställningar för att dekryptera dina filer.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "{dirs} and {files}" : "{dirs} och {files}", + "Favorited" : "Favoritiserad", + "Favorite" : "Favorit", + "%s could not be renamed as it has been deleted" : "%s kan inte döpas om eftersom den har raderats", "%s could not be renamed" : "%s kunde inte namnändras", "Upload (max. %s)" : "Ladda upp (max. %s)", "File handling" : "Filhantering", "Maximum upload size" : "Maximal storlek att ladda upp", "max. possible: " : "max. möjligt:", "Save" : "Spara", + "Settings" : "Inställningar", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Använd denna adress till <a href=\"%s\" target=\"_blank\">nå dina Filer via WebDAV</a>", "New" : "Ny", @@ -79,11 +91,17 @@ "New folder" : "Ny mapp", "Folder" : "Mapp", "From link" : "Från länk", - "Nothing in here. Upload something!" : "Ingenting här. Ladda upp något!", + "Upload" : "Ladda upp", + "Cancel upload" : "Avbryt uppladdning", + "No files yet" : "Inga filer ännu", + "Upload some content or sync with your devices!" : "Ladda upp innehåll eller synkronisera med dina enheter!", + "Select all" : "Välj allt", "Download" : "Ladda ner", "Upload too large" : "För stor uppladdning", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Filerna du försöker ladda upp överstiger den maximala storleken för filöverföringar på servern.", "Files are being scanned, please wait." : "Filer skannas, var god vänta", - "Currently scanning" : "sökning pågår" + "Currently scanning" : "sökning pågår", + "No favorites" : "Inga favoriter", + "Files and folders you mark as favorite will show up here" : "Filer och mappar du markerat som favoriter kommer visas här" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/sw_KE.js b/apps/files/l10n/sw_KE.js index 329844854f1..560042b3efd 100644 --- a/apps/files/l10n/sw_KE.js +++ b/apps/files/l10n/sw_KE.js @@ -3,6 +3,7 @@ OC.L10N.register( { "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""] }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/sw_KE.json b/apps/files/l10n/sw_KE.json index 37156658a86..4cfa6a31b6e 100644 --- a/apps/files/l10n/sw_KE.json +++ b/apps/files/l10n/sw_KE.json @@ -1,6 +1,7 @@ { "translations": { "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""] },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/ta_IN.js b/apps/files/l10n/ta_IN.js index b7aaa25ee52..143c52d6e32 100644 --- a/apps/files/l10n/ta_IN.js +++ b/apps/files/l10n/ta_IN.js @@ -5,6 +5,9 @@ OC.L10N.register( "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], "_Uploading %n file_::_Uploading %n files_" : ["",""], - "New folder" : "புதிய கோப்புறை" + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], + "Settings" : "அமைப்புகள்", + "New folder" : "புதிய கோப்புறை", + "Upload" : "பதிவேற்று" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/ta_IN.json b/apps/files/l10n/ta_IN.json index 955320c6c94..ec2ffb63ab3 100644 --- a/apps/files/l10n/ta_IN.json +++ b/apps/files/l10n/ta_IN.json @@ -3,6 +3,9 @@ "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], "_Uploading %n file_::_Uploading %n files_" : ["",""], - "New folder" : "புதிய கோப்புறை" + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], + "Settings" : "அமைப்புகள்", + "New folder" : "புதிய கோப்புறை", + "Upload" : "பதிவேற்று" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/ta_LK.js b/apps/files/l10n/ta_LK.js index 2014dd6ceb9..a73716e10ee 100644 --- a/apps/files/l10n/ta_LK.js +++ b/apps/files/l10n/ta_LK.js @@ -10,13 +10,15 @@ OC.L10N.register( "Missing a temporary folder" : "ஒரு தற்காலிகமான கோப்புறையை காணவில்லை", "Failed to write to disk" : "வட்டில் எழுத முடியவில்லை", "Files" : "கோப்புகள்", + "Favorites" : "விருப்பங்கள்", + "Home" : "அகம்", "Upload cancelled." : "பதிவேற்றல் இரத்து செய்யப்பட்டுள்ளது", "File upload is in progress. Leaving the page now will cancel the upload." : "கோப்பு பதிவேற்றம் செயல்பாட்டில் உள்ளது. இந்தப் பக்கத்திலிருந்து வெறியேறுவதானது பதிவேற்றலை இரத்து செய்யும்.", "{new_name} already exists" : "{new_name} ஏற்கனவே உள்ளது", - "Share" : "பகிர்வு", + "Rename" : "பெயர்மாற்றம்", "Delete" : "நீக்குக", "Unshare" : "பகிரப்படாதது", - "Rename" : "பெயர்மாற்றம்", + "Select" : "தெரிக", "Pending" : "நிலுவையிலுள்ள", "Error" : "வழு", "Name" : "பெயர்", @@ -25,15 +27,19 @@ OC.L10N.register( "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], + "Favorite" : "விருப்பமான", "File handling" : "கோப்பு கையாளுதல்", "Maximum upload size" : "பதிவேற்றக்கூடிய ஆகக்கூடிய அளவு ", "max. possible: " : "ஆகக் கூடியது:", "Save" : "சேமிக்க ", + "Settings" : "அமைப்புகள்", "New" : "புதிய", "Text file" : "கோப்பு உரை", "Folder" : "கோப்புறை", "From link" : "இணைப்பிலிருந்து", - "Nothing in here. Upload something!" : "இங்கு ஒன்றும் இல்லை. ஏதாவது பதிவேற்றுக!", + "Upload" : "பதிவேற்றுக", + "Cancel upload" : "பதிவேற்றலை இரத்து செய்க", "Download" : "பதிவிறக்குக", "Upload too large" : "பதிவேற்றல் மிகப்பெரியது", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "நீங்கள் பதிவேற்ற முயற்சிக்கும் கோப்புகளானது இந்த சேவையகத்தில் கோப்பு பதிவேற்றக்கூடிய ஆகக்கூடிய அளவிலும் கூடியது.", diff --git a/apps/files/l10n/ta_LK.json b/apps/files/l10n/ta_LK.json index c8426f9eb32..6b916f959f9 100644 --- a/apps/files/l10n/ta_LK.json +++ b/apps/files/l10n/ta_LK.json @@ -8,13 +8,15 @@ "Missing a temporary folder" : "ஒரு தற்காலிகமான கோப்புறையை காணவில்லை", "Failed to write to disk" : "வட்டில் எழுத முடியவில்லை", "Files" : "கோப்புகள்", + "Favorites" : "விருப்பங்கள்", + "Home" : "அகம்", "Upload cancelled." : "பதிவேற்றல் இரத்து செய்யப்பட்டுள்ளது", "File upload is in progress. Leaving the page now will cancel the upload." : "கோப்பு பதிவேற்றம் செயல்பாட்டில் உள்ளது. இந்தப் பக்கத்திலிருந்து வெறியேறுவதானது பதிவேற்றலை இரத்து செய்யும்.", "{new_name} already exists" : "{new_name} ஏற்கனவே உள்ளது", - "Share" : "பகிர்வு", + "Rename" : "பெயர்மாற்றம்", "Delete" : "நீக்குக", "Unshare" : "பகிரப்படாதது", - "Rename" : "பெயர்மாற்றம்", + "Select" : "தெரிக", "Pending" : "நிலுவையிலுள்ள", "Error" : "வழு", "Name" : "பெயர்", @@ -23,15 +25,19 @@ "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], + "Favorite" : "விருப்பமான", "File handling" : "கோப்பு கையாளுதல்", "Maximum upload size" : "பதிவேற்றக்கூடிய ஆகக்கூடிய அளவு ", "max. possible: " : "ஆகக் கூடியது:", "Save" : "சேமிக்க ", + "Settings" : "அமைப்புகள்", "New" : "புதிய", "Text file" : "கோப்பு உரை", "Folder" : "கோப்புறை", "From link" : "இணைப்பிலிருந்து", - "Nothing in here. Upload something!" : "இங்கு ஒன்றும் இல்லை. ஏதாவது பதிவேற்றுக!", + "Upload" : "பதிவேற்றுக", + "Cancel upload" : "பதிவேற்றலை இரத்து செய்க", "Download" : "பதிவிறக்குக", "Upload too large" : "பதிவேற்றல் மிகப்பெரியது", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "நீங்கள் பதிவேற்ற முயற்சிக்கும் கோப்புகளானது இந்த சேவையகத்தில் கோப்பு பதிவேற்றக்கூடிய ஆகக்கூடிய அளவிலும் கூடியது.", diff --git a/apps/files/l10n/te.js b/apps/files/l10n/te.js index 2d0a3ed3d9a..9dfaccd9380 100644 --- a/apps/files/l10n/te.js +++ b/apps/files/l10n/te.js @@ -2,14 +2,15 @@ OC.L10N.register( "files", { "Delete" : "తొలగించు", - "Delete permanently" : "శాశ్వతంగా తొలగించు", "Error" : "పొరపాటు", "Name" : "పేరు", "Size" : "పరిమాణం", "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "Save" : "భద్రపరచు", + "Settings" : "అమరికలు", "New folder" : "కొత్త సంచయం", "Folder" : "సంచయం" }, diff --git a/apps/files/l10n/te.json b/apps/files/l10n/te.json index efa952f212a..63b79d97a11 100644 --- a/apps/files/l10n/te.json +++ b/apps/files/l10n/te.json @@ -1,13 +1,14 @@ { "translations": { "Delete" : "తొలగించు", - "Delete permanently" : "శాశ్వతంగా తొలగించు", "Error" : "పొరపాటు", "Name" : "పేరు", "Size" : "పరిమాణం", "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "Save" : "భద్రపరచు", + "Settings" : "అమరికలు", "New folder" : "కొత్త సంచయం", "Folder" : "సంచయం" },"pluralForm" :"nplurals=2; plural=(n != 1);" diff --git a/apps/files/l10n/tg_TJ.js b/apps/files/l10n/tg_TJ.js index 329844854f1..560042b3efd 100644 --- a/apps/files/l10n/tg_TJ.js +++ b/apps/files/l10n/tg_TJ.js @@ -3,6 +3,7 @@ OC.L10N.register( { "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""] }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/tg_TJ.json b/apps/files/l10n/tg_TJ.json index 37156658a86..4cfa6a31b6e 100644 --- a/apps/files/l10n/tg_TJ.json +++ b/apps/files/l10n/tg_TJ.json @@ -1,6 +1,7 @@ { "translations": { "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""] },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/th_TH.js b/apps/files/l10n/th_TH.js index 039d4562a7a..81915a809bf 100644 --- a/apps/files/l10n/th_TH.js +++ b/apps/files/l10n/th_TH.js @@ -17,13 +17,15 @@ OC.L10N.register( "Not enough storage available" : "เหลือพื้นที่ไม่เพียงสำหรับใช้งาน", "Invalid directory." : "ไดเร็กทอรี่ไม่ถูกต้อง", "Files" : "ไฟล์", + "Favorites" : "รายการโปรด", + "Home" : "บ้าน", "Upload cancelled." : "การอัพโหลดถูกยกเลิก", "File upload is in progress. Leaving the page now will cancel the upload." : "การอัพโหลดไฟล์กำลังอยู่ในระหว่างดำเนินการ การออกจากหน้าเว็บนี้จะทำให้การอัพโหลดถูกยกเลิก", "{new_name} already exists" : "{new_name} มีอยู่แล้วในระบบ", - "Share" : "แชร์", + "Rename" : "เปลี่ยนชื่อ", "Delete" : "ลบ", "Unshare" : "ยกเลิกการแชร์", - "Rename" : "เปลี่ยนชื่อ", + "Select" : "เลือก", "Pending" : "อยู่ระหว่างดำเนินการ", "Error" : "ข้อผิดพลาด", "Name" : "ชื่อ", @@ -34,17 +36,21 @@ OC.L10N.register( "_Uploading %n file_::_Uploading %n files_" : [""], "Your storage is full, files can not be updated or synced anymore!" : "พื้นที่จัดเก็บข้อมูลของคุณเต็มแล้ว ไม่สามารถอัพเดทหรือผสานไฟล์ต่างๆได้อีกต่อไป", "Your storage is almost full ({usedSpacePercent}%)" : "พื้นที่จัดเก็บข้อมูลของคุณใกล้เต็มแล้ว ({usedSpacePercent}%)", + "_ matches '{filter}'_::_ match '{filter}'_" : [""], + "Favorite" : "รายการโปรด", "File handling" : "การจัดกาไฟล์", "Maximum upload size" : "ขนาดไฟล์สูงสุดที่อัพโหลดได้", "max. possible: " : "จำนวนสูงสุดที่สามารถทำได้: ", "Save" : "บันทึก", + "Settings" : "ตั้งค่า", "WebDAV" : "WebDAV", "New" : "อัพโหลดไฟล์ใหม่", "Text file" : "ไฟล์ข้อความ", "New folder" : "โฟลเดอร์ใหม่", "Folder" : "แฟ้มเอกสาร", "From link" : "จากลิงก์", - "Nothing in here. Upload something!" : "ยังไม่มีไฟล์ใดๆอยู่ที่นี่ กรุณาอัพโหลดไฟล์!", + "Upload" : "อัพโหลด", + "Cancel upload" : "ยกเลิกการอัพโหลด", "Download" : "ดาวน์โหลด", "Upload too large" : "ไฟล์ที่อัพโหลดมีขนาดใหญ่เกินไป", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "ไฟล์ที่คุณพยายามที่จะอัพโหลดมีขนาดเกินกว่าขนาดสูงสุดที่กำหนดไว้ให้อัพโหลดได้สำหรับเซิร์ฟเวอร์นี้", diff --git a/apps/files/l10n/th_TH.json b/apps/files/l10n/th_TH.json index bd4afed4aec..41c14cbd68a 100644 --- a/apps/files/l10n/th_TH.json +++ b/apps/files/l10n/th_TH.json @@ -15,13 +15,15 @@ "Not enough storage available" : "เหลือพื้นที่ไม่เพียงสำหรับใช้งาน", "Invalid directory." : "ไดเร็กทอรี่ไม่ถูกต้อง", "Files" : "ไฟล์", + "Favorites" : "รายการโปรด", + "Home" : "บ้าน", "Upload cancelled." : "การอัพโหลดถูกยกเลิก", "File upload is in progress. Leaving the page now will cancel the upload." : "การอัพโหลดไฟล์กำลังอยู่ในระหว่างดำเนินการ การออกจากหน้าเว็บนี้จะทำให้การอัพโหลดถูกยกเลิก", "{new_name} already exists" : "{new_name} มีอยู่แล้วในระบบ", - "Share" : "แชร์", + "Rename" : "เปลี่ยนชื่อ", "Delete" : "ลบ", "Unshare" : "ยกเลิกการแชร์", - "Rename" : "เปลี่ยนชื่อ", + "Select" : "เลือก", "Pending" : "อยู่ระหว่างดำเนินการ", "Error" : "ข้อผิดพลาด", "Name" : "ชื่อ", @@ -32,17 +34,21 @@ "_Uploading %n file_::_Uploading %n files_" : [""], "Your storage is full, files can not be updated or synced anymore!" : "พื้นที่จัดเก็บข้อมูลของคุณเต็มแล้ว ไม่สามารถอัพเดทหรือผสานไฟล์ต่างๆได้อีกต่อไป", "Your storage is almost full ({usedSpacePercent}%)" : "พื้นที่จัดเก็บข้อมูลของคุณใกล้เต็มแล้ว ({usedSpacePercent}%)", + "_ matches '{filter}'_::_ match '{filter}'_" : [""], + "Favorite" : "รายการโปรด", "File handling" : "การจัดกาไฟล์", "Maximum upload size" : "ขนาดไฟล์สูงสุดที่อัพโหลดได้", "max. possible: " : "จำนวนสูงสุดที่สามารถทำได้: ", "Save" : "บันทึก", + "Settings" : "ตั้งค่า", "WebDAV" : "WebDAV", "New" : "อัพโหลดไฟล์ใหม่", "Text file" : "ไฟล์ข้อความ", "New folder" : "โฟลเดอร์ใหม่", "Folder" : "แฟ้มเอกสาร", "From link" : "จากลิงก์", - "Nothing in here. Upload something!" : "ยังไม่มีไฟล์ใดๆอยู่ที่นี่ กรุณาอัพโหลดไฟล์!", + "Upload" : "อัพโหลด", + "Cancel upload" : "ยกเลิกการอัพโหลด", "Download" : "ดาวน์โหลด", "Upload too large" : "ไฟล์ที่อัพโหลดมีขนาดใหญ่เกินไป", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "ไฟล์ที่คุณพยายามที่จะอัพโหลดมีขนาดเกินกว่าขนาดสูงสุดที่กำหนดไว้ให้อัพโหลดได้สำหรับเซิร์ฟเวอร์นี้", diff --git a/apps/files/l10n/tl_PH.js b/apps/files/l10n/tl_PH.js index f085469f731..deae17398bd 100644 --- a/apps/files/l10n/tl_PH.js +++ b/apps/files/l10n/tl_PH.js @@ -3,6 +3,7 @@ OC.L10N.register( { "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""] }, "nplurals=2; plural=(n > 1);"); diff --git a/apps/files/l10n/tl_PH.json b/apps/files/l10n/tl_PH.json index ba9792477cd..dd9cfe83135 100644 --- a/apps/files/l10n/tl_PH.json +++ b/apps/files/l10n/tl_PH.json @@ -1,6 +1,7 @@ { "translations": { "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""] },"pluralForm" :"nplurals=2; plural=(n > 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/tr.js b/apps/files/l10n/tr.js index 81eaf632112..ff2ae40361d 100644 --- a/apps/files/l10n/tr.js +++ b/apps/files/l10n/tr.js @@ -35,6 +35,8 @@ OC.L10N.register( "Invalid directory." : "Geçersiz dizin.", "Files" : "Dosyalar", "All files" : "Tüm dosyalar", + "Favorites" : "Sık Kullanılanlar", + "Home" : "Ev", "Unable to upload {filename} as it is a directory or has 0 bytes" : "{filename} bir dizin veya 0 bayt olduğundan yüklenemedi", "Total file size {size1} exceeds upload limit {size2}" : "Toplam dosya boyutu {size1}, {size2} gönderme sınırını aşıyor", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Yeterince boş alan yok. Gönderdiğiniz boyut {size1} ancak {size2} alan mevcut", @@ -46,12 +48,11 @@ OC.L10N.register( "Could not create file" : "Dosya oluşturulamadı", "Could not create folder" : "Klasör oluşturulamadı", "Error fetching URL" : "Adres getirilirken hata", - "Share" : "Paylaş", + "Rename" : "Yeniden adlandır", "Delete" : "Sil", "Disconnect storage" : "Depolama bağlantısını kes", "Unshare" : "Paylaşmayı Kaldır", - "Delete permanently" : "Kalıcı olarak sil", - "Rename" : "Yeniden adlandır", + "Select" : "Seç", "Pending" : "Bekliyor", "Error moving file." : "Dosya taşıma hatası.", "Error moving file" : "Dosya taşıma hatası", @@ -71,7 +72,9 @@ OC.L10N.register( "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Şifreleme Uygulaması etkin ancak anahtarlarınız başlatılmamış. Lütfen oturumu kapatıp yeniden açın", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Şifreleme Uygulaması için geçersiz özel anahtar. Lütfen şifreli dosyalarınıza erişimi tekrar kazanabilmek için kişisel ayarlarınızdan özel anahtar parolanızı güncelleyin.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Şifreleme işlemi durduruldu ancak dosyalarınız hala şifreli. Dosyalarınızın şifrelemesini kaldırmak için lütfen kişisel ayarlar kısmına geçin.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "{dirs} and {files}" : "{dirs} ve {files}", + "Favorite" : "Sık Kullanılan", "%s could not be renamed as it has been deleted" : "%s, silindiği için adlandırılamadı", "%s could not be renamed" : "%s yeniden adlandırılamadı", "Upload (max. %s)" : "Yükle (azami: %s)", @@ -79,6 +82,7 @@ OC.L10N.register( "Maximum upload size" : "Azami yükleme boyutu", "max. possible: " : "mümkün olan en fazla: ", "Save" : "Kaydet", + "Settings" : "Ayarlar", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "<a href=\"%s\" target=\"_blank\">Dosyalarınıza WebDAV aracılığıyla erişmek için</a> bu adresi kullanın", "New" : "Yeni", @@ -87,7 +91,8 @@ OC.L10N.register( "New folder" : "Yeni klasör", "Folder" : "Klasör", "From link" : "Bağlantıdan", - "Nothing in here. Upload something!" : "Burada hiçbir şey yok. Bir şeyler yükleyin!", + "Upload" : "Yükle", + "Cancel upload" : "Yüklemeyi iptal et", "Download" : "İndir", "Upload too large" : "Yükleme çok büyük", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Yüklemeye çalıştığınız dosyalar bu sunucudaki azami yükleme boyutunu aşıyor.", diff --git a/apps/files/l10n/tr.json b/apps/files/l10n/tr.json index 41ba10c4e7f..f70df4df7d1 100644 --- a/apps/files/l10n/tr.json +++ b/apps/files/l10n/tr.json @@ -33,6 +33,8 @@ "Invalid directory." : "Geçersiz dizin.", "Files" : "Dosyalar", "All files" : "Tüm dosyalar", + "Favorites" : "Sık Kullanılanlar", + "Home" : "Ev", "Unable to upload {filename} as it is a directory or has 0 bytes" : "{filename} bir dizin veya 0 bayt olduğundan yüklenemedi", "Total file size {size1} exceeds upload limit {size2}" : "Toplam dosya boyutu {size1}, {size2} gönderme sınırını aşıyor", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Yeterince boş alan yok. Gönderdiğiniz boyut {size1} ancak {size2} alan mevcut", @@ -44,12 +46,11 @@ "Could not create file" : "Dosya oluşturulamadı", "Could not create folder" : "Klasör oluşturulamadı", "Error fetching URL" : "Adres getirilirken hata", - "Share" : "Paylaş", + "Rename" : "Yeniden adlandır", "Delete" : "Sil", "Disconnect storage" : "Depolama bağlantısını kes", "Unshare" : "Paylaşmayı Kaldır", - "Delete permanently" : "Kalıcı olarak sil", - "Rename" : "Yeniden adlandır", + "Select" : "Seç", "Pending" : "Bekliyor", "Error moving file." : "Dosya taşıma hatası.", "Error moving file" : "Dosya taşıma hatası", @@ -69,7 +70,9 @@ "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Şifreleme Uygulaması etkin ancak anahtarlarınız başlatılmamış. Lütfen oturumu kapatıp yeniden açın", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Şifreleme Uygulaması için geçersiz özel anahtar. Lütfen şifreli dosyalarınıza erişimi tekrar kazanabilmek için kişisel ayarlarınızdan özel anahtar parolanızı güncelleyin.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Şifreleme işlemi durduruldu ancak dosyalarınız hala şifreli. Dosyalarınızın şifrelemesini kaldırmak için lütfen kişisel ayarlar kısmına geçin.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "{dirs} and {files}" : "{dirs} ve {files}", + "Favorite" : "Sık Kullanılan", "%s could not be renamed as it has been deleted" : "%s, silindiği için adlandırılamadı", "%s could not be renamed" : "%s yeniden adlandırılamadı", "Upload (max. %s)" : "Yükle (azami: %s)", @@ -77,6 +80,7 @@ "Maximum upload size" : "Azami yükleme boyutu", "max. possible: " : "mümkün olan en fazla: ", "Save" : "Kaydet", + "Settings" : "Ayarlar", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "<a href=\"%s\" target=\"_blank\">Dosyalarınıza WebDAV aracılığıyla erişmek için</a> bu adresi kullanın", "New" : "Yeni", @@ -85,7 +89,8 @@ "New folder" : "Yeni klasör", "Folder" : "Klasör", "From link" : "Bağlantıdan", - "Nothing in here. Upload something!" : "Burada hiçbir şey yok. Bir şeyler yükleyin!", + "Upload" : "Yükle", + "Cancel upload" : "Yüklemeyi iptal et", "Download" : "İndir", "Upload too large" : "Yükleme çok büyük", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Yüklemeye çalıştığınız dosyalar bu sunucudaki azami yükleme boyutunu aşıyor.", diff --git a/apps/files/l10n/tzm.js b/apps/files/l10n/tzm.js index 2a7c7f44429..0d2e146cc3e 100644 --- a/apps/files/l10n/tzm.js +++ b/apps/files/l10n/tzm.js @@ -3,6 +3,7 @@ OC.L10N.register( { "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""] }, "nplurals=2; plural=(n == 0 || n == 1 || (n > 10 && n < 100) ? 0 : 1;"); diff --git a/apps/files/l10n/tzm.json b/apps/files/l10n/tzm.json index 63a463dce66..8ba33b04668 100644 --- a/apps/files/l10n/tzm.json +++ b/apps/files/l10n/tzm.json @@ -1,6 +1,7 @@ { "translations": { "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], - "_Uploading %n file_::_Uploading %n files_" : ["",""] + "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""] },"pluralForm" :"nplurals=2; plural=(n == 0 || n == 1 || (n > 10 && n < 100) ? 0 : 1;" }
\ No newline at end of file diff --git a/apps/files/l10n/ug.js b/apps/files/l10n/ug.js index cfa6db88c4a..ac8e16e289e 100644 --- a/apps/files/l10n/ug.js +++ b/apps/files/l10n/ug.js @@ -9,14 +9,14 @@ OC.L10N.register( "Failed to write to disk" : "دىسكىغا يازالمىدى", "Not enough storage available" : "يېتەرلىك ساقلاش بوشلۇقى يوق", "Files" : "ھۆججەتلەر", + "Favorites" : "يىغقۇچ", + "Home" : "ئۆي", "Upload cancelled." : "يۈكلەشتىن ۋاز كەچتى.", "File upload is in progress. Leaving the page now will cancel the upload." : "ھۆججەت يۈكلەش مەشغۇلاتى ئېلىپ بېرىلىۋاتىدۇ. Leaving the page now will cancel the upload.", "{new_name} already exists" : "{new_name} مەۋجۇت", - "Share" : "ھەمبەھىر", + "Rename" : "ئات ئۆزگەرت", "Delete" : "ئۆچۈر", "Unshare" : "ھەمبەھىرلىمە", - "Delete permanently" : "مەڭگۈلۈك ئۆچۈر", - "Rename" : "ئات ئۆزگەرت", "Pending" : "كۈتۈۋاتىدۇ", "Error" : "خاتالىق", "Name" : "ئاتى", @@ -25,13 +25,17 @@ OC.L10N.register( "_%n folder_::_%n folders_" : [""], "_%n file_::_%n files_" : [""], "_Uploading %n file_::_Uploading %n files_" : [""], + "_ matches '{filter}'_::_ match '{filter}'_" : [""], + "Favorite" : "يىغقۇچ", "Save" : "ساقلا", + "Settings" : "تەڭشەكلەر", "WebDAV" : "WebDAV", "New" : "يېڭى", "Text file" : "تېكىست ھۆججەت", "New folder" : "يېڭى قىسقۇچ", "Folder" : "قىسقۇچ", - "Nothing in here. Upload something!" : "بۇ جايدا ھېچنېمە يوق. Upload something!", + "Upload" : "يۈكلە", + "Cancel upload" : "يۈكلەشتىن ۋاز كەچ", "Download" : "چۈشۈر", "Upload too large" : "يۈكلەندىغىنى بەك چوڭ" }, diff --git a/apps/files/l10n/ug.json b/apps/files/l10n/ug.json index 19c010492e7..b9291642443 100644 --- a/apps/files/l10n/ug.json +++ b/apps/files/l10n/ug.json @@ -7,14 +7,14 @@ "Failed to write to disk" : "دىسكىغا يازالمىدى", "Not enough storage available" : "يېتەرلىك ساقلاش بوشلۇقى يوق", "Files" : "ھۆججەتلەر", + "Favorites" : "يىغقۇچ", + "Home" : "ئۆي", "Upload cancelled." : "يۈكلەشتىن ۋاز كەچتى.", "File upload is in progress. Leaving the page now will cancel the upload." : "ھۆججەت يۈكلەش مەشغۇلاتى ئېلىپ بېرىلىۋاتىدۇ. Leaving the page now will cancel the upload.", "{new_name} already exists" : "{new_name} مەۋجۇت", - "Share" : "ھەمبەھىر", + "Rename" : "ئات ئۆزگەرت", "Delete" : "ئۆچۈر", "Unshare" : "ھەمبەھىرلىمە", - "Delete permanently" : "مەڭگۈلۈك ئۆچۈر", - "Rename" : "ئات ئۆزگەرت", "Pending" : "كۈتۈۋاتىدۇ", "Error" : "خاتالىق", "Name" : "ئاتى", @@ -23,13 +23,17 @@ "_%n folder_::_%n folders_" : [""], "_%n file_::_%n files_" : [""], "_Uploading %n file_::_Uploading %n files_" : [""], + "_ matches '{filter}'_::_ match '{filter}'_" : [""], + "Favorite" : "يىغقۇچ", "Save" : "ساقلا", + "Settings" : "تەڭشەكلەر", "WebDAV" : "WebDAV", "New" : "يېڭى", "Text file" : "تېكىست ھۆججەت", "New folder" : "يېڭى قىسقۇچ", "Folder" : "قىسقۇچ", - "Nothing in here. Upload something!" : "بۇ جايدا ھېچنېمە يوق. Upload something!", + "Upload" : "يۈكلە", + "Cancel upload" : "يۈكلەشتىن ۋاز كەچ", "Download" : "چۈشۈر", "Upload too large" : "يۈكلەندىغىنى بەك چوڭ" },"pluralForm" :"nplurals=1; plural=0;" diff --git a/apps/files/l10n/uk.js b/apps/files/l10n/uk.js index b2bbbcbfc4c..84999c087e6 100644 --- a/apps/files/l10n/uk.js +++ b/apps/files/l10n/uk.js @@ -35,6 +35,8 @@ OC.L10N.register( "Invalid directory." : "Невірний каталог.", "Files" : "Файли", "All files" : "Усі файли", + "Favorites" : "Улюблені", + "Home" : "Домашня адреса", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Неможливо завантажити {filename}, оскільки це каталог або має нульовий розмір.", "Total file size {size1} exceeds upload limit {size2}" : "Розмір файлу {size1} перевищує обмеження {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Недостатньо вільного місця, ви завантажуєте {size1}, а залишилося лише {size2}", @@ -46,12 +48,11 @@ OC.L10N.register( "Could not create file" : "Не вдалося створити файл", "Could not create folder" : "Не вдалося створити теку", "Error fetching URL" : "Помилка отримання URL", - "Share" : "Поділитися", + "Rename" : "Перейменувати", "Delete" : "Видалити", "Disconnect storage" : "Від’єднати сховище", "Unshare" : "Закрити доступ", - "Delete permanently" : "Видалити назавжди", - "Rename" : "Перейменувати", + "Select" : "Оберіть", "Pending" : "Очікування", "Error moving file." : "Помилка переміщення файлу.", "Error moving file" : "Помилка переміщення файлу", @@ -71,7 +72,9 @@ OC.L10N.register( "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Доданок шифрування ввімкнено, але ваші ключі не ініціалізовано, вийдіть та зайдіть знову", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Невірний закритий ключ для доданку шифрування. Оновіть пароль до вашого закритого ключа в особистих налаштуваннях.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Шифрування було вимкнено, але ваші файли все ще зашифровано. Для розшифрування перейдіть до персональних налаштувань.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["","",""], "{dirs} and {files}" : "{dirs} і {files}", + "Favorite" : "Улюблений", "%s could not be renamed as it has been deleted" : "%s не може бути перейменований, оскільки він видалений", "%s could not be renamed" : "%s не може бути перейменований", "Upload (max. %s)" : "Завантаження (макс. %s)", @@ -79,6 +82,7 @@ OC.L10N.register( "Maximum upload size" : "Максимальний розмір відвантажень", "max. possible: " : "макс. можливе:", "Save" : "Зберегти", + "Settings" : "Налаштування", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Для доступу до файлів через WebDAV використовуйте <a href=\"%s\" target=\"_blank\">це посилання</a>", "New" : "Створити", @@ -87,7 +91,8 @@ OC.L10N.register( "New folder" : "Нова тека", "Folder" : "Тека", "From link" : "З посилання", - "Nothing in here. Upload something!" : "Тут нічого немає. Відвантажте що-небудь!", + "Upload" : "Вивантажити", + "Cancel upload" : "Перервати завантаження", "Download" : "Завантажити", "Upload too large" : "Файл занадто великий", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Файли,що ви намагаєтесь відвантажити перевищують максимальний дозволений розмір файлів на цьому сервері.", diff --git a/apps/files/l10n/uk.json b/apps/files/l10n/uk.json index 6c8a5be4f5c..1c5aaae5f1e 100644 --- a/apps/files/l10n/uk.json +++ b/apps/files/l10n/uk.json @@ -33,6 +33,8 @@ "Invalid directory." : "Невірний каталог.", "Files" : "Файли", "All files" : "Усі файли", + "Favorites" : "Улюблені", + "Home" : "Домашня адреса", "Unable to upload {filename} as it is a directory or has 0 bytes" : "Неможливо завантажити {filename}, оскільки це каталог або має нульовий розмір.", "Total file size {size1} exceeds upload limit {size2}" : "Розмір файлу {size1} перевищує обмеження {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "Недостатньо вільного місця, ви завантажуєте {size1}, а залишилося лише {size2}", @@ -44,12 +46,11 @@ "Could not create file" : "Не вдалося створити файл", "Could not create folder" : "Не вдалося створити теку", "Error fetching URL" : "Помилка отримання URL", - "Share" : "Поділитися", + "Rename" : "Перейменувати", "Delete" : "Видалити", "Disconnect storage" : "Від’єднати сховище", "Unshare" : "Закрити доступ", - "Delete permanently" : "Видалити назавжди", - "Rename" : "Перейменувати", + "Select" : "Оберіть", "Pending" : "Очікування", "Error moving file." : "Помилка переміщення файлу.", "Error moving file" : "Помилка переміщення файлу", @@ -69,7 +70,9 @@ "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Доданок шифрування ввімкнено, але ваші ключі не ініціалізовано, вийдіть та зайдіть знову", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "Невірний закритий ключ для доданку шифрування. Оновіть пароль до вашого закритого ключа в особистих налаштуваннях.", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Шифрування було вимкнено, але ваші файли все ще зашифровано. Для розшифрування перейдіть до персональних налаштувань.", + "_ matches '{filter}'_::_ match '{filter}'_" : ["","",""], "{dirs} and {files}" : "{dirs} і {files}", + "Favorite" : "Улюблений", "%s could not be renamed as it has been deleted" : "%s не може бути перейменований, оскільки він видалений", "%s could not be renamed" : "%s не може бути перейменований", "Upload (max. %s)" : "Завантаження (макс. %s)", @@ -77,6 +80,7 @@ "Maximum upload size" : "Максимальний розмір відвантажень", "max. possible: " : "макс. можливе:", "Save" : "Зберегти", + "Settings" : "Налаштування", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Для доступу до файлів через WebDAV використовуйте <a href=\"%s\" target=\"_blank\">це посилання</a>", "New" : "Створити", @@ -85,7 +89,8 @@ "New folder" : "Нова тека", "Folder" : "Тека", "From link" : "З посилання", - "Nothing in here. Upload something!" : "Тут нічого немає. Відвантажте що-небудь!", + "Upload" : "Вивантажити", + "Cancel upload" : "Перервати завантаження", "Download" : "Завантажити", "Upload too large" : "Файл занадто великий", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Файли,що ви намагаєтесь відвантажити перевищують максимальний дозволений розмір файлів на цьому сервері.", diff --git a/apps/files/l10n/ur_PK.js b/apps/files/l10n/ur_PK.js index c0be28aa0d4..84208c63ca0 100644 --- a/apps/files/l10n/ur_PK.js +++ b/apps/files/l10n/ur_PK.js @@ -2,7 +2,6 @@ OC.L10N.register( "files", { "Unknown error" : "غیر معروف خرابی", - "Share" : "تقسیم", "Delete" : "حذف کریں", "Unshare" : "شئیرنگ ختم کریں", "Error" : "ایرر", @@ -10,7 +9,9 @@ OC.L10N.register( "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "Save" : "حفظ", + "Settings" : "ترتیبات", "Download" : "ڈاؤن لوڈ،" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files/l10n/ur_PK.json b/apps/files/l10n/ur_PK.json index 1ceef01a442..c48800e9d1a 100644 --- a/apps/files/l10n/ur_PK.json +++ b/apps/files/l10n/ur_PK.json @@ -1,6 +1,5 @@ { "translations": { "Unknown error" : "غیر معروف خرابی", - "Share" : "تقسیم", "Delete" : "حذف کریں", "Unshare" : "شئیرنگ ختم کریں", "Error" : "ایرر", @@ -8,7 +7,9 @@ "_%n folder_::_%n folders_" : ["",""], "_%n file_::_%n files_" : ["",""], "_Uploading %n file_::_Uploading %n files_" : ["",""], + "_ matches '{filter}'_::_ match '{filter}'_" : ["",""], "Save" : "حفظ", + "Settings" : "ترتیبات", "Download" : "ڈاؤن لوڈ،" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files/l10n/uz.js b/apps/files/l10n/uz.js index d1bbfca2dd4..8c5bb3bc949 100644 --- a/apps/files/l10n/uz.js +++ b/apps/files/l10n/uz.js @@ -3,6 +3,7 @@ OC.L10N.register( { "_%n folder_::_%n folders_" : [""], "_%n file_::_%n files_" : [""], - "_Uploading %n file_::_Uploading %n files_" : [""] + "_Uploading %n file_::_Uploading %n files_" : [""], + "_ matches '{filter}'_::_ match '{filter}'_" : [""] }, "nplurals=1; plural=0;"); diff --git a/apps/files/l10n/uz.json b/apps/files/l10n/uz.json index e493054d78a..e03a2942ff2 100644 --- a/apps/files/l10n/uz.json +++ b/apps/files/l10n/uz.json @@ -1,6 +1,7 @@ { "translations": { "_%n folder_::_%n folders_" : [""], "_%n file_::_%n files_" : [""], - "_Uploading %n file_::_Uploading %n files_" : [""] + "_Uploading %n file_::_Uploading %n files_" : [""], + "_ matches '{filter}'_::_ match '{filter}'_" : [""] },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/files/l10n/vi.js b/apps/files/l10n/vi.js index 744f37082fe..6eea7a5b6a8 100644 --- a/apps/files/l10n/vi.js +++ b/apps/files/l10n/vi.js @@ -28,6 +28,8 @@ OC.L10N.register( "Upload failed. Could not get file info." : "Tải lên thất bại. Không thể có được thông tin tập tin.", "Invalid directory." : "Thư mục không hợp lệ", "Files" : "Tập tin", + "Favorites" : "Ưa thích", + "Home" : "Nhà", "Unable to upload {filename} as it is a directory or has 0 bytes" : "không thể tải {filename} lên do nó là một thư mục hoặc có kích thước bằng 0 byte", "Upload cancelled." : "Hủy tải lên", "Could not get result from server." : "Không thể nhận được kết quả từ máy chủ.", @@ -36,11 +38,10 @@ OC.L10N.register( "{new_name} already exists" : "{new_name} đã tồn tại", "Could not create file" : "Không thể tạo file", "Could not create folder" : "Không thể tạo thư mục", - "Share" : "Chia sẻ", + "Rename" : "Sửa tên", "Delete" : "Xóa", "Unshare" : "Bỏ chia sẻ", - "Delete permanently" : "Xóa vĩnh vễn", - "Rename" : "Sửa tên", + "Select" : "Chọn", "Pending" : "Đang chờ", "Error moving file" : "Lỗi di chuyển tập tin", "Error" : "Lỗi", @@ -57,12 +58,15 @@ OC.L10N.register( "Your storage is almost full ({usedSpacePercent}%)" : "Your storage is almost full ({usedSpacePercent}%)", "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Ứng dụng mã hóa đã được kích hoạt nhưng bạn chưa khởi tạo khóa. Vui lòng đăng xuất ra và đăng nhập lại", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Mã hóa đã bị vô hiệu nhưng những tập tin của bạn vẫn được mã hóa. Vui lòng vào phần thiết lập cá nhân để giải mã chúng.", + "_ matches '{filter}'_::_ match '{filter}'_" : [""], "{dirs} and {files}" : "{dirs} và {files}", + "Favorite" : "Ưu thích", "%s could not be renamed" : "%s không thể đổi tên", "File handling" : "Xử lý tập tin", "Maximum upload size" : "Kích thước tối đa ", "max. possible: " : "tối đa cho phép:", "Save" : "Lưu", + "Settings" : "Cài đặt", "WebDAV" : "WebDAV", "New" : "Tạo mới", "New text file" : "File text mới", @@ -70,7 +74,8 @@ OC.L10N.register( "New folder" : "Tạo thư mục", "Folder" : "Thư mục", "From link" : "Từ liên kết", - "Nothing in here. Upload something!" : "Không có gì ở đây .Hãy tải lên một cái gì đó !", + "Upload" : "Tải lên", + "Cancel upload" : "Hủy upload", "Download" : "Tải về", "Upload too large" : "Tập tin tải lên quá lớn", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Các tập tin bạn đang tải lên vượt quá kích thước tối đa cho phép trên máy chủ .", diff --git a/apps/files/l10n/vi.json b/apps/files/l10n/vi.json index 32e953b68e1..437b6570bda 100644 --- a/apps/files/l10n/vi.json +++ b/apps/files/l10n/vi.json @@ -26,6 +26,8 @@ "Upload failed. Could not get file info." : "Tải lên thất bại. Không thể có được thông tin tập tin.", "Invalid directory." : "Thư mục không hợp lệ", "Files" : "Tập tin", + "Favorites" : "Ưa thích", + "Home" : "Nhà", "Unable to upload {filename} as it is a directory or has 0 bytes" : "không thể tải {filename} lên do nó là một thư mục hoặc có kích thước bằng 0 byte", "Upload cancelled." : "Hủy tải lên", "Could not get result from server." : "Không thể nhận được kết quả từ máy chủ.", @@ -34,11 +36,10 @@ "{new_name} already exists" : "{new_name} đã tồn tại", "Could not create file" : "Không thể tạo file", "Could not create folder" : "Không thể tạo thư mục", - "Share" : "Chia sẻ", + "Rename" : "Sửa tên", "Delete" : "Xóa", "Unshare" : "Bỏ chia sẻ", - "Delete permanently" : "Xóa vĩnh vễn", - "Rename" : "Sửa tên", + "Select" : "Chọn", "Pending" : "Đang chờ", "Error moving file" : "Lỗi di chuyển tập tin", "Error" : "Lỗi", @@ -55,12 +56,15 @@ "Your storage is almost full ({usedSpacePercent}%)" : "Your storage is almost full ({usedSpacePercent}%)", "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Ứng dụng mã hóa đã được kích hoạt nhưng bạn chưa khởi tạo khóa. Vui lòng đăng xuất ra và đăng nhập lại", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "Mã hóa đã bị vô hiệu nhưng những tập tin của bạn vẫn được mã hóa. Vui lòng vào phần thiết lập cá nhân để giải mã chúng.", + "_ matches '{filter}'_::_ match '{filter}'_" : [""], "{dirs} and {files}" : "{dirs} và {files}", + "Favorite" : "Ưu thích", "%s could not be renamed" : "%s không thể đổi tên", "File handling" : "Xử lý tập tin", "Maximum upload size" : "Kích thước tối đa ", "max. possible: " : "tối đa cho phép:", "Save" : "Lưu", + "Settings" : "Cài đặt", "WebDAV" : "WebDAV", "New" : "Tạo mới", "New text file" : "File text mới", @@ -68,7 +72,8 @@ "New folder" : "Tạo thư mục", "Folder" : "Thư mục", "From link" : "Từ liên kết", - "Nothing in here. Upload something!" : "Không có gì ở đây .Hãy tải lên một cái gì đó !", + "Upload" : "Tải lên", + "Cancel upload" : "Hủy upload", "Download" : "Tải về", "Upload too large" : "Tập tin tải lên quá lớn", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "Các tập tin bạn đang tải lên vượt quá kích thước tối đa cho phép trên máy chủ .", diff --git a/apps/files/l10n/zh_CN.js b/apps/files/l10n/zh_CN.js index 502c673764e..5cdc7a3966d 100644 --- a/apps/files/l10n/zh_CN.js +++ b/apps/files/l10n/zh_CN.js @@ -6,6 +6,7 @@ OC.L10N.register( "Unknown error" : "未知错误", "Could not move %s - File with this name already exists" : "无法移动 %s - 同名文件已存在", "Could not move %s" : "无法移动 %s", + "Permission denied" : "拒绝访问", "File name cannot be empty." : "文件名不能为空。", "\"%s\" is an invalid file name." : "“%s” 是一个无效的文件名。", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." : "无效名称,'\\', '/', '<', '>', ':', '\"', '|', '?' 和 '*' 不被允许使用。", @@ -13,8 +14,9 @@ OC.L10N.register( "The name %s is already used in the folder %s. Please choose a different name." : "文件名 %s 是已经在 %s 中存在的名称。请使用其他名称。", "Not a valid source" : "不是一个可用的源", "Server is not allowed to open URLs, please check the server configuration" : "服务器没有允许打开URL网址,请检查服务器配置", + "The file exceeds your quota by %s" : "文件超过配额 %s", "Error while downloading %s to %s" : "当下载 %s 到 %s 时出错", - "Error when creating the file" : "当创建文件是出错", + "Error when creating the file" : "创建文件时出错", "Folder name cannot be empty." : "文件夹名称不能为空", "Error when creating the folder" : "创建文件夹出错", "Unable to set upload directory." : "无法设置上传文件夹。", @@ -28,11 +30,13 @@ OC.L10N.register( "Missing a temporary folder" : "缺少临时目录", "Failed to write to disk" : "写入磁盘失败", "Not enough storage available" : "没有足够的存储空间", - "Upload failed. Could not find uploaded file" : "上传失败。不能发现上传的文件", - "Upload failed. Could not get file info." : "上传失败。不能获取文件信息。", + "Upload failed. Could not find uploaded file" : "上传失败。未发现上传的文件", + "Upload failed. Could not get file info." : "上传失败。无法获取文件信息。", "Invalid directory." : "无效文件夹。", "Files" : "文件", "All files" : "全部文件", + "Favorites" : "收藏", + "Home" : "家庭", "Unable to upload {filename} as it is a directory or has 0 bytes" : "不能上传文件 {filename} ,由于它是一个目录或者为0字节", "Total file size {size1} exceeds upload limit {size2}" : "总文件大小 {size1} 超过上传限制 {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "没有足够的可用空间,您正在上传 {size1} 的文件但是只有 {size2} 可用。", @@ -44,13 +48,13 @@ OC.L10N.register( "Could not create file" : "不能创建文件", "Could not create folder" : "不能创建文件夹", "Error fetching URL" : "获取URL出错", - "Share" : "分享", + "Rename" : "重命名", "Delete" : "删除", "Disconnect storage" : "断开储存连接", "Unshare" : "取消共享", - "Delete permanently" : "永久删除", - "Rename" : "重命名", + "Select" : "选择", "Pending" : "等待", + "Unable to determine date" : "无法确定日期", "Error moving file." : "移动文件出错。", "Error moving file" : "移动文件错误", "Error" : "错误", @@ -69,13 +73,18 @@ OC.L10N.register( "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "加密应用被启用了,但是你的加密密钥没有初始化,请重新登出登录系统一次。", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "无效的私有密钥。请到您的个人配置里去更新私有密钥,来恢复对加密文件的访问。", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "加密是被禁用的,但是您的文件还是被加密了。请到您的个人配置里设置文件加密选项。", + "_ matches '{filter}'_::_ match '{filter}'_" : [""], "{dirs} and {files}" : "{dirs} 和 {files}", + "Favorited" : "已收藏", + "Favorite" : "收藏", + "%s could not be renamed as it has been deleted" : "%s 已经被删除,无法重命名 ", "%s could not be renamed" : "%s 不能被重命名", "Upload (max. %s)" : "上传 (最大 %s)", "File handling" : "文件处理", "Maximum upload size" : "最大上传大小", "max. possible: " : "最大允许: ", "Save" : "保存", + "Settings" : "设置", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "使用这个地址 <a href=\"%s\" target=\"_blank\">通过 WebDAV 访问您的文件</a>", "New" : "新建", @@ -84,11 +93,17 @@ OC.L10N.register( "New folder" : "增加文件夹", "Folder" : "文件夹", "From link" : "来自链接", - "Nothing in here. Upload something!" : "这里还什么都没有。上传些东西吧!", + "Upload" : "上传", + "Cancel upload" : "取消上传", + "No files yet" : "尚无文件", + "Upload some content or sync with your devices!" : "上传一些内容或者与设备同步!", + "Select all" : "全部选择", "Download" : "下载", "Upload too large" : "上传文件过大", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "您正尝试上传的文件超过了此服务器可以上传的最大容量限制", "Files are being scanned, please wait." : "文件正在被扫描,请稍候。", - "Currently scanning" : "正在扫描" + "Currently scanning" : "正在扫描", + "No favorites" : "无收藏", + "Files and folders you mark as favorite will show up here" : "收藏的文件和文件夹会在这里显示" }, "nplurals=1; plural=0;"); diff --git a/apps/files/l10n/zh_CN.json b/apps/files/l10n/zh_CN.json index a0244f1965a..a605e67700c 100644 --- a/apps/files/l10n/zh_CN.json +++ b/apps/files/l10n/zh_CN.json @@ -4,6 +4,7 @@ "Unknown error" : "未知错误", "Could not move %s - File with this name already exists" : "无法移动 %s - 同名文件已存在", "Could not move %s" : "无法移动 %s", + "Permission denied" : "拒绝访问", "File name cannot be empty." : "文件名不能为空。", "\"%s\" is an invalid file name." : "“%s” 是一个无效的文件名。", "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed." : "无效名称,'\\', '/', '<', '>', ':', '\"', '|', '?' 和 '*' 不被允许使用。", @@ -11,8 +12,9 @@ "The name %s is already used in the folder %s. Please choose a different name." : "文件名 %s 是已经在 %s 中存在的名称。请使用其他名称。", "Not a valid source" : "不是一个可用的源", "Server is not allowed to open URLs, please check the server configuration" : "服务器没有允许打开URL网址,请检查服务器配置", + "The file exceeds your quota by %s" : "文件超过配额 %s", "Error while downloading %s to %s" : "当下载 %s 到 %s 时出错", - "Error when creating the file" : "当创建文件是出错", + "Error when creating the file" : "创建文件时出错", "Folder name cannot be empty." : "文件夹名称不能为空", "Error when creating the folder" : "创建文件夹出错", "Unable to set upload directory." : "无法设置上传文件夹。", @@ -26,11 +28,13 @@ "Missing a temporary folder" : "缺少临时目录", "Failed to write to disk" : "写入磁盘失败", "Not enough storage available" : "没有足够的存储空间", - "Upload failed. Could not find uploaded file" : "上传失败。不能发现上传的文件", - "Upload failed. Could not get file info." : "上传失败。不能获取文件信息。", + "Upload failed. Could not find uploaded file" : "上传失败。未发现上传的文件", + "Upload failed. Could not get file info." : "上传失败。无法获取文件信息。", "Invalid directory." : "无效文件夹。", "Files" : "文件", "All files" : "全部文件", + "Favorites" : "收藏", + "Home" : "家庭", "Unable to upload {filename} as it is a directory or has 0 bytes" : "不能上传文件 {filename} ,由于它是一个目录或者为0字节", "Total file size {size1} exceeds upload limit {size2}" : "总文件大小 {size1} 超过上传限制 {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "没有足够的可用空间,您正在上传 {size1} 的文件但是只有 {size2} 可用。", @@ -42,13 +46,13 @@ "Could not create file" : "不能创建文件", "Could not create folder" : "不能创建文件夹", "Error fetching URL" : "获取URL出错", - "Share" : "分享", + "Rename" : "重命名", "Delete" : "删除", "Disconnect storage" : "断开储存连接", "Unshare" : "取消共享", - "Delete permanently" : "永久删除", - "Rename" : "重命名", + "Select" : "选择", "Pending" : "等待", + "Unable to determine date" : "无法确定日期", "Error moving file." : "移动文件出错。", "Error moving file" : "移动文件错误", "Error" : "错误", @@ -67,13 +71,18 @@ "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "加密应用被启用了,但是你的加密密钥没有初始化,请重新登出登录系统一次。", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "无效的私有密钥。请到您的个人配置里去更新私有密钥,来恢复对加密文件的访问。", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "加密是被禁用的,但是您的文件还是被加密了。请到您的个人配置里设置文件加密选项。", + "_ matches '{filter}'_::_ match '{filter}'_" : [""], "{dirs} and {files}" : "{dirs} 和 {files}", + "Favorited" : "已收藏", + "Favorite" : "收藏", + "%s could not be renamed as it has been deleted" : "%s 已经被删除,无法重命名 ", "%s could not be renamed" : "%s 不能被重命名", "Upload (max. %s)" : "上传 (最大 %s)", "File handling" : "文件处理", "Maximum upload size" : "最大上传大小", "max. possible: " : "最大允许: ", "Save" : "保存", + "Settings" : "设置", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "使用这个地址 <a href=\"%s\" target=\"_blank\">通过 WebDAV 访问您的文件</a>", "New" : "新建", @@ -82,11 +91,17 @@ "New folder" : "增加文件夹", "Folder" : "文件夹", "From link" : "来自链接", - "Nothing in here. Upload something!" : "这里还什么都没有。上传些东西吧!", + "Upload" : "上传", + "Cancel upload" : "取消上传", + "No files yet" : "尚无文件", + "Upload some content or sync with your devices!" : "上传一些内容或者与设备同步!", + "Select all" : "全部选择", "Download" : "下载", "Upload too large" : "上传文件过大", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "您正尝试上传的文件超过了此服务器可以上传的最大容量限制", "Files are being scanned, please wait." : "文件正在被扫描,请稍候。", - "Currently scanning" : "正在扫描" + "Currently scanning" : "正在扫描", + "No favorites" : "无收藏", + "Files and folders you mark as favorite will show up here" : "收藏的文件和文件夹会在这里显示" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/files/l10n/zh_HK.js b/apps/files/l10n/zh_HK.js index e3e2aec65a0..924fb403cfd 100644 --- a/apps/files/l10n/zh_HK.js +++ b/apps/files/l10n/zh_HK.js @@ -4,22 +4,26 @@ OC.L10N.register( "Unknown error" : "不明錯誤", "Files" : "文件", "All files" : "所有文件", - "Share" : "分享", + "Home" : "主頁", + "Rename" : "重新命名", "Delete" : "刪除", "Unshare" : "取消分享", - "Rename" : "重新命名", "Error" : "錯誤", "Name" : "名稱", "Size" : "大小", "_%n folder_::_%n folders_" : [""], "_%n file_::_%n files_" : [""], "_Uploading %n file_::_Uploading %n files_" : [""], + "_ matches '{filter}'_::_ match '{filter}'_" : [""], "{dirs} and {files}" : "{dirs} 和 {files}", "Save" : "儲存", + "Settings" : "設定", "WebDAV" : "WebDAV", "New" : "新增", "New folder" : "新資料夾", "Folder" : "資料夾", + "Upload" : "上戴", + "Cancel upload" : "取消上戴", "Download" : "下載" }, "nplurals=1; plural=0;"); diff --git a/apps/files/l10n/zh_HK.json b/apps/files/l10n/zh_HK.json index da0632f0882..34e28e5193e 100644 --- a/apps/files/l10n/zh_HK.json +++ b/apps/files/l10n/zh_HK.json @@ -2,22 +2,26 @@ "Unknown error" : "不明錯誤", "Files" : "文件", "All files" : "所有文件", - "Share" : "分享", + "Home" : "主頁", + "Rename" : "重新命名", "Delete" : "刪除", "Unshare" : "取消分享", - "Rename" : "重新命名", "Error" : "錯誤", "Name" : "名稱", "Size" : "大小", "_%n folder_::_%n folders_" : [""], "_%n file_::_%n files_" : [""], "_Uploading %n file_::_Uploading %n files_" : [""], + "_ matches '{filter}'_::_ match '{filter}'_" : [""], "{dirs} and {files}" : "{dirs} 和 {files}", "Save" : "儲存", + "Settings" : "設定", "WebDAV" : "WebDAV", "New" : "新增", "New folder" : "新資料夾", "Folder" : "資料夾", + "Upload" : "上戴", + "Cancel upload" : "取消上戴", "Download" : "下載" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/files/l10n/zh_TW.js b/apps/files/l10n/zh_TW.js index 73e17fa47fc..f6f1e8e2523 100644 --- a/apps/files/l10n/zh_TW.js +++ b/apps/files/l10n/zh_TW.js @@ -35,6 +35,8 @@ OC.L10N.register( "Invalid directory." : "無效的資料夾", "Files" : "檔案", "All files" : "所有檔案", + "Favorites" : "最愛", + "Home" : "住宅", "Unable to upload {filename} as it is a directory or has 0 bytes" : "因為 {filename} 是個目錄或是大小為零,所以無法上傳", "Total file size {size1} exceeds upload limit {size2}" : "檔案大小總和 {size1} 超過上傳限制 {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "可用空間不足,你正要上傳 {size1} 可是只剩下 {size2}", @@ -46,12 +48,11 @@ OC.L10N.register( "Could not create file" : "無法建立檔案", "Could not create folder" : "無法建立資料夾", "Error fetching URL" : "抓取 URL 發生錯誤", - "Share" : "分享", + "Rename" : "重新命名", "Delete" : "刪除", "Disconnect storage" : "斷開儲存空間連接", "Unshare" : "取消分享", - "Delete permanently" : "永久刪除", - "Rename" : "重新命名", + "Select" : "選擇", "Pending" : "等候中", "Error moving file." : "移動檔案發生錯誤", "Error moving file" : "移動檔案失敗", @@ -71,7 +72,9 @@ OC.L10N.register( "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "檔案加密已啓用,但是您的金鑰尚未初始化,請重新登入一次", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "無效的檔案加密私鑰,請在個人設定中更新您的私鑰密語以存取加密的檔案。", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "加密已經被停用,但是您的舊檔案還是處於已加密的狀態,請前往個人設定以解密這些檔案。", + "_ matches '{filter}'_::_ match '{filter}'_" : [""], "{dirs} and {files}" : "{dirs} 和 {files}", + "Favorite" : "我的最愛", "%s could not be renamed as it has been deleted" : "%s 已經被刪除了所以無法重新命名", "%s could not be renamed" : "無法重新命名 %s", "Upload (max. %s)" : "上傳(至多 %s)", @@ -79,6 +82,7 @@ OC.L10N.register( "Maximum upload size" : "上傳限制", "max. possible: " : "最大允許:", "Save" : "儲存", + "Settings" : "設定", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "使用這個地址<a href=\"%s\" target=\"_blank\">來透過 WebDAV 存取檔案</a>", "New" : "新增", @@ -87,7 +91,8 @@ OC.L10N.register( "New folder" : "新資料夾", "Folder" : "資料夾", "From link" : "從連結", - "Nothing in here. Upload something!" : "這裡還沒有東西,上傳一些吧!", + "Upload" : "上傳", + "Cancel upload" : "取消上傳", "Download" : "下載", "Upload too large" : "上傳過大", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "您試圖上傳的檔案大小超過伺服器的限制。", diff --git a/apps/files/l10n/zh_TW.json b/apps/files/l10n/zh_TW.json index f55b936a40f..0d4eecee767 100644 --- a/apps/files/l10n/zh_TW.json +++ b/apps/files/l10n/zh_TW.json @@ -33,6 +33,8 @@ "Invalid directory." : "無效的資料夾", "Files" : "檔案", "All files" : "所有檔案", + "Favorites" : "最愛", + "Home" : "住宅", "Unable to upload {filename} as it is a directory or has 0 bytes" : "因為 {filename} 是個目錄或是大小為零,所以無法上傳", "Total file size {size1} exceeds upload limit {size2}" : "檔案大小總和 {size1} 超過上傳限制 {size2}", "Not enough free space, you are uploading {size1} but only {size2} is left" : "可用空間不足,你正要上傳 {size1} 可是只剩下 {size2}", @@ -44,12 +46,11 @@ "Could not create file" : "無法建立檔案", "Could not create folder" : "無法建立資料夾", "Error fetching URL" : "抓取 URL 發生錯誤", - "Share" : "分享", + "Rename" : "重新命名", "Delete" : "刪除", "Disconnect storage" : "斷開儲存空間連接", "Unshare" : "取消分享", - "Delete permanently" : "永久刪除", - "Rename" : "重新命名", + "Select" : "選擇", "Pending" : "等候中", "Error moving file." : "移動檔案發生錯誤", "Error moving file" : "移動檔案失敗", @@ -69,7 +70,9 @@ "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "檔案加密已啓用,但是您的金鑰尚未初始化,請重新登入一次", "Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files." : "無效的檔案加密私鑰,請在個人設定中更新您的私鑰密語以存取加密的檔案。", "Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files." : "加密已經被停用,但是您的舊檔案還是處於已加密的狀態,請前往個人設定以解密這些檔案。", + "_ matches '{filter}'_::_ match '{filter}'_" : [""], "{dirs} and {files}" : "{dirs} 和 {files}", + "Favorite" : "我的最愛", "%s could not be renamed as it has been deleted" : "%s 已經被刪除了所以無法重新命名", "%s could not be renamed" : "無法重新命名 %s", "Upload (max. %s)" : "上傳(至多 %s)", @@ -77,6 +80,7 @@ "Maximum upload size" : "上傳限制", "max. possible: " : "最大允許:", "Save" : "儲存", + "Settings" : "設定", "WebDAV" : "WebDAV", "Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "使用這個地址<a href=\"%s\" target=\"_blank\">來透過 WebDAV 存取檔案</a>", "New" : "新增", @@ -85,7 +89,8 @@ "New folder" : "新資料夾", "Folder" : "資料夾", "From link" : "從連結", - "Nothing in here. Upload something!" : "這裡還沒有東西,上傳一些吧!", + "Upload" : "上傳", + "Cancel upload" : "取消上傳", "Download" : "下載", "Upload too large" : "上傳過大", "The files you are trying to upload exceed the maximum size for file uploads on this server." : "您試圖上傳的檔案大小超過伺服器的限制。", diff --git a/apps/files/lib/capabilities.php b/apps/files/lib/capabilities.php index d4820e931ba..690cc314ccd 100644 --- a/apps/files/lib/capabilities.php +++ b/apps/files/lib/capabilities.php @@ -15,7 +15,6 @@ class Capabilities { 'capabilities' => array( 'files' => array( 'bigfilechunking' => true, - 'undelete' => true, ), ), )); diff --git a/apps/files/lib/helper.php b/apps/files/lib/helper.php index aa5a2f8c68a..4a8af59475b 100644 --- a/apps/files/lib/helper.php +++ b/apps/files/lib/helper.php @@ -82,7 +82,7 @@ class Helper public static function compareTimestamp(FileInfo $a, FileInfo $b) { $aTime = $a->getMTime(); $bTime = $b->getMTime(); - return $aTime - $bTime; + return ($aTime < $bTime) ? -1 : 1; } /** @@ -122,6 +122,9 @@ class Helper $entry['size'] = $i['size']; $entry['type'] = $i['type']; $entry['etag'] = $i['etag']; + if (isset($i['tags'])) { + $entry['tags'] = $i['tags']; + } if (isset($i['displayname_owner'])) { $entry['shareOwner'] = $i['displayname_owner']; } @@ -176,6 +179,27 @@ class Helper } /** + * Populate the result set with file tags + * + * @param array file list + * @return file list populated with tags + */ + public static function populateTags($fileList) { + $filesById = array(); + foreach ($fileList as $fileData) { + $filesById[$fileData['fileid']] = $fileData; + } + $tagger = \OC::$server->getTagManager()->load('files'); + $tags = $tagger->getTagsForObjects(array_keys($filesById)); + if ($tags) { + foreach ($tags as $fileId => $fileTags) { + $filesById[$fileId]['tags'] = $fileTags; + } + } + return $fileList; + } + + /** * Sort the given file info array * * @param \OCP\Files\FileInfo[] $files files to sort diff --git a/apps/files/service/tagservice.php b/apps/files/service/tagservice.php new file mode 100644 index 00000000000..86885e38ddd --- /dev/null +++ b/apps/files/service/tagservice.php @@ -0,0 +1,94 @@ +<?php +/** + * Copyright (c) 2014 Vincent Petry <pvince81@owncloud.com> + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace OCA\Files\Service; + +/** + * Service class to manage tags on files. + */ +class TagService { + + /** + * @var \OCP\IUserSession + */ + private $userSession; + + /** + * @var \OCP\ITags + */ + private $tagger; + + /** + * @var \OCP\Files\Folder + */ + private $homeFolder; + + public function __construct( + \OCP\IUserSession $userSession, + \OCP\ITags $tagger, + \OCP\Files\Folder $homeFolder + ) { + $this->userSession = $userSession; + $this->tagger = $tagger; + $this->homeFolder = $homeFolder; + } + + /** + * Updates the tags of the specified file path. + * The passed tags are absolute, which means they will + * replace the actual tag selection. + * + * @param string $path path + * @param array $tags array of tags + * @return array list of tags + * @throws \OCP\NotFoundException if the file does not exist + */ + public function updateFileTags($path, $tags) { + $fileId = $this->homeFolder->get($path)->getId(); + + $currentTags = $this->tagger->getTagsForObjects(array($fileId)); + + if (!empty($currentTags)) { + $currentTags = current($currentTags); + } + + $newTags = array_diff($tags, $currentTags); + foreach ($newTags as $tag) { + $this->tagger->tagAs($fileId, $tag); + } + $deletedTags = array_diff($currentTags, $tags); + foreach ($deletedTags as $tag) { + $this->tagger->unTag($fileId, $tag); + } + + // TODO: re-read from tagger to make sure the + // list is up to date, in case of concurrent changes ? + return $tags; + } + + /** + * Updates the tags of the specified file path. + * The passed tags are absolute, which means they will + * replace the actual tag selection. + * + * @param array $tagName tag name to filter by + * @return FileInfo[] list of matching files + * @throws \Exception if the tag does not exist + */ + public function getFilesByTag($tagName) { + $nodes = $this->homeFolder->searchByTag( + $tagName, $this->userSession->getUser()->getUId() + ); + foreach ($nodes as &$node) { + $node = $node->getFileInfo(); + } + + return $nodes; + } +} + diff --git a/apps/files/simplelist.php b/apps/files/simplelist.php new file mode 100644 index 00000000000..53e56b4ed32 --- /dev/null +++ b/apps/files/simplelist.php @@ -0,0 +1,29 @@ +<?php + +/** + * ownCloud - Simple files list + * + * @author Vincent Petry + * @copyright 2014 Vincent Petry <pvince81@owncloud.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this library. If not, see <http://www.gnu.org/licenses/>. + * + */ + +// TODO: move to handlebars + +// renders the controls and table headers template +$tmpl = new OCP\Template('files', 'simplelist', ''); +$tmpl->printPage(); + diff --git a/apps/files/templates/appnavigation.php b/apps/files/templates/appnavigation.php index 30f0a5afdf1..8fd2b76f9c0 100644 --- a/apps/files/templates/appnavigation.php +++ b/apps/files/templates/appnavigation.php @@ -6,11 +6,15 @@ </ul> <div id="app-settings"> <div id="app-settings-header"> - <button class="settings-button" data-apps-slide-toggle="#app-settings-content"></button> + <button class="settings-button" data-apps-slide-toggle="#app-settings-content"> + <span class="hidden-visually"><?php p($l->t('Settings'));?></span> + </button> </div> <div id="app-settings-content"> - <h2><?php p($l->t('WebDAV'));?></h2> - <div><input id="webdavurl" type="text" readonly="readonly" value="<?php p(OC_Helper::linkToRemote('webdav')); ?>" /></div> + <h2> + <label for="webdavurl"><?php p($l->t('WebDAV'));?></label> + </h2> + <input id="webdavurl" type="text" readonly="readonly" value="<?php p(OC_Helper::linkToRemote('webdav')); ?>" /> <em><?php print_unescaped($l->t('Use this address to <a href="%s" target="_blank">access your Files via WebDAV</a>', array(link_to_docs('user-webdav'))));?></em> </div> </div> diff --git a/apps/files/templates/fileexists.html b/apps/files/templates/fileexists.html index 79beccef3e5..5360a7c8e8f 100644 --- a/apps/files/templates/fileexists.html +++ b/apps/files/templates/fileexists.html @@ -20,6 +20,7 @@ <span class="svg icon"></span> <div class="mtime"></div> <div class="size"></div> + <div class="message"></div> </div> </div> </div> diff --git a/apps/files/templates/index.php b/apps/files/templates/index.php index b52effb1e78..222a996aae3 100644 --- a/apps/files/templates/index.php +++ b/apps/files/templates/index.php @@ -15,5 +15,6 @@ <input type="hidden" name="encryptedFiles" id="encryptedFiles" value="<?php $_['encryptedFiles'] ? p('1') : p('0'); ?>" /> <input type="hidden" name="encryptedInitStatus" id="encryptionInitStatus" value="<?php p($_['encryptionInitStatus']) ?>" /> <input type="hidden" name="mailNotificationEnabled" id="mailNotificationEnabled" value="<?php p($_['mailNotificationEnabled']) ?>" /> +<input type="hidden" name="mailPublicNotificationEnabled" id="mailPublicNotificationEnabled" value="<?php p($_['mailPublicNotificationEnabled']) ?>" /> <input type="hidden" name="allowShareWithLink" id="allowShareWithLink" value="<?php p($_['allowShareWithLink']) ?>" /> <?php endif; diff --git a/apps/files/templates/list.php b/apps/files/templates/list.php index a0138967cd2..aa879002baa 100644 --- a/apps/files/templates/list.php +++ b/apps/files/templates/list.php @@ -34,12 +34,17 @@ value="(max <?php isset($_['uploadMaxHumanFilesize']) ? p($_['uploadMaxHumanFilesize']) : ''; ?>)"> <input type="file" id="file_upload_start" name='files[]' data-url="<?php print_unescaped(OCP\Util::linkTo('files', 'ajax/upload.php')); ?>" /> - <a href="#" class="svg icon-upload"></a> + <label for="file_upload_start" class="svg icon-upload"> + <span class="hidden-visually"><?php p($l->t('Upload'))?></span> + </label> </div> <div id="uploadprogresswrapper"> <div id="uploadprogressbar"></div> - <input type="button" class="stop icon-close" - style="display:none" value="" /> + <button class="stop icon-close" style="display:none"> + <span class="hidden-visually"> + <?php p($l->t('Cancel upload'))?> + </span> + </button> </div> </div> <div id="file_action_panel"></div> @@ -49,7 +54,17 @@ <input type="hidden" name="permissions" value="" id="permissions"> </div> -<div id="emptycontent" class="hidden"><?php p($l->t('Nothing in here. Upload something!'))?></div> +<div id="emptycontent" class="hidden"> + <div class="icon-folder"></div> + <h2><?php p($l->t('No files yet')); ?></h2> + <p><?php p($l->t('Upload some content or sync with your devices!')); ?></p> +</div> + +<div class="nofilterresults hidden"> + <div class="icon-search"></div> + <h2><?php p($l->t('No entries found in this folder')); ?></h2> + <p></p> +</div> <table id="filestable" data-allow-public-upload="<?php p($_['publicUploadEnabled'])?>" data-preview-x="36" data-preview-y="36"> <thead> @@ -57,11 +72,13 @@ <th id='headerName' class="hidden column-name"> <div id="headerName-container"> <input type="checkbox" id="select_all_files" class="select-all"/> - <label for="select_all_files"></label> + <label for="select_all_files"> + <span class="hidden-visually"><?php p($l->t('Select all'))?></span> + </label> <a class="name sort columntitle" data-sort="name"><span><?php p($l->t( 'Name' )); ?></span><span class="sort-indicator"></span></a> <span id="selectedActionsList" class="selectedActions"> <a href="" class="download"> - <img class="svg" alt="Download" + <img class="svg" alt="" src="<?php print_unescaped(OCP\image_path("core", "actions/download.svg")); ?>" /> <?php p($l->t('Download'))?> </a> @@ -75,7 +92,7 @@ <a id="modified" class="columntitle" data-sort="mtime"><span><?php p($l->t( 'Modified' )); ?></span><span class="sort-indicator"></span></a> <span class="selectedActions"><a href="" class="delete-selected"> <?php p($l->t('Delete'))?> - <img class="svg" alt="<?php p($l->t('Delete'))?>" + <img class="svg" alt="" src="<?php print_unescaped(OCP\image_path("core", "actions/delete.svg")); ?>" /> </a></span> </th> diff --git a/apps/files/templates/simplelist.php b/apps/files/templates/simplelist.php new file mode 100644 index 00000000000..6b6c018024f --- /dev/null +++ b/apps/files/templates/simplelist.php @@ -0,0 +1,46 @@ +<div id="controls"> + <div id="file_action_panel"></div> +</div> +<div id='notification'></div> + +<div id="emptycontent" class="hidden"> + <div class="icon-starred"></div> + <h2><?php p($l->t('No favorites')); ?></h2> + <p><?php p($l->t('Files and folders you mark as favorite will show up here')); ?></p> +</div> + +<input type="hidden" name="dir" value="" id="dir"> + +<div class="nofilterresults hidden"> + <div class="icon-search"></div> + <h2><?php p($l->t('No entries found in this folder')); ?></h2> + <p></p> +</div> + +<table id="filestable"> + <thead> + <tr> + <th id='headerName' class="hidden column-name"> + <div id="headerName-container"> + <a class="name sort columntitle" data-sort="name"><span><?php p($l->t( 'Name' )); ?></span><span class="sort-indicator"></span></a> + </div> + </th> + <th id="headerSize" class="hidden column-size"> + <a class="size sort columntitle" data-sort="size"><span><?php p($l->t('Size')); ?></span><span class="sort-indicator"></span></a> + </th> + <th id="headerDate" class="hidden column-mtime"> + <a id="modified" class="columntitle" data-sort="mtime"><span><?php p($l->t( 'Modified' )); ?></span><span class="sort-indicator"></span></a> + <span class="selectedActions"><a href="" class="delete-selected"> + <?php p($l->t('Delete'))?> + <img class="svg" alt="<?php p($l->t('Delete'))?>" + src="<?php print_unescaped(OCP\image_path("core", "actions/delete.svg")); ?>" /> + </a></span> + </th> + </tr> + </thead> + <tbody id="fileList"> + </tbody> + <tfoot> + </tfoot> +</table> + diff --git a/apps/files/tests/ajax_rename.php b/apps/files/tests/ajax_rename.php index 5ed8b1931f4..1cfecf9e58c 100644 --- a/apps/files/tests/ajax_rename.php +++ b/apps/files/tests/ajax_rename.php @@ -21,7 +21,7 @@ * */ -class Test_OC_Files_App_Rename extends \PHPUnit_Framework_TestCase { +class Test_OC_Files_App_Rename extends \Test\TestCase { private static $user; /** @@ -34,7 +34,13 @@ class Test_OC_Files_App_Rename extends \PHPUnit_Framework_TestCase { */ private $files; - function setUp() { + private $originalStorage; + + protected function setUp() { + parent::setUp(); + + $this->originalStorage = \OC\Files\Filesystem::getStorage('/'); + // mock OC_L10n if (!self::$user) { self::$user = uniqid(); @@ -59,10 +65,13 @@ class Test_OC_Files_App_Rename extends \PHPUnit_Framework_TestCase { $this->files = new \OCA\Files\App($viewMock, $l10nMock); } - function tearDown() { + protected function tearDown() { $result = \OC_User::deleteUser(self::$user); $this->assertTrue($result); \OC\Files\Filesystem::tearDown(); + \OC\Files\Filesystem::mount($this->originalStorage, array(), '/'); + + parent::tearDown(); } /** @@ -98,7 +107,7 @@ class Test_OC_Files_App_Rename extends \PHPUnit_Framework_TestCase { 'etag' => 'abcdef', 'directory' => '/', 'name' => 'new_name', - )))); + ), null))); $result = $this->files->rename($dir, $oldname, $newname); diff --git a/apps/files/tests/helper.php b/apps/files/tests/helper.php index 17be1770c33..ea96e41d1d1 100644 --- a/apps/files/tests/helper.php +++ b/apps/files/tests/helper.php @@ -11,7 +11,7 @@ use OCA\Files; /** * Class Test_Files_Helper */ -class Test_Files_Helper extends \PHPUnit_Framework_TestCase { +class Test_Files_Helper extends \Test\TestCase { private function makeFileInfo($name, $size, $mtime, $isDir = false) { return new \OC\Files\FileInfo( @@ -24,7 +24,8 @@ class Test_Files_Helper extends \PHPUnit_Framework_TestCase { 'mtime' => $mtime, 'type' => $isDir ? 'dir' : 'file', 'mimetype' => $isDir ? 'httpd/unix-directory' : 'application/octet-stream' - ) + ), + null ); } @@ -33,10 +34,10 @@ class Test_Files_Helper extends \PHPUnit_Framework_TestCase { */ private function getTestFileList() { return array( - self::makeFileInfo('a.txt', 4, 1000), + self::makeFileInfo('a.txt', 4, 2.3 * pow(10, 9)), self::makeFileInfo('q.txt', 5, 150), self::makeFileInfo('subdir2', 87, 128, true), - self::makeFileInfo('b.txt', 166, 800), + self::makeFileInfo('b.txt', 2.2 * pow(10, 9), 800), self::makeFileInfo('o.txt', 12, 100), self::makeFileInfo('subdir', 88, 125, true), ); @@ -90,7 +91,7 @@ class Test_Files_Helper extends \PHPUnit_Framework_TestCase { $this->assertEquals( $expectedOrder, $fileNames - ); + ); } } diff --git a/apps/files/tests/js/favoritesfilelistspec.js b/apps/files/tests/js/favoritesfilelistspec.js new file mode 100644 index 00000000000..608ddaca18b --- /dev/null +++ b/apps/files/tests/js/favoritesfilelistspec.js @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2014 Vincent Petry <pvince81@owncloud.com> + * + * This file is licensed under the Affero General Public License version 3 + * or later. + * + * See the COPYING-README file. + * + */ + +describe('OCA.Files.FavoritesFileList tests', function() { + var fileList; + + beforeEach(function() { + // init parameters and test table elements + $('#testArea').append( + '<div id="app-content-container">' + + // init horrible parameters + '<input type="hidden" id="dir" value="/"></input>' + + '<input type="hidden" id="permissions" value="31"></input>' + + // dummy controls + '<div id="controls">' + + ' <div class="actions creatable"></div>' + + ' <div class="notCreatable"></div>' + + '</div>' + + // dummy table + // TODO: at some point this will be rendered by the fileList class itself! + '<table id="filestable">' + + '<thead><tr>' + + '<th id="headerName" class="hidden column-name">' + + '<a class="name columntitle" data-sort="name"><span>Name</span><span class="sort-indicator"></span></a>' + + '</th>' + + '<th class="hidden column-mtime">' + + '<a class="columntitle" data-sort="mtime"><span class="sort-indicator"></span></a>' + + '</th>' + + '</tr></thead>' + + '<tbody id="fileList"></tbody>' + + '<tfoot></tfoot>' + + '</table>' + + '<div id="emptycontent">Empty content message</div>' + + '</div>' + ); + }); + afterEach(function() { + fileList.destroy(); + fileList = undefined; + }); + + describe('loading file list', function() { + var response; + + beforeEach(function() { + fileList = new OCA.Files.FavoritesFileList( + $('#app-content-container') + ); + OCA.Files.FavoritesPlugin.attach(fileList); + + fileList.reload(); + + /* jshint camelcase: false */ + response = { + files: [{ + id: 7, + name: 'test.txt', + path: '/somedir', + size: 123, + mtime: 11111000, + tags: [OC.TAG_FAVORITE], + permissions: OC.PERMISSION_ALL, + mimetype: 'text/plain' + }] + }; + }); + it('render files', function() { + var request; + + expect(fakeServer.requests.length).toEqual(1); + request = fakeServer.requests[0]; + expect(request.url).toEqual( + OC.generateUrl('apps/files/api/v1/tags/{tagName}/files', {tagName: OC.TAG_FAVORITE}) + ); + + fakeServer.requests[0].respond( + 200, + { 'Content-Type': 'application/json' }, + JSON.stringify(response) + ); + + var $rows = fileList.$el.find('tbody tr'); + var $tr = $rows.eq(0); + expect($rows.length).toEqual(1); + expect($tr.attr('data-id')).toEqual('7'); + expect($tr.attr('data-type')).toEqual('file'); + expect($tr.attr('data-file')).toEqual('test.txt'); + expect($tr.attr('data-path')).toEqual('/somedir'); + expect($tr.attr('data-size')).toEqual('123'); + expect(parseInt($tr.attr('data-permissions'), 10)) + .toEqual(OC.PERMISSION_ALL); + expect($tr.attr('data-mime')).toEqual('text/plain'); + expect($tr.attr('data-mtime')).toEqual('11111000'); + expect($tr.find('a.name').attr('href')).toEqual( + OC.webroot + + '/index.php/apps/files/ajax/download.php' + + '?dir=%2Fsomedir&files=test.txt' + ); + expect($tr.find('.nametext').text().trim()).toEqual('test.txt'); + }); + }); +}); diff --git a/apps/files/tests/js/favoritespluginspec.js b/apps/files/tests/js/favoritespluginspec.js new file mode 100644 index 00000000000..90b40ede74b --- /dev/null +++ b/apps/files/tests/js/favoritespluginspec.js @@ -0,0 +1,130 @@ +/* + * Copyright (c) 2014 Vincent Petry <pvince81@owncloud.com> + * + * This file is licensed under the Affero General Public License version 3 + * or later. + * + * See the COPYING-README file. + * + */ + +describe('OCA.Files.FavoritesPlugin tests', function() { + var Plugin = OCA.Files.FavoritesPlugin; + var fileList; + + beforeEach(function() { + $('#testArea').append( + '<div id="app-navigation">' + + '<ul><li data-id="files"><a>Files</a></li>' + + '<li data-id="sharingin"><a></a></li>' + + '<li data-id="sharingout"><a></a></li>' + + '</ul></div>' + + '<div id="app-content">' + + '<div id="app-content-files" class="hidden">' + + '</div>' + + '<div id="app-content-favorites" class="hidden">' + + '</div>' + + '</div>' + + '</div>' + ); + OC.Plugins.attach('OCA.Files.App', Plugin); + fileList = Plugin.showFileList($('#app-content-favorites')); + }); + afterEach(function() { + OC.Plugins.detach('OCA.Files.App', Plugin); + }); + + describe('initialization', function() { + it('inits favorites list on show', function() { + expect(fileList).toBeDefined(); + }); + }); + describe('file actions', function() { + var oldLegacyFileActions; + + beforeEach(function() { + oldLegacyFileActions = window.FileActions; + window.FileActions = new OCA.Files.FileActions(); + }); + + afterEach(function() { + window.FileActions = oldLegacyFileActions; + }); + it('provides default file actions', function() { + var fileActions = fileList.fileActions; + + expect(fileActions.actions.all).toBeDefined(); + expect(fileActions.actions.all.Delete).toBeDefined(); + expect(fileActions.actions.all.Rename).toBeDefined(); + expect(fileActions.actions.all.Download).toBeDefined(); + + expect(fileActions.defaults.dir).toEqual('Open'); + }); + it('provides custom file actions', function() { + var actionStub = sinon.stub(); + // regular file action + OCA.Files.fileActions.register( + 'all', + 'RegularTest', + OC.PERMISSION_READ, + OC.imagePath('core', 'actions/shared'), + actionStub + ); + + Plugin.favoritesFileList = null; + fileList = Plugin.showFileList($('#app-content-favorites')); + + expect(fileList.fileActions.actions.all.RegularTest).toBeDefined(); + }); + it('does not provide legacy file actions', function() { + var actionStub = sinon.stub(); + // legacy file action + window.FileActions.register( + 'all', + 'LegacyTest', + OC.PERMISSION_READ, + OC.imagePath('core', 'actions/shared'), + actionStub + ); + + Plugin.favoritesFileList = null; + fileList = Plugin.showFileList($('#app-content-favorites')); + + expect(fileList.fileActions.actions.all.LegacyTest).not.toBeDefined(); + }); + it('redirects to files app when opening a directory', function() { + var oldList = OCA.Files.App.fileList; + // dummy new list to make sure it exists + OCA.Files.App.fileList = new OCA.Files.FileList($('<table><thead></thead><tbody></tbody></table>')); + + var setActiveViewStub = sinon.stub(OCA.Files.App, 'setActiveView'); + // create dummy table so we can click the dom + var $table = '<table><thead></thead><tbody id="fileList"></tbody></table>'; + $('#app-content-favorites').append($table); + + Plugin.favoritesFileList = null; + fileList = Plugin.showFileList($('#app-content-favorites')); + + fileList.setFiles([{ + name: 'testdir', + type: 'dir', + path: '/somewhere/inside/subdir', + counterParts: ['user2'], + shareOwner: 'user2' + }]); + + fileList.findFileEl('testdir').find('td a.name').click(); + + expect(OCA.Files.App.fileList.getCurrentDirectory()).toEqual('/somewhere/inside/subdir/testdir'); + + expect(setActiveViewStub.calledOnce).toEqual(true); + expect(setActiveViewStub.calledWith('files')).toEqual(true); + + setActiveViewStub.restore(); + + // restore old list + OCA.Files.App.fileList = oldList; + }); + }); +}); + diff --git a/apps/files/tests/js/fileactionsSpec.js b/apps/files/tests/js/fileactionsSpec.js index f5f18a45a75..828aec9b6b9 100644 --- a/apps/files/tests/js/fileactionsSpec.js +++ b/apps/files/tests/js/fileactionsSpec.js @@ -193,6 +193,54 @@ describe('OCA.Files.FileActions tests', function() { context = actionStub.getCall(0).args[1]; expect(context.dir).toEqual('/somepath'); }); + describe('custom rendering', function() { + var $tr; + beforeEach(function() { + var fileData = { + id: 18, + type: 'file', + name: 'testName.txt', + mimetype: 'text/plain', + size: '1234', + etag: 'a01234c', + mtime: '123456' + }; + $tr = fileList.add(fileData); + }); + it('regular function', function() { + var actionStub = sinon.stub(); + FileActions.registerAction({ + name: 'Test', + displayName: '', + mime: 'all', + permissions: OC.PERMISSION_READ, + render: function(actionSpec, isDefault, context) { + expect(actionSpec.name).toEqual('Test'); + expect(actionSpec.displayName).toEqual(''); + expect(actionSpec.permissions).toEqual(OC.PERMISSION_READ); + expect(actionSpec.mime).toEqual('all'); + expect(isDefault).toEqual(false); + + expect(context.fileList).toEqual(fileList); + expect(context.$file[0]).toEqual($tr[0]); + + var $customEl = $('<a href="#"><span>blabli</span><span>blabla</span></a>'); + $tr.find('td:first').append($customEl); + return $customEl; + }, + actionHandler: actionStub + }); + FileActions.display($tr.find('td.filename'), true, fileList); + + var $actionEl = $tr.find('td:first .action-test'); + expect($actionEl.length).toEqual(1); + expect($actionEl.hasClass('action')).toEqual(true); + + $actionEl.click(); + expect(actionStub.calledOnce).toEqual(true); + expect(actionStub.getCall(0).args[0]).toEqual('testName.txt'); + }); + }); describe('merging', function() { var $tr; beforeEach(function() { diff --git a/apps/files/tests/js/filelistSpec.js b/apps/files/tests/js/filelistSpec.js index a7fa14eb14a..6dafa262715 100644 --- a/apps/files/tests/js/filelistSpec.js +++ b/apps/files/tests/js/filelistSpec.js @@ -97,7 +97,8 @@ describe('OCA.Files.FileList tests', function() { name: 'One.txt', mimetype: 'text/plain', size: 12, - etag: 'abc' + etag: 'abc', + permissions: OC.PERMISSION_ALL }, { id: 2, type: 'file', @@ -105,6 +106,7 @@ describe('OCA.Files.FileList tests', function() { mimetype: 'image/jpeg', size: 12049, etag: 'def', + permissions: OC.PERMISSION_ALL }, { id: 3, type: 'file', @@ -112,13 +114,15 @@ describe('OCA.Files.FileList tests', function() { mimetype: 'application/pdf', size: 58009, etag: '123', + permissions: OC.PERMISSION_ALL }, { id: 4, type: 'dir', name: 'somedir', mimetype: 'httpd/unix-directory', size: 250, - etag: '456' + etag: '456', + permissions: OC.PERMISSION_ALL }]; pageSizeStub = sinon.stub(OCA.Files.FileList.prototype, 'pageSize').returns(20); fileList = new OCA.Files.FileList($('#app-content-files')); @@ -179,6 +183,7 @@ describe('OCA.Files.FileList tests', function() { expect($tr.find('.nametext').text().trim()).toEqual('testName.txt'); expect($tr.find('.filesize').text()).toEqual('1 kB'); + expect($tr.find('.date').text()).not.toEqual('?'); expect(fileList.findFileEl('testName.txt')[0]).toEqual($tr[0]); }); it('generates dir element with correct attributes when calling add() with dir data', function() { @@ -205,6 +210,7 @@ describe('OCA.Files.FileList tests', function() { expect($tr.attr('data-mtime')).toEqual('123456'); expect($tr.find('.filesize').text()).toEqual('1 kB'); + expect($tr.find('.date').text()).not.toEqual('?'); expect(fileList.findFileEl('testFolder')[0]).toEqual($tr[0]); }); @@ -229,6 +235,7 @@ describe('OCA.Files.FileList tests', function() { expect($tr.attr('data-mtime')).toEqual('123456'); expect($tr.find('.filesize').text()).toEqual('Pending'); + expect($tr.find('.date').text()).not.toEqual('?'); }); it('generates dir element with default attributes when calling add() with minimal data', function() { var fileData = { @@ -250,6 +257,7 @@ describe('OCA.Files.FileList tests', function() { expect($tr.attr('data-mtime')).toEqual('123456'); expect($tr.find('.filesize').text()).toEqual('Pending'); + expect($tr.find('.date').text()).not.toEqual('?'); }); it('generates file element with zero size when size is explicitly zero', function() { var fileData = { @@ -260,6 +268,15 @@ describe('OCA.Files.FileList tests', function() { var $tr = fileList.add(fileData); expect($tr.find('.filesize').text()).toEqual('0 kB'); }); + it('generates file element with unknown date when mtime invalid', function() { + var fileData = { + type: 'dir', + name: 'testFolder', + mtime: -1 + }; + var $tr = fileList.add(fileData); + expect($tr.find('.date .modified').text()).toEqual('?'); + }); it('adds new file to the end of the list', function() { var $tr; var fileData = { @@ -644,6 +661,23 @@ describe('OCA.Files.FileList tests', function() { expect(fileList.$fileList.find('input.filename').length).toEqual(0); expect(fileList.$fileList.find('form').length).toEqual(0); }); + it('Restores thumbnail when rename was cancelled', function() { + doRename(); + + expect(OC.TestUtil.getImageUrl(fileList.findFileEl('Tu_after_three.txt').find('.thumbnail'))) + .toEqual(OC.imagePath('core', 'loading.gif')); + + fakeServer.requests[0].respond(200, {'Content-Type': 'application/json'}, JSON.stringify({ + status: 'error', + data: { + message: 'Something went wrong' + } + })); + + expect(fileList.findFileEl('One.txt').length).toEqual(1); + expect(OC.TestUtil.getImageUrl(fileList.findFileEl('One.txt').find('.thumbnail'))) + .toEqual(OC.imagePath('core', 'filetypes/file.svg')); + }); }); describe('Moving files', function() { beforeEach(function() { @@ -738,6 +772,31 @@ describe('OCA.Files.FileList tests', function() { expect(notificationStub.calledOnce).toEqual(true); expect(notificationStub.getCall(0).args[0]).toEqual('Error while moving file'); }); + it('Restores thumbnail if a file could not be moved', function() { + var request; + fileList.move('One.txt', '/somedir'); + + expect(OC.TestUtil.getImageUrl(fileList.findFileEl('One.txt').find('.thumbnail'))) + .toEqual(OC.imagePath('core', 'loading.gif')); + + expect(fakeServer.requests.length).toEqual(1); + request = fakeServer.requests[0]; + + fakeServer.requests[0].respond(200, {'Content-Type': 'application/json'}, JSON.stringify({ + status: 'error', + data: { + message: 'Error while moving file', + } + })); + + expect(fileList.findFileEl('One.txt').length).toEqual(1); + + expect(notificationStub.calledOnce).toEqual(true); + expect(notificationStub.getCall(0).args[0]).toEqual('Error while moving file'); + + expect(OC.TestUtil.getImageUrl(fileList.findFileEl('One.txt').find('.thumbnail'))) + .toEqual(OC.imagePath('core', 'filetypes/file.svg')); + }); }); describe('List rendering', function() { it('renders a list of files using add()', function() { @@ -951,8 +1010,8 @@ describe('OCA.Files.FileList tests', function() { name: 'testFile.txt' }; var $tr = fileList.add(fileData); - var $td = $tr.find('td.filename'); - expect(OC.TestUtil.getImageUrl($td)).toEqual(OC.webroot + '/core/img/filetypes/file.svg'); + var $imgDiv = $tr.find('td.filename .thumbnail'); + expect(OC.TestUtil.getImageUrl($imgDiv)).toEqual(OC.webroot + '/core/img/filetypes/file.svg'); expect(previewLoadStub.notCalled).toEqual(true); }); it('renders default icon for dir when none provided and no preview is available', function() { @@ -961,8 +1020,8 @@ describe('OCA.Files.FileList tests', function() { name: 'test dir' }; var $tr = fileList.add(fileData); - var $td = $tr.find('td.filename'); - expect(OC.TestUtil.getImageUrl($td)).toEqual(OC.webroot + '/core/img/filetypes/folder.svg'); + var $imgDiv = $tr.find('td.filename .thumbnail'); + expect(OC.TestUtil.getImageUrl($imgDiv)).toEqual(OC.webroot + '/core/img/filetypes/folder.svg'); expect(previewLoadStub.notCalled).toEqual(true); }); it('renders provided icon for file when provided', function() { @@ -972,8 +1031,8 @@ describe('OCA.Files.FileList tests', function() { icon: OC.webroot + '/core/img/filetypes/application-pdf.svg' }; var $tr = fileList.add(fileData); - var $td = $tr.find('td.filename'); - expect(OC.TestUtil.getImageUrl($td)).toEqual(OC.webroot + '/core/img/filetypes/application-pdf.svg'); + var $imgDiv = $tr.find('td.filename .thumbnail'); + expect(OC.TestUtil.getImageUrl($imgDiv)).toEqual(OC.webroot + '/core/img/filetypes/application-pdf.svg'); expect(previewLoadStub.notCalled).toEqual(true); }); it('renders preview when no icon was provided and preview is available', function() { @@ -984,11 +1043,11 @@ describe('OCA.Files.FileList tests', function() { }; var $tr = fileList.add(fileData); var $td = $tr.find('td.filename'); - expect(OC.TestUtil.getImageUrl($td)).toEqual(OC.webroot + '/core/img/filetypes/file.svg'); + expect(OC.TestUtil.getImageUrl($td.find('.thumbnail'))).toEqual(OC.webroot + '/core/img/filetypes/file.svg'); expect(previewLoadStub.calledOnce).toEqual(true); // third argument is callback previewLoadStub.getCall(0).args[0].callback(OC.webroot + '/somepath.png'); - expect(OC.TestUtil.getImageUrl($td)).toEqual(OC.webroot + '/somepath.png'); + expect(OC.TestUtil.getImageUrl($td.find('.thumbnail'))).toEqual(OC.webroot + '/somepath.png'); }); it('renders default file type icon when no icon was provided and no preview is available', function() { var fileData = { @@ -997,8 +1056,8 @@ describe('OCA.Files.FileList tests', function() { isPreviewAvailable: false }; var $tr = fileList.add(fileData); - var $td = $tr.find('td.filename'); - expect(OC.TestUtil.getImageUrl($td)).toEqual(OC.webroot + '/core/img/filetypes/file.svg'); + var $imgDiv = $tr.find('td.filename .thumbnail'); + expect(OC.TestUtil.getImageUrl($imgDiv)).toEqual(OC.webroot + '/core/img/filetypes/file.svg'); expect(previewLoadStub.notCalled).toEqual(true); }); }); @@ -1479,6 +1538,17 @@ describe('OCA.Files.FileList tests', function() { $('.select-all').click(); expect(fileList.$el.find('.delete-selected').hasClass('hidden')).toEqual(true); }); + it('show doesnt show the delete action if one or more files are not deletable', function () { + fileList.setFiles(testFiles); + $('#permissions').val(OC.PERMISSION_READ | OC.PERMISSION_DELETE); + $('.select-all').click(); + expect(fileList.$el.find('.delete-selected').hasClass('hidden')).toEqual(false); + testFiles[0].permissions = OC.PERMISSION_READ; + $('.select-all').click(); + fileList.setFiles(testFiles); + $('.select-all').click(); + expect(fileList.$el.find('.delete-selected').hasClass('hidden')).toEqual(true); + }); }); describe('Actions', function() { beforeEach(function() { @@ -1495,7 +1565,8 @@ describe('OCA.Files.FileList tests', function() { mimetype: 'text/plain', type: 'file', size: 12, - etag: 'abc' + etag: 'abc', + permissions: OC.PERMISSION_ALL }); expect(files[1]).toEqual({ id: 3, @@ -1503,7 +1574,8 @@ describe('OCA.Files.FileList tests', function() { name: 'Three.pdf', mimetype: 'application/pdf', size: 58009, - etag: '123' + etag: '123', + permissions: OC.PERMISSION_ALL }); expect(files[2]).toEqual({ id: 4, @@ -1511,7 +1583,8 @@ describe('OCA.Files.FileList tests', function() { name: 'somedir', mimetype: 'httpd/unix-directory', size: 250, - etag: '456' + etag: '456', + permissions: OC.PERMISSION_ALL }); }); it('Removing a file removes it from the selection', function() { @@ -1524,7 +1597,8 @@ describe('OCA.Files.FileList tests', function() { mimetype: 'text/plain', type: 'file', size: 12, - etag: 'abc' + etag: 'abc', + permissions: OC.PERMISSION_ALL }); expect(files[1]).toEqual({ id: 4, @@ -1532,7 +1606,8 @@ describe('OCA.Files.FileList tests', function() { name: 'somedir', mimetype: 'httpd/unix-directory', size: 250, - etag: '456' + etag: '456', + permissions: OC.PERMISSION_ALL }); }); describe('Download', function() { diff --git a/apps/files/tests/js/filesummarySpec.js b/apps/files/tests/js/filesummarySpec.js index 5e39dd1d232..4c53b7d8b3a 100644 --- a/apps/files/tests/js/filesummarySpec.js +++ b/apps/files/tests/js/filesummarySpec.js @@ -85,4 +85,67 @@ describe('OCA.Files.FileSummary tests', function() { expect(s.summary.totalFiles).toEqual(1); expect(s.summary.totalSize).toEqual(127900); }); + + it('renders filtered summary as text', function() { + var s = new FileSummary($container); + s.setSummary({ + totalDirs: 5, + totalFiles: 2, + totalSize: 256000, + filter: 'foo' + }); + expect($container.hasClass('hidden')).toEqual(false); + expect($container.find('.info').text()).toEqual('5 folders and 2 files match \'foo\''); + expect($container.find('.filesize').text()).toEqual('250 kB'); + }); + it('hides filtered summary when no files or folders', function() { + var s = new FileSummary($container); + s.setSummary({ + totalDirs: 0, + totalFiles: 0, + totalSize: 0, + filter: 'foo' + }); + expect($container.hasClass('hidden')).toEqual(true); + }); + it('increases filtered summary when adding files', function() { + var s = new FileSummary($container); + s.setSummary({ + totalDirs: 5, + totalFiles: 2, + totalSize: 256000, + filter: 'foo' + }); + s.add({name: 'bar.txt', type: 'file', size: 256000}); + s.add({name: 'foo.txt', type: 'file', size: 256001}); + s.add({name: 'bar', type: 'dir', size: 100}); + s.add({name: 'foo', type: 'dir', size: 102}); + s.update(); + expect($container.hasClass('hidden')).toEqual(false); + expect($container.find('.info').text()).toEqual('6 folders and 3 files match \'foo\''); + expect($container.find('.filesize').text()).toEqual('500 kB'); + expect(s.summary.totalDirs).toEqual(6); + expect(s.summary.totalFiles).toEqual(3); + expect(s.summary.totalSize).toEqual(512103); + }); + it('decreases filtered summary when removing files', function() { + var s = new FileSummary($container); + s.setSummary({ + totalDirs: 5, + totalFiles: 2, + totalSize: 256000, + filter: 'foo' + }); + s.remove({name: 'bar.txt', type: 'file', size: 128000}); + s.remove({name: 'foo.txt', type: 'file', size: 127999}); + s.remove({name: 'bar', type: 'dir', size: 100}); + s.remove({name: 'foo', type: 'dir', size: 98}); + s.update(); + expect($container.hasClass('hidden')).toEqual(false); + expect($container.find('.info').text()).toEqual('4 folders and 1 file match \'foo\''); + expect($container.find('.filesize').text()).toEqual('125 kB'); + expect(s.summary.totalDirs).toEqual(4); + expect(s.summary.totalFiles).toEqual(1); + expect(s.summary.totalSize).toEqual(127903); + }); }); diff --git a/apps/files/tests/js/tagspluginspec.js b/apps/files/tests/js/tagspluginspec.js new file mode 100644 index 00000000000..66240575a5c --- /dev/null +++ b/apps/files/tests/js/tagspluginspec.js @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2014 Vincent Petry <pvince81@owncloud.com> + * + * This file is licensed under the Affero General Public License version 3 + * or later. + * + * See the COPYING-README file. + * + */ + +describe('OCA.Files.TagsPlugin tests', function() { + var fileList; + var testFiles; + + beforeEach(function() { + var $content = $('<div id="content"></div>'); + $('#testArea').append($content); + // dummy file list + var $div = $( + '<div>' + + '<table id="filestable">' + + '<thead></thead>' + + '<tbody id="fileList"></tbody>' + + '</table>' + + '</div>'); + $('#content').append($div); + + fileList = new OCA.Files.FileList($div); + OCA.Files.TagsPlugin.attach(fileList); + + testFiles = [{ + id: 1, + type: 'file', + name: 'One.txt', + path: '/subdir', + mimetype: 'text/plain', + size: 12, + permissions: OC.PERMISSION_ALL, + etag: 'abc', + shareOwner: 'User One', + isShareMountPoint: false, + tags: ['tag1', 'tag2'] + }]; + }); + afterEach(function() { + fileList.destroy(); + fileList = null; + }); + + describe('Favorites icon', function() { + it('renders favorite icon and extra data', function() { + var $action, $tr; + fileList.setFiles(testFiles); + $tr = fileList.$el.find('tbody tr:first'); + $action = $tr.find('.action-favorite'); + expect($action.length).toEqual(1); + expect($action.hasClass('permanent')).toEqual(false); + + expect($tr.attr('data-tags').split('|')).toEqual(['tag1', 'tag2']); + expect($tr.attr('data-favorite')).not.toBeDefined(); + }); + it('renders permanent favorite icon and extra data', function() { + var $action, $tr; + testFiles[0].tags.push(OC.TAG_FAVORITE); + fileList.setFiles(testFiles); + $tr = fileList.$el.find('tbody tr:first'); + $action = $tr.find('.action-favorite'); + expect($action.length).toEqual(1); + expect($action.hasClass('permanent')).toEqual(true); + + expect($tr.attr('data-tags').split('|')).toEqual(['tag1', 'tag2', OC.TAG_FAVORITE]); + expect($tr.attr('data-favorite')).toEqual('true'); + }); + it('adds has-favorites class on table', function() { + expect(fileList.$el.hasClass('has-favorites')).toEqual(true); + }); + }); + describe('Applying tags', function() { + it('sends request to server and updates icon', function() { + // TODO + fileList.setFiles(testFiles); + }); + it('sends all tags to server when applyFileTags() is called ', function() { + // TODO + }); + }); +}); diff --git a/apps/files/tests/service/tagservice.php b/apps/files/tests/service/tagservice.php new file mode 100644 index 00000000000..158dd77e858 --- /dev/null +++ b/apps/files/tests/service/tagservice.php @@ -0,0 +1,121 @@ +<?php + +/** + * ownCloud + * + * @author Vincent Petry + * @copyright 2014 Vincent Petry <pvince81@owncloud.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this library. If not, see <http://www.gnu.org/licenses/>. + * + */ +namespace OCA\Files; + +use \OCA\Files\Service\TagService; + +class TagServiceTest extends \Test\TestCase { + + /** + * @var string + */ + private $user; + + /** + * @var \OCP\Files\Folder + */ + private $root; + + /** + * @var \OCA\Files\Service\TagService + */ + private $tagService; + + /** + * @var \OCP\ITags + */ + private $tagger; + + protected function setUp() { + parent::setUp(); + $this->user = $this->getUniqueId('user'); + \OC_User::createUser($this->user, 'test'); + \OC_User::setUserId($this->user); + \OC_Util::setupFS($this->user); + /** + * @var \OCP\IUser + */ + $user = new \OC\User\User($this->user, null); + /** + * @var \OCP\IUserSession + */ + $userSession = $this->getMock('\OCP\IUserSession'); + $userSession->expects($this->any()) + ->method('getUser') + ->withAnyParameters() + ->will($this->returnValue($user)); + + $this->root = \OC::$server->getUserFolder(); + + $this->tagger = \OC::$server->getTagManager()->load('files'); + $this->tagService = new TagService( + $userSession, + $this->tagger, + $this->root + ); + } + + protected function tearDown() { + \OC_User::setUserId(''); + \OC_User::deleteUser($this->user); + } + + public function testUpdateFileTags() { + $tag1 = 'tag1'; + $tag2 = 'tag2'; + + $subdir = $this->root->newFolder('subdir'); + $testFile = $subdir->newFile('test.txt'); + $testFile->putContent('test contents'); + + $fileId = $testFile->getId(); + + // set tags + $this->tagService->updateFileTags('subdir/test.txt', array($tag1, $tag2)); + + $this->assertEquals(array($fileId), $this->tagger->getIdsForTag($tag1)); + $this->assertEquals(array($fileId), $this->tagger->getIdsForTag($tag2)); + + // remove tag + $result = $this->tagService->updateFileTags('subdir/test.txt', array($tag2)); + $this->assertEquals(array(), $this->tagger->getIdsForTag($tag1)); + $this->assertEquals(array($fileId), $this->tagger->getIdsForTag($tag2)); + + // clear tags + $result = $this->tagService->updateFileTags('subdir/test.txt', array()); + $this->assertEquals(array(), $this->tagger->getIdsForTag($tag1)); + $this->assertEquals(array(), $this->tagger->getIdsForTag($tag2)); + + // non-existing file + $caught = false; + try { + $this->tagService->updateFileTags('subdir/unexist.txt', array($tag1)); + } catch (\OCP\Files\NotFoundException $e) { + $caught = true; + } + $this->assertTrue($caught); + + $subdir->delete(); + } +} + diff --git a/apps/files/triggerupdate.php b/apps/files/triggerupdate.php deleted file mode 100644 index 3f85da9913b..00000000000 --- a/apps/files/triggerupdate.php +++ /dev/null @@ -1,23 +0,0 @@ -<?php - -require_once __DIR__ . '/../../lib/base.php'; - -if (OC::$CLI) { - if (count($argv) === 2) { - $file = $argv[1]; - list(, $user) = explode('/', $file); - OCP\JSON::checkUserExists($user); - OC_Util::setupFS($user); - $view = new \OC\Files\View(''); - /** - * @var \OC\Files\Storage\Storage $storage - */ - list($storage, $internalPath) = $view->resolvePath($file); - $watcher = $storage->getWatcher($internalPath); - $watcher->checkUpdate($internalPath); - } else { - echo "Usage: php triggerupdate.php /path/to/file\n"; - } -} else { - echo "This script can be run from the command line only\n"; -} diff --git a/apps/files_encryption/ajax/adminrecovery.php b/apps/files_encryption/ajax/adminrecovery.php index 684fd51ae13..503c15b53a9 100644 --- a/apps/files_encryption/ajax/adminrecovery.php +++ b/apps/files_encryption/ajax/adminrecovery.php @@ -7,7 +7,8 @@ * * Script to handle admin settings for encrypted key recovery */ -use OCA\Encryption; + +use OCA\Files_Encryption\Helper; \OCP\JSON::checkAdminUser(); \OCP\JSON::checkAppEnabled('files_encryption'); @@ -42,7 +43,7 @@ $recoveryKeyId = \OC::$server->getAppConfig()->getValue('files_encryption', 'rec if (isset($_POST['adminEnableRecovery']) && $_POST['adminEnableRecovery'] === '1') { - $return = \OCA\Encryption\Helper::adminEnableRecovery($recoveryKeyId, $_POST['recoveryPassword']); + $return = Helper::adminEnableRecovery($recoveryKeyId, $_POST['recoveryPassword']); // Return success or failure if ($return) { @@ -56,7 +57,7 @@ if (isset($_POST['adminEnableRecovery']) && $_POST['adminEnableRecovery'] === '1 isset($_POST['adminEnableRecovery']) && '0' === $_POST['adminEnableRecovery'] ) { - $return = \OCA\Encryption\Helper::adminDisableRecovery($_POST['recoveryPassword']); + $return = Helper::adminDisableRecovery($_POST['recoveryPassword']); if ($return) { $successMessage = $l->t('Recovery key successfully disabled'); diff --git a/apps/files_encryption/ajax/changeRecoveryPassword.php b/apps/files_encryption/ajax/changeRecoveryPassword.php index bf647f2c8fa..3d31b12af7c 100644 --- a/apps/files_encryption/ajax/changeRecoveryPassword.php +++ b/apps/files_encryption/ajax/changeRecoveryPassword.php @@ -9,8 +9,6 @@ * */ -use OCA\Encryption; - \OCP\JSON::checkAdminUser(); \OCP\JSON::checkAppEnabled('files_encryption'); \OCP\JSON::callCheck(); @@ -49,22 +47,21 @@ if ($_POST['newPassword'] !== $_POST['confirmPassword']) { } $view = new \OC\Files\View('/'); -$util = new \OCA\Encryption\Util(new \OC\Files\View('/'), \OCP\User::getUser()); +$util = new \OCA\Files_Encryption\Util(new \OC\Files\View('/'), \OCP\User::getUser()); $proxyStatus = \OC_FileProxy::$enabled; \OC_FileProxy::$enabled = false; $keyId = $util->getRecoveryKeyId(); -$keyPath = '/owncloud_private_key/' . $keyId . '.private.key'; -$encryptedRecoveryKey = $view->file_get_contents($keyPath); -$decryptedRecoveryKey = \OCA\Encryption\Crypt::decryptPrivateKey($encryptedRecoveryKey, $oldPassword); +$encryptedRecoveryKey = \OCA\Files_Encryption\Keymanager::getPrivateSystemKey($keyId); +$decryptedRecoveryKey = $encryptedRecoveryKey ? \OCA\Files_Encryption\Crypt::decryptPrivateKey($encryptedRecoveryKey, $oldPassword) : false; if ($decryptedRecoveryKey) { - $cipher = \OCA\Encryption\Helper::getCipher(); - $encryptedKey = \OCA\Encryption\Crypt::symmetricEncryptFileContent($decryptedRecoveryKey, $newPassword, $cipher); + $cipher = \OCA\Files_Encryption\Helper::getCipher(); + $encryptedKey = \OCA\Files_Encryption\Crypt::symmetricEncryptFileContent($decryptedRecoveryKey, $newPassword, $cipher); if ($encryptedKey) { - \OCA\Encryption\Keymanager::setPrivateSystemKey($encryptedKey, $keyId . '.private.key'); + \OCA\Files_Encryption\Keymanager::setPrivateSystemKey($encryptedKey, $keyId); $return = true; } } diff --git a/apps/files_encryption/ajax/getMigrationStatus.php b/apps/files_encryption/ajax/getMigrationStatus.php index adceb949044..bb260199b19 100644 --- a/apps/files_encryption/ajax/getMigrationStatus.php +++ b/apps/files_encryption/ajax/getMigrationStatus.php @@ -6,7 +6,8 @@ * * check migration status */ -use OCA\Encryption\Util; + +use OCA\Files_Encryption\Util; \OCP\JSON::checkAppEnabled('files_encryption'); diff --git a/apps/files_encryption/ajax/updatePrivateKeyPassword.php b/apps/files_encryption/ajax/updatePrivateKeyPassword.php index 0f182e93831..7161b0cff92 100644 --- a/apps/files_encryption/ajax/updatePrivateKeyPassword.php +++ b/apps/files_encryption/ajax/updatePrivateKeyPassword.php @@ -9,8 +9,6 @@ * */ -use OCA\Encryption; - \OCP\JSON::checkLoggedIn(); \OCP\JSON::checkAppEnabled('files_encryption'); \OCP\JSON::callCheck(); @@ -24,27 +22,26 @@ $oldPassword = $_POST['oldPassword']; $newPassword = $_POST['newPassword']; $view = new \OC\Files\View('/'); -$session = new \OCA\Encryption\Session($view); +$session = new \OCA\Files_Encryption\Session($view); $user = \OCP\User::getUser(); +$loginName = \OC::$server->getUserSession()->getLoginName(); // check new password -$passwordCorrect = \OCP\User::checkPassword($user, $newPassword); +$passwordCorrect = \OCP\User::checkPassword($loginName, $newPassword); if ($passwordCorrect !== false) { $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); +$encryptedKey = \OCA\Files_Encryption\Keymanager::getPrivateKey($view, $user); +$decryptedKey = $encryptedKey ? \OCA\Files_Encryption\Crypt::decryptPrivateKey($encryptedKey, $oldPassword) : false; if ($decryptedKey) { - $cipher = \OCA\Encryption\Helper::getCipher(); - $encryptedKey = \OCA\Encryption\Crypt::symmetricEncryptFileContent($decryptedKey, $newPassword, $cipher); + $cipher = \OCA\Files_Encryption\Helper::getCipher(); + $encryptedKey = \OCA\Files_Encryption\Crypt::symmetricEncryptFileContent($decryptedKey, $newPassword, $cipher); if ($encryptedKey) { - \OCA\Encryption\Keymanager::setPrivateKey($encryptedKey, $user); + \OCA\Files_Encryption\Keymanager::setPrivateKey($encryptedKey, $user); $session->setPrivateKey($decryptedKey); $return = true; } @@ -62,7 +59,7 @@ if ($decryptedKey) { // success or failure if ($return) { - $session->setInitialized(\OCA\Encryption\Session::INIT_SUCCESSFUL); + $session->setInitialized(\OCA\Files_Encryption\Session::INIT_SUCCESSFUL); \OCP\JSON::success(array('data' => array('message' => $l->t('Private key password successfully updated.')))); } else { \OCP\JSON::error(array('data' => array('message' => $errorMessage))); diff --git a/apps/files_encryption/ajax/userrecovery.php b/apps/files_encryption/ajax/userrecovery.php index a5b89fa7233..e49fee83a36 100644 --- a/apps/files_encryption/ajax/userrecovery.php +++ b/apps/files_encryption/ajax/userrecovery.php @@ -7,8 +7,6 @@ * Script to handle admin settings for encrypted key recovery */ -use OCA\Encryption; - \OCP\JSON::checkLoggedIn(); \OCP\JSON::checkAppEnabled('files_encryption'); \OCP\JSON::callCheck(); @@ -22,7 +20,7 @@ if ( $userId = \OCP\USER::getUser(); $view = new \OC\Files\View('/'); - $util = new \OCA\Encryption\Util($view, $userId); + $util = new \OCA\Files_Encryption\Util($view, $userId); // Save recovery preference to DB $return = $util->setRecoveryForUser($_POST['userEnableRecovery']); diff --git a/apps/files_encryption/appinfo/app.php b/apps/files_encryption/appinfo/app.php index aa709fbac65..f2dc63c340d 100644 --- a/apps/files_encryption/appinfo/app.php +++ b/apps/files_encryption/appinfo/app.php @@ -1,40 +1,26 @@ <?php -OC::$CLASSPATH['OCA\Encryption\Crypt'] = 'files_encryption/lib/crypt.php'; -OC::$CLASSPATH['OCA\Encryption\Hooks'] = 'files_encryption/hooks/hooks.php'; -OC::$CLASSPATH['OCA\Encryption\Util'] = 'files_encryption/lib/util.php'; -OC::$CLASSPATH['OCA\Encryption\Keymanager'] = 'files_encryption/lib/keymanager.php'; -OC::$CLASSPATH['OCA\Encryption\Stream'] = 'files_encryption/lib/stream.php'; -OC::$CLASSPATH['OCA\Encryption\Proxy'] = 'files_encryption/lib/proxy.php'; -OC::$CLASSPATH['OCA\Encryption\Session'] = 'files_encryption/lib/session.php'; -OC::$CLASSPATH['OCA\Encryption\Capabilities'] = 'files_encryption/lib/capabilities.php'; -OC::$CLASSPATH['OCA\Encryption\Helper'] = 'files_encryption/lib/helper.php'; - -// Exceptions -OC::$CLASSPATH['OCA\Encryption\Exceptions\MultiKeyEncryptException'] = 'files_encryption/lib/exceptions.php'; -OC::$CLASSPATH['OCA\Encryption\Exceptions\MultiKeyDecryptException'] = 'files_encryption/lib/exceptions.php'; - \OCP\Util::addTranslations('files_encryption'); \OCP\Util::addscript('files_encryption', 'encryption'); \OCP\Util::addscript('files_encryption', 'detect-migration'); if (!OC_Config::getValue('maintenance', false)) { - OC_FileProxy::register(new OCA\Encryption\Proxy()); + OC_FileProxy::register(new OCA\Files_Encryption\Proxy()); // User related hooks - OCA\Encryption\Helper::registerUserHooks(); + OCA\Files_Encryption\Helper::registerUserHooks(); // Sharing related hooks - OCA\Encryption\Helper::registerShareHooks(); + OCA\Files_Encryption\Helper::registerShareHooks(); // Filesystem related hooks - OCA\Encryption\Helper::registerFilesystemHooks(); + OCA\Files_Encryption\Helper::registerFilesystemHooks(); // App manager related hooks - OCA\Encryption\Helper::registerAppHooks(); + OCA\Files_Encryption\Helper::registerAppHooks(); if(!in_array('crypt', stream_get_wrappers())) { - stream_wrapper_register('crypt', 'OCA\Encryption\Stream'); + stream_wrapper_register('crypt', 'OCA\Files_Encryption\Stream'); } } else { // logout user if we are in maintenance to force re-login diff --git a/apps/files_encryption/appinfo/routes.php b/apps/files_encryption/appinfo/routes.php index 97635ae1236..9733c17fe95 100644 --- a/apps/files_encryption/appinfo/routes.php +++ b/apps/files_encryption/appinfo/routes.php @@ -19,4 +19,4 @@ $this->create('files_encryption_ajax_userrecovery', 'ajax/userrecovery.php') ->actionInclude('files_encryption/ajax/userrecovery.php'); // Register with the capabilities API -OC_API::register('get', '/cloud/capabilities', array('OCA\Encryption\Capabilities', 'getCapabilities'), 'files_encryption', OC_API::USER_AUTH); +OC_API::register('get', '/cloud/capabilities', array('OCA\Files_Encryption\Capabilities', 'getCapabilities'), 'files_encryption', OC_API::USER_AUTH); diff --git a/apps/files_encryption/appinfo/update.php b/apps/files_encryption/appinfo/update.php index a29667ec6b6..957cf746974 100644 --- a/apps/files_encryption/appinfo/update.php +++ b/apps/files_encryption/appinfo/update.php @@ -4,7 +4,8 @@ use OCA\Files_Encryption\Migration; $installedVersion=OCP\Config::getAppValue('files_encryption', 'installed_version'); -if (version_compare($installedVersion, '0.6', '<')) { +// Migration OC7 -> OC8 +if (version_compare($installedVersion, '0.7', '<')) { $m = new Migration(); - $m->dropTableEncryption(); + $m->reorganizeFolderStructure(); } diff --git a/apps/files_encryption/appinfo/version b/apps/files_encryption/appinfo/version index ee6cdce3c29..faef31a4357 100644 --- a/apps/files_encryption/appinfo/version +++ b/apps/files_encryption/appinfo/version @@ -1 +1 @@ -0.6.1 +0.7.0 diff --git a/apps/files_encryption/exception/encryptionexception.php b/apps/files_encryption/exception/encryptionexception.php new file mode 100644 index 00000000000..2fb679e91d2 --- /dev/null +++ b/apps/files_encryption/exception/encryptionexception.php @@ -0,0 +1,50 @@ +<?php +/** + * ownCloud + * + * @copyright (C) 2014 ownCloud, Inc. + * + * @author Bjoern Schiessle <schiessle@owncloud.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this library. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\Files_Encryption\Exception; + +/** + * Base class for all encryption exception + * + * Possible Error Codes: + * 10 - generic error + * 20 - unexpected end of encryption header + * 30 - unexpected blog size + * 40 - encryption header to large + * 50 - unknown cipher + * 60 - encryption failed + * 70 - decryption failed + * 80 - empty data + * 90 - private key missing + */ +class EncryptionException extends \Exception { + const GENERIC = 10; + const UNEXPECTED_END_OF_ENCRYPTION_HEADER = 20; + const UNEXPECTED_BLOG_SIZE = 30; + const ENCRYPTION_HEADER_TO_LARGE = 40; + const UNKNOWN_CIPHER = 50; + const ENCRYPTION_FAILED = 60; + const DECRYPTION_FAILED = 70; + const EMPTY_DATA = 80; + const PRIVATE_KEY_MISSING = 90; +} diff --git a/apps/files_encryption/lib/exceptions.php b/apps/files_encryption/exception/multikeydecryptexception.php index 3ea27faf406..9ab10fd3e63 100644 --- a/apps/files_encryption/lib/exceptions.php +++ b/apps/files_encryption/exception/multikeydecryptexception.php @@ -2,8 +2,9 @@ /** * ownCloud * - * @author Bjoern Schiessle - * @copyright 2014 Bjoern Schiessle <schiessle@owncloud.com> + * @copyright (C) 2014 ownCloud, Inc. + * + * @author Bjoern Schiessle <schiessle@owncloud.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE @@ -20,36 +21,14 @@ * */ -namespace OCA\Encryption\Exceptions; - -/** - * General encryption exception - * Possible Error Codes: - * 10 - unexpected end of encryption header - * 20 - unexpected blog size - * 30 - encryption header to large - * 40 - unknown cipher - * 50 - encryption failed - */ -class EncryptionException extends \Exception { -} - -/** - * Throw this exception if multi key encrytion fails - * - * Possible error codes: - * 10 - empty plain content was given - * 20 - openssl_seal failed - */ -class MultiKeyEncryptException extends EncryptionException { -} +namespace OCA\Files_Encryption\Exception; /** * Throw this encryption if multi key decryption failed * * Possible error codes: - * 10 - empty encrypted content was given - * 20 - openssl_open failed + * 110 - openssl_open failed */ class MultiKeyDecryptException extends EncryptionException { + const OPENSSL_OPEN_FAILED = 110; } diff --git a/apps/files_encryption/exception/multikeyencryptexception.php b/apps/files_encryption/exception/multikeyencryptexception.php new file mode 100644 index 00000000000..2dc8216abaa --- /dev/null +++ b/apps/files_encryption/exception/multikeyencryptexception.php @@ -0,0 +1,34 @@ +<?php +/** + * ownCloud + * + * @copyright (C) 2014 ownCloud, Inc. + * + * @author Bjoern Schiessle <schiessle@owncloud.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this library. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\Files_Encryption\Exception; + +/** + * Throw this exception if multi key encrytion fails + * + * Possible error codes: + * 110 - openssl_seal failed + */ +class MultiKeyEncryptException extends EncryptionException { + const OPENSSL_SEAL_FAILED = 110; +} diff --git a/apps/files_encryption/files/error.php b/apps/files_encryption/files/error.php index b801c17bd40..4a1ed021f7c 100644 --- a/apps/files_encryption/files/error.php +++ b/apps/files_encryption/files/error.php @@ -12,14 +12,14 @@ if (!isset($_)) { //also provide standalone error page if (isset($_GET['errorCode'])) { $errorCode = $_GET['errorCode']; switch ($errorCode) { - case \OCA\Encryption\Crypt::ENCRYPTION_NOT_INITIALIZED_ERROR: + case \OCA\Files_Encryption\Crypt::ENCRYPTION_NOT_INITIALIZED_ERROR: $errorMsg = $l->t('Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app.'); break; - case \OCA\Encryption\Crypt::ENCRYPTION_PRIVATE_KEY_NOT_VALID_ERROR: + case \OCA\Files_Encryption\Crypt::ENCRYPTION_PRIVATE_KEY_NOT_VALID_ERROR: $theme = new OC_Defaults(); $errorMsg = $l->t('Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files.', array($theme->getName())); break; - case \OCA\Encryption\Crypt::ENCRYPTION_NO_SHARE_KEY_FOUND: + case \OCA\Files_Encryption\Crypt::ENCRYPTION_NO_SHARE_KEY_FOUND: $errorMsg = $l->t('Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you.'); break; default: @@ -27,7 +27,7 @@ if (!isset($_)) { //also provide standalone error page break; } } else { - $errorCode = \OCA\Encryption\Crypt::ENCRYPTION_UNKNOWN_ERROR; + $errorCode = \OCA\Files_Encryption\Crypt::ENCRYPTION_UNKNOWN_ERROR; $errorMsg = $l->t("Unknown error. Please check your system settings or contact your administrator"); } diff --git a/apps/files_encryption/js/encryption.js b/apps/files_encryption/js/encryption.js index 65ffabe55e6..d2d1c3a1fc5 100644 --- a/apps/files_encryption/js/encryption.js +++ b/apps/files_encryption/js/encryption.js @@ -5,6 +5,10 @@ * See the COPYING-README file. */ +/** + * @namespace + * @memberOf OC + */ OC.Encryption={ MIGRATION_OPEN:0, MIGRATION_COMPLETED:1, diff --git a/apps/files_encryption/l10n/ar.js b/apps/files_encryption/l10n/ar.js index b1af4358241..ce9c2e91fb8 100644 --- a/apps/files_encryption/l10n/ar.js +++ b/apps/files_encryption/l10n/ar.js @@ -8,7 +8,6 @@ OC.L10N.register( "Password successfully changed." : "تم تغيير كلمة المرور بنجاح.", "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." : "لا يمكن تحديث كلمة مرور المفتاح الخاص. من الممكن ان كلمة المرور القديمة غير صحيحة.", "File recovery settings updated" : "اعدادات ملف الاستعادة تم تحديثه", "Could not update file recovery" : "تعذر تحديث ملف الاستعادة", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "برنامج التشفير لم يتم تهيئتة ! من الممكن ان برنامج التشفير تم اعادة تفعيلة خلال الجلسة. يرجى تسجيل الخروج ومن ثم تسجيل الدخول مجددا لتهيئة برنامج التشفير.", @@ -16,7 +15,6 @@ OC.L10N.register( "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "لا يمكن فك التشفير من هذا الملف, من الممكن ان يكون هذا الملف مُشارك. يرجى سؤال صاحب الملف لإعادة مشاركتة معك.", "Unknown error. Please check your system settings or contact your administrator" : "خطأ غير معروف, الرجاء التحقق من إعدادات نظامك أو راسل المدير", "Missing requirements." : "متطلبات ناقصة.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "يرجى التاكد من ان اصدار PHP 5.3.3 او احدث , مثبت و التاكد من ان OpenSSL مفعل و مهيئ بشكل صحيح. حتى الان برنامج التتشفير تم تعطيلة.", "Following users are not set up for encryption:" : "المستخدمين التاليين لم يتم تعيين لهم التشفيير:", "Initial encryption started... This can take some time. Please wait." : "بدأ التشفير... من الممكن ان ياخذ بعض الوقت. يرجى الانتظار.", "Initial encryption running... Please try again later." : "جاري تفعيل التشفير المبدئي ، الرجاء المحاولة لاحقا", diff --git a/apps/files_encryption/l10n/ar.json b/apps/files_encryption/l10n/ar.json index f65d0c7b327..d43201b8cd5 100644 --- a/apps/files_encryption/l10n/ar.json +++ b/apps/files_encryption/l10n/ar.json @@ -6,7 +6,6 @@ "Password successfully changed." : "تم تغيير كلمة المرور بنجاح.", "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." : "لا يمكن تحديث كلمة مرور المفتاح الخاص. من الممكن ان كلمة المرور القديمة غير صحيحة.", "File recovery settings updated" : "اعدادات ملف الاستعادة تم تحديثه", "Could not update file recovery" : "تعذر تحديث ملف الاستعادة", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "برنامج التشفير لم يتم تهيئتة ! من الممكن ان برنامج التشفير تم اعادة تفعيلة خلال الجلسة. يرجى تسجيل الخروج ومن ثم تسجيل الدخول مجددا لتهيئة برنامج التشفير.", @@ -14,7 +13,6 @@ "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "لا يمكن فك التشفير من هذا الملف, من الممكن ان يكون هذا الملف مُشارك. يرجى سؤال صاحب الملف لإعادة مشاركتة معك.", "Unknown error. Please check your system settings or contact your administrator" : "خطأ غير معروف, الرجاء التحقق من إعدادات نظامك أو راسل المدير", "Missing requirements." : "متطلبات ناقصة.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "يرجى التاكد من ان اصدار PHP 5.3.3 او احدث , مثبت و التاكد من ان OpenSSL مفعل و مهيئ بشكل صحيح. حتى الان برنامج التتشفير تم تعطيلة.", "Following users are not set up for encryption:" : "المستخدمين التاليين لم يتم تعيين لهم التشفيير:", "Initial encryption started... This can take some time. Please wait." : "بدأ التشفير... من الممكن ان ياخذ بعض الوقت. يرجى الانتظار.", "Initial encryption running... Please try again later." : "جاري تفعيل التشفير المبدئي ، الرجاء المحاولة لاحقا", diff --git a/apps/files_encryption/l10n/ast.js b/apps/files_encryption/l10n/ast.js index 2252f302aaa..c350f3605c2 100644 --- a/apps/files_encryption/l10n/ast.js +++ b/apps/files_encryption/l10n/ast.js @@ -8,7 +8,6 @@ OC.L10N.register( "Password successfully changed." : "Camudóse la contraseña", "Could not change the password. Maybe the old password was not correct." : "Nun pudo camudase la contraseña. Comprueba que la contraseña actual seya correuta.", "Private key password successfully updated." : "Contraseña de clave privada anovada correchamente.", - "Could not update the private key password. Maybe the old password was not correct." : "Nun pudo camudase la contraseña. Pue que la contraseña antigua nun seya correuta.", "File recovery settings updated" : "Opciones de recuperación de ficheros anovada", "Could not update file recovery" : "Nun pudo anovase la recuperación de ficheros", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "¡L'aplicación de cifráu nun s'anició! Seique se restableciera mentanto la sesión. Por favor intenta zarrar la sesión y volver a aniciala p'aniciar l'aplicación de cifráu.", @@ -16,7 +15,6 @@ OC.L10N.register( "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Nun pudo descifrase esti ficheru, dablemente seya un ficheru compartíu. Solicita al propietariu del mesmu que vuelva a compartilu contigo.", "Unknown error. Please check your system settings or contact your administrator" : "Fallu desconocíu. Por favor, comprueba los axustes del sistema o contauta col alministrador", "Missing requirements." : "Requisitos incompletos.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Por favor, asegúrate de que PHP 5.3.3 o postreru ta instaláu y que la estensión OpenSSL de PHP ta habilitada y configurada correutamente. Pel momentu, l'aplicación de cifráu deshabilitóse.", "Following users are not set up for encryption:" : "Los siguientes usuarios nun se configuraron pal cifráu:", "Initial encryption started... This can take some time. Please wait." : "Cifráu aniciáu..... Esto pue llevar un tiempu. Por favor espera.", "Initial encryption running... Please try again later." : "Cifráu inicial en cursu... Inténtalo dempués.", diff --git a/apps/files_encryption/l10n/ast.json b/apps/files_encryption/l10n/ast.json index 4c1edefea97..6418e044717 100644 --- a/apps/files_encryption/l10n/ast.json +++ b/apps/files_encryption/l10n/ast.json @@ -6,7 +6,6 @@ "Password successfully changed." : "Camudóse la contraseña", "Could not change the password. Maybe the old password was not correct." : "Nun pudo camudase la contraseña. Comprueba que la contraseña actual seya correuta.", "Private key password successfully updated." : "Contraseña de clave privada anovada correchamente.", - "Could not update the private key password. Maybe the old password was not correct." : "Nun pudo camudase la contraseña. Pue que la contraseña antigua nun seya correuta.", "File recovery settings updated" : "Opciones de recuperación de ficheros anovada", "Could not update file recovery" : "Nun pudo anovase la recuperación de ficheros", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "¡L'aplicación de cifráu nun s'anició! Seique se restableciera mentanto la sesión. Por favor intenta zarrar la sesión y volver a aniciala p'aniciar l'aplicación de cifráu.", @@ -14,7 +13,6 @@ "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Nun pudo descifrase esti ficheru, dablemente seya un ficheru compartíu. Solicita al propietariu del mesmu que vuelva a compartilu contigo.", "Unknown error. Please check your system settings or contact your administrator" : "Fallu desconocíu. Por favor, comprueba los axustes del sistema o contauta col alministrador", "Missing requirements." : "Requisitos incompletos.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Por favor, asegúrate de que PHP 5.3.3 o postreru ta instaláu y que la estensión OpenSSL de PHP ta habilitada y configurada correutamente. Pel momentu, l'aplicación de cifráu deshabilitóse.", "Following users are not set up for encryption:" : "Los siguientes usuarios nun se configuraron pal cifráu:", "Initial encryption started... This can take some time. Please wait." : "Cifráu aniciáu..... Esto pue llevar un tiempu. Por favor espera.", "Initial encryption running... Please try again later." : "Cifráu inicial en cursu... Inténtalo dempués.", diff --git a/apps/files_encryption/l10n/bg_BG.js b/apps/files_encryption/l10n/bg_BG.js index a117818ba84..258c9d2723e 100644 --- a/apps/files_encryption/l10n/bg_BG.js +++ b/apps/files_encryption/l10n/bg_BG.js @@ -13,8 +13,10 @@ OC.L10N.register( "Please repeat the new recovery password" : "Моля, въведи повторна новата парола за възстановяване", "Password successfully changed." : "Паролата е успешно променена.", "Could not change the password. Maybe the old password was not correct." : "Грешка при промяна на паролата. Може би старата ти парола е сгрешена.", + "Could not update the private key password." : "Неуспешна промяна на паролата на личния ключ", + "The old password was not correct, please try again." : "Старата парола е грешна, опитай отново.", + "The current log-in password was not correct, please try again." : "Грешна парола за вписване, опитай отново.", "Private key password successfully updated." : "Успешно променена тайната парола за ключа.", - "Could not update the private key password. Maybe the old password was not correct." : "Неуспешна промяна на тайната парола за ключа. Може би старата парола е грешно въведена.", "File recovery settings updated" : "Настройките за възстановяване на файлове са променени.", "Could not update file recovery" : "Неуспешна промяна на настройките за възстановяване на файлове.", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Неуспешна инициализация на криптиращото приложение! Може би криптиращото приложение бе включено по време на твоята сесия. Отпиши се и се впиши обратно за да инциализираш криптиращото приложение.", @@ -22,7 +24,6 @@ OC.L10N.register( "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Неуспешно разшифроване на този файл, вероятно това е споделен файл. Моля, поискай собственика на файла да го сподели повторно с теб.", "Unknown error. Please check your system settings or contact your administrator" : "Непозната грешка. Моля, провери системните настройки или се свържи с администратора.", "Missing requirements." : "Липсва задължителна информация.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Моля, увери се, че PHP 5.3.3 или по-нова версия е инсталирана, и че OpenSSL заедно съответната PHP добавка са включени и правилно настроени. За сега, криптиращото приложение ще бъде изключено.", "Following users are not set up for encryption:" : "Следните потребители не са настроени за криптиране:", "Initial encryption started... This can take some time. Please wait." : "Първоначалното криптиране започна... Това може да отнеме време. Моля изчакай.", "Initial encryption running... Please try again later." : "Тече първоначално криптиране... Моля опитай по-късно.", diff --git a/apps/files_encryption/l10n/bg_BG.json b/apps/files_encryption/l10n/bg_BG.json index 74ac2593091..8a2abbfc5c4 100644 --- a/apps/files_encryption/l10n/bg_BG.json +++ b/apps/files_encryption/l10n/bg_BG.json @@ -11,8 +11,10 @@ "Please repeat the new recovery password" : "Моля, въведи повторна новата парола за възстановяване", "Password successfully changed." : "Паролата е успешно променена.", "Could not change the password. Maybe the old password was not correct." : "Грешка при промяна на паролата. Може би старата ти парола е сгрешена.", + "Could not update the private key password." : "Неуспешна промяна на паролата на личния ключ", + "The old password was not correct, please try again." : "Старата парола е грешна, опитай отново.", + "The current log-in password was not correct, please try again." : "Грешна парола за вписване, опитай отново.", "Private key password successfully updated." : "Успешно променена тайната парола за ключа.", - "Could not update the private key password. Maybe the old password was not correct." : "Неуспешна промяна на тайната парола за ключа. Може би старата парола е грешно въведена.", "File recovery settings updated" : "Настройките за възстановяване на файлове са променени.", "Could not update file recovery" : "Неуспешна промяна на настройките за възстановяване на файлове.", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Неуспешна инициализация на криптиращото приложение! Може би криптиращото приложение бе включено по време на твоята сесия. Отпиши се и се впиши обратно за да инциализираш криптиращото приложение.", @@ -20,7 +22,6 @@ "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Неуспешно разшифроване на този файл, вероятно това е споделен файл. Моля, поискай собственика на файла да го сподели повторно с теб.", "Unknown error. Please check your system settings or contact your administrator" : "Непозната грешка. Моля, провери системните настройки или се свържи с администратора.", "Missing requirements." : "Липсва задължителна информация.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Моля, увери се, че PHP 5.3.3 или по-нова версия е инсталирана, и че OpenSSL заедно съответната PHP добавка са включени и правилно настроени. За сега, криптиращото приложение ще бъде изключено.", "Following users are not set up for encryption:" : "Следните потребители не са настроени за криптиране:", "Initial encryption started... This can take some time. Please wait." : "Първоначалното криптиране започна... Това може да отнеме време. Моля изчакай.", "Initial encryption running... Please try again later." : "Тече първоначално криптиране... Моля опитай по-късно.", diff --git a/apps/files_encryption/l10n/bs.js b/apps/files_encryption/l10n/bs.js new file mode 100644 index 00000000000..1dc094cc436 --- /dev/null +++ b/apps/files_encryption/l10n/bs.js @@ -0,0 +1,10 @@ +OC.L10N.register( + "files_encryption", + { + "Unknown error" : "Nepoznata greška", + "Encryption" : "Šifriranje", + "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Aplikacija šifriranja je uključena, ali vaši ključevi nisu inicializirani, molim odjavite se i ponovno prijavite", + "Enabled" : "Aktivirano", + "Disabled" : "Onemogućeno" +}, +"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/apps/files_encryption/l10n/bs.json b/apps/files_encryption/l10n/bs.json new file mode 100644 index 00000000000..e2085f953cc --- /dev/null +++ b/apps/files_encryption/l10n/bs.json @@ -0,0 +1,8 @@ +{ "translations": { + "Unknown error" : "Nepoznata greška", + "Encryption" : "Šifriranje", + "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Aplikacija šifriranja je uključena, ali vaši ključevi nisu inicializirani, molim odjavite se i ponovno prijavite", + "Enabled" : "Aktivirano", + "Disabled" : "Onemogućeno" +},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" +}
\ No newline at end of file diff --git a/apps/files_encryption/l10n/ca.js b/apps/files_encryption/l10n/ca.js index e443d384ac2..033792d4233 100644 --- a/apps/files_encryption/l10n/ca.js +++ b/apps/files_encryption/l10n/ca.js @@ -8,7 +8,6 @@ OC.L10N.register( "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.", "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.", "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", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "L'aplicació d'encriptació no està inicialitzada! Potser l'aplicació d'encriptació ha estat reiniciada durant la sessió. Intenteu sortir i acreditar-vos de nou per reinicialitzar l'aplicació d'encriptació.", @@ -16,7 +15,6 @@ OC.L10N.register( "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "No es pot desencriptar aquest fitxer, probablement és un fitxer compartit. Demaneu al propietari del fitxer que el comparteixi de nou amb vós.", "Unknown error. Please check your system settings or contact your administrator" : "Error desconegut. Comproveu l'arranjament del sistema o aviseu a l'administrador", "Missing requirements." : "Manca de requisits.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Assegureu-vos que teniu instal·lat PHP 5.3.3 o una versió superior i que està activat Open SSL i habilitada i configurada correctament l'extensió de PHP. De moment, l'aplicació d'encriptació s'ha desactivat.", "Following users are not set up for encryption:" : "Els usuaris següents no estan configurats per a l'encriptació:", "Initial encryption started... This can take some time. Please wait." : "La encriptació inicial ha començat... Pot trigar una estona, espereu.", "Initial encryption running... Please try again later." : "encriptació inicial en procés... Proveu-ho més tard.", diff --git a/apps/files_encryption/l10n/ca.json b/apps/files_encryption/l10n/ca.json index a65fbf9c88e..85130ff900e 100644 --- a/apps/files_encryption/l10n/ca.json +++ b/apps/files_encryption/l10n/ca.json @@ -6,7 +6,6 @@ "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.", "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.", "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", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "L'aplicació d'encriptació no està inicialitzada! Potser l'aplicació d'encriptació ha estat reiniciada durant la sessió. Intenteu sortir i acreditar-vos de nou per reinicialitzar l'aplicació d'encriptació.", @@ -14,7 +13,6 @@ "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "No es pot desencriptar aquest fitxer, probablement és un fitxer compartit. Demaneu al propietari del fitxer que el comparteixi de nou amb vós.", "Unknown error. Please check your system settings or contact your administrator" : "Error desconegut. Comproveu l'arranjament del sistema o aviseu a l'administrador", "Missing requirements." : "Manca de requisits.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Assegureu-vos que teniu instal·lat PHP 5.3.3 o una versió superior i que està activat Open SSL i habilitada i configurada correctament l'extensió de PHP. De moment, l'aplicació d'encriptació s'ha desactivat.", "Following users are not set up for encryption:" : "Els usuaris següents no estan configurats per a l'encriptació:", "Initial encryption started... This can take some time. Please wait." : "La encriptació inicial ha començat... Pot trigar una estona, espereu.", "Initial encryption running... Please try again later." : "encriptació inicial en procés... Proveu-ho més tard.", diff --git a/apps/files_encryption/l10n/cs_CZ.js b/apps/files_encryption/l10n/cs_CZ.js index 3c3b54e67f3..d25536cfd7b 100644 --- a/apps/files_encryption/l10n/cs_CZ.js +++ b/apps/files_encryption/l10n/cs_CZ.js @@ -8,24 +8,26 @@ OC.L10N.register( "Recovery key successfully enabled" : "Záchranný klíč byl úspěšně povolen", "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!", "Recovery key successfully disabled" : "Záchranný klíč byl úspěšně zakázán", - "Please provide the old recovery password" : "Zapište prosím staré heslo pro obnovu", - "Please provide a new recovery password" : "Zapište prosím nové heslo pro obnovu", + "Please provide the old recovery password" : "Zadejte prosím staré heslo pro obnovu", + "Please provide a new recovery password" : "Zadejte prosím nové heslo pro obnovu", "Please repeat the new recovery password" : "Zopakujte prosím nové heslo pro obnovu", "Password successfully changed." : "Heslo bylo úspěšně změněno.", "Could not change the password. Maybe the old password was not correct." : "Změna hesla se nezdařila. Pravděpodobně nebylo stávající heslo zadáno správně.", + "Could not update the private key password." : "Nelze aktualizovat heslo soukromého klíče.", + "The old password was not correct, please try again." : "Staré heslo nebylo zadáno správně, zkuste to prosím znovu.", + "The current log-in password was not correct, please try again." : "Současné přihlašovací heslo nebylo zadáno správně, zkuste to prosím znovu.", "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ě.", "File recovery settings updated" : "Možnosti záchrany souborů aktualizovány", "Could not update file recovery" : "Nelze nastavit záchranu souborů", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Aplikace pro šifrování není inicializována! Je možné, že aplikace byla znovu aktivována během vašeho přihlášení. Zkuste se prosím odhlásit a znovu přihlásit pro provedení inicializace šifrovací aplikace.", "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Váš soukromý klíč není platný! Pravděpodobně bylo vaše heslo změněno vně systému %s (např. ve vašem firemním adresáři). Heslo vašeho soukromého klíče můžete změnit ve svém osobním nastavení pro obnovení přístupu k vašim zašifrovaným souborům.", "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Tento soubor se nepodařilo dešifrovat, pravděpodobně je sdílený. Požádejte prosím majitele souboru, aby jej s vámi znovu sdílel.", "Unknown error. Please check your system settings or contact your administrator" : "Neznámá chyba. Zkontrolujte nastavení systému nebo kontaktujte vašeho správce.", - "Missing requirements." : "Nesplněné závislosti.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Ujistěte se prosím, že máte nainstalované PHP 5.3.3 nebo novější a že máte povolené a správně nakonfigurované OpenSSL včetně jeho rozšíření pro PHP. Prozatím byla aplikace pro šifrování vypnuta.", - "Following users are not set up for encryption:" : "Následující uživatelé nemají nastavené šifrování:", "Initial encryption started... This can take some time. Please wait." : "Počáteční šifrování zahájeno... Toto může chvíli trvat. Počkejte prosím.", "Initial encryption running... Please try again later." : "Probíhá počáteční šifrování... Zkuste to prosím znovu později.", + "Missing requirements." : "Nesplněné závislosti.", + "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Ujistěte se prosím, že máte povolené a správně nakonfigurované OpenSSL včetně jeho rozšíření pro PHP. Aplikace pro šifrování byla prozatím vypnuta.", + "Following users are not set up for encryption:" : "Následující uživatelé nemají nastavené šifrování:", "Go directly to your %spersonal settings%s." : "Přejít přímo do svého %sosobního nastavení%s.", "Encryption" : "Šifrování", "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Aplikace pro šifrování je zapnuta, ale vaše klíče nejsou inicializované. Prosím odhlaste se a znovu přihlaste", diff --git a/apps/files_encryption/l10n/cs_CZ.json b/apps/files_encryption/l10n/cs_CZ.json index 5bd5bb54f01..2dad822877d 100644 --- a/apps/files_encryption/l10n/cs_CZ.json +++ b/apps/files_encryption/l10n/cs_CZ.json @@ -6,24 +6,26 @@ "Recovery key successfully enabled" : "Záchranný klíč byl úspěšně povolen", "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!", "Recovery key successfully disabled" : "Záchranný klíč byl úspěšně zakázán", - "Please provide the old recovery password" : "Zapište prosím staré heslo pro obnovu", - "Please provide a new recovery password" : "Zapište prosím nové heslo pro obnovu", + "Please provide the old recovery password" : "Zadejte prosím staré heslo pro obnovu", + "Please provide a new recovery password" : "Zadejte prosím nové heslo pro obnovu", "Please repeat the new recovery password" : "Zopakujte prosím nové heslo pro obnovu", "Password successfully changed." : "Heslo bylo úspěšně změněno.", "Could not change the password. Maybe the old password was not correct." : "Změna hesla se nezdařila. Pravděpodobně nebylo stávající heslo zadáno správně.", + "Could not update the private key password." : "Nelze aktualizovat heslo soukromého klíče.", + "The old password was not correct, please try again." : "Staré heslo nebylo zadáno správně, zkuste to prosím znovu.", + "The current log-in password was not correct, please try again." : "Současné přihlašovací heslo nebylo zadáno správně, zkuste to prosím znovu.", "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ě.", "File recovery settings updated" : "Možnosti záchrany souborů aktualizovány", "Could not update file recovery" : "Nelze nastavit záchranu souborů", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Aplikace pro šifrování není inicializována! Je možné, že aplikace byla znovu aktivována během vašeho přihlášení. Zkuste se prosím odhlásit a znovu přihlásit pro provedení inicializace šifrovací aplikace.", "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Váš soukromý klíč není platný! Pravděpodobně bylo vaše heslo změněno vně systému %s (např. ve vašem firemním adresáři). Heslo vašeho soukromého klíče můžete změnit ve svém osobním nastavení pro obnovení přístupu k vašim zašifrovaným souborům.", "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Tento soubor se nepodařilo dešifrovat, pravděpodobně je sdílený. Požádejte prosím majitele souboru, aby jej s vámi znovu sdílel.", "Unknown error. Please check your system settings or contact your administrator" : "Neznámá chyba. Zkontrolujte nastavení systému nebo kontaktujte vašeho správce.", - "Missing requirements." : "Nesplněné závislosti.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Ujistěte se prosím, že máte nainstalované PHP 5.3.3 nebo novější a že máte povolené a správně nakonfigurované OpenSSL včetně jeho rozšíření pro PHP. Prozatím byla aplikace pro šifrování vypnuta.", - "Following users are not set up for encryption:" : "Následující uživatelé nemají nastavené šifrování:", "Initial encryption started... This can take some time. Please wait." : "Počáteční šifrování zahájeno... Toto může chvíli trvat. Počkejte prosím.", "Initial encryption running... Please try again later." : "Probíhá počáteční šifrování... Zkuste to prosím znovu později.", + "Missing requirements." : "Nesplněné závislosti.", + "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Ujistěte se prosím, že máte povolené a správně nakonfigurované OpenSSL včetně jeho rozšíření pro PHP. Aplikace pro šifrování byla prozatím vypnuta.", + "Following users are not set up for encryption:" : "Následující uživatelé nemají nastavené šifrování:", "Go directly to your %spersonal settings%s." : "Přejít přímo do svého %sosobního nastavení%s.", "Encryption" : "Šifrování", "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Aplikace pro šifrování je zapnuta, ale vaše klíče nejsou inicializované. Prosím odhlaste se a znovu přihlaste", diff --git a/apps/files_encryption/l10n/da.js b/apps/files_encryption/l10n/da.js index 9c12271be0b..93c718357c9 100644 --- a/apps/files_encryption/l10n/da.js +++ b/apps/files_encryption/l10n/da.js @@ -13,8 +13,10 @@ OC.L10N.register( "Please repeat the new recovery password" : "Gentag venligst det nye kodeord til gendannelse", "Password successfully changed." : "Kodeordet blev ændret succesfuldt", "Could not change the password. Maybe the old password was not correct." : "Kunne ikke ændre kodeordet. Måske var det gamle kodeord ikke korrekt.", + "Could not update the private key password." : "Kunne ikke opdatere kodeordet til den private nøgle.", + "The old password was not correct, please try again." : "Det gamle kodeord var ikke korrekt, prøv venligst igen.", + "The current log-in password was not correct, please try again." : "Det nuværende kodeord til log-in var ikke korrekt, prøv venligst igen.", "Private key password successfully updated." : "Privat nøgle kodeord succesfuldt opdateret.", - "Could not update the private key password. Maybe the old password was not correct." : "Kunne ikke opdatere det private nøgle kodeord-. Måske var det gamle kodeord forkert.", "File recovery settings updated" : "Filgendannelsesindstillinger opdateret", "Could not update file recovery" : "Kunne ikke opdatere filgendannelse", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Krypteringsprogrammet er ikke igangsat. Det kan skyldes at krypteringsprogrammet er blevet genaktiveret under din session. Prøv at logge ud og ind igen for at aktivere krypteringsprogrammet. ", @@ -22,7 +24,7 @@ OC.L10N.register( "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Kan ikke kryptere denne fil, sandsynligvis fordi felen er delt. Bed venligst filens ejer om at dele den med dig på ny.", "Unknown error. Please check your system settings or contact your administrator" : "Ukendt fejl. Venligst tjek dine systemindstillinger eller kontakt din systemadministrator", "Missing requirements." : "Manglende betingelser.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Sørg for at PHP 5.3.3 eller nyere er installeret og at OpenSSL sammen med PHP-udvidelsen er aktiveret og korrekt konfigureret. Indtil videre er krypteringsprogrammet deaktiveret.", + "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Sørg for at OpenSSL, sammen med PHP-udvidelsen, er aktiveret og korrekt konfigureret. Indtil videre er krypteringsprogrammet deaktiveret.", "Following users are not set up for encryption:" : "Følgende brugere er ikke sat op til kryptering:", "Initial encryption started... This can take some time. Please wait." : "Førstegangskrypteringen er påbegyndt... Dette kan tage nogen tid. Vent venligst.", "Initial encryption running... Please try again later." : "Kryptering foretages... Prøv venligst igen senere.", diff --git a/apps/files_encryption/l10n/da.json b/apps/files_encryption/l10n/da.json index 65a64a95d33..cd77a31993e 100644 --- a/apps/files_encryption/l10n/da.json +++ b/apps/files_encryption/l10n/da.json @@ -11,8 +11,10 @@ "Please repeat the new recovery password" : "Gentag venligst det nye kodeord til gendannelse", "Password successfully changed." : "Kodeordet blev ændret succesfuldt", "Could not change the password. Maybe the old password was not correct." : "Kunne ikke ændre kodeordet. Måske var det gamle kodeord ikke korrekt.", + "Could not update the private key password." : "Kunne ikke opdatere kodeordet til den private nøgle.", + "The old password was not correct, please try again." : "Det gamle kodeord var ikke korrekt, prøv venligst igen.", + "The current log-in password was not correct, please try again." : "Det nuværende kodeord til log-in var ikke korrekt, prøv venligst igen.", "Private key password successfully updated." : "Privat nøgle kodeord succesfuldt opdateret.", - "Could not update the private key password. Maybe the old password was not correct." : "Kunne ikke opdatere det private nøgle kodeord-. Måske var det gamle kodeord forkert.", "File recovery settings updated" : "Filgendannelsesindstillinger opdateret", "Could not update file recovery" : "Kunne ikke opdatere filgendannelse", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Krypteringsprogrammet er ikke igangsat. Det kan skyldes at krypteringsprogrammet er blevet genaktiveret under din session. Prøv at logge ud og ind igen for at aktivere krypteringsprogrammet. ", @@ -20,7 +22,7 @@ "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Kan ikke kryptere denne fil, sandsynligvis fordi felen er delt. Bed venligst filens ejer om at dele den med dig på ny.", "Unknown error. Please check your system settings or contact your administrator" : "Ukendt fejl. Venligst tjek dine systemindstillinger eller kontakt din systemadministrator", "Missing requirements." : "Manglende betingelser.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Sørg for at PHP 5.3.3 eller nyere er installeret og at OpenSSL sammen med PHP-udvidelsen er aktiveret og korrekt konfigureret. Indtil videre er krypteringsprogrammet deaktiveret.", + "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Sørg for at OpenSSL, sammen med PHP-udvidelsen, er aktiveret og korrekt konfigureret. Indtil videre er krypteringsprogrammet deaktiveret.", "Following users are not set up for encryption:" : "Følgende brugere er ikke sat op til kryptering:", "Initial encryption started... This can take some time. Please wait." : "Førstegangskrypteringen er påbegyndt... Dette kan tage nogen tid. Vent venligst.", "Initial encryption running... Please try again later." : "Kryptering foretages... Prøv venligst igen senere.", diff --git a/apps/files_encryption/l10n/de.js b/apps/files_encryption/l10n/de.js index 2c680836cb5..9687e081c76 100644 --- a/apps/files_encryption/l10n/de.js +++ b/apps/files_encryption/l10n/de.js @@ -13,8 +13,10 @@ OC.L10N.register( "Please repeat the new recovery password" : "Bitte das neue Passwort zur Wiederherstellung wiederholen", "Password successfully changed." : "Dein Passwort wurde geändert.", "Could not change the password. Maybe the old password was not correct." : "Das Passwort konnte nicht geändert werden. Vielleicht war das alte Passwort falsch.", + "Could not update the private key password." : "Das Passwort des privaten Schlüssels konnte nicht aktualisiert werden.", + "The old password was not correct, please try again." : "Das alte Passwort war nicht korrekt, bitte versuche es noch einmal.", + "The current log-in password was not correct, please try again." : "Das aktuelle Anmeldepasswort war nicht korrekt, bitte versuche es noch einmal.", "Private key password successfully updated." : "Passwort des privaten Schlüssels erfolgreich aktualisiert", - "Could not update the private key password. Maybe the old password was not correct." : "Das Passwort des privaten Schlüssels konnte nicht aktualisiert werden. Eventuell war das alte Passwort falsch.", "File recovery settings updated" : "Einstellungen zur Wiederherstellung von Dateien wurden aktualisiert", "Could not update file recovery" : "Dateiwiederherstellung konnte nicht aktualisiert werden", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Verschlüsselung-App ist nicht initialisiert! Vielleicht wurde die Verschlüsselung-App in der aktuellen Sitzung reaktiviert. Bitte versuche Dich ab- und wieder anzumelden, um die Verschlüsselung-App zu initialisieren.", @@ -22,7 +24,7 @@ OC.L10N.register( "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Die Datei kann nicht entschlüsselt werden, da die Datei möglicherweise eine geteilte Datei ist. Bitte frage den Dateibesitzer, ob er die Datei nochmals mit Dir teilt.", "Unknown error. Please check your system settings or contact your administrator" : "Unbekannter Fehler. Bitte prüfe Deine Systemeinstellungen oder kontaktiere Deinen Administrator", "Missing requirements." : "Fehlende Vorraussetzungen", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Bitte stelle sicher, dass PHP 5.3.3 oder neuer installiert und das OpenSSL zusammen mit der PHP-Erweiterung aktiviert und richtig konfiguriert ist. Zur Zeit ist die Verschlüsselungs-App deaktiviert.", + "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Bitte stelle sicher, dass OpenSSL zusammen mit der PHP-Erweiterung aktiviert und richtig konfiguriert ist. Die Verschlüsselungsanwendung ist vorerst deaktiviert.", "Following users are not set up for encryption:" : "Für folgende Nutzer ist keine Verschlüsselung eingerichtet:", "Initial encryption started... This can take some time. Please wait." : "Initialverschlüsselung gestartet... Dies kann einige Zeit dauern. Bitte warten.", "Initial encryption running... Please try again later." : "Anfangsverschlüsselung läuft … Bitte versuche es später wieder.", diff --git a/apps/files_encryption/l10n/de.json b/apps/files_encryption/l10n/de.json index ce5b6e81af1..5fc3fb822fd 100644 --- a/apps/files_encryption/l10n/de.json +++ b/apps/files_encryption/l10n/de.json @@ -11,8 +11,10 @@ "Please repeat the new recovery password" : "Bitte das neue Passwort zur Wiederherstellung wiederholen", "Password successfully changed." : "Dein Passwort wurde geändert.", "Could not change the password. Maybe the old password was not correct." : "Das Passwort konnte nicht geändert werden. Vielleicht war das alte Passwort falsch.", + "Could not update the private key password." : "Das Passwort des privaten Schlüssels konnte nicht aktualisiert werden.", + "The old password was not correct, please try again." : "Das alte Passwort war nicht korrekt, bitte versuche es noch einmal.", + "The current log-in password was not correct, please try again." : "Das aktuelle Anmeldepasswort war nicht korrekt, bitte versuche es noch einmal.", "Private key password successfully updated." : "Passwort des privaten Schlüssels erfolgreich aktualisiert", - "Could not update the private key password. Maybe the old password was not correct." : "Das Passwort des privaten Schlüssels konnte nicht aktualisiert werden. Eventuell war das alte Passwort falsch.", "File recovery settings updated" : "Einstellungen zur Wiederherstellung von Dateien wurden aktualisiert", "Could not update file recovery" : "Dateiwiederherstellung konnte nicht aktualisiert werden", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Verschlüsselung-App ist nicht initialisiert! Vielleicht wurde die Verschlüsselung-App in der aktuellen Sitzung reaktiviert. Bitte versuche Dich ab- und wieder anzumelden, um die Verschlüsselung-App zu initialisieren.", @@ -20,7 +22,7 @@ "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Die Datei kann nicht entschlüsselt werden, da die Datei möglicherweise eine geteilte Datei ist. Bitte frage den Dateibesitzer, ob er die Datei nochmals mit Dir teilt.", "Unknown error. Please check your system settings or contact your administrator" : "Unbekannter Fehler. Bitte prüfe Deine Systemeinstellungen oder kontaktiere Deinen Administrator", "Missing requirements." : "Fehlende Vorraussetzungen", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Bitte stelle sicher, dass PHP 5.3.3 oder neuer installiert und das OpenSSL zusammen mit der PHP-Erweiterung aktiviert und richtig konfiguriert ist. Zur Zeit ist die Verschlüsselungs-App deaktiviert.", + "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Bitte stelle sicher, dass OpenSSL zusammen mit der PHP-Erweiterung aktiviert und richtig konfiguriert ist. Die Verschlüsselungsanwendung ist vorerst deaktiviert.", "Following users are not set up for encryption:" : "Für folgende Nutzer ist keine Verschlüsselung eingerichtet:", "Initial encryption started... This can take some time. Please wait." : "Initialverschlüsselung gestartet... Dies kann einige Zeit dauern. Bitte warten.", "Initial encryption running... Please try again later." : "Anfangsverschlüsselung läuft … Bitte versuche es später wieder.", diff --git a/apps/files_encryption/l10n/de_DE.js b/apps/files_encryption/l10n/de_DE.js index f24b4a74358..01420b52e8d 100644 --- a/apps/files_encryption/l10n/de_DE.js +++ b/apps/files_encryption/l10n/de_DE.js @@ -13,8 +13,10 @@ OC.L10N.register( "Please repeat the new recovery password" : "Bitte das neue Passwort zur Wiederherstellung wiederholen", "Password successfully changed." : "Das Passwort wurde erfolgreich geändert.", "Could not change the password. Maybe the old password was not correct." : "Das Passwort konnte nicht geändert werden. Vielleicht war das alte Passwort nicht richtig.", + "Could not update the private key password." : "Das Passwort des privaten Schlüssels konnte nicht aktualisiert werden.", + "The old password was not correct, please try again." : "Das alte Passwort war nicht korrekt, bitte versuchen Sie es noch einmal.", + "The current log-in password was not correct, please try again." : "Das aktuelle Anmeldepasswort war nicht korrekt, bitte versuchen Sie es noch einmal.", "Private key password successfully updated." : "Das Passwort des privaten Schlüssels wurde erfolgreich aktualisiert.", - "Could not update the private key password. Maybe the old password was not correct." : "Das Passwort des privaten Schlüssels konnte nicht aktualisiert werden. Vielleicht war das alte Passwort nicht richtig.", "File recovery settings updated" : "Die Einstellungen für die Dateiwiederherstellung wurden aktualisiert.", "Could not update file recovery" : "Die Dateiwiederherstellung konnte nicht aktualisiert werden.", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Verschlüsselung-App ist nicht initialisiert! Vielleicht wurde die Verschlüsselung-App in der aktuellen Sitzung reaktiviert. Bitte versuchen Sie sich ab- und wieder anzumelden, um die Verschlüsselung-App zu initialisieren.", @@ -22,7 +24,7 @@ OC.L10N.register( "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Die Datei kann nicht entschlüsselt werden, da die Datei möglicherweise eine geteilte Datei ist. Bitte fragen Sie den Dateibesitzer, dass er die Datei nochmals mit Ihnen teilt.", "Unknown error. Please check your system settings or contact your administrator" : "Unbekannter Fehler. Bitte prüfen Sie die Systemeinstellungen oder kontaktieren Sie Ihren Administrator", "Missing requirements." : "Fehlende Voraussetzungen", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Bitte stellen Sie sicher, dass PHP 5.3.3 oder neuer installiert und das OpenSSL zusammen mit der PHP-Erweiterung aktiviert und richtig konfiguriert ist. Zur Zeit ist die Verschlüsselungs-App deaktiviert.", + "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Bitte stellen Sie sicher, dass OpenSSL zusammen mit der PHP-Erweiterung aktiviert und richtig konfiguriert ist. Die Verschlüsselungsanwendung ist vorerst deaktiviert.", "Following users are not set up for encryption:" : "Für folgende Nutzer ist keine Verschlüsselung eingerichtet:", "Initial encryption started... This can take some time. Please wait." : "Anfangsverschlüsselung gestartet … Dieses kann einige Zeit dauern. Bitte warten.", "Initial encryption running... Please try again later." : "Anfangsverschlüsselung läuft … Bitte versuchen Sie es später wieder.", diff --git a/apps/files_encryption/l10n/de_DE.json b/apps/files_encryption/l10n/de_DE.json index 0bbba2a50df..9105dc1e4c3 100644 --- a/apps/files_encryption/l10n/de_DE.json +++ b/apps/files_encryption/l10n/de_DE.json @@ -11,8 +11,10 @@ "Please repeat the new recovery password" : "Bitte das neue Passwort zur Wiederherstellung wiederholen", "Password successfully changed." : "Das Passwort wurde erfolgreich geändert.", "Could not change the password. Maybe the old password was not correct." : "Das Passwort konnte nicht geändert werden. Vielleicht war das alte Passwort nicht richtig.", + "Could not update the private key password." : "Das Passwort des privaten Schlüssels konnte nicht aktualisiert werden.", + "The old password was not correct, please try again." : "Das alte Passwort war nicht korrekt, bitte versuchen Sie es noch einmal.", + "The current log-in password was not correct, please try again." : "Das aktuelle Anmeldepasswort war nicht korrekt, bitte versuchen Sie es noch einmal.", "Private key password successfully updated." : "Das Passwort des privaten Schlüssels wurde erfolgreich aktualisiert.", - "Could not update the private key password. Maybe the old password was not correct." : "Das Passwort des privaten Schlüssels konnte nicht aktualisiert werden. Vielleicht war das alte Passwort nicht richtig.", "File recovery settings updated" : "Die Einstellungen für die Dateiwiederherstellung wurden aktualisiert.", "Could not update file recovery" : "Die Dateiwiederherstellung konnte nicht aktualisiert werden.", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Verschlüsselung-App ist nicht initialisiert! Vielleicht wurde die Verschlüsselung-App in der aktuellen Sitzung reaktiviert. Bitte versuchen Sie sich ab- und wieder anzumelden, um die Verschlüsselung-App zu initialisieren.", @@ -20,7 +22,7 @@ "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Die Datei kann nicht entschlüsselt werden, da die Datei möglicherweise eine geteilte Datei ist. Bitte fragen Sie den Dateibesitzer, dass er die Datei nochmals mit Ihnen teilt.", "Unknown error. Please check your system settings or contact your administrator" : "Unbekannter Fehler. Bitte prüfen Sie die Systemeinstellungen oder kontaktieren Sie Ihren Administrator", "Missing requirements." : "Fehlende Voraussetzungen", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Bitte stellen Sie sicher, dass PHP 5.3.3 oder neuer installiert und das OpenSSL zusammen mit der PHP-Erweiterung aktiviert und richtig konfiguriert ist. Zur Zeit ist die Verschlüsselungs-App deaktiviert.", + "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Bitte stellen Sie sicher, dass OpenSSL zusammen mit der PHP-Erweiterung aktiviert und richtig konfiguriert ist. Die Verschlüsselungsanwendung ist vorerst deaktiviert.", "Following users are not set up for encryption:" : "Für folgende Nutzer ist keine Verschlüsselung eingerichtet:", "Initial encryption started... This can take some time. Please wait." : "Anfangsverschlüsselung gestartet … Dieses kann einige Zeit dauern. Bitte warten.", "Initial encryption running... Please try again later." : "Anfangsverschlüsselung läuft … Bitte versuchen Sie es später wieder.", diff --git a/apps/files_encryption/l10n/el.js b/apps/files_encryption/l10n/el.js index a39a0c867f3..bb12d05f049 100644 --- a/apps/files_encryption/l10n/el.js +++ b/apps/files_encryption/l10n/el.js @@ -13,19 +13,19 @@ OC.L10N.register( "Please repeat the new recovery password" : "Παρακαλώ επαναλάβετε το νέο κωδικό επαναφοράς", "Password successfully changed." : "Ο κωδικός αλλάχτηκε επιτυχώς.", "Could not change the password. Maybe the old password was not correct." : "Αποτυχία αλλαγής κωδικού ίσως ο παλιός κωδικός να μην ήταν σωστός.", + "The old password was not correct, please try again." : "Το παλαιό συνθηματικό δεν είναι σωστό, παρακαλώ δοκιμάστε ξανά.", + "The current log-in password was not correct, please try again." : "Το τρέχον συνθηματικό δεν είναι σωστό, παρακαλώ δοκιμάστε ξανά.", "Private key password successfully updated." : "Το Προσωπικό κλειδί πρόσβασης ενημερώθηκε επιτυχώς", - "Could not update the private key password. Maybe the old password was not correct." : "Αποτυχία ενημέρωσης του κωδικού για το προσωπικό κλειδί. Ενδεχομένως ο παλιός κωδικός δεν ήταν σωστός.", "File recovery settings updated" : "Οι ρυθμίσεις επαναφοράς αρχείων ανανεώθηκαν", "Could not update file recovery" : "Αποτυχία ενημέρωσης ανάκτησης αρχείων", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Η εφαρμογή κρυπτογράφησης δεν έχει εκκινήσει! Ίσως η εφαρμογή κρυπτογράφησης επανενεργοποιήθηκε κατά τη διάρκεια της τρέχουσας σύνδεσής σας. Παρακαλώ προσπαθήστε να αποσυνδεθείτε και να ξανασυνδεθείτε για να εκκινήσετε την εφαρμογή κρυπτογράφησης.", "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Το προσωπικό σας κλειδί δεν είναι έγκυρο! Πιθανόν ο κωδικός σας να άλλαξε έξω από το %s (π.χ. τη λίστα διευθύνσεων της εταιρείας σας). Μπορείτε να ενημερώσετε το προσωπικό σας κλειδί επαναφοράς κωδικού στις προσωπικές σας ρυθμίσεις για να επανακτήσετε πρόσβαση στα κρυπτογραφημένα σας αρχεία.", "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Δεν ήταν δυνατό να αποκρυπτογραφηθεί αυτό το αρχείο, πιθανόν πρόκειται για κοινόχρηστο αρχείο. Παρακαλώ ζητήστε από τον ιδιοκτήτη του αρχείου να το ξαναμοιραστεί μαζί σας.", "Unknown error. Please check your system settings or contact your administrator" : "Άγνωστο σφάλμα. Παρακαλώ ελέγξτε τις ρυθμίσεις του συστήματό σας ή επικοινωνήστε με τον διαχειριστή συστημάτων σας", - "Missing requirements." : "Προαπαιτούμενα που απουσιάζουν.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Παρακαλώ επιβεβαιώστε ότι η PHP 5.3.3 ή νεότερη είναι εγκατεστημένη και ότι το OpenSSL μαζί με το PHP extension είναι ενεργοποιήμένο και έχει ρυθμιστεί σωστά. Προς το παρόν, η εφαρμογή κρυπτογράφησης είναι απενεργοποιημένη.", - "Following users are not set up for encryption:" : "Οι κάτωθι χρήστες δεν έχουν ρυθμιστεί για κρυπογράφηση:", "Initial encryption started... This can take some time. Please wait." : "Η αρχική κρυπτογράφηση άρχισε... Αυτό μπορεί να πάρει κάποια ώρα. Παρακαλώ περιμένετε.", "Initial encryption running... Please try again later." : "Εκτέλεση αρχικής κρυπτογράφησης... Παρακαλώ προσπαθήστε αργότερα.", + "Missing requirements." : "Προαπαιτούμενα που απουσιάζουν.", + "Following users are not set up for encryption:" : "Οι κάτωθι χρήστες δεν έχουν ρυθμιστεί για κρυπογράφηση:", "Go directly to your %spersonal settings%s." : "Πηγαίνετε κατ'ευθείαν στις %sπροσωπικές ρυθμίσεις%s σας.", "Encryption" : "Κρυπτογράφηση", "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Η εφαρμογή κρυπτογράφησης είναι ενεργοποιημένη αλλά τα κλειδιά σας δεν έχουν καταγραφεί, παρακαλώ αποσυνδεθείτε και επανασυνδεθείτε.", diff --git a/apps/files_encryption/l10n/el.json b/apps/files_encryption/l10n/el.json index 0ebf52e3f88..18cf819643b 100644 --- a/apps/files_encryption/l10n/el.json +++ b/apps/files_encryption/l10n/el.json @@ -11,19 +11,19 @@ "Please repeat the new recovery password" : "Παρακαλώ επαναλάβετε το νέο κωδικό επαναφοράς", "Password successfully changed." : "Ο κωδικός αλλάχτηκε επιτυχώς.", "Could not change the password. Maybe the old password was not correct." : "Αποτυχία αλλαγής κωδικού ίσως ο παλιός κωδικός να μην ήταν σωστός.", + "The old password was not correct, please try again." : "Το παλαιό συνθηματικό δεν είναι σωστό, παρακαλώ δοκιμάστε ξανά.", + "The current log-in password was not correct, please try again." : "Το τρέχον συνθηματικό δεν είναι σωστό, παρακαλώ δοκιμάστε ξανά.", "Private key password successfully updated." : "Το Προσωπικό κλειδί πρόσβασης ενημερώθηκε επιτυχώς", - "Could not update the private key password. Maybe the old password was not correct." : "Αποτυχία ενημέρωσης του κωδικού για το προσωπικό κλειδί. Ενδεχομένως ο παλιός κωδικός δεν ήταν σωστός.", "File recovery settings updated" : "Οι ρυθμίσεις επαναφοράς αρχείων ανανεώθηκαν", "Could not update file recovery" : "Αποτυχία ενημέρωσης ανάκτησης αρχείων", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Η εφαρμογή κρυπτογράφησης δεν έχει εκκινήσει! Ίσως η εφαρμογή κρυπτογράφησης επανενεργοποιήθηκε κατά τη διάρκεια της τρέχουσας σύνδεσής σας. Παρακαλώ προσπαθήστε να αποσυνδεθείτε και να ξανασυνδεθείτε για να εκκινήσετε την εφαρμογή κρυπτογράφησης.", "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Το προσωπικό σας κλειδί δεν είναι έγκυρο! Πιθανόν ο κωδικός σας να άλλαξε έξω από το %s (π.χ. τη λίστα διευθύνσεων της εταιρείας σας). Μπορείτε να ενημερώσετε το προσωπικό σας κλειδί επαναφοράς κωδικού στις προσωπικές σας ρυθμίσεις για να επανακτήσετε πρόσβαση στα κρυπτογραφημένα σας αρχεία.", "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Δεν ήταν δυνατό να αποκρυπτογραφηθεί αυτό το αρχείο, πιθανόν πρόκειται για κοινόχρηστο αρχείο. Παρακαλώ ζητήστε από τον ιδιοκτήτη του αρχείου να το ξαναμοιραστεί μαζί σας.", "Unknown error. Please check your system settings or contact your administrator" : "Άγνωστο σφάλμα. Παρακαλώ ελέγξτε τις ρυθμίσεις του συστήματό σας ή επικοινωνήστε με τον διαχειριστή συστημάτων σας", - "Missing requirements." : "Προαπαιτούμενα που απουσιάζουν.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Παρακαλώ επιβεβαιώστε ότι η PHP 5.3.3 ή νεότερη είναι εγκατεστημένη και ότι το OpenSSL μαζί με το PHP extension είναι ενεργοποιήμένο και έχει ρυθμιστεί σωστά. Προς το παρόν, η εφαρμογή κρυπτογράφησης είναι απενεργοποιημένη.", - "Following users are not set up for encryption:" : "Οι κάτωθι χρήστες δεν έχουν ρυθμιστεί για κρυπογράφηση:", "Initial encryption started... This can take some time. Please wait." : "Η αρχική κρυπτογράφηση άρχισε... Αυτό μπορεί να πάρει κάποια ώρα. Παρακαλώ περιμένετε.", "Initial encryption running... Please try again later." : "Εκτέλεση αρχικής κρυπτογράφησης... Παρακαλώ προσπαθήστε αργότερα.", + "Missing requirements." : "Προαπαιτούμενα που απουσιάζουν.", + "Following users are not set up for encryption:" : "Οι κάτωθι χρήστες δεν έχουν ρυθμιστεί για κρυπογράφηση:", "Go directly to your %spersonal settings%s." : "Πηγαίνετε κατ'ευθείαν στις %sπροσωπικές ρυθμίσεις%s σας.", "Encryption" : "Κρυπτογράφηση", "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Η εφαρμογή κρυπτογράφησης είναι ενεργοποιημένη αλλά τα κλειδιά σας δεν έχουν καταγραφεί, παρακαλώ αποσυνδεθείτε και επανασυνδεθείτε.", diff --git a/apps/files_encryption/l10n/en_GB.js b/apps/files_encryption/l10n/en_GB.js index 126d901b24f..1e5e07d450d 100644 --- a/apps/files_encryption/l10n/en_GB.js +++ b/apps/files_encryption/l10n/en_GB.js @@ -13,8 +13,10 @@ OC.L10N.register( "Please repeat the new recovery password" : "Please repeat the new recovery password", "Password successfully changed." : "Password changed successfully.", "Could not change the password. Maybe the old password was not correct." : "Could not change the password. Maybe the old password was incorrect.", + "Could not update the private key password." : "Could not update the private key password.", + "The old password was not correct, please try again." : "The old password was not correct, please try again.", + "The current log-in password was not correct, please try again." : "The current log-in password was not correct, please try again.", "Private key password successfully updated." : "Private key password updated successfully.", - "Could not update the private key password. Maybe the old password was not correct." : "Could not update the private key password. Maybe the old password was not correct.", "File recovery settings updated" : "File recovery settings updated", "Could not update file recovery" : "Could not update file recovery", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Encryption app not initialised! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialise the encryption app.", @@ -22,7 +24,7 @@ OC.L10N.register( "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Cannot decrypt this file, which is probably a shared file. Please ask the file owner to reshare the file with you.", "Unknown error. Please check your system settings or contact your administrator" : "Unknown error. Please check your system settings or contact your administrator", "Missing requirements." : "Missing requirements.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled.", + "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Please make sure that OpenSSL together with the PHP extension is enabled and properly configured. For now, the encryption app has been disabled.", "Following users are not set up for encryption:" : "Following users are not set up for encryption:", "Initial encryption started... This can take some time. Please wait." : "Initial encryption started... This can take some time. Please wait.", "Initial encryption running... Please try again later." : "Initial encryption running... Please try again later.", diff --git a/apps/files_encryption/l10n/en_GB.json b/apps/files_encryption/l10n/en_GB.json index e81b4088055..68478b60d68 100644 --- a/apps/files_encryption/l10n/en_GB.json +++ b/apps/files_encryption/l10n/en_GB.json @@ -11,8 +11,10 @@ "Please repeat the new recovery password" : "Please repeat the new recovery password", "Password successfully changed." : "Password changed successfully.", "Could not change the password. Maybe the old password was not correct." : "Could not change the password. Maybe the old password was incorrect.", + "Could not update the private key password." : "Could not update the private key password.", + "The old password was not correct, please try again." : "The old password was not correct, please try again.", + "The current log-in password was not correct, please try again." : "The current log-in password was not correct, please try again.", "Private key password successfully updated." : "Private key password updated successfully.", - "Could not update the private key password. Maybe the old password was not correct." : "Could not update the private key password. Maybe the old password was not correct.", "File recovery settings updated" : "File recovery settings updated", "Could not update file recovery" : "Could not update file recovery", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Encryption app not initialised! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialise the encryption app.", @@ -20,7 +22,7 @@ "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Cannot decrypt this file, which is probably a shared file. Please ask the file owner to reshare the file with you.", "Unknown error. Please check your system settings or contact your administrator" : "Unknown error. Please check your system settings or contact your administrator", "Missing requirements." : "Missing requirements.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled.", + "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Please make sure that OpenSSL together with the PHP extension is enabled and properly configured. For now, the encryption app has been disabled.", "Following users are not set up for encryption:" : "Following users are not set up for encryption:", "Initial encryption started... This can take some time. Please wait." : "Initial encryption started... This can take some time. Please wait.", "Initial encryption running... Please try again later." : "Initial encryption running... Please try again later.", diff --git a/apps/files_encryption/l10n/es.js b/apps/files_encryption/l10n/es.js index 8101c9f4663..38433330ce0 100644 --- a/apps/files_encryption/l10n/es.js +++ b/apps/files_encryption/l10n/es.js @@ -2,33 +2,35 @@ OC.L10N.register( "files_encryption", { "Unknown error" : "Error desconocido", - "Missing recovery key password" : "Falta contraseña de recuperacion.", - "Please repeat the recovery key password" : "Por favor repita la contraseña de recuperacion", - "Repeated recovery key password does not match the provided recovery key password" : "la contraseña de recuperacion repetida no es igual a la contraseña de recuperacion", + "Missing recovery key password" : "Falta contraseña de recuperación.", + "Please repeat the recovery key password" : "Por favor, repita la contraseña de recuperación", + "Repeated recovery key password does not match the provided recovery key password" : "La contraseña de recuperación reintroducida no coincide con la contraseña de recuperación proporcionada.", "Recovery key successfully enabled" : "Se ha habilitado la recuperación de archivos", "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!", "Recovery key successfully disabled" : "Clave de recuperación deshabilitada", - "Please provide the old recovery password" : "Por favor ingrese su antigua contraseña de recuperacion", - "Please provide a new recovery password" : "Por favor ingrese una nueva contraseña de recuperacion", + "Please provide the old recovery password" : "Por favor, ingrese su antigua contraseña de recuperación", + "Please provide a new recovery password" : "Por favor, ingrese una nueva contraseña de recuperación", "Please repeat the new recovery password" : "Por favor repita su nueva contraseña de recuperacion", "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 update the private key password." : "No se pudo actualizar la contraseña de clave privada.", + "The old password was not correct, please try again." : "La antigua contraseña no es correcta, por favor intente de nuevo.", + "The current log-in password was not correct, please try again." : "La contraseña de inicio de sesión actual no es correcto, por favor intente de nuevo.", "Private key password successfully updated." : "Contraseña de clave privada actualizada con éxito.", - "Could not update the private key password. Maybe the old password was not correct." : "No se pudo cambiar la contraseña. Puede que la contraseña antigua no sea correcta.", "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", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "¡La aplicación de cifrado no ha sido inicializada! Quizá fue restablecida durante tu sesión. Por favor intenta cerrar la sesión y volver a iniciarla para inicializar la aplicación de cifrado.", "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "¡Su clave privada no es válida! Tal vez su contraseña ha sido cambiada desde fuera. de %s (Ej:Su directorio corporativo). Puede actualizar la contraseña de su clave privada en sus opciones personales para recuperar el acceso a sus archivos.", "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "No fue posible descifrar este archivo, probablemente se trate de un archivo compartido. Solicite al propietario del mismo que vuelva a compartirlo con usted.", "Unknown error. Please check your system settings or contact your administrator" : "Error desconocido. Revise la configuración de su sistema o contacte a su administrador", - "Missing requirements." : "Requisitos incompletos.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Por favor, asegúrese de que PHP 5.3.3 o posterior está instalado y que la extensión OpenSSL de PHP está habilitada y configurada correctamente. Por el momento, la aplicación de cifrado ha sido deshabilitada.", - "Following users are not set up for encryption:" : "Los siguientes usuarios no han sido configurados para el cifrado:", "Initial encryption started... This can take some time. Please wait." : "Encriptación iniciada..... Esto puede tomar un tiempo. Por favor espere.", "Initial encryption running... Please try again later." : "Cifrado inicial en curso... Inténtelo más tarde.", + "Missing requirements." : "Requisitos incompletos.", + "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Asegúrese de que OpenSSL y la extensión de PHP estén habilitados y configurados correctamente. Por el momento, la aplicación de cifrado ha sido deshabilitada.", + "Following users are not set up for encryption:" : "Los siguientes usuarios no han sido configurados para el cifrado:", "Go directly to your %spersonal settings%s." : "Ir directamente a %sOpciones%s.", "Encryption" : "Cifrado", - "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "La app de crifrado está habilitada pero tus claves no han sido inicializadas, por favor, cierra la sesión y vuelva a iniciarla de nuevo.", + "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "La app de crifrado está habilitada pero sus claves no han sido inicializadas, por favor, cierre la sesión y vuelva a iniciarla de nuevo.", "Enable recovery key (allow to recover users files in case of password loss):" : "Habilitar la clave de recuperación (permite recuperar los ficheros del usuario en caso de pérdida de la contraseña);", "Recovery key password" : "Contraseña de clave de recuperación", "Repeat Recovery key password" : "Repite la contraseña de clave de recuperación", @@ -39,7 +41,7 @@ OC.L10N.register( "New Recovery key password" : "Nueva clave de recuperación", "Repeat New Recovery key password" : "Repetir la nueva clave de recuperación", "Change Password" : "Cambiar contraseña", - "Your private key password no longer matches your log-in password." : "Tu contraseña de clave privada ya no concuerda con tu contraseña de inicio.", + "Your private key password no longer matches your log-in password." : "Su contraseña de clave privada ya no coincide con su contraseña de acceso.", "Set your old private key password to your current log-in password:" : "Establezca la contraseña de clave privada antigua para su contraseña de inicio de sesión actual:", " If you don't remember your old password you can ask your administrator to recover your files." : "Si no recuerda su antigua contraseña puede pedir a su administrador que le recupere sus ficheros.", "Old log-in password" : "Contraseña de acceso antigua", diff --git a/apps/files_encryption/l10n/es.json b/apps/files_encryption/l10n/es.json index 16cdc6b40a0..001b981978f 100644 --- a/apps/files_encryption/l10n/es.json +++ b/apps/files_encryption/l10n/es.json @@ -1,32 +1,34 @@ { "translations": { "Unknown error" : "Error desconocido", - "Missing recovery key password" : "Falta contraseña de recuperacion.", - "Please repeat the recovery key password" : "Por favor repita la contraseña de recuperacion", - "Repeated recovery key password does not match the provided recovery key password" : "la contraseña de recuperacion repetida no es igual a la contraseña de recuperacion", + "Missing recovery key password" : "Falta contraseña de recuperación.", + "Please repeat the recovery key password" : "Por favor, repita la contraseña de recuperación", + "Repeated recovery key password does not match the provided recovery key password" : "La contraseña de recuperación reintroducida no coincide con la contraseña de recuperación proporcionada.", "Recovery key successfully enabled" : "Se ha habilitado la recuperación de archivos", "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!", "Recovery key successfully disabled" : "Clave de recuperación deshabilitada", - "Please provide the old recovery password" : "Por favor ingrese su antigua contraseña de recuperacion", - "Please provide a new recovery password" : "Por favor ingrese una nueva contraseña de recuperacion", + "Please provide the old recovery password" : "Por favor, ingrese su antigua contraseña de recuperación", + "Please provide a new recovery password" : "Por favor, ingrese una nueva contraseña de recuperación", "Please repeat the new recovery password" : "Por favor repita su nueva contraseña de recuperacion", "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 update the private key password." : "No se pudo actualizar la contraseña de clave privada.", + "The old password was not correct, please try again." : "La antigua contraseña no es correcta, por favor intente de nuevo.", + "The current log-in password was not correct, please try again." : "La contraseña de inicio de sesión actual no es correcto, por favor intente de nuevo.", "Private key password successfully updated." : "Contraseña de clave privada actualizada con éxito.", - "Could not update the private key password. Maybe the old password was not correct." : "No se pudo cambiar la contraseña. Puede que la contraseña antigua no sea correcta.", "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", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "¡La aplicación de cifrado no ha sido inicializada! Quizá fue restablecida durante tu sesión. Por favor intenta cerrar la sesión y volver a iniciarla para inicializar la aplicación de cifrado.", "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "¡Su clave privada no es válida! Tal vez su contraseña ha sido cambiada desde fuera. de %s (Ej:Su directorio corporativo). Puede actualizar la contraseña de su clave privada en sus opciones personales para recuperar el acceso a sus archivos.", "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "No fue posible descifrar este archivo, probablemente se trate de un archivo compartido. Solicite al propietario del mismo que vuelva a compartirlo con usted.", "Unknown error. Please check your system settings or contact your administrator" : "Error desconocido. Revise la configuración de su sistema o contacte a su administrador", - "Missing requirements." : "Requisitos incompletos.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Por favor, asegúrese de que PHP 5.3.3 o posterior está instalado y que la extensión OpenSSL de PHP está habilitada y configurada correctamente. Por el momento, la aplicación de cifrado ha sido deshabilitada.", - "Following users are not set up for encryption:" : "Los siguientes usuarios no han sido configurados para el cifrado:", "Initial encryption started... This can take some time. Please wait." : "Encriptación iniciada..... Esto puede tomar un tiempo. Por favor espere.", "Initial encryption running... Please try again later." : "Cifrado inicial en curso... Inténtelo más tarde.", + "Missing requirements." : "Requisitos incompletos.", + "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Asegúrese de que OpenSSL y la extensión de PHP estén habilitados y configurados correctamente. Por el momento, la aplicación de cifrado ha sido deshabilitada.", + "Following users are not set up for encryption:" : "Los siguientes usuarios no han sido configurados para el cifrado:", "Go directly to your %spersonal settings%s." : "Ir directamente a %sOpciones%s.", "Encryption" : "Cifrado", - "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "La app de crifrado está habilitada pero tus claves no han sido inicializadas, por favor, cierra la sesión y vuelva a iniciarla de nuevo.", + "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "La app de crifrado está habilitada pero sus claves no han sido inicializadas, por favor, cierre la sesión y vuelva a iniciarla de nuevo.", "Enable recovery key (allow to recover users files in case of password loss):" : "Habilitar la clave de recuperación (permite recuperar los ficheros del usuario en caso de pérdida de la contraseña);", "Recovery key password" : "Contraseña de clave de recuperación", "Repeat Recovery key password" : "Repite la contraseña de clave de recuperación", @@ -37,7 +39,7 @@ "New Recovery key password" : "Nueva clave de recuperación", "Repeat New Recovery key password" : "Repetir la nueva clave de recuperación", "Change Password" : "Cambiar contraseña", - "Your private key password no longer matches your log-in password." : "Tu contraseña de clave privada ya no concuerda con tu contraseña de inicio.", + "Your private key password no longer matches your log-in password." : "Su contraseña de clave privada ya no coincide con su contraseña de acceso.", "Set your old private key password to your current log-in password:" : "Establezca la contraseña de clave privada antigua para su contraseña de inicio de sesión actual:", " If you don't remember your old password you can ask your administrator to recover your files." : "Si no recuerda su antigua contraseña puede pedir a su administrador que le recupere sus ficheros.", "Old log-in password" : "Contraseña de acceso antigua", diff --git a/apps/files_encryption/l10n/es_AR.js b/apps/files_encryption/l10n/es_AR.js index 86ac5977f7f..e0da73dae9b 100644 --- a/apps/files_encryption/l10n/es_AR.js +++ b/apps/files_encryption/l10n/es_AR.js @@ -8,14 +8,12 @@ OC.L10N.register( "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.", "Private key password successfully updated." : "Contraseña de clave privada actualizada con éxito.", - "Could not update the private key password. Maybe the old password was not correct." : "No fue posible actualizar la contraseña de clave privada. Tal vez la contraseña anterior no es correcta.", "File recovery settings updated" : "Las opciones de recuperación de archivos fueron actualizadas", "Could not update file recovery" : "No fue posible actualizar la recuperación de archivos", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "¡La aplicación de encriptación no está inicializada! Es probable que la aplicación fue re-habilitada durante tu sesión. Intenta salir y iniciar sesión para volverla a iniciar.", "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "¡Tu llave privada no es válida! Aparenta que tu clave fue cambiada fuera de %s (de tus directorios). Puedes actualizar la contraseña de tu clave privadaen las configuraciones personales para recobrar el acceso a tus archivos encriptados.", "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "No se puede descibrar este archivo, probablemente sea un archivo compartido. Por favor pídele al dueño que recomparta el archivo contigo.", "Missing requirements." : "Requisitos incompletos.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Por favor, asegúrese de que PHP 5.3.3 o una versión más reciente esté instalado y que OpenSSL junto con la extensión PHP esté habilitado y configurado apropiadamente. Por ahora, la aplicación de encriptación ha sido deshabilitada.", "Following users are not set up for encryption:" : "Los siguientes usuarios no fueron configurados para encriptar:", "Initial encryption started... This can take some time. Please wait." : "Encriptación inicial comenzada... Esto puede durar un tiempo. Por favor espere.", "Initial encryption running... Please try again later." : "Encriptación inicial corriendo... Por favor intente mas tarde. ", diff --git a/apps/files_encryption/l10n/es_AR.json b/apps/files_encryption/l10n/es_AR.json index 07dab2694bd..ac76c994787 100644 --- a/apps/files_encryption/l10n/es_AR.json +++ b/apps/files_encryption/l10n/es_AR.json @@ -6,14 +6,12 @@ "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.", "Private key password successfully updated." : "Contraseña de clave privada actualizada con éxito.", - "Could not update the private key password. Maybe the old password was not correct." : "No fue posible actualizar la contraseña de clave privada. Tal vez la contraseña anterior no es correcta.", "File recovery settings updated" : "Las opciones de recuperación de archivos fueron actualizadas", "Could not update file recovery" : "No fue posible actualizar la recuperación de archivos", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "¡La aplicación de encriptación no está inicializada! Es probable que la aplicación fue re-habilitada durante tu sesión. Intenta salir y iniciar sesión para volverla a iniciar.", "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "¡Tu llave privada no es válida! Aparenta que tu clave fue cambiada fuera de %s (de tus directorios). Puedes actualizar la contraseña de tu clave privadaen las configuraciones personales para recobrar el acceso a tus archivos encriptados.", "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "No se puede descibrar este archivo, probablemente sea un archivo compartido. Por favor pídele al dueño que recomparta el archivo contigo.", "Missing requirements." : "Requisitos incompletos.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Por favor, asegúrese de que PHP 5.3.3 o una versión más reciente esté instalado y que OpenSSL junto con la extensión PHP esté habilitado y configurado apropiadamente. Por ahora, la aplicación de encriptación ha sido deshabilitada.", "Following users are not set up for encryption:" : "Los siguientes usuarios no fueron configurados para encriptar:", "Initial encryption started... This can take some time. Please wait." : "Encriptación inicial comenzada... Esto puede durar un tiempo. Por favor espere.", "Initial encryption running... Please try again later." : "Encriptación inicial corriendo... Por favor intente mas tarde. ", diff --git a/apps/files_encryption/l10n/es_MX.js b/apps/files_encryption/l10n/es_MX.js index 02af0608ab1..e445cd03b05 100644 --- a/apps/files_encryption/l10n/es_MX.js +++ b/apps/files_encryption/l10n/es_MX.js @@ -8,14 +8,12 @@ OC.L10N.register( "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.", "Private key password successfully updated." : "Contraseña de clave privada actualizada con éxito.", - "Could not update the private key password. Maybe the old password was not correct." : "No se pudo cambiar la contraseña. Puede que la contraseña antigua no sea correcta.", "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", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "¡La aplicación de cifrado no ha sido inicializada! Quizá fue restablecida durante tu sesión. Por favor intenta cerrar la sesión y volver a iniciarla para inicializar la aplicación de cifrado.", "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "¡Su clave privada no es válida! Tal vez su contraseña ha sido cambiada desde fuera. de %s (Ej:Su directorio corporativo). Puede actualizar la contraseña de su clave privada en sus opciones personales para recuperar el acceso a sus archivos.", "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "No fue posible descifrar este archivo, probablemente se trate de un archivo compartido. Solicite al propietario del mismo que vuelva a compartirlo con usted.", "Missing requirements." : "Requisitos incompletos.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Por favor, asegúrese de que PHP 5.3.3 o posterior está instalado y que la extensión OpenSSL de PHP está habilitada y configurada correctamente. Por el momento, la aplicación de cifrado ha sido deshabilitada.", "Following users are not set up for encryption:" : "Los siguientes usuarios no han sido configurados para el cifrado:", "Initial encryption started... This can take some time. Please wait." : "Encriptación iniciada... Esto puede tomar un tiempo. Por favor espere.", "Encryption" : "Cifrado", diff --git a/apps/files_encryption/l10n/es_MX.json b/apps/files_encryption/l10n/es_MX.json index 1ff89da3d8f..3ca4e51a139 100644 --- a/apps/files_encryption/l10n/es_MX.json +++ b/apps/files_encryption/l10n/es_MX.json @@ -6,14 +6,12 @@ "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.", "Private key password successfully updated." : "Contraseña de clave privada actualizada con éxito.", - "Could not update the private key password. Maybe the old password was not correct." : "No se pudo cambiar la contraseña. Puede que la contraseña antigua no sea correcta.", "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", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "¡La aplicación de cifrado no ha sido inicializada! Quizá fue restablecida durante tu sesión. Por favor intenta cerrar la sesión y volver a iniciarla para inicializar la aplicación de cifrado.", "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "¡Su clave privada no es válida! Tal vez su contraseña ha sido cambiada desde fuera. de %s (Ej:Su directorio corporativo). Puede actualizar la contraseña de su clave privada en sus opciones personales para recuperar el acceso a sus archivos.", "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "No fue posible descifrar este archivo, probablemente se trate de un archivo compartido. Solicite al propietario del mismo que vuelva a compartirlo con usted.", "Missing requirements." : "Requisitos incompletos.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Por favor, asegúrese de que PHP 5.3.3 o posterior está instalado y que la extensión OpenSSL de PHP está habilitada y configurada correctamente. Por el momento, la aplicación de cifrado ha sido deshabilitada.", "Following users are not set up for encryption:" : "Los siguientes usuarios no han sido configurados para el cifrado:", "Initial encryption started... This can take some time. Please wait." : "Encriptación iniciada... Esto puede tomar un tiempo. Por favor espere.", "Encryption" : "Cifrado", diff --git a/apps/files_encryption/l10n/et_EE.js b/apps/files_encryption/l10n/et_EE.js index a4edf9950a6..57297e8b9a3 100644 --- a/apps/files_encryption/l10n/et_EE.js +++ b/apps/files_encryption/l10n/et_EE.js @@ -13,8 +13,10 @@ OC.L10N.register( "Please repeat the new recovery password" : "Palun korda uut taastevõtme parooli", "Password successfully changed." : "Parool edukalt vahetatud.", "Could not change the password. Maybe the old password was not correct." : "Ei suutnud vahetada parooli. Võib-olla on vana parool valesti sisestatud.", + "Could not update the private key password." : "Ei suutnud uuendada privaatse võtme parooli.", + "The old password was not correct, please try again." : "Vana parool polnud õige, palun proovi uuesti.", + "The current log-in password was not correct, please try again." : "Praeguse sisselogimise parool polnud õige, palun proovi uuesti.", "Private key password successfully updated." : "Privaatse võtme parool edukalt uuendatud.", - "Could not update the private key password. Maybe the old password was not correct." : "Ei suutnud uuendada privaatse võtme parooli. Võib-olla polnud vana parool õige.", "File recovery settings updated" : "Faili taaste seaded uuendatud", "Could not update file recovery" : "Ei suuda uuendada taastefaili", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Krüpteerimise rakend pole käivitatud. Võib-olla krüpteerimise rakend taaskäivitati sinu sessiooni kestel. Palun proovi logida välja ning uuesti sisse käivitamaks krüpteerimise rakendit.", @@ -22,7 +24,6 @@ OC.L10N.register( "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Sa ei saa seda faili dekrüpteerida, see on tõenäoliselt jagatud fail. Palun lase omanikul seda faili sinuga uuesti jagada.", "Unknown error. Please check your system settings or contact your administrator" : "Tundmatu viga. Palun võta ühendust oma administraatoriga.", "Missing requirements." : "Nõutavad on puudu.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Palun veendu, et on paigaldatud PHP 5.3.3 või uuem ning PHP OpenSSL laiendus on lubatud ning seadistatud korrektselt. Hetkel krüpteerimise rakendus on peatatud.", "Following users are not set up for encryption:" : "Järgmised kasutajad pole seadistatud krüpteeringuks:", "Initial encryption started... This can take some time. Please wait." : "Algne krüpteerimine käivitati... See võib võtta natuke aega. Palun oota.", "Initial encryption running... Please try again later." : "Toimub esmane krüpteerimine... Palun proovi hiljem uuesti.", diff --git a/apps/files_encryption/l10n/et_EE.json b/apps/files_encryption/l10n/et_EE.json index df58c8f11fb..364eb02ef4f 100644 --- a/apps/files_encryption/l10n/et_EE.json +++ b/apps/files_encryption/l10n/et_EE.json @@ -11,8 +11,10 @@ "Please repeat the new recovery password" : "Palun korda uut taastevõtme parooli", "Password successfully changed." : "Parool edukalt vahetatud.", "Could not change the password. Maybe the old password was not correct." : "Ei suutnud vahetada parooli. Võib-olla on vana parool valesti sisestatud.", + "Could not update the private key password." : "Ei suutnud uuendada privaatse võtme parooli.", + "The old password was not correct, please try again." : "Vana parool polnud õige, palun proovi uuesti.", + "The current log-in password was not correct, please try again." : "Praeguse sisselogimise parool polnud õige, palun proovi uuesti.", "Private key password successfully updated." : "Privaatse võtme parool edukalt uuendatud.", - "Could not update the private key password. Maybe the old password was not correct." : "Ei suutnud uuendada privaatse võtme parooli. Võib-olla polnud vana parool õige.", "File recovery settings updated" : "Faili taaste seaded uuendatud", "Could not update file recovery" : "Ei suuda uuendada taastefaili", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Krüpteerimise rakend pole käivitatud. Võib-olla krüpteerimise rakend taaskäivitati sinu sessiooni kestel. Palun proovi logida välja ning uuesti sisse käivitamaks krüpteerimise rakendit.", @@ -20,7 +22,6 @@ "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Sa ei saa seda faili dekrüpteerida, see on tõenäoliselt jagatud fail. Palun lase omanikul seda faili sinuga uuesti jagada.", "Unknown error. Please check your system settings or contact your administrator" : "Tundmatu viga. Palun võta ühendust oma administraatoriga.", "Missing requirements." : "Nõutavad on puudu.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Palun veendu, et on paigaldatud PHP 5.3.3 või uuem ning PHP OpenSSL laiendus on lubatud ning seadistatud korrektselt. Hetkel krüpteerimise rakendus on peatatud.", "Following users are not set up for encryption:" : "Järgmised kasutajad pole seadistatud krüpteeringuks:", "Initial encryption started... This can take some time. Please wait." : "Algne krüpteerimine käivitati... See võib võtta natuke aega. Palun oota.", "Initial encryption running... Please try again later." : "Toimub esmane krüpteerimine... Palun proovi hiljem uuesti.", diff --git a/apps/files_encryption/l10n/eu.js b/apps/files_encryption/l10n/eu.js index 84d446313a1..65242e2da90 100644 --- a/apps/files_encryption/l10n/eu.js +++ b/apps/files_encryption/l10n/eu.js @@ -14,7 +14,6 @@ OC.L10N.register( "Password successfully changed." : "Pasahitza behar bezala aldatu da.", "Could not change the password. Maybe the old password was not correct." : "Ezin izan da pasahitza aldatu. Agian pasahitz zaharra okerrekoa da.", "Private key password successfully updated." : "Gako pasahitz pribatu behar bezala eguneratu da.", - "Could not update the private key password. Maybe the old password was not correct." : "Ezin izan da gako pribatu pasahitza eguneratu. Agian pasahitz zaharra okerrekoa da.", "File recovery settings updated" : "Fitxategi berreskuratze ezarpenak eguneratuak", "Could not update file recovery" : "Ezin da fitxategi berreskuratzea eguneratu", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Enkriptazio aplikazioa ez dago hasieratuta! Agian aplikazioa birgaitu egin da zure saioa bitartean. Mesdez atear eta sartu berriz enkriptazio aplikazioa hasierarazteko.", @@ -22,7 +21,6 @@ OC.L10N.register( "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Ezin izan da fitxategi hau deszifratu, ziurrenik elkarbanatutako fitxategi bat da. Mesdez, eskatu fitxategiaren jabeari fitxategia zurekin berriz elkarbana dezan.", "Unknown error. Please check your system settings or contact your administrator" : "Errore ezezaguna. Mesedez, egiaztatu zure sistemaren ezarpenak edo jarri zure administrariarekin kontaktuan.", "Missing requirements." : "Eskakizun batzuk ez dira betetzen.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Mesedez ziurtatu PHP 5.3.3 edo berriago bat instalatuta dagoela eta OpenSSL PHP hedapenarekin gaitua eta ongi konfiguratuta dagoela. Oraingoz, enkriptazio aplikazioa desgaituta dago.", "Following users are not set up for encryption:" : "Hurrengo erabiltzaileak ez daude enktriptatzeko konfiguratutak:", "Initial encryption started... This can take some time. Please wait." : "Hasierako enkriptazioa hasi da... Honek denbora har dezake. Mesedez itxaron.", "Initial encryption running... Please try again later." : "Hasierako enkriptaketa abian... mesedez, saiatu beranduago.", diff --git a/apps/files_encryption/l10n/eu.json b/apps/files_encryption/l10n/eu.json index c18cebad99d..961ffe3270a 100644 --- a/apps/files_encryption/l10n/eu.json +++ b/apps/files_encryption/l10n/eu.json @@ -12,7 +12,6 @@ "Password successfully changed." : "Pasahitza behar bezala aldatu da.", "Could not change the password. Maybe the old password was not correct." : "Ezin izan da pasahitza aldatu. Agian pasahitz zaharra okerrekoa da.", "Private key password successfully updated." : "Gako pasahitz pribatu behar bezala eguneratu da.", - "Could not update the private key password. Maybe the old password was not correct." : "Ezin izan da gako pribatu pasahitza eguneratu. Agian pasahitz zaharra okerrekoa da.", "File recovery settings updated" : "Fitxategi berreskuratze ezarpenak eguneratuak", "Could not update file recovery" : "Ezin da fitxategi berreskuratzea eguneratu", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Enkriptazio aplikazioa ez dago hasieratuta! Agian aplikazioa birgaitu egin da zure saioa bitartean. Mesdez atear eta sartu berriz enkriptazio aplikazioa hasierarazteko.", @@ -20,7 +19,6 @@ "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Ezin izan da fitxategi hau deszifratu, ziurrenik elkarbanatutako fitxategi bat da. Mesdez, eskatu fitxategiaren jabeari fitxategia zurekin berriz elkarbana dezan.", "Unknown error. Please check your system settings or contact your administrator" : "Errore ezezaguna. Mesedez, egiaztatu zure sistemaren ezarpenak edo jarri zure administrariarekin kontaktuan.", "Missing requirements." : "Eskakizun batzuk ez dira betetzen.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Mesedez ziurtatu PHP 5.3.3 edo berriago bat instalatuta dagoela eta OpenSSL PHP hedapenarekin gaitua eta ongi konfiguratuta dagoela. Oraingoz, enkriptazio aplikazioa desgaituta dago.", "Following users are not set up for encryption:" : "Hurrengo erabiltzaileak ez daude enktriptatzeko konfiguratutak:", "Initial encryption started... This can take some time. Please wait." : "Hasierako enkriptazioa hasi da... Honek denbora har dezake. Mesedez itxaron.", "Initial encryption running... Please try again later." : "Hasierako enkriptaketa abian... mesedez, saiatu beranduago.", diff --git a/apps/files_encryption/l10n/fa.js b/apps/files_encryption/l10n/fa.js index 541b19c695c..037dc26e681 100644 --- a/apps/files_encryption/l10n/fa.js +++ b/apps/files_encryption/l10n/fa.js @@ -8,7 +8,6 @@ OC.L10N.register( "Password successfully changed." : "رمزعبور با موفقیت تغییر یافت.", "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." : "رمزعبور کلید خصوصی را نمی تواند به روز کند. شاید رمزعبور قدیمی صحیح نمی باشد.", "File recovery settings updated" : "تنظیمات بازیابی فایل به روز شده است.", "Could not update file recovery" : "به روز رسانی بازیابی فایل را نمی تواند انجام دهد.", "Missing requirements." : "نیازمندی های گمشده", diff --git a/apps/files_encryption/l10n/fa.json b/apps/files_encryption/l10n/fa.json index 30b0faa5ec8..0c89886d412 100644 --- a/apps/files_encryption/l10n/fa.json +++ b/apps/files_encryption/l10n/fa.json @@ -6,7 +6,6 @@ "Password successfully changed." : "رمزعبور با موفقیت تغییر یافت.", "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." : "رمزعبور کلید خصوصی را نمی تواند به روز کند. شاید رمزعبور قدیمی صحیح نمی باشد.", "File recovery settings updated" : "تنظیمات بازیابی فایل به روز شده است.", "Could not update file recovery" : "به روز رسانی بازیابی فایل را نمی تواند انجام دهد.", "Missing requirements." : "نیازمندی های گمشده", diff --git a/apps/files_encryption/l10n/fi_FI.js b/apps/files_encryption/l10n/fi_FI.js index bf1afbb1129..aff16f1fcdd 100644 --- a/apps/files_encryption/l10n/fi_FI.js +++ b/apps/files_encryption/l10n/fi_FI.js @@ -5,9 +5,11 @@ OC.L10N.register( "Recovery key successfully enabled" : "Palautusavain kytketty päälle onnistuneesti", "Password successfully changed." : "Salasana vaihdettiin onnistuneesti.", "Could not change the password. Maybe the old password was not correct." : "Salasanan vaihto epäonnistui. Kenties vanha salasana oli väärin.", + "The old password was not correct, please try again." : "Vanha salasana oli väärin, yritä uudelleen.", "Private key password successfully updated." : "Yksityisen avaimen salasana päivitetty onnistuneesti.", "File recovery settings updated" : "Tiedostopalautuksen asetukset päivitetty", "Unknown error. Please check your system settings or contact your administrator" : "Tuntematon virhe. Tarkista järjestelmän asetukset tai ole yhteydessä ylläpitäjään.", + "Missing requirements." : "Puuttuvat vaatimukset.", "Following users are not set up for encryption:" : "Seuraavat käyttäjät eivät ole määrittäneet salausta:", "Initial encryption started... This can take some time. Please wait." : "Ensimmäinen salauskerta käynnistetty... Tämä saattaa kestää hetken.", "Initial encryption running... Please try again later." : "Ensimmäinen salauskerta on meneillään... Yritä myöhemmin uudelleen.", @@ -25,8 +27,8 @@ OC.L10N.register( "Repeat New Recovery key password" : "Toista uusi palautusavaimen salasana", "Change Password" : "Vaihda salasana", " If you don't remember your old password you can ask your administrator to recover your files." : "Jos et muista vanhaa salasanaasi, voit pyytää ylläpitäjää palauttamaan tiedostosi.", - "Old log-in password" : "Vanha kirjautumis-salasana", - "Current log-in password" : "Nykyinen kirjautumis-salasana", + "Old log-in password" : "Vanha kirjautumissalasana", + "Current log-in password" : "Nykyinen kirjautumissalasana", "Update Private Key Password" : "Päivitä yksityisen avaimen salasana", "Enable password recovery:" : "Ota salasanan palautus käyttöön:" }, diff --git a/apps/files_encryption/l10n/fi_FI.json b/apps/files_encryption/l10n/fi_FI.json index 2b91a4388d0..348f8aeb1fe 100644 --- a/apps/files_encryption/l10n/fi_FI.json +++ b/apps/files_encryption/l10n/fi_FI.json @@ -3,9 +3,11 @@ "Recovery key successfully enabled" : "Palautusavain kytketty päälle onnistuneesti", "Password successfully changed." : "Salasana vaihdettiin onnistuneesti.", "Could not change the password. Maybe the old password was not correct." : "Salasanan vaihto epäonnistui. Kenties vanha salasana oli väärin.", + "The old password was not correct, please try again." : "Vanha salasana oli väärin, yritä uudelleen.", "Private key password successfully updated." : "Yksityisen avaimen salasana päivitetty onnistuneesti.", "File recovery settings updated" : "Tiedostopalautuksen asetukset päivitetty", "Unknown error. Please check your system settings or contact your administrator" : "Tuntematon virhe. Tarkista järjestelmän asetukset tai ole yhteydessä ylläpitäjään.", + "Missing requirements." : "Puuttuvat vaatimukset.", "Following users are not set up for encryption:" : "Seuraavat käyttäjät eivät ole määrittäneet salausta:", "Initial encryption started... This can take some time. Please wait." : "Ensimmäinen salauskerta käynnistetty... Tämä saattaa kestää hetken.", "Initial encryption running... Please try again later." : "Ensimmäinen salauskerta on meneillään... Yritä myöhemmin uudelleen.", @@ -23,8 +25,8 @@ "Repeat New Recovery key password" : "Toista uusi palautusavaimen salasana", "Change Password" : "Vaihda salasana", " If you don't remember your old password you can ask your administrator to recover your files." : "Jos et muista vanhaa salasanaasi, voit pyytää ylläpitäjää palauttamaan tiedostosi.", - "Old log-in password" : "Vanha kirjautumis-salasana", - "Current log-in password" : "Nykyinen kirjautumis-salasana", + "Old log-in password" : "Vanha kirjautumissalasana", + "Current log-in password" : "Nykyinen kirjautumissalasana", "Update Private Key Password" : "Päivitä yksityisen avaimen salasana", "Enable password recovery:" : "Ota salasanan palautus käyttöön:" },"pluralForm" :"nplurals=2; plural=(n != 1);" diff --git a/apps/files_encryption/l10n/fr.js b/apps/files_encryption/l10n/fr.js index 68d07143f73..b0f4d1d5edf 100644 --- a/apps/files_encryption/l10n/fr.js +++ b/apps/files_encryption/l10n/fr.js @@ -11,29 +11,31 @@ OC.L10N.register( "Please provide the old recovery password" : "Veuillez entrer l'ancien mot de passe de récupération", "Please provide a new recovery password" : "Veuillez entrer un nouveau mot de passe de récupération", "Please repeat the new recovery password" : "Veuillez répéter le nouveau mot de passe de récupération", - "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.", + "Password successfully changed." : "Mot de passe changé avec succès.", + "Could not change the password. Maybe the old password was not correct." : "Erreur lors du changement de mot de passe. L'ancien mot de passe est peut-être incorrect.", + "Could not update the private key password." : "Impossible de mettre à jour le mot de passe de la clé privée.", + "The old password was not correct, please try again." : "L'ancien mot de passe est incorrect. Veuillez réessayer.", + "The current log-in password was not correct, please try again." : "Le mot de passe actuel n'est pas correct, veuillez réessayer.", "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.", "File recovery settings updated" : "Paramètres de récupération de fichiers mis à jour", - "Could not update file recovery" : "Ne peut pas remettre à jour les fichiers de récupération", + "Could not update file recovery" : "Impossible de mettre à jour les fichiers de récupération", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "L'application de chiffrement n'est pas initialisée ! Peut-être que cette application a été réactivée pendant votre session. Veuillez essayer de vous déconnecter et ensuite de vous reconnecter pour initialiser l'application de chiffrement.", "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Votre clef privée est invalide ! Votre mot de passe a probablement été modifié hors de %s (ex. votre annuaire d'entreprise). Vous pouvez mettre à jour le mot de passe de votre clef privée dans les paramètres personnels pour pouvoir récupérer l'accès à vos fichiers chiffrés.", "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Impossible de déchiffrer ce fichier, il s'agit probablement d'un fichier partagé. Veuillez demander au propriétaire de ce fichier de le repartager avec vous.", "Unknown error. Please check your system settings or contact your administrator" : "Erreur inconnue. Veuillez vérifier vos paramètres système ou contacter un administrateur.", - "Missing requirements." : "Système minimum requis non respecté.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Veuillez vous assurer qu'une version de PHP 5.3.3 ou supérieure est installée et qu'OpenSSL et son extension PHP sont activés et configurés correctement. En attendant, l'application de chiffrement été désactivée.", - "Following users are not set up for encryption:" : "Les utilisateurs suivants ne sont pas configurés pour le chiffrement :", "Initial encryption started... This can take some time. Please wait." : "Chiffrement initial démarré... Cela peut prendre un certain temps. Veuillez patienter.", "Initial encryption running... Please try again later." : "Chiffrement initial en cours... Veuillez re-essayer ultérieurement.", + "Missing requirements." : "Système minimum requis non respecté.", + "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Merci de vous assurer que OpenSSL et son extension PHP sont activés et configurés correctement. Pour l'instant, l'application de chiffrement a été désactivée.", + "Following users are not set up for encryption:" : "Les utilisateurs suivants ne sont pas configurés pour le chiffrement :", "Go directly to your %spersonal settings%s." : "Allerz directement à vos %spersonal settings%s.", "Encryption" : "Chiffrement", "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "L'application de chiffrement est activée mais vos clés ne sont pas initialisées, veuillez vous déconnecter et ensuite vous reconnecter.", "Enable recovery key (allow to recover users files in case of password loss):" : "Activer la clef de récupération (permet de récupérer les fichiers des utilisateurs en cas de perte de mot de passe).", "Recovery key password" : "Mot de passe de la clef de récupération", "Repeat Recovery key password" : "Répétez le mot de passe de la clé de récupération", - "Enabled" : "Activer", - "Disabled" : "Désactiver", + "Enabled" : "Activé", + "Disabled" : "Désactivé", "Change recovery key password:" : "Modifier le mot de passe de la clef de récupération :", "Old Recovery key password" : "Ancien mot de passe de la clef de récupération", "New Recovery key password" : "Nouveau mot de passe de la clef de récupération", diff --git a/apps/files_encryption/l10n/fr.json b/apps/files_encryption/l10n/fr.json index 707583f7c80..fffe581ac5e 100644 --- a/apps/files_encryption/l10n/fr.json +++ b/apps/files_encryption/l10n/fr.json @@ -9,29 +9,31 @@ "Please provide the old recovery password" : "Veuillez entrer l'ancien mot de passe de récupération", "Please provide a new recovery password" : "Veuillez entrer un nouveau mot de passe de récupération", "Please repeat the new recovery password" : "Veuillez répéter le nouveau mot de passe de récupération", - "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.", + "Password successfully changed." : "Mot de passe changé avec succès.", + "Could not change the password. Maybe the old password was not correct." : "Erreur lors du changement de mot de passe. L'ancien mot de passe est peut-être incorrect.", + "Could not update the private key password." : "Impossible de mettre à jour le mot de passe de la clé privée.", + "The old password was not correct, please try again." : "L'ancien mot de passe est incorrect. Veuillez réessayer.", + "The current log-in password was not correct, please try again." : "Le mot de passe actuel n'est pas correct, veuillez réessayer.", "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.", "File recovery settings updated" : "Paramètres de récupération de fichiers mis à jour", - "Could not update file recovery" : "Ne peut pas remettre à jour les fichiers de récupération", + "Could not update file recovery" : "Impossible de mettre à jour les fichiers de récupération", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "L'application de chiffrement n'est pas initialisée ! Peut-être que cette application a été réactivée pendant votre session. Veuillez essayer de vous déconnecter et ensuite de vous reconnecter pour initialiser l'application de chiffrement.", "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Votre clef privée est invalide ! Votre mot de passe a probablement été modifié hors de %s (ex. votre annuaire d'entreprise). Vous pouvez mettre à jour le mot de passe de votre clef privée dans les paramètres personnels pour pouvoir récupérer l'accès à vos fichiers chiffrés.", "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Impossible de déchiffrer ce fichier, il s'agit probablement d'un fichier partagé. Veuillez demander au propriétaire de ce fichier de le repartager avec vous.", "Unknown error. Please check your system settings or contact your administrator" : "Erreur inconnue. Veuillez vérifier vos paramètres système ou contacter un administrateur.", - "Missing requirements." : "Système minimum requis non respecté.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Veuillez vous assurer qu'une version de PHP 5.3.3 ou supérieure est installée et qu'OpenSSL et son extension PHP sont activés et configurés correctement. En attendant, l'application de chiffrement été désactivée.", - "Following users are not set up for encryption:" : "Les utilisateurs suivants ne sont pas configurés pour le chiffrement :", "Initial encryption started... This can take some time. Please wait." : "Chiffrement initial démarré... Cela peut prendre un certain temps. Veuillez patienter.", "Initial encryption running... Please try again later." : "Chiffrement initial en cours... Veuillez re-essayer ultérieurement.", + "Missing requirements." : "Système minimum requis non respecté.", + "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Merci de vous assurer que OpenSSL et son extension PHP sont activés et configurés correctement. Pour l'instant, l'application de chiffrement a été désactivée.", + "Following users are not set up for encryption:" : "Les utilisateurs suivants ne sont pas configurés pour le chiffrement :", "Go directly to your %spersonal settings%s." : "Allerz directement à vos %spersonal settings%s.", "Encryption" : "Chiffrement", "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "L'application de chiffrement est activée mais vos clés ne sont pas initialisées, veuillez vous déconnecter et ensuite vous reconnecter.", "Enable recovery key (allow to recover users files in case of password loss):" : "Activer la clef de récupération (permet de récupérer les fichiers des utilisateurs en cas de perte de mot de passe).", "Recovery key password" : "Mot de passe de la clef de récupération", "Repeat Recovery key password" : "Répétez le mot de passe de la clé de récupération", - "Enabled" : "Activer", - "Disabled" : "Désactiver", + "Enabled" : "Activé", + "Disabled" : "Désactivé", "Change recovery key password:" : "Modifier le mot de passe de la clef de récupération :", "Old Recovery key password" : "Ancien mot de passe de la clef de récupération", "New Recovery key password" : "Nouveau mot de passe de la clef de récupération", diff --git a/apps/files_encryption/l10n/gl.js b/apps/files_encryption/l10n/gl.js index c04a1c1a5ea..9b14a4455b5 100644 --- a/apps/files_encryption/l10n/gl.js +++ b/apps/files_encryption/l10n/gl.js @@ -3,29 +3,31 @@ OC.L10N.register( { "Unknown error" : "Produciuse un erro descoñecido", "Missing recovery key password" : "Falta a chave de recuperación", - "Please repeat the recovery key password" : "Por favor repita a chave de recuperación", - "Repeated recovery key password does not match the provided recovery key password" : "A repetición da chave de recuperación non coincide coa chave de recuperación establecida", + "Please repeat the recovery key password" : "Repita a chave de recuperación", + "Repeated recovery key password does not match the provided recovery key password" : "A repetición da chave de recuperación non coincide coa chave de recuperación estabelecida", "Recovery key successfully enabled" : "Activada satisfactoriamente a 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!", "Recovery key successfully disabled" : "Desactivada satisfactoriamente a chave de recuperación", - "Please provide the old recovery password" : "Por favor introduza a chave de recuperación anterior", - "Please provide a new recovery password" : "Por favor introduza a nova chave de recuperación", + "Please provide the old recovery password" : "Introduza a chave de recuperación antiga", + "Please provide a new recovery password" : "Introduza a nova chave de recuperación", "Please repeat the new recovery password" : "Por favor repita a nova chave de recuperación", "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 update the private key password." : "Non foi posíbel actualizar o contrasinal da chave privada.", + "The old password was not correct, please try again." : "O contrasinal antigo non é correcto, ténteo de novo.", + "The current log-in password was not correct, please try again." : "O actual contrasinal de acceso non é correcto, ténteo de novo.", "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.", "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", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Non se iniciou a aplicación de cifrado! Quizais volva a activarse durante a sesión. Tente pechar a sesión e volver iniciala para que tamén se inicie a aplicación de cifrado.", "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "A chave privada non é correcta! É probábel que o seu contrasinal teña sido cambiado desde o exterior do %s (p.ex. o seu directorio corporativo). Vostede pode actualizar o contrasinal da súa chave privada nos seus axustes persoais para recuperar o acceso aos seus ficheiros", "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Non foi posíbel descifrar o ficheiro, probabelmente tratase dun ficheiro compartido. Pídalle ao propietario do ficheiro que volva compartir o ficheiro con vostede.", "Unknown error. Please check your system settings or contact your administrator" : "Produciuse un erro descoñecido. Comprobe os axustes do sistema ou contacte co administrador", - "Missing requirements." : "Non se cumpren os requisitos.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Asegúrese de que está instalado o PHP 5.3.3 ou posterior e de que o OpenSSL xunto coa extensión PHP estean activados e configurados correctamente. Polo de agora foi desactivada a aplicación de cifrado.", - "Following users are not set up for encryption:" : "Os seguintes usuarios non teñen configuración para o cifrado:", "Initial encryption started... This can take some time. Please wait." : "Comezou o cifrado inicial... Isto pode levar bastante tempo. Agarde.", "Initial encryption running... Please try again later." : "O cifrado inicial está en execución... Tenteo máis tarde.", + "Missing requirements." : "Non se cumpren os requisitos.", + "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Asegúrese de que está instalado o OpenSSL xunto coa extensión PHP e que estean activados e configurados correctamente. Polo de agora foi desactivado a aplicación de cifrado.", + "Following users are not set up for encryption:" : "Os seguintes usuarios non teñen configuración para o cifrado:", "Go directly to your %spersonal settings%s." : "Vaia directamente aos seus %saxustes persoais%s.", "Encryption" : "Cifrado", "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "A aplicación de cifrado está activada, mais as chaves non foron inicializadas, saia da sesión e volva a acceder de novo", diff --git a/apps/files_encryption/l10n/gl.json b/apps/files_encryption/l10n/gl.json index 4583f25da1a..3704f7d2c79 100644 --- a/apps/files_encryption/l10n/gl.json +++ b/apps/files_encryption/l10n/gl.json @@ -1,29 +1,31 @@ { "translations": { "Unknown error" : "Produciuse un erro descoñecido", "Missing recovery key password" : "Falta a chave de recuperación", - "Please repeat the recovery key password" : "Por favor repita a chave de recuperación", - "Repeated recovery key password does not match the provided recovery key password" : "A repetición da chave de recuperación non coincide coa chave de recuperación establecida", + "Please repeat the recovery key password" : "Repita a chave de recuperación", + "Repeated recovery key password does not match the provided recovery key password" : "A repetición da chave de recuperación non coincide coa chave de recuperación estabelecida", "Recovery key successfully enabled" : "Activada satisfactoriamente a 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!", "Recovery key successfully disabled" : "Desactivada satisfactoriamente a chave de recuperación", - "Please provide the old recovery password" : "Por favor introduza a chave de recuperación anterior", - "Please provide a new recovery password" : "Por favor introduza a nova chave de recuperación", + "Please provide the old recovery password" : "Introduza a chave de recuperación antiga", + "Please provide a new recovery password" : "Introduza a nova chave de recuperación", "Please repeat the new recovery password" : "Por favor repita a nova chave de recuperación", "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 update the private key password." : "Non foi posíbel actualizar o contrasinal da chave privada.", + "The old password was not correct, please try again." : "O contrasinal antigo non é correcto, ténteo de novo.", + "The current log-in password was not correct, please try again." : "O actual contrasinal de acceso non é correcto, ténteo de novo.", "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.", "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", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Non se iniciou a aplicación de cifrado! Quizais volva a activarse durante a sesión. Tente pechar a sesión e volver iniciala para que tamén se inicie a aplicación de cifrado.", "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "A chave privada non é correcta! É probábel que o seu contrasinal teña sido cambiado desde o exterior do %s (p.ex. o seu directorio corporativo). Vostede pode actualizar o contrasinal da súa chave privada nos seus axustes persoais para recuperar o acceso aos seus ficheiros", "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Non foi posíbel descifrar o ficheiro, probabelmente tratase dun ficheiro compartido. Pídalle ao propietario do ficheiro que volva compartir o ficheiro con vostede.", "Unknown error. Please check your system settings or contact your administrator" : "Produciuse un erro descoñecido. Comprobe os axustes do sistema ou contacte co administrador", - "Missing requirements." : "Non se cumpren os requisitos.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Asegúrese de que está instalado o PHP 5.3.3 ou posterior e de que o OpenSSL xunto coa extensión PHP estean activados e configurados correctamente. Polo de agora foi desactivada a aplicación de cifrado.", - "Following users are not set up for encryption:" : "Os seguintes usuarios non teñen configuración para o cifrado:", "Initial encryption started... This can take some time. Please wait." : "Comezou o cifrado inicial... Isto pode levar bastante tempo. Agarde.", "Initial encryption running... Please try again later." : "O cifrado inicial está en execución... Tenteo máis tarde.", + "Missing requirements." : "Non se cumpren os requisitos.", + "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Asegúrese de que está instalado o OpenSSL xunto coa extensión PHP e que estean activados e configurados correctamente. Polo de agora foi desactivado a aplicación de cifrado.", + "Following users are not set up for encryption:" : "Os seguintes usuarios non teñen configuración para o cifrado:", "Go directly to your %spersonal settings%s." : "Vaia directamente aos seus %saxustes persoais%s.", "Encryption" : "Cifrado", "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "A aplicación de cifrado está activada, mais as chaves non foron inicializadas, saia da sesión e volva a acceder de novo", diff --git a/apps/files_encryption/l10n/hr.js b/apps/files_encryption/l10n/hr.js index 7160e72ac23..0474a024642 100644 --- a/apps/files_encryption/l10n/hr.js +++ b/apps/files_encryption/l10n/hr.js @@ -8,7 +8,6 @@ OC.L10N.register( "Password successfully changed." : "Lozinka uspješno promijenjena.", "Could not change the password. Maybe the old password was not correct." : "Lozinku nije moguće promijeniti. Možda je stara lozinka bila neispravna.", "Private key password successfully updated." : "Lozinka privatnog ključa uspješno ažurirana.", - "Could not update the private key password. Maybe the old password was not correct." : "Lozinku privatnog ključa nije moguće promijeniti. Možda stara je stara lozinka bila neispravna.", "File recovery settings updated" : "Ažurirane postavke za oporavak datoteke", "Could not update file recovery" : "Oporavak datoteke nije moguće ažurirati", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Aplikacija šifriranja nije inicijalizirana! Možda je aplikacija šifriranja bila reaktivirana tijekom vaše sesije.Da biste inicijalizirali aplikaciju šifriranja, molimo, pokušajte se odjaviti i ponovno prijaviti.", @@ -16,7 +15,6 @@ OC.L10N.register( "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Ovu datoteku nije moguće dešifrirati, vjerojatno je riječ o zajedničkoj datoteci. Molimopitajte vlasnika datoteke da je ponovo podijeli s vama.", "Unknown error. Please check your system settings or contact your administrator" : "Pogreška nepoznata. Molimo provjerite svoje sistemske postavke ili kontaktirajte svog administratora.", "Missing requirements." : "Nedostaju preduvjeti.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Molimo osigurajte da je instaliran PHP 5.3.3 ili noviji i da je OpenSSL zajedno s PHP ekstenzijom propisno aktivirani konfiguriran. Za sada, aplikacija šifriranja je deaktivirana.", "Following users are not set up for encryption:" : "Sljedeći korisnici nisu određeni za šifriranje:", "Initial encryption started... This can take some time. Please wait." : "Počelo inicijalno šifriranje... To može potrajati neko vrijeme. Molimo, pričekajte.", "Initial encryption running... Please try again later." : "Inicijalno šifriranje u tijeku... Molimo, pokušajte ponovno kasnije.", diff --git a/apps/files_encryption/l10n/hr.json b/apps/files_encryption/l10n/hr.json index e375f3f6314..7c2af923fbd 100644 --- a/apps/files_encryption/l10n/hr.json +++ b/apps/files_encryption/l10n/hr.json @@ -6,7 +6,6 @@ "Password successfully changed." : "Lozinka uspješno promijenjena.", "Could not change the password. Maybe the old password was not correct." : "Lozinku nije moguće promijeniti. Možda je stara lozinka bila neispravna.", "Private key password successfully updated." : "Lozinka privatnog ključa uspješno ažurirana.", - "Could not update the private key password. Maybe the old password was not correct." : "Lozinku privatnog ključa nije moguće promijeniti. Možda stara je stara lozinka bila neispravna.", "File recovery settings updated" : "Ažurirane postavke za oporavak datoteke", "Could not update file recovery" : "Oporavak datoteke nije moguće ažurirati", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Aplikacija šifriranja nije inicijalizirana! Možda je aplikacija šifriranja bila reaktivirana tijekom vaše sesije.Da biste inicijalizirali aplikaciju šifriranja, molimo, pokušajte se odjaviti i ponovno prijaviti.", @@ -14,7 +13,6 @@ "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Ovu datoteku nije moguće dešifrirati, vjerojatno je riječ o zajedničkoj datoteci. Molimopitajte vlasnika datoteke da je ponovo podijeli s vama.", "Unknown error. Please check your system settings or contact your administrator" : "Pogreška nepoznata. Molimo provjerite svoje sistemske postavke ili kontaktirajte svog administratora.", "Missing requirements." : "Nedostaju preduvjeti.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Molimo osigurajte da je instaliran PHP 5.3.3 ili noviji i da je OpenSSL zajedno s PHP ekstenzijom propisno aktivirani konfiguriran. Za sada, aplikacija šifriranja je deaktivirana.", "Following users are not set up for encryption:" : "Sljedeći korisnici nisu određeni za šifriranje:", "Initial encryption started... This can take some time. Please wait." : "Počelo inicijalno šifriranje... To može potrajati neko vrijeme. Molimo, pričekajte.", "Initial encryption running... Please try again later." : "Inicijalno šifriranje u tijeku... Molimo, pokušajte ponovno kasnije.", diff --git a/apps/files_encryption/l10n/hu_HU.js b/apps/files_encryption/l10n/hu_HU.js index 349d7cf6e3e..92538d1ce56 100644 --- a/apps/files_encryption/l10n/hu_HU.js +++ b/apps/files_encryption/l10n/hu_HU.js @@ -8,14 +8,12 @@ OC.L10N.register( "Password successfully changed." : "A jelszót sikeresen megváltoztattuk.", "Could not change the password. Maybe the old password was not correct." : "A jelszót nem lehet megváltoztatni! Lehet, hogy hibás volt a régi jelszó.", "Private key password successfully updated." : "A személyes kulcsának jelszava frissítésre került.", - "Could not update the private key password. Maybe the old password was not correct." : "A személyes kulcsa jelszavát nem lehetett frissíteni. Lehet, hogy hibás volt a régi jelszó.", "File recovery settings updated" : "A fájlhelyreállítási beállítások frissültek", "Could not update file recovery" : "A fájlhelyreállítás nem frissíthető", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "A titkosítási modul nincs elindítva! Talán a munkafolyamat közben került engedélyezésre. Kérjük jelentkezzen ki majd ismét jelentkezzen be, hogy a titkosítási modul megfelelően elinduljon!", "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Az állományok titkosításához használt titkos kulcsa érvénytelen. Valószínűleg a %s rendszeren kívül változtatta meg a jelszavát (pl. a munkahelyi címtárban). A személyes beállításoknál frissítheti a titkos kulcsát, hogy ismét elérhesse a titkosított állományait.", "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Az állományt nem sikerült dekódolni, valószínűleg ez egy megosztott fájl. Kérje meg az állomány tulajdonosát, hogy újra ossza meg Önnel ezt az állományt!", "Missing requirements." : "Hiányzó követelmények.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Kérem gondoskodjon arról, hogy PHP 5.3.3 vagy annál frissebb legyen telepítve, továbbá az OpenSSL a megfelelő PHP-bővítménnyel együtt rendelkezésre álljon és helyesen legyen konfigurálva! A titkosító modul egyelőre kikapcsolásra került.", "Following users are not set up for encryption:" : "A következő felhasználók nem állították be a titkosítást:", "Initial encryption started... This can take some time. Please wait." : "A titkosítási folyamat megkezdődött... Ez hosszabb ideig is eltarthat. Kérem várjon.", "Initial encryption running... Please try again later." : "Kezedeti titkosítás fut... Próbálja később.", diff --git a/apps/files_encryption/l10n/hu_HU.json b/apps/files_encryption/l10n/hu_HU.json index e94c192180a..023cb51fc5a 100644 --- a/apps/files_encryption/l10n/hu_HU.json +++ b/apps/files_encryption/l10n/hu_HU.json @@ -6,14 +6,12 @@ "Password successfully changed." : "A jelszót sikeresen megváltoztattuk.", "Could not change the password. Maybe the old password was not correct." : "A jelszót nem lehet megváltoztatni! Lehet, hogy hibás volt a régi jelszó.", "Private key password successfully updated." : "A személyes kulcsának jelszava frissítésre került.", - "Could not update the private key password. Maybe the old password was not correct." : "A személyes kulcsa jelszavát nem lehetett frissíteni. Lehet, hogy hibás volt a régi jelszó.", "File recovery settings updated" : "A fájlhelyreállítási beállítások frissültek", "Could not update file recovery" : "A fájlhelyreállítás nem frissíthető", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "A titkosítási modul nincs elindítva! Talán a munkafolyamat közben került engedélyezésre. Kérjük jelentkezzen ki majd ismét jelentkezzen be, hogy a titkosítási modul megfelelően elinduljon!", "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Az állományok titkosításához használt titkos kulcsa érvénytelen. Valószínűleg a %s rendszeren kívül változtatta meg a jelszavát (pl. a munkahelyi címtárban). A személyes beállításoknál frissítheti a titkos kulcsát, hogy ismét elérhesse a titkosított állományait.", "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Az állományt nem sikerült dekódolni, valószínűleg ez egy megosztott fájl. Kérje meg az állomány tulajdonosát, hogy újra ossza meg Önnel ezt az állományt!", "Missing requirements." : "Hiányzó követelmények.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Kérem gondoskodjon arról, hogy PHP 5.3.3 vagy annál frissebb legyen telepítve, továbbá az OpenSSL a megfelelő PHP-bővítménnyel együtt rendelkezésre álljon és helyesen legyen konfigurálva! A titkosító modul egyelőre kikapcsolásra került.", "Following users are not set up for encryption:" : "A következő felhasználók nem állították be a titkosítást:", "Initial encryption started... This can take some time. Please wait." : "A titkosítási folyamat megkezdődött... Ez hosszabb ideig is eltarthat. Kérem várjon.", "Initial encryption running... Please try again later." : "Kezedeti titkosítás fut... Próbálja később.", diff --git a/apps/files_encryption/l10n/id.js b/apps/files_encryption/l10n/id.js index 7137d13cb9f..6c621bddd04 100644 --- a/apps/files_encryption/l10n/id.js +++ b/apps/files_encryption/l10n/id.js @@ -14,7 +14,6 @@ OC.L10N.register( "Password successfully changed." : "Sandi berhasil diubah", "Could not change the password. Maybe the old password was not correct." : "Tidak dapat mengubah sandi. Kemungkinan sandi lama yang dimasukkan salah.", "Private key password successfully updated." : "Sandi kunci privat berhasil diperbarui.", - "Could not update the private key password. Maybe the old password was not correct." : "Tidak dapat memperbarui sandi kunci privat. Kemungkinan sandi lama yang Anda masukkan salah.", "File recovery settings updated" : "Pengaturan pemulihan berkas diperbarui", "Could not update file recovery" : "Tidak dapat memperbarui pemulihan berkas", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Aplikasi enkripsi tidak dimulai! Kemungkinan aplikasi enkripsi telah diaktifkan ulang saat sesi Anda. Silakan coba untuk keluar dan kembali lagi untuk memulai aplikasi enkripsi.", @@ -22,7 +21,6 @@ OC.L10N.register( "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Tidak dapat mendekripsi berkas ini, mungkin ini adalah berkas bersama. Silakan meminta pemilik berkas ini untuk membagikan kembali dengan Anda.", "Unknown error. Please check your system settings or contact your administrator" : "Kesalahan tidak diketahui. Silakan periksa pengaturan sistem Anda atau hubungi administrator", "Missing requirements." : "Persyaratan tidak terpenuhi.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Pastikan bahwa PHP 5.3.3 atau yang lebih baru telah diinstal dan OpenSSL bersama ekstensi PHP telah diaktifkan dan dikonfigurasi dengan benar. Untuk saat ini, aplikasi enkripsi akan dinonaktifkan.", "Following users are not set up for encryption:" : "Pengguna berikut belum diatur untuk enkripsi:", "Initial encryption started... This can take some time. Please wait." : "Enskripsi awal dijalankan... Ini dapat memakan waktu. Silakan tunggu.", "Initial encryption running... Please try again later." : "Enkripsi awal sedang berjalan... Sialakn coba lagi nanti.", diff --git a/apps/files_encryption/l10n/id.json b/apps/files_encryption/l10n/id.json index eb5361d4b66..090e56c76b2 100644 --- a/apps/files_encryption/l10n/id.json +++ b/apps/files_encryption/l10n/id.json @@ -12,7 +12,6 @@ "Password successfully changed." : "Sandi berhasil diubah", "Could not change the password. Maybe the old password was not correct." : "Tidak dapat mengubah sandi. Kemungkinan sandi lama yang dimasukkan salah.", "Private key password successfully updated." : "Sandi kunci privat berhasil diperbarui.", - "Could not update the private key password. Maybe the old password was not correct." : "Tidak dapat memperbarui sandi kunci privat. Kemungkinan sandi lama yang Anda masukkan salah.", "File recovery settings updated" : "Pengaturan pemulihan berkas diperbarui", "Could not update file recovery" : "Tidak dapat memperbarui pemulihan berkas", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Aplikasi enkripsi tidak dimulai! Kemungkinan aplikasi enkripsi telah diaktifkan ulang saat sesi Anda. Silakan coba untuk keluar dan kembali lagi untuk memulai aplikasi enkripsi.", @@ -20,7 +19,6 @@ "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Tidak dapat mendekripsi berkas ini, mungkin ini adalah berkas bersama. Silakan meminta pemilik berkas ini untuk membagikan kembali dengan Anda.", "Unknown error. Please check your system settings or contact your administrator" : "Kesalahan tidak diketahui. Silakan periksa pengaturan sistem Anda atau hubungi administrator", "Missing requirements." : "Persyaratan tidak terpenuhi.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Pastikan bahwa PHP 5.3.3 atau yang lebih baru telah diinstal dan OpenSSL bersama ekstensi PHP telah diaktifkan dan dikonfigurasi dengan benar. Untuk saat ini, aplikasi enkripsi akan dinonaktifkan.", "Following users are not set up for encryption:" : "Pengguna berikut belum diatur untuk enkripsi:", "Initial encryption started... This can take some time. Please wait." : "Enskripsi awal dijalankan... Ini dapat memakan waktu. Silakan tunggu.", "Initial encryption running... Please try again later." : "Enkripsi awal sedang berjalan... Sialakn coba lagi nanti.", diff --git a/apps/files_encryption/l10n/it.js b/apps/files_encryption/l10n/it.js index e71abc94675..08167b8ea7c 100644 --- a/apps/files_encryption/l10n/it.js +++ b/apps/files_encryption/l10n/it.js @@ -13,8 +13,10 @@ OC.L10N.register( "Please repeat the new recovery password" : "Ripeti la nuova password di recupero", "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 update the private key password." : "Impossibile aggiornare la password della chiave privata.", + "The old password was not correct, please try again." : "La vecchia password non era corretta, prova di nuovo.", + "The current log-in password was not correct, please try again." : "La password di accesso attuale non era corretta, prova ancora.", "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.", "File recovery settings updated" : "Impostazioni di ripristino dei file aggiornate", "Could not update file recovery" : "Impossibile aggiornare il ripristino dei file", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Applicazione di cifratura non inizializzata. Forse l'applicazione è stata riabilitata durante la tua sessione. Prova a disconnetterti e ad effettuare nuovamente l'accesso per inizializzarla.", @@ -22,7 +24,7 @@ OC.L10N.register( "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Impossibile decifrare questo file, probabilmente è un file condiviso. Chiedi al proprietario del file di condividere nuovamente il file con te.", "Unknown error. Please check your system settings or contact your administrator" : "Errore sconosciuto. Controlla le impostazioni di sistema o contatta il tuo amministratore", "Missing requirements." : "Requisiti mancanti.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Assicurati che sia installato PHP 5.3.3 o versioni successive e che l'estensione OpenSSL di PHP sia abilitata e configurata correttamente. Per ora, l'applicazione di cifratura è disabilitata.", + "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Assicurati che OpenSSL e l'estensione PHP sia abilitatati e configurati correttamente. Per ora, l'applicazione di cifratura è disabilitata.", "Following users are not set up for encryption:" : "I seguenti utenti non sono configurati per la cifratura:", "Initial encryption started... This can take some time. Please wait." : "Cifratura iniziale avviata... Potrebbe richiedere del tempo. Attendi.", "Initial encryption running... Please try again later." : "Cifratura iniziale in esecuzione... Riprova più tardi.", diff --git a/apps/files_encryption/l10n/it.json b/apps/files_encryption/l10n/it.json index d051a2cfc98..15d2b1b0343 100644 --- a/apps/files_encryption/l10n/it.json +++ b/apps/files_encryption/l10n/it.json @@ -11,8 +11,10 @@ "Please repeat the new recovery password" : "Ripeti la nuova password di recupero", "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 update the private key password." : "Impossibile aggiornare la password della chiave privata.", + "The old password was not correct, please try again." : "La vecchia password non era corretta, prova di nuovo.", + "The current log-in password was not correct, please try again." : "La password di accesso attuale non era corretta, prova ancora.", "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.", "File recovery settings updated" : "Impostazioni di ripristino dei file aggiornate", "Could not update file recovery" : "Impossibile aggiornare il ripristino dei file", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Applicazione di cifratura non inizializzata. Forse l'applicazione è stata riabilitata durante la tua sessione. Prova a disconnetterti e ad effettuare nuovamente l'accesso per inizializzarla.", @@ -20,7 +22,7 @@ "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Impossibile decifrare questo file, probabilmente è un file condiviso. Chiedi al proprietario del file di condividere nuovamente il file con te.", "Unknown error. Please check your system settings or contact your administrator" : "Errore sconosciuto. Controlla le impostazioni di sistema o contatta il tuo amministratore", "Missing requirements." : "Requisiti mancanti.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Assicurati che sia installato PHP 5.3.3 o versioni successive e che l'estensione OpenSSL di PHP sia abilitata e configurata correttamente. Per ora, l'applicazione di cifratura è disabilitata.", + "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Assicurati che OpenSSL e l'estensione PHP sia abilitatati e configurati correttamente. Per ora, l'applicazione di cifratura è disabilitata.", "Following users are not set up for encryption:" : "I seguenti utenti non sono configurati per la cifratura:", "Initial encryption started... This can take some time. Please wait." : "Cifratura iniziale avviata... Potrebbe richiedere del tempo. Attendi.", "Initial encryption running... Please try again later." : "Cifratura iniziale in esecuzione... Riprova più tardi.", diff --git a/apps/files_encryption/l10n/ja.js b/apps/files_encryption/l10n/ja.js index e4ca38f822b..6d0930b5e25 100644 --- a/apps/files_encryption/l10n/ja.js +++ b/apps/files_encryption/l10n/ja.js @@ -13,19 +13,21 @@ OC.L10N.register( "Please repeat the new recovery password" : "新しい復旧キーのパスワードをもう一度入力", "Password successfully changed." : "パスワードを変更できました。", "Could not change the password. Maybe the old password was not correct." : "パスワードを変更できませんでした。古いパスワードが間違っているかもしれません。", + "Could not update the private key password." : "秘密鍵のパスワードを更新できませんでした。", + "The old password was not correct, please try again." : "古いパスワードが一致しませんでした。もう一度入力してください。", + "The current log-in password was not correct, please try again." : "ログインパスワードが一致しませんでした。もう一度入力してください。", "Private key password successfully updated." : "秘密鍵のパスワードが正常に更新されました。", - "Could not update the private key password. Maybe the old password was not correct." : "秘密鍵のパスワードを更新できませんでした。古いパスワードが正確でない場合があります。", "File recovery settings updated" : "ファイルリカバリ設定を更新しました", "Could not update file recovery" : "ファイルリカバリを更新できませんでした", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "セッション中に暗号化アプリを再度有効にされたため、暗号化アプリが初期化されていません。暗号化アプリを初期化するため、ログアウトしてログインしなおしてください。", "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "プライベートキーが有効ではありません!パスワードが%sの外部で変更された(例: 共同ディレクトリ)と思われます。個人設定でプライベートキーのパスワードを更新して、暗号化ファイルへのアクセスを回復することができます。", "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "このファイルを復号化できません、共有ファイルの可能性があります。ファイルの所有者にお願いして、ファイルを共有しなおしてもらってください。", "Unknown error. Please check your system settings or contact your administrator" : "不明なエラーです。システム設定を確認するか、管理者に問い合わせてください。", - "Missing requirements." : "必要要件が満たされていません。", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "必ず、PHP 5.3.3もしくはそれ以上をインストールし、同時にOpenSSLのPHP拡張を有効にした上でOpenSSLも同様にインストール、適切に設定してください。現時点では暗号化アプリは無効になっています。", - "Following users are not set up for encryption:" : "以下のユーザーは、暗号化設定がされていません:", "Initial encryption started... This can take some time. Please wait." : "暗号化の初期化作業を開始しました... この処理にはしばらく時間がかかります。お待ちください。", "Initial encryption running... Please try again later." : "初期暗号化実行中... 後でもう一度お試しください。", + "Missing requirements." : "必要要件が満たされていません。", + "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "必ず、OpenSSL及びOpenSSLのPHPの拡張を有効にした上で、適切に設定してください。現時点では暗号化アプリは無効になっています。", + "Following users are not set up for encryption:" : "以下のユーザーは、暗号化設定がされていません:", "Go directly to your %spersonal settings%s." : "直接 %s個人設定%s に進む。", "Encryption" : "暗号化", "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "暗号化アプリは有効ですが、あなたの暗号化キーは初期化されていません。ログアウトした後に、再度ログインしてください", diff --git a/apps/files_encryption/l10n/ja.json b/apps/files_encryption/l10n/ja.json index 471bf314442..abf2a3555ee 100644 --- a/apps/files_encryption/l10n/ja.json +++ b/apps/files_encryption/l10n/ja.json @@ -11,19 +11,21 @@ "Please repeat the new recovery password" : "新しい復旧キーのパスワードをもう一度入力", "Password successfully changed." : "パスワードを変更できました。", "Could not change the password. Maybe the old password was not correct." : "パスワードを変更できませんでした。古いパスワードが間違っているかもしれません。", + "Could not update the private key password." : "秘密鍵のパスワードを更新できませんでした。", + "The old password was not correct, please try again." : "古いパスワードが一致しませんでした。もう一度入力してください。", + "The current log-in password was not correct, please try again." : "ログインパスワードが一致しませんでした。もう一度入力してください。", "Private key password successfully updated." : "秘密鍵のパスワードが正常に更新されました。", - "Could not update the private key password. Maybe the old password was not correct." : "秘密鍵のパスワードを更新できませんでした。古いパスワードが正確でない場合があります。", "File recovery settings updated" : "ファイルリカバリ設定を更新しました", "Could not update file recovery" : "ファイルリカバリを更新できませんでした", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "セッション中に暗号化アプリを再度有効にされたため、暗号化アプリが初期化されていません。暗号化アプリを初期化するため、ログアウトしてログインしなおしてください。", "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "プライベートキーが有効ではありません!パスワードが%sの外部で変更された(例: 共同ディレクトリ)と思われます。個人設定でプライベートキーのパスワードを更新して、暗号化ファイルへのアクセスを回復することができます。", "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "このファイルを復号化できません、共有ファイルの可能性があります。ファイルの所有者にお願いして、ファイルを共有しなおしてもらってください。", "Unknown error. Please check your system settings or contact your administrator" : "不明なエラーです。システム設定を確認するか、管理者に問い合わせてください。", - "Missing requirements." : "必要要件が満たされていません。", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "必ず、PHP 5.3.3もしくはそれ以上をインストールし、同時にOpenSSLのPHP拡張を有効にした上でOpenSSLも同様にインストール、適切に設定してください。現時点では暗号化アプリは無効になっています。", - "Following users are not set up for encryption:" : "以下のユーザーは、暗号化設定がされていません:", "Initial encryption started... This can take some time. Please wait." : "暗号化の初期化作業を開始しました... この処理にはしばらく時間がかかります。お待ちください。", "Initial encryption running... Please try again later." : "初期暗号化実行中... 後でもう一度お試しください。", + "Missing requirements." : "必要要件が満たされていません。", + "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "必ず、OpenSSL及びOpenSSLのPHPの拡張を有効にした上で、適切に設定してください。現時点では暗号化アプリは無効になっています。", + "Following users are not set up for encryption:" : "以下のユーザーは、暗号化設定がされていません:", "Go directly to your %spersonal settings%s." : "直接 %s個人設定%s に進む。", "Encryption" : "暗号化", "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "暗号化アプリは有効ですが、あなたの暗号化キーは初期化されていません。ログアウトした後に、再度ログインしてください", diff --git a/apps/files_encryption/l10n/kn.js b/apps/files_encryption/l10n/kn.js new file mode 100644 index 00000000000..b3fcb4aba3d --- /dev/null +++ b/apps/files_encryption/l10n/kn.js @@ -0,0 +1,9 @@ +OC.L10N.register( + "files_encryption", + { + "Unknown error" : "ಗೊತ್ತಿಲ್ಲದ ದೋಷ", + "Encryption" : "ರಹಸ್ಯ ಸಂಕೇತೀಕರಿಸು", + "Enabled" : "ಸಕ್ರಿಯಗೊಳಿಸಿದೆ", + "Disabled" : "ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ" +}, +"nplurals=1; plural=0;"); diff --git a/apps/files_encryption/l10n/kn.json b/apps/files_encryption/l10n/kn.json new file mode 100644 index 00000000000..a6c76f69b22 --- /dev/null +++ b/apps/files_encryption/l10n/kn.json @@ -0,0 +1,7 @@ +{ "translations": { + "Unknown error" : "ಗೊತ್ತಿಲ್ಲದ ದೋಷ", + "Encryption" : "ರಹಸ್ಯ ಸಂಕೇತೀಕರಿಸು", + "Enabled" : "ಸಕ್ರಿಯಗೊಳಿಸಿದೆ", + "Disabled" : "ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ" +},"pluralForm" :"nplurals=1; plural=0;" +}
\ No newline at end of file diff --git a/apps/files_encryption/l10n/ko.js b/apps/files_encryption/l10n/ko.js index a994dc7d339..82c29ecb11a 100644 --- a/apps/files_encryption/l10n/ko.js +++ b/apps/files_encryption/l10n/ko.js @@ -8,14 +8,12 @@ OC.L10N.register( "Password successfully changed." : "암호가 성공적으로 변경되었습니다", "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." : "개인 키 암호를 업데이트할 수 없습니다. 이전 암호가 올바르지 않은 것 같습니다.", "File recovery settings updated" : "파일 복구 설정 업데이트됨", "Could not update file recovery" : "파일 복구를 업데이트할 수 없습니다", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "암호화 앱이 초기화되지 않았습니다! 암호화 앱이 다시 활성화된 것 같습니다. 암호화 앱을 초기화하려면 로그아웃했다 다시 로그인하십시오.", "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "개인 키가 올바르지 않습니다! 암호가 %s(예: 회사 디렉터리) 외부에서 변경된 것 같습니다. 암호화된 파일에 다시 접근하려면 개인 설정에서 개인 키 암호를 수정하십시오.", "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "이 파일을 복호화할 수 없습니다. 공유된 파일일 수도 있습니다. 파일 소유자에게 공유를 다시 요청하십시오.", "Missing requirements." : "요구 사항이 부족합니다.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "PHP 5.3.3 이상 설치 여부, PHP의 OpenSSL 확장 기능 활성화 및 설정 여부를 확인하십시오. 암호화 앱이 비활성화 되었습니다.", "Following users are not set up for encryption:" : "다음 사용자는 암호화를 사용할 수 없습니다:", "Initial encryption started... This can take some time. Please wait." : "초기 암호화가 시작되었습니다... 시간이 걸릴 수도 있으니 기다려 주십시오.", "Encryption" : "암호화", diff --git a/apps/files_encryption/l10n/ko.json b/apps/files_encryption/l10n/ko.json index 3cc8ec06b06..e1b53e0983e 100644 --- a/apps/files_encryption/l10n/ko.json +++ b/apps/files_encryption/l10n/ko.json @@ -6,14 +6,12 @@ "Password successfully changed." : "암호가 성공적으로 변경되었습니다", "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." : "개인 키 암호를 업데이트할 수 없습니다. 이전 암호가 올바르지 않은 것 같습니다.", "File recovery settings updated" : "파일 복구 설정 업데이트됨", "Could not update file recovery" : "파일 복구를 업데이트할 수 없습니다", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "암호화 앱이 초기화되지 않았습니다! 암호화 앱이 다시 활성화된 것 같습니다. 암호화 앱을 초기화하려면 로그아웃했다 다시 로그인하십시오.", "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "개인 키가 올바르지 않습니다! 암호가 %s(예: 회사 디렉터리) 외부에서 변경된 것 같습니다. 암호화된 파일에 다시 접근하려면 개인 설정에서 개인 키 암호를 수정하십시오.", "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "이 파일을 복호화할 수 없습니다. 공유된 파일일 수도 있습니다. 파일 소유자에게 공유를 다시 요청하십시오.", "Missing requirements." : "요구 사항이 부족합니다.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "PHP 5.3.3 이상 설치 여부, PHP의 OpenSSL 확장 기능 활성화 및 설정 여부를 확인하십시오. 암호화 앱이 비활성화 되었습니다.", "Following users are not set up for encryption:" : "다음 사용자는 암호화를 사용할 수 없습니다:", "Initial encryption started... This can take some time. Please wait." : "초기 암호화가 시작되었습니다... 시간이 걸릴 수도 있으니 기다려 주십시오.", "Encryption" : "암호화", diff --git a/apps/files_encryption/l10n/lt_LT.js b/apps/files_encryption/l10n/lt_LT.js index eebfcedaf0b..98541b865fe 100644 --- a/apps/files_encryption/l10n/lt_LT.js +++ b/apps/files_encryption/l10n/lt_LT.js @@ -8,14 +8,12 @@ OC.L10N.register( "Password successfully changed." : "Slaptažodis sėkmingai pakeistas", "Could not change the password. Maybe the old password was not correct." : "Slaptažodis nebuvo pakeistas. Gali būti, kad buvo neteisingai suvestas senasis.", "Private key password successfully updated." : "Privataus rakto slaptažodis buvo sėkmingai atnaujintas.", - "Could not update the private key password. Maybe the old password was not correct." : "Nepavyko atnaujinti privataus rakto slaptažodžio. Gali būti, kad buvo neteisingai suvestas senasis.", "File recovery settings updated" : "Failų atkūrimo nustatymai pakeisti", "Could not update file recovery" : "Neišėjo atnaujinti failų atkūrimo", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Šifravimo programa nepaleista! Galbūt šifravimo programa buvo įjungta dar kartą Jūsų sesijos metu. Prašome atsijungti ir vėl prisijungti, kad paleisti šifravimo programą.", "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Jūsų privatus raktas yra netinkamas! Panašu, kad Jūsų slaptažodis buvo pakeistas už %s (pvz. Jūsų organizacijos kataloge). Galite atnaujinti savo privataus rakto slaptažodį savo asmeniniuose nustatymuose, kad atkurti prieigą prie savo šifruotų failų.", "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Failo iššifruoti nepavyko, gali būti jog jis yra pasidalintas su jumis. Paprašykite failo savininko, kad jums iš naujo pateiktų šį failą.", "Missing requirements." : "Trūkstami laukai.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Prašome įsitikinti, kad PHP 5.3.3 ar naujesnė yra įdiegta ir kad OpenSSL kartu su PHP plėtiniu yra šjungti ir teisingai sukonfigūruoti. Kol kas šifravimo programa bus išjungta.", "Following users are not set up for encryption:" : "Sekantys naudotojai nenustatyti šifravimui:", "Initial encryption started... This can take some time. Please wait." : "Pradėtas pirminis šifravimas... Tai gali užtrukti. Prašome palaukti.", "Encryption" : "Šifravimas", diff --git a/apps/files_encryption/l10n/lt_LT.json b/apps/files_encryption/l10n/lt_LT.json index c642bfd7528..e0e486d020b 100644 --- a/apps/files_encryption/l10n/lt_LT.json +++ b/apps/files_encryption/l10n/lt_LT.json @@ -6,14 +6,12 @@ "Password successfully changed." : "Slaptažodis sėkmingai pakeistas", "Could not change the password. Maybe the old password was not correct." : "Slaptažodis nebuvo pakeistas. Gali būti, kad buvo neteisingai suvestas senasis.", "Private key password successfully updated." : "Privataus rakto slaptažodis buvo sėkmingai atnaujintas.", - "Could not update the private key password. Maybe the old password was not correct." : "Nepavyko atnaujinti privataus rakto slaptažodžio. Gali būti, kad buvo neteisingai suvestas senasis.", "File recovery settings updated" : "Failų atkūrimo nustatymai pakeisti", "Could not update file recovery" : "Neišėjo atnaujinti failų atkūrimo", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Šifravimo programa nepaleista! Galbūt šifravimo programa buvo įjungta dar kartą Jūsų sesijos metu. Prašome atsijungti ir vėl prisijungti, kad paleisti šifravimo programą.", "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Jūsų privatus raktas yra netinkamas! Panašu, kad Jūsų slaptažodis buvo pakeistas už %s (pvz. Jūsų organizacijos kataloge). Galite atnaujinti savo privataus rakto slaptažodį savo asmeniniuose nustatymuose, kad atkurti prieigą prie savo šifruotų failų.", "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Failo iššifruoti nepavyko, gali būti jog jis yra pasidalintas su jumis. Paprašykite failo savininko, kad jums iš naujo pateiktų šį failą.", "Missing requirements." : "Trūkstami laukai.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Prašome įsitikinti, kad PHP 5.3.3 ar naujesnė yra įdiegta ir kad OpenSSL kartu su PHP plėtiniu yra šjungti ir teisingai sukonfigūruoti. Kol kas šifravimo programa bus išjungta.", "Following users are not set up for encryption:" : "Sekantys naudotojai nenustatyti šifravimui:", "Initial encryption started... This can take some time. Please wait." : "Pradėtas pirminis šifravimas... Tai gali užtrukti. Prašome palaukti.", "Encryption" : "Šifravimas", diff --git a/apps/files_encryption/l10n/lv.js b/apps/files_encryption/l10n/lv.js index 841a7fc754d..26a761dc5a8 100644 --- a/apps/files_encryption/l10n/lv.js +++ b/apps/files_encryption/l10n/lv.js @@ -2,6 +2,8 @@ OC.L10N.register( "files_encryption", { "Unknown error" : "Nezināma kļūda", - "Encryption" : "Šifrēšana" + "Encryption" : "Šifrēšana", + "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Šifrēšanas lietotnes ir pieslēgta, bet šifrēšanas atslēgas nav uzstādītas. Lūdzu izejiet no sistēmas un ieejiet sistēmā atpakaļ.", + "Enabled" : "Pievienots" }, "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);"); diff --git a/apps/files_encryption/l10n/lv.json b/apps/files_encryption/l10n/lv.json index b5c22c13a86..ff29809e4d1 100644 --- a/apps/files_encryption/l10n/lv.json +++ b/apps/files_encryption/l10n/lv.json @@ -1,5 +1,7 @@ { "translations": { "Unknown error" : "Nezināma kļūda", - "Encryption" : "Šifrēšana" + "Encryption" : "Šifrēšana", + "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Šifrēšanas lietotnes ir pieslēgta, bet šifrēšanas atslēgas nav uzstādītas. Lūdzu izejiet no sistēmas un ieejiet sistēmā atpakaļ.", + "Enabled" : "Pievienots" },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);" }
\ No newline at end of file diff --git a/apps/files_encryption/l10n/nb_NO.js b/apps/files_encryption/l10n/nb_NO.js index 3e018cd76f2..3def2334352 100644 --- a/apps/files_encryption/l10n/nb_NO.js +++ b/apps/files_encryption/l10n/nb_NO.js @@ -2,24 +2,32 @@ OC.L10N.register( "files_encryption", { "Unknown error" : "Ukjent feil", + "Missing recovery key password" : "Passord for gjenopprettingsnøkkel mangler", + "Please repeat the recovery key password" : "Gjenta passord for gjenopprettingsnøkkel", + "Repeated recovery key password does not match the provided recovery key password" : "Gjentatt passord for gjenopprettingsnøkkel stemmer ikke med oppgitt passord for gjenopprettingsnøkkel", "Recovery key successfully enabled" : "Gjenopprettingsnøkkel aktivert", "Could not disable recovery key. Please check your recovery key password!" : "Klarte ikke å deaktivere gjenopprettingsnøkkel. Sjekk passordet for gjenopprettingsnøkkelen.", "Recovery key successfully disabled" : "Gjenopprettingsnøkkel ble deaktivert", + "Please provide the old recovery password" : "Oppgi det gamle gjenopprettingspassordet", + "Please provide a new recovery password" : "Oppgi et nytt gjenopprettingspassord", + "Please repeat the new recovery password" : "Gjenta det nye gjenopprettingspassordet", "Password successfully changed." : "Passordet ble endret.", "Could not change the password. Maybe the old password was not correct." : "Klarte ikke å endre passordet. Kanskje gammelt passord ikke var korrekt.", + "Could not update the private key password." : "Klarte ikke å oppdatere privatnøkkelpassordet.", + "The old password was not correct, please try again." : "Det gamle passordet var feil. Prøv igjen.", + "The current log-in password was not correct, please try again." : "Det nåværende innloggingspassordet var feil. Prøv igjen.", "Private key password successfully updated." : "Passord for privat nøkkel ble oppdatert.", - "Could not update the private key password. Maybe the old password was not correct." : "Klarte ikke å oppdatere passord for privat nøkkel. Kanskje gammelt passord ikke var korrekt.", "File recovery settings updated" : "Innstillinger for gjenoppretting av filer ble oppdatert", "Could not update file recovery" : "Klarte ikke å oppdatere gjenoppretting av filer", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Krypterings-app ikke initialisert! Kanskje krypterings-appen ble aktivert på nytt i løpet av økten din. Prøv å logge ut og logge inn igjen for å initialisere krypterings-appen.", "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Din private nøkkel er ikke gyldig! Sannsynligvis ble passordet ditt endret utenfor %s. (f.eks. din bedriftskatalog). Du kan oppdatere passordet for din private nøkkel i dine personlige innstillinger for å gjenvinne tilgang til de krypterte filene dine.", "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Kan ikke dekryptere denne filen. Dette er sannsynligvis en delt fil. Spør eieren av filen om å dele den med deg på nytt.", "Unknown error. Please check your system settings or contact your administrator" : "Ukjent feil. Sjekk systeminnstillingene eller kontakt administratoren.", - "Missing requirements." : "Manglende krav.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Vennligst se til at PHP 5.3.3 eller nyere er installert og at OpenSSL sammen med PHP-utvidelsen er aktivert og riktig konfigurert. Enn så lenge er krypterings-appen deaktivert.", - "Following users are not set up for encryption:" : "Følgende brukere er ikke satt opp for kryptering:", "Initial encryption started... This can take some time. Please wait." : "Førstegangs kryptering startet... Dette kan ta litt tid. Vennligst vent.", "Initial encryption running... Please try again later." : "Førstegangs kryptering kjører... Prøv igjen senere.", + "Missing requirements." : "Manglende krav.", + "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Vennligst se til at OpenSSL sammen med PHP-utvidelsen er aktivert og riktig konfigurert. Krypterings-appen er foreløpig deaktivert.", + "Following users are not set up for encryption:" : "Følgende brukere er ikke satt opp for kryptering:", "Go directly to your %spersonal settings%s." : "Gå direkte til dine %spersonlige innstillinger%s.", "Encryption" : "Kryptering", "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "App for kryptering er aktivert men nøklene dine er ikke satt opp. Logg ut og logg inn igjen.", diff --git a/apps/files_encryption/l10n/nb_NO.json b/apps/files_encryption/l10n/nb_NO.json index ba3e2210a96..bada449a86c 100644 --- a/apps/files_encryption/l10n/nb_NO.json +++ b/apps/files_encryption/l10n/nb_NO.json @@ -1,23 +1,31 @@ { "translations": { "Unknown error" : "Ukjent feil", + "Missing recovery key password" : "Passord for gjenopprettingsnøkkel mangler", + "Please repeat the recovery key password" : "Gjenta passord for gjenopprettingsnøkkel", + "Repeated recovery key password does not match the provided recovery key password" : "Gjentatt passord for gjenopprettingsnøkkel stemmer ikke med oppgitt passord for gjenopprettingsnøkkel", "Recovery key successfully enabled" : "Gjenopprettingsnøkkel aktivert", "Could not disable recovery key. Please check your recovery key password!" : "Klarte ikke å deaktivere gjenopprettingsnøkkel. Sjekk passordet for gjenopprettingsnøkkelen.", "Recovery key successfully disabled" : "Gjenopprettingsnøkkel ble deaktivert", + "Please provide the old recovery password" : "Oppgi det gamle gjenopprettingspassordet", + "Please provide a new recovery password" : "Oppgi et nytt gjenopprettingspassord", + "Please repeat the new recovery password" : "Gjenta det nye gjenopprettingspassordet", "Password successfully changed." : "Passordet ble endret.", "Could not change the password. Maybe the old password was not correct." : "Klarte ikke å endre passordet. Kanskje gammelt passord ikke var korrekt.", + "Could not update the private key password." : "Klarte ikke å oppdatere privatnøkkelpassordet.", + "The old password was not correct, please try again." : "Det gamle passordet var feil. Prøv igjen.", + "The current log-in password was not correct, please try again." : "Det nåværende innloggingspassordet var feil. Prøv igjen.", "Private key password successfully updated." : "Passord for privat nøkkel ble oppdatert.", - "Could not update the private key password. Maybe the old password was not correct." : "Klarte ikke å oppdatere passord for privat nøkkel. Kanskje gammelt passord ikke var korrekt.", "File recovery settings updated" : "Innstillinger for gjenoppretting av filer ble oppdatert", "Could not update file recovery" : "Klarte ikke å oppdatere gjenoppretting av filer", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Krypterings-app ikke initialisert! Kanskje krypterings-appen ble aktivert på nytt i løpet av økten din. Prøv å logge ut og logge inn igjen for å initialisere krypterings-appen.", "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Din private nøkkel er ikke gyldig! Sannsynligvis ble passordet ditt endret utenfor %s. (f.eks. din bedriftskatalog). Du kan oppdatere passordet for din private nøkkel i dine personlige innstillinger for å gjenvinne tilgang til de krypterte filene dine.", "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Kan ikke dekryptere denne filen. Dette er sannsynligvis en delt fil. Spør eieren av filen om å dele den med deg på nytt.", "Unknown error. Please check your system settings or contact your administrator" : "Ukjent feil. Sjekk systeminnstillingene eller kontakt administratoren.", - "Missing requirements." : "Manglende krav.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Vennligst se til at PHP 5.3.3 eller nyere er installert og at OpenSSL sammen med PHP-utvidelsen er aktivert og riktig konfigurert. Enn så lenge er krypterings-appen deaktivert.", - "Following users are not set up for encryption:" : "Følgende brukere er ikke satt opp for kryptering:", "Initial encryption started... This can take some time. Please wait." : "Førstegangs kryptering startet... Dette kan ta litt tid. Vennligst vent.", "Initial encryption running... Please try again later." : "Førstegangs kryptering kjører... Prøv igjen senere.", + "Missing requirements." : "Manglende krav.", + "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Vennligst se til at OpenSSL sammen med PHP-utvidelsen er aktivert og riktig konfigurert. Krypterings-appen er foreløpig deaktivert.", + "Following users are not set up for encryption:" : "Følgende brukere er ikke satt opp for kryptering:", "Go directly to your %spersonal settings%s." : "Gå direkte til dine %spersonlige innstillinger%s.", "Encryption" : "Kryptering", "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "App for kryptering er aktivert men nøklene dine er ikke satt opp. Logg ut og logg inn igjen.", diff --git a/apps/files_encryption/l10n/nl.js b/apps/files_encryption/l10n/nl.js index 04b2c9e8175..0400accd2bd 100644 --- a/apps/files_encryption/l10n/nl.js +++ b/apps/files_encryption/l10n/nl.js @@ -13,8 +13,10 @@ OC.L10N.register( "Please repeat the new recovery password" : "Herhaal het nieuwe herstelwachtwoord", "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 update the private key password." : "Kon het wachtwoord van de privésleutel niet bijwerken.", + "The old password was not correct, please try again." : "Het oude wachtwoord was onjuist, probeer het opnieuw.", + "The current log-in password was not correct, please try again." : "Het huidige inlogwachtwoord was niet juist, probeer het opnieuw.", "Private key password successfully updated." : "Privésleutel succesvol bijgewerkt.", - "Could not update the private key password. Maybe the old password was not correct." : "Kon het wachtwoord van de privésleutel niet wijzigen. Misschien was het oude wachtwoord onjuist.", "File recovery settings updated" : "Bestandsherstel instellingen bijgewerkt", "Could not update file recovery" : "Kon bestandsherstel niet bijwerken", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Crypto app niet geïnitialiseerd. Misschien werd de crypto app geheractiveerd tijdens de sessie. Log uit en log daarna opnieuw in om de crypto app te initialiseren.", @@ -22,7 +24,7 @@ OC.L10N.register( "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Kan dit bestand niet ontcijferen, waarschijnlijk is het een gedeeld bestand, Vraag de eigenaar om het bestand opnieuw met u te delen.", "Unknown error. Please check your system settings or contact your administrator" : "Onbekende fout. Controleer uw systeeminstellingen of neem contact op met de beheerder", "Missing requirements." : "Missende benodigdheden.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Wees er zeker van dat PHP5.3.3 of nieuwer is geïstalleerd en dat de OpenSSL PHP extensie is ingeschakeld en correct geconfigureerd. De versleutel-app is voorlopig uitgeschakeld.", + "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Weed er zeker van dat OpenSSL met de PHP extensie is ingeschakeld en goed geconfigureerd. Op dit moment is de encryptie app uitgeschakeld.", "Following users are not set up for encryption:" : "De volgende gebruikers hebben geen configuratie voor encryptie:", "Initial encryption started... This can take some time. Please wait." : "initiële versleuteling gestart... Dit kan even duren, geduld a.u.b.", "Initial encryption running... Please try again later." : "Initiële versleuteling bezig... Probeer het later opnieuw.", diff --git a/apps/files_encryption/l10n/nl.json b/apps/files_encryption/l10n/nl.json index 67f0d2e4c89..eb2ea89428b 100644 --- a/apps/files_encryption/l10n/nl.json +++ b/apps/files_encryption/l10n/nl.json @@ -11,8 +11,10 @@ "Please repeat the new recovery password" : "Herhaal het nieuwe herstelwachtwoord", "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 update the private key password." : "Kon het wachtwoord van de privésleutel niet bijwerken.", + "The old password was not correct, please try again." : "Het oude wachtwoord was onjuist, probeer het opnieuw.", + "The current log-in password was not correct, please try again." : "Het huidige inlogwachtwoord was niet juist, probeer het opnieuw.", "Private key password successfully updated." : "Privésleutel succesvol bijgewerkt.", - "Could not update the private key password. Maybe the old password was not correct." : "Kon het wachtwoord van de privésleutel niet wijzigen. Misschien was het oude wachtwoord onjuist.", "File recovery settings updated" : "Bestandsherstel instellingen bijgewerkt", "Could not update file recovery" : "Kon bestandsherstel niet bijwerken", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Crypto app niet geïnitialiseerd. Misschien werd de crypto app geheractiveerd tijdens de sessie. Log uit en log daarna opnieuw in om de crypto app te initialiseren.", @@ -20,7 +22,7 @@ "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Kan dit bestand niet ontcijferen, waarschijnlijk is het een gedeeld bestand, Vraag de eigenaar om het bestand opnieuw met u te delen.", "Unknown error. Please check your system settings or contact your administrator" : "Onbekende fout. Controleer uw systeeminstellingen of neem contact op met de beheerder", "Missing requirements." : "Missende benodigdheden.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Wees er zeker van dat PHP5.3.3 of nieuwer is geïstalleerd en dat de OpenSSL PHP extensie is ingeschakeld en correct geconfigureerd. De versleutel-app is voorlopig uitgeschakeld.", + "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Weed er zeker van dat OpenSSL met de PHP extensie is ingeschakeld en goed geconfigureerd. Op dit moment is de encryptie app uitgeschakeld.", "Following users are not set up for encryption:" : "De volgende gebruikers hebben geen configuratie voor encryptie:", "Initial encryption started... This can take some time. Please wait." : "initiële versleuteling gestart... Dit kan even duren, geduld a.u.b.", "Initial encryption running... Please try again later." : "Initiële versleuteling bezig... Probeer het later opnieuw.", diff --git a/apps/files_encryption/l10n/pl.js b/apps/files_encryption/l10n/pl.js index a0bccc8c9f2..26f3cff7397 100644 --- a/apps/files_encryption/l10n/pl.js +++ b/apps/files_encryption/l10n/pl.js @@ -2,14 +2,21 @@ OC.L10N.register( "files_encryption", { "Unknown error" : "Nieznany błąd", + "Missing recovery key password" : "Brakujące hasło klucza odzyskiwania", "Please repeat the recovery key password" : "Proszę powtórz nowe hasło klucza odzyskiwania", + "Repeated recovery key password does not match the provided recovery key password" : "Hasła klucza odzyskiwania nie zgadzają się", "Recovery key successfully enabled" : "Klucz odzyskiwania włączony", "Could not disable recovery key. Please check your recovery key password!" : "Nie można wyłączyć klucza odzyskiwania. Proszę sprawdzić swoje hasło odzyskiwania!", "Recovery key successfully disabled" : "Klucz odzyskiwania wyłączony", + "Please provide the old recovery password" : "Podaj stare hasło odzyskiwania", + "Please provide a new recovery password" : "Podaj nowe hasło odzyskiwania", + "Please repeat the new recovery password" : "Proszę powtórz nowe hasło odzyskiwania", "Password successfully changed." : "Zmiana hasła udana.", "Could not change the password. Maybe the old password was not correct." : "Nie można zmienić hasła. Może stare hasło nie było poprawne.", + "Could not update the private key password." : "Nie można zmienić hasła klucza prywatnego.", + "The old password was not correct, please try again." : "Stare hasło nie było poprawne. Spróbuj jeszcze raz.", + "The current log-in password was not correct, please try again." : "Obecne hasło logowania nie było poprawne. Spróbuj ponownie.", "Private key password successfully updated." : "Pomyślnie zaktualizowano hasło klucza prywatnego.", - "Could not update the private key password. Maybe the old password was not correct." : "Nie można zmienić prywatnego hasła. Może stare hasło nie było poprawne.", "File recovery settings updated" : "Ustawienia odzyskiwania plików zmienione", "Could not update file recovery" : "Nie można zmienić pliku odzyskiwania", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Szyfrowanie aplikacja nie została zainicjowane! Może szyfrowanie aplikacji zostało ponownie włączone podczas tej sesji. Spróbuj się wylogować i zalogować ponownie aby zainicjować szyfrowanie aplikacji.", @@ -17,7 +24,6 @@ OC.L10N.register( "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Nie można odszyfrować tego pliku, prawdopodobnie jest to plik udostępniony. Poproś właściciela pliku o ponowne udostępnianie pliku Tobie.", "Unknown error. Please check your system settings or contact your administrator" : "Nieznany błąd. Proszę sprawdzić ustawienia systemowe lub skontaktować się z administratorem", "Missing requirements." : "Brak wymagań.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Proszę upewnić się, że PHP 5.3.3 lub nowszy jest zainstalowany i że OpenSSL oraz rozszerzenie PHP jest włączone i poprawnie skonfigurowane. Obecnie szyfrowanie aplikacji zostało wyłączone.", "Following users are not set up for encryption:" : "Następujący użytkownicy nie mają skonfigurowanego szyfrowania:", "Initial encryption started... This can take some time. Please wait." : "Rozpoczęto szyfrowanie... To może chwilę potrwać. Proszę czekać.", "Initial encryption running... Please try again later." : "Trwa szyfrowanie początkowe...Spróbuj ponownie.", diff --git a/apps/files_encryption/l10n/pl.json b/apps/files_encryption/l10n/pl.json index dd817a40542..ae2b3f06218 100644 --- a/apps/files_encryption/l10n/pl.json +++ b/apps/files_encryption/l10n/pl.json @@ -1,13 +1,20 @@ { "translations": { "Unknown error" : "Nieznany błąd", + "Missing recovery key password" : "Brakujące hasło klucza odzyskiwania", "Please repeat the recovery key password" : "Proszę powtórz nowe hasło klucza odzyskiwania", + "Repeated recovery key password does not match the provided recovery key password" : "Hasła klucza odzyskiwania nie zgadzają się", "Recovery key successfully enabled" : "Klucz odzyskiwania włączony", "Could not disable recovery key. Please check your recovery key password!" : "Nie można wyłączyć klucza odzyskiwania. Proszę sprawdzić swoje hasło odzyskiwania!", "Recovery key successfully disabled" : "Klucz odzyskiwania wyłączony", + "Please provide the old recovery password" : "Podaj stare hasło odzyskiwania", + "Please provide a new recovery password" : "Podaj nowe hasło odzyskiwania", + "Please repeat the new recovery password" : "Proszę powtórz nowe hasło odzyskiwania", "Password successfully changed." : "Zmiana hasła udana.", "Could not change the password. Maybe the old password was not correct." : "Nie można zmienić hasła. Może stare hasło nie było poprawne.", + "Could not update the private key password." : "Nie można zmienić hasła klucza prywatnego.", + "The old password was not correct, please try again." : "Stare hasło nie było poprawne. Spróbuj jeszcze raz.", + "The current log-in password was not correct, please try again." : "Obecne hasło logowania nie było poprawne. Spróbuj ponownie.", "Private key password successfully updated." : "Pomyślnie zaktualizowano hasło klucza prywatnego.", - "Could not update the private key password. Maybe the old password was not correct." : "Nie można zmienić prywatnego hasła. Może stare hasło nie było poprawne.", "File recovery settings updated" : "Ustawienia odzyskiwania plików zmienione", "Could not update file recovery" : "Nie można zmienić pliku odzyskiwania", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Szyfrowanie aplikacja nie została zainicjowane! Może szyfrowanie aplikacji zostało ponownie włączone podczas tej sesji. Spróbuj się wylogować i zalogować ponownie aby zainicjować szyfrowanie aplikacji.", @@ -15,7 +22,6 @@ "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Nie można odszyfrować tego pliku, prawdopodobnie jest to plik udostępniony. Poproś właściciela pliku o ponowne udostępnianie pliku Tobie.", "Unknown error. Please check your system settings or contact your administrator" : "Nieznany błąd. Proszę sprawdzić ustawienia systemowe lub skontaktować się z administratorem", "Missing requirements." : "Brak wymagań.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Proszę upewnić się, że PHP 5.3.3 lub nowszy jest zainstalowany i że OpenSSL oraz rozszerzenie PHP jest włączone i poprawnie skonfigurowane. Obecnie szyfrowanie aplikacji zostało wyłączone.", "Following users are not set up for encryption:" : "Następujący użytkownicy nie mają skonfigurowanego szyfrowania:", "Initial encryption started... This can take some time. Please wait." : "Rozpoczęto szyfrowanie... To może chwilę potrwać. Proszę czekać.", "Initial encryption running... Please try again later." : "Trwa szyfrowanie początkowe...Spróbuj ponownie.", diff --git a/apps/files_encryption/l10n/pt_BR.js b/apps/files_encryption/l10n/pt_BR.js index 3849876d602..2bcf3bc345b 100644 --- a/apps/files_encryption/l10n/pt_BR.js +++ b/apps/files_encryption/l10n/pt_BR.js @@ -13,8 +13,10 @@ OC.L10N.register( "Please repeat the new recovery password" : "Por favor, repita a nova senha de recuperação", "Password successfully changed." : "Senha alterada com sucesso.", "Could not change the password. Maybe the old password was not correct." : "Não foi possível alterar a senha. Talvez a senha antiga não estava correta.", + "Could not update the private key password." : "Não foi possível atualizar a senha da chave privada.", + "The old password was not correct, please try again." : "A senha antiga não estava correta, por favor, tente novamente.", + "The current log-in password was not correct, please try again." : "A senha atual do log-in não estava correta, por favor, tente novamente.", "Private key password successfully updated." : "Senha de chave privada atualizada com sucesso.", - "Could not update the private key password. Maybe the old password was not correct." : "Não foi possível atualizar a senha de chave privada. Talvez a senha antiga esteja incorreta.", "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", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Aplicativo de criptografia não foi inicializado! Talvez o aplicativo de criptografia tenha sido reativado durante essa sessão. Por favor, tente fazer logoff e login novamente para inicializar o aplicativo de criptografia.", @@ -22,7 +24,7 @@ OC.L10N.register( "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Este arquivo não pode ser decriptado, provavelmente este é um arquivo compartilhado. Poe favoe peça ao dono do arquivo para compartilha-lo com você.", "Unknown error. Please check your system settings or contact your administrator" : "Erro desconhecido. Por favor, verifique as configurações do sistema ou entre em contato com o administrador", "Missing requirements." : "Requisitos não encontrados.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Por favor, certifique-se que o PHP 5.3.3 ou mais recente está instalado e que a extensão PHP OpenSSL está habilitado e configurado corretamente. Por enquanto, o aplicativo de criptografia foi desativado.", + "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Por favor, certifique-se de que o OpenSSL em conjunto com a extensão PHP está habilitado e configurado corretamente. Por enquanto, o aplicativo de criptografia foi desativado.", "Following users are not set up for encryption:" : "Seguintes usuários não estão configurados para criptografia:", "Initial encryption started... This can take some time. Please wait." : "Criptografia inicial inicializada... Isto pode tomar algum tempo. Por favor espere.", "Initial encryption running... Please try again later." : "Criptografia inicial em execução ... Por favor, tente novamente mais tarde.", diff --git a/apps/files_encryption/l10n/pt_BR.json b/apps/files_encryption/l10n/pt_BR.json index 6627951f8f0..d078c218ad3 100644 --- a/apps/files_encryption/l10n/pt_BR.json +++ b/apps/files_encryption/l10n/pt_BR.json @@ -11,8 +11,10 @@ "Please repeat the new recovery password" : "Por favor, repita a nova senha de recuperação", "Password successfully changed." : "Senha alterada com sucesso.", "Could not change the password. Maybe the old password was not correct." : "Não foi possível alterar a senha. Talvez a senha antiga não estava correta.", + "Could not update the private key password." : "Não foi possível atualizar a senha da chave privada.", + "The old password was not correct, please try again." : "A senha antiga não estava correta, por favor, tente novamente.", + "The current log-in password was not correct, please try again." : "A senha atual do log-in não estava correta, por favor, tente novamente.", "Private key password successfully updated." : "Senha de chave privada atualizada com sucesso.", - "Could not update the private key password. Maybe the old password was not correct." : "Não foi possível atualizar a senha de chave privada. Talvez a senha antiga esteja incorreta.", "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", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Aplicativo de criptografia não foi inicializado! Talvez o aplicativo de criptografia tenha sido reativado durante essa sessão. Por favor, tente fazer logoff e login novamente para inicializar o aplicativo de criptografia.", @@ -20,7 +22,7 @@ "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Este arquivo não pode ser decriptado, provavelmente este é um arquivo compartilhado. Poe favoe peça ao dono do arquivo para compartilha-lo com você.", "Unknown error. Please check your system settings or contact your administrator" : "Erro desconhecido. Por favor, verifique as configurações do sistema ou entre em contato com o administrador", "Missing requirements." : "Requisitos não encontrados.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Por favor, certifique-se que o PHP 5.3.3 ou mais recente está instalado e que a extensão PHP OpenSSL está habilitado e configurado corretamente. Por enquanto, o aplicativo de criptografia foi desativado.", + "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Por favor, certifique-se de que o OpenSSL em conjunto com a extensão PHP está habilitado e configurado corretamente. Por enquanto, o aplicativo de criptografia foi desativado.", "Following users are not set up for encryption:" : "Seguintes usuários não estão configurados para criptografia:", "Initial encryption started... This can take some time. Please wait." : "Criptografia inicial inicializada... Isto pode tomar algum tempo. Por favor espere.", "Initial encryption running... Please try again later." : "Criptografia inicial em execução ... Por favor, tente novamente mais tarde.", diff --git a/apps/files_encryption/l10n/pt_PT.js b/apps/files_encryption/l10n/pt_PT.js index 3f785d9d29e..b08e0c4b05c 100644 --- a/apps/files_encryption/l10n/pt_PT.js +++ b/apps/files_encryption/l10n/pt_PT.js @@ -1,9 +1,9 @@ OC.L10N.register( "files_encryption", { - "Unknown error" : "Erro Desconhecido", - "Missing recovery key password" : "Palavra-passe de recuperação em falta", - "Please repeat the recovery key password" : "Repita a palavra-passe de recuperação", + "Unknown error" : "Erro desconhecido", + "Missing recovery key password" : "Senha da chave de recuperação em falta", + "Please repeat the recovery key password" : "Por favor, insira a contrassenha da chave de recuperação", "Repeated recovery key password does not match the provided recovery key password" : "A palavra-passe de recuperação repetida não corresponde à palavra-passe fornecida", "Recovery key successfully enabled" : "A chave de recuperação foi ativada com sucesso", "Could not disable recovery key. Please check your recovery key password!" : "Não foi possível desativar a chave de recuperação. Por favor, verifique a senha da chave de recuperação.", @@ -13,8 +13,10 @@ OC.L10N.register( "Please repeat the new recovery password" : "Escreva de novo a nova palavra-passe de recuperação", "Password successfully changed." : "Senha alterada com sucesso.", "Could not change the password. Maybe the old password was not correct." : "Não foi possível alterar a senha. Possivelmente a senha antiga não está correta.", + "Could not update the private key password." : "Não foi possível atualizar a senha da chave privada.", + "The old password was not correct, please try again." : "A senha antiga não estava correta, por favor, tente de novo.", + "The current log-in password was not correct, please try again." : "A senha de iniciar a sessão atual não estava correta, por favor, tente de novo.", "Private key password successfully updated." : "A senha da chave privada foi atualizada com sucesso. ", - "Could not update the private key password. Maybe the old password was not correct." : "Não foi possível atualizar a senha da chave privada. A senha antiga poderia não estar correta.", "File recovery settings updated" : "As definições da recuperação de ficheiro foram atualizadas", "Could not update file recovery" : "Não foi possível atualizar a recuperação de ficheiro", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "A app de encriptação não foi inicializada! A app de encriptação poderá ter sido reativada durante a sua sessão. Por favor, tente terminar a sessão e iniciá-la de seguida para inicializar a app de encriptação.", @@ -22,7 +24,6 @@ OC.L10N.register( "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Não é possível desencriptar este ficheiro, provavelmente é um ficheiro partilhado. Por favor, peça ao proprietário do ficheiro para voltar a partilhar o ficheiro consigo.", "Unknown error. Please check your system settings or contact your administrator" : "Erro desconhecido. Por favor, verifique as configurações do sistema ou entre em contacto com o seu administrador ", "Missing requirements." : "Requisitos em falta.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Por favor, certifique-se que o PHP 5.3.3 ou superior está instalado e que o OpenSSL juntamente com a extensão PHP estão ativados e devidamente configurados. Por agora, a app de encriptação foi desativada.", "Following users are not set up for encryption:" : "Os utilizadores seguintes não estão configurados para encriptação:", "Initial encryption started... This can take some time. Please wait." : "A encriptação inicial foi iniciada ... Esta pode demorar algum tempo. Aguarde, por favor.", "Initial encryption running... Please try again later." : "A encriptação inicial está em execução ... Por favor, tente de novo mais tarde.", diff --git a/apps/files_encryption/l10n/pt_PT.json b/apps/files_encryption/l10n/pt_PT.json index 40af81afcb4..b51554eaae3 100644 --- a/apps/files_encryption/l10n/pt_PT.json +++ b/apps/files_encryption/l10n/pt_PT.json @@ -1,7 +1,7 @@ { "translations": { - "Unknown error" : "Erro Desconhecido", - "Missing recovery key password" : "Palavra-passe de recuperação em falta", - "Please repeat the recovery key password" : "Repita a palavra-passe de recuperação", + "Unknown error" : "Erro desconhecido", + "Missing recovery key password" : "Senha da chave de recuperação em falta", + "Please repeat the recovery key password" : "Por favor, insira a contrassenha da chave de recuperação", "Repeated recovery key password does not match the provided recovery key password" : "A palavra-passe de recuperação repetida não corresponde à palavra-passe fornecida", "Recovery key successfully enabled" : "A chave de recuperação foi ativada com sucesso", "Could not disable recovery key. Please check your recovery key password!" : "Não foi possível desativar a chave de recuperação. Por favor, verifique a senha da chave de recuperação.", @@ -11,8 +11,10 @@ "Please repeat the new recovery password" : "Escreva de novo a nova palavra-passe de recuperação", "Password successfully changed." : "Senha alterada com sucesso.", "Could not change the password. Maybe the old password was not correct." : "Não foi possível alterar a senha. Possivelmente a senha antiga não está correta.", + "Could not update the private key password." : "Não foi possível atualizar a senha da chave privada.", + "The old password was not correct, please try again." : "A senha antiga não estava correta, por favor, tente de novo.", + "The current log-in password was not correct, please try again." : "A senha de iniciar a sessão atual não estava correta, por favor, tente de novo.", "Private key password successfully updated." : "A senha da chave privada foi atualizada com sucesso. ", - "Could not update the private key password. Maybe the old password was not correct." : "Não foi possível atualizar a senha da chave privada. A senha antiga poderia não estar correta.", "File recovery settings updated" : "As definições da recuperação de ficheiro foram atualizadas", "Could not update file recovery" : "Não foi possível atualizar a recuperação de ficheiro", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "A app de encriptação não foi inicializada! A app de encriptação poderá ter sido reativada durante a sua sessão. Por favor, tente terminar a sessão e iniciá-la de seguida para inicializar a app de encriptação.", @@ -20,7 +22,6 @@ "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Não é possível desencriptar este ficheiro, provavelmente é um ficheiro partilhado. Por favor, peça ao proprietário do ficheiro para voltar a partilhar o ficheiro consigo.", "Unknown error. Please check your system settings or contact your administrator" : "Erro desconhecido. Por favor, verifique as configurações do sistema ou entre em contacto com o seu administrador ", "Missing requirements." : "Requisitos em falta.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Por favor, certifique-se que o PHP 5.3.3 ou superior está instalado e que o OpenSSL juntamente com a extensão PHP estão ativados e devidamente configurados. Por agora, a app de encriptação foi desativada.", "Following users are not set up for encryption:" : "Os utilizadores seguintes não estão configurados para encriptação:", "Initial encryption started... This can take some time. Please wait." : "A encriptação inicial foi iniciada ... Esta pode demorar algum tempo. Aguarde, por favor.", "Initial encryption running... Please try again later." : "A encriptação inicial está em execução ... Por favor, tente de novo mais tarde.", diff --git a/apps/files_encryption/l10n/ro.js b/apps/files_encryption/l10n/ro.js index 822cc4be58d..91f657d18f0 100644 --- a/apps/files_encryption/l10n/ro.js +++ b/apps/files_encryption/l10n/ro.js @@ -8,7 +8,6 @@ OC.L10N.register( "Password successfully changed." : "Parola a fost modificată cu succes.", "Could not change the password. Maybe the old password was not correct." : "Parola nu a putut fi schimbata. Poate ca parola veche este incorecta.", "Private key password successfully updated." : "Cheia privata a fost actualizata cu succes", - "Could not update the private key password. Maybe the old password was not correct." : "Nu am putut actualiza parola pentru cheia privata. Poate ca parola veche este incorecta.", "File recovery settings updated" : "Setarile pentru recuperarea fisierelor au fost actualizate", "Could not update file recovery" : "Nu am putut actualiza recuperarea de fisiere", "Encryption" : "Încriptare", diff --git a/apps/files_encryption/l10n/ro.json b/apps/files_encryption/l10n/ro.json index 3ac528a60ce..3c32f040aec 100644 --- a/apps/files_encryption/l10n/ro.json +++ b/apps/files_encryption/l10n/ro.json @@ -6,7 +6,6 @@ "Password successfully changed." : "Parola a fost modificată cu succes.", "Could not change the password. Maybe the old password was not correct." : "Parola nu a putut fi schimbata. Poate ca parola veche este incorecta.", "Private key password successfully updated." : "Cheia privata a fost actualizata cu succes", - "Could not update the private key password. Maybe the old password was not correct." : "Nu am putut actualiza parola pentru cheia privata. Poate ca parola veche este incorecta.", "File recovery settings updated" : "Setarile pentru recuperarea fisierelor au fost actualizate", "Could not update file recovery" : "Nu am putut actualiza recuperarea de fisiere", "Encryption" : "Încriptare", diff --git a/apps/files_encryption/l10n/ru.js b/apps/files_encryption/l10n/ru.js index 2d035d75f5e..055fea5cddd 100644 --- a/apps/files_encryption/l10n/ru.js +++ b/apps/files_encryption/l10n/ru.js @@ -3,48 +3,50 @@ OC.L10N.register( { "Unknown error" : "Неизвестная ошибка", "Missing recovery key password" : "Отсутствует пароль восстановления ключа", - "Please repeat the recovery key password" : "Пожалуйста, повторите пароль восстановления ключа", - "Repeated recovery key password does not match the provided recovery key password" : "Пароль восстановления ключа и его повтор не совпадают", + "Please repeat the recovery key password" : "Повторите ввод пароля ключа восстановления", + "Repeated recovery key password does not match the provided recovery key password" : "Пароль ключа восстановления и повтор пароля не совпадают", "Recovery key successfully enabled" : "Ключ восстановления успешно установлен", "Could not disable recovery key. Please check your recovery key password!" : "Невозможно выключить ключ восстановления. Проверьте правильность пароля от ключа!", "Recovery key successfully disabled" : "Ключ восстановления успешно отключен", - "Please provide the old recovery password" : "Пожалуйста, введите старый пароль для восстановления", - "Please provide a new recovery password" : "Пожалуйста, введите новый пароль для восстановления", - "Please repeat the new recovery password" : "Пожалуйста, повторите новый пароль для восстановления", - "Password successfully changed." : "Пароль изменен удачно.", - "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." : "Невозможно обновить пароль от секретного ключа. Возможно, старый пароль указан неверно.", - "File recovery settings updated" : "Настройки файла восстановления обновлены", - "Could not update file recovery" : "Невозможно обновить файл восстановления", - "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Приложение шифрации не инициализированно! Возможно приложение шифрации было реактивировано во время вашей сессии. Пожалуйста, попробуйте выйти и войти снова чтобы проинициализировать приложение шифрации.", - "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Ваш секретный ключ не действителен! Вероятно, ваш пароль был изменен вне %s (например, корпоративный каталог). Вы можете обновить секретный ключ в личных настройках на странице восстановления доступа к зашифрованным файлам. ", - "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Не могу расшифровать файл, возможно это опубликованный файл. Пожалуйста, попросите владельца файла поделиться им с вами еще раз.", - "Unknown error. Please check your system settings or contact your administrator" : "Неизвестная ошибка. Пожалуйста, проверьте системные настройки или свяжитесь с администратором", - "Missing requirements." : "Требования отсутствуют.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Пожалуйста, убедитесь, что версия PHP 5.3.3 или новее, а также, что OpenSSL и соответствующее расширение PHP включены и правильно настроены. На данный момент приложение шифрования отключено.", - "Following users are not set up for encryption:" : "Для следующих пользователей шифрование не настроено:", - "Initial encryption started... This can take some time. Please wait." : "Начато начальное шифрование... Это может занять какое-то время. Пожалуйста, подождите.", + "Please provide the old recovery password" : "Введите старый пароль восстановления", + "Please provide a new recovery password" : "Введите новый пароль восстановления", + "Please repeat the new recovery password" : "Повторите новый пароль восстановления", + "Password successfully changed." : "Пароль успешно изменен.", + "Could not change the password. Maybe the old password was not correct." : "Невозможно изменить пароль. Возможно, указанный старый пароль не верен.", + "Could not update the private key password." : "Невозможно обновить пароль закрытого ключа.", + "The old password was not correct, please try again." : "Указан неверный старый пароль, повторите попытку.", + "The current log-in password was not correct, please try again." : "Текущий пароль для учётной записи введён неверно, пожалуйста повторите попытку.", + "Private key password successfully updated." : "Пароль закрытого ключа успешно обновлён.", + "File recovery settings updated" : "Настройки восстановления файлов обновлены", + "Could not update file recovery" : "Невозможно обновить настройки восстановления файлов", + "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Приложение шифрования не инициализированно! Возможно приложение шифрования было реактивировано во время вашей сессии. Попробуйте выйти и войти снова чтобы проинициализировать приложение шифрования.", + "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Закрытый ключ недействителен! Вероятно, пароль был изменен вне %s (например, корпоративный каталог). Вы можете обновить закрытый ключ в личных настройках на странице восстановления доступа к зашифрованным файлам. ", + "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Не удалось расшифровать файл, возможно это опубликованный файл. Попросите владельца файла повторно открыть к нему доступ.", + "Unknown error. Please check your system settings or contact your administrator" : "Неизвестная ошибка. Проверьте системные настройки или свяжитесь с вашим администратором", + "Initial encryption started... This can take some time. Please wait." : "Запущено первоначальное шифрование... Это может занять некоторое время. Пожалуйста, подождите.", "Initial encryption running... Please try again later." : "Работает первоначальное шифрование... Пожалуйста, повторите попытку позже.", - "Go directly to your %spersonal settings%s." : "Перейти напряму к вашим %spersonal settings%s.", + "Missing requirements." : "Отсутствуют зависимости.", + "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Убедитесь, что OpenSSL и соответствующее расширение PHP включены и правильно настроены. На данный момент приложение шифрования выключено.", + "Following users are not set up for encryption:" : "Для следующих пользователей шифрование не настроено:", + "Go directly to your %spersonal settings%s." : "Перейти к вашим %spersonal settings%s.", "Encryption" : "Шифрование", - "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Приложение для шифрования активно, но ваши ключи не инициализированы, пожалуйста, перелогиньтесь", + "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Приложение шифрования активно, но ваши ключи не инициализированы, выйдите из системы и войдите вновь", "Enable recovery key (allow to recover users files in case of password loss):" : "Включить ключ восстановления (позволяет пользователям восстановить файлы при потере пароля):", - "Recovery key password" : "Пароль для ключа восстановления", - "Repeat Recovery key password" : "Повторите пароль восстановления ключа", + "Recovery key password" : "Пароль ключа восстановления", + "Repeat Recovery key password" : "Повторите пароль ключа восстановления", "Enabled" : "Включено", "Disabled" : "Отключено", - "Change recovery key password:" : "Сменить пароль для ключа восстановления:", - "Old Recovery key password" : "Старый пароль для ключа восстановления", - "New Recovery key password" : "Новый пароль для ключа восстановления", - "Repeat New Recovery key password" : "Повторите новый пароль восстановления ключа", + "Change recovery key password:" : "Сменить пароль ключа восстановления:", + "Old Recovery key password" : "Старый пароль ключа восстановления", + "New Recovery key password" : "Новый пароль ключа восстановления", + "Repeat New Recovery key password" : "Повторите новый пароль ключа восстановления", "Change Password" : "Изменить пароль", - "Your private key password no longer matches your log-in password." : "Пароль от Вашего закрытого ключа больше не соответствует паролю от вашей учетной записи.", - "Set your old private key password to your current log-in password:" : "Замените старый пароль от закрытого ключа на новый пароль входа.", + "Your private key password no longer matches your log-in password." : "Пароль закрытого ключа больше не соответствует паролю вашей учетной записи.", + "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" : "Обновить пароль от секретного ключа", + "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" : "Включение этой опции позволит вам получить доступ к своим зашифрованным файлам в случае утери пароля" }, diff --git a/apps/files_encryption/l10n/ru.json b/apps/files_encryption/l10n/ru.json index ce66622d6be..fd9fc6d49fd 100644 --- a/apps/files_encryption/l10n/ru.json +++ b/apps/files_encryption/l10n/ru.json @@ -1,48 +1,50 @@ { "translations": { "Unknown error" : "Неизвестная ошибка", "Missing recovery key password" : "Отсутствует пароль восстановления ключа", - "Please repeat the recovery key password" : "Пожалуйста, повторите пароль восстановления ключа", - "Repeated recovery key password does not match the provided recovery key password" : "Пароль восстановления ключа и его повтор не совпадают", + "Please repeat the recovery key password" : "Повторите ввод пароля ключа восстановления", + "Repeated recovery key password does not match the provided recovery key password" : "Пароль ключа восстановления и повтор пароля не совпадают", "Recovery key successfully enabled" : "Ключ восстановления успешно установлен", "Could not disable recovery key. Please check your recovery key password!" : "Невозможно выключить ключ восстановления. Проверьте правильность пароля от ключа!", "Recovery key successfully disabled" : "Ключ восстановления успешно отключен", - "Please provide the old recovery password" : "Пожалуйста, введите старый пароль для восстановления", - "Please provide a new recovery password" : "Пожалуйста, введите новый пароль для восстановления", - "Please repeat the new recovery password" : "Пожалуйста, повторите новый пароль для восстановления", - "Password successfully changed." : "Пароль изменен удачно.", - "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." : "Невозможно обновить пароль от секретного ключа. Возможно, старый пароль указан неверно.", - "File recovery settings updated" : "Настройки файла восстановления обновлены", - "Could not update file recovery" : "Невозможно обновить файл восстановления", - "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Приложение шифрации не инициализированно! Возможно приложение шифрации было реактивировано во время вашей сессии. Пожалуйста, попробуйте выйти и войти снова чтобы проинициализировать приложение шифрации.", - "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Ваш секретный ключ не действителен! Вероятно, ваш пароль был изменен вне %s (например, корпоративный каталог). Вы можете обновить секретный ключ в личных настройках на странице восстановления доступа к зашифрованным файлам. ", - "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Не могу расшифровать файл, возможно это опубликованный файл. Пожалуйста, попросите владельца файла поделиться им с вами еще раз.", - "Unknown error. Please check your system settings or contact your administrator" : "Неизвестная ошибка. Пожалуйста, проверьте системные настройки или свяжитесь с администратором", - "Missing requirements." : "Требования отсутствуют.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Пожалуйста, убедитесь, что версия PHP 5.3.3 или новее, а также, что OpenSSL и соответствующее расширение PHP включены и правильно настроены. На данный момент приложение шифрования отключено.", - "Following users are not set up for encryption:" : "Для следующих пользователей шифрование не настроено:", - "Initial encryption started... This can take some time. Please wait." : "Начато начальное шифрование... Это может занять какое-то время. Пожалуйста, подождите.", + "Please provide the old recovery password" : "Введите старый пароль восстановления", + "Please provide a new recovery password" : "Введите новый пароль восстановления", + "Please repeat the new recovery password" : "Повторите новый пароль восстановления", + "Password successfully changed." : "Пароль успешно изменен.", + "Could not change the password. Maybe the old password was not correct." : "Невозможно изменить пароль. Возможно, указанный старый пароль не верен.", + "Could not update the private key password." : "Невозможно обновить пароль закрытого ключа.", + "The old password was not correct, please try again." : "Указан неверный старый пароль, повторите попытку.", + "The current log-in password was not correct, please try again." : "Текущий пароль для учётной записи введён неверно, пожалуйста повторите попытку.", + "Private key password successfully updated." : "Пароль закрытого ключа успешно обновлён.", + "File recovery settings updated" : "Настройки восстановления файлов обновлены", + "Could not update file recovery" : "Невозможно обновить настройки восстановления файлов", + "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Приложение шифрования не инициализированно! Возможно приложение шифрования было реактивировано во время вашей сессии. Попробуйте выйти и войти снова чтобы проинициализировать приложение шифрования.", + "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Закрытый ключ недействителен! Вероятно, пароль был изменен вне %s (например, корпоративный каталог). Вы можете обновить закрытый ключ в личных настройках на странице восстановления доступа к зашифрованным файлам. ", + "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Не удалось расшифровать файл, возможно это опубликованный файл. Попросите владельца файла повторно открыть к нему доступ.", + "Unknown error. Please check your system settings or contact your administrator" : "Неизвестная ошибка. Проверьте системные настройки или свяжитесь с вашим администратором", + "Initial encryption started... This can take some time. Please wait." : "Запущено первоначальное шифрование... Это может занять некоторое время. Пожалуйста, подождите.", "Initial encryption running... Please try again later." : "Работает первоначальное шифрование... Пожалуйста, повторите попытку позже.", - "Go directly to your %spersonal settings%s." : "Перейти напряму к вашим %spersonal settings%s.", + "Missing requirements." : "Отсутствуют зависимости.", + "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Убедитесь, что OpenSSL и соответствующее расширение PHP включены и правильно настроены. На данный момент приложение шифрования выключено.", + "Following users are not set up for encryption:" : "Для следующих пользователей шифрование не настроено:", + "Go directly to your %spersonal settings%s." : "Перейти к вашим %spersonal settings%s.", "Encryption" : "Шифрование", - "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Приложение для шифрования активно, но ваши ключи не инициализированы, пожалуйста, перелогиньтесь", + "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Приложение шифрования активно, но ваши ключи не инициализированы, выйдите из системы и войдите вновь", "Enable recovery key (allow to recover users files in case of password loss):" : "Включить ключ восстановления (позволяет пользователям восстановить файлы при потере пароля):", - "Recovery key password" : "Пароль для ключа восстановления", - "Repeat Recovery key password" : "Повторите пароль восстановления ключа", + "Recovery key password" : "Пароль ключа восстановления", + "Repeat Recovery key password" : "Повторите пароль ключа восстановления", "Enabled" : "Включено", "Disabled" : "Отключено", - "Change recovery key password:" : "Сменить пароль для ключа восстановления:", - "Old Recovery key password" : "Старый пароль для ключа восстановления", - "New Recovery key password" : "Новый пароль для ключа восстановления", - "Repeat New Recovery key password" : "Повторите новый пароль восстановления ключа", + "Change recovery key password:" : "Сменить пароль ключа восстановления:", + "Old Recovery key password" : "Старый пароль ключа восстановления", + "New Recovery key password" : "Новый пароль ключа восстановления", + "Repeat New Recovery key password" : "Повторите новый пароль ключа восстановления", "Change Password" : "Изменить пароль", - "Your private key password no longer matches your log-in password." : "Пароль от Вашего закрытого ключа больше не соответствует паролю от вашей учетной записи.", - "Set your old private key password to your current log-in password:" : "Замените старый пароль от закрытого ключа на новый пароль входа.", + "Your private key password no longer matches your log-in password." : "Пароль закрытого ключа больше не соответствует паролю вашей учетной записи.", + "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" : "Обновить пароль от секретного ключа", + "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" : "Включение этой опции позволит вам получить доступ к своим зашифрованным файлам в случае утери пароля" },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" diff --git a/apps/files_encryption/l10n/sk_SK.js b/apps/files_encryption/l10n/sk_SK.js index ac61753f09d..ae089f31370 100644 --- a/apps/files_encryption/l10n/sk_SK.js +++ b/apps/files_encryption/l10n/sk_SK.js @@ -7,19 +7,18 @@ OC.L10N.register( "Recovery key successfully disabled" : "Záchranný kľúč bol úspešne zakázaný", "Password successfully changed." : "Heslo úspešne zmenené.", "Could not change the password. Maybe the old password was not correct." : "Nemožno zmeniť heslo. Pravdepodobne nebolo staré heslo zadané správne.", + "The current log-in password was not correct, please try again." : "Toto heslo nebolo správne, prosím skúste to ešte raz.", "Private key password successfully updated." : "Heslo súkromného kľúča je úspešne aktualizované.", - "Could not update the private key password. Maybe the old password was not correct." : "Nemožno aktualizovať heslo súkromného kľúča. Možno nebolo staré heslo správne.", "File recovery settings updated" : "Nastavenie obnovy súborov aktualizované", "Could not update file recovery" : "Nemožno aktualizovať obnovenie súborov", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Šifrovacia aplikácia nie je inicializovaná. Je možné, že aplikácia bola znova aktivovaná počas vášho prihlasovania. Pokúste sa odhlásiť a znova prihlásiť pre inicializáciu šifrovania.", "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Váš súkromný kľúč nie je platný! Možno bolo vaše heslo zmenené mimo %s (napr. firemný priečinok). Môžete si aktualizovať heslo svojho súkromného kľúča vo vašom osobnom nastavení, ak si chcete obnoviť prístup k šifrovaným súborom.", "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Tento súbor sa nepodarilo dešifrovať, pravdepodobne je zdieľaný. Požiadajte majiteľa súboru, aby ho s vami znovu vyzdieľal.", "Unknown error. Please check your system settings or contact your administrator" : "Neznáma chyba. Skontrolujte si vaše systémové nastavenia alebo kontaktujte administrátora", - "Missing requirements." : "Chýbajúce požiadavky.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Prosím uistite sa, že PHP verzie 5.3.3 alebo novšej je nainštalované a tiež, že OpenSSL knižnica spolu z PHP rozšírením je povolená a konfigurovaná správne. Nateraz bola aplikácia šifrovania zablokovaná.", - "Following users are not set up for encryption:" : "Nasledujúci používatelia nie sú nastavení pre šifrovanie:", "Initial encryption started... This can take some time. Please wait." : "Počiatočné šifrovanie započalo ... To môže nejakú dobu trvať. Čakajte prosím.", "Initial encryption running... Please try again later." : "Počiatočné šifrovanie beží... Skúste to neskôr znovu.", + "Missing requirements." : "Chýbajúce požiadavky.", + "Following users are not set up for encryption:" : "Nasledujúci používatelia nie sú nastavení pre šifrovanie:", "Go directly to your %spersonal settings%s." : "Prejsť priamo do svojho %sosobného nastavenia%s.", "Encryption" : "Šifrovanie", "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Aplikácia na šifrovanie je zapnutá, ale vaše kľúče nie sú inicializované. Odhláste sa a znovu sa prihláste.", diff --git a/apps/files_encryption/l10n/sk_SK.json b/apps/files_encryption/l10n/sk_SK.json index e1887527634..b54f4da7ee3 100644 --- a/apps/files_encryption/l10n/sk_SK.json +++ b/apps/files_encryption/l10n/sk_SK.json @@ -5,19 +5,18 @@ "Recovery key successfully disabled" : "Záchranný kľúč bol úspešne zakázaný", "Password successfully changed." : "Heslo úspešne zmenené.", "Could not change the password. Maybe the old password was not correct." : "Nemožno zmeniť heslo. Pravdepodobne nebolo staré heslo zadané správne.", + "The current log-in password was not correct, please try again." : "Toto heslo nebolo správne, prosím skúste to ešte raz.", "Private key password successfully updated." : "Heslo súkromného kľúča je úspešne aktualizované.", - "Could not update the private key password. Maybe the old password was not correct." : "Nemožno aktualizovať heslo súkromného kľúča. Možno nebolo staré heslo správne.", "File recovery settings updated" : "Nastavenie obnovy súborov aktualizované", "Could not update file recovery" : "Nemožno aktualizovať obnovenie súborov", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Šifrovacia aplikácia nie je inicializovaná. Je možné, že aplikácia bola znova aktivovaná počas vášho prihlasovania. Pokúste sa odhlásiť a znova prihlásiť pre inicializáciu šifrovania.", "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Váš súkromný kľúč nie je platný! Možno bolo vaše heslo zmenené mimo %s (napr. firemný priečinok). Môžete si aktualizovať heslo svojho súkromného kľúča vo vašom osobnom nastavení, ak si chcete obnoviť prístup k šifrovaným súborom.", "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Tento súbor sa nepodarilo dešifrovať, pravdepodobne je zdieľaný. Požiadajte majiteľa súboru, aby ho s vami znovu vyzdieľal.", "Unknown error. Please check your system settings or contact your administrator" : "Neznáma chyba. Skontrolujte si vaše systémové nastavenia alebo kontaktujte administrátora", - "Missing requirements." : "Chýbajúce požiadavky.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Prosím uistite sa, že PHP verzie 5.3.3 alebo novšej je nainštalované a tiež, že OpenSSL knižnica spolu z PHP rozšírením je povolená a konfigurovaná správne. Nateraz bola aplikácia šifrovania zablokovaná.", - "Following users are not set up for encryption:" : "Nasledujúci používatelia nie sú nastavení pre šifrovanie:", "Initial encryption started... This can take some time. Please wait." : "Počiatočné šifrovanie započalo ... To môže nejakú dobu trvať. Čakajte prosím.", "Initial encryption running... Please try again later." : "Počiatočné šifrovanie beží... Skúste to neskôr znovu.", + "Missing requirements." : "Chýbajúce požiadavky.", + "Following users are not set up for encryption:" : "Nasledujúci používatelia nie sú nastavení pre šifrovanie:", "Go directly to your %spersonal settings%s." : "Prejsť priamo do svojho %sosobného nastavenia%s.", "Encryption" : "Šifrovanie", "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Aplikácia na šifrovanie je zapnutá, ale vaše kľúče nie sú inicializované. Odhláste sa a znovu sa prihláste.", diff --git a/apps/files_encryption/l10n/sl.js b/apps/files_encryption/l10n/sl.js index f0623de697f..678709ab891 100644 --- a/apps/files_encryption/l10n/sl.js +++ b/apps/files_encryption/l10n/sl.js @@ -13,8 +13,10 @@ OC.L10N.register( "Please repeat the new recovery password" : "Ponovno vpišite nov ključ za obnovitev", "Password successfully changed." : "Geslo je uspešno spremenjeno.", "Could not change the password. Maybe the old password was not correct." : "Gesla ni mogoče spremeniti. Morda vnos starega gesla ni pravilen.", + "Could not update the private key password." : "Ni mogoče posodobiti gesla zasebnega ključa.", + "The old password was not correct, please try again." : "Staro geslo ni vpisana pravilno. Poskusite znova.", + "The current log-in password was not correct, please try again." : "Trenutno geslo za prijavo ni vpisano pravilno. Poskusite znova.", "Private key password successfully updated." : "Zasebni ključ za geslo je uspešno posodobljen.", - "Could not update the private key password. Maybe the old password was not correct." : "Zasebnega ključa za geslo ni mogoče posodobiti. Morda vnos starega gesla ni bil pravilen.", "File recovery settings updated" : "Nastavitve obnavljanja dokumentov so posodobljene", "Could not update file recovery" : "Nastavitev za obnavljanje dokumentov ni mogoče posodobiti", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Program za šifriranje ni začet. Morda je bil program ponovno omogočen šele med zagonom trenutne seje. Odjavite se in se nato prijavite nazaj. S tem morda razrešite napako.", @@ -22,7 +24,7 @@ OC.L10N.register( "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Te datoteke ni mogoče šifrirati, ker je to najverjetneje datoteka v souporabi. Prosite lastnika datoteke, da jo da ponovno v souporabo.", "Unknown error. Please check your system settings or contact your administrator" : "Neznana napaka. Preverite nastavitve sistema ali pa stopite v stik s skrbnikom sistema.", "Missing requirements." : "Manjkajoče zahteve", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Preverite, ali je na strežniku nameščen paket PHP 5.3.3 ali novejši, da je omogočen in pravilno nastavljen PHP OpenSSL. Z obstoječimi možnostmi šifriranje ni mogoče.", + "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Preverite, ali je OpenSSL z ustrezno razširitvijo PHP omogočen in ustrezno nastavljen. Trenutno je šifriranje onemogočeno.", "Following users are not set up for encryption:" : "Navedeni uporabniki še nimajo nastavljenega šifriranja:", "Initial encryption started... This can take some time. Please wait." : "Začetno šifriranje je začeto ... Opravilo je lahko dolgotrajno.", "Initial encryption running... Please try again later." : "Začetno šifriranje je v teku ... Poskusite kasneje.", diff --git a/apps/files_encryption/l10n/sl.json b/apps/files_encryption/l10n/sl.json index 4a692bfebae..943fe8a96c1 100644 --- a/apps/files_encryption/l10n/sl.json +++ b/apps/files_encryption/l10n/sl.json @@ -11,8 +11,10 @@ "Please repeat the new recovery password" : "Ponovno vpišite nov ključ za obnovitev", "Password successfully changed." : "Geslo je uspešno spremenjeno.", "Could not change the password. Maybe the old password was not correct." : "Gesla ni mogoče spremeniti. Morda vnos starega gesla ni pravilen.", + "Could not update the private key password." : "Ni mogoče posodobiti gesla zasebnega ključa.", + "The old password was not correct, please try again." : "Staro geslo ni vpisana pravilno. Poskusite znova.", + "The current log-in password was not correct, please try again." : "Trenutno geslo za prijavo ni vpisano pravilno. Poskusite znova.", "Private key password successfully updated." : "Zasebni ključ za geslo je uspešno posodobljen.", - "Could not update the private key password. Maybe the old password was not correct." : "Zasebnega ključa za geslo ni mogoče posodobiti. Morda vnos starega gesla ni bil pravilen.", "File recovery settings updated" : "Nastavitve obnavljanja dokumentov so posodobljene", "Could not update file recovery" : "Nastavitev za obnavljanje dokumentov ni mogoče posodobiti", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Program za šifriranje ni začet. Morda je bil program ponovno omogočen šele med zagonom trenutne seje. Odjavite se in se nato prijavite nazaj. S tem morda razrešite napako.", @@ -20,7 +22,7 @@ "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Te datoteke ni mogoče šifrirati, ker je to najverjetneje datoteka v souporabi. Prosite lastnika datoteke, da jo da ponovno v souporabo.", "Unknown error. Please check your system settings or contact your administrator" : "Neznana napaka. Preverite nastavitve sistema ali pa stopite v stik s skrbnikom sistema.", "Missing requirements." : "Manjkajoče zahteve", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Preverite, ali je na strežniku nameščen paket PHP 5.3.3 ali novejši, da je omogočen in pravilno nastavljen PHP OpenSSL. Z obstoječimi možnostmi šifriranje ni mogoče.", + "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Preverite, ali je OpenSSL z ustrezno razširitvijo PHP omogočen in ustrezno nastavljen. Trenutno je šifriranje onemogočeno.", "Following users are not set up for encryption:" : "Navedeni uporabniki še nimajo nastavljenega šifriranja:", "Initial encryption started... This can take some time. Please wait." : "Začetno šifriranje je začeto ... Opravilo je lahko dolgotrajno.", "Initial encryption running... Please try again later." : "Začetno šifriranje je v teku ... Poskusite kasneje.", diff --git a/apps/files_encryption/l10n/sq.js b/apps/files_encryption/l10n/sq.js index f3c5d10cf0a..ffab720cfda 100644 --- a/apps/files_encryption/l10n/sq.js +++ b/apps/files_encryption/l10n/sq.js @@ -2,6 +2,7 @@ OC.L10N.register( "files_encryption", { "Unknown error" : "Gabim panjohur", - "Encryption" : "Kodifikimi" + "Encryption" : "Kodifikimi", + "Enabled" : "Aktivizuar" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files_encryption/l10n/sq.json b/apps/files_encryption/l10n/sq.json index b4fe571e7e0..dee4c42e547 100644 --- a/apps/files_encryption/l10n/sq.json +++ b/apps/files_encryption/l10n/sq.json @@ -1,5 +1,6 @@ { "translations": { "Unknown error" : "Gabim panjohur", - "Encryption" : "Kodifikimi" + "Encryption" : "Kodifikimi", + "Enabled" : "Aktivizuar" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files_encryption/l10n/sv.js b/apps/files_encryption/l10n/sv.js index f8ef7040926..eeaebb59e53 100644 --- a/apps/files_encryption/l10n/sv.js +++ b/apps/files_encryption/l10n/sv.js @@ -2,24 +2,32 @@ OC.L10N.register( "files_encryption", { "Unknown error" : "Okänt fel", + "Missing recovery key password" : "Saknar lösenord för återställningsnyckel", + "Please repeat the recovery key password" : "Vänligen upprepa lösenordet för återställningsnyckel", + "Repeated recovery key password does not match the provided recovery key password" : "Det upprepade lösenordet för återställningsnyckeln matchar inte tillhandahållna lösenordet för återställningsnyckeln", "Recovery key successfully enabled" : "Återställningsnyckeln har framgångsrikt aktiverats", "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!", "Recovery key successfully disabled" : "Återställningsnyckeln har framgångsrikt inaktiverats", + "Please provide the old recovery password" : "Vänligen tillhandahåll det gamla återställningslösenordet ", + "Please provide a new recovery password" : "Vänligen tillhandahåll ett nytt återställningslösenord", + "Please repeat the new recovery password" : "Vänligen upprepa det nya återställningslösenordet", "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 update the private key password." : "Kunde inte uppdatera lösenord för den privata nyckeln", + "The old password was not correct, please try again." : "Det gamla lösenordet var inte korrekt. Vänligen försök igen.", + "The current log-in password was not correct, please try again." : "Det nuvarande inloggningslösenordet var inte korrekt. Vänligen försök igen.", "Private key password successfully updated." : "Den privata nyckelns lösenord uppdaterades utan problem.", - "Could not update the private key password. Maybe the old password was not correct." : "Kunde inte uppdatera lösenordet för den privata nyckeln. Kanske var det gamla lösenordet fel.", "File recovery settings updated" : "Inställningarna för filåterställning har uppdaterats", "Could not update file recovery" : "Kunde inte uppdatera filåterställning", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Krypteringsprogrammet kunde inte initieras! Möjligen blev krypteringsprogrammet återaktiverad under din session. Försök med att logga ut och in igen för att initiera krypteringsprogrammet.", "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Din privata lösenordsnyckel är inte giltig! Troligen har ditt lösenord ändrats utanför %s (t.ex. i företagets katalogtjänst). Du kan uppdatera den privata lösenordsnyckeln under dina personliga inställningar för att återfå tillgång till dina filer.", "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Kan ej dekryptera denna fil, förmodligen är det en delad fil. Be ägaren av filen att dela den med dig.", "Unknown error. Please check your system settings or contact your administrator" : "Okänt fel. Kontrollera dina systeminställningar eller kontakta din administratör", - "Missing requirements." : "Krav som saknas", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Kontrollera att PHP 5.3.3 eller senare är installerad och att tillägget OpenSSL PHP är aktiverad och korrekt konfigurerad. Kryptering är tillsvidare inaktiverad.", - "Following users are not set up for encryption:" : "Följande användare har inte aktiverat kryptering:", "Initial encryption started... This can take some time. Please wait." : "Initiala krypteringen har påbörjats... Detta kan ta lite tid. Var god vänta.", "Initial encryption running... Please try again later." : "Initiala krypteringen körs... Var god försök igen senare.", + "Missing requirements." : "Krav som saknas", + "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Se till att OpenSSL tillsammans med PHP-tillägget är aktiverat och korrekt konfigurerat. För nu har krypteringsappen inaktiverats.", + "Following users are not set up for encryption:" : "Följande användare har inte aktiverat kryptering:", "Go directly to your %spersonal settings%s." : "Gå direkt till dina %segna inställningar%s.", "Encryption" : "Kryptering", "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Krypteringsprogrammet är aktiverat men dina nycklar är inte initierade. Vänligen logga ut och in igen", @@ -33,6 +41,8 @@ OC.L10N.register( "New Recovery key password" : "Nytt lösenord för återställningsnyckel", "Repeat New Recovery key password" : "Upprepa lösenord för ny återställningsnyckel", "Change Password" : "Byt lösenord", + "Your private key password no longer matches your log-in password." : "Ditt lösenord för din privata nyckel matchar inte längre ditt inloggningslösenord.", + "Set your old private key password to your current log-in password:" : "Sätt ditt gamla privatnyckellösenord 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", diff --git a/apps/files_encryption/l10n/sv.json b/apps/files_encryption/l10n/sv.json index f94da503843..9b5ac1dc8ac 100644 --- a/apps/files_encryption/l10n/sv.json +++ b/apps/files_encryption/l10n/sv.json @@ -1,23 +1,31 @@ { "translations": { "Unknown error" : "Okänt fel", + "Missing recovery key password" : "Saknar lösenord för återställningsnyckel", + "Please repeat the recovery key password" : "Vänligen upprepa lösenordet för återställningsnyckel", + "Repeated recovery key password does not match the provided recovery key password" : "Det upprepade lösenordet för återställningsnyckeln matchar inte tillhandahållna lösenordet för återställningsnyckeln", "Recovery key successfully enabled" : "Återställningsnyckeln har framgångsrikt aktiverats", "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!", "Recovery key successfully disabled" : "Återställningsnyckeln har framgångsrikt inaktiverats", + "Please provide the old recovery password" : "Vänligen tillhandahåll det gamla återställningslösenordet ", + "Please provide a new recovery password" : "Vänligen tillhandahåll ett nytt återställningslösenord", + "Please repeat the new recovery password" : "Vänligen upprepa det nya återställningslösenordet", "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 update the private key password." : "Kunde inte uppdatera lösenord för den privata nyckeln", + "The old password was not correct, please try again." : "Det gamla lösenordet var inte korrekt. Vänligen försök igen.", + "The current log-in password was not correct, please try again." : "Det nuvarande inloggningslösenordet var inte korrekt. Vänligen försök igen.", "Private key password successfully updated." : "Den privata nyckelns lösenord uppdaterades utan problem.", - "Could not update the private key password. Maybe the old password was not correct." : "Kunde inte uppdatera lösenordet för den privata nyckeln. Kanske var det gamla lösenordet fel.", "File recovery settings updated" : "Inställningarna för filåterställning har uppdaterats", "Could not update file recovery" : "Kunde inte uppdatera filåterställning", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Krypteringsprogrammet kunde inte initieras! Möjligen blev krypteringsprogrammet återaktiverad under din session. Försök med att logga ut och in igen för att initiera krypteringsprogrammet.", "Your private key is not valid! Likely your password was changed outside of %s (e.g. your corporate directory). You can update your private key password in your personal settings to recover access to your encrypted files." : "Din privata lösenordsnyckel är inte giltig! Troligen har ditt lösenord ändrats utanför %s (t.ex. i företagets katalogtjänst). Du kan uppdatera den privata lösenordsnyckeln under dina personliga inställningar för att återfå tillgång till dina filer.", "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Kan ej dekryptera denna fil, förmodligen är det en delad fil. Be ägaren av filen att dela den med dig.", "Unknown error. Please check your system settings or contact your administrator" : "Okänt fel. Kontrollera dina systeminställningar eller kontakta din administratör", - "Missing requirements." : "Krav som saknas", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Kontrollera att PHP 5.3.3 eller senare är installerad och att tillägget OpenSSL PHP är aktiverad och korrekt konfigurerad. Kryptering är tillsvidare inaktiverad.", - "Following users are not set up for encryption:" : "Följande användare har inte aktiverat kryptering:", "Initial encryption started... This can take some time. Please wait." : "Initiala krypteringen har påbörjats... Detta kan ta lite tid. Var god vänta.", "Initial encryption running... Please try again later." : "Initiala krypteringen körs... Var god försök igen senare.", + "Missing requirements." : "Krav som saknas", + "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Se till att OpenSSL tillsammans med PHP-tillägget är aktiverat och korrekt konfigurerat. För nu har krypteringsappen inaktiverats.", + "Following users are not set up for encryption:" : "Följande användare har inte aktiverat kryptering:", "Go directly to your %spersonal settings%s." : "Gå direkt till dina %segna inställningar%s.", "Encryption" : "Kryptering", "Encryption App is enabled but your keys are not initialized, please log-out and log-in again" : "Krypteringsprogrammet är aktiverat men dina nycklar är inte initierade. Vänligen logga ut och in igen", @@ -31,6 +39,8 @@ "New Recovery key password" : "Nytt lösenord för återställningsnyckel", "Repeat New Recovery key password" : "Upprepa lösenord för ny återställningsnyckel", "Change Password" : "Byt lösenord", + "Your private key password no longer matches your log-in password." : "Ditt lösenord för din privata nyckel matchar inte längre ditt inloggningslösenord.", + "Set your old private key password to your current log-in password:" : "Sätt ditt gamla privatnyckellösenord 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", diff --git a/apps/files_encryption/l10n/tr.js b/apps/files_encryption/l10n/tr.js index 3a50eeb2081..43a05a696a6 100644 --- a/apps/files_encryption/l10n/tr.js +++ b/apps/files_encryption/l10n/tr.js @@ -13,8 +13,10 @@ OC.L10N.register( "Please repeat the new recovery password" : "Lütfen yeni kurtarma parolasını yenileyin", "Password successfully changed." : "Parola başarıyla değiştirildi.", "Could not change the password. Maybe the old password was not correct." : "Parola değiştirilemedi. Eski parolanız doğru olmayabilir.", + "Could not update the private key password." : "Özel anahtar parolası güncellenemedi", + "The old password was not correct, please try again." : "Eski parola doğru değil, lütfen yeniden deneyin.", + "The current log-in password was not correct, please try again." : "Geçerli oturum parolası doğru değil, lütfen yeniden deneyin.", "Private key password successfully updated." : "Özel anahtar parolası başarıyla güncellendi.", - "Could not update the private key password. Maybe the old password was not correct." : "Özel anahtar parolası güncellenemedi. Eski parola hatalı olabilir.", "File recovery settings updated" : "Dosya kurtarma ayarları güncellendi", "Could not update file recovery" : "Dosya kurtarma güncellenemedi", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Şifreleme uygulaması başlatılamadı! Oturumunuz sırasında şifreleme uygulaması tekrar etkinleştirilmiş olabilir. Lütfen şifreleme uygulamasını başlatmak için oturumu kapatıp yeniden oturum açmayı deneyin.", @@ -22,7 +24,7 @@ OC.L10N.register( "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Bu dosya muhtemelen bir paylaşılan dosya olduğundan şifrelemesi kaldırılamıyor. Lütfen dosyayı sizinle bir daha paylaşması için dosya sahibi ile iletişime geçin.", "Unknown error. Please check your system settings or contact your administrator" : "Bilinmeyen hata. Lütfen sistem ayarlarınızı denetleyin veya yöneticiniz ile iletişime geçin", "Missing requirements." : "Gereklilikler eksik.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "PHP 5.3.3 veya daha sürümü ile birlikte OpenSSL ve OpenSSL PHP uzantısının birlikte etkin olduğundan ve doğru bir şekilde yapılandırıldığından emin olun. Şimdilik şifreleme uygulaması devre dışı bırakıldı.", + "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "OpenSSL'nin PHP uzantısıyla birlikte etkin ve düzgün yapılandırılmış olduğundan emin olun. Şimdilik şifreleme uygulaması devre dışı bırakıldı.", "Following users are not set up for encryption:" : "Aşağıdaki kullanıcılar şifreleme için ayarlanmamış:", "Initial encryption started... This can take some time. Please wait." : "İlk şifreleme başladı... Bu biraz zaman alabilir. Lütfen bekleyin.", "Initial encryption running... Please try again later." : "İlk şifreleme çalışıyor... Lütfen daha sonra tekrar deneyin.", diff --git a/apps/files_encryption/l10n/tr.json b/apps/files_encryption/l10n/tr.json index 4998865f3bd..e78f8fb5203 100644 --- a/apps/files_encryption/l10n/tr.json +++ b/apps/files_encryption/l10n/tr.json @@ -11,8 +11,10 @@ "Please repeat the new recovery password" : "Lütfen yeni kurtarma parolasını yenileyin", "Password successfully changed." : "Parola başarıyla değiştirildi.", "Could not change the password. Maybe the old password was not correct." : "Parola değiştirilemedi. Eski parolanız doğru olmayabilir.", + "Could not update the private key password." : "Özel anahtar parolası güncellenemedi", + "The old password was not correct, please try again." : "Eski parola doğru değil, lütfen yeniden deneyin.", + "The current log-in password was not correct, please try again." : "Geçerli oturum parolası doğru değil, lütfen yeniden deneyin.", "Private key password successfully updated." : "Özel anahtar parolası başarıyla güncellendi.", - "Could not update the private key password. Maybe the old password was not correct." : "Özel anahtar parolası güncellenemedi. Eski parola hatalı olabilir.", "File recovery settings updated" : "Dosya kurtarma ayarları güncellendi", "Could not update file recovery" : "Dosya kurtarma güncellenemedi", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Şifreleme uygulaması başlatılamadı! Oturumunuz sırasında şifreleme uygulaması tekrar etkinleştirilmiş olabilir. Lütfen şifreleme uygulamasını başlatmak için oturumu kapatıp yeniden oturum açmayı deneyin.", @@ -20,7 +22,7 @@ "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Bu dosya muhtemelen bir paylaşılan dosya olduğundan şifrelemesi kaldırılamıyor. Lütfen dosyayı sizinle bir daha paylaşması için dosya sahibi ile iletişime geçin.", "Unknown error. Please check your system settings or contact your administrator" : "Bilinmeyen hata. Lütfen sistem ayarlarınızı denetleyin veya yöneticiniz ile iletişime geçin", "Missing requirements." : "Gereklilikler eksik.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "PHP 5.3.3 veya daha sürümü ile birlikte OpenSSL ve OpenSSL PHP uzantısının birlikte etkin olduğundan ve doğru bir şekilde yapılandırıldığından emin olun. Şimdilik şifreleme uygulaması devre dışı bırakıldı.", + "Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "OpenSSL'nin PHP uzantısıyla birlikte etkin ve düzgün yapılandırılmış olduğundan emin olun. Şimdilik şifreleme uygulaması devre dışı bırakıldı.", "Following users are not set up for encryption:" : "Aşağıdaki kullanıcılar şifreleme için ayarlanmamış:", "Initial encryption started... This can take some time. Please wait." : "İlk şifreleme başladı... Bu biraz zaman alabilir. Lütfen bekleyin.", "Initial encryption running... Please try again later." : "İlk şifreleme çalışıyor... Lütfen daha sonra tekrar deneyin.", diff --git a/apps/files_encryption/l10n/uk.js b/apps/files_encryption/l10n/uk.js index 169f6c3f92e..15783a5172e 100644 --- a/apps/files_encryption/l10n/uk.js +++ b/apps/files_encryption/l10n/uk.js @@ -13,8 +13,10 @@ OC.L10N.register( "Please repeat the new recovery password" : "Будь ласка, введіть новий пароль відновлення ще раз", "Password successfully changed." : "Пароль змінено.", "Could not change the password. Maybe the old password was not correct." : "Не вдалося змінити пароль. Можливо ви неправильно ввели старий пароль.", + "Could not update the private key password." : "Не вдалося оновити пароль секретного ключа.", + "The old password was not correct, please try again." : "Старий пароль введено не вірно, спробуйте ще раз.", + "The current log-in password was not correct, please try again." : "Невірний пароль входу, будь ласка, спробуйте ще раз.", "Private key password successfully updated." : "Пароль секретного ключа оновлено.", - "Could not update the private key password. Maybe the old password was not correct." : "Не вдалося оновити пароль секретного ключа. Можливо ви не правильно ввели старий пароль.", "File recovery settings updated" : "Налаштування файла відновлення оновлено", "Could not update file recovery" : "Не вдалося оновити файл відновлення ", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Додаток шифрувння не ініціалізовано! Можливо цей додаток редагувався під час вашої сесії. Будь ласка, спробуйте вийти і зайти знову щоб проініціалізувати додаток шифрування.", @@ -22,7 +24,6 @@ OC.L10N.register( "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Не можу розшифрувати цей файл, можливо він опублікований. Будь ласка, попросіть власника опублікувати його заново.", "Unknown error. Please check your system settings or contact your administrator" : "Невідома помилка. Будь ласка, перевірте налаштування системи або зверніться до адміністратора.", "Missing requirements." : "Відсутні вимоги.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Будь ласка, впевніться, що встановлена версія PHP 5.3.3 або новіша, а також, що OpenSSL та інші розширення PHP підключені та вірно налаштовані. На даний момент додаток шифрування відключений.", "Following users are not set up for encryption:" : "Для наступних користувачів шифрування не налаштоване:", "Initial encryption started... This can take some time. Please wait." : "Початкове шифрування почалося... Це може зайняти деякий час. Будь ласка, почекайте.", "Initial encryption running... Please try again later." : "Початкове шифрування працює... Це може зайняти деякий час. Будь ласка, почекайте.", diff --git a/apps/files_encryption/l10n/uk.json b/apps/files_encryption/l10n/uk.json index 454de34d9c0..69444961860 100644 --- a/apps/files_encryption/l10n/uk.json +++ b/apps/files_encryption/l10n/uk.json @@ -11,8 +11,10 @@ "Please repeat the new recovery password" : "Будь ласка, введіть новий пароль відновлення ще раз", "Password successfully changed." : "Пароль змінено.", "Could not change the password. Maybe the old password was not correct." : "Не вдалося змінити пароль. Можливо ви неправильно ввели старий пароль.", + "Could not update the private key password." : "Не вдалося оновити пароль секретного ключа.", + "The old password was not correct, please try again." : "Старий пароль введено не вірно, спробуйте ще раз.", + "The current log-in password was not correct, please try again." : "Невірний пароль входу, будь ласка, спробуйте ще раз.", "Private key password successfully updated." : "Пароль секретного ключа оновлено.", - "Could not update the private key password. Maybe the old password was not correct." : "Не вдалося оновити пароль секретного ключа. Можливо ви не правильно ввели старий пароль.", "File recovery settings updated" : "Налаштування файла відновлення оновлено", "Could not update file recovery" : "Не вдалося оновити файл відновлення ", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "Додаток шифрувння не ініціалізовано! Можливо цей додаток редагувався під час вашої сесії. Будь ласка, спробуйте вийти і зайти знову щоб проініціалізувати додаток шифрування.", @@ -20,7 +22,6 @@ "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "Не можу розшифрувати цей файл, можливо він опублікований. Будь ласка, попросіть власника опублікувати його заново.", "Unknown error. Please check your system settings or contact your administrator" : "Невідома помилка. Будь ласка, перевірте налаштування системи або зверніться до адміністратора.", "Missing requirements." : "Відсутні вимоги.", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "Будь ласка, впевніться, що встановлена версія PHP 5.3.3 або новіша, а також, що OpenSSL та інші розширення PHP підключені та вірно налаштовані. На даний момент додаток шифрування відключений.", "Following users are not set up for encryption:" : "Для наступних користувачів шифрування не налаштоване:", "Initial encryption started... This can take some time. Please wait." : "Початкове шифрування почалося... Це може зайняти деякий час. Будь ласка, почекайте.", "Initial encryption running... Please try again later." : "Початкове шифрування працює... Це може зайняти деякий час. Будь ласка, почекайте.", diff --git a/apps/files_encryption/l10n/vi.js b/apps/files_encryption/l10n/vi.js index 8fc542510da..b853fb76162 100644 --- a/apps/files_encryption/l10n/vi.js +++ b/apps/files_encryption/l10n/vi.js @@ -8,7 +8,6 @@ OC.L10N.register( "Password successfully changed." : "Đã đổi mật khẩu.", "Could not change the password. Maybe the old password was not correct." : "Không thể đổi mật khẩu. Có lẽ do mật khẩu cũ không đúng.", "Private key password successfully updated." : "Cập nhật thành công mật khẩu khóa cá nhân", - "Could not update the private key password. Maybe the old password was not correct." : "Không thể cập nhật mật khẩu khóa cá nhân. Có thể mật khẩu cũ không đúng", "File recovery settings updated" : "Đã cập nhật thiết lập khôi phục tập tin ", "Could not update file recovery" : "Không thể cập nhật khôi phục tập tin", "Encryption" : "Mã hóa", diff --git a/apps/files_encryption/l10n/vi.json b/apps/files_encryption/l10n/vi.json index f1a1ff4c6da..4800a4bc21f 100644 --- a/apps/files_encryption/l10n/vi.json +++ b/apps/files_encryption/l10n/vi.json @@ -6,7 +6,6 @@ "Password successfully changed." : "Đã đổi mật khẩu.", "Could not change the password. Maybe the old password was not correct." : "Không thể đổi mật khẩu. Có lẽ do mật khẩu cũ không đúng.", "Private key password successfully updated." : "Cập nhật thành công mật khẩu khóa cá nhân", - "Could not update the private key password. Maybe the old password was not correct." : "Không thể cập nhật mật khẩu khóa cá nhân. Có thể mật khẩu cũ không đúng", "File recovery settings updated" : "Đã cập nhật thiết lập khôi phục tập tin ", "Could not update file recovery" : "Không thể cập nhật khôi phục tập tin", "Encryption" : "Mã hóa", diff --git a/apps/files_encryption/l10n/zh_CN.js b/apps/files_encryption/l10n/zh_CN.js index 82051423baf..a7da9155ef6 100644 --- a/apps/files_encryption/l10n/zh_CN.js +++ b/apps/files_encryption/l10n/zh_CN.js @@ -8,7 +8,6 @@ OC.L10N.register( "Password successfully changed." : "密码修改成功。", "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." : "无法更新私钥密码。可能旧密码不正确。", "File recovery settings updated" : "文件恢复设置已更新", "Could not update file recovery" : "不能更新文件恢复", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "加密应用还没有初始化!可能加密应用在你会话期间已被重新启用。请注销并重新登录,以初始化加密应用。", @@ -16,7 +15,6 @@ OC.L10N.register( "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : " 无法解密这个文件(或许这是一个共享文件?),请询问文件所有者重新与您分享这个文件。", "Unknown error. Please check your system settings or contact your administrator" : "未知错误。请检查系统设置或联系您的管理员", "Missing requirements." : "必填项未填写。", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "请确认安装了 PHP 5.3.3 或更新版本,且 OpenSSL 及其 PHP 扩展已经启用并正确配置。加密应用现在已被禁用。", "Following users are not set up for encryption:" : "以下用户还没有设置加密:", "Initial encryption started... This can take some time. Please wait." : "初始加密启动中....这可能会花一些时间,请稍后再试。", "Initial encryption running... Please try again later." : "初始加密运行中....请稍后再试。", diff --git a/apps/files_encryption/l10n/zh_CN.json b/apps/files_encryption/l10n/zh_CN.json index 9c9a6adc7cb..34576ee72d0 100644 --- a/apps/files_encryption/l10n/zh_CN.json +++ b/apps/files_encryption/l10n/zh_CN.json @@ -6,7 +6,6 @@ "Password successfully changed." : "密码修改成功。", "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." : "无法更新私钥密码。可能旧密码不正确。", "File recovery settings updated" : "文件恢复设置已更新", "Could not update file recovery" : "不能更新文件恢复", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "加密应用还没有初始化!可能加密应用在你会话期间已被重新启用。请注销并重新登录,以初始化加密应用。", @@ -14,7 +13,6 @@ "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : " 无法解密这个文件(或许这是一个共享文件?),请询问文件所有者重新与您分享这个文件。", "Unknown error. Please check your system settings or contact your administrator" : "未知错误。请检查系统设置或联系您的管理员", "Missing requirements." : "必填项未填写。", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "请确认安装了 PHP 5.3.3 或更新版本,且 OpenSSL 及其 PHP 扩展已经启用并正确配置。加密应用现在已被禁用。", "Following users are not set up for encryption:" : "以下用户还没有设置加密:", "Initial encryption started... This can take some time. Please wait." : "初始加密启动中....这可能会花一些时间,请稍后再试。", "Initial encryption running... Please try again later." : "初始加密运行中....请稍后再试。", diff --git a/apps/files_encryption/l10n/zh_TW.js b/apps/files_encryption/l10n/zh_TW.js index c68028a7aad..3bd3143c5b9 100644 --- a/apps/files_encryption/l10n/zh_TW.js +++ b/apps/files_encryption/l10n/zh_TW.js @@ -8,7 +8,6 @@ OC.L10N.register( "Password successfully changed." : "成功變更密碼。", "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." : "無法更新私人金鑰密碼。可能舊的密碼不正確。", "File recovery settings updated" : "檔案還原設定已更新", "Could not update file recovery" : "無法更新檔案還原設定", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "加密功能未初始化!可能加密功能需要重新啟用在現在的連線上。請試著登出再登入來初始化加密功能。", @@ -16,7 +15,6 @@ OC.L10N.register( "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "無法解密這個檔案,也許這是分享的檔案。請詢問檔案所有人重新分享檔案給您。", "Unknown error. Please check your system settings or contact your administrator" : "未知錯誤請檢查您的系統設定或是聯絡您的管理員", "Missing requirements." : "遺失必要條件。", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "請確認已安裝 PHP 5.3.3 或是更新的版本以及 OpenSSL 也一併安裝在 PHP extension 裡面並啟用及設置完成。現在,加密功能是停用的。", "Following users are not set up for encryption:" : "以下的使用者無法設定加密:", "Initial encryption started... This can take some time. Please wait." : "加密初始已啟用...這個需要一些時間。請稍等。", "Initial encryption running... Please try again later." : "加密初始執行中...請晚點再試。", diff --git a/apps/files_encryption/l10n/zh_TW.json b/apps/files_encryption/l10n/zh_TW.json index c6560dc3738..cf85da08c9f 100644 --- a/apps/files_encryption/l10n/zh_TW.json +++ b/apps/files_encryption/l10n/zh_TW.json @@ -6,7 +6,6 @@ "Password successfully changed." : "成功變更密碼。", "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." : "無法更新私人金鑰密碼。可能舊的密碼不正確。", "File recovery settings updated" : "檔案還原設定已更新", "Could not update file recovery" : "無法更新檔案還原設定", "Encryption app not initialized! Maybe the encryption app was re-enabled during your session. Please try to log out and log back in to initialize the encryption app." : "加密功能未初始化!可能加密功能需要重新啟用在現在的連線上。請試著登出再登入來初始化加密功能。", @@ -14,7 +13,6 @@ "Can not decrypt this file, probably this is a shared file. Please ask the file owner to reshare the file with you." : "無法解密這個檔案,也許這是分享的檔案。請詢問檔案所有人重新分享檔案給您。", "Unknown error. Please check your system settings or contact your administrator" : "未知錯誤請檢查您的系統設定或是聯絡您的管理員", "Missing requirements." : "遺失必要條件。", - "Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled." : "請確認已安裝 PHP 5.3.3 或是更新的版本以及 OpenSSL 也一併安裝在 PHP extension 裡面並啟用及設置完成。現在,加密功能是停用的。", "Following users are not set up for encryption:" : "以下的使用者無法設定加密:", "Initial encryption started... This can take some time. Please wait." : "加密初始已啟用...這個需要一些時間。請稍等。", "Initial encryption running... Please try again later." : "加密初始執行中...請晚點再試。", diff --git a/apps/files_encryption/lib/capabilities.php b/apps/files_encryption/lib/capabilities.php index ef94c9e086d..e6e4ee7d419 100644 --- a/apps/files_encryption/lib/capabilities.php +++ b/apps/files_encryption/lib/capabilities.php @@ -6,7 +6,7 @@ * See the COPYING-README file. */ -namespace OCA\Encryption; +namespace OCA\Files_Encryption; class Capabilities { diff --git a/apps/files_encryption/lib/crypt.php b/apps/files_encryption/lib/crypt.php index 59b191097af..38993ba65b0 100644 --- a/apps/files_encryption/lib/crypt.php +++ b/apps/files_encryption/lib/crypt.php @@ -3,10 +3,12 @@ /**
* ownCloud
*
- * @author Sam Tuke, Frank Karlitschek, Robin Appelman
- * @copyright 2012 Sam Tuke samtuke@owncloud.com,
- * Robin Appelman icewind@owncloud.com, Frank Karlitschek
- * frank@owncloud.org
+ * @copyright (C) 2014 ownCloud, Inc.
+ *
+ * @author Bjoern Schiessle <schiessle@owncloud.com>
+ * @author Sam Tuke <samtuke@owncloud.com>
+ * @author Frank Karlitschek <frank@owncloud.com>
+ * @author Robin Appelman <icewind@owncloud.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
@@ -23,8 +25,7 @@ *
*/
-namespace OCA\Encryption;
-use OCA\Encryption\Exceptions\EncryptionException;
+namespace OCA\Files_Encryption;
/**
* Class for common cryptography functionality
@@ -132,7 +133,7 @@ class Crypt { * Check if a file's contents contains an IV and is symmetrically encrypted
* @param string $content
* @return boolean
- * @note see also OCA\Encryption\Util->isEncryptedPath()
+ * @note see also \OCA\Files_Encryption\Util->isEncryptedPath()
*/
public static function isCatfileContent($content) {
@@ -189,7 +190,7 @@ class Crypt { * @param string $passphrase
* @param string $cypher used for encryption, currently we support AES-128-CFB and AES-256-CFB
* @return string encrypted file content
- * @throws \OCA\Encryption\Exceptions\EncryptionException
+ * @throws \OCA\Files_Encryption\Exception\EncryptionException
*/
private static function encrypt($plainContent, $iv, $passphrase = '', $cipher = Crypt::DEFAULT_CIPHER) {
@@ -198,7 +199,7 @@ class Crypt { if (!$encryptedContent) {
$error = "Encryption (symmetric) of content failed: " . openssl_error_string();
\OCP\Util::writeLog('Encryption library', $error, \OCP\Util::ERROR);
- throw new Exceptions\EncryptionException($error, 50);
+ throw new Exception\EncryptionException($error, Exception\EncryptionException::ENCRYPTION_FAILED);
}
return $encryptedContent;
@@ -290,7 +291,7 @@ class Crypt { $padded = self::addPadding($catfile);
return $padded;
- } catch (EncryptionException $e) {
+ } catch (Exception\EncryptionException $e) {
$message = 'Could not encrypt file content (code: ' . $e->getCode() . '): ';
\OCP\Util::writeLog('files_encryption', $message . $e->getMessage(), \OCP\Util::ERROR);
return false;
@@ -378,7 +379,7 @@ class Crypt { * @param string $plainContent content to be encrypted
* @param array $publicKeys array keys must be the userId of corresponding user
* @return array keys: keys (array, key = userId), data
- * @throws \OCA\Encryption\Exceptions\\MultiKeyEncryptException if encryption failed
+ * @throws \OCA\Files_Encryption\Exception\MultiKeyEncryptException if encryption failed
* @note symmetricDecryptFileContent() can decrypt files created using this method
*/
public static function multiKeyEncrypt($plainContent, array $publicKeys) {
@@ -386,7 +387,7 @@ class Crypt { // openssl_seal returns false without errors if $plainContent
// is empty, so trigger our own error
if (empty($plainContent)) {
- throw new Exceptions\MultiKeyEncryptException('Cannot multiKeyEncrypt empty plain content', 10);
+ throw new Exception\MultiKeyEncryptException('Cannot multiKeyEncrypt empty plain content', Exception\MultiKeyEncryptException::EMPTY_DATA);
}
// Set empty vars to be set by openssl by reference
@@ -413,7 +414,8 @@ class Crypt { );
} else {
- throw new Exceptions\MultiKeyEncryptException('multi key encryption failed: ' . openssl_error_string(), 20);
+ throw new Exception\MultiKeyEncryptException('multi key encryption failed: ' . openssl_error_string(),
+ Exception\MultiKeyEncryptException::OPENSSL_SEAL_FAILED);
}
}
@@ -423,7 +425,7 @@ class Crypt { * @param string $encryptedContent
* @param string $shareKey
* @param mixed $privateKey
- * @throws \OCA\Encryption\Exceptions\\MultiKeyDecryptException if decryption failed
+ * @throws \OCA\Files_Encryption\Exception\MultiKeyDecryptException if decryption failed
* @internal param string $plainContent contains decrypted content
* @return string $plainContent decrypted string
* @note symmetricDecryptFileContent() can be used to decrypt files created using this method
@@ -433,7 +435,8 @@ class Crypt { public static function multiKeyDecrypt($encryptedContent, $shareKey, $privateKey) {
if (!$encryptedContent) {
- throw new Exceptions\MultiKeyDecryptException('Cannot mutliKeyDecrypt empty plain content', 10);
+ throw new Exception\MultiKeyDecryptException('Cannot mutliKeyDecrypt empty plain content',
+ Exception\MultiKeyDecryptException::EMPTY_DATA);
}
if (openssl_open($encryptedContent, $plainContent, $shareKey, $privateKey)) {
@@ -441,7 +444,8 @@ class Crypt { return $plainContent;
} else {
- throw new Exceptions\MultiKeyDecryptException('multiKeyDecrypt with share-key' . $shareKey . 'failed: ' . openssl_error_string(), 20);
+ throw new Exception\MultiKeyDecryptException('multiKeyDecrypt with share-key' . $shareKey . 'failed: ' . openssl_error_string(),
+ Exception\MultiKeyDecryptException::OPENSSL_OPEN_FAILED);
}
}
@@ -550,14 +554,15 @@ class Crypt { * get chiper from header
*
* @param array $header
- * @throws \OCA\Encryption\Exceptions\EncryptionException
+ * @throws \OCA\Files_Encryption\Exception\EncryptionException
*/
public static function getCipher($header) {
$cipher = isset($header['cipher']) ? $header['cipher'] : 'AES-128-CFB';
if ($cipher !== 'AES-256-CFB' && $cipher !== 'AES-128-CFB') {
- throw new \OCA\Encryption\Exceptions\EncryptionException('file header broken, no supported cipher defined', 40);
+ throw new Exception\EncryptionException('file header broken, no supported cipher defined',
+ Exception\EncryptionException::UNKNOWN_CIPHER);
}
return $cipher;
diff --git a/apps/files_encryption/lib/helper.php b/apps/files_encryption/lib/helper.php index 53c380ab2b3..b9d45f67363 100644 --- a/apps/files_encryption/lib/helper.php +++ b/apps/files_encryption/lib/helper.php @@ -3,8 +3,10 @@ /** * ownCloud * - * @author Florin Peter - * @copyright 2013 Florin Peter <owncloud@florin-peter.de> + * @copyright (C) 2014 ownCloud, Inc. + * + * @author Florin Peter <owncloud@florin-peter.de> + * @author Bjoern Schiessle <schiessle@owncloud.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE @@ -21,11 +23,11 @@ * */ -namespace OCA\Encryption; +namespace OCA\Files_Encryption; /** * Class to manage registration of hooks an various helper methods - * @package OCA\Encryption + * @package OCA\Files_Encryption */ class Helper { @@ -37,9 +39,9 @@ class Helper { */ public static function registerShareHooks() { - \OCP\Util::connectHook('OCP\Share', 'pre_shared', 'OCA\Encryption\Hooks', 'preShared'); - \OCP\Util::connectHook('OCP\Share', 'post_shared', 'OCA\Encryption\Hooks', 'postShared'); - \OCP\Util::connectHook('OCP\Share', 'post_unshare', 'OCA\Encryption\Hooks', 'postUnshare'); + \OCP\Util::connectHook('OCP\Share', 'pre_shared', 'OCA\Files_Encryption\Hooks', 'preShared'); + \OCP\Util::connectHook('OCP\Share', 'post_shared', 'OCA\Files_Encryption\Hooks', 'postShared'); + \OCP\Util::connectHook('OCP\Share', 'post_unshare', 'OCA\Files_Encryption\Hooks', 'postUnshare'); } /** @@ -48,12 +50,12 @@ class Helper { */ public static function registerUserHooks() { - \OCP\Util::connectHook('OC_User', 'post_login', 'OCA\Encryption\Hooks', 'login'); - \OCP\Util::connectHook('OC_User', 'logout', 'OCA\Encryption\Hooks', 'logout'); - \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_deleteUser', 'OCA\Encryption\Hooks', 'postDeleteUser'); + \OCP\Util::connectHook('OC_User', 'post_login', 'OCA\Files_Encryption\Hooks', 'login'); + \OCP\Util::connectHook('OC_User', 'logout', 'OCA\Files_Encryption\Hooks', 'logout'); + \OCP\Util::connectHook('OC_User', 'post_setPassword', 'OCA\Files_Encryption\Hooks', 'setPassphrase'); + \OCP\Util::connectHook('OC_User', 'pre_setPassword', 'OCA\Files_Encryption\Hooks', 'preSetPassphrase'); + \OCP\Util::connectHook('OC_User', 'post_createUser', 'OCA\Files_Encryption\Hooks', 'postCreateUser'); + \OCP\Util::connectHook('OC_User', 'post_deleteUser', 'OCA\Files_Encryption\Hooks', 'postDeleteUser'); } /** @@ -62,14 +64,15 @@ class Helper { */ public static function registerFilesystemHooks() { - \OCP\Util::connectHook('OC_Filesystem', 'rename', 'OCA\Encryption\Hooks', 'preRename'); - \OCP\Util::connectHook('OC_Filesystem', 'post_rename', 'OCA\Encryption\Hooks', 'postRenameOrCopy'); - \OCP\Util::connectHook('OC_Filesystem', 'copy', 'OCA\Encryption\Hooks', 'preCopy'); - \OCP\Util::connectHook('OC_Filesystem', 'post_copy', 'OCA\Encryption\Hooks', 'postRenameOrCopy'); - \OCP\Util::connectHook('OC_Filesystem', 'post_delete', 'OCA\Encryption\Hooks', 'postDelete'); - \OCP\Util::connectHook('OC_Filesystem', 'delete', 'OCA\Encryption\Hooks', 'preDelete'); - \OCP\Util::connectHook('OC_Filesystem', 'post_umount', 'OCA\Encryption\Hooks', 'postUmount'); - \OCP\Util::connectHook('OC_Filesystem', 'umount', 'OCA\Encryption\Hooks', 'preUmount'); + \OCP\Util::connectHook('OC_Filesystem', 'rename', 'OCA\Files_Encryption\Hooks', 'preRename'); + \OCP\Util::connectHook('OC_Filesystem', 'post_rename', 'OCA\Files_Encryption\Hooks', 'postRenameOrCopy'); + \OCP\Util::connectHook('OC_Filesystem', 'copy', 'OCA\Files_Encryption\Hooks', 'preCopy'); + \OCP\Util::connectHook('OC_Filesystem', 'post_copy', 'OCA\Files_Encryption\Hooks', 'postRenameOrCopy'); + \OCP\Util::connectHook('OC_Filesystem', 'post_delete', 'OCA\Files_Encryption\Hooks', 'postDelete'); + \OCP\Util::connectHook('OC_Filesystem', 'delete', 'OCA\Files_Encryption\Hooks', 'preDelete'); + \OCP\Util::connectHook('\OC\Core\LostPassword\Controller\LostController', 'post_passwordReset', 'OCA\Files_Encryption\Hooks', 'postPasswordReset'); + \OCP\Util::connectHook('OC_Filesystem', 'post_umount', 'OCA\Files_Encryption\Hooks', 'postUnmount'); + \OCP\Util::connectHook('OC_Filesystem', 'umount', 'OCA\Files_Encryption\Hooks', 'preUnmount'); } /** @@ -78,8 +81,8 @@ class Helper { */ public static function registerAppHooks() { - \OCP\Util::connectHook('OC_App', 'pre_disable', 'OCA\Encryption\Hooks', 'preDisable'); - \OCP\Util::connectHook('OC_App', 'post_disable', 'OCA\Encryption\Hooks', 'postEnable'); + \OCP\Util::connectHook('OC_App', 'pre_disable', 'OCA\Files_Encryption\Hooks', 'preDisable'); + \OCP\Util::connectHook('OC_App', 'post_disable', 'OCA\Files_Encryption\Hooks', 'postEnable'); } /** @@ -105,12 +108,29 @@ class Helper { } /** + * get recovery key id + * + * @return string|bool recovery key ID or false + */ + public static function getRecoveryKeyId() { + $appConfig = \OC::$server->getAppConfig(); + $key = $appConfig->getValue('files_encryption', 'recoveryKeyId'); + + return ($key === null) ? false : $key; + } + + public static function getPublicShareKeyId() { + $appConfig = \OC::$server->getAppConfig(); + $key = $appConfig->getValue('files_encryption', 'publicShareKeyId'); + + return ($key === null) ? false : $key; + } + + /** * enable recovery * * @param string $recoveryKeyId * @param string $recoveryPassword - * @internal param \OCA\Encryption\Util $util - * @internal param string $password * @return bool */ public static function adminEnableRecovery($recoveryKeyId, $recoveryPassword) { @@ -123,40 +143,24 @@ class Helper { $appConfig->setValue('files_encryption', 'recoveryKeyId', $recoveryKeyId); } - if (!$view->is_dir('/owncloud_private_key')) { - $view->mkdir('/owncloud_private_key'); - } - - if ( - (!$view->file_exists("/public-keys/" . $recoveryKeyId . ".public.key") - || !$view->file_exists("/owncloud_private_key/" . $recoveryKeyId . ".private.key")) - ) { - - $keypair = \OCA\Encryption\Crypt::createKeypair(); + if (!Keymanager::recoveryKeyExists($view)) { - \OC_FileProxy::$enabled = false; + $keypair = Crypt::createKeypair(); // Save public key + Keymanager::setPublicKey($keypair['publicKey'], $recoveryKeyId); - if (!$view->is_dir('/public-keys')) { - $view->mkdir('/public-keys'); - } - - $view->file_put_contents('/public-keys/' . $recoveryKeyId . '.public.key', $keypair['publicKey']); - - $cipher = \OCA\Encryption\Helper::getCipher(); - $encryptedKey = \OCA\Encryption\Crypt::symmetricEncryptFileContent($keypair['privateKey'], $recoveryPassword, $cipher); + $cipher = Helper::getCipher(); + $encryptedKey = Crypt::symmetricEncryptFileContent($keypair['privateKey'], $recoveryPassword, $cipher); if ($encryptedKey) { - Keymanager::setPrivateSystemKey($encryptedKey, $recoveryKeyId . '.private.key'); + Keymanager::setPrivateSystemKey($encryptedKey, $recoveryKeyId); // Set recoveryAdmin as enabled $appConfig->setValue('files_encryption', 'recoveryAdminEnabled', 1); $return = true; } - \OC_FileProxy::$enabled = true; - } else { // get recovery key and check the password - $util = new \OCA\Encryption\Util(new \OC\Files\View('/'), \OCP\User::getUser()); + $util = new Util(new \OC\Files\View('/'), \OCP\User::getUser()); $return = $util->checkRecoveryPassword($recoveryPassword); if ($return) { $appConfig->setValue('files_encryption', 'recoveryAdminEnabled', 1); @@ -356,14 +360,14 @@ class Helper { if ($errorCode === null) { $init = $session->getInitialized(); switch ($init) { - case \OCA\Encryption\Session::INIT_EXECUTED: - $errorCode = \OCA\Encryption\Crypt::ENCRYPTION_PRIVATE_KEY_NOT_VALID_ERROR; + case Session::INIT_EXECUTED: + $errorCode = Crypt::ENCRYPTION_PRIVATE_KEY_NOT_VALID_ERROR; break; - case \OCA\Encryption\Session::NOT_INITIALIZED: - $errorCode = \OCA\Encryption\Crypt::ENCRYPTION_NOT_INITIALIZED_ERROR; + case Session::NOT_INITIALIZED: + $errorCode = Crypt::ENCRYPTION_NOT_INITIALIZED_ERROR; break; default: - $errorCode = \OCA\Encryption\Crypt::ENCRYPTION_UNKNOWN_ERROR; + $errorCode = Crypt::ENCRYPTION_UNKNOWN_ERROR; } } @@ -386,14 +390,10 @@ class Helper { * @return bool true if requirements are met */ public static function checkRequirements() { - $result = true; //openssl extension needs to be loaded - $result &= extension_loaded("openssl"); - // we need php >= 5.3.3 - $result &= version_compare(phpversion(), '5.3.3', '>='); + return extension_loaded("openssl"); - return (bool) $result; } /** @@ -427,52 +427,11 @@ class Helper { */ public static function getOpenSSLConfig() { $config = array('private_key_bits' => 4096); - $config = array_merge(\OCP\Config::getSystemValue('openssl', array()), $config); + $config = array_merge(\OC::$server->getConfig()->getSystemValue('openssl', array()), $config); return $config; } /** - * find all share keys for a given file - * - * @param string $filePath path to the file name relative to the user's files dir - * for example "subdir/filename.txt" - * @param string $shareKeyPath share key prefix path relative to the user's data dir - * for example "user1/files_encryption/share-keys/subdir/filename.txt" - * @param \OC\Files\View $rootView root view, relative to data/ - * @return array list of share key files, path relative to data/$user - */ - public static function findShareKeys($filePath, $shareKeyPath, \OC\Files\View $rootView) { - $result = array(); - - $user = \OCP\User::getUser(); - $util = new Util($rootView, $user); - // get current sharing state - $sharingEnabled = \OCP\Share::isEnabled(); - - // get users sharing this file - $usersSharing = $util->getSharingUsersArray($sharingEnabled, $filePath); - - $pathinfo = pathinfo($shareKeyPath); - - $baseDir = $pathinfo['dirname'] . '/'; - $fileName = $pathinfo['basename']; - foreach ($usersSharing as $user) { - $keyName = $fileName . '.' . $user . '.shareKey'; - if ($rootView->file_exists($baseDir . $keyName)) { - $result[] = $baseDir . $keyName; - } else { - \OC_Log::write( - 'Encryption library', - 'No share key found for user "' . $user . '" for file "' . $fileName . '"', - \OC_Log::WARN - ); - } - } - - return $result; - } - - /** * remember from which file the tmp file (getLocalFile() call) was created * @param string $tmpFile path of tmp file * @param string $originalFile path of the original file relative to data/ @@ -501,7 +460,7 @@ class Helper { */ public static function getCipher() { - $cipher = \OCP\Config::getSystemValue('cipher', Crypt::DEFAULT_CIPHER); + $cipher = \OC::$server->getConfig()->getSystemValue('cipher', Crypt::DEFAULT_CIPHER); if ($cipher !== 'AES-256-CFB' && $cipher !== 'AES-128-CFB') { \OCP\Util::writeLog('files_encryption', diff --git a/apps/files_encryption/hooks/hooks.php b/apps/files_encryption/lib/hooks.php index 3a0a37c0a59..7ddde0a3112 100644 --- a/apps/files_encryption/hooks/hooks.php +++ b/apps/files_encryption/lib/hooks.php @@ -3,8 +3,10 @@ /**
* ownCloud
*
- * @author Sam Tuke
- * @copyright 2012 Sam Tuke samtuke@owncloud.org
+ * @copyright (C) 2014 ownCloud, Inc.
+ *
+ * @author Sam Tuke <samtuke@owncloud.org>
+ * @author Bjoern Schiessle <schiessle@owncloud.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
@@ -21,9 +23,7 @@ *
*/
-namespace OCA\Encryption;
-
-use OC\Files\Filesystem;
+namespace OCA\Files_Encryption;
/**
* Class for hook specific logic
@@ -35,7 +35,7 @@ class Hooks { // file for which we want to delete the keys after the delete operation was successful
private static $deleteFiles = array();
// file for which we want to delete the keys after the delete operation was successful
- private static $umountedFiles = array();
+ private static $unmountedFiles = array();
/**
* Startup encryption backend upon user login
@@ -57,14 +57,14 @@ class Hooks { \OC_Util::setupFS($params['uid']);
}
- $privateKey = \OCA\Encryption\Keymanager::getPrivateKey($view, $params['uid']);
+ $privateKey = Keymanager::getPrivateKey($view, $params['uid']);
// if no private key exists, check server configuration
if (!$privateKey) {
//check if all requirements are met
if (!Helper::checkRequirements() || !Helper::checkConfiguration()) {
$error_msg = $l->t("Missing requirements.");
- $hint = $l->t('Please make sure that PHP 5.3.3 or newer is installed and that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled.');
+ $hint = $l->t('Please make sure that OpenSSL together with the PHP extension is enabled and configured properly. For now, the encryption app has been disabled.');
\OC_App::disable('files_encryption');
\OCP\Util::writeLog('Encryption library', $error_msg . ' ' . $hint, \OCP\Util::ERROR);
\OCP\Template::printErrorPage($error_msg, $hint);
@@ -126,7 +126,7 @@ class Hooks { * remove keys from session during logout
*/
public static function logout() {
- $session = new \OCA\Encryption\Session(new \OC\Files\View());
+ $session = new Session(new \OC\Files\View());
$session->removeKeys();
}
@@ -150,18 +150,7 @@ class Hooks { public static function postDeleteUser($params) {
if (\OCP\App::isEnabled('files_encryption')) {
- $view = new \OC\Files\View('/');
-
- // cleanup public key
- $publicKey = '/public-keys/' . $params['uid'] . '.public.key';
-
- // Disable encryption proxy to prevent recursive calls
- $proxyStatus = \OC_FileProxy::$enabled;
- \OC_FileProxy::$enabled = false;
-
- $view->unlink($publicKey);
-
- \OC_FileProxy::$enabled = $proxyStatus;
+ Keymanager::deletePublicKey(new \OC\Files\View(), $params['uid']);
}
}
@@ -191,7 +180,7 @@ class Hooks { if (Crypt::mode() === 'server') {
$view = new \OC\Files\View('/');
- $session = new \OCA\Encryption\Session($view);
+ $session = new Session($view);
// Get existing decrypted private key
$privateKey = $session->getPrivateKey();
@@ -242,10 +231,10 @@ class Hooks { \OC_FileProxy::$enabled = false;
// Save public key
- $view->file_put_contents('/public-keys/' . $user . '.public.key', $keypair['publicKey']);
+ Keymanager::setPublicKey($keypair['publicKey'], $user);
// Encrypt private key with new password
- $encryptedKey = \OCA\Encryption\Crypt::symmetricEncryptFileContent($keypair['privateKey'], $newUserPassword, Helper::getCipher());
+ $encryptedKey = Crypt::symmetricEncryptFileContent($keypair['privateKey'], $newUserPassword, Helper::getCipher());
if ($encryptedKey) {
Keymanager::setPrivateKey($encryptedKey, $user);
@@ -263,6 +252,19 @@ class Hooks { }
}
+ /**
+ * after password reset we create a new key pair for the user
+ *
+ * @param array $params
+ */
+ public static function postPasswordReset($params) {
+ $uid = $params['uid'];
+ $password = $params['password'];
+
+ $util = new Util(new \OC\Files\View(), $uid);
+ $util->replaceUserKeys($password);
+ }
+
/*
* check if files can be encrypted to every user.
*/
@@ -277,7 +279,7 @@ class Hooks { $l = new \OC_L10N('files_encryption');
$users = array();
- $view = new \OC\Files\View('/public-keys/');
+ $view = new \OC\Files\View('/');
switch ($params['shareType']) {
case \OCP\Share::SHARE_TYPE_USER:
@@ -290,7 +292,7 @@ class Hooks { $notConfigured = array();
foreach ($users as $user) {
- if (!$view->file_exists($user . '.public.key')) {
+ if (!Keymanager::publicKeyExists($view, $user)) {
$notConfigured[] = $user;
}
}
@@ -315,7 +317,7 @@ class Hooks { $path = \OC\Files\Filesystem::getPath($params['fileSource']);
- self::updateKeyfiles($path, $params['itemType']);
+ self::updateKeyfiles($path);
}
}
@@ -323,12 +325,11 @@ class Hooks { * update keyfiles and share keys recursively
*
* @param string $path to the file/folder
- * @param string $type 'file' or 'folder'
*/
- private static function updateKeyfiles($path, $type) {
+ private static function updateKeyfiles($path) {
$view = new \OC\Files\View('/');
$userId = \OCP\User::getUser();
- $session = new \OCA\Encryption\Session($view);
+ $session = new Session($view);
$util = new Util($view, $userId);
$sharingEnabled = \OCP\Share::isEnabled();
@@ -337,7 +338,7 @@ class Hooks { $mountPoint = $mount->getMountPoint();
// if a folder was shared, get a list of all (sub-)folders
- if ($type === 'folder') {
+ if ($view->is_dir('/' . $userId . '/files' . $path)) {
$allFiles = $util->getAllFiles($path, $mountPoint);
} else {
$allFiles = array($path);
@@ -361,15 +362,16 @@ class Hooks { if ($params['itemType'] === 'file' || $params['itemType'] === 'folder') {
$view = new \OC\Files\View('/');
- $userId = \OCP\User::getUser();
+ $userId = $params['uidOwner'];
+ $userView = new \OC\Files\View('/' . $userId . '/files');
$util = new Util($view, $userId);
- $path = \OC\Files\Filesystem::getPath($params['fileSource']);
+ $path = $userView->getPath($params['fileSource']);
// for group shares get a list of the group members
if ($params['shareType'] === \OCP\Share::SHARE_TYPE_GROUP) {
$userIds = \OC_Group::usersInGroup($params['shareWith']);
} else {
- if ($params['shareType'] === \OCP\Share::SHARE_TYPE_LINK) {
+ if ($params['shareType'] === \OCP\Share::SHARE_TYPE_LINK || $params['shareType'] === \OCP\Share::SHARE_TYPE_REMOTE) {
$userIds = array($util->getPublicShareKeyId());
} else {
$userIds = array($params['shareWith']);
@@ -394,11 +396,10 @@ class Hooks { // Unshare every user who no longer has access to the file
$delUsers = array_diff($userIds, $sharingUsers);
-
- list($owner, $ownerPath) = $util->getUidAndFilename($path);
+ $keyPath = Keymanager::getKeyPath($view, $util, $path);
// delete share key
- Keymanager::delShareKey($view, $delUsers, $ownerPath, $owner);
+ Keymanager::delShareKey($view, $delUsers, $keyPath, $userId, $path);
}
}
@@ -424,37 +425,24 @@ class Hooks { $user = \OCP\User::getUser();
$view = new \OC\Files\View('/');
$util = new Util($view, $user);
- list($ownerOld, $pathOld) = $util->getUidAndFilename($params['oldpath']);
// we only need to rename the keys if the rename happens on the same mountpoint
// otherwise we perform a stream copy, so we get a new set of keys
$mp1 = $view->getMountPoint('/' . $user . '/files/' . $params['oldpath']);
$mp2 = $view->getMountPoint('/' . $user . '/files/' . $params['newpath']);
- $type = $view->is_dir('/' . $user . '/files/' . $params['oldpath']) ? 'folder' : 'file';
+ $oldKeysPath = Keymanager::getKeyPath($view, $util, $params['oldpath']);
if ($mp1 === $mp2) {
- if ($util->isSystemWideMountPoint($pathOld)) {
- $oldShareKeyPath = 'files_encryption/share-keys/' . $pathOld;
- } else {
- $oldShareKeyPath = $ownerOld . '/' . 'files_encryption/share-keys/' . $pathOld;
- }
- // gather share keys here because in postRename() the file will be moved already
- $oldShareKeys = Helper::findShareKeys($pathOld, $oldShareKeyPath, $view);
- if (count($oldShareKeys) === 0) {
- \OC_Log::write(
- 'Encryption library', 'No share keys found for "' . $pathOld . '"',
- \OC_Log::WARN
- );
- }
self::$renamedFiles[$params['oldpath']] = array(
- 'uid' => $ownerOld,
- 'path' => $pathOld,
- 'type' => $type,
'operation' => $operation,
- 'sharekeys' => $oldShareKeys
+ 'oldKeysPath' => $oldKeysPath,
+ );
+ } else {
+ self::$renamedFiles[$params['oldpath']] = array(
+ 'operation' => 'cleanup',
+ 'oldKeysPath' => $oldKeysPath,
);
-
}
}
@@ -469,81 +457,40 @@ class Hooks { return true;
}
- // Disable encryption proxy to prevent recursive calls
- $proxyStatus = \OC_FileProxy::$enabled;
- \OC_FileProxy::$enabled = false;
-
$view = new \OC\Files\View('/');
$userId = \OCP\User::getUser();
$util = new Util($view, $userId);
- $oldShareKeys = null;
- if (isset(self::$renamedFiles[$params['oldpath']]['uid']) &&
- isset(self::$renamedFiles[$params['oldpath']]['path'])) {
- $ownerOld = self::$renamedFiles[$params['oldpath']]['uid'];
- $pathOld = self::$renamedFiles[$params['oldpath']]['path'];
- $type = self::$renamedFiles[$params['oldpath']]['type'];
+ if (isset(self::$renamedFiles[$params['oldpath']]['operation']) &&
+ isset(self::$renamedFiles[$params['oldpath']]['oldKeysPath'])) {
$operation = self::$renamedFiles[$params['oldpath']]['operation'];
- $oldShareKeys = self::$renamedFiles[$params['oldpath']]['sharekeys'];
+ $oldKeysPath = self::$renamedFiles[$params['oldpath']]['oldKeysPath'];
unset(self::$renamedFiles[$params['oldpath']]);
+ if ($operation === 'cleanup') {
+ return $view->unlink($oldKeysPath);
+ }
} else {
\OCP\Util::writeLog('Encryption library', "can't get path and owner from the file before it was renamed", \OCP\Util::DEBUG);
- \OC_FileProxy::$enabled = $proxyStatus;
return false;
}
list($ownerNew, $pathNew) = $util->getUidAndFilename($params['newpath']);
- // Format paths to be relative to user files dir
- if ($util->isSystemWideMountPoint($pathOld)) {
- $oldKeyfilePath = 'files_encryption/keyfiles/' . $pathOld;
- $oldShareKeyPath = 'files_encryption/share-keys/' . $pathOld;
- } else {
- $oldKeyfilePath = $ownerOld . '/' . 'files_encryption/keyfiles/' . $pathOld;
- $oldShareKeyPath = $ownerOld . '/' . 'files_encryption/share-keys/' . $pathOld;
- }
-
if ($util->isSystemWideMountPoint($pathNew)) {
- $newKeyfilePath = 'files_encryption/keyfiles/' . $pathNew;
- $newShareKeyPath = 'files_encryption/share-keys/' . $pathNew;
+ $newKeysPath = 'files_encryption/keys/' . $pathNew;
} else {
- $newKeyfilePath = $ownerNew . '/files_encryption/keyfiles/' . $pathNew;
- $newShareKeyPath = $ownerNew . '/files_encryption/share-keys/' . $pathNew;
+ $newKeysPath = $ownerNew . '/files_encryption/keys/' . $pathNew;
}
- // create new key folders if it doesn't exists
- if (!$view->file_exists(dirname($newShareKeyPath))) {
- $view->mkdir(dirname($newShareKeyPath));
- }
- if (!$view->file_exists(dirname($newKeyfilePath))) {
- $view->mkdir(dirname($newKeyfilePath));
- }
-
- // handle share keys
- if ($type === 'file') {
- $oldKeyfilePath .= '.key';
- $newKeyfilePath .= '.key';
-
- foreach ($oldShareKeys as $src) {
- $dst = \OC\Files\Filesystem::normalizePath(str_replace($pathOld, $pathNew, $src));
- $view->$operation($src, $dst);
- }
-
- } else {
- // handle share-keys folders
- $view->$operation($oldShareKeyPath, $newShareKeyPath);
- }
-
- // Rename keyfile so it isn't orphaned
- if ($view->file_exists($oldKeyfilePath)) {
- $view->$operation($oldKeyfilePath, $newKeyfilePath);
+ // create key folders if it doesn't exists
+ if (!$view->file_exists(dirname($newKeysPath))) {
+ $view->mkdir(dirname($newKeysPath));
}
+ $view->$operation($oldKeysPath, $newKeysPath);
// update sharing-keys
- self::updateKeyfiles($params['newpath'], $type);
-
- \OC_FileProxy::$enabled = $proxyStatus;
+ self::updateKeyfiles($params['newpath']);
}
/**
@@ -554,10 +501,10 @@ class Hooks { public static function preDisable($params) {
if ($params['app'] === 'files_encryption') {
- \OC_Preferences::deleteAppFromAllUsers('files_encryption');
+ \OC::$server->getConfig()->deleteAppFromAllUsers('files_encryption');
- $session = new \OCA\Encryption\Session(new \OC\Files\View('/'));
- $session->setInitialized(\OCA\Encryption\Session::NOT_INITIALIZED);
+ $session = new Session(new \OC\Files\View('/'));
+ $session->setInitialized(Session::NOT_INITIALIZED);
}
}
@@ -567,8 +514,8 @@ class Hooks { */
public static function postEnable($params) {
if ($params['app'] === 'files_encryption') {
- $session = new \OCA\Encryption\Session(new \OC\Files\View('/'));
- $session->setInitialized(\OCA\Encryption\Session::NOT_INITIALIZED);
+ $session = new Session(new \OC\Files\View('/'));
+ $session->setInitialized(Session::NOT_INITIALIZED);
}
}
@@ -579,37 +526,28 @@ class Hooks { */
public static function postDelete($params) {
- if (!isset(self::$deleteFiles[$params[\OC\Files\Filesystem::signal_param_path]])) {
+ $path = $params[\OC\Files\Filesystem::signal_param_path];
+
+ if (!isset(self::$deleteFiles[$path])) {
return true;
}
- $deletedFile = self::$deleteFiles[$params[\OC\Files\Filesystem::signal_param_path]];
- $path = $deletedFile['path'];
- $user = $deletedFile['uid'];
+ $deletedFile = self::$deleteFiles[$path];
+ $keyPath = $deletedFile['keyPath'];
// we don't need to remember the file any longer
- unset(self::$deleteFiles[$params[\OC\Files\Filesystem::signal_param_path]]);
+ unset(self::$deleteFiles[$path]);
$view = new \OC\Files\View('/');
// return if the file still exists and wasn't deleted correctly
- if ($view->file_exists('/' . $user . '/files/' . $path)) {
+ if ($view->file_exists('/' . \OCP\User::getUser() . '/files/' . $path)) {
return true;
}
- // Disable encryption proxy to prevent recursive calls
- $proxyStatus = \OC_FileProxy::$enabled;
- \OC_FileProxy::$enabled = false;
-
// Delete keyfile & shareKey so it isn't orphaned
- if (!Keymanager::deleteFileKey($view, $path, $user)) {
- \OCP\Util::writeLog('Encryption library',
- 'Keyfile or shareKey could not be deleted for file "' . $user.'/files/'.$path . '"', \OCP\Util::ERROR);
- }
+ $view->unlink($keyPath);
- Keymanager::delAllShareKeys($view, $user, $path);
-
- \OC_FileProxy::$enabled = $proxyStatus;
}
/**
@@ -618,6 +556,7 @@ class Hooks { * @return boolean|null
*/
public static function preDelete($params) {
+ $view = new \OC\Files\View('/');
$path = $params[\OC\Files\Filesystem::signal_param_path];
// skip this method if the trash bin is enabled or if we delete a file
@@ -626,68 +565,61 @@ class Hooks { return true;
}
- $util = new Util(new \OC\Files\View('/'), \OCP\USER::getUser());
- list($owner, $ownerPath) = $util->getUidAndFilename($path);
+ $util = new Util($view, \OCP\USER::getUser());
+
+ $keysPath = Keymanager::getKeyPath($view, $util, $path);
- self::$deleteFiles[$params[\OC\Files\Filesystem::signal_param_path]] = array(
- 'uid' => $owner,
- 'path' => $ownerPath);
+ self::$deleteFiles[$path] = array(
+ 'keyPath' => $keysPath);
}
/**
* unmount file from yourself
* remember files/folders which get unmounted
*/
- public static function preUmount($params) {
+ public static function preUnmount($params) {
+ $view = new \OC\Files\View('/');
+ $user = \OCP\User::getUser();
$path = $params[\OC\Files\Filesystem::signal_param_path];
- $user = \OCP\USER::getUser();
-
- $view = new \OC\Files\View();
- $itemType = $view->is_dir('/' . $user . '/files' . $path) ? 'folder' : 'file';
$util = new Util($view, $user);
list($owner, $ownerPath) = $util->getUidAndFilename($path);
- self::$umountedFiles[$params[\OC\Files\Filesystem::signal_param_path]] = array(
- 'uid' => $owner,
- 'path' => $ownerPath,
- 'itemType' => $itemType);
+ $keysPath = Keymanager::getKeyPath($view, $util, $path);
+
+ self::$unmountedFiles[$path] = array(
+ 'keyPath' => $keysPath,
+ 'owner' => $owner,
+ 'ownerPath' => $ownerPath
+ );
}
/**
* unmount file from yourself
*/
- public static function postUmount($params) {
+ public static function postUnmount($params) {
+
+ $path = $params[\OC\Files\Filesystem::signal_param_path];
+ $user = \OCP\User::getUser();
- if (!isset(self::$umountedFiles[$params[\OC\Files\Filesystem::signal_param_path]])) {
+ if (!isset(self::$unmountedFiles[$path])) {
return true;
}
- $umountedFile = self::$umountedFiles[$params[\OC\Files\Filesystem::signal_param_path]];
- $path = $umountedFile['path'];
- $user = $umountedFile['uid'];
- $itemType = $umountedFile['itemType'];
+ $umountedFile = self::$unmountedFiles[$path];
+ $keyPath = $umountedFile['keyPath'];
+ $owner = $umountedFile['owner'];
+ $ownerPath = $umountedFile['ownerPath'];
$view = new \OC\Files\View();
- $util = new Util($view, $user);
// we don't need to remember the file any longer
- unset(self::$umountedFiles[$params[\OC\Files\Filesystem::signal_param_path]]);
-
- // if we unshare a folder we need a list of all (sub-)files
- if ($itemType === 'folder') {
- $allFiles = $util->getAllFiles($path);
- } else {
- $allFiles = array($path);
- }
-
- foreach ($allFiles as $path) {
+ unset(self::$unmountedFiles[$path]);
- // check if the user still has access to the file, otherwise delete share key
- $sharingUsers = \OCP\Share::getUsersSharingFile($path, $user);
- if (!in_array(\OCP\User::getUser(), $sharingUsers['users'])) {
- Keymanager::delShareKey($view, array(\OCP\User::getUser()), $path, $user);
- }
+ // check if the user still has access to the file, otherwise delete share key
+ $sharingUsers = \OCP\Share::getUsersSharingFile($path, $user);
+ if (!in_array($user, $sharingUsers['users'])) {
+ Keymanager::delShareKey($view, array($user), $keyPath, $owner, $ownerPath);
}
}
diff --git a/apps/files_encryption/lib/keymanager.php b/apps/files_encryption/lib/keymanager.php index 9560126ef33..925bba578f4 100644 --- a/apps/files_encryption/lib/keymanager.php +++ b/apps/files_encryption/lib/keymanager.php @@ -3,8 +3,9 @@ /** * ownCloud * - * @author Bjoern Schiessle - * @copyright 2012 Bjoern Schiessle <schiessle@owncloud.com> + * @copyright (C) 2014 ownCloud, Inc. + * + * @author Bjoern Schiessle <schiessle@owncloud.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE @@ -21,7 +22,7 @@ * */ -namespace OCA\Encryption; +namespace OCA\Files_Encryption; /** * Class to manage storage and retrieval of encryption keys @@ -29,48 +30,96 @@ namespace OCA\Encryption; */ class Keymanager { + // base dir where all the file related keys are stored + private static $keys_base_dir = '/files_encryption/keys/'; + private static $encryption_base_dir = '/files_encryption'; + private static $public_key_dir = '/files_encryption/public_keys'; + + private static $key_cache = array(); // cache keys + /** - * retrieve the ENCRYPTED private key from a user + * read key from hard disk * - * @param \OC\Files\View $view - * @param string $user - * @return string private key or false (hopefully) - * @note the key returned by this method must be decrypted before use + * @param string $path to key + * @return string|bool either the key or false */ - public static function getPrivateKey(\OC\Files\View $view, $user) { + private static function getKey($path, $view) { - $path = '/' . $user . '/' . 'files_encryption' . '/' . $user . '.private.key'; $key = false; - $proxyStatus = \OC_FileProxy::$enabled; - \OC_FileProxy::$enabled = false; + if (isset(self::$key_cache[$path])) { + $key = self::$key_cache[$path]; + } else { - if ($view->file_exists($path)) { - $key = $view->file_get_contents($path); - } + $proxyStatus = \OC_FileProxy::$enabled; + \OC_FileProxy::$enabled = false; - \OC_FileProxy::$enabled = $proxyStatus; + if ($view->file_exists($path)) { + $key = $view->file_get_contents($path); + self::$key_cache[$path] = $key; + } + + \OC_FileProxy::$enabled = $proxyStatus; + + } return $key; } /** - * retrieve public key for a specified user + * write key to disk + * + * + * @param string $path path to key directory + * @param string $name key name + * @param string $key key * @param \OC\Files\View $view - * @param string $userId - * @return string public key or false + * @return bool */ - public static function getPublicKey(\OC\Files\View $view, $userId) { - + private static function setKey($path, $name, $key, $view) { $proxyStatus = \OC_FileProxy::$enabled; \OC_FileProxy::$enabled = false; - $result = $view->file_get_contents('/public-keys/' . $userId . '.public.key'); + self::keySetPreparation($view, $path); + $pathToKey = \OC\Files\Filesystem::normalizePath($path . '/' . $name); + $result = $view->file_put_contents($pathToKey, $key); \OC_FileProxy::$enabled = $proxyStatus; - return $result; + if (is_int($result) && $result > 0) { + self::$key_cache[$pathToKey] = $key; + return true; + } + return false; + } + + /** + * retrieve the ENCRYPTED private key from a user + * + * @param \OC\Files\View $view + * @param string $user + * @return string private key or false (hopefully) + * @note the key returned by this method must be decrypted before use + */ + public static function getPrivateKey(\OC\Files\View $view, $user) { + $path = '/' . $user . '/' . 'files_encryption' . '/' . $user . '.privateKey'; + return self::getKey($path, $view); + } + + /** + * retrieve public key for a specified user + * @param \OC\Files\View $view + * @param string $userId + * @return string public key or false + */ + public static function getPublicKey(\OC\Files\View $view, $userId) { + $path = self::$public_key_dir . '/' . $userId . '.publicKey'; + return self::getKey($path, $view); + } + + public static function getPublicKeyPath() { + return self::$public_key_dir; } /** @@ -97,11 +146,8 @@ class Keymanager { public static function getPublicKeys(\OC\Files\View $view, array $userIds) { $keys = array(); - foreach ($userIds as $userId) { - $keys[$userId] = self::getPublicKey($view, $userId); - } return $keys; @@ -112,7 +158,7 @@ class Keymanager { * store file encryption key * * @param \OC\Files\View $view - * @param \OCA\Encryption\Util $util + * @param \OCA\Files_Encryption\Util $util * @param string $path relative path of the file, including filename * @param string $catfile keyfile content * @return bool true/false @@ -120,259 +166,238 @@ class Keymanager { * asymmetrically encrypt the keyfile before passing it to this method */ public static function setFileKey(\OC\Files\View $view, $util, $path, $catfile) { + $path = self::getKeyPath($view, $util, $path); + return self::setKey($path, 'fileKey', $catfile, $view); - $proxyStatus = \OC_FileProxy::$enabled; - \OC_FileProxy::$enabled = false; + } + + /** + * get path to key folder for a given file + * + * @param \OC\Files\View $view relative to data directory + * @param \OCA\Files_Encryption\Util $util + * @param string $path path to the file, relative to the users file directory + * @return string + */ + public static function getKeyPath($view, $util, $path) { + + if ($view->is_dir('/' . \OCP\User::getUser() . '/' . $path)) { + throw new Exception\EncryptionException('file was expected but directoy was given', Exception\EncryptionException::GENERIC); + } list($owner, $filename) = $util->getUidAndFilename($path); + $filename = Helper::stripPartialFileExtension($filename); + $filePath_f = ltrim($filename, '/'); // in case of system wide mount points the keys are stored directly in the data directory if ($util->isSystemWideMountPoint($filename)) { - $basePath = '/files_encryption/keyfiles'; + $keyPath = self::$keys_base_dir . $filePath_f . '/'; } else { - $basePath = '/' . $owner . '/files_encryption/keyfiles'; + $keyPath = '/' . $owner . self::$keys_base_dir . $filePath_f . '/'; } - $targetPath = self::keySetPreparation($view, $filename, $basePath); - - // try reusing key file if part file - if (Helper::isPartialFilePath($targetPath)) { + return $keyPath; + } - $result = $view->file_put_contents( - $basePath . '/' . Helper::stripPartialFileExtension($targetPath) . '.key', $catfile); + /** + * get path to file key for a given file + * + * @param \OC\Files\View $view relative to data directory + * @param \OCA\Files_Encryption\Util $util + * @param string $path path to the file, relative to the users file directory + * @return string + */ + public static function getFileKeyPath($view, $util, $path) { + $keyDir = self::getKeyPath($view, $util, $path); + return $keyDir . 'fileKey'; + } - } else { + /** + * get path to share key for a given user + * + * @param \OC\Files\View $view relateive to data directory + * @param \OCA\Files_Encryption\Util $util + * @param string $path path to file relative to the users files directoy + * @param string $uid user for whom we want the share-key path + * @retrun string + */ + public static function getShareKeyPath($view, $util, $path, $uid) { + $keyDir = self::getKeyPath($view, $util, $path); + return $keyDir . $uid . '.shareKey'; + } - $result = $view->file_put_contents($basePath . '/' . $targetPath . '.key', $catfile); + /** + * delete key + * + * @param \OC\Files\View $view + * @param string $path + * @return boolean + */ + private static function deleteKey($view, $path) { + $normalizedPath = \OC\Files\Filesystem::normalizePath($path); + $result = $view->unlink($normalizedPath); + if ($result) { + unset(self::$key_cache[$normalizedPath]); + return true; } - \OC_FileProxy::$enabled = $proxyStatus; + return false; + } + + /** + * delete public key from a given user + * + * @param \OC\Files\View $view + * @param string $uid user + * @return bool + */ + public static function deletePublicKey($view, $uid) { + + $result = false; + + if (!\OCP\User::userExists($uid)) { + $publicKey = self::$public_key_dir . '/' . $uid . '.publicKey'; + self::deleteKey($view, $publicKey); + } return $result; + } + /** + * check if public key for user exists + * + * @param \OC\Files\View $view + * @param string $uid + */ + public static function publicKeyExists($view, $uid) { + return $view->file_exists(self::$public_key_dir . '/'. $uid . '.publicKey'); } + + /** * retrieve keyfile for an encrypted file * @param \OC\Files\View $view - * @param \OCA\Encryption\Util $util + * @param \OCA\Files_Encryption\Util $util * @param string|false $filePath - * @internal param \OCA\Encryption\file $string name * @return string file key or false * @note The keyfile returned is asymmetrically encrypted. Decryption * of the keyfile must be performed by client code */ public static function getFileKey($view, $util, $filePath) { + $path = self::getFileKeyPath($view, $util, $filePath); + return self::getKey($path, $view); + } + /** + * store private key from the user + * @param string $key + * @return bool + * @note Encryption of the private key must be performed by client code + * as no encryption takes place here + */ + public static function setPrivateKey($key, $user = '') { - list($owner, $filename) = $util->getUidAndFilename($filePath); - $filename = Helper::stripPartialFileExtension($filename); - $filePath_f = ltrim($filename, '/'); - - // in case of system wide mount points the keys are stored directly in the data directory - if ($util->isSystemWideMountPoint($filename)) { - $keyfilePath = '/files_encryption/keyfiles/' . $filePath_f . '.key'; - } else { - $keyfilePath = '/' . $owner . '/files_encryption/keyfiles/' . $filePath_f . '.key'; - } - - $proxyStatus = \OC_FileProxy::$enabled; - \OC_FileProxy::$enabled = false; - - if ($view->file_exists($keyfilePath)) { - - $result = $view->file_get_contents($keyfilePath); - - } else { - - $result = false; - - } - - \OC_FileProxy::$enabled = $proxyStatus; + $user = $user === '' ? \OCP\User::getUser() : $user; + $path = '/' . $user . '/files_encryption'; + $header = Crypt::generateHeader(); - return $result; + return self::setKey($path, $user . '.privateKey', $header . $key, new \OC\Files\View()); } /** - * Delete a keyfile + * check if recovery key exists * * @param \OC\Files\View $view - * @param string $path path of the file the key belongs to - * @param string $userId the user to whom the file belongs - * @return bool Outcome of unlink operation - * @note $path must be relative to data/user/files. e.g. mydoc.txt NOT - * /data/admin/files/mydoc.txt + * @return bool */ - public static function deleteFileKey($view, $path, $userId=null) { + public static function recoveryKeyExists($view) { - $trimmed = ltrim($path, '/'); - - if ($trimmed === '') { - \OCP\Util::writeLog('Encryption library', - 'Can\'t delete file-key empty path given!', \OCP\Util::ERROR); - return false; - } + $result = false; - if ($userId === null) { - $userId = Helper::getUser($path); + $recoveryKeyId = Helper::getRecoveryKeyId(); + if ($recoveryKeyId) { + $result = ($view->file_exists(self::$public_key_dir . '/' . $recoveryKeyId . ".publicKey") + && $view->file_exists(self::$encryption_base_dir . '/' . $recoveryKeyId . ".privateKey")); } - $util = new Util($view, $userId); - if($util->isSystemWideMountPoint($path)) { - $keyPath = '/files_encryption/keyfiles/' . $trimmed; - } else { - $keyPath = '/' . $userId . '/files_encryption/keyfiles/' . $trimmed; - } + return $result; + } + public static function publicShareKeyExists($view) { $result = false; - $fileExists = $view->file_exists('/' . $userId . '/files/' . $trimmed); - if ($view->is_dir($keyPath) && !$fileExists) { - \OCP\Util::writeLog('files_encryption', 'deleteFileKey: delete file key: ' . $keyPath, \OCP\Util::DEBUG); - $result = $view->unlink($keyPath); - } elseif ($view->file_exists($keyPath . '.key') && !$fileExists) { - \OCP\Util::writeLog('files_encryption', 'deleteFileKey: delete file key: ' . $keyPath, \OCP\Util::DEBUG); - $result = $view->unlink($keyPath . '.key'); - - } + $publicShareKeyId = Helper::getPublicShareKeyId(); + if ($publicShareKeyId) { + $result = ($view->file_exists(self::$public_key_dir . '/' . $publicShareKeyId . ".publicKey") + && $view->file_exists(self::$encryption_base_dir . '/' . $publicShareKeyId . ".privateKey")); - if ($fileExists) { - \OCP\Util::writeLog('Encryption library', - 'Did not delete the file key, file still exists: ' . '/' . $userId . '/files/' . $trimmed, \OCP\Util::ERROR); - } elseif (!$result) { - \OCP\Util::writeLog('Encryption library', - 'Could not delete keyfile; does not exist: "' . $keyPath, \OCP\Util::ERROR); } return $result; - } /** - * store private key from the user + * store public key from the user * @param string $key + * @param string $user + * * @return bool - * @note Encryption of the private key must be performed by client code - * as no encryption takes place here */ - public static function setPrivateKey($key, $user = '') { + public static function setPublicKey($key, $user = '') { - if ($user === '') { - $user = \OCP\User::getUser(); - } - - $header = Crypt::generateHeader(); - - $view = new \OC\Files\View('/' . $user . '/files_encryption'); - - $proxyStatus = \OC_FileProxy::$enabled; - \OC_FileProxy::$enabled = false; - - if (!$view->file_exists('')) { - $view->mkdir(''); - } - - $result = $view->file_put_contents($user . '.private.key', $header . $key); - - \OC_FileProxy::$enabled = $proxyStatus; - - return $result; + $user = $user === '' ? \OCP\User::getUser() : $user; + return self::setKey(self::$public_key_dir, $user . '.publicKey', $key, new \OC\Files\View('/')); } /** * write private system key (recovery and public share key) to disk * * @param string $key encrypted key - * @param string $keyName name of the key file + * @param string $keyName name of the key * @return boolean */ public static function setPrivateSystemKey($key, $keyName) { + $keyName = $keyName . '.privateKey'; $header = Crypt::generateHeader(); - $view = new \OC\Files\View('/owncloud_private_key'); - - $proxyStatus = \OC_FileProxy::$enabled; - \OC_FileProxy::$enabled = false; - - if (!$view->file_exists('')) { - $view->mkdir(''); - } - - $result = $view->file_put_contents($keyName, $header . $key); - - \OC_FileProxy::$enabled = $proxyStatus; - - return $result; + return self::setKey(self::$encryption_base_dir, $keyName,$header . $key, new \OC\Files\View()); } /** - * store share key + * read private system key (recovery and public share key) from disk * - * @param \OC\Files\View $view - * @param string $path where the share key is stored - * @param string $shareKey - * @return bool true/false - * @note The keyfile is not encrypted here. Client code must - * asymmetrically encrypt the keyfile before passing it to this method + * @param string $keyName name of the key + * @return string|boolean private system key or false */ - private static function setShareKey(\OC\Files\View $view, $path, $shareKey) { - - $proxyStatus = \OC_FileProxy::$enabled; - \OC_FileProxy::$enabled = false; - - $result = $view->file_put_contents($path, $shareKey); - - \OC_FileProxy::$enabled = $proxyStatus; - - if (is_int($result) && $result > 0) { - return true; - } else { - return false; - } + public static function getPrivateSystemKey($keyName) { + $path = $keyName . '.privateKey'; + return self::getKey($path, new \OC\Files\View(self::$encryption_base_dir)); } /** * store multiple share keys for a single file * @param \OC\Files\View $view - * @param \OCA\Encryption\Util $util + * @param \OCA\Files_Encryption\Util $util * @param string $path * @param array $shareKeys * @return bool */ - public static function setShareKeys(\OC\Files\View $view, $util, $path, array $shareKeys) { - - // $shareKeys must be an array with the following format: - // [userId] => [encrypted key] - - list($owner, $filename) = $util->getUidAndFilename($path); + public static function setShareKeys($view, $util, $path, array $shareKeys) { // in case of system wide mount points the keys are stored directly in the data directory - if ($util->isSystemWideMountPoint($filename)) { - $basePath = '/files_encryption/share-keys'; - } else { - $basePath = '/' . $owner . '/files_encryption/share-keys'; - } + $basePath = Keymanager::getKeyPath($view, $util, $path); - $shareKeyPath = self::keySetPreparation($view, $filename, $basePath); + self::keySetPreparation($view, $basePath); $result = true; foreach ($shareKeys as $userId => $shareKey) { - - // try reusing key file if part file - if (Helper::isPartialFilePath($shareKeyPath)) { - $writePath = $basePath . '/' . Helper::stripPartialFileExtension($shareKeyPath) . '.' . $userId . '.shareKey'; - } else { - $writePath = $basePath . '/' . $shareKeyPath . '.' . $userId . '.shareKey'; - } - - if (!self::setShareKey($view, $writePath, $shareKey)) { - + if (!self::setKey($basePath, $userId . '.shareKey', $shareKey, $view)) { // If any of the keys are not set, flag false $result = false; } @@ -386,95 +411,15 @@ class Keymanager { * retrieve shareKey for an encrypted file * @param \OC\Files\View $view * @param string $userId - * @param \OCA\Encryption\Util $util + * @param \OCA\Files_Encryption\Util $util * @param string $filePath * @return string file key or false * @note The sharekey returned is encrypted. Decryption * of the keyfile must be performed by client code */ - public static function getShareKey(\OC\Files\View $view, $userId, $util, $filePath) { - - // try reusing key file if part file - $proxyStatus = \OC_FileProxy::$enabled; - \OC_FileProxy::$enabled = false; - - list($owner, $filename) = $util->getUidAndFilename($filePath); - $filename = Helper::stripPartialFileExtension($filename); - // in case of system wide mount points the keys are stored directly in the data directory - if ($util->isSystemWideMountPoint($filename)) { - $shareKeyPath = '/files_encryption/share-keys/' . $filename . '.' . $userId . '.shareKey'; - } else { - $shareKeyPath = '/' . $owner . '/files_encryption/share-keys/' . $filename . '.' . $userId . '.shareKey'; - } - - if ($view->file_exists($shareKeyPath)) { - - $result = $view->file_get_contents($shareKeyPath); - - } else { - - $result = false; - - } - - \OC_FileProxy::$enabled = $proxyStatus; - - return $result; - - } - - /** - * delete all share keys of a given file - * @param \OC\Files\View $view - * @param string $userId owner of the file - * @param string $filePath path to the file, relative to the owners file dir - */ - public static function delAllShareKeys($view, $userId, $filePath) { - - $filePath = ltrim($filePath, '/'); - - if ($view->file_exists('/' . $userId . '/files/' . $filePath)) { - \OCP\Util::writeLog('Encryption library', - 'File still exists, stop deleting share keys!', \OCP\Util::ERROR); - return false; - } - - if ($filePath === '') { - \OCP\Util::writeLog('Encryption library', - 'Can\'t delete share-keys empty path given!', \OCP\Util::ERROR); - return false; - } - - $util = new util($view, $userId); - - if ($util->isSystemWideMountPoint($filePath)) { - $baseDir = '/files_encryption/share-keys/'; - } else { - $baseDir = $userId . '/files_encryption/share-keys/'; - } - - $result = true; - - if ($view->is_dir($baseDir . $filePath)) { - \OCP\Util::writeLog('files_encryption', 'delAllShareKeys: delete share keys: ' . $baseDir . $filePath, \OCP\Util::DEBUG); - $result = $view->unlink($baseDir . $filePath); - } else { - $sharingEnabled = \OCP\Share::isEnabled(); - $users = $util->getSharingUsersArray($sharingEnabled, $filePath); - foreach($users as $user) { - $keyName = $baseDir . $filePath . '.' . $user . '.shareKey'; - if ($view->file_exists($keyName)) { - \OCP\Util::writeLog( - 'files_encryption', - 'dellAllShareKeys: delete share keys: "' . $keyName . '"', - \OCP\Util::DEBUG - ); - $result &= $view->unlink($keyName); - } - } - } - - return (bool)$result; + public static function getShareKey($view, $userId, $util, $filePath) { + $path = self::getShareKeyPath($view, $util, $filePath, $userId); + return self::getKey($path, $view); } /** @@ -482,45 +427,19 @@ class Keymanager { * * @param \OC\Files\View $view relative to data/ * @param array $userIds list of users we want to remove - * @param string $filename the owners name of the file for which we want to remove the users relative to data/user/files - * @param string $owner owner of the file + * @param string $keyPath + * @param string $owner the owner of the file + * @param string $ownerPath the owners name of the file for which we want to remove the users relative to data/user/files */ - public static function delShareKey($view, $userIds, $filename, $owner) { - - $proxyStatus = \OC_FileProxy::$enabled; - \OC_FileProxy::$enabled = false; - - $util = new Util($view, $owner); + public static function delShareKey($view, $userIds, $keysPath, $owner, $ownerPath) { - if ($util->isSystemWideMountPoint($filename)) { - $shareKeyPath = \OC\Files\Filesystem::normalizePath('/files_encryption/share-keys/' . $filename); - } else { - $shareKeyPath = \OC\Files\Filesystem::normalizePath('/' . $owner . '/files_encryption/share-keys/' . $filename); + $key = array_search($owner, $userIds, true); + if ($key !== false && $view->file_exists('/' . $owner . '/files/' . $ownerPath)) { + unset($userIds[$key]); } - if ($view->is_dir($shareKeyPath)) { + self::recursiveDelShareKeys($keysPath, $userIds, $view); - self::recursiveDelShareKeys($shareKeyPath, $userIds, $owner, $view); - - } else { - - foreach ($userIds as $userId) { - - if ($userId === $owner && $view->file_exists('/' . $owner . '/files/' . $filename)) { - \OCP\Util::writeLog('files_encryption', 'Tried to delete owner key, but the file still exists!', \OCP\Util::FATAL); - continue; - } - $result = $view->unlink($shareKeyPath . '.' . $userId . '.shareKey'); - \OCP\Util::writeLog('files_encryption', 'delShareKey: delete share key: ' . $shareKeyPath . '.' . $userId . '.shareKey' , \OCP\Util::DEBUG); - if (!$result) { - \OCP\Util::writeLog('Encryption library', - 'Could not delete shareKey; does not exist: "' . $shareKeyPath . '.' . $userId - . '.shareKey"', \OCP\Util::ERROR); - } - } - } - - \OC_FileProxy::$enabled = $proxyStatus; } /** @@ -528,35 +447,23 @@ class Keymanager { * * @param string $dir directory * @param array $userIds user ids for which the share keys should be deleted - * @param string $owner owner of the file * @param \OC\Files\View $view view relative to data/ */ - private static function recursiveDelShareKeys($dir, $userIds, $owner, $view) { + private static function recursiveDelShareKeys($dir, $userIds, $view) { $dirContent = $view->opendir($dir); - $dirSlices = explode('/', ltrim($dir, '/')); - $realFileDir = '/' . $owner . '/files/' . implode('/', array_slice($dirSlices, 3)) . '/'; if (is_resource($dirContent)) { while (($file = readdir($dirContent)) !== false) { if (!\OC\Files\Filesystem::isIgnoredDir($file)) { if ($view->is_dir($dir . '/' . $file)) { - self::recursiveDelShareKeys($dir . '/' . $file, $userIds, $owner, $view); + self::recursiveDelShareKeys($dir . '/' . $file, $userIds, $view); } else { foreach ($userIds as $userId) { - $fileNameFromShareKey = self::getFilenameFromShareKey($file, $userId); - if (!$fileNameFromShareKey) { - continue; + if ($userId . '.shareKey' === $file) { + \OCP\Util::writeLog('files_encryption', 'recursiveDelShareKey: delete share key: ' . $file, \OCP\Util::DEBUG); + self::deleteKey($view, $dir . '/' . $file); } - $realFile = $realFileDir . $fileNameFromShareKey; - - if ($userId === $owner && - $view->file_exists($realFile)) { - \OCP\Util::writeLog('files_encryption', 'original file still exists, keep owners share key!', \OCP\Util::ERROR); - continue; - } - \OCP\Util::writeLog('files_encryption', 'recursiveDelShareKey: delete share key: ' . $file, \OCP\Util::DEBUG); - $view->unlink($dir . '/' . $file); } } } @@ -567,21 +474,15 @@ class Keymanager { /** * Make preparations to vars and filesystem for saving a keyfile - * @param string|boolean $path + * + * @param \OC\Files\View $view + * @param string $path relatvie to the views root * @param string $basePath */ - protected static function keySetPreparation(\OC\Files\View $view, $path, $basePath) { - - $targetPath = ltrim($path, '/'); - - $path_parts = pathinfo($targetPath); - + protected static function keySetPreparation($view, $path) { // If the file resides within a subdirectory, create it - if ( - isset($path_parts['dirname']) - && !$view->file_exists($basePath . '/' . $path_parts['dirname']) - ) { - $sub_dirs = explode('/', $basePath . '/' . $path_parts['dirname']); + if (!$view->file_exists($path)) { + $sub_dirs = explode('/', $path); $dir = ''; foreach ($sub_dirs as $sub_dir) { $dir .= '/' . $sub_dir; @@ -590,27 +491,6 @@ class Keymanager { } } } - - return $targetPath; - } - /** - * extract filename from share key name - * @param string $shareKey (filename.userid.sharekey) - * @param string $userId - * @return string|false filename or false - */ - protected static function getFilenameFromShareKey($shareKey, $userId) { - $expectedSuffix = '.' . $userId . '.' . 'shareKey'; - $suffixLen = strlen($expectedSuffix); - - $suffix = substr($shareKey, -$suffixLen); - - if ($suffix !== $expectedSuffix) { - return false; - } - - return substr($shareKey, 0, -$suffixLen); - } } diff --git a/apps/files_encryption/lib/migration.php b/apps/files_encryption/lib/migration.php index 59389911b5b..1bab1dfe4a5 100644 --- a/apps/files_encryption/lib/migration.php +++ b/apps/files_encryption/lib/migration.php @@ -2,8 +2,9 @@ /** * ownCloud * - * @author Thomas Müller - * @copyright 2014 Thomas Müller deepdiver@owncloud.com + * @copyright (C) 2014 ownCloud, Inc. + * + * @author Bjoern Schiessle <schiessle@owncloud.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE @@ -25,26 +26,257 @@ namespace OCA\Files_Encryption; class Migration { - public function __construct($tableName = 'encryption') { - $this->tableName = $tableName; + /** + * @var \OC\Files\View + */ + private $view; + private $public_share_key_id; + private $recovery_key_id; + + public function __construct() { + $this->view = new \OC\Files\View(); + $this->public_share_key_id = Helper::getPublicShareKeyId(); + $this->recovery_key_id = Helper::getRecoveryKeyId(); + } + + public function reorganizeFolderStructure() { + + $this->createPathForKeys('/files_encryption'); + + // backup system wide folders + $this->backupSystemWideKeys(); + + // rename public keys + $this->renamePublicKeys(); + + // rename system wide mount point + $this->renameFileKeys('', '/files_encryption/keyfiles'); + + // rename system private keys + $this->renameSystemPrivateKeys(); + + // delete old system wide folders + $this->view->deleteAll('/public-keys'); + $this->view->deleteAll('/owncloud_private_key'); + $this->view->deleteAll('/files_encryption/share-keys'); + $this->view->deleteAll('/files_encryption/keyfiles'); + + $users = \OCP\User::getUsers(); + foreach ($users as $user) { + // backup all keys + if ($this->backupUserKeys($user)) { + // create new 'key' folder + $this->view->mkdir($user . '/files_encryption/keys'); + // rename users private key + $this->renameUsersPrivateKey($user); + // rename file keys + $path = $user . '/files_encryption/keyfiles'; + $this->renameFileKeys($user, $path); + $trashPath = $user . '/files_trashbin/keyfiles'; + if (\OC_App::isEnabled('files_trashbin') && $this->view->is_dir($trashPath)) { + $this->renameFileKeys($user, $trashPath, true); + $this->view->deleteAll($trashPath); + $this->view->deleteAll($user . '/files_trashbin/share-keys'); + } + // delete old folders + $this->deleteOldKeys($user); + } + } + } + + private function backupSystemWideKeys() { + $backupDir = 'encryption_migration_backup_' . date("Y-m-d_H-i-s"); + $this->view->mkdir($backupDir); + $this->view->copy('owncloud_private_key', $backupDir . '/owncloud_private_key'); + $this->view->copy('public-keys', $backupDir . '/public-keys'); + $this->view->copy('files_encryption', $backupDir . '/files_encryption'); + } + + private function backupUserKeys($user) { + $encryptionDir = $user . '/files_encryption'; + if ($this->view->is_dir($encryptionDir)) { + $backupDir = $user . '/encryption_migration_backup_' . date("Y-m-d_H-i-s"); + $this->view->mkdir($backupDir); + $this->view->copy($encryptionDir, $backupDir); + return true; + } + return false; + } + + private function renamePublicKeys() { + $dh = $this->view->opendir('public-keys'); + + $this->createPathForKeys('files_encryption/public_keys'); + + if (is_resource($dh)) { + while (($oldPublicKey = readdir($dh)) !== false) { + if (!\OC\Files\Filesystem::isIgnoredDir($oldPublicKey)) { + $newPublicKey = substr($oldPublicKey, 0, strlen($oldPublicKey) - strlen('.public.key')) . '.publicKey'; + $this->view->rename('public-keys/' . $oldPublicKey , 'files_encryption/public_keys/' . $newPublicKey); + } + } + closedir($dh); + } + } + + private function renameSystemPrivateKeys() { + $dh = $this->view->opendir('owncloud_private_key'); + + if (is_resource($dh)) { + while (($oldPrivateKey = readdir($dh)) !== false) { + if (!\OC\Files\Filesystem::isIgnoredDir($oldPrivateKey)) { + $newPrivateKey = substr($oldPrivateKey, 0, strlen($oldPrivateKey) - strlen('.private.key')) . '.privateKey'; + $this->view->rename('owncloud_private_key/' . $oldPrivateKey , 'files_encryption/' . $newPrivateKey); + } + } + closedir($dh); + } + } + + private function renameUsersPrivateKey($user) { + $oldPrivateKey = $user . '/files_encryption/' . $user . '.private.key'; + $newPrivateKey = substr($oldPrivateKey, 0, strlen($oldPrivateKey) - strlen('.private.key')) . '.privateKey'; + + $this->view->rename($oldPrivateKey, $newPrivateKey); + } + + private function getFileName($file, $trash) { + + $extLength = strlen('.key'); + + if ($trash) { + $parts = explode('.', $file); + if ($parts[count($parts) - 1] !== 'key') { + $extLength = $extLength + strlen('.' . $parts[count($parts) - 1]); + } + } + + $filename = substr($file, 0, strlen($file) - $extLength); + + return $filename; + } + + private function getExtension($file, $trash) { + + $extension = ''; + + if ($trash) { + $parts = explode('.', $file); + if ($parts[count($parts) - 1] !== 'key') { + $extension = '.' . $parts[count($parts) - 1]; + } + } + + return $extension; + } + + private function getFilePath($path, $user, $trash) { + $offset = $trash ? strlen($user . '/files_trashbin/keyfiles') : strlen($user . '/files_encryption/keyfiles'); + return substr($path, $offset); + } + + private function getTargetDir($user, $filePath, $filename, $extension, $trash) { + if ($trash) { + $targetDir = $user . '/files_trashbin/keys/' . $filePath . '/' . $filename . $extension; + } else { + $targetDir = $user . '/files_encryption/keys/' . $filePath . '/' . $filename . $extension; + } + + return $targetDir; + } + + private function renameFileKeys($user, $path, $trash = false) { + + $dh = $this->view->opendir($path); + + if (is_resource($dh)) { + while (($file = readdir($dh)) !== false) { + if (!\OC\Files\Filesystem::isIgnoredDir($file)) { + if ($this->view->is_dir($path . '/' . $file)) { + $this->renameFileKeys($user, $path . '/' . $file, $trash); + } else { + $filename = $this->getFileName($file, $trash); + $filePath = $this->getFilePath($path, $user, $trash); + $extension = $this->getExtension($file, $trash); + $targetDir = $this->getTargetDir($user, $filePath, $filename, $extension, $trash); + $this->createPathForKeys($targetDir); + $this->view->copy($path . '/' . $file, $targetDir . '/fileKey'); + $this->renameShareKeys($user, $filePath, $filename, $targetDir, $trash); + } + } + } + closedir($dh); + } } - // migrate settings from oc_encryption to oc_preferences - public function dropTableEncryption() { - $tableName = $this->tableName; - if (!\OC_DB::tableExists($tableName)) { - return; + private function getOldShareKeyPath($user, $filePath, $trash) { + if ($trash) { + $oldShareKeyPath = $user . '/files_trashbin/share-keys/' . $filePath; + } else { + $oldShareKeyPath = $user . '/files_encryption/share-keys/' . $filePath; } - $sql = "select `uid`, max(`recovery_enabled`) as `recovery_enabled`, min(`migration_status`) as `migration_status` from `*PREFIX*$tableName` group by `uid`"; - $query = \OCP\DB::prepare($sql); - $result = $query->execute(array())->fetchAll(); - foreach ($result as $row) { - \OC_Preferences::setValue($row['uid'], 'files_encryption', 'recovery_enabled', $row['recovery_enabled']); - \OC_Preferences::setValue($row['uid'], 'files_encryption', 'migration_status', $row['migration_status']); + return $oldShareKeyPath; + } + + private function getUidFromShareKey($file, $filename, $trash) { + $extLength = strlen('.shareKey'); + if ($trash) { + $parts = explode('.', $file); + if ($parts[count($parts) - 1] !== 'shareKey') { + $extLength = $extLength + strlen('.' . $parts[count($parts) - 1]); + } } - \OC_DB::dropTable($tableName); + $uid = substr($file, strlen($filename) + 1, $extLength * -1); + + return $uid; } + private function renameShareKeys($user, $filePath, $filename, $target, $trash) { + $oldShareKeyPath = $this->getOldShareKeyPath($user, $filePath, $trash); + $dh = $this->view->opendir($oldShareKeyPath); + + if (is_resource($dh)) { + while (($file = readdir($dh)) !== false) { + if (!\OC\Files\Filesystem::isIgnoredDir($file)) { + if ($this->view->is_dir($oldShareKeyPath . '/' . $file)) { + continue; + } else { + if (substr($file, 0, strlen($filename) +1) === $filename . '.') { + + $uid = $this->getUidFromShareKey($file, $filename, $trash); + if ($uid === $this->public_share_key_id || + $uid === $this->recovery_key_id || + \OCP\User::userExists($uid)) { + $this->view->copy($oldShareKeyPath . '/' . $file, $target . '/' . $uid . '.shareKey'); + } + } + } + + } + } + closedir($dh); + } + } + + private function deleteOldKeys($user) { + $this->view->deleteAll($user . '/files_encryption/keyfiles'); + $this->view->deleteAll($user . '/files_encryption/share-keys'); + } + + private function createPathForKeys($path) { + if (!$this->view->file_exists($path)) { + $sub_dirs = explode('/', $path); + $dir = ''; + foreach ($sub_dirs as $sub_dir) { + $dir .= '/' . $sub_dir; + if (!$this->view->is_dir($dir)) { + $this->view->mkdir($dir); + } + } + } + } + + } diff --git a/apps/files_encryption/lib/proxy.php b/apps/files_encryption/lib/proxy.php index 3b9dcbe7767..ba78c81aa35 100644 --- a/apps/files_encryption/lib/proxy.php +++ b/apps/files_encryption/lib/proxy.php @@ -3,10 +3,11 @@ /** * ownCloud * - * @author Bjoern Schiessle, Sam Tuke, Robin Appelman - * @copyright 2012 Sam Tuke <samtuke@owncloud.com> - * 2012 Robin Appelman <icewind1991@gmail.com> - * 2014 Bjoern Schiessle <schiessle@owncloud.com> + * @copyright (C) 2014 ownCloud, Inc. + * + * @author Bjoern Schiessle <schiessle@owncloud.com> + * @author Sam Tuke <samtuke@owncloud.com> + * @author Robin Appelman <icewind1991@gmail.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE @@ -29,11 +30,11 @@ * webui. */ -namespace OCA\Encryption; +namespace OCA\Files_Encryption; /** * Class Proxy - * @package OCA\Encryption + * @package OCA\Files_Encryption */ class Proxy extends \OC_FileProxy { @@ -91,12 +92,10 @@ class Proxy extends \OC_FileProxy { private function shouldEncrypt($path, $mode = 'w') { $userId = Helper::getUser($path); - $session = new Session(new \OC\Files\View()); // don't call the crypt stream wrapper, if... if ( - $session->getInitialized() !== Session::INIT_SUCCESSFUL // encryption successful initialized - || Crypt::mode() !== 'server' // we are not in server-side-encryption mode + Crypt::mode() !== 'server' // we are not in server-side-encryption mode || $this->isExcludedPath($path, $userId) // if path is excluded from encryption || substr($path, 0, 8) === 'crypt://' // we are already in crypt mode ) { @@ -131,7 +130,7 @@ class Proxy extends \OC_FileProxy { $view = new \OC\Files\View('/'); // get relative path - $relativePath = \OCA\Encryption\Helper::stripUserFilesPath($path); + $relativePath = Helper::stripUserFilesPath($path); if (!isset($relativePath)) { return true; @@ -206,11 +205,11 @@ class Proxy extends \OC_FileProxy { public function postFile_get_contents($path, $data) { $plainData = null; - $view = new \OC\Files\View('/'); // If data is a catfile if ( Crypt::mode() === 'server' + && $this->shouldEncrypt($path) && Crypt::isCatfileContent($data) ) { @@ -339,15 +338,15 @@ class Proxy extends \OC_FileProxy { } // get relative path - $relativePath = \OCA\Encryption\Helper::stripUserFilesPath($path); + $relativePath = Helper::stripUserFilesPath($path); // if path is empty we cannot resolve anything if (empty($relativePath)) { return $size; } - // get file info from database/cache if not .part file - if (empty($fileInfo) && !Helper::isPartialFilePath($path)) { + // get file info from database/cache + if (empty($fileInfo)) { $proxyState = \OC_FileProxy::$enabled; \OC_FileProxy::$enabled = false; $fileInfo = $view->getFileInfo($path); diff --git a/apps/files_encryption/lib/session.php b/apps/files_encryption/lib/session.php index 7bd4fd02421..4c70bc7e8fc 100644 --- a/apps/files_encryption/lib/session.php +++ b/apps/files_encryption/lib/session.php @@ -2,8 +2,10 @@ /** * ownCloud * - * @author Sam Tuke - * @copyright 2012 Sam Tuke samtuke@owncloud.com + * @copyright (C) 2014 ownCloud, Inc. + * + * @author Sam Tuke <samtuke@owncloud.com> + * @author Bjoern Schiessle <schiessle@owncloud.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE @@ -20,7 +22,7 @@ * */ -namespace OCA\Encryption; +namespace OCA\Files_Encryption; /** * Class for handling encryption related session data @@ -29,6 +31,7 @@ namespace OCA\Encryption; class Session { private $view; + private static $publicShareKey = false; const NOT_INITIALIZED = '0'; const INIT_EXECUTED = '1'; @@ -45,64 +48,48 @@ class Session { $this->view = $view; - if (!$this->view->is_dir('owncloud_private_key')) { + if (!$this->view->is_dir('files_encryption')) { - $this->view->mkdir('owncloud_private_key'); + $this->view->mkdir('files_encryption'); } $appConfig = \OC::$server->getAppConfig(); - $publicShareKeyId = $appConfig->getValue('files_encryption', 'publicShareKeyId'); + $publicShareKeyId = Helper::getPublicShareKeyId(); - if ($publicShareKeyId === null) { + if ($publicShareKeyId === false) { $publicShareKeyId = 'pubShare_' . substr(md5(time()), 0, 8); $appConfig->setValue('files_encryption', 'publicShareKeyId', $publicShareKeyId); } - if ( - !$this->view->file_exists("/public-keys/" . $publicShareKeyId . ".public.key") - || !$this->view->file_exists("/owncloud_private_key/" . $publicShareKeyId . ".private.key") - ) { + if (!Keymanager::publicShareKeyExists($view)) { $keypair = Crypt::createKeypair(); - // Disable encryption proxy to prevent recursive calls - $proxyStatus = \OC_FileProxy::$enabled; - \OC_FileProxy::$enabled = false; // Save public key - - if (!$view->is_dir('/public-keys')) { - $view->mkdir('/public-keys'); - } - - $this->view->file_put_contents('/public-keys/' . $publicShareKeyId . '.public.key', $keypair['publicKey']); + Keymanager::setPublicKey($keypair['publicKey'], $publicShareKeyId); // Encrypt private key empty passphrase - $cipher = \OCA\Encryption\Helper::getCipher(); - $encryptedKey = \OCA\Encryption\Crypt::symmetricEncryptFileContent($keypair['privateKey'], '', $cipher); + $cipher = Helper::getCipher(); + $encryptedKey = Crypt::symmetricEncryptFileContent($keypair['privateKey'], '', $cipher); if ($encryptedKey) { - Keymanager::setPrivateSystemKey($encryptedKey, $publicShareKeyId . '.private.key'); + Keymanager::setPrivateSystemKey($encryptedKey, $publicShareKeyId); } else { \OCP\Util::writeLog('files_encryption', 'Could not create public share keys', \OCP\Util::ERROR); } - \OC_FileProxy::$enabled = $proxyStatus; - } - if (\OCA\Encryption\Helper::isPublicAccess()) { + if (Helper::isPublicAccess() && !self::getPublicSharePrivateKey()) { // Disable encryption proxy to prevent recursive calls $proxyStatus = \OC_FileProxy::$enabled; \OC_FileProxy::$enabled = false; - $encryptedKey = $this->view->file_get_contents( - '/owncloud_private_key/' . $publicShareKeyId . '.private.key'); + $encryptedKey = Keymanager::getPrivateSystemKey($publicShareKeyId); $privateKey = Crypt::decryptPrivateKey($encryptedKey, ''); - $this->setPublicSharePrivateKey($privateKey); - - $this->setInitialized(\OCA\Encryption\Session::INIT_SUCCESSFUL); + self::setPublicSharePrivateKey($privateKey); \OC_FileProxy::$enabled = $proxyStatus; } @@ -127,8 +114,8 @@ class Session { * remove keys from session */ public function removeKeys() { - \OC::$session->remove('publicSharePrivateKey'); - \OC::$session->remove('privateKey'); + \OC::$server->getSession()->remove('publicSharePrivateKey'); + \OC::$server->getSession()->remove('privateKey'); } /** @@ -164,6 +151,8 @@ class Session { public function getInitialized() { if (!is_null(\OC::$server->getSession()->get('encryptionInitialized'))) { return \OC::$server->getSession()->get('encryptionInitialized'); + } else if (Helper::isPublicAccess() && self::getPublicSharePrivateKey()) { + return self::INIT_SUCCESSFUL; } else { return self::NOT_INITIALIZED; } @@ -176,8 +165,8 @@ class Session { */ public function getPrivateKey() { // return the public share private key if this is a public access - if (\OCA\Encryption\Helper::isPublicAccess()) { - return $this->getPublicSharePrivateKey(); + if (Helper::isPublicAccess()) { + return self::getPublicSharePrivateKey(); } else { if (!is_null(\OC::$server->getSession()->get('privateKey'))) { return \OC::$server->getSession()->get('privateKey'); @@ -192,12 +181,9 @@ class Session { * @param string $privateKey * @return bool */ - public function setPublicSharePrivateKey($privateKey) { - - \OC::$server->getSession()->set('publicSharePrivateKey', $privateKey); - + private static function setPublicSharePrivateKey($privateKey) { + self::$publicShareKey = $privateKey; return true; - } /** @@ -205,13 +191,8 @@ class Session { * @return string $privateKey * */ - public function getPublicSharePrivateKey() { - - if (!is_null(\OC::$server->getSession()->get('publicSharePrivateKey'))) { - return \OC::$server->getSession()->get('publicSharePrivateKey'); - } else { - return false; - } + private static function getPublicSharePrivateKey() { + return self::$publicShareKey; } } diff --git a/apps/files_encryption/lib/stream.php b/apps/files_encryption/lib/stream.php index f74812a7253..17da4eb1cdc 100644 --- a/apps/files_encryption/lib/stream.php +++ b/apps/files_encryption/lib/stream.php @@ -2,10 +2,11 @@ /** * ownCloud * - * @author Bjoern Schiessle, Robin Appelman - * @copyright 2014 Bjoern Schiessle <schiessle@owncloud.com> - * 2012 Sam Tuke <samtuke@owncloud.com>, - * 2011 Robin Appelman <icewind1991@gmail.com> + * @copyright (C) 2014 ownCloud, Inc. + * + * @author Bjoern Schiessle <schiessle@owncloud.com> + * @author Robin Appelman <icewind@owncloud.com> + * @author Sam Tuke <samtuke@owncloud.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE @@ -29,7 +30,9 @@ * and then fopen('crypt://streams/foo'); */ -namespace OCA\Encryption; +namespace OCA\Files_Encryption; + +use OCA\Files_Encryption\Exception\EncryptionException; /** * Provides 'crypt://' stream wrapper protocol. @@ -79,7 +82,7 @@ class Stream { private $rootView; // a fsview object set to '/' /** - * @var \OCA\Encryption\Session + * @var \OCA\Files_Encryption\Session */ private $session; private $privateKey; @@ -90,6 +93,7 @@ class Stream { * @param int $options * @param string $opened_path * @return bool + * @throw \OCA\Files_Encryption\Exception\EncryptionException */ public function stream_open($path, $mode, $options, &$opened_path) { @@ -103,9 +107,13 @@ class Stream { $this->rootView = new \OC\Files\View('/'); } - $this->session = new \OCA\Encryption\Session($this->rootView); + $this->session = new Session($this->rootView); $this->privateKey = $this->session->getPrivateKey(); + if ($this->privateKey === false) { + throw new EncryptionException('Session does not contain a private key, maybe your login password changed?', + EncryptionException::PRIVATE_KEY_MISSING); + } $normalizedPath = \OC\Files\Filesystem::normalizePath(str_replace('crypt://', '', $path)); if ($originalFile = Helper::getPathFromTmpFile($normalizedPath)) { @@ -155,7 +163,7 @@ class Stream { if($this->privateKey === false) { // if private key is not valid redirect user to a error page - \OCA\Encryption\Helper::redirectToErrorPage($this->session); + Helper::redirectToErrorPage($this->session); } $this->size = $this->rootView->filesize($this->rawPath); @@ -244,7 +252,7 @@ class Stream { /** * @param int $count * @return bool|string - * @throws \OCA\Encryption\Exceptions\EncryptionException + * @throws \OCA\Files_Encryption\Exception\EncryptionException */ public function stream_read($count) { @@ -252,7 +260,7 @@ class Stream { if ($count !== Crypt::BLOCKSIZE) { \OCP\Util::writeLog('Encryption library', 'PHP "bug" 21641 no longer holds, decryption system requires refactoring', \OCP\Util::FATAL); - throw new \OCA\Encryption\Exceptions\EncryptionException('expected a blog size of 8192 byte', 20); + throw new EncryptionException('expected a blog size of 8192 byte', EncryptionException::UNEXPECTED_BLOG_SIZE); } // Get the data from the file handle @@ -322,7 +330,7 @@ class Stream { // Fetch and decrypt keyfile // Fetch existing keyfile - $util = new \OCA\Encryption\Util($this->rootView, $this->userId); + $util = new Util($this->rootView, $this->userId); $this->encKeyfile = Keymanager::getFileKey($this->rootView, $util, $this->relPath); // If a keyfile already exists @@ -333,13 +341,13 @@ class Stream { // if there is no valid private key return false if ($this->privateKey === false) { // if private key is not valid redirect user to a error page - \OCA\Encryption\Helper::redirectToErrorPage($this->session); + Helper::redirectToErrorPage($this->session); return false; } if ($shareKey === false) { // if no share key is available redirect user to a error page - \OCA\Encryption\Helper::redirectToErrorPage($this->session, \OCA\Encryption\Crypt::ENCRYPTION_NO_SHARE_KEY_FOUND); + Helper::redirectToErrorPage($this->session, Crypt::ENCRYPTION_NO_SHARE_KEY_FOUND); return false; } @@ -360,14 +368,14 @@ class Stream { /** * write header at beginning of encrypted file * - * @throws Exceptions\EncryptionException + * @throws \OCA\Files_Encryption\Exception\EncryptionException */ private function writeHeader() { $header = Crypt::generateHeader(); if (strlen($header) > Crypt::BLOCKSIZE) { - throw new Exceptions\EncryptionException('max header size exceeded', 30); + throw new EncryptionException('max header size exceeded', EncryptionException::ENCRYPTION_HEADER_TO_LARGE); } $paddedHeader = str_pad($header, Crypt::BLOCKSIZE, self::PADDING_CHAR, STR_PAD_RIGHT); @@ -573,6 +581,7 @@ class Stream { \OC_FileProxy::$enabled = false; if ($this->rootView->file_exists($this->rawPath) && $this->size === 0) { + fclose($this->handle); $this->rootView->unlink($this->rawPath); } @@ -581,7 +590,7 @@ class Stream { } // if private key is not valid redirect user to a error page - \OCA\Encryption\Helper::redirectToErrorPage($this->session); + Helper::redirectToErrorPage($this->session); } if ( @@ -632,13 +641,17 @@ class Stream { $path = Helper::stripPartialFileExtension($this->rawPath); $fileInfo = array( + 'mimetype' => $this->rootView->getMimeType($this->rawPath), 'encrypted' => true, - 'size' => $this->size, 'unencrypted_size' => $this->unencryptedSize, ); - // set fileinfo - $this->rootView->putFileInfo($path, $fileInfo); + // if we write a part file we also store the unencrypted size for + // the part file so that it can be re-used later + $this->rootView->putFileInfo($this->rawPath, $fileInfo); + if ($path !== $this->rawPath) { + $this->rootView->putFileInfo($path, $fileInfo); + } } diff --git a/apps/files_encryption/lib/util.php b/apps/files_encryption/lib/util.php index ce5e8c8b54c..4aaf7aa2571 100644 --- a/apps/files_encryption/lib/util.php +++ b/apps/files_encryption/lib/util.php @@ -2,10 +2,11 @@ /** * ownCloud * - * @author Sam Tuke, Frank Karlitschek, Bjoern Schiessle - * @copyright 2012 Sam Tuke <samtuke@owncloud.com>, - * Frank Karlitschek <frank@owncloud.org>, - * Bjoern Schiessle <schiessle@owncloud.com> + * @copyright (C) 2014 ownCloud, Inc. + * + * @author Sam Tuke <samtuke@owncloud.com>, + * @author Frank Karlitschek <frank@owncloud.org>, + * @author Bjoern Schiessle <schiessle@owncloud.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE @@ -22,7 +23,7 @@ * */ -namespace OCA\Encryption; +namespace OCA\Files_Encryption; /** * Class for utilities relating to encrypted file storage system @@ -44,10 +45,10 @@ class Util { private $client; // Client side encryption mode flag private $publicKeyDir; // Dir containing all public user keys private $encryptionDir; // Dir containing user's files_encryption - private $keyfilesPath; // Dir containing user's keyfiles - private $shareKeysPath; // Dir containing env keys for shared files + private $keysPath; // Dir containing all file related encryption keys private $publicKeyPath; // Path to user's public key private $privateKeyPath; // Path to user's private key + private $userFilesDir; private $publicShareKeyId; private $recoveryKeyId; private $isPublic; @@ -72,18 +73,17 @@ class Util { $this->fileFolderName = 'files'; $this->userFilesDir = '/' . $userId . '/' . $this->fileFolderName; // TODO: Does this need to be user configurable? - $this->publicKeyDir = '/' . 'public-keys'; + $this->publicKeyDir = Keymanager::getPublicKeyPath(); $this->encryptionDir = '/' . $this->userId . '/' . 'files_encryption'; - $this->keyfilesPath = $this->encryptionDir . '/' . 'keyfiles'; - $this->shareKeysPath = $this->encryptionDir . '/' . 'share-keys'; + $this->keysPath = $this->encryptionDir . '/' . 'keys'; $this->publicKeyPath = - $this->publicKeyDir . '/' . $this->userId . '.public.key'; // e.g. data/public-keys/admin.public.key + $this->publicKeyDir . '/' . $this->userId . '.publicKey'; // e.g. data/public-keys/admin.publicKey $this->privateKeyPath = - $this->encryptionDir . '/' . $this->userId . '.private.key'; // e.g. data/admin/admin.private.key + $this->encryptionDir . '/' . $this->userId . '.privateKey'; // e.g. data/admin/admin.privateKey // make sure that the owners home is mounted \OC\Files\Filesystem::initMountPoints($userId); - if (\OCA\Encryption\Helper::isPublicAccess()) { + if (Helper::isPublicAccess()) { $this->keyId = $this->publicShareKeyId; $this->isPublic = true; } else { @@ -99,8 +99,7 @@ class Util { if ( !$this->view->file_exists($this->encryptionDir) - or !$this->view->file_exists($this->keyfilesPath) - or !$this->view->file_exists($this->shareKeysPath) + or !$this->view->file_exists($this->keysPath) or !$this->view->file_exists($this->publicKeyPath) or !$this->view->file_exists($this->privateKeyPath) ) { @@ -125,6 +124,18 @@ class Util { } /** + * create a new public/private key pair for the user + * + * @param string $password password for the private key + */ + public function replaceUserKeys($password) { + $this->backupAllKeys('password_reset'); + $this->view->unlink($this->publicKeyPath); + $this->view->unlink($this->privateKeyPath); + $this->setupServerSide($password); + } + + /** * Sets up user folders and keys for serverside encryption * * @param string $passphrase to encrypt server-stored private key with @@ -137,8 +148,7 @@ class Util { $this->userDir, $this->publicKeyDir, $this->encryptionDir, - $this->keyfilesPath, - $this->shareKeysPath + $this->keysPath ); // Check / create all necessary dirs @@ -215,7 +225,7 @@ class Util { */ public function recoveryEnabledForUser() { - $recoveryMode = \OC_Preferences::getValue($this->userId, 'files_encryption', 'recovery_enabled', '0'); + $recoveryMode = \OC::$server->getConfig()->getUserValue($this->userId, 'files_encryption', 'recovery_enabled', '0'); return ($recoveryMode === '1') ? true : false; @@ -229,7 +239,12 @@ class Util { public function setRecoveryForUser($enabled) { $value = $enabled ? '1' : '0'; - return \OC_Preferences::setValue($this->userId, 'files_encryption', 'recovery_enabled', $value); + try { + \OC::$server->getConfig()->setUserValue($this->userId, 'files_encryption', 'recovery_enabled', $value); + return true; + } catch(\OCP\PreConditionNotMetException $e) { + return false; + } } @@ -262,7 +277,7 @@ class Util { if ($file !== "." && $file !== "..") { $filePath = $directory . '/' . $this->view->getRelativePath('/' . $file); - $relPath = \OCA\Encryption\Helper::stripUserFilesPath($filePath); + $relPath = Helper::stripUserFilesPath($filePath); // If the path is a directory, search // its contents @@ -436,13 +451,13 @@ class Util { } } fclose($stream); - $relPath = \OCA\Encryption\Helper::stripUserFilesPath($path); + $relPath = Helper::stripUserFilesPath($path); $shareKey = Keymanager::getShareKey($this->view, $this->keyId, $this, $relPath); if($shareKey===false) { \OC_FileProxy::$enabled = $proxyStatus; return $result; } - $session = new \OCA\Encryption\Session($this->view); + $session = new Session($this->view); $privateKey = $session->getPrivateKey(); $plainKeyfile = $this->decryptKeyfile($relPath, $privateKey); $plainKey = Crypt::multiKeyDecrypt($plainKeyfile, $shareKey, $privateKey); @@ -715,8 +730,8 @@ class Util { } if ($successful) { - $this->view->rename($this->keyfilesPath, $this->keyfilesPath . '.backup'); - $this->view->rename($this->shareKeysPath, $this->shareKeysPath . '.backup'); + $this->backupAllKeys('decryptAll'); + $this->view->deleteAll($this->keysPath); } \OC_FileProxy::$enabled = true; @@ -833,9 +848,9 @@ class Util { break; - case 'keyfilesPath': + case 'keysPath': - return $this->keyfilesPath; + return $this->keysPath; break; @@ -857,6 +872,25 @@ class Util { } /** + * Returns whether the given user is ready for encryption. + * Also returns true if the given user is the public user + * or the recovery key user. + * + * @param string $user user to check + * + * @return boolean true if the user is ready, false otherwise + */ + private function isUserReady($user) { + if ($user === $this->publicShareKeyId + || $user === $this->recoveryKeyId + ) { + return true; + } + $util = new Util($this->view, $user); + return $util->ready(); + } + + /** * Filter an array of UIDs to return only ones ready for sharing * @param array $unfilteredUsers users to be checked for sharing readiness * @return array as multi-dimensional array. keys: ready, unready @@ -868,16 +902,9 @@ class Util { // Loop through users and create array of UIDs that need new keyfiles foreach ($unfilteredUsers as $user) { - - $util = new Util($this->view, $user); - // Check that the user is encryption capable, or is the - // public system user 'ownCloud' (for public shares) - if ( - $user === $this->publicShareKeyId - or $user === $this->recoveryKeyId - or $util->ready() - ) { + // public system user (for public shares) + if ($this->isUserReady($user)) { // Construct array of ready UIDs for Keymanager{} $readyIds[] = $user; @@ -960,7 +987,7 @@ class Util { $plainKeyfile = $this->decryptKeyfile($filePath, $privateKey); // Re-enc keyfile to (additional) sharekeys $multiEncKey = Crypt::multiKeyEncrypt($plainKeyfile, $userPubKeys); - } catch (Exceptions\EncryptionException $e) { + } catch (Exception\EncryptionException $e) { $msg = 'set shareFileKeyFailed (code: ' . $e->getCode() . '): ' . $e->getMessage(); \OCP\Util::writeLog('files_encryption', $msg, \OCP\Util::FATAL); return false; @@ -1013,7 +1040,7 @@ class Util { // Make sure that a share key is generated for the owner too list($owner, $ownerPath) = $this->getUidAndFilename($filePath); - $ownerPath = \OCA\Encryption\Helper::stripPartialFileExtension($ownerPath); + $ownerPath = Helper::stripPartialFileExtension($ownerPath); // always add owner to the list of users with access to the file $userIds = array($owner); @@ -1080,7 +1107,12 @@ class Util { // convert to string if preCondition is set $preCondition = ($preCondition === null) ? null : (string)$preCondition; - return \OC_Preferences::setValue($this->userId, 'files_encryption', 'migration_status', (string)$status, $preCondition); + try { + \OC::$server->getConfig()->setUserValue($this->userId, 'files_encryption', 'migration_status', (string)$status, $preCondition); + return true; + } catch(\OCP\PreConditionNotMetException $e) { + return false; + } } @@ -1132,9 +1164,9 @@ class Util { $migrationStatus = false; if (\OCP\User::userExists($this->userId)) { - $migrationStatus = \OC_Preferences::getValue($this->userId, 'files_encryption', 'migration_status'); + $migrationStatus = \OC::$server->getConfig()->getUserValue($this->userId, 'files_encryption', 'migration_status', null); if ($migrationStatus === null) { - \OC_Preferences::setValue($this->userId, 'files_encryption', 'migration_status', (string)self::MIGRATION_OPEN); + \OC::$server->getConfig()->setUserValue($this->userId, 'files_encryption', 'migration_status', (string)self::MIGRATION_OPEN); $migrationStatus = self::MIGRATION_OPEN; } } @@ -1175,13 +1207,7 @@ class Util { // handle public access if ($this->isPublic) { - $filename = $path; - $fileOwnerUid = $this->userId; - - return array( - $fileOwnerUid, - $filename - ); + return array($this->userId, $path); } else { // Check that UID is valid @@ -1341,22 +1367,14 @@ class Util { public function checkRecoveryPassword($password) { $result = false; - $pathKey = '/owncloud_private_key/' . $this->recoveryKeyId . ".private.key"; - - $proxyStatus = \OC_FileProxy::$enabled; - \OC_FileProxy::$enabled = false; - - $recoveryKey = $this->view->file_get_contents($pathKey); + $recoveryKey = Keymanager::getPrivateSystemKey($this->recoveryKeyId); $decryptedRecoveryKey = Crypt::decryptPrivateKey($recoveryKey, $password); if ($decryptedRecoveryKey) { $result = true; } - \OC_FileProxy::$enabled = $proxyStatus; - - return $result; } @@ -1371,19 +1389,17 @@ class Util { * add recovery key to all encrypted files */ public function addRecoveryKeys($path = '/') { - $dirContent = $this->view->getDirectoryContent($this->keyfilesPath . $path); + $dirContent = $this->view->getDirectoryContent($this->keysPath . '/' . $path); foreach ($dirContent as $item) { // get relative path from files_encryption/keyfiles/ - $filePath = substr($item['path'], strlen('files_encryption/keyfiles')); - if ($item['type'] === 'dir') { + $filePath = substr($item['path'], strlen('files_encryption/keys')); + if ($this->view->is_dir($this->userFilesDir . '/' . $filePath)) { $this->addRecoveryKeys($filePath . '/'); } else { - $session = new \OCA\Encryption\Session(new \OC\Files\View('/')); + $session = new Session(new \OC\Files\View('/')); $sharingEnabled = \OCP\Share::isEnabled(); - // remove '.key' extension from path e.g. 'file.txt.key' to 'file.txt' - $file = substr($filePath, 0, -4); - $usersSharing = $this->getSharingUsersArray($sharingEnabled, $file); - $this->setSharedFileKeyfiles($session, $usersSharing, $file); + $usersSharing = $this->getSharingUsersArray($sharingEnabled, $filePath); + $this->setSharedFileKeyfiles($session, $usersSharing, $filePath); } } } @@ -1392,16 +1408,14 @@ class Util { * remove recovery key to all encrypted files */ public function removeRecoveryKeys($path = '/') { - $dirContent = $this->view->getDirectoryContent($this->keyfilesPath . $path); + $dirContent = $this->view->getDirectoryContent($this->keysPath . '/' . $path); foreach ($dirContent as $item) { // get relative path from files_encryption/keyfiles - $filePath = substr($item['path'], strlen('files_encryption/keyfiles')); - if ($item['type'] === 'dir') { + $filePath = substr($item['path'], strlen('files_encryption/keys')); + if ($this->view->is_dir($this->userFilesDir . '/' . $filePath)) { $this->removeRecoveryKeys($filePath . '/'); } else { - // remove '.key' extension from path e.g. 'file.txt.key' to 'file.txt' - $file = substr($filePath, 0, -4); - $this->view->unlink($this->shareKeysPath . '/' . $file . '.' . $this->recoveryKeyId . '.shareKey'); + $this->view->unlink($this->keysPath . '/' . $filePath . '/' . $this->recoveryKeyId . '.shareKey'); } } } @@ -1431,27 +1445,17 @@ class Util { } $filteredUids = $this->filterShareReadyUsers($userIds); - $proxyStatus = \OC_FileProxy::$enabled; - \OC_FileProxy::$enabled = false; - //decrypt file key - $encKeyfile = $this->view->file_get_contents($this->keyfilesPath . $file . ".key"); - $shareKey = $this->view->file_get_contents( - $this->shareKeysPath . $file . "." . $this->recoveryKeyId . ".shareKey"); + $encKeyfile = Keymanager::getFileKey($this->view, $this, $file); + $shareKey = Keymanager::getShareKey($this->view, $this->recoveryKeyId, $this, $file); $plainKeyfile = Crypt::multiKeyDecrypt($encKeyfile, $shareKey, $privateKey); // encrypt file key again to all users, this time with the new public key for the recovered use $userPubKeys = Keymanager::getPublicKeys($this->view, $filteredUids['ready']); $multiEncKey = Crypt::multiKeyEncrypt($plainKeyfile, $userPubKeys); - // write new keys to filesystem TDOO! - $this->view->file_put_contents($this->keyfilesPath . $file . '.key', $multiEncKey['data']); - foreach ($multiEncKey['keys'] as $userId => $shareKey) { - $shareKeyPath = $this->shareKeysPath . $file . '.' . $userId . '.shareKey'; - $this->view->file_put_contents($shareKeyPath, $shareKey); - } + Keymanager::setFileKey($this->view, $this, $file, $multiEncKey['data']); + Keymanager::setShareKeys($this->view, $this, $file, $multiEncKey['keys']); - // Return proxy to original status - \OC_FileProxy::$enabled = $proxyStatus; } /** @@ -1460,16 +1464,14 @@ class Util { * @param string $privateKey private recovery key which is used to decrypt the files */ private function recoverAllFiles($path, $privateKey) { - $dirContent = $this->view->getDirectoryContent($this->keyfilesPath . $path); + $dirContent = $this->view->getDirectoryContent($this->keysPath . '/' . $path); foreach ($dirContent as $item) { // get relative path from files_encryption/keyfiles - $filePath = substr($item['path'], strlen('files_encryption/keyfiles')); - if ($item['type'] === 'dir') { + $filePath = substr($item['path'], strlen('files_encryption/keys')); + if ($this->view->is_dir($this->userFilesDir . '/' . $filePath)) { $this->recoverAllFiles($filePath . '/', $privateKey); } else { - // remove '.key' extension from path e.g. 'file.txt.key' to 'file.txt' - $file = substr($filePath, 0, -4); - $this->recoverFile($file, $privateKey); + $this->recoverFile($filePath, $privateKey); } } } @@ -1480,16 +1482,9 @@ class Util { */ public function recoverUsersFiles($recoveryPassword) { - // Disable encryption proxy to prevent recursive calls - $proxyStatus = \OC_FileProxy::$enabled; - \OC_FileProxy::$enabled = false; - - $encryptedKey = $this->view->file_get_contents( - '/owncloud_private_key/' . $this->recoveryKeyId . '.private.key'); + $encryptedKey = Keymanager::getPrivateSystemKey( $this->recoveryKeyId); $privateKey = Crypt::decryptPrivateKey($encryptedKey, $recoveryPassword); - \OC_FileProxy::$enabled = $proxyStatus; - $this->recoverAllFiles('/', $privateKey); } @@ -1503,10 +1498,9 @@ class Util { $backupDir = $this->encryptionDir . '/backup.'; $backupDir .= ($purpose === '') ? date("Y-m-d_H-i-s") . '/' : $purpose . '.' . date("Y-m-d_H-i-s") . '/'; $this->view->mkdir($backupDir); - $this->view->copy($this->shareKeysPath, $backupDir . 'share-keys/'); - $this->view->copy($this->keyfilesPath, $backupDir . 'keyfiles/'); - $this->view->copy($this->privateKeyPath, $backupDir . $this->userId . '.private.key'); - $this->view->copy($this->publicKeyPath, $backupDir . $this->userId . '.public.key'); + $this->view->copy($this->keysPath, $backupDir . 'keys/'); + $this->view->copy($this->privateKeyPath, $backupDir . $this->userId . '.privateKey'); + $this->view->copy($this->publicKeyPath, $backupDir . $this->userId . '.publicKey'); } /** @@ -1559,14 +1553,17 @@ class Util { */ public function initEncryption($params) { - $session = new \OCA\Encryption\Session($this->view); + $session = new Session($this->view); // we tried to initialize the encryption app for this session - $session->setInitialized(\OCA\Encryption\Session::INIT_EXECUTED); + $session->setInitialized(Session::INIT_EXECUTED); $encryptedKey = Keymanager::getPrivateKey($this->view, $params['uid']); - $privateKey = Crypt::decryptPrivateKey($encryptedKey, $params['password']); + $privateKey = false; + if ($encryptedKey) { + $privateKey = Crypt::decryptPrivateKey($encryptedKey, $params['password']); + } if ($privateKey === false) { \OCP\Util::writeLog('Encryption library', 'Private key for user "' . $params['uid'] @@ -1575,7 +1572,7 @@ class Util { } $session->setPrivateKey($privateKey); - $session->setInitialized(\OCA\Encryption\Session::INIT_SUCCESSFUL); + $session->setInitialized(Session::INIT_SUCCESSFUL); return $session; } @@ -1584,7 +1581,7 @@ class Util { * remove encryption related keys from the session */ public function closeEncryptionSession() { - $session = new \OCA\Encryption\Session($this->view); + $session = new Session($this->view); $session->closeSession(); } diff --git a/apps/files_encryption/settings-admin.php b/apps/files_encryption/settings-admin.php index 496a7cffb50..0f5d56a3734 100644 --- a/apps/files_encryption/settings-admin.php +++ b/apps/files_encryption/settings-admin.php @@ -12,7 +12,7 @@ $tmpl = new OCP\Template('files_encryption', 'settings-admin'); // Check if an adminRecovery account is enabled for recovering files after lost pwd $recoveryAdminEnabled = \OC::$server->getAppConfig()->getValue('files_encryption', 'recoveryAdminEnabled', '0'); -$session = new \OCA\Encryption\Session(new \OC\Files\View('/')); +$session = new \OCA\Files_Encryption\Session(new \OC\Files\View('/')); $initStatus = $session->getInitialized(); $tmpl->assign('recoveryEnabled', $recoveryAdminEnabled); diff --git a/apps/files_encryption/settings-personal.php b/apps/files_encryption/settings-personal.php index e9875518f67..834bac611ad 100644 --- a/apps/files_encryption/settings-personal.php +++ b/apps/files_encryption/settings-personal.php @@ -13,8 +13,8 @@ $tmpl = new OCP\Template('files_encryption', 'settings-personal'); $user = \OCP\USER::getUser();
$view = new \OC\Files\View('/');
-$util = new \OCA\Encryption\Util($view, $user);
-$session = new \OCA\Encryption\Session($view);
+$util = new \OCA\Files_Encryption\Util($view, $user);
+$session = new \OCA\Files_Encryption\Session($view);
$privateKeySet = $session->getPrivateKey() !== false;
// did we tried to initialize the keys for this session?
@@ -28,7 +28,6 @@ $result = false; if ($recoveryAdminEnabled || !$privateKeySet) {
\OCP\Util::addscript('files_encryption', 'settings-personal');
- \OCP\Util::addScript('settings', 'personal');
$tmpl->assign('recoveryEnabled', $recoveryAdminEnabled);
$tmpl->assign('recoveryEnabledForUser', $recoveryEnabledForUser);
diff --git a/apps/files_encryption/templates/invalid_private_key.php b/apps/files_encryption/templates/invalid_private_key.php index b275b9c428c..b148e65b199 100644 --- a/apps/files_encryption/templates/invalid_private_key.php +++ b/apps/files_encryption/templates/invalid_private_key.php @@ -4,7 +4,7 @@ <?php p($_['message']); ?> <br/> - <?php if($_['errorCode'] === \OCA\Encryption\Crypt::ENCRYPTION_PRIVATE_KEY_NOT_VALID_ERROR): ?> + <?php if($_['errorCode'] === \OCA\Files_Encryption\Crypt::ENCRYPTION_PRIVATE_KEY_NOT_VALID_ERROR): ?> <?php p($l->t('Go directly to your %spersonal settings%s.', array('<a href="'.$location.'">', '</a>'))); ?> <?php endif; ?> <br/> diff --git a/apps/files_encryption/templates/settings-admin.php b/apps/files_encryption/templates/settings-admin.php index d003f245bb3..4c1d724b6dd 100644 --- a/apps/files_encryption/templates/settings-admin.php +++ b/apps/files_encryption/templates/settings-admin.php @@ -1,7 +1,7 @@ <form id="encryption" class="section"> <h2><?php p($l->t('Encryption')); ?></h2> - <?php if($_["initStatus"] === \OCA\Encryption\Session::NOT_INITIALIZED): ?> + <?php if($_["initStatus"] === \OCA\Files_Encryption\Session::NOT_INITIALIZED): ?> <?php p($l->t("Encryption App is enabled but your keys are not initialized, please log-out and log-in again")); ?> <?php else: ?> <p id="encryptionSetRecoveryKey"> diff --git a/apps/files_encryption/templates/settings-personal.php b/apps/files_encryption/templates/settings-personal.php index ce8cf6aec28..17123a154d9 100644 --- a/apps/files_encryption/templates/settings-personal.php +++ b/apps/files_encryption/templates/settings-personal.php @@ -1,11 +1,11 @@ <form id="encryption" class="section">
<h2><?php p( $l->t( 'Encryption' ) ); ?></h2>
- <?php if ( $_["initialized"] === \OCA\Encryption\Session::NOT_INITIALIZED ): ?>
+ <?php if ( $_["initialized"] === \OCA\Files_Encryption\Session::NOT_INITIALIZED ): ?>
<?php p($l->t("Encryption App is enabled but your keys are not initialized, please log-out and log-in again")); ?>
- <?php elseif ( $_["initialized"] === \OCA\Encryption\Session::INIT_EXECUTED ): ?>
+ <?php elseif ( $_["initialized"] === \OCA\Files_Encryption\Session::INIT_EXECUTED ): ?>
<p>
<a name="changePKPasswd" />
<label for="changePrivateKeyPasswd">
@@ -37,7 +37,7 @@ <span class="msg"></span>
</p>
- <?php elseif ( $_["recoveryEnabled"] && $_["privateKeySet"] && $_["initialized"] === \OCA\Encryption\Session::INIT_SUCCESSFUL ): ?>
+ <?php elseif ( $_["recoveryEnabled"] && $_["privateKeySet"] && $_["initialized"] === \OCA\Files_Encryption\Session::INIT_SUCCESSFUL ): ?>
<br />
<p id="userEnableRecovery">
<label for="userEnableRecovery"><?php p( $l->t( "Enable password recovery:" ) ); ?></label>
diff --git a/apps/files_encryption/tests/crypt.php b/apps/files_encryption/tests/crypt.php index 1b8291fea28..3165279c558 100755 --- a/apps/files_encryption/tests/crypt.php +++ b/apps/files_encryption/tests/crypt.php @@ -7,12 +7,12 @@ * See the COPYING-README file. */ -use OCA\Encryption; +namespace OCA\Files_Encryption\Tests; /** - * Class Test_Encryption_Crypt + * Class Crypt */ -class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { +class Crypt extends TestCase { const TEST_ENCRYPTION_CRYPT_USER1 = "test-crypt-user1"; @@ -23,37 +23,30 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { public $dataUrl; public $dataShort; /** - * @var OC\Files\View + * @var \OC\Files\View */ public $view; public $legacyEncryptedData; public $genPrivateKey; public $genPublicKey; - public static function setUpBeforeClass() { - // reset backend - \OC_User::clearBackends(); - \OC_User::useBackend('database'); - - // Filesystem related hooks - \OCA\Encryption\Helper::registerFilesystemHooks(); - - // Filesystem related hooks - \OCA\Encryption\Helper::registerUserHooks(); + /** @var \OCP\IConfig */ + private $config; - // clear and register hooks - \OC_FileProxy::clearProxies(); - \OC_FileProxy::register(new OCA\Encryption\Proxy()); + public static function setUpBeforeClass() { + parent::setUpBeforeClass(); // create test user - \Test_Encryption_Util::loginHelper(\Test_Encryption_Crypt::TEST_ENCRYPTION_CRYPT_USER1, true); + self::loginHelper(self::TEST_ENCRYPTION_CRYPT_USER1, true); } - function setUp() { + protected function setUp() { + parent::setUp(); + // set user id - \Test_Encryption_Util::loginHelper(\Test_Encryption_Crypt::TEST_ENCRYPTION_CRYPT_USER1); - $this->userId = \Test_Encryption_Crypt::TEST_ENCRYPTION_CRYPT_USER1; - $this->pass = \Test_Encryption_Crypt::TEST_ENCRYPTION_CRYPT_USER1; + self::loginHelper(self::TEST_ENCRYPTION_CRYPT_USER1); + $this->userId = self::TEST_ENCRYPTION_CRYPT_USER1; + $this->pass = self::TEST_ENCRYPTION_CRYPT_USER1; // set content for encrypting / decrypting in tests $this->dataLong = file_get_contents(__DIR__ . '/../lib/crypt.php'); @@ -62,72 +55,70 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { $this->legacyData = __DIR__ . '/legacy-text.txt'; $this->legacyEncryptedData = __DIR__ . '/legacy-encrypted-text.txt'; $this->legacyEncryptedDataKey = __DIR__ . '/encryption.key'; - $this->randomKey = Encryption\Crypt::generateKey(); + $this->randomKey = \OCA\Files_Encryption\Crypt::generateKey(); - $keypair = Encryption\Crypt::createKeypair(); + $keypair = \OCA\Files_Encryption\Crypt::createKeypair(); $this->genPublicKey = $keypair['publicKey']; $this->genPrivateKey = $keypair['privateKey']; $this->view = new \OC\Files\View('/'); // remember files_trashbin state - $this->stateFilesTrashbin = OC_App::isEnabled('files_trashbin'); + $this->stateFilesTrashbin = \OC_App::isEnabled('files_trashbin'); // we don't want to tests with app files_trashbin enabled \OC_App::disable('files_trashbin'); + + $this->config = \OC::$server->getConfig(); } - function tearDown() { + protected function tearDown() { // reset app files_trashbin if ($this->stateFilesTrashbin) { - OC_App::enable('files_trashbin'); + \OC_App::enable('files_trashbin'); } else { - OC_App::disable('files_trashbin'); + \OC_App::disable('files_trashbin'); } $this->assertTrue(\OC_FileProxy::$enabled); - \OCP\Config::deleteSystemValue('cipher'); + $this->config->deleteSystemValue('cipher'); + + parent::tearDown(); } public static function tearDownAfterClass() { // cleanup test user - \OC_User::deleteUser(\Test_Encryption_Crypt::TEST_ENCRYPTION_CRYPT_USER1); - - \OC_Hook::clear(); - \OC_FileProxy::clearProxies(); + \OC_User::deleteUser(self::TEST_ENCRYPTION_CRYPT_USER1); - // Delete keys in /data/ - $view = new \OC\Files\View('/'); - $view->rmdir('public-keys'); - $view->rmdir('owncloud_private_key'); + parent::tearDownAfterClass(); } /** * @medium */ - function testGenerateKey() { + public function testGenerateKey() { # TODO: use more accurate (larger) string length for test confirmation - $key = Encryption\Crypt::generateKey(); + $key = \OCA\Files_Encryption\Crypt::generateKey(); $this->assertTrue(strlen($key) > 16); } - function testDecryptPrivateKey() { + public function testDecryptPrivateKey() { // test successful decrypt - $crypted = Encryption\Crypt::symmetricEncryptFileContent($this->genPrivateKey, 'hat'); + $crypted = \OCA\Files_Encryption\Crypt::symmetricEncryptFileContent($this->genPrivateKey, 'hat'); - $header = Encryption\Crypt::generateHeader(); + $header = \OCA\Files_Encryption\Crypt::generateHeader(); - $decrypted = Encryption\Crypt::decryptPrivateKey($header . $crypted, 'hat'); + $decrypted = \OCA\Files_Encryption\Crypt::decryptPrivateKey($header . $crypted, 'hat'); $this->assertEquals($this->genPrivateKey, $decrypted); //test private key decrypt with wrong password - $wrongPasswd = Encryption\Crypt::decryptPrivateKey($crypted, 'hat2'); + $wrongPasswd = \OCA\Files_Encryption\Crypt::decryptPrivateKey($crypted, 'hat2'); $this->assertEquals(false, $wrongPasswd); @@ -137,16 +128,16 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { /** * @medium */ - function testSymmetricEncryptFileContent() { + public function testSymmetricEncryptFileContent() { # TODO: search in keyfile for actual content as IV will ensure this test always passes - $crypted = Encryption\Crypt::symmetricEncryptFileContent($this->dataShort, 'hat'); + $crypted = \OCA\Files_Encryption\Crypt::symmetricEncryptFileContent($this->dataShort, 'hat'); $this->assertNotEquals($this->dataShort, $crypted); - $decrypt = Encryption\Crypt::symmetricDecryptFileContent($crypted, 'hat'); + $decrypt = \OCA\Files_Encryption\Crypt::symmetricDecryptFileContent($crypted, 'hat'); $this->assertEquals($this->dataShort, $decrypt); @@ -155,16 +146,16 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { /** * @medium */ - function testSymmetricEncryptFileContentAes128() { + public function testSymmetricEncryptFileContentAes128() { # TODO: search in keyfile for actual content as IV will ensure this test always passes - $crypted = Encryption\Crypt::symmetricEncryptFileContent($this->dataShort, 'hat', 'AES-128-CFB'); + $crypted = \OCA\Files_Encryption\Crypt::symmetricEncryptFileContent($this->dataShort, 'hat', 'AES-128-CFB'); $this->assertNotEquals($this->dataShort, $crypted); - $decrypt = Encryption\Crypt::symmetricDecryptFileContent($crypted, 'hat', 'AES-128-CFB'); + $decrypt = \OCA\Files_Encryption\Crypt::symmetricDecryptFileContent($crypted, 'hat', 'AES-128-CFB'); $this->assertEquals($this->dataShort, $decrypt); @@ -173,9 +164,9 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { /** * @medium */ - function testSymmetricStreamEncryptShortFileContent() { + public function testSymmetricStreamEncryptShortFileContent() { - $filename = 'tmp-' . uniqid() . '.test'; + $filename = 'tmp-' . $this->getUniqueID() . '.test'; $cryptedFile = file_put_contents('crypt:///' . $this->userId . '/files/'. $filename, $this->dataShort); @@ -203,25 +194,23 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { // Teardown $this->view->unlink($this->userId . '/files/' . $filename); - - Encryption\Keymanager::deleteFileKey($this->view, $filename); } /** * @medium */ - function testSymmetricStreamEncryptShortFileContentAes128() { + public function testSymmetricStreamEncryptShortFileContentAes128() { - $filename = 'tmp-' . uniqid() . '.test'; + $filename = 'tmp-' . $this->getUniqueID() . '.test'; - \OCP\Config::setSystemValue('cipher', 'AES-128-CFB'); + $this->config->setSystemValue('cipher', 'AES-128-CFB'); $cryptedFile = file_put_contents('crypt:///' . $this->userId . '/files/'. $filename, $this->dataShort); // Test that data was successfully written $this->assertTrue(is_int($cryptedFile)); - \OCP\Config::deleteSystemValue('cipher'); + $this->config->deleteSystemValue('cipher'); // Disable encryption proxy to prevent recursive calls $proxyStatus = \OC_FileProxy::$enabled; @@ -244,8 +233,6 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { // Teardown $this->view->unlink($this->userId . '/files/' . $filename); - - Encryption\Keymanager::deleteFileKey($this->view, $filename); } /** @@ -255,10 +242,10 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { * @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 * reassembly of its data */ - function testSymmetricStreamEncryptLongFileContent() { + public function testSymmetricStreamEncryptLongFileContent() { // Generate a a random filename - $filename = 'tmp-' . uniqid() . '.test'; + $filename = 'tmp-' . $this->getUniqueID() . '.test'; // Save long data as encrypted file using stream wrapper $cryptedFile = file_put_contents('crypt:///' . $this->userId . '/files/' . $filename, $this->dataLong . $this->dataLong); @@ -285,11 +272,7 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { $this->assertEquals($this->dataLong . $this->dataLong, $decrypted); // Teardown - $this->view->unlink($this->userId . '/files/' . $filename); - - Encryption\Keymanager::deleteFileKey($this->view, $filename); - } /** @@ -299,12 +282,12 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { * @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 * reassembly of its data */ - function testSymmetricStreamEncryptLongFileContentAes128() { + public function testSymmetricStreamEncryptLongFileContentAes128() { // Generate a a random filename - $filename = 'tmp-' . uniqid() . '.test'; + $filename = 'tmp-' . $this->getUniqueID() . '.test'; - \OCP\Config::setSystemValue('cipher', 'AES-128-CFB'); + $this->config->setSystemValue('cipher', 'AES-128-CFB'); // Save long data as encrypted file using stream wrapper $cryptedFile = file_put_contents('crypt:///' . $this->userId . '/files/' . $filename, $this->dataLong . $this->dataLong); @@ -316,7 +299,7 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { $proxyStatus = \OC_FileProxy::$enabled; \OC_FileProxy::$enabled = false; - \OCP\Config::deleteSystemValue('cipher'); + $this->config->deleteSystemValue('cipher'); // Get file contents without using any wrapper to get it's actual contents on disk $retreivedCryptedFile = $this->view->file_get_contents($this->userId . '/files/' . $filename); @@ -333,11 +316,7 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { $this->assertEquals($this->dataLong . $this->dataLong, $decrypted); // Teardown - $this->view->unlink($this->userId . '/files/' . $filename); - - Encryption\Keymanager::deleteFileKey($this->view, $filename); - } /** @@ -347,17 +326,17 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { * @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 * reassembly of its data */ - function testStreamDecryptLongFileContentWithoutHeader() { + public function testStreamDecryptLongFileContentWithoutHeader() { // Generate a a random filename - $filename = 'tmp-' . uniqid() . '.test'; + $filename = 'tmp-' . $this->getUniqueID() . '.test'; - \OCP\Config::setSystemValue('cipher', 'AES-128-CFB'); + $this->config->setSystemValue('cipher', 'AES-128-CFB'); // Save long data as encrypted file using stream wrapper $cryptedFile = file_put_contents('crypt:///' . $this->userId . '/files/' . $filename, $this->dataLong . $this->dataLong); - \OCP\Config::deleteSystemValue('cipher'); + $this->config->deleteSystemValue('cipher'); // Test that data was successfully written $this->assertTrue(is_int($cryptedFile)); @@ -374,7 +353,7 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { // remove the header to check if we can also decrypt old files without a header, // this files should fall back to AES-128 - $cryptedWithoutHeader = substr($retreivedCryptedFile, Encryption\Crypt::BLOCKSIZE); + $cryptedWithoutHeader = substr($retreivedCryptedFile, \OCA\Files_Encryption\Crypt::BLOCKSIZE); $this->view->file_put_contents($this->userId . '/files/' . $filename, $cryptedWithoutHeader); // Re-enable proxy - our work is done @@ -385,36 +364,32 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { $this->assertEquals($this->dataLong . $this->dataLong, $decrypted); // Teardown - $this->view->unlink($this->userId . '/files/' . $filename); - - Encryption\Keymanager::deleteFileKey($this->view, $filename); - } /** * @medium */ - function testIsEncryptedContent() { + public function testIsEncryptedContent() { - $this->assertFalse(Encryption\Crypt::isCatfileContent($this->dataUrl)); + $this->assertFalse(\OCA\Files_Encryption\Crypt::isCatfileContent($this->dataUrl)); - $this->assertFalse(Encryption\Crypt::isCatfileContent($this->legacyEncryptedData)); + $this->assertFalse(\OCA\Files_Encryption\Crypt::isCatfileContent($this->legacyEncryptedData)); - $keyfileContent = Encryption\Crypt::symmetricEncryptFileContent($this->dataUrl, 'hat', 'AES-128-CFB'); + $keyfileContent = \OCA\Files_Encryption\Crypt::symmetricEncryptFileContent($this->dataUrl, 'hat', 'AES-128-CFB'); - $this->assertTrue(Encryption\Crypt::isCatfileContent($keyfileContent)); + $this->assertTrue(\OCA\Files_Encryption\Crypt::isCatfileContent($keyfileContent)); } /** * @large */ - function testMultiKeyEncrypt() { + public function testMultiKeyEncrypt() { # TODO: search in keyfile for actual content as IV will ensure this test always passes - $pair1 = Encryption\Crypt::createKeypair(); + $pair1 = \OCA\Files_Encryption\Crypt::createKeypair(); $this->assertEquals(2, count($pair1)); @@ -423,12 +398,12 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { $this->assertTrue(strlen($pair1['privateKey']) > 1); - $crypted = Encryption\Crypt::multiKeyEncrypt($this->dataShort, array($pair1['publicKey'])); + $crypted = \OCA\Files_Encryption\Crypt::multiKeyEncrypt($this->dataShort, array($pair1['publicKey'])); $this->assertNotEquals($this->dataShort, $crypted['data']); - $decrypt = Encryption\Crypt::multiKeyDecrypt($crypted['data'], $crypted['keys'][0], $pair1['privateKey']); + $decrypt = \OCA\Files_Encryption\Crypt::multiKeyDecrypt($crypted['data'], $crypted['keys'][0], $pair1['privateKey']); $this->assertEquals($this->dataShort, $decrypt); @@ -437,9 +412,9 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { /** * @medium */ - function testRenameFile() { + public function testRenameFile() { - $filename = 'tmp-' . uniqid(); + $filename = 'tmp-' . $this->getUniqueID(); // Save long data as encrypted file using stream wrapper $cryptedFile = file_put_contents('crypt:///' . $this->userId . '/files/' . $filename, $this->dataLong); @@ -452,7 +427,7 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { $this->assertEquals($this->dataLong, $decrypt); - $newFilename = 'tmp-new-' . uniqid(); + $newFilename = 'tmp-new-' . $this->getUniqueID(); $view = new \OC\Files\View('/' . $this->userId . '/files'); $view->rename($filename, $newFilename); @@ -468,9 +443,9 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { /** * @medium */ - function testMoveFileIntoFolder() { + public function testMoveFileIntoFolder() { - $filename = 'tmp-' . uniqid(); + $filename = 'tmp-' . $this->getUniqueID(); // Save long data as encrypted file using stream wrapper $cryptedFile = file_put_contents('crypt:///' . $this->userId . '/files/' . $filename, $this->dataLong); @@ -483,8 +458,8 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { $this->assertEquals($this->dataLong, $decrypt); - $newFolder = '/newfolder' . uniqid(); - $newFilename = 'tmp-new-' . uniqid(); + $newFolder = '/newfolder' . $this->getUniqueID(); + $newFilename = 'tmp-new-' . $this->getUniqueID(); $view = new \OC\Files\View('/' . $this->userId . '/files'); $view->mkdir($newFolder); $view->rename($filename, $newFolder . '/' . $newFilename); @@ -501,12 +476,12 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { /** * @medium */ - function testMoveFolder() { + public function testMoveFolder() { $view = new \OC\Files\View('/' . $this->userId . '/files'); - $filename = '/tmp-' . uniqid(); - $folder = '/folder' . uniqid(); + $filename = '/tmp-' . $this->getUniqueID(); + $folder = '/folder' . $this->getUniqueID(); $view->mkdir($folder); @@ -521,7 +496,7 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { $this->assertEquals($this->dataLong, $decrypt); - $newFolder = '/newfolder/subfolder' . uniqid(); + $newFolder = '/newfolder/subfolder' . $this->getUniqueID(); $view->mkdir('/newfolder'); $view->rename($folder, $newFolder); @@ -539,8 +514,8 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { /** * @medium */ - function testChangePassphrase() { - $filename = 'tmp-' . uniqid(); + public function testChangePassphrase() { + $filename = 'tmp-' . $this->getUniqueID(); // Save long data as encrypted file using stream wrapper $cryptedFile = file_put_contents('crypt:///' . $this->userId . '/files/' . $filename, $this->dataLong); @@ -559,7 +534,7 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { // relogin $params['uid'] = $this->userId; $params['password'] = 'test'; - OCA\Encryption\Hooks::login($params); + \OCA\Files_Encryption\Hooks::login($params); // Get file decrypted contents $newDecrypt = file_get_contents('crypt:///' . $this->userId . '/files/' . $filename); @@ -576,9 +551,9 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { /** * @medium */ - function testViewFilePutAndGetContents() { + public function testViewFilePutAndGetContents() { - $filename = '/tmp-' . uniqid(); + $filename = '/tmp-' . $this->getUniqueID(); $view = new \OC\Files\View('/' . $this->userId . '/files'); // Save short data as encrypted file using stream wrapper @@ -610,8 +585,8 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { /** * @large */ - function testTouchExistingFile() { - $filename = '/tmp-' . uniqid(); + public function testTouchExistingFile() { + $filename = '/tmp-' . $this->getUniqueID(); $view = new \OC\Files\View('/' . $this->userId . '/files'); // Save short data as encrypted file using stream wrapper @@ -634,8 +609,8 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { /** * @medium */ - function testTouchFile() { - $filename = '/tmp-' . uniqid(); + public function testTouchFile() { + $filename = '/tmp-' . $this->getUniqueID(); $view = new \OC\Files\View('/' . $this->userId . '/files'); $view->touch($filename); @@ -658,8 +633,8 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { /** * @medium */ - function testFopenFile() { - $filename = '/tmp-' . uniqid(); + public function testFopenFile() { + $filename = '/tmp-' . $this->getUniqueID(); $view = new \OC\Files\View('/' . $this->userId . '/files'); // Save short data as encrypted file using stream wrapper @@ -676,6 +651,7 @@ class Test_Encryption_Crypt extends \PHPUnit_Framework_TestCase { $this->assertEquals($this->dataShort, $decrypt); // tear down + fclose($handle); $view->unlink($filename); } diff --git a/apps/files_encryption/tests/helper.php b/apps/files_encryption/tests/helper.php index ed543bf89f6..bf86860125a 100644 --- a/apps/files_encryption/tests/helper.php +++ b/apps/files_encryption/tests/helper.php @@ -6,39 +6,39 @@ * See the COPYING-README file. */ -require_once __DIR__ . '/util.php'; - -use OCA\Encryption; +namespace OCA\Files_Encryption\Tests; /** - * Class Test_Encryption_Helper + * Class Helper */ -class Test_Encryption_Helper extends \PHPUnit_Framework_TestCase { +class Helper extends TestCase { const TEST_ENCRYPTION_HELPER_USER1 = "test-helper-user1"; const TEST_ENCRYPTION_HELPER_USER2 = "test-helper-user2"; - public function setUp() { + protected function setUpUsers() { // create test user - \Test_Encryption_Util::loginHelper(\Test_Encryption_Helper::TEST_ENCRYPTION_HELPER_USER2, true); - \Test_Encryption_Util::loginHelper(\Test_Encryption_Helper::TEST_ENCRYPTION_HELPER_USER1, true); + self::loginHelper(self::TEST_ENCRYPTION_HELPER_USER2, true); + self::loginHelper(self::TEST_ENCRYPTION_HELPER_USER1, true); } - public function tearDown() { + protected function cleanUpUsers() { // cleanup test user - \OC_User::deleteUser(\Test_Encryption_Helper::TEST_ENCRYPTION_HELPER_USER1); - \OC_User::deleteUser(\Test_Encryption_Helper::TEST_ENCRYPTION_HELPER_USER2); + \OC_User::deleteUser(self::TEST_ENCRYPTION_HELPER_USER1); + \OC_User::deleteUser(self::TEST_ENCRYPTION_HELPER_USER2); } - public static function tearDownAfterClass() { + public static function setupHooks() { + // Filesystem related hooks + \OCA\Files_Encryption\Helper::registerFilesystemHooks(); - \OC_Hook::clear(); + // clear and register hooks \OC_FileProxy::clearProxies(); + \OC_FileProxy::register(new \OCA\Files_Encryption\Proxy()); + } - // Delete keys in /data/ - $view = new \OC\Files\View('/'); - $view->rmdir('public-keys'); - $view->rmdir('owncloud_private_key'); + public static function tearDownAfterClass() { + parent::tearDownAfterClass(); } /** @@ -49,13 +49,13 @@ class Test_Encryption_Helper extends \PHPUnit_Framework_TestCase { $partFilename = 'testfile.txt.part'; $filename = 'testfile.txt'; - $this->assertTrue(Encryption\Helper::isPartialFilePath($partFilename)); + $this->assertTrue(\OCA\Files_Encryption\Helper::isPartialFilePath($partFilename)); - $this->assertEquals('testfile.txt', Encryption\Helper::stripPartialFileExtension($partFilename)); + $this->assertEquals('testfile.txt', \OCA\Files_Encryption\Helper::stripPartialFileExtension($partFilename)); - $this->assertFalse(Encryption\Helper::isPartialFilePath($filename)); + $this->assertFalse(\OCA\Files_Encryption\Helper::isPartialFilePath($filename)); - $this->assertEquals('testfile.txt', Encryption\Helper::stripPartialFileExtension($filename)); + $this->assertEquals('testfile.txt', \OCA\Files_Encryption\Helper::stripPartialFileExtension($filename)); } @@ -67,13 +67,13 @@ class Test_Encryption_Helper extends \PHPUnit_Framework_TestCase { $partFilename = 'testfile.txt.ocTransferId643653835.part'; $filename = 'testfile.txt'; - $this->assertTrue(Encryption\Helper::isPartialFilePath($partFilename)); + $this->assertTrue(\OCA\Files_Encryption\Helper::isPartialFilePath($partFilename)); - $this->assertEquals('testfile.txt', Encryption\Helper::stripPartialFileExtension($partFilename)); + $this->assertEquals('testfile.txt', \OCA\Files_Encryption\Helper::stripPartialFileExtension($partFilename)); - $this->assertFalse(Encryption\Helper::isPartialFilePath($filename)); + $this->assertFalse(\OCA\Files_Encryption\Helper::isPartialFilePath($filename)); - $this->assertEquals('testfile.txt', Encryption\Helper::stripPartialFileExtension($filename)); + $this->assertEquals('testfile.txt', \OCA\Files_Encryption\Helper::stripPartialFileExtension($filename)); } function testGetPathToRealFile() { @@ -85,85 +85,36 @@ class Test_Encryption_Helper extends \PHPUnit_Framework_TestCase { $versionPath = "/user/files_versions/foo/bar/test.txt.v456756835"; $cachePath = "/user/cache/transferid636483/foo/bar/test.txt"; - $this->assertEquals($relativePath, Encryption\Helper::getPathToRealFile($versionPath)); - $this->assertEquals($relativePath, Encryption\Helper::getPathToRealFile($cachePath)); + $this->assertEquals($relativePath, \OCA\Files_Encryption\Helper::getPathToRealFile($versionPath)); + $this->assertEquals($relativePath, \OCA\Files_Encryption\Helper::getPathToRealFile($cachePath)); } function testGetUser() { + self::setUpUsers(); $path1 = "/" . self::TEST_ENCRYPTION_HELPER_USER1 . "/files/foo/bar.txt"; $path2 = "/" . self::TEST_ENCRYPTION_HELPER_USER1 . "/cache/foo/bar.txt"; $path3 = "/" . self::TEST_ENCRYPTION_HELPER_USER2 . "/thumbnails/foo"; $path4 ="/" . "/" . self::TEST_ENCRYPTION_HELPER_USER1; - \Test_Encryption_Util::loginHelper(self::TEST_ENCRYPTION_HELPER_USER1); + self::loginHelper(self::TEST_ENCRYPTION_HELPER_USER1); // if we are logged-in every path should return the currently logged-in user - $this->assertEquals(self::TEST_ENCRYPTION_HELPER_USER1, Encryption\Helper::getUser($path3)); + $this->assertEquals(self::TEST_ENCRYPTION_HELPER_USER1, \OCA\Files_Encryption\Helper::getUser($path3)); // now log out - \Test_Encryption_Util::logoutHelper(); + self::logoutHelper(); // now we should only get the user from /user/files and user/cache paths - $this->assertEquals(self::TEST_ENCRYPTION_HELPER_USER1, Encryption\Helper::getUser($path1)); - $this->assertEquals(self::TEST_ENCRYPTION_HELPER_USER1, Encryption\Helper::getUser($path2)); + $this->assertEquals(self::TEST_ENCRYPTION_HELPER_USER1, \OCA\Files_Encryption\Helper::getUser($path1)); + $this->assertEquals(self::TEST_ENCRYPTION_HELPER_USER1, \OCA\Files_Encryption\Helper::getUser($path2)); - $this->assertFalse(Encryption\Helper::getUser($path3)); - $this->assertFalse(Encryption\Helper::getUser($path4)); + $this->assertFalse(\OCA\Files_Encryption\Helper::getUser($path3)); + $this->assertFalse(\OCA\Files_Encryption\Helper::getUser($path4)); // Log-in again - \Test_Encryption_Util::loginHelper(\Test_Encryption_Helper::TEST_ENCRYPTION_HELPER_USER1); - } - - function userNamesProvider() { - return array( - array('testuser' . uniqid()), - array('user.name.with.dots'), - ); - } - - /** - * Tests whether share keys can be found - * - * @dataProvider userNamesProvider - */ - function testFindShareKeys($userName) { - // note: not using dataProvider as we want to make - // sure that the correct keys are match and not any - // other ones that might happen to have similar names - \Test_Encryption_Util::setupHooks(); - \Test_Encryption_Util::loginHelper($userName, true); - $testDir = 'testFindShareKeys' . uniqid() . '/'; - $baseDir = $userName . '/files/' . $testDir; - $fileList = array( - 't est.txt', - 't est_.txt', - 't est.doc.txt', - 't est(.*).txt', // make sure the regexp is escaped - 'multiple.dots.can.happen.too.txt', - 't est.' . $userName . '.txt', - 't est_.' . $userName . '.shareKey.txt', - 'who would upload their.shareKey', - 'user ones file.txt', - 'user ones file.txt.backup', - '.t est.txt' - ); - - $rootView = new \OC\Files\View('/'); - $rootView->mkdir($baseDir); - foreach ($fileList as $fileName) { - $rootView->file_put_contents($baseDir . $fileName, 'dummy'); - } - - $shareKeysDir = $userName . '/files_encryption/share-keys/' . $testDir; - foreach ($fileList as $fileName) { - // make sure that every file only gets its correct respective keys - $result = Encryption\Helper::findShareKeys($baseDir . $fileName, $shareKeysDir . $fileName, $rootView); - $this->assertEquals( - array($shareKeysDir . $fileName . '.' . $userName . '.shareKey'), - $result - ); - } + self::loginHelper(self::TEST_ENCRYPTION_HELPER_USER1); + self::cleanUpUsers(); } } diff --git a/apps/files_encryption/tests/hooks.php b/apps/files_encryption/tests/hooks.php index c2434c0f5f6..7c60024d637 100644 --- a/apps/files_encryption/tests/hooks.php +++ b/apps/files_encryption/tests/hooks.php @@ -20,24 +20,22 @@ * */ -require_once __DIR__ . '/util.php'; - -use OCA\Encryption; +namespace OCA\Files_Encryption\Tests; /** - * Class Test_Encryption_Hooks + * Class Hooks * this class provide basic hook app tests */ -class Test_Encryption_Hooks extends \PHPUnit_Framework_TestCase { +class Hooks extends TestCase { const TEST_ENCRYPTION_HOOKS_USER1 = "test-encryption-hooks-user1.dot"; const TEST_ENCRYPTION_HOOKS_USER2 = "test-encryption-hooks-user2.dot"; - /** - * @var \OC\Files\View - */ + /** @var \OC\Files\View */ public $user1View; // view on /data/user1/files + /** @var \OC\Files\View */ public $user2View; // view on /data/user2/files + /** @var \OC\Files\View */ public $rootView; // view on /data/user public $data; public $filename; @@ -46,6 +44,8 @@ class Test_Encryption_Hooks extends \PHPUnit_Framework_TestCase { private static $testFiles; public static function setUpBeforeClass() { + parent::setUpBeforeClass(); + // note: not using a data provider because these // files all need to coexist to make sure the // share keys are found properly (pattern matching) @@ -63,62 +63,36 @@ class Test_Encryption_Hooks extends \PHPUnit_Framework_TestCase { '.t est.txt' ); - // reset backend - \OC_User::clearBackends(); - \OC_User::useBackend('database'); - - \OC_Hook::clear('OC_Filesystem'); - \OC_Hook::clear('OC_User'); - - // clear share hooks - \OC_Hook::clear('OCP\\Share'); - \OC::registerShareHooks(); - \OCP\Util::connectHook('OC_Filesystem', 'setup', '\OC\Files\Storage\Shared', 'setup'); - - // Filesystem related hooks - \OCA\Encryption\Helper::registerFilesystemHooks(); - - // Sharing related hooks - \OCA\Encryption\Helper::registerShareHooks(); - - // clear and register proxies - \OC_FileProxy::clearProxies(); - \OC_FileProxy::register(new OCA\Encryption\Proxy()); - // create test user - \Test_Encryption_Util::loginHelper(\Test_Encryption_Hooks::TEST_ENCRYPTION_HOOKS_USER1, true); - \Test_Encryption_Util::loginHelper(\Test_Encryption_Hooks::TEST_ENCRYPTION_HOOKS_USER2, true); + self::loginHelper(self::TEST_ENCRYPTION_HOOKS_USER1, true); + self::loginHelper(self::TEST_ENCRYPTION_HOOKS_USER2, true); } - function setUp() { + protected function setUp() { + parent::setUp(); + // set user id - \Test_Encryption_Util::loginHelper(\Test_Encryption_Hooks::TEST_ENCRYPTION_HOOKS_USER1); - \OC_User::setUserId(\Test_Encryption_Hooks::TEST_ENCRYPTION_HOOKS_USER1); + self::loginHelper(self::TEST_ENCRYPTION_HOOKS_USER1); + \OC_User::setUserId(self::TEST_ENCRYPTION_HOOKS_USER1); // init filesystem view - $this->user1View = new \OC\Files\View('/'. \Test_Encryption_Hooks::TEST_ENCRYPTION_HOOKS_USER1 . '/files'); - $this->user2View = new \OC\Files\View('/'. \Test_Encryption_Hooks::TEST_ENCRYPTION_HOOKS_USER2 . '/files'); + $this->user1View = new \OC\Files\View('/'. self::TEST_ENCRYPTION_HOOKS_USER1 . '/files'); + $this->user2View = new \OC\Files\View('/'. self::TEST_ENCRYPTION_HOOKS_USER2 . '/files'); $this->rootView = new \OC\Files\View('/'); // init short data $this->data = 'hats'; - $this->filename = 'enc_hooks_tests-' . uniqid() . '.txt'; - $this->folder = 'enc_hooks_tests_folder-' . uniqid(); + $this->filename = 'enc_hooks_tests-' . $this->getUniqueID() . '.txt'; + $this->folder = 'enc_hooks_tests_folder-' . $this->getUniqueID(); } public static function tearDownAfterClass() { // cleanup test user - \OC_User::deleteUser(\Test_Encryption_Hooks::TEST_ENCRYPTION_HOOKS_USER1); - \OC_User::deleteUser(\Test_Encryption_Hooks::TEST_ENCRYPTION_HOOKS_USER2); - - \OC_Hook::clear(); - \OC_FileProxy::clearProxies(); + \OC_User::deleteUser(self::TEST_ENCRYPTION_HOOKS_USER1); + \OC_User::deleteUser(self::TEST_ENCRYPTION_HOOKS_USER2); - // Delete keys in /data/ - $view = new \OC\Files\View('/'); - $view->rmdir('public-keys'); - $view->rmdir('owncloud_private_key'); + parent::tearDownAfterClass(); } function testDisableHook() { @@ -130,7 +104,7 @@ class Test_Encryption_Hooks extends \PHPUnit_Framework_TestCase { $this->assertTrue(is_array($row)); // disabling the app should delete all user specific settings - \OCA\Encryption\Hooks::preDisable(array('app' => 'files_encryption')); + \OCA\Files_Encryption\Hooks::preDisable(array('app' => 'files_encryption')); // check if user specific settings for the encryption app are really gone $query = \OC_DB::prepare('SELECT * FROM `*PREFIX*preferences` WHERE `appid` = ?'); @@ -140,14 +114,14 @@ class Test_Encryption_Hooks extends \PHPUnit_Framework_TestCase { // relogin user to initialize the encryption again $user = \OCP\User::getUser(); - \Test_Encryption_Util::loginHelper($user); + self::loginHelper($user); } function testDeleteHooks() { // remember files_trashbin state - $stateFilesTrashbin = OC_App::isEnabled('files_trashbin'); + $stateFilesTrashbin = \OC_App::isEnabled('files_trashbin'); // we want to tests with app files_trashbin disabled \OC_App::disable('files_trashbin'); @@ -159,25 +133,25 @@ class Test_Encryption_Hooks extends \PHPUnit_Framework_TestCase { // check if all keys are generated $this->assertTrue($this->rootView->file_exists( - self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/share-keys/' - . $this->filename . '.' . \Test_Encryption_Hooks::TEST_ENCRYPTION_HOOKS_USER1 . '.shareKey')); + self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keys/' + . $this->filename . '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '.shareKey')); $this->assertTrue($this->rootView->file_exists( - self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keyfiles/' . $this->filename . '.key')); + self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keys/' . $this->filename . '/fileKey')); - \Test_Encryption_Util::logoutHelper(); - \Test_Encryption_Util::loginHelper(\Test_Encryption_Hooks::TEST_ENCRYPTION_HOOKS_USER2); - \OC_User::setUserId(\Test_Encryption_Hooks::TEST_ENCRYPTION_HOOKS_USER2); + self::logoutHelper(); + self::loginHelper(self::TEST_ENCRYPTION_HOOKS_USER2); + \OC_User::setUserId(self::TEST_ENCRYPTION_HOOKS_USER2); $this->user2View->file_put_contents($this->filename, $this->data); // check if all keys are generated $this->assertTrue($this->rootView->file_exists( - self::TEST_ENCRYPTION_HOOKS_USER2 . '/files_encryption/share-keys/' - . $this->filename . '.' . \Test_Encryption_Hooks::TEST_ENCRYPTION_HOOKS_USER2 . '.shareKey')); + self::TEST_ENCRYPTION_HOOKS_USER2 . '/files_encryption/keys/' + . $this->filename . '/' . self::TEST_ENCRYPTION_HOOKS_USER2 . '.shareKey')); $this->assertTrue($this->rootView->file_exists( - self::TEST_ENCRYPTION_HOOKS_USER2 . '/files_encryption/keyfiles/' . $this->filename . '.key')); + self::TEST_ENCRYPTION_HOOKS_USER2 . '/files_encryption/keys/' . $this->filename . '/fileKey')); // create a dummy file that we can delete something outside of data/user/files @@ -189,10 +163,10 @@ class Test_Encryption_Hooks extends \PHPUnit_Framework_TestCase { // all keys should still exist $this->assertTrue($this->rootView->file_exists( - self::TEST_ENCRYPTION_HOOKS_USER2 . '/files_encryption/share-keys/' - . $this->filename . '.' . \Test_Encryption_Hooks::TEST_ENCRYPTION_HOOKS_USER2 . '.shareKey')); + self::TEST_ENCRYPTION_HOOKS_USER2 . '/files_encryption/keys/' + . $this->filename . '/' . self::TEST_ENCRYPTION_HOOKS_USER2 . '.shareKey')); $this->assertTrue($this->rootView->file_exists( - self::TEST_ENCRYPTION_HOOKS_USER2 . '/files_encryption/keyfiles/' . $this->filename . '.key')); + self::TEST_ENCRYPTION_HOOKS_USER2 . '/files_encryption/keys/' . $this->filename . '/fileKey')); // delete the file in data/user/files @@ -201,34 +175,34 @@ class Test_Encryption_Hooks extends \PHPUnit_Framework_TestCase { // check if keys from user2 are really deleted $this->assertFalse($this->rootView->file_exists( - self::TEST_ENCRYPTION_HOOKS_USER2 . '/files_encryption/share-keys/' - . $this->filename . '.' . \Test_Encryption_Hooks::TEST_ENCRYPTION_HOOKS_USER2 . '.shareKey')); + self::TEST_ENCRYPTION_HOOKS_USER2 . '/files_encryption/keys/' + . $this->filename . '/' . self::TEST_ENCRYPTION_HOOKS_USER2 . '.shareKey')); $this->assertFalse($this->rootView->file_exists( - self::TEST_ENCRYPTION_HOOKS_USER2 . '/files_encryption/keyfiles/' . $this->filename . '.key')); + self::TEST_ENCRYPTION_HOOKS_USER2 . '/files_encryption/keys/' . $this->filename . '/fileKey')); // but user1 keys should still exist $this->assertTrue($this->rootView->file_exists( - self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/share-keys/' - . $this->filename . '.' . \Test_Encryption_Hooks::TEST_ENCRYPTION_HOOKS_USER1 . '.shareKey')); + self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keys/' + . $this->filename . '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '.shareKey')); $this->assertTrue($this->rootView->file_exists( - self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keyfiles/' . $this->filename . '.key')); + self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keys/' . $this->filename . '/fileKey')); if ($stateFilesTrashbin) { - OC_App::enable('files_trashbin'); + \OC_App::enable('files_trashbin'); } else { - OC_App::disable('files_trashbin'); + \OC_App::disable('files_trashbin'); } } function testDeleteHooksForSharedFiles() { - \Test_Encryption_Util::logoutHelper(); - \Test_Encryption_Util::loginHelper(\Test_Encryption_Hooks::TEST_ENCRYPTION_HOOKS_USER1); - \OC_User::setUserId(\Test_Encryption_Hooks::TEST_ENCRYPTION_HOOKS_USER1); + self::logoutHelper(); + self::loginHelper(self::TEST_ENCRYPTION_HOOKS_USER1); + \OC_User::setUserId(self::TEST_ENCRYPTION_HOOKS_USER1); // remember files_trashbin state - $stateFilesTrashbin = OC_App::isEnabled('files_trashbin'); + $stateFilesTrashbin = \OC_App::isEnabled('files_trashbin'); // we want to tests with app files_trashbin disabled \OC_App::disable('files_trashbin'); @@ -240,10 +214,10 @@ class Test_Encryption_Hooks extends \PHPUnit_Framework_TestCase { // check if all keys are generated $this->assertTrue($this->rootView->file_exists( - self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/share-keys/' - . $this->filename . '.' . \Test_Encryption_Hooks::TEST_ENCRYPTION_HOOKS_USER1 . '.shareKey')); + self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keys/' + . $this->filename . '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '.shareKey')); $this->assertTrue($this->rootView->file_exists( - self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keyfiles/' . $this->filename . '.key')); + self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keys/' . $this->filename . '/fileKey')); // get the file info from previous created file $fileInfo = $this->user1View->getFileInfo($this->filename); @@ -252,26 +226,26 @@ class Test_Encryption_Hooks extends \PHPUnit_Framework_TestCase { $this->assertTrue($fileInfo instanceof \OC\Files\FileInfo); // share the file with user2 - \OCP\Share::shareItem('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER, self::TEST_ENCRYPTION_HOOKS_USER2, OCP\PERMISSION_ALL); + \OCP\Share::shareItem('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER, self::TEST_ENCRYPTION_HOOKS_USER2, \OCP\Constants::PERMISSION_ALL); // check if new share key exists $this->assertTrue($this->rootView->file_exists( - self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/share-keys/' - . $this->filename . '.' . \Test_Encryption_Hooks::TEST_ENCRYPTION_HOOKS_USER2 . '.shareKey')); + self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keys/' + . $this->filename . '/' . self::TEST_ENCRYPTION_HOOKS_USER2 . '.shareKey')); - \Test_Encryption_Util::logoutHelper(); - \Test_Encryption_Util::loginHelper(\Test_Encryption_Hooks::TEST_ENCRYPTION_HOOKS_USER2); - \OC_User::setUserId(\Test_Encryption_Hooks::TEST_ENCRYPTION_HOOKS_USER2); + self::logoutHelper(); + self::loginHelper(self::TEST_ENCRYPTION_HOOKS_USER2); + \OC_User::setUserId(self::TEST_ENCRYPTION_HOOKS_USER2); // user2 update the shared file $this->user2View->file_put_contents($this->filename, $this->data); // keys should be stored at user1s dir, not in user2s $this->assertFalse($this->rootView->file_exists( - self::TEST_ENCRYPTION_HOOKS_USER2 . '/files_encryption/share-keys/' - . $this->filename . '.' . \Test_Encryption_Hooks::TEST_ENCRYPTION_HOOKS_USER2 . '.shareKey')); + self::TEST_ENCRYPTION_HOOKS_USER2 . '/files_encryption/keys/' + . $this->filename . '/' . self::TEST_ENCRYPTION_HOOKS_USER2 . '.shareKey')); $this->assertFalse($this->rootView->file_exists( - self::TEST_ENCRYPTION_HOOKS_USER2 . '/files_encryption/keyfiles/' . $this->filename . '.key')); + self::TEST_ENCRYPTION_HOOKS_USER2 . '/files_encryption/keys/' . $this->filename . '/fileKey')); // delete the Shared file from user1 in data/user2/files/Shared $result = $this->user2View->unlink($this->filename); @@ -280,25 +254,25 @@ class Test_Encryption_Hooks extends \PHPUnit_Framework_TestCase { // share key for user2 from user1s home should be gone, all other keys should still exists $this->assertTrue($this->rootView->file_exists( - self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/share-keys/' - . $this->filename . '.' . \Test_Encryption_Hooks::TEST_ENCRYPTION_HOOKS_USER1 . '.shareKey')); + self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keys/' + . $this->filename . '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '.shareKey')); $this->assertFalse($this->rootView->file_exists( - self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/share-keys/' - . $this->filename . '.' . \Test_Encryption_Hooks::TEST_ENCRYPTION_HOOKS_USER2 . '.shareKey')); + self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keys/' + . $this->filename . '/' . self::TEST_ENCRYPTION_HOOKS_USER2 . '.shareKey')); $this->assertTrue($this->rootView->file_exists( - self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keyfiles/' . $this->filename . '.key')); + self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keys/' . $this->filename . '/fileKey')); // cleanup - \Test_Encryption_Util::logoutHelper(); - \Test_Encryption_Util::loginHelper(\Test_Encryption_Hooks::TEST_ENCRYPTION_HOOKS_USER1); - \OC_User::setUserId(\Test_Encryption_Hooks::TEST_ENCRYPTION_HOOKS_USER1); + self::logoutHelper(); + self::loginHelper(self::TEST_ENCRYPTION_HOOKS_USER1); + \OC_User::setUserId(self::TEST_ENCRYPTION_HOOKS_USER1); if ($stateFilesTrashbin) { - OC_App::enable('files_trashbin'); + \OC_App::enable('files_trashbin'); } else { - OC_App::disable('files_trashbin'); + \OC_App::disable('files_trashbin'); } } @@ -323,12 +297,12 @@ class Test_Encryption_Hooks extends \PHPUnit_Framework_TestCase { function doTestRenameHook($filename) { // check if keys exists $this->assertTrue($this->rootView->file_exists( - '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/share-keys/' - . $filename . '.' . self::TEST_ENCRYPTION_HOOKS_USER1 . '.shareKey')); + '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keys/' + . $filename . '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '.shareKey')); $this->assertTrue($this->rootView->file_exists( - '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keyfiles/' - . $filename . '.key')); + '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keys/' + . $filename . '/fileKey')); // make subfolder and sub-subfolder $this->rootView->mkdir('/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files/' . $this->folder); @@ -347,18 +321,18 @@ class Test_Encryption_Hooks extends \PHPUnit_Framework_TestCase { // keys should be renamed too $this->assertFalse($this->rootView->file_exists( - '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/share-keys/' - . $filename . '.' . self::TEST_ENCRYPTION_HOOKS_USER1 . '.shareKey')); + '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keys/' + . $filename . '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '.shareKey')); $this->assertFalse($this->rootView->file_exists( - '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keyfiles/' - . $filename . '.key')); + '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keys/' + . $filename . '/fileKey')); $this->assertTrue($this->rootView->file_exists( - '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/share-keys/' . $this->folder . '/' . $this->folder . '/' - . $filename . '.' . self::TEST_ENCRYPTION_HOOKS_USER1 . '.shareKey')); + '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keys/' . $this->folder . '/' . $this->folder . '/' + . $filename . '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '.shareKey')); $this->assertTrue($this->rootView->file_exists( - '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keyfiles/' . $this->folder . '/' . $this->folder . '/' - . $filename . '.key')); + '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keys/' . $this->folder . '/' . $this->folder . '/' + . $filename . '/fileKey')); // cleanup $this->rootView->unlink('/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files/' . $this->folder); @@ -385,12 +359,12 @@ class Test_Encryption_Hooks extends \PHPUnit_Framework_TestCase { function doTestCopyHook($filename) { // check if keys exists $this->assertTrue($this->rootView->file_exists( - '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/share-keys/' - . $filename . '.' . self::TEST_ENCRYPTION_HOOKS_USER1 . '.shareKey')); + '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keys/' + . $filename . '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '.shareKey')); $this->assertTrue($this->rootView->file_exists( - '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keyfiles/' - . $filename . '.key')); + '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keys/' + . $filename . '/fileKey')); // make subfolder and sub-subfolder $this->rootView->mkdir('/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files/' . $this->folder); @@ -406,18 +380,18 @@ class Test_Encryption_Hooks extends \PHPUnit_Framework_TestCase { // keys should be copied too $this->assertTrue($this->rootView->file_exists( - '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/share-keys/' - . $filename . '.' . self::TEST_ENCRYPTION_HOOKS_USER1 . '.shareKey')); + '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keys/' + . $filename . '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '.shareKey')); $this->assertTrue($this->rootView->file_exists( - '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keyfiles/' - . $filename . '.key')); + '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keys/' + . $filename . '/fileKey')); $this->assertTrue($this->rootView->file_exists( - '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/share-keys/' . $this->folder . '/' . $this->folder . '/' - . $filename . '.' . self::TEST_ENCRYPTION_HOOKS_USER1 . '.shareKey')); + '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keys/' . $this->folder . '/' . $this->folder . '/' + . $filename . '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '.shareKey')); $this->assertTrue($this->rootView->file_exists( - '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keyfiles/' . $this->folder . '/' . $this->folder . '/' - . $filename . '.key')); + '/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files_encryption/keys/' . $this->folder . '/' . $this->folder . '/' + . $filename . '/fileKey')); // cleanup $this->rootView->unlink('/' . self::TEST_ENCRYPTION_HOOKS_USER1 . '/files/' . $this->folder); @@ -433,35 +407,35 @@ class Test_Encryption_Hooks extends \PHPUnit_Framework_TestCase { $view = new \OC\Files\View(); // set user password for the first time - \OCA\Encryption\Hooks::postCreateUser(array('uid' => 'newUser', 'password' => 'newUserPassword')); + \OCA\Files_Encryption\Hooks::postCreateUser(array('uid' => 'newUser', 'password' => 'newUserPassword')); - $this->assertTrue($view->file_exists('public-keys/newUser.public.key')); - $this->assertTrue($view->file_exists('newUser/files_encryption/newUser.private.key')); + $this->assertTrue($view->file_exists(\OCA\Files_Encryption\Keymanager::getPublicKeyPath() . '/newUser.publicKey')); + $this->assertTrue($view->file_exists('newUser/files_encryption/newUser.privateKey')); // check if we are able to decrypt the private key - $encryptedKey = \OCA\Encryption\Keymanager::getPrivateKey($view, 'newUser'); - $privateKey = \OCA\Encryption\Crypt::decryptPrivateKey($encryptedKey, 'newUserPassword'); + $encryptedKey = \OCA\Files_Encryption\Keymanager::getPrivateKey($view, 'newUser'); + $privateKey = \OCA\Files_Encryption\Crypt::decryptPrivateKey($encryptedKey, 'newUserPassword'); $this->assertTrue(is_string($privateKey)); // change the password before the user logged-in for the first time, // we can replace the encryption keys - \OCA\Encryption\Hooks::setPassphrase(array('uid' => 'newUser', 'password' => 'passwordChanged')); + \OCA\Files_Encryption\Hooks::setPassphrase(array('uid' => 'newUser', 'password' => 'passwordChanged')); - $encryptedKey = \OCA\Encryption\Keymanager::getPrivateKey($view, 'newUser'); - $privateKey = \OCA\Encryption\Crypt::decryptPrivateKey($encryptedKey, 'passwordChanged'); + $encryptedKey = \OCA\Files_Encryption\Keymanager::getPrivateKey($view, 'newUser'); + $privateKey = \OCA\Files_Encryption\Crypt::decryptPrivateKey($encryptedKey, 'passwordChanged'); $this->assertTrue(is_string($privateKey)); // now create a files folder to simulate a already used account $view->mkdir('/newUser/files'); // change the password after the user logged in, now the password should not change - \OCA\Encryption\Hooks::setPassphrase(array('uid' => 'newUser', 'password' => 'passwordChanged2')); + \OCA\Files_Encryption\Hooks::setPassphrase(array('uid' => 'newUser', 'password' => 'passwordChanged2')); - $encryptedKey = \OCA\Encryption\Keymanager::getPrivateKey($view, 'newUser'); - $privateKey = \OCA\Encryption\Crypt::decryptPrivateKey($encryptedKey, 'passwordChanged2'); + $encryptedKey = \OCA\Files_Encryption\Keymanager::getPrivateKey($view, 'newUser'); + $privateKey = \OCA\Files_Encryption\Crypt::decryptPrivateKey($encryptedKey, 'passwordChanged2'); $this->assertFalse($privateKey); - $privateKey = \OCA\Encryption\Crypt::decryptPrivateKey($encryptedKey, 'passwordChanged'); + $privateKey = \OCA\Files_Encryption\Crypt::decryptPrivateKey($encryptedKey, 'passwordChanged'); $this->assertTrue(is_string($privateKey)); } diff --git a/apps/files_encryption/tests/keymanager.php b/apps/files_encryption/tests/keymanager.php index e2486ee93eb..0d17923664d 100644 --- a/apps/files_encryption/tests/keymanager.php +++ b/apps/files_encryption/tests/keymanager.php @@ -6,14 +6,12 @@ * See the COPYING-README file. */ -require_once __DIR__ . '/util.php'; - -use OCA\Encryption; +namespace OCA\Files_Encryption\Tests; /** - * Class Test_Encryption_Keymanager + * Class Keymanager */ -class Test_Encryption_Keymanager extends \PHPUnit_Framework_TestCase { +class Keymanager extends TestCase { const TEST_USER = "test-keymanager-user.dot"; @@ -21,83 +19,87 @@ class Test_Encryption_Keymanager extends \PHPUnit_Framework_TestCase { public $pass; public static $stateFilesTrashbin; /** - * @var OC\Files\View + * @var \OC\Files\View */ public $view; public $randomKey; public $dataShort; public static function setUpBeforeClass() { - // reset backend - \OC_User::clearBackends(); - \OC_User::useBackend('database'); - - // Filesystem related hooks - \OCA\Encryption\Helper::registerFilesystemHooks(); - - // clear and register hooks - \OC_FileProxy::clearProxies(); - \OC_FileProxy::register(new OCA\Encryption\Proxy()); + parent::setUpBeforeClass(); // disable file proxy by default \OC_FileProxy::$enabled = false; // remember files_trashbin state - self::$stateFilesTrashbin = OC_App::isEnabled('files_trashbin'); + self::$stateFilesTrashbin = \OC_App::isEnabled('files_trashbin'); // we don't want to tests with app files_trashbin enabled \OC_App::disable('files_trashbin'); // create test user - \OC_User::deleteUser(\Test_Encryption_Keymanager::TEST_USER); - \Test_Encryption_Util::loginHelper(\Test_Encryption_Keymanager::TEST_USER, true); + \OC_User::deleteUser(self::TEST_USER); + parent::loginHelper(self::TEST_USER, true); } - function setUp() { + protected function setUp() { + parent::setUp(); // set content for encrypting / decrypting in tests $this->dataLong = file_get_contents(__DIR__ . '/../lib/crypt.php'); $this->dataShort = 'hats'; $this->dataUrl = __DIR__ . '/../lib/crypt.php'; $this->legacyData = __DIR__ . '/legacy-text.txt'; $this->legacyEncryptedData = __DIR__ . '/legacy-encrypted-text.txt'; - $this->randomKey = Encryption\Crypt::generateKey(); + $this->randomKey = \OCA\Files_Encryption\Crypt::generateKey(); - $keypair = Encryption\Crypt::createKeypair(); + $keypair = \OCA\Files_Encryption\Crypt::createKeypair(); $this->genPublicKey = $keypair['publicKey']; $this->genPrivateKey = $keypair['privateKey']; $this->view = new \OC\Files\View('/'); - \Test_Encryption_Util::loginHelper(Test_Encryption_Keymanager::TEST_USER); - $this->userId = \Test_Encryption_Keymanager::TEST_USER; - $this->pass = \Test_Encryption_Keymanager::TEST_USER; + self::loginHelper(self::TEST_USER); + $this->userId = self::TEST_USER; + $this->pass = self::TEST_USER; $userHome = \OC_User::getHome($this->userId); $this->dataDir = str_replace('/' . $this->userId, '', $userHome); } function tearDown() { - $this->view->deleteAll('/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys'); - $this->view->deleteAll('/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/keyfiles'); + $this->view->deleteAll('/' . self::TEST_USER . '/files_encryption/keys'); + parent::tearDown(); } public static function tearDownAfterClass() { \OC_FileProxy::$enabled = true; // cleanup test user - \OC_User::deleteUser(\Test_Encryption_Keymanager::TEST_USER); + \OC_User::deleteUser(self::TEST_USER); // reset app files_trashbin if (self::$stateFilesTrashbin) { - OC_App::enable('files_trashbin'); + \OC_App::enable('files_trashbin'); } - \OC_Hook::clear(); - \OC_FileProxy::clearProxies(); + parent::tearDownAfterClass(); + } + + function testKeyCacheUpdate() { + $testUser = 'testKeyCacheUpdate'; + \OCA\Files_Encryption\Keymanager::setPublicKey('oldKey', $testUser); + + $this->assertSame('oldKey', + \OCA\Files_Encryption\Keymanager::getPublicKey($this->view, $testUser)); + + // update key + \OCA\Files_Encryption\Keymanager::setPublicKey('newKey', $testUser); + + $this->assertSame('newKey', + \OCA\Files_Encryption\Keymanager::getPublicKey($this->view, $testUser)); + + // cleanup + \OCA\Files_Encryption\Keymanager::deletePublicKey($this->view, $testUser); - // Delete keys in /data/ - $view = new \OC\Files\View('/'); - $view->rmdir('public-keys'); - $view->rmdir('owncloud_private_key'); } /** @@ -105,9 +107,9 @@ class Test_Encryption_Keymanager extends \PHPUnit_Framework_TestCase { */ function testGetPrivateKey() { - $key = Encryption\Keymanager::getPrivateKey($this->view, $this->userId); + $key = \OCA\Files_Encryption\Keymanager::getPrivateKey($this->view, $this->userId); - $privateKey = Encryption\Crypt::decryptPrivateKey($key, $this->pass); + $privateKey = \OCA\Files_Encryption\Crypt::decryptPrivateKey($key, $this->pass); $res = openssl_pkey_get_private($privateKey); @@ -124,7 +126,7 @@ class Test_Encryption_Keymanager extends \PHPUnit_Framework_TestCase { */ function testGetPublicKey() { - $publiceKey = Encryption\Keymanager::getPublicKey($this->view, $this->userId); + $publiceKey = \OCA\Files_Encryption\Keymanager::getPublicKey($this->view, $this->userId); $res = openssl_pkey_get_public($publiceKey); @@ -135,27 +137,6 @@ class Test_Encryption_Keymanager extends \PHPUnit_Framework_TestCase { $this->assertArrayHasKey('key', $sslInfo); } - function fileNameFromShareKeyProvider() { - return array( - array('file.user.shareKey', 'user', 'file'), - array('file.name.with.dots.user.shareKey', 'user', 'file.name.with.dots'), - array('file.name.user.with.dots.shareKey', 'user.with.dots', 'file.name'), - array('file.txt', 'user', false), - array('user.shareKey', 'user', false), - ); - } - - /** - * @small - * - * @dataProvider fileNameFromShareKeyProvider - */ - function testGetFilenameFromShareKey($fileName, $user, $expectedFileName) { - $this->assertEquals($expectedFileName, - \TestProtectedKeymanagerMethods::testGetFilenameFromShareKey($fileName, $user) - ); - } - /** * @medium */ @@ -163,9 +144,9 @@ class Test_Encryption_Keymanager extends \PHPUnit_Framework_TestCase { $key = $this->randomKey; - $file = 'unittest-' . uniqid() . '.txt'; + $file = 'unittest-' . $this->getUniqueID() . '.txt'; - $util = new Encryption\Util($this->view, $this->userId); + $util = new \OCA\Files_Encryption\Util($this->view, $this->userId); // Disable encryption proxy to prevent recursive calls $proxyStatus = \OC_FileProxy::$enabled; @@ -173,9 +154,9 @@ class Test_Encryption_Keymanager extends \PHPUnit_Framework_TestCase { $this->view->file_put_contents($this->userId . '/files/' . $file, $this->dataShort); - Encryption\Keymanager::setFileKey($this->view, $util, $file, $key); + \OCA\Files_Encryption\Keymanager::setFileKey($this->view, $util, $file, $key); - $this->assertTrue($this->view->file_exists('/' . $this->userId . '/files_encryption/keyfiles/' . $file . '.key')); + $this->assertTrue($this->view->file_exists('/' . $this->userId . '/files_encryption/keys/' . $file . '/fileKey')); // cleanup $this->view->unlink('/' . $this->userId . '/files/' . $file); @@ -191,9 +172,9 @@ class Test_Encryption_Keymanager extends \PHPUnit_Framework_TestCase { $key = "dummy key"; - Encryption\Keymanager::setPrivateKey($key, 'dummyUser'); + \OCA\Files_Encryption\Keymanager::setPrivateKey($key, 'dummyUser'); - $this->assertTrue($this->view->file_exists('/dummyUser/files_encryption/dummyUser.private.key')); + $this->assertTrue($this->view->file_exists('/dummyUser/files_encryption/dummyUser.privateKey')); //clean up $this->view->deleteAll('/dummyUser'); @@ -205,14 +186,19 @@ class Test_Encryption_Keymanager extends \PHPUnit_Framework_TestCase { function testSetPrivateSystemKey() { $key = "dummy key"; - $keyName = "myDummyKey.private.key"; + $keyName = "myDummyKey"; + $encHeader = \OCA\Files_Encryption\Crypt::generateHeader(); - Encryption\Keymanager::setPrivateSystemKey($key, $keyName); + \OCA\Files_Encryption\Keymanager::setPrivateSystemKey($key, $keyName); - $this->assertTrue($this->view->file_exists('/owncloud_private_key/' . $keyName)); + $this->assertTrue($this->view->file_exists('/files_encryption/' . $keyName . '.privateKey')); + + $result = \OCA\Files_Encryption\Keymanager::getPrivateSystemKey($keyName); + + $this->assertSame($encHeader . $key, $result); // clean up - $this->view->unlink('/owncloud_private_key/' . $keyName); + $this->view->unlink('/files_encryption/' . $keyName.'.privateKey'); } @@ -221,7 +207,7 @@ class Test_Encryption_Keymanager extends \PHPUnit_Framework_TestCase { */ function testGetUserKeys() { - $keys = Encryption\Keymanager::getUserKeys($this->view, $this->userId); + $keys = \OCA\Files_Encryption\Keymanager::getUserKeys($this->view, $this->userId); $resPublic = openssl_pkey_get_public($keys['publicKey']); @@ -231,7 +217,7 @@ class Test_Encryption_Keymanager extends \PHPUnit_Framework_TestCase { $this->assertArrayHasKey('key', $sslInfoPublic); - $privateKey = Encryption\Crypt::decryptPrivateKey($keys['privateKey'], $this->pass); + $privateKey = \OCA\Files_Encryption\Crypt::decryptPrivateKey($keys['privateKey'], $this->pass); $resPrivate = openssl_pkey_get_private($privateKey); @@ -247,77 +233,85 @@ class Test_Encryption_Keymanager extends \PHPUnit_Framework_TestCase { */ function testRecursiveDelShareKeysFolder() { - $this->view->mkdir('/'.Test_Encryption_Keymanager::TEST_USER.'/files/folder1'); - $this->view->file_put_contents('/'.Test_Encryption_Keymanager::TEST_USER.'/files/folder1/existingFile.txt', 'data'); + $this->view->mkdir('/' . self::TEST_USER . '/files/folder1'); + $this->view->file_put_contents('/' . self::TEST_USER . '/files/folder1/existingFile.txt', 'data'); // create folder structure for some dummy share key files - $this->view->mkdir('/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys/folder1'); - $this->view->mkdir('/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys/folder1/subfolder'); - $this->view->mkdir('/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys/folder1/subfolder/subsubfolder'); + $this->view->mkdir('/' . self::TEST_USER . '/files_encryption/keys/folder1'); + $this->view->mkdir('/' . self::TEST_USER . '/files_encryption/keys/folder1/existingFile.txt'); + $this->view->mkdir('/' . self::TEST_USER . '/files_encryption/keys/folder1/file1'); + $this->view->mkdir('/' . self::TEST_USER . '/files_encryption/keys/folder1/file2'); + $this->view->mkdir('/' . self::TEST_USER . '/files_encryption/keys/folder1/subfolder'); + $this->view->mkdir('/' . self::TEST_USER . '/files_encryption/keys/folder1/subfolder/file2'); + $this->view->mkdir('/' . self::TEST_USER . '/files_encryption/keys/folder1/subfolder/subsubfolder'); + $this->view->mkdir('/' . self::TEST_USER . '/files_encryption/keys/folder1/subfolder/subsubfolder/file1'); + $this->view->mkdir('/' . self::TEST_USER . '/files_encryption/keys/folder1/subfolder/subsubfolder/file2'); // create some dummy share keys - $this->view->file_put_contents('/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys/folder1/existingFile.txt.user1.shareKey', 'data'); - $this->view->file_put_contents('/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys/folder1/existingFile.txt.' . Test_Encryption_Keymanager::TEST_USER . '.shareKey', 'data'); - $this->view->file_put_contents('/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys/folder1/file1.user1.shareKey', 'data'); - $this->view->file_put_contents('/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys/folder1/file1.user1.test.shareKey', 'data'); - $this->view->file_put_contents('/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys/folder1/file1.test-keymanager-userxdot.shareKey', 'data'); - $this->view->file_put_contents('/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys/folder1/file1.userx.' . Test_Encryption_Keymanager::TEST_USER . '.shareKey', 'data'); - $this->view->file_put_contents('/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys/folder1/file1.' . Test_Encryption_Keymanager::TEST_USER . '.userx.shareKey', 'data'); - $this->view->file_put_contents('/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys/folder1/file1.user1.' . Test_Encryption_Keymanager::TEST_USER . '.shareKey', 'data'); - $this->view->file_put_contents('/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys/folder1/file1.' . Test_Encryption_Keymanager::TEST_USER . '.user1.shareKey', 'data'); - $this->view->file_put_contents('/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys/folder1/file2.user2.shareKey', 'data'); - $this->view->file_put_contents('/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys/folder1/file2.user3.shareKey', 'data'); - $this->view->file_put_contents('/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys/folder1/subfolder/file2.user3.shareKey', 'data'); - $this->view->file_put_contents('/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys/folder1/subfolder/subsubfolder/file1.user1.shareKey', 'data'); - $this->view->file_put_contents('/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys/folder1/subfolder/subsubfolder/file2.user2.shareKey', 'data'); - $this->view->file_put_contents('/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys/folder1/subfolder/subsubfolder/file2.user3.shareKey', 'data'); + $this->view->file_put_contents('/' . self::TEST_USER . '/files_encryption/keys/folder1/existingFile.txt/user1.shareKey', 'data'); + $this->view->file_put_contents('/' . self::TEST_USER . '/files_encryption/keys/folder1/existingFile.txt/' . self::TEST_USER . '.shareKey', 'data'); + $this->view->file_put_contents('/' . self::TEST_USER . '/files_encryption/keys/folder1/file1/user1.shareKey', 'data'); + $this->view->file_put_contents('/' . self::TEST_USER . '/files_encryption/keys/folder1/file1/user1.test.shareKey', 'data'); + $this->view->file_put_contents('/' . self::TEST_USER . '/files_encryption/keys/folder1/file1/test-keymanager-userxdot.shareKey', 'data'); + $this->view->file_put_contents('/' . self::TEST_USER . '/files_encryption/keys/folder1/file1/userx.' . self::TEST_USER . '.shareKey', 'data'); + $this->view->file_put_contents('/' . self::TEST_USER . '/files_encryption/keys/folder1/file1/' . self::TEST_USER . '.userx.shareKey', 'data'); + $this->view->file_put_contents('/' . self::TEST_USER . '/files_encryption/keys/folder1/file1/user1.' . self::TEST_USER . '.shareKey', 'data'); + $this->view->file_put_contents('/' . self::TEST_USER . '/files_encryption/keys/folder1/file1/' . self::TEST_USER . '.user1.shareKey', 'data'); + $this->view->file_put_contents('/' . self::TEST_USER . '/files_encryption/keys/folder1/file2/user2.shareKey', 'data'); + $this->view->file_put_contents('/' . self::TEST_USER . '/files_encryption/keys/folder1/file2/user3.shareKey', 'data'); + $this->view->file_put_contents('/' . self::TEST_USER . '/files_encryption/keys/folder1/subfolder/file2/user3.shareKey', 'data'); + $this->view->file_put_contents('/' . self::TEST_USER . '/files_encryption/keys/folder1/subfolder/subsubfolder/file1/user1.shareKey', 'data'); + $this->view->file_put_contents('/' . self::TEST_USER . '/files_encryption/keys/folder1/subfolder/subsubfolder/file2/user2.shareKey', 'data'); + $this->view->file_put_contents('/' . self::TEST_USER . '/files_encryption/keys/folder1/subfolder/subsubfolder/file2/user3.shareKey', 'data'); // recursive delete share keys from user1 and user2 - Encryption\Keymanager::delShareKey($this->view, array('user1', 'user2', Test_Encryption_Keymanager::TEST_USER), '/folder1/', Test_Encryption_Keymanager::TEST_USER); + \OCA\Files_Encryption\Keymanager::delShareKey($this->view, + array('user1', 'user2', self::TEST_USER), + \OCA\Files_Encryption\Keymanager::getKeyPath($this->view, new \OCA\Files_Encryption\Util($this->view, self::TEST_USER), '/folder1'), + self::TEST_USER, + '/folder1'); // check if share keys from user1 and user2 are deleted $this->assertFalse($this->view->file_exists( - '/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys/folder1/existingFile.user1.shareKey')); + '/' . self::TEST_USER . '/files_encryption/keys/folder1/existingFile.txt/user1.shareKey')); $this->assertFalse($this->view->file_exists( - '/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys/folder1/file1.user1.shareKey')); + '/' . self::TEST_USER . '/files_encryption/share-keys/folder1/file1/user1.shareKey')); $this->assertFalse($this->view->file_exists( - '/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys/folder1/file2.user2.shareKey')); + '/' . self::TEST_USER . '/files_encryption/share-keys/folder1/file2/user2.shareKey')); $this->assertFalse($this->view->file_exists( - '/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys/folder1/subfolder/subsubfolder/file1.user1.shareKey')); + '/' . self::TEST_USER . '/files_encryption/share-keys/folder1/subfolder/subsubfolder/file1/user1.shareKey')); $this->assertFalse($this->view->file_exists( - '/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys/folder1/subfolder/subsubfolder/file2.user2.shareKey')); + '/' . self::TEST_USER . '/files_encryption/share-keys/folder1/subfolder/subsubfolder/file2/user2.shareKey')); // check if share keys from user3 still exists $this->assertTrue($this->view->file_exists( - '/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys/folder1/file2.user3.shareKey')); + '/' . self::TEST_USER . '/files_encryption/keys/folder1/file2/user3.shareKey')); $this->assertTrue($this->view->file_exists( - '/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys/folder1/subfolder/subsubfolder/file2.user3.shareKey')); + '/' . self::TEST_USER . '/files_encryption/keys/folder1/subfolder/subsubfolder/file2/user3.shareKey')); $this->assertTrue($this->view->file_exists( - '/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys/folder1/subfolder/file2.user3.shareKey')); + '/' . self::TEST_USER . '/files_encryption/keys/folder1/subfolder/file2/user3.shareKey')); - // check if share keys for user or file with similar name + // check if share keys for user or file with similar name $this->assertTrue($this->view->file_exists( - '/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys/folder1/file1.user1.test.shareKey')); + '/' . self::TEST_USER . '/files_encryption/keys/folder1/file1/user1.test.shareKey')); $this->assertTrue($this->view->file_exists( - '/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys/folder1/file1.test-keymanager-userxdot.shareKey')); + '/' . self::TEST_USER . '/files_encryption/keys/folder1/file1/test-keymanager-userxdot.shareKey')); $this->assertTrue($this->view->file_exists( - '/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys/folder1/file1.' . Test_Encryption_Keymanager::TEST_USER . '.userx.shareKey')); + '/' . self::TEST_USER . '/files_encryption/keys/folder1/file1/' . self::TEST_USER . '.userx.shareKey')); // FIXME: this case currently cannot be distinguished, needs further fixing - /* $this->assertTrue($this->view->file_exists( - '/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys/folder1/file1.userx.' . Test_Encryption_Keymanager::TEST_USER . '.shareKey')); + '/' . self::TEST_USER . '/files_encryption/keys/folder1/file1/userx.' . self::TEST_USER . '.shareKey')); $this->assertTrue($this->view->file_exists( - '/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys/folder1/file1.user1.' . Test_Encryption_Keymanager::TEST_USER . '.shareKey')); + '/' . self::TEST_USER . '/files_encryption/keys/folder1/file1/user1.' . self::TEST_USER . '.shareKey')); $this->assertTrue($this->view->file_exists( - '/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys/folder1/file1.' . Test_Encryption_Keymanager::TEST_USER . '.user1.shareKey')); - */ + '/' . self::TEST_USER . '/files_encryption/keys/folder1/file1/' . self::TEST_USER . '.user1.shareKey')); // owner key from existing file should still exists because the file is still there $this->assertTrue($this->view->file_exists( - '/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys/folder1/existingFile.txt.' . Test_Encryption_Keymanager::TEST_USER . '.shareKey')); + '/' . self::TEST_USER . '/files_encryption/keys/folder1/existingFile.txt/' . self::TEST_USER . '.shareKey')); // cleanup - $this->view->deleteAll('/'.Test_Encryption_Keymanager::TEST_USER.'/files/folder1'); + $this->view->deleteAll('/' . self::TEST_USER . '/files/folder1'); } @@ -326,178 +320,53 @@ class Test_Encryption_Keymanager extends \PHPUnit_Framework_TestCase { */ function testRecursiveDelShareKeysFile() { - $this->view->mkdir('/'.Test_Encryption_Keymanager::TEST_USER.'/files/folder1'); - $this->view->file_put_contents('/'.Test_Encryption_Keymanager::TEST_USER.'/files/folder1/existingFile.txt', 'data'); + $this->view->mkdir('/' . self::TEST_USER . '/files/folder1'); + $this->view->file_put_contents('/' . self::TEST_USER . '/files/folder1/existingFile.txt', 'data'); // create folder structure for some dummy share key files - $this->view->mkdir('/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys/folder1'); + $this->view->mkdir('/' . self::TEST_USER . '/files_encryption/keys/folder1'); + $this->view->mkdir('/' . self::TEST_USER . '/files_encryption/keys/folder1/existingFile.txt'); // create some dummy share keys - $this->view->file_put_contents('/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys/folder1/existingFile.txt.user1.shareKey', 'data'); - $this->view->file_put_contents('/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys/folder1/existingFile.txt.user2.shareKey', 'data'); - $this->view->file_put_contents('/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys/folder1/existingFile.txt.user3.shareKey', 'data'); - $this->view->file_put_contents('/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys/folder1/existingFile.txt.' . Test_Encryption_Keymanager::TEST_USER . '.shareKey', 'data'); + $this->view->file_put_contents('/' . self::TEST_USER . '/files_encryption/keys/folder1/existingFile.txt/user1.shareKey', 'data'); + $this->view->file_put_contents('/' . self::TEST_USER . '/files_encryption/keys/folder1/existingFile.txt/user2.shareKey', 'data'); + $this->view->file_put_contents('/' . self::TEST_USER . '/files_encryption/keys/folder1/existingFile.txt/user3.shareKey', 'data'); + $this->view->file_put_contents('/' . self::TEST_USER . '/files_encryption/keys/folder1/existingFile.txt/' . self::TEST_USER . '.shareKey', 'data'); // recursive delete share keys from user1 and user2 - Encryption\Keymanager::delShareKey($this->view, array('user1', 'user2', Test_Encryption_Keymanager::TEST_USER), '/folder1/existingFile.txt', Test_Encryption_Keymanager::TEST_USER); + \OCA\Files_Encryption\Keymanager::delShareKey($this->view, + array('user1', 'user2', self::TEST_USER), + \OCA\Files_Encryption\Keymanager::getKeyPath($this->view, new \OCA\Files_Encryption\Util($this->view, self::TEST_USER), '/folder1/existingFile.txt'), + self::TEST_USER, + '/folder1/existingFile.txt'); + // check if share keys from user1 and user2 are deleted $this->assertFalse($this->view->file_exists( - '/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys/folder1/existingFile.user1.shareKey')); + '/' . self::TEST_USER . '/files_encryption/keys/folder1/existingFile/user1.shareKey')); $this->assertFalse($this->view->file_exists( - '/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys/folder1/existingFile.user2.shareKey')); + '/' . self::TEST_USER . '/files_encryption/keys/folder1/existingFile/user2.shareKey')); // check if share keys for user3 and owner $this->assertTrue($this->view->file_exists( - '/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys/folder1/existingFile.txt.' . Test_Encryption_Keymanager::TEST_USER . '.shareKey')); - $this->assertTrue($this->view->file_exists( - '/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys/folder1/existingFile.txt.user3.shareKey')); - // cleanup - $this->view->deleteAll('/'.Test_Encryption_Keymanager::TEST_USER.'/files/folder1'); - - } - - /** - * @medium - */ - function testDeleteFileKey() { - - $this->view->mkdir('/'.Test_Encryption_Keymanager::TEST_USER.'/files/folder1'); - $this->view->file_put_contents('/'.Test_Encryption_Keymanager::TEST_USER.'/files/folder1/existingFile.txt', 'data'); - - // create folder structure for some dummy file key files - $this->view->mkdir('/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/keyfiles/folder1'); - - // create dummy keyfile - $this->view->file_put_contents('/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/keyfiles/folder1/dummyFile.txt.key', 'data'); - - // recursive delete share keys from user1 and user2 - $result = Encryption\Keymanager::deleteFileKey($this->view, '/folder1/existingFile.txt'); - $this->assertFalse($result); - - $result2 = Encryption\Keymanager::deleteFileKey($this->view, '/folder1/dummyFile.txt'); - $this->assertTrue($result2); - - // check if file key from dummyFile was deleted - $this->assertFalse($this->view->file_exists( - '/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/keyfiles/folder1/dummyFile.txt.key')); - - // check if file key from existing file still exists + '/' . self::TEST_USER . '/files_encryption/keys/folder1/existingFile.txt/' . self::TEST_USER . '.shareKey')); $this->assertTrue($this->view->file_exists( - '/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/keyfiles/folder1/existingFile.txt.key')); - + '/' . self::TEST_USER . '/files_encryption/keys/folder1/existingFile.txt/user3.shareKey')); // cleanup - $this->view->deleteAll('/'.Test_Encryption_Keymanager::TEST_USER.'/files/folder1'); - - } - - /** - * @medium - */ - function testDeleteFileKeyFolder() { - - $this->view->mkdir('/'.Test_Encryption_Keymanager::TEST_USER.'/files/folder1'); - $this->view->file_put_contents('/'.Test_Encryption_Keymanager::TEST_USER.'/files/folder1/existingFile.txt', 'data'); - - // create folder structure for some dummy file key files - $this->view->mkdir('/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/keyfiles/folder1'); - - // create dummy keyfile - $this->view->file_put_contents('/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/keyfiles/folder1/dummyFile.txt.key', 'data'); - - // recursive delete share keys from user1 and user2 - $result = Encryption\Keymanager::deleteFileKey($this->view, '/folder1'); - $this->assertFalse($result); - - // all file keys should still exists if we try to delete a folder with keys for which some files still exists - $this->assertTrue($this->view->file_exists( - '/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/keyfiles/folder1/dummyFile.txt.key')); - $this->assertTrue($this->view->file_exists( - '/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/keyfiles/folder1/existingFile.txt.key')); - - // delete folder - $this->view->unlink('/'.Test_Encryption_Keymanager::TEST_USER.'/files/folder1'); - // create dummy keyfile - $this->view->file_put_contents('/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/keyfiles/folder1/dummyFile.txt.key', 'data'); - - // now file keys should be deleted since the folder no longer exists - $result = Encryption\Keymanager::deleteFileKey($this->view, '/folder1'); - $this->assertTrue($result); - - $this->assertFalse($this->view->file_exists( - '/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/keyfiles/folder1')); - - // cleanup - $this->view->deleteAll('/'.Test_Encryption_Keymanager::TEST_USER.'/files/folder1'); - - } - - function testDelAllShareKeysFile() { - $this->view->mkdir('/'.Test_Encryption_Keymanager::TEST_USER.'/files/folder1'); - $this->view->file_put_contents('/'.Test_Encryption_Keymanager::TEST_USER.'/files/folder1/existingFile.txt', 'data'); - - // create folder structure for some dummy share key files - $this->view->mkdir('/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys/folder1'); - - // create some dummy share keys for the existing file - $this->view->file_put_contents('/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys/folder1/existingFile.txt.user1.shareKey', 'data'); - $this->view->file_put_contents('/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys/folder1/existingFile.txt.user2.shareKey', 'data'); - $this->view->file_put_contents('/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys/folder1/existingFile.txt.user3.shareKey', 'data'); - $this->view->file_put_contents('/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys/folder1/existingFile.txt.' . Test_Encryption_Keymanager::TEST_USER . '.shareKey', 'data'); - - // create some dummy share keys for a non-existing file - $this->view->file_put_contents('/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys/folder1/nonexistingFile.txt.user1.shareKey', 'data'); - $this->view->file_put_contents('/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys/folder1/nonexistingFile.txt.user2.shareKey', 'data'); - $this->view->file_put_contents('/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys/folder1/nonexistingFile.txt.user3.shareKey', 'data'); - $this->view->file_put_contents('/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys/folder1/nonexistingFile.txt.' . Test_Encryption_Keymanager::TEST_USER . '.shareKey', 'data'); - - // try to del all share keys from a existing file, should fail because the file still exists - $result = Encryption\Keymanager::delAllShareKeys($this->view, Test_Encryption_Keymanager::TEST_USER, 'folder1/existingFile.txt'); - $this->assertFalse($result); - - // check if share keys still exists - $this->assertTrue($this->view->file_exists( - '/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys/folder1/existingFile.txt.' . Test_Encryption_Keymanager::TEST_USER . '.shareKey')); - $this->assertTrue($this->view->file_exists( - '/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys/folder1/existingFile.txt.user1.shareKey')); - $this->assertTrue($this->view->file_exists( - '/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys/folder1/existingFile.txt.user2.shareKey')); - $this->assertTrue($this->view->file_exists( - '/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys/folder1/existingFile.txt.user3.shareKey')); - - // try to del all share keys from file, should succeed because the does not exist any more - $result2 = Encryption\Keymanager::delAllShareKeys($this->view, Test_Encryption_Keymanager::TEST_USER, 'folder1/nonexistingFile.txt'); - $this->assertTrue($result2); - - // check if share keys are really gone - $this->assertFalse($this->view->file_exists( - '/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys/folder1/nonexistingFile.txt.' . Test_Encryption_Keymanager::TEST_USER . '.shareKey')); - // check that it only deleted keys or users who had access, others remain - $this->assertTrue($this->view->file_exists( - '/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys/folder1/nonexistingFile.txt.user1.shareKey')); - $this->assertTrue($this->view->file_exists( - '/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys/folder1/nonexistingFile.txt.user2.shareKey')); - $this->assertTrue($this->view->file_exists( - '/'.Test_Encryption_Keymanager::TEST_USER.'/files_encryption/share-keys/folder1/nonexistingFile.txt.user3.shareKey')); - - // cleanup - $this->view->deleteAll('/'.Test_Encryption_Keymanager::TEST_USER.'/files/folder1'); + $this->view->deleteAll('/' . self::TEST_USER . '/files/folder1'); } function testKeySetPreperation() { - $basePath = '/'.Test_Encryption_Keymanager::TEST_USER.'/files'; + $basePath = '/' . self::TEST_USER . '/files'; $path = '/folder1/subfolder/subsubfolder/file.txt'; $this->assertFalse($this->view->is_dir($basePath . '/testKeySetPreperation')); - $result = TestProtectedKeymanagerMethods::testKeySetPreperation($this->view, $path, $basePath); - - // return path without leading slash - $this->assertSame('folder1/subfolder/subsubfolder/file.txt', $result); + TestProtectedKeymanagerMethods::testKeySetPreperation($this->view, $basePath . $path); // check if directory structure was created - $this->assertTrue($this->view->is_dir($basePath . '/folder1/subfolder/subsubfolder')); + $this->assertTrue($this->view->is_dir($basePath . $path)); // cleanup $this->view->deleteAll($basePath . '/folder1'); @@ -506,23 +375,16 @@ class Test_Encryption_Keymanager extends \PHPUnit_Framework_TestCase { } /** - * dummy class to access protected methods of \OCA\Encryption\Keymanager for testing + * dummy class to access protected methods of \OCA\Files_Encryption\Keymanager for testing */ -class TestProtectedKeymanagerMethods extends \OCA\Encryption\Keymanager { - - /** - * @param string $sharekey - */ - public static function testGetFilenameFromShareKey($sharekey, $user) { - return self::getFilenameFromShareKey($sharekey, $user); - } +class TestProtectedKeymanagerMethods extends \OCA\Files_Encryption\Keymanager { /** * @param \OC\Files\View $view relative to data/ * @param string $path * @param string $basePath */ - public static function testKeySetPreperation($view, $path, $basePath) { - return self::keySetPreparation($view, $path, $basePath); + public static function testKeySetPreperation($view, $path) { + self::keySetPreparation($view, $path); } } diff --git a/apps/files_encryption/tests/migration.php b/apps/files_encryption/tests/migration.php index 80f30d4e793..f0d1ba202ed 100644 --- a/apps/files_encryption/tests/migration.php +++ b/apps/files_encryption/tests/migration.php @@ -2,8 +2,9 @@ /** * ownCloud * - * @author Thomas Müller - * @copyright 2014 Thomas Müller deepdiver@owncloud.com + * @copyright (C) 2014 ownCloud, Inc. + * + * @author Bjoern Schiessle <schiessle@owncloud.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE @@ -20,34 +21,51 @@ * */ -use OCA\Encryption; -use OCA\Files_Encryption\Migration; +namespace OCA\Files_Encryption\Tests; -class Test_Migration extends PHPUnit_Framework_TestCase { +class Migration extends TestCase { - public function tearDown() { - if (OC_DB::tableExists('encryption_test')) { - OC_DB::dropTable('encryption_test'); - } - $this->assertTableNotExist('encryption_test'); - } + const TEST_ENCRYPTION_MIGRATION_USER1='test_encryption_user1'; + const TEST_ENCRYPTION_MIGRATION_USER2='test_encryption_user2'; + const TEST_ENCRYPTION_MIGRATION_USER3='test_encryption_user3'; - public function setUp() { - if (OC_DB::tableExists('encryption_test')) { - OC_DB::dropTable('encryption_test'); - } - $this->assertTableNotExist('encryption_test'); + /** @var \OC\Files\View */ + private $view; + private $public_share_key_id; + private $recovery_key_id; + + public static function setUpBeforeClass() { + parent::setUpBeforeClass(); + self::loginHelper(self::TEST_ENCRYPTION_MIGRATION_USER1, true); + self::loginHelper(self::TEST_ENCRYPTION_MIGRATION_USER2, true); + self::loginHelper(self::TEST_ENCRYPTION_MIGRATION_USER3, true); } - public function testEncryptionTableDoesNotExist() { + public static function tearDownAfterClass() { + \OC_User::deleteUser(self::TEST_ENCRYPTION_MIGRATION_USER1); + \OC_User::deleteUser(self::TEST_ENCRYPTION_MIGRATION_USER2); + \OC_User::deleteUser(self::TEST_ENCRYPTION_MIGRATION_USER3); + parent::tearDownAfterClass(); + } + protected function tearDown() { + if (\OC_DB::tableExists('encryption_test')) { + \OC_DB::dropTable('encryption_test'); + } $this->assertTableNotExist('encryption_test'); - $migration = new Migration('encryption_test'); - $migration->dropTableEncryption(); + parent::tearDown(); + } + public function setUp() { + $this->loginHelper(self::TEST_ENCRYPTION_MIGRATION_USER1); + $this->view = new \OC\Files\View(); + $this->public_share_key_id = \OCA\Files_Encryption\Helper::getPublicShareKeyId(); + $this->recovery_key_id = \OCA\Files_Encryption\Helper::getRecoveryKeyId(); + if (\OC_DB::tableExists('encryption_test')) { + \OC_DB::dropTable('encryption_test'); + } $this->assertTableNotExist('encryption_test'); - } public function checkLastIndexId() { @@ -83,93 +101,164 @@ class Test_Migration extends PHPUnit_Framework_TestCase { // create test table $this->checkLastIndexId(); - OC_DB::createDbFromStructure(__DIR__ . '/encryption_table.xml'); + \OC_DB::createDbFromStructure(__DIR__ . '/encryption_table.xml'); $this->checkLastIndexId(); } - public function testDataMigration() { - // TODO travis - if (getenv('TRAVIS')) { - $this->markTestSkipped('Fails on travis'); + /** + * @param string $table + */ + public function assertTableNotExist($table) { + $type = \OC_Config::getValue( "dbtype", "sqlite" ); + if( $type == 'sqlite' || $type == 'sqlite3' ) { + // sqlite removes the tables after closing the DB + $this->assertTrue(true); + } else { + $this->assertFalse(\OC_DB::tableExists($table), 'Table ' . $table . ' exists.'); } - - $this->assertTableNotExist('encryption_test'); - - // create test table - OC_DB::createDbFromStructure(__DIR__ . '/encryption_table.xml'); - $this->assertTableExist('encryption_test'); - - OC_DB::executeAudited('INSERT INTO `*PREFIX*encryption_test` values(?, ?, ?, ?)', - array('user1', 'server-side', 1, 1)); - - // preform migration - $migration = new Migration('encryption_test'); - $migration->dropTableEncryption(); - - // assert - $this->assertTableNotExist('encryption_test'); - - $rec = \OC_Preferences::getValue('user1', 'files_encryption', 'recovery_enabled'); - $mig = \OC_Preferences::getValue('user1', 'files_encryption', 'migration_status'); - - $this->assertEquals(1, $rec); - $this->assertEquals(1, $mig); } - public function testDuplicateDataMigration() { - // TODO travis - if (getenv('TRAVIS')) { - $this->markTestSkipped('Fails on travis'); + protected function createDummyShareKeys($uid) { + $this->view->mkdir($uid . '/files_encryption/share-keys/folder1/folder2/folder3'); + $this->view->mkdir($uid . '/files_encryption/share-keys/folder2/'); + $this->view->file_put_contents($uid . '/files_encryption/share-keys/folder1/folder2/folder3/file3.' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.shareKey' , 'data'); + $this->view->file_put_contents($uid . '/files_encryption/share-keys/folder1/folder2/folder3/file3.' . self::TEST_ENCRYPTION_MIGRATION_USER2 . '.shareKey' , 'data'); + $this->view->file_put_contents($uid . '/files_encryption/share-keys/folder1/folder2/folder3/file3.' . self::TEST_ENCRYPTION_MIGRATION_USER3 . '.shareKey' , 'data'); + $this->view->file_put_contents($uid . '/files_encryption/share-keys/folder1/folder2/file2.' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.shareKey' , 'data'); + $this->view->file_put_contents($uid . '/files_encryption/share-keys/folder1/folder2/file2.' . self::TEST_ENCRYPTION_MIGRATION_USER2 . '.shareKey' , 'data'); + $this->view->file_put_contents($uid . '/files_encryption/share-keys/folder1/folder2/file2.' . self::TEST_ENCRYPTION_MIGRATION_USER3 . '.shareKey' , 'data'); + $this->view->file_put_contents($uid . '/files_encryption/share-keys/folder1/file.1.' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.shareKey' , 'data'); + $this->view->file_put_contents($uid . '/files_encryption/share-keys/folder1/file.1.' . self::TEST_ENCRYPTION_MIGRATION_USER2 . '.shareKey' , 'data'); + $this->view->file_put_contents($uid . '/files_encryption/share-keys/folder1/file.1.' . self::TEST_ENCRYPTION_MIGRATION_USER3 . '.shareKey' , 'data'); + $this->view->file_put_contents($uid . '/files_encryption/share-keys/folder2/file.2.1.' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.shareKey' , 'data'); + $this->view->file_put_contents($uid . '/files_encryption/share-keys/folder2/file.2.1.' . self::TEST_ENCRYPTION_MIGRATION_USER2 . '.shareKey' , 'data'); + $this->view->file_put_contents($uid . '/files_encryption/share-keys/folder2/file.2.1.' . self::TEST_ENCRYPTION_MIGRATION_USER3 . '.shareKey' , 'data'); + if ($this->public_share_key_id) { + $this->view->file_put_contents($uid . '/files_encryption/share-keys/folder2/file.2.1.' . $this->public_share_key_id . '.shareKey' , 'data'); } - - // create test table - OC_DB::createDbFromStructure(__DIR__ . '/encryption_table.xml'); - - // in case of duplicate entries we want to preserve 0 on migration status and 1 on recovery - $data = array( - array('user1', 'server-side', 1, 1), - array('user1', 'server-side', 1, 0), - array('user1', 'server-side', 0, 1), - array('user1', 'server-side', 0, 0), - ); - foreach ($data as $d) { - OC_DB::executeAudited( - 'INSERT INTO `*PREFIX*encryption_test` values(?, ?, ?, ?)', - $d); + if ($this->recovery_key_id) { + $this->view->file_put_contents($uid . '/files_encryption/share-keys/folder2/file.2.1.' . $this->recovery_key_id . '.shareKey' , 'data'); } + } - // preform migration - $migration = new Migration('encryption_test'); - $migration->dropTableEncryption(); + protected function createDummyFileKeys($uid) { + $this->view->mkdir($uid . '/files_encryption/keyfiles/folder1/folder2/folder3'); + $this->view->mkdir($uid . '/files_encryption/keyfiles/folder2/'); + $this->view->file_put_contents($uid . '/files_encryption/keyfiles/folder1/folder2/folder3/file3.key' , 'data'); + $this->view->file_put_contents($uid . '/files_encryption/keyfiles/folder1/folder2/file2.key' , 'data'); + $this->view->file_put_contents($uid . '/files_encryption/keyfiles/folder1/file.1.key' , 'data'); + $this->view->file_put_contents($uid . '/files_encryption/keyfiles/folder2/file.2.1.key' , 'data'); + } - // assert - $this->assertTableNotExist('encryption_test'); + protected function createDummyFilesInTrash($uid) { + $this->view->mkdir($uid . '/files_trashbin/share-keys'); + $this->view->mkdir($uid . '/files_trashbin/share-keys/folder1.d7437648723'); + $this->view->file_put_contents($uid . '/files_trashbin/share-keys/file1.' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.shareKey.d5457864' , 'data'); + $this->view->file_put_contents($uid . '/files_trashbin/share-keys/file1.' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.shareKey.d5457864' , 'data'); + $this->view->file_put_contents($uid . '/files_trashbin/share-keys/folder1.d7437648723/file2.' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.shareKey' , 'data'); + + $this->view->mkdir($uid . '/files_trashbin/keyfiles'); + $this->view->mkdir($uid . '/files_trashbin/keyfiles/folder1.d7437648723'); + $this->view->file_put_contents($uid . '/files_trashbin/keyfiles/file1.key.d5457864' , 'data'); + $this->view->file_put_contents($uid . '/files_trashbin/keyfiles/folder1.d7437648723/file2.key' , 'data'); + } - $rec = \OC_Preferences::getValue('user1', 'files_encryption', 'recovery_enabled'); - $mig = \OC_Preferences::getValue('user1', 'files_encryption', 'migration_status'); + protected function createDummySystemWideKeys() { + $this->view->mkdir('owncloud_private_key'); + $this->view->file_put_contents('owncloud_private_key/systemwide_1.private.key', 'data'); + $this->view->file_put_contents('owncloud_private_key/systemwide_2.private.key', 'data'); + } + + public function testMigrateToNewFolderStructure() { + + // go back to the state before migration + $this->view->rename('/files_encryption/public_keys', '/public-keys'); + $this->view->rename('/public-keys/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.publicKey', '/public-keys/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.public.key'); + $this->view->rename('/public-keys/' . self::TEST_ENCRYPTION_MIGRATION_USER2 . '.publicKey', '/public-keys/' . self::TEST_ENCRYPTION_MIGRATION_USER2 . '.public.key'); + $this->view->rename('/public-keys/' . self::TEST_ENCRYPTION_MIGRATION_USER3 . '.publicKey', '/public-keys/' . self::TEST_ENCRYPTION_MIGRATION_USER3 . '.public.key'); + $this->view->deleteAll(self::TEST_ENCRYPTION_MIGRATION_USER1 . '/files_encryption/keys'); + $this->view->deleteAll(self::TEST_ENCRYPTION_MIGRATION_USER2 . '/files_encryption/keys'); + $this->view->deleteAll(self::TEST_ENCRYPTION_MIGRATION_USER3 . '/files_encryption/keys'); + $this->view->rename(self::TEST_ENCRYPTION_MIGRATION_USER1 . '/files_encryption/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.privateKey', + self::TEST_ENCRYPTION_MIGRATION_USER1 . '/files_encryption/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.private.key'); + $this->view->rename(self::TEST_ENCRYPTION_MIGRATION_USER2 . '/files_encryption/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.privateKey', + self::TEST_ENCRYPTION_MIGRATION_USER2 . '/files_encryption/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.private.key'); + $this->view->rename(self::TEST_ENCRYPTION_MIGRATION_USER3 . '/files_encryption/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.privateKey', + self::TEST_ENCRYPTION_MIGRATION_USER3 . '/files_encryption/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.private.key'); + + $this->createDummyShareKeys(self::TEST_ENCRYPTION_MIGRATION_USER1); + $this->createDummyShareKeys(self::TEST_ENCRYPTION_MIGRATION_USER2); + $this->createDummyShareKeys(self::TEST_ENCRYPTION_MIGRATION_USER3); + + $this->createDummyFileKeys(self::TEST_ENCRYPTION_MIGRATION_USER1); + $this->createDummyFileKeys(self::TEST_ENCRYPTION_MIGRATION_USER2); + $this->createDummyFileKeys(self::TEST_ENCRYPTION_MIGRATION_USER3); + + $this->createDummyFilesInTrash(self::TEST_ENCRYPTION_MIGRATION_USER2); + + // no user for system wide mount points + $this->createDummyFileKeys(''); + $this->createDummyShareKeys(''); + + $this->createDummySystemWideKeys(); + + $m = new \OCA\Files_Encryption\Migration(); + $m->reorganizeFolderStructure(); + + // TODO Verify that all files at the right place + $this->assertTrue($this->view->file_exists('/files_encryption/public_keys/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.publicKey')); + $this->assertTrue($this->view->file_exists('/files_encryption/public_keys/' . self::TEST_ENCRYPTION_MIGRATION_USER2 . '.publicKey')); + $this->assertTrue($this->view->file_exists('/files_encryption/public_keys/' . self::TEST_ENCRYPTION_MIGRATION_USER3 . '.publicKey')); + $this->verifyNewKeyPath(self::TEST_ENCRYPTION_MIGRATION_USER1); + $this->verifyNewKeyPath(self::TEST_ENCRYPTION_MIGRATION_USER2); + $this->verifyNewKeyPath(self::TEST_ENCRYPTION_MIGRATION_USER3); + // system wide keys + $this->verifyNewKeyPath(''); + // trash + $this->verifyFilesInTrash(self::TEST_ENCRYPTION_MIGRATION_USER2); - $this->assertEquals(1, $rec); - $this->assertEquals(0, $mig); } - /** - * @param string $table - */ - public function assertTableExist($table) { - $this->assertTrue(OC_DB::tableExists($table), 'Table ' . $table . ' does not exist'); + protected function verifyFilesInTrash($uid) { + // share keys + $this->view->file_exists($uid . '/files_trashbin/keys/file1.d5457864/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.shareKey.d5457864' , 'data'); + $this->view->file_exists($uid . '/files_trashbin/keys/file1.d5457864/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.shareKey.d5457864' , 'data'); + $this->view->file_exists($uid . '/files_trashbin/keys/folder1.d7437648723/file2/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.shareKey' , 'data'); + + // file keys + $this->view->file_exists($uid . '/files_trashbin/keys/file1.d5457864/fileKey.d5457864' , 'data'); + $this->view->file_exists($uid . '/files_trashbin/keyfiles/file1.d5457864/fileKey.d5457864' , 'data'); + $this->view->file_exists($uid . '/files_trashbin/keyfiles/folder1.d7437648723/file2/fileKey' , 'data'); } - /** - * @param string $table - */ - public function assertTableNotExist($table) { - $type=OC_Config::getValue( "dbtype", "sqlite" ); - if( $type == 'sqlite' || $type == 'sqlite3' ) { - // sqlite removes the tables after closing the DB - $this->assertTrue(true); - } else { - $this->assertFalse(OC_DB::tableExists($table), 'Table ' . $table . ' exists.'); + protected function verifyNewKeyPath($uid) { + // private key + if ($uid !== '') { + $this->assertTrue($this->view->file_exists($uid . '/files_encryption/' . $uid . '.privateKey')); + } + // file keys + $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/folder1/folder2/folder3/file3/fileKey')); + $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/folder1/folder2/file2/fileKey')); + $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/folder1/file.1/fileKey')); + $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/folder2/file.2.1/fileKey')); + // share keys + $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/folder1/folder2/folder3/file3/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.shareKey')); + $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/folder1/folder2/folder3/file3/' . self::TEST_ENCRYPTION_MIGRATION_USER2 . '.shareKey')); + $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/folder1/folder2/folder3/file3/' . self::TEST_ENCRYPTION_MIGRATION_USER3 . '.shareKey')); + $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/folder1/folder2/file2/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.shareKey')); + $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/folder1/folder2/file2/' . self::TEST_ENCRYPTION_MIGRATION_USER2 . '.shareKey')); + $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/folder1/folder2/file2/' . self::TEST_ENCRYPTION_MIGRATION_USER3 . '.shareKey')); + $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/folder1/file.1/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.shareKey')); + $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/folder1/file.1/' . self::TEST_ENCRYPTION_MIGRATION_USER2 . '.shareKey')); + $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/folder1/file.1/' . self::TEST_ENCRYPTION_MIGRATION_USER3 . '.shareKey')); + $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/folder2/file.2.1/' . self::TEST_ENCRYPTION_MIGRATION_USER1 . '.shareKey')); + $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/folder2/file.2.1/' . self::TEST_ENCRYPTION_MIGRATION_USER2 . '.shareKey')); + $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/folder2/file.2.1/' . self::TEST_ENCRYPTION_MIGRATION_USER3 . '.shareKey')); + if ($this->public_share_key_id) { + $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/folder2/file.2.1/' . $this->public_share_key_id . '.shareKey')); + } + if ($this->recovery_key_id) { + $this->assertTrue($this->view->file_exists($uid . '/files_encryption/keys/folder2/file.2.1/' . $this->recovery_key_id . '.shareKey')); } } - } diff --git a/apps/files_encryption/tests/proxy.php b/apps/files_encryption/tests/proxy.php index d3e568f8914..d5d9cc7daee 100644 --- a/apps/files_encryption/tests/proxy.php +++ b/apps/files_encryption/tests/proxy.php @@ -20,15 +20,13 @@ * */ -require_once __DIR__ . '/util.php'; - -use OCA\Encryption; +namespace OCA\Files_Encryption\Tests; /** - * Class Test_Encryption_Proxy + * Class Proxy * this class provide basic proxy app tests */ -class Test_Encryption_Proxy extends \PHPUnit_Framework_TestCase { +class Proxy extends TestCase { const TEST_ENCRYPTION_PROXY_USER1 = "test-proxy-user1"; @@ -44,52 +42,36 @@ class Test_Encryption_Proxy extends \PHPUnit_Framework_TestCase { public $filename; public static function setUpBeforeClass() { - // reset backend - \OC_User::clearBackends(); - \OC_User::useBackend('database'); - - \OC_Hook::clear('OC_Filesystem'); - \OC_Hook::clear('OC_User'); - - // Filesystem related hooks - \OCA\Encryption\Helper::registerFilesystemHooks(); - - // clear and register hooks - \OC_FileProxy::clearProxies(); - \OC_FileProxy::register(new OCA\Encryption\Proxy()); + parent::setUpBeforeClass(); // create test user - \Test_Encryption_Util::loginHelper(\Test_Encryption_Proxy::TEST_ENCRYPTION_PROXY_USER1, true); + self::loginHelper(self::TEST_ENCRYPTION_PROXY_USER1, true); } - function setUp() { + protected function setUp() { + parent::setUp(); + // set user id - \OC_User::setUserId(\Test_Encryption_Proxy::TEST_ENCRYPTION_PROXY_USER1); - $this->userId = \Test_Encryption_Proxy::TEST_ENCRYPTION_PROXY_USER1; - $this->pass = \Test_Encryption_Proxy::TEST_ENCRYPTION_PROXY_USER1; + \OC_User::setUserId(self::TEST_ENCRYPTION_PROXY_USER1); + $this->userId = self::TEST_ENCRYPTION_PROXY_USER1; + $this->pass = self::TEST_ENCRYPTION_PROXY_USER1; // init filesystem view - $this->view = new \OC\Files\View('/'. \Test_Encryption_Proxy::TEST_ENCRYPTION_PROXY_USER1 . '/files'); - $this->rootView = new \OC\Files\View('/'. \Test_Encryption_Proxy::TEST_ENCRYPTION_PROXY_USER1 ); + $this->view = new \OC\Files\View('/'. self::TEST_ENCRYPTION_PROXY_USER1 . '/files'); + $this->rootView = new \OC\Files\View('/'. self::TEST_ENCRYPTION_PROXY_USER1 ); // init short data $this->data = 'hats'; $this->dataLong = file_get_contents(__DIR__ . '/../lib/crypt.php'); - $this->filename = 'enc_proxy_tests-' . uniqid() . '.txt'; + $this->filename = 'enc_proxy_tests-' . $this->getUniqueID() . '.txt'; } public static function tearDownAfterClass() { // cleanup test user - \OC_User::deleteUser(\Test_Encryption_Proxy::TEST_ENCRYPTION_PROXY_USER1); - - \OC_Hook::clear(); - \OC_FileProxy::clearProxies(); + \OC_User::deleteUser(self::TEST_ENCRYPTION_PROXY_USER1); - // Delete keys in /data/ - $view = new \OC\Files\View('/'); - $view->rmdir('public-keys'); - $view->rmdir('owncloud_private_key'); + parent::tearDownAfterClass(); } /** @@ -155,13 +137,13 @@ class Test_Encryption_Proxy extends \PHPUnit_Framework_TestCase { public function isExcludedPathProvider() { return array( - array ('/' . \Test_Encryption_Proxy::TEST_ENCRYPTION_PROXY_USER1 . '/files/test.txt', false), - array (\Test_Encryption_Proxy::TEST_ENCRYPTION_PROXY_USER1 . '/files/test.txt', false), + array ('/' . self::TEST_ENCRYPTION_PROXY_USER1 . '/files/test.txt', false), + array (self::TEST_ENCRYPTION_PROXY_USER1 . '/files/test.txt', false), array ('/files/test.txt', true), - array ('/' . \Test_Encryption_Proxy::TEST_ENCRYPTION_PROXY_USER1 . '/files/versions/test.txt', false), - array ('/' . \Test_Encryption_Proxy::TEST_ENCRYPTION_PROXY_USER1 . '/files_versions/test.txt', false), - array ('/' . \Test_Encryption_Proxy::TEST_ENCRYPTION_PROXY_USER1 . '/files_trashbin/test.txt', true), - array ('/' . \Test_Encryption_Proxy::TEST_ENCRYPTION_PROXY_USER1 . '/file/test.txt', true), + array ('/' . self::TEST_ENCRYPTION_PROXY_USER1 . '/files/versions/test.txt', false), + array ('/' . self::TEST_ENCRYPTION_PROXY_USER1 . '/files_versions/test.txt', false), + array ('/' . self::TEST_ENCRYPTION_PROXY_USER1 . '/files_trashbin/test.txt', true), + array ('/' . self::TEST_ENCRYPTION_PROXY_USER1 . '/file/test.txt', true), ); } @@ -171,7 +153,7 @@ class Test_Encryption_Proxy extends \PHPUnit_Framework_TestCase { /** * Dummy class to make protected methods available for testing */ -class DummyProxy extends \OCA\Encryption\Proxy { +class DummyProxy extends \OCA\Files_Encryption\Proxy { public function isExcludedPathTesting($path, $uid) { return $this->isExcludedPath($path, $uid); } diff --git a/apps/files_encryption/tests/share.php b/apps/files_encryption/tests/share.php index d7efe21a8fd..d29e6a191c8 100755 --- a/apps/files_encryption/tests/share.php +++ b/apps/files_encryption/tests/share.php @@ -20,14 +20,12 @@ * */ -require_once __DIR__ . '/util.php'; - -use OCA\Encryption; +namespace OCA\Files_Encryption\Tests; /** - * Class Test_Encryption_Share + * Class Share */ -class Test_Encryption_Share extends \PHPUnit_Framework_TestCase { +class Share extends TestCase { const TEST_ENCRYPTION_SHARE_USER1 = "test-share-user1"; const TEST_ENCRYPTION_SHARE_USER2 = "test-share-user2"; @@ -39,7 +37,7 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase { public $filename; public $dataShort; /** - * @var OC\Files\View + * @var \OC\Files\View */ public $view; public $folder1; @@ -47,44 +45,33 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase { public $subsubfolder; public static function setUpBeforeClass() { - // reset backend - \OC_User::clearBackends(); - \OC_User::useBackend('database'); + parent::setUpBeforeClass(); // enable resharing \OC::$server->getAppConfig()->setValue('core', 'shareapi_allow_resharing', 'yes'); - // clear share hooks - \OC_Hook::clear('OCP\\Share'); - // register share hooks \OC::registerShareHooks(); \OCA\Files_Sharing\Helper::registerHooks(); - // Sharing related hooks - \OCA\Encryption\Helper::registerShareHooks(); - - // Filesystem related hooks - \OCA\Encryption\Helper::registerFilesystemHooks(); - // clear and register hooks - \OC_FileProxy::clearProxies(); - \OC_FileProxy::register(new OCA\Files\Share\Proxy()); - \OC_FileProxy::register(new OCA\Encryption\Proxy()); + \OC_FileProxy::register(new \OCA\Files\Share\Proxy()); // create users - \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1, true); - \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2, true); - \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER3, true); - \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER4, true); + self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1, true); + self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER2, true); + self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER3, true); + self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER4, true); // create group and assign users - \OC_Group::createGroup(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_GROUP1); - \OC_Group::addToGroup(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER3, \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_GROUP1); - \OC_Group::addToGroup(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER4, \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_GROUP1); + \OC_Group::createGroup(self::TEST_ENCRYPTION_SHARE_GROUP1); + \OC_Group::addToGroup(self::TEST_ENCRYPTION_SHARE_USER3, self::TEST_ENCRYPTION_SHARE_GROUP1); + \OC_Group::addToGroup(self::TEST_ENCRYPTION_SHARE_USER4, self::TEST_ENCRYPTION_SHARE_GROUP1); } - function setUp() { + protected function setUp() { + parent::setUp(); + $this->dataShort = 'hats'; $this->view = new \OC\Files\View('/'); @@ -95,43 +82,124 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase { $this->filename = 'share-tmp.test'; // remember files_trashbin state - $this->stateFilesTrashbin = OC_App::isEnabled('files_trashbin'); + $this->stateFilesTrashbin = \OC_App::isEnabled('files_trashbin'); // we don't want to tests with app files_trashbin enabled \OC_App::disable('files_trashbin'); // login as first user - \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1); + self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1); } - function tearDown() { + protected function tearDown() { // reset app files_trashbin if ($this->stateFilesTrashbin) { - OC_App::enable('files_trashbin'); + \OC_App::enable('files_trashbin'); } else { - OC_App::disable('files_trashbin'); + \OC_App::disable('files_trashbin'); } + + parent::tearDown(); } public static function tearDownAfterClass() { // clean group - \OC_Group::deleteGroup(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_GROUP1); + \OC_Group::deleteGroup(self::TEST_ENCRYPTION_SHARE_GROUP1); // cleanup users - \OC_User::deleteUser(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1); - \OC_User::deleteUser(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2); - \OC_User::deleteUser(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER3); - \OC_User::deleteUser(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER4); - - \OC_Hook::clear(); - \OC_FileProxy::clearProxies(); - - // Delete keys in /data/ - $view = new \OC\Files\View('/'); - $view->rmdir('public-keys'); - $view->rmdir('owncloud_private_key'); + \OC_User::deleteUser(self::TEST_ENCRYPTION_SHARE_USER1); + \OC_User::deleteUser(self::TEST_ENCRYPTION_SHARE_USER2); + \OC_User::deleteUser(self::TEST_ENCRYPTION_SHARE_USER3); + \OC_User::deleteUser(self::TEST_ENCRYPTION_SHARE_USER4); + + parent::tearDownAfterClass(); + } + + /** + * @medium + */ + function testDeclineServer2ServerShare() { + + $config = $this->getMockBuilder('\OCP\IConfig') + ->disableOriginalConstructor()->getMock(); + $certificateManager = $this->getMock('\OCP\ICertificateManager'); + $httpHelperMock = $this->getMockBuilder('\OC\HTTPHelper') + ->setConstructorArgs(array($config, $certificateManager)) + ->getMock(); + $httpHelperMock->expects($this->once())->method('post')->with($this->anything())->will($this->returnValue(true)); + + self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1); + + // save file with content + $cryptedFile = file_put_contents('crypt:///' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename, $this->dataShort); + + // test that data was successfully written + $this->assertTrue(is_int($cryptedFile)); + + // get the file info from previous created file + $fileInfo = $this->view->getFileInfo( + '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename); + + + // share the file + $token = \OCP\Share::shareItem('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_LINK, '', \OCP\Constants::PERMISSION_ALL); + $this->assertTrue(is_string($token)); + + $publicShareKeyId = \OC::$server->getConfig()->getAppValue('files_encryption', 'publicShareKeyId'); + + // check if share key for public exists + $this->assertTrue($this->view->file_exists( + '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/' + . $this->filename . '/' . $publicShareKeyId . '.shareKey')); + + // manipulate share + $query = \OC::$server->getDatabaseConnection()->prepare('UPDATE `*PREFIX*share` SET `share_type` = ?, `share_with` = ? WHERE `token`=?'); + $this->assertTrue($query->execute(array(\OCP\Share::SHARE_TYPE_REMOTE, 'foo@bar', $token))); + + // check if share key not exists + $this->assertTrue($this->view->file_exists( + '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/' + . $this->filename . '/' . $publicShareKeyId . '.shareKey')); + + + $query = \OC::$server->getDatabaseConnection()->prepare('SELECT * FROM `*PREFIX*share` WHERE `token`=?'); + $query->execute(array($token)); + + $share = $query->fetch(); + + $this->registerHttpHelper($httpHelperMock); + $_POST['token'] = $token; + $s2s = new \OCA\Files_Sharing\API\Server2Server(); + $s2s->declineShare(array('id' => $share['id'])); + $this->restoreHttpHelper(); + + $this->assertFalse($this->view->file_exists( + '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/' + . $this->filename . '/' . $publicShareKeyId . '.shareKey')); + + } + + + /** + * Register an http helper mock for testing purposes. + * @param $httpHelper http helper mock + */ + private function registerHttpHelper($httpHelper) { + $this->oldHttpHelper = \OC::$server->query('HTTPHelper'); + \OC::$server->registerService('HTTPHelper', function ($c) use ($httpHelper) { + return $httpHelper; + }); } + /** + * Restore the original http helper + */ + private function restoreHttpHelper() { + $oldHttpHelper = $this->oldHttpHelper; + \OC::$server->registerService('HTTPHelper', function ($c) use ($oldHttpHelper) { + return $oldHttpHelper; + }); + } /** * @medium @@ -139,10 +207,10 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase { */ function testShareFile($withTeardown = true) { // login as admin - \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1); + self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1); // save file with content - $cryptedFile = file_put_contents('crypt:///' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename, $this->dataShort); + $cryptedFile = file_put_contents('crypt:///' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename, $this->dataShort); // test that data was successfully written $this->assertTrue(is_int($cryptedFile)); @@ -153,7 +221,7 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase { // get the file info from previous created file $fileInfo = $this->view->getFileInfo( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename); + '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename); // check if we have a valid file info $this->assertTrue($fileInfo instanceof \OC\Files\FileInfo); @@ -165,22 +233,22 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase { \OC_FileProxy::$enabled = $proxyStatus; // share the file - \OCP\Share::shareItem('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER, \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2, OCP\PERMISSION_ALL); + \OCP\Share::shareItem('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER, self::TEST_ENCRYPTION_SHARE_USER2, \OCP\Constants::PERMISSION_ALL); // login as admin - \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1); + self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1); // check if share key for user1 exists $this->assertTrue($this->view->file_exists( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/share-keys/' - . $this->filename . '.' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '.shareKey')); + '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/' + . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '.shareKey')); // login as user1 - \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2); + self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER2); // get file contents $retrievedCryptedFile = $this->view->file_get_contents( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files/' . $this->filename); + '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '/files/' . $this->filename); // check if data is the same as we previously written $this->assertEquals($this->dataShort, $retrievedCryptedFile); @@ -189,25 +257,25 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase { if ($withTeardown) { // login as admin - \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1); + self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1); // unshare the file - \OCP\Share::unshare('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER, \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2); + \OCP\Share::unshare('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER, self::TEST_ENCRYPTION_SHARE_USER2); // check if share key not exists $this->assertFalse($this->view->file_exists( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/share-keys/' - . $this->filename . '.' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '.shareKey')); + '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/' + . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '.shareKey')); // cleanup - $this->view->chroot('/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files/'); + $this->view->chroot('/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files/'); $this->view->unlink($this->filename); $this->view->chroot('/'); // check if share key not exists $this->assertFalse($this->view->file_exists( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/share-keys/' - . $this->filename . '.' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '.shareKey')); + '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/' + . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '.shareKey')); } } @@ -219,29 +287,29 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase { $this->testShareFile(false); // login as user2 - \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2); + self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER2); // get the file info $fileInfo = $this->view->getFileInfo( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files/' . $this->filename); + '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '/files/' . $this->filename); // share the file with user3 - \OCP\Share::shareItem('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER, \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER3, OCP\PERMISSION_ALL); + \OCP\Share::shareItem('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER, self::TEST_ENCRYPTION_SHARE_USER3, \OCP\Constants::PERMISSION_ALL); // login as admin - \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1); + self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1); // check if share key for user2 exists $this->assertTrue($this->view->file_exists( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/share-keys/' - . $this->filename . '.' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER3 . '.shareKey')); + '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/' + . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER3 . '.shareKey')); // login as user2 - \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER3); + self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER3); // get file contents $retrievedCryptedFile = $this->view->file_get_contents( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER3 . '/files/' . $this->filename); + '/' . self::TEST_ENCRYPTION_SHARE_USER3 . '/files/' . $this->filename); // check if data is the same as previously written $this->assertEquals($this->dataShort, $retrievedCryptedFile); @@ -250,36 +318,36 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase { if ($withTeardown) { // login as user1 - \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2); + self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER2); // unshare the file with user2 - \OCP\Share::unshare('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER, \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER3); + \OCP\Share::unshare('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER, self::TEST_ENCRYPTION_SHARE_USER3); // login as admin - \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1); + self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1); // check if share key not exists $this->assertFalse($this->view->file_exists( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/share-keys/' - . $this->filename . '.' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER3 . '.shareKey')); + '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/' + . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER3 . '.shareKey')); // unshare the file with user1 - \OCP\Share::unshare('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER, \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2); + \OCP\Share::unshare('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER, self::TEST_ENCRYPTION_SHARE_USER2); // check if share key not exists $this->assertFalse($this->view->file_exists( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/share-keys/' - . $this->filename . '.' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '.shareKey')); + '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/' + . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '.shareKey')); // cleanup - $this->view->chroot('/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files/'); + $this->view->chroot('/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files/'); $this->view->unlink($this->filename); $this->view->chroot('/'); // check if share key not exists $this->assertFalse($this->view->file_exists( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/share-keys/' - . $this->filename . '.' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '.shareKey')); + '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/' + . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '.shareKey')); } } @@ -290,19 +358,19 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase { */ function testShareFolder($withTeardown = true) { // login as admin - \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1); + self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1); // create folder structure - $this->view->mkdir('/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files' . $this->folder1); + $this->view->mkdir('/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files' . $this->folder1); $this->view->mkdir( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files' . $this->folder1 . $this->subfolder); + '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files' . $this->folder1 . $this->subfolder); $this->view->mkdir( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files' . $this->folder1 . $this->subfolder + '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files' . $this->folder1 . $this->subfolder . $this->subsubfolder); // save file with content - $cryptedFile = file_put_contents('crypt:///' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->folder1 . $this->subfolder . $this->subsubfolder . '/' - . $this->filename, $this->dataShort); + $cryptedFile = file_put_contents('crypt:///' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->folder1 . $this->subfolder . $this->subsubfolder . '/' + . $this->filename, $this->dataShort); // test that data was successfully written $this->assertTrue(is_int($cryptedFile)); @@ -313,7 +381,7 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase { // get the file info from previous created folder $fileInfo = $this->view->getFileInfo( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files' . $this->folder1); + '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files' . $this->folder1); // check if we have a valid file info $this->assertTrue($fileInfo instanceof \OC\Files\FileInfo); @@ -322,23 +390,23 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase { \OC_FileProxy::$enabled = $proxyStatus; // share the folder with user1 - \OCP\Share::shareItem('folder', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER, \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2, OCP\PERMISSION_ALL); + \OCP\Share::shareItem('folder', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER, self::TEST_ENCRYPTION_SHARE_USER2, \OCP\Constants::PERMISSION_ALL); // login as admin - \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1); + self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1); // check if share key for user1 exists $this->assertTrue($this->view->file_exists( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/share-keys' . $this->folder1 + '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys' . $this->folder1 . $this->subfolder . $this->subsubfolder . '/' - . $this->filename . '.' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '.shareKey')); + . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '.shareKey')); // login as user1 - \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2); + self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER2); // get file contents $retrievedCryptedFile = $this->view->file_get_contents( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files/' . $this->folder1 + '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '/files/' . $this->folder1 . $this->subfolder . $this->subsubfolder . '/' . $this->filename); // check if data is the same @@ -348,27 +416,27 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase { if ($withTeardown) { // login as admin - \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1); + self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1); // unshare the folder with user1 - \OCP\Share::unshare('folder', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER, \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2); + \OCP\Share::unshare('folder', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER, self::TEST_ENCRYPTION_SHARE_USER2); // check if share key not exists $this->assertFalse($this->view->file_exists( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/share-keys' + '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys' . $this->folder1 . $this->subfolder . $this->subsubfolder . '/' - . $this->filename . '.' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '.shareKey')); + . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '.shareKey')); // cleanup - $this->view->chroot('/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files'); + $this->view->chroot('/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files'); $this->view->unlink($this->folder1); $this->view->chroot('/'); // check if share key not exists $this->assertFalse($this->view->file_exists( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/share-keys' + '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys' . $this->folder1 . $this->subfolder . $this->subsubfolder . '/' - . $this->filename . '.' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '.shareKey')); + . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '.shareKey')); } return $fileInfo; @@ -382,7 +450,7 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase { $fileInfoFolder1 = $this->testShareFolder(false); // login as user2 - \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2); + self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER2); // disable encryption proxy to prevent recursive calls $proxyStatus = \OC_FileProxy::$enabled; @@ -390,7 +458,7 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase { // get the file info from previous created folder $fileInfoSubFolder = $this->view->getFileInfo( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files/' . $this->folder1 + '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '/files/' . $this->folder1 . $this->subfolder); // check if we have a valid file info @@ -400,23 +468,23 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase { \OC_FileProxy::$enabled = $proxyStatus; // share the file with user3 - \OCP\Share::shareItem('folder', $fileInfoSubFolder['fileid'], \OCP\Share::SHARE_TYPE_USER, \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER3, OCP\PERMISSION_ALL); + \OCP\Share::shareItem('folder', $fileInfoSubFolder['fileid'], \OCP\Share::SHARE_TYPE_USER, self::TEST_ENCRYPTION_SHARE_USER3, \OCP\Constants::PERMISSION_ALL); // login as admin - \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1); + self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1); // check if share key for user3 exists $this->assertTrue($this->view->file_exists( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/share-keys' . $this->folder1 + '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys' . $this->folder1 . $this->subfolder . $this->subsubfolder . '/' - . $this->filename . '.' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER3 . '.shareKey')); + . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER3 . '.shareKey')); // login as user3 - \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER3); + self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER3); // get file contents $retrievedCryptedFile = $this->view->file_get_contents( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER3 . '/files/' . $this->subfolder + '/' . self::TEST_ENCRYPTION_SHARE_USER3 . '/files/' . $this->subfolder . $this->subsubfolder . '/' . $this->filename); // check if data is the same @@ -424,30 +492,30 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase { // get the file info $fileInfo = $this->view->getFileInfo( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER3 . '/files/' . $this->subfolder + '/' . self::TEST_ENCRYPTION_SHARE_USER3 . '/files/' . $this->subfolder . $this->subsubfolder . '/' . $this->filename); // check if we have fileInfos $this->assertTrue($fileInfo instanceof \OC\Files\FileInfo); // share the file with user3 - \OCP\Share::shareItem('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER, \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER4, OCP\PERMISSION_ALL); + \OCP\Share::shareItem('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER, self::TEST_ENCRYPTION_SHARE_USER4, \OCP\Constants::PERMISSION_ALL); // login as admin - \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1); + self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1); // check if share key for user3 exists $this->assertTrue($this->view->file_exists( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/share-keys' . $this->folder1 + '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys' . $this->folder1 . $this->subfolder . $this->subsubfolder . '/' - . $this->filename . '.' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER4 . '.shareKey')); + . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER4 . '.shareKey')); // login as user3 - \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER4); + self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER4); // get file contents $retrievedCryptedFile = $this->view->file_get_contents( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER4 . '/files/' . $this->filename); + '/' . self::TEST_ENCRYPTION_SHARE_USER4 . '/files/' . $this->filename); // check if data is the same $this->assertEquals($this->dataShort, $retrievedCryptedFile); @@ -456,61 +524,61 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase { if ($withTeardown) { // login as user2 - \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER3); + self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER3); // unshare the file with user3 - \OCP\Share::unshare('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER, \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER4); + \OCP\Share::unshare('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER, self::TEST_ENCRYPTION_SHARE_USER4); // check if share key not exists $this->assertFalse($this->view->file_exists( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/share-keys' + '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys' . $this->folder1 . $this->subfolder . $this->subsubfolder . '/' - . $this->filename . '.' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER4 . '.shareKey')); + . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER4 . '.shareKey')); // login as user1 - \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2); + self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER2); // unshare the folder with user2 - \OCP\Share::unshare('folder', $fileInfoSubFolder['fileid'], \OCP\Share::SHARE_TYPE_USER, \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER3); + \OCP\Share::unshare('folder', $fileInfoSubFolder['fileid'], \OCP\Share::SHARE_TYPE_USER, self::TEST_ENCRYPTION_SHARE_USER3); // check if share key not exists $this->assertFalse($this->view->file_exists( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/share-keys' + '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys' . $this->folder1 . $this->subfolder . $this->subsubfolder . '/' - . $this->filename . '.' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER3 . '.shareKey')); + . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER3 . '.shareKey')); // login as admin - \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1); + self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1); // unshare the folder1 with user1 - \OCP\Share::unshare('folder', $fileInfoFolder1['fileid'], \OCP\Share::SHARE_TYPE_USER, \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2); + \OCP\Share::unshare('folder', $fileInfoFolder1['fileid'], \OCP\Share::SHARE_TYPE_USER, self::TEST_ENCRYPTION_SHARE_USER2); // check if share key not exists $this->assertFalse($this->view->file_exists( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/share-keys' + '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys' . $this->folder1 . $this->subfolder . $this->subsubfolder . '/' - . $this->filename . '.' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '.shareKey')); + . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '.shareKey')); // cleanup - $this->view->chroot('/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files'); + $this->view->chroot('/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files'); $this->view->unlink($this->folder1 . $this->subfolder . $this->subsubfolder . '/' . $this->filename); $this->view->chroot('/'); // check if share key not exists $this->assertFalse($this->view->file_exists( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/share-keys' + '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys' . $this->folder1 . $this->subfolder . $this->subsubfolder . '/' - . $this->filename . '.' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '.shareKey')); + . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '.shareKey')); } } function testPublicShareFile() { // login as admin - \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1); + self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1); // save file with content - $cryptedFile = file_put_contents('crypt:///' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename, $this->dataShort); + $cryptedFile = file_put_contents('crypt:///' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename, $this->dataShort); // test that data was successfully written $this->assertTrue(is_int($cryptedFile)); @@ -521,7 +589,7 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase { // get the file info from previous created file $fileInfo = $this->view->getFileInfo( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename); + '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename); // check if we have a valid file info $this->assertTrue($fileInfo instanceof \OC\Files\FileInfo); @@ -533,25 +601,25 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase { \OC_FileProxy::$enabled = $proxyStatus; // share the file - \OCP\Share::shareItem('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_LINK, false, OCP\PERMISSION_ALL); + \OCP\Share::shareItem('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_LINK, false, \OCP\Constants::PERMISSION_ALL); // login as admin - \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1); + self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1); $publicShareKeyId = \OC::$server->getAppConfig()->getValue('files_encryption', 'publicShareKeyId'); // check if share key for public exists $this->assertTrue($this->view->file_exists( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/share-keys/' - . $this->filename . '.' . $publicShareKeyId . '.shareKey')); + '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/' + . $this->filename . '/' . $publicShareKeyId . '.shareKey')); // some hacking to simulate public link //$GLOBALS['app'] = 'files_sharing'; - //$GLOBALS['fileOwner'] = \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1; - \Test_Encryption_Util::logoutHelper(); + //$GLOBALS['fileOwner'] = self::TEST_ENCRYPTION_SHARE_USER1; + self::logoutHelper(); // get file contents - $retrievedCryptedFile = file_get_contents('crypt:///' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename); + $retrievedCryptedFile = file_get_contents('crypt:///' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename); // check if data is the same as we previously written $this->assertEquals($this->dataShort, $retrievedCryptedFile); @@ -559,25 +627,25 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase { // tear down // login as admin - \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1); + self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1); // unshare the file \OCP\Share::unshare('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_LINK, null); // check if share key not exists $this->assertFalse($this->view->file_exists( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/share-keys/' - . $this->filename . '.' . $publicShareKeyId . '.shareKey')); + '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/' + . $this->filename . '/' . $publicShareKeyId . '.shareKey')); // cleanup - $this->view->chroot('/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files/'); + $this->view->chroot('/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files/'); $this->view->unlink($this->filename); $this->view->chroot('/'); // check if share key not exists $this->assertFalse($this->view->file_exists( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/share-keys/' - . $this->filename . '.' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '.shareKey')); + '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/' + . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '.shareKey')); } /** @@ -585,10 +653,10 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase { */ function testShareFileWithGroup() { // login as admin - \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1); + self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1); // save file with content - $cryptedFile = file_put_contents('crypt:///' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename, $this->dataShort); + $cryptedFile = file_put_contents('crypt:///' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename, $this->dataShort); // test that data was successfully written $this->assertTrue(is_int($cryptedFile)); @@ -599,7 +667,7 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase { // get the file info from previous created file $fileInfo = $this->view->getFileInfo( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename); + '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename); // check if we have a valid file info $this->assertTrue($fileInfo instanceof \OC\Files\FileInfo); @@ -611,52 +679,52 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase { \OC_FileProxy::$enabled = $proxyStatus; // share the file - \OCP\Share::shareItem('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_GROUP, \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_GROUP1, OCP\PERMISSION_ALL); + \OCP\Share::shareItem('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_GROUP, self::TEST_ENCRYPTION_SHARE_GROUP1, \OCP\Constants::PERMISSION_ALL); // login as admin - \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1); + self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1); // check if share key for user2 and user3 exists $this->assertTrue($this->view->file_exists( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/share-keys/' - . $this->filename . '.' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER3 . '.shareKey')); + '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/' + . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER3 . '.shareKey')); $this->assertTrue($this->view->file_exists( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/share-keys/' - . $this->filename . '.' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER4 . '.shareKey')); + '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/' + . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER4 . '.shareKey')); // login as user1 - \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER3); + self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER3); // get file contents $retrievedCryptedFile = $this->view->file_get_contents( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER3 . '/files/' . $this->filename); + '/' . self::TEST_ENCRYPTION_SHARE_USER3 . '/files/' . $this->filename); // check if data is the same as we previously written $this->assertEquals($this->dataShort, $retrievedCryptedFile); // login as admin - \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1); + self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1); // unshare the file - \OCP\Share::unshare('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_GROUP, \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_GROUP1); + \OCP\Share::unshare('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_GROUP, self::TEST_ENCRYPTION_SHARE_GROUP1); // check if share key not exists $this->assertFalse($this->view->file_exists( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/share-keys/' - . $this->filename . '.' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER3 . '.shareKey')); + '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/' + . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER3 . '.shareKey')); $this->assertFalse($this->view->file_exists( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/share-keys/' - . $this->filename . '.' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER4 . '.shareKey')); + '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/' + . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER4 . '.shareKey')); // cleanup - $this->view->chroot('/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files/'); + $this->view->chroot('/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files/'); $this->view->unlink($this->filename); $this->view->chroot('/'); // check if share key not exists $this->assertFalse($this->view->file_exists( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/share-keys/' - . $this->filename . '.' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '.shareKey')); + '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/' + . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '.shareKey')); } @@ -666,15 +734,15 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase { function testRecoveryFile() { // login as admin - \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1); + self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1); - \OCA\Encryption\Helper::adminEnableRecovery(null, 'test123'); + \OCA\Files_Encryption\Helper::adminEnableRecovery(null, 'test123'); $recoveryKeyId = \OC::$server->getAppConfig()->getValue('files_encryption', 'recoveryKeyId'); // login as admin - \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1); + self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1); - $util = new \OCA\Encryption\Util(new \OC\Files\View('/'), \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1); + $util = new \OCA\Files_Encryption\Util(new \OC\Files\View('/'), self::TEST_ENCRYPTION_SHARE_USER1); // check if recovery password match $this->assertTrue($util->checkRecoveryPassword('test123')); @@ -684,17 +752,17 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase { $util->addRecoveryKeys(); // create folder structure - $this->view->mkdir('/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files' . $this->folder1); + $this->view->mkdir('/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files' . $this->folder1); $this->view->mkdir( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files' . $this->folder1 . $this->subfolder); + '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files' . $this->folder1 . $this->subfolder); $this->view->mkdir( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files' . $this->folder1 . $this->subfolder + '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files' . $this->folder1 . $this->subfolder . $this->subsubfolder); // save file with content - $cryptedFile1 = file_put_contents('crypt:///' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename, $this->dataShort); - $cryptedFile2 = file_put_contents('crypt:///' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->folder1 . $this->subfolder . $this->subsubfolder . '/' - . $this->filename, $this->dataShort); + $cryptedFile1 = file_put_contents('crypt:///' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename, $this->dataShort); + $cryptedFile2 = file_put_contents('crypt:///' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->folder1 . $this->subfolder . $this->subsubfolder . '/' + . $this->filename, $this->dataShort); // test that data was successfully written $this->assertTrue(is_int($cryptedFile1)); @@ -702,19 +770,19 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase { // check if share key for admin and recovery exists $this->assertTrue($this->view->file_exists( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/share-keys/' - . $this->filename . '.' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '.shareKey')); + '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/' + . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '.shareKey')); $this->assertTrue($this->view->file_exists( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/share-keys/' - . $this->filename . '.' . $recoveryKeyId . '.shareKey')); + '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/' + . $this->filename . '/' . $recoveryKeyId . '.shareKey')); $this->assertTrue($this->view->file_exists( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/share-keys/' . $this->folder1 + '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/' . $this->folder1 . $this->subfolder . $this->subsubfolder . '/' - . $this->filename . '.' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '.shareKey')); + . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '.shareKey')); $this->assertTrue($this->view->file_exists( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/share-keys/' . $this->folder1 + '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/' . $this->folder1 . $this->subfolder . $this->subsubfolder . '/' - . $this->filename . '.' . $recoveryKeyId . '.shareKey')); + . $this->filename . '/' . $recoveryKeyId . '.shareKey')); // disable recovery for admin $this->assertTrue($util->setRecoveryForUser(0)); @@ -724,12 +792,12 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase { // check if share key for recovery not exists $this->assertFalse($this->view->file_exists( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/share-keys/' - . $this->filename . '.' . $recoveryKeyId . '.shareKey')); + '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/' + . $this->filename . '/' . $recoveryKeyId . '.shareKey')); $this->assertFalse($this->view->file_exists( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/share-keys/' . $this->folder1 + '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/' . $this->folder1 . $this->subfolder . $this->subsubfolder . '/' - . $this->filename . '.' . $recoveryKeyId . '.shareKey')); + . $this->filename . '/' . $recoveryKeyId . '.shareKey')); // enable recovery for admin $this->assertTrue($util->setRecoveryForUser(1)); @@ -739,30 +807,30 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase { // check if share key for admin and recovery exists $this->assertTrue($this->view->file_exists( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/share-keys/' - . $this->filename . '.' . $recoveryKeyId . '.shareKey')); + '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/' + . $this->filename . '/' . $recoveryKeyId . '.shareKey')); $this->assertTrue($this->view->file_exists( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/share-keys/' . $this->folder1 + '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/' . $this->folder1 . $this->subfolder . $this->subsubfolder . '/' - . $this->filename . '.' . $recoveryKeyId . '.shareKey')); + . $this->filename . '/' . $recoveryKeyId . '.shareKey')); // cleanup - $this->view->chroot('/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files/'); + $this->view->chroot('/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files/'); $this->view->unlink($this->filename); $this->view->unlink($this->folder1); $this->view->chroot('/'); // check if share key for recovery not exists $this->assertFalse($this->view->file_exists( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/share-keys/' - . $this->filename . '.' . $recoveryKeyId . '.shareKey')); + '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/' + . $this->filename . '/' . $recoveryKeyId . '.shareKey')); $this->assertFalse($this->view->file_exists( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/share-keys/' . $this->folder1 + '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/' . $this->folder1 . $this->subfolder . $this->subsubfolder . '/' - . $this->filename . '.' . $recoveryKeyId . '.shareKey')); + . $this->filename . '/' . $recoveryKeyId . '.shareKey')); - $this->assertTrue(\OCA\Encryption\Helper::adminEnableRecovery(null, 'test123')); - $this->assertTrue(\OCA\Encryption\Helper::adminDisableRecovery('test123')); + $this->assertTrue(\OCA\Files_Encryption\Helper::adminEnableRecovery(null, 'test123')); + $this->assertTrue(\OCA\Files_Encryption\Helper::adminDisableRecovery('test123')); $this->assertEquals(0, \OC::$server->getAppConfig()->getValue('files_encryption', 'recoveryAdminEnabled')); } @@ -772,17 +840,17 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase { function testRecoveryForUser() { // login as admin - \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1); + self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1); - $result = \OCA\Encryption\Helper::adminEnableRecovery(null, 'test123'); + $result = \OCA\Files_Encryption\Helper::adminEnableRecovery(null, 'test123'); $this->assertTrue($result); $recoveryKeyId = \OC::$server->getAppConfig()->getValue('files_encryption', 'recoveryKeyId'); // login as user2 - \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2); + self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER2); - $util = new \OCA\Encryption\Util(new \OC\Files\View('/'), \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2); + $util = new \OCA\Files_Encryption\Util(new \OC\Files\View('/'), self::TEST_ENCRYPTION_SHARE_USER2); // enable recovery for admin $this->assertTrue($util->setRecoveryForUser(1)); @@ -791,17 +859,17 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase { $util->addRecoveryKeys(); // create folder structure - $this->view->mkdir('/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files' . $this->folder1); + $this->view->mkdir('/' . self::TEST_ENCRYPTION_SHARE_USER2 . '/files' . $this->folder1); $this->view->mkdir( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files' . $this->folder1 . $this->subfolder); + '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '/files' . $this->folder1 . $this->subfolder); $this->view->mkdir( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files' . $this->folder1 . $this->subfolder + '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '/files' . $this->folder1 . $this->subfolder . $this->subsubfolder); // save file with content - $cryptedFile1 = file_put_contents('crypt:///' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2. '/files/' . $this->filename, $this->dataShort); - $cryptedFile2 = file_put_contents('crypt:///' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files/' . $this->folder1 . $this->subfolder . $this->subsubfolder . '/' - . $this->filename, $this->dataShort); + $cryptedFile1 = file_put_contents('crypt:///' . self::TEST_ENCRYPTION_SHARE_USER2. '/files/' . $this->filename, $this->dataShort); + $cryptedFile2 = file_put_contents('crypt:///' . self::TEST_ENCRYPTION_SHARE_USER2 . '/files/' . $this->folder1 . $this->subfolder . $this->subsubfolder . '/' + . $this->filename, $this->dataShort); // test that data was successfully written $this->assertTrue(is_int($cryptedFile1)); @@ -809,76 +877,76 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase { // check if share key for user and recovery exists $this->assertTrue($this->view->file_exists( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files_encryption/share-keys/' - . $this->filename . '.' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '.shareKey')); + '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '/files_encryption/keys/' + . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '.shareKey')); $this->assertTrue($this->view->file_exists( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files_encryption/share-keys/' - . $this->filename . '.' . $recoveryKeyId . '.shareKey')); + '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '/files_encryption/keys/' + . $this->filename . '/' . $recoveryKeyId . '.shareKey')); $this->assertTrue($this->view->file_exists( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files_encryption/share-keys/' . $this->folder1 + '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '/files_encryption/keys/' . $this->folder1 . $this->subfolder . $this->subsubfolder . '/' - . $this->filename . '.' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '.shareKey')); + . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '.shareKey')); $this->assertTrue($this->view->file_exists( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files_encryption/share-keys/' . $this->folder1 + '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '/files_encryption/keys/' . $this->folder1 . $this->subfolder . $this->subsubfolder . '/' - . $this->filename . '.' . $recoveryKeyId . '.shareKey')); + . $this->filename . '/' . $recoveryKeyId . '.shareKey')); // login as admin - \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1); + self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1); // change password - \OC_User::setPassword(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2, 'test', 'test123'); - $params = array('uid' => \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2, + \OC_User::setPassword(self::TEST_ENCRYPTION_SHARE_USER2, 'test', 'test123'); + $params = array('uid' => self::TEST_ENCRYPTION_SHARE_USER2, 'password' => 'test', 'recoveryPassword' => 'test123'); - \OCA\Encryption\Hooks::setPassphrase($params); + \OCA\Files_Encryption\Hooks::setPassphrase($params); // login as user2 - \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2, false, 'test'); + self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER2, false, 'test'); // get file contents - $retrievedCryptedFile1 = file_get_contents('crypt:///' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files/' . $this->filename); + $retrievedCryptedFile1 = file_get_contents('crypt:///' . self::TEST_ENCRYPTION_SHARE_USER2 . '/files/' . $this->filename); $retrievedCryptedFile2 = file_get_contents( - 'crypt:///' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files' . $this->folder1 . $this->subfolder . $this->subsubfolder . '/' . $this->filename); + 'crypt:///' . self::TEST_ENCRYPTION_SHARE_USER2 . '/files' . $this->folder1 . $this->subfolder . $this->subsubfolder . '/' . $this->filename); // check if data is the same as we previously written $this->assertEquals($this->dataShort, $retrievedCryptedFile1); $this->assertEquals($this->dataShort, $retrievedCryptedFile2); // cleanup - $this->view->chroot('/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files/'); + $this->view->chroot('/' . self::TEST_ENCRYPTION_SHARE_USER2 . '/files/'); $this->view->unlink($this->folder1); $this->view->unlink($this->filename); $this->view->chroot('/'); // check if share key for user and recovery exists $this->assertFalse($this->view->file_exists( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files_encryption/share-keys/' - . $this->filename . '.' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '.shareKey')); + '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '/files_encryption/keys/' + . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '.shareKey')); $this->assertFalse($this->view->file_exists( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files_encryption/share-keys/' - . $this->filename . '.' . $recoveryKeyId . '.shareKey')); + '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '/files_encryption/keys/' + . $this->filename . '/' . $recoveryKeyId . '.shareKey')); $this->assertFalse($this->view->file_exists( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files_encryption/share-keys/' . $this->folder1 + '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '/files_encryption/keys/' . $this->folder1 . $this->subfolder . $this->subsubfolder . '/' - . $this->filename . '.' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '.shareKey')); + . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '.shareKey')); $this->assertFalse($this->view->file_exists( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files_encryption/share-keys/' . $this->folder1 + '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '/files_encryption/keys/' . $this->folder1 . $this->subfolder . $this->subsubfolder . '/' - . $this->filename . '.' . $recoveryKeyId . '.shareKey')); + . $this->filename . '/' . $recoveryKeyId . '.shareKey')); // enable recovery for admin $this->assertTrue($util->setRecoveryForUser(0)); - \OCA\Encryption\Helper::adminDisableRecovery('test123'); + \OCA\Files_Encryption\Helper::adminDisableRecovery('test123'); $this->assertEquals(0, \OC::$server->getAppConfig()->getValue('files_encryption', 'recoveryAdminEnabled')); //clean up, reset passwords - \OC_User::setPassword(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2, \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2, 'test123'); - $params = array('uid' => \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2, - 'password' => \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2, + \OC_User::setPassword(self::TEST_ENCRYPTION_SHARE_USER2, self::TEST_ENCRYPTION_SHARE_USER2, 'test123'); + $params = array('uid' => self::TEST_ENCRYPTION_SHARE_USER2, + 'password' => self::TEST_ENCRYPTION_SHARE_USER2, 'recoveryPassword' => 'test123'); - \OCA\Encryption\Hooks::setPassphrase($params); + \OCA\Files_Encryption\Hooks::setPassphrase($params); } /** @@ -886,10 +954,10 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase { */ function testFailShareFile() { // login as admin - \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1); + self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1); // save file with content - $cryptedFile = file_put_contents('crypt:///' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename, $this->dataShort); + $cryptedFile = file_put_contents('crypt:///' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename, $this->dataShort); // test that data was successfully written $this->assertTrue(is_int($cryptedFile)); @@ -900,7 +968,7 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase { // get the file info from previous created file $fileInfo = $this->view->getFileInfo( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename); + '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename); // check if we have a valid file info $this->assertTrue($fileInfo instanceof \OC\Files\FileInfo); @@ -909,27 +977,27 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase { $this->assertGreaterThan(0, $fileInfo['unencrypted_size']); // break users public key - $this->view->rename('/public-keys/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER3 . '.public.key', - '/public-keys/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER3 . '.public.key_backup'); + $this->view->rename(\OCA\Files_Encryption\Keymanager::getPublicKeyPath() . '/' . self::TEST_ENCRYPTION_SHARE_USER3 . '.publicKey', + \OCA\Files_Encryption\Keymanager::getPublicKeyPath() . '/' . self::TEST_ENCRYPTION_SHARE_USER3 . '.publicKey_backup'); // re-enable the file proxy \OC_FileProxy::$enabled = $proxyStatus; // share the file try { - \OCP\Share::shareItem('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_GROUP, \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_GROUP1, OCP\PERMISSION_ALL); - } catch (Exception $e) { + \OCP\Share::shareItem('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_GROUP, self::TEST_ENCRYPTION_SHARE_GROUP1, \OCP\Constants::PERMISSION_ALL); + } catch (\Exception $e) { $this->assertEquals(0, strpos($e->getMessage(), "Following users are not set up for encryption")); } // login as admin - \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1); + self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1); // check if share key for user1 not exists $this->assertFalse($this->view->file_exists( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/share-keys/' - . $this->filename . '.' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER3 . '.shareKey')); + '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/' + . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER3 . '.shareKey')); // disable encryption proxy to prevent recursive calls $proxyStatus = \OC_FileProxy::$enabled; @@ -937,27 +1005,27 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase { // break user1 public key $this->view->rename( - '/public-keys/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER3 . '.public.key_backup', - '/public-keys/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER3 . '.public.key'); + \OCA\Files_Encryption\Keymanager::getPublicKeyPath() . '/' . self::TEST_ENCRYPTION_SHARE_USER3 . '.publicKey_backup', + \OCA\Files_Encryption\Keymanager::getPublicKeyPath() . '/' . self::TEST_ENCRYPTION_SHARE_USER3 . '.publicKey'); // remove share file - $this->view->unlink('/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/share-keys/' - . $this->filename . '.' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER3 - . '.shareKey'); + $this->view->unlink('/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/' + . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER3 + . '.shareKey'); // re-enable the file proxy \OC_FileProxy::$enabled = $proxyStatus; // unshare the file with user1 - \OCP\Share::unshare('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_GROUP, \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_GROUP1); + \OCP\Share::unshare('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_GROUP, self::TEST_ENCRYPTION_SHARE_GROUP1); // check if share key not exists $this->assertFalse($this->view->file_exists( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/share-keys/' - . $this->filename . '.' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER3 . '.shareKey')); + '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/' + . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER3 . '.shareKey')); // cleanup - $this->view->chroot('/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files/'); + $this->view->chroot('/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files/'); $this->view->unlink($this->filename); $this->view->chroot('/'); } @@ -969,56 +1037,56 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase { function testRename() { // login as admin - \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1); + self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1); // save file with content - $cryptedFile = file_put_contents('crypt:///' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename, $this->dataShort); + $cryptedFile = file_put_contents('crypt:///' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename, $this->dataShort); // test that data was successfully written $this->assertTrue(is_int($cryptedFile)); // get the file info from previous created file $fileInfo = $this->view->getFileInfo( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename); + '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename); // check if we have a valid file info $this->assertTrue($fileInfo instanceof \OC\Files\FileInfo); // share the file - \OCP\Share::shareItem('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER, \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2, OCP\PERMISSION_ALL); + \OCP\Share::shareItem('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER, self::TEST_ENCRYPTION_SHARE_USER2, \OCP\Constants::PERMISSION_ALL); // check if share key for user2 exists $this->assertTrue($this->view->file_exists( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/share-keys/' - . $this->filename . '.' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '.shareKey')); + '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/' + . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '.shareKey')); // login as user2 - \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2); + self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER2); - $this->assertTrue($this->view->file_exists('/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files/' . $this->filename)); + $this->assertTrue($this->view->file_exists('/' . self::TEST_ENCRYPTION_SHARE_USER2 . '/files/' . $this->filename)); // get file contents $retrievedCryptedFile = $this->view->file_get_contents( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files/' . $this->filename); + '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '/files/' . $this->filename); // check if data is the same as we previously written $this->assertEquals($this->dataShort, $retrievedCryptedFile); // move the file to a subfolder - $this->view->rename('/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files/' . $this->filename, - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files/' . $this->folder1 . $this->filename); + $this->view->rename('/' . self::TEST_ENCRYPTION_SHARE_USER2 . '/files/' . $this->filename, + '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '/files/' . $this->folder1 . $this->filename); // check if we can read the moved file $retrievedRenamedFile = $this->view->file_get_contents( - '/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '/files/' . $this->folder1 . $this->filename); + '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '/files/' . $this->folder1 . $this->filename); // check if data is the same as we previously written $this->assertEquals($this->dataShort, $retrievedRenamedFile); // cleanup - \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1); - $this->view->unlink('/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename); + self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1); + $this->view->unlink('/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename); } /** @@ -1027,10 +1095,10 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase { */ function testMoveFolder() { - $view = new \OC\Files\View('/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1); + $view = new \OC\Files\View('/' . self::TEST_ENCRYPTION_SHARE_USER1); - $filename = '/tmp-' . uniqid(); - $folder = '/folder' . uniqid(); + $filename = '/tmp-' . $this->getUniqueID(); + $folder = '/folder' . $this->getUniqueID(); \OC\Files\Filesystem::mkdir($folder); @@ -1045,7 +1113,7 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase { $this->assertEquals($this->dataShort, $decrypt); - $newFolder = '/newfolder/subfolder' . uniqid(); + $newFolder = '/newfolder/subfolder' . $this->getUniqueID(); \OC\Files\Filesystem::mkdir('/newfolder'); // get the file info from previous created file @@ -1053,7 +1121,7 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase { $this->assertTrue($fileInfo instanceof \OC\Files\FileInfo); // share the folder - \OCP\Share::shareItem('folder', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER, \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2, OCP\PERMISSION_ALL); + \OCP\Share::shareItem('folder', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER, self::TEST_ENCRYPTION_SHARE_USER2, \OCP\Constants::PERMISSION_ALL); \OC\Files\Filesystem::rename($folder, $newFolder); @@ -1062,10 +1130,10 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase { $this->assertEquals($this->dataShort, $newDecrypt); // check if additional share key for user2 exists - $this->assertTrue($view->file_exists('files_encryption/share-keys' . $newFolder . '/' . $filename . '.' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '.shareKey')); + $this->assertTrue($view->file_exists('files_encryption/keys' . $newFolder . '/' . $filename . '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '.shareKey')); // check that old keys were removed/moved properly - $this->assertFalse($view->file_exists('files_encryption/share-keys' . $folder . '/' . $filename . '.' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '.shareKey')); + $this->assertFalse($view->file_exists('files_encryption/keys' . $folder . '/' . $filename . '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '.shareKey')); // tear down \OC\Files\Filesystem::unlink($newFolder); @@ -1075,9 +1143,9 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase { function usersProvider() { return array( // test as owner - array(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1), + array(self::TEST_ENCRYPTION_SHARE_USER1), // test as share receiver - array(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2), + array(self::TEST_ENCRYPTION_SHARE_USER2), ); } @@ -1085,10 +1153,10 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase { * @dataProvider usersProvider */ function testMoveFileToFolder($userId) { - $view = new \OC\Files\View('/' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1); + $view = new \OC\Files\View('/' . self::TEST_ENCRYPTION_SHARE_USER1); - $filename = '/tmp-' . uniqid(); - $folder = '/folder' . uniqid(); + $filename = '/tmp-' . $this->getUniqueID(); + $folder = '/folder' . $this->getUniqueID(); \OC\Files\Filesystem::mkdir($folder); @@ -1103,7 +1171,7 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase { $this->assertEquals($this->dataShort, $decrypt); - $subFolder = $folder . '/subfolder' . uniqid(); + $subFolder = $folder . '/subfolder' . $this->getUniqueID(); \OC\Files\Filesystem::mkdir($subFolder); // get the file info from previous created file @@ -1111,32 +1179,32 @@ class Test_Encryption_Share extends \PHPUnit_Framework_TestCase { $this->assertTrue($fileInfo instanceof \OC\Files\FileInfo); // share the folder - \OCP\Share::shareItem('folder', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER, \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2, OCP\PERMISSION_ALL); + \OCP\Share::shareItem('folder', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER, self::TEST_ENCRYPTION_SHARE_USER2, \OCP\Constants::PERMISSION_ALL); // check that the share keys exist - $this->assertTrue($view->file_exists('files_encryption/share-keys' . $folder . '/' . $filename . '.' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '.shareKey')); - $this->assertTrue($view->file_exists('files_encryption/share-keys' . $folder . '/' . $filename . '.' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '.shareKey')); + $this->assertTrue($view->file_exists('files_encryption/keys' . $folder . '/' . $filename . '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '.shareKey')); + $this->assertTrue($view->file_exists('files_encryption/keys' . $folder . '/' . $filename . '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '.shareKey')); // move the file into the subfolder as the test user - \Test_Encryption_Util::loginHelper($userId); + self::loginHelper($userId); \OC\Files\Filesystem::rename($folder . $filename, $subFolder . $filename); - \Test_Encryption_Util::loginHelper(\Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1); + self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1); // Get file decrypted contents $newDecrypt = \OC\Files\Filesystem::file_get_contents($subFolder . $filename); $this->assertEquals($this->dataShort, $newDecrypt); // check if additional share key for user2 exists - $this->assertTrue($view->file_exists('files_encryption/share-keys' . $subFolder . '/' . $filename . '.' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '.shareKey')); - $this->assertTrue($view->file_exists('files_encryption/share-keys' . $subFolder . '/' . $filename . '.' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '.shareKey')); + $this->assertTrue($view->file_exists('files_encryption/keys' . $subFolder . '/' . $filename . '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '.shareKey')); + $this->assertTrue($view->file_exists('files_encryption/keys' . $subFolder . '/' . $filename . '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '.shareKey')); // check that old keys were removed/moved properly - $this->assertFalse($view->file_exists('files_encryption/share-keys' . $folder . '/' . $filename . '.' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER1 . '.shareKey')); - $this->assertFalse($view->file_exists('files_encryption/share-keys' . $folder . '/' . $filename . '.' . \Test_Encryption_Share::TEST_ENCRYPTION_SHARE_USER2 . '.shareKey')); + $this->assertFalse($view->file_exists('files_encryption/keys' . $folder . '/' . $filename . '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '.shareKey')); + $this->assertFalse($view->file_exists('files_encryption/keys' . $folder . '/' . $filename . '/' . self::TEST_ENCRYPTION_SHARE_USER2 . '.shareKey')); // tear down \OC\Files\Filesystem::unlink($subFolder); \OC\Files\Filesystem::unlink($folder); } -} +}
\ No newline at end of file diff --git a/apps/files_encryption/tests/stream.php b/apps/files_encryption/tests/stream.php index 2b57f11c680..8295ddd9523 100644 --- a/apps/files_encryption/tests/stream.php +++ b/apps/files_encryption/tests/stream.php @@ -20,15 +20,13 @@ * */ -require_once __DIR__ . '/util.php'; - -use OCA\Encryption; +namespace OCA\Files_Encryption\Tests; /** - * Class Test_Encryption_Stream + * Class Stream * this class provide basic stream tests */ -class Test_Encryption_Stream extends \PHPUnit_Framework_TestCase { +class Stream extends TestCase { const TEST_ENCRYPTION_STREAM_USER1 = "test-stream-user1"; @@ -42,26 +40,19 @@ class Test_Encryption_Stream extends \PHPUnit_Framework_TestCase { public $stateFilesTrashbin; public static function setUpBeforeClass() { - // reset backend - \OC_User::clearBackends(); - \OC_User::useBackend('database'); - - // Filesystem related hooks - \OCA\Encryption\Helper::registerFilesystemHooks(); - - // clear and register hooks - \OC_FileProxy::clearProxies(); - \OC_FileProxy::register(new OCA\Encryption\Proxy()); + parent::setUpBeforeClass(); // create test user - \Test_Encryption_Util::loginHelper(\Test_Encryption_Stream::TEST_ENCRYPTION_STREAM_USER1, true); + self::loginHelper(self::TEST_ENCRYPTION_STREAM_USER1, true); } - function setUp() { + protected function setUp() { + parent::setUp(); + // set user id - \OC_User::setUserId(\Test_Encryption_Stream::TEST_ENCRYPTION_STREAM_USER1); - $this->userId = \Test_Encryption_Stream::TEST_ENCRYPTION_STREAM_USER1; - $this->pass = \Test_Encryption_Stream::TEST_ENCRYPTION_STREAM_USER1; + \OC_User::setUserId(self::TEST_ENCRYPTION_STREAM_USER1); + $this->userId = self::TEST_ENCRYPTION_STREAM_USER1; + $this->pass = self::TEST_ENCRYPTION_STREAM_USER1; // init filesystem view $this->view = new \OC\Files\View('/'); @@ -70,37 +61,33 @@ class Test_Encryption_Stream extends \PHPUnit_Framework_TestCase { $this->dataShort = 'hats'; // remember files_trashbin state - $this->stateFilesTrashbin = OC_App::isEnabled('files_trashbin'); + $this->stateFilesTrashbin = \OC_App::isEnabled('files_trashbin'); // we don't want to tests with app files_trashbin enabled \OC_App::disable('files_trashbin'); } - function tearDown() { + protected function tearDown() { // reset app files_trashbin if ($this->stateFilesTrashbin) { - OC_App::enable('files_trashbin'); + \OC_App::enable('files_trashbin'); } else { - OC_App::disable('files_trashbin'); + \OC_App::disable('files_trashbin'); } + + parent::tearDown(); } public static function tearDownAfterClass() { // cleanup test user - \OC_User::deleteUser(\Test_Encryption_Stream::TEST_ENCRYPTION_STREAM_USER1); - - \OC_Hook::clear(); - \OC_FileProxy::clearProxies(); + \OC_User::deleteUser(self::TEST_ENCRYPTION_STREAM_USER1); - // Delete keys in /data/ - $view = new \OC\Files\View('/'); - $view->rmdir('public-keys'); - $view->rmdir('owncloud_private_key'); + parent::tearDownAfterClass(); } function testStreamOptions() { - $filename = '/tmp-' . uniqid(); + $filename = '/tmp-' . $this->getUniqueID(); $view = new \OC\Files\View('/' . $this->userId . '/files'); // Save short data as encrypted file using stream wrapper @@ -118,12 +105,14 @@ class Test_Encryption_Stream extends \PHPUnit_Framework_TestCase { $this->assertTrue(flock($handle, LOCK_SH)); $this->assertTrue(flock($handle, LOCK_UN)); + fclose($handle); + // tear down $view->unlink($filename); } function testStreamSetBlocking() { - $filename = '/tmp-' . uniqid(); + $filename = '/tmp-' . $this->getUniqueID(); $view = new \OC\Files\View('/' . $this->userId . '/files'); // Save short data as encrypted file using stream wrapper @@ -134,6 +123,13 @@ class Test_Encryption_Stream extends \PHPUnit_Framework_TestCase { $handle = $view->fopen($filename, 'r'); + + if (\OC_Util::runningOnWindows()) { + fclose($handle); + $view->unlink($filename); + $this->markTestSkipped('[Windows] stream_set_blocking() does not work as expected on Windows.'); + } + // set stream options $this->assertTrue(stream_set_blocking($handle, 1)); @@ -147,7 +143,7 @@ class Test_Encryption_Stream extends \PHPUnit_Framework_TestCase { * @medium */ function testStreamSetTimeout() { - $filename = '/tmp-' . uniqid(); + $filename = '/tmp-' . $this->getUniqueID(); $view = new \OC\Files\View('/' . $this->userId . '/files'); // Save short data as encrypted file using stream wrapper @@ -168,7 +164,7 @@ class Test_Encryption_Stream extends \PHPUnit_Framework_TestCase { } function testStreamSetWriteBuffer() { - $filename = '/tmp-' . uniqid(); + $filename = '/tmp-' . $this->getUniqueID(); $view = new \OC\Files\View('/' . $this->userId . '/files'); // Save short data as encrypted file using stream wrapper @@ -194,9 +190,9 @@ class Test_Encryption_Stream extends \PHPUnit_Framework_TestCase { */ function testStreamFromLocalFile() { - $filename = '/' . $this->userId . '/files/' . 'tmp-' . uniqid().'.txt'; + $filename = '/' . $this->userId . '/files/' . 'tmp-' . $this->getUniqueID().'.txt'; - $tmpFilename = "/tmp/" . uniqid() . ".txt"; + $tmpFilename = "/tmp/" . $this->getUniqueID() . ".txt"; // write an encrypted file $cryptedFile = $this->view->file_put_contents($filename, $this->dataShort); @@ -212,7 +208,7 @@ class Test_Encryption_Stream extends \PHPUnit_Framework_TestCase { file_put_contents($tmpFilename, $encryptedContent); - \OCA\Encryption\Helper::addTmpFileToMapper($tmpFilename, $filename); + \OCA\Files_Encryption\Helper::addTmpFileToMapper($tmpFilename, $filename); // try to read the file from /tmp $handle = fopen("crypt://".$tmpFilename, "r"); @@ -221,6 +217,8 @@ class Test_Encryption_Stream extends \PHPUnit_Framework_TestCase { // check if it was successful $this->assertEquals($this->dataShort, $contentFromTmpFile); + fclose($handle); + // clean up unlink($tmpFilename); $this->view->unlink($filename); diff --git a/apps/files_encryption/tests/testcase.php b/apps/files_encryption/tests/testcase.php new file mode 100644 index 00000000000..c2e5f4de8c1 --- /dev/null +++ b/apps/files_encryption/tests/testcase.php @@ -0,0 +1,96 @@ +<?php +/** + * Copyright (c) 2012 Sam Tuke <samtuke@owncloud.com> + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace OCA\Files_Encryption\Tests; + +/** + * Class TestCase + */ +abstract class TestCase extends \Test\TestCase { + + /** + * @param string $user + * @param bool $create + * @param bool $password + */ + public static function loginHelper($user, $create = false, $password = false, $loadEncryption = true) { + if ($create) { + try { + \OC_User::createUser($user, $user); + } catch (\Exception $e) { + // catch username is already being used from previous aborted runs + } + } + + if ($password === false) { + $password = $user; + } + + \OC_Util::tearDownFS(); + \OC_User::setUserId(''); + \OC\Files\Filesystem::tearDown(); + \OC_User::setUserId($user); + \OC_Util::setupFS($user); + + if ($loadEncryption) { + $params['uid'] = $user; + $params['password'] = $password; + \OCA\Files_Encryption\Hooks::login($params); + } + } + + public static function logoutHelper() { + \OC_Util::tearDownFS(); + \OC_User::setUserId(false); + \OC\Files\Filesystem::tearDown(); + } + + public static function setUpBeforeClass() { + parent::setUpBeforeClass(); + + // reset backend + \OC_User::clearBackends(); + \OC_User::useBackend('database'); + + \OCA\Files_Encryption\Helper::registerFilesystemHooks(); + \OCA\Files_Encryption\Helper::registerUserHooks(); + \OCA\Files_Encryption\Helper::registerShareHooks(); + + \OC::registerShareHooks(); + \OCP\Util::connectHook('OC_Filesystem', 'setup', '\OC\Files\Storage\Shared', 'setup'); + + // clear and register hooks + \OC_FileProxy::clearProxies(); + \OC_FileProxy::register(new \OCA\Files_Encryption\Proxy()); + } + + public static function tearDownAfterClass() { + \OC_Hook::clear(); + \OC_FileProxy::clearProxies(); + + // Delete keys in /data/ + $view = new \OC\Files\View('/'); + $view->deleteAll('files_encryption'); + + parent::tearDownAfterClass(); + } + + protected function tearDown() { + parent::tearDown(); + $this->resetKeyCache(); + } + + protected function resetKeyCache() { + // reset key cache for every testrun + $keyCache = new \ReflectionProperty('\OCA\Files_Encryption\Keymanager', 'key_cache'); + $keyCache->setAccessible(true); + $keyCache->setValue(array()); + $keyCache->setAccessible(false); + } + +} diff --git a/apps/files_encryption/tests/trashbin.php b/apps/files_encryption/tests/trashbin.php index d795240399c..d924b8ac77a 100755 --- a/apps/files_encryption/tests/trashbin.php +++ b/apps/files_encryption/tests/trashbin.php @@ -20,15 +20,13 @@ * */ -require_once __DIR__ . '/util.php'; - -use OCA\Encryption; +namespace OCA\Files_Encryption\Tests; /** - * Class Test_Encryption_Trashbin + * Class Trashbin * this class provide basic trashbin app tests */ -class Test_Encryption_Trashbin extends \PHPUnit_Framework_TestCase { +class Trashbin extends TestCase { const TEST_ENCRYPTION_TRASHBIN_USER1 = "test-trashbin-user1"; @@ -45,32 +43,22 @@ class Test_Encryption_Trashbin extends \PHPUnit_Framework_TestCase { public $subsubfolder; public static function setUpBeforeClass() { - // reset backend - \OC_User::clearBackends(); - \OC_User::useBackend('database'); - - \OC_Hook::clear('OC_Filesystem'); - \OC_Hook::clear('OC_User'); + parent::setUpBeforeClass(); // trashbin hooks \OCA\Files_Trashbin\Trashbin::registerHooks(); - // Filesystem related hooks - \OCA\Encryption\Helper::registerFilesystemHooks(); - - // clear and register hooks - \OC_FileProxy::clearProxies(); - \OC_FileProxy::register(new OCA\Encryption\Proxy()); - // create test user - \Test_Encryption_Util::loginHelper(\Test_Encryption_Trashbin::TEST_ENCRYPTION_TRASHBIN_USER1, true); + self::loginHelper(self::TEST_ENCRYPTION_TRASHBIN_USER1, true); } - function setUp() { + protected function setUp() { + parent::setUp(); + // set user id - \OC_User::setUserId(\Test_Encryption_Trashbin::TEST_ENCRYPTION_TRASHBIN_USER1); - $this->userId = \Test_Encryption_Trashbin::TEST_ENCRYPTION_TRASHBIN_USER1; - $this->pass = \Test_Encryption_Trashbin::TEST_ENCRYPTION_TRASHBIN_USER1; + \OC_User::setUserId(self::TEST_ENCRYPTION_TRASHBIN_USER1); + $this->userId = self::TEST_ENCRYPTION_TRASHBIN_USER1; + $this->pass = self::TEST_ENCRYPTION_TRASHBIN_USER1; // init filesystem view $this->view = new \OC\Files\View('/'); @@ -83,33 +71,29 @@ class Test_Encryption_Trashbin extends \PHPUnit_Framework_TestCase { $this->subsubfolder = '/subsubfolder1'; // remember files_trashbin state - $this->stateFilesTrashbin = OC_App::isEnabled('files_trashbin'); + $this->stateFilesTrashbin = \OC_App::isEnabled('files_trashbin'); // we want to tests with app files_trashbin enabled \OC_App::enable('files_trashbin'); } - function tearDown() { + protected function tearDown() { // reset app files_trashbin if ($this->stateFilesTrashbin) { - OC_App::enable('files_trashbin'); + \OC_App::enable('files_trashbin'); } else { - OC_App::disable('files_trashbin'); + \OC_App::disable('files_trashbin'); } + + parent::tearDown(); } public static function tearDownAfterClass() { // cleanup test user - \OC_User::deleteUser(\Test_Encryption_Trashbin::TEST_ENCRYPTION_TRASHBIN_USER1); + \OC_User::deleteUser(self::TEST_ENCRYPTION_TRASHBIN_USER1); - \OC_Hook::clear(); - \OC_FileProxy::clearProxies(); - - // Delete keys in /data/ - $view = new \OC\Files\View('/'); - $view->rmdir('public-keys'); - $view->rmdir('owncloud_private_key'); + parent::tearDownAfterClass(); } /** @@ -119,12 +103,12 @@ class Test_Encryption_Trashbin extends \PHPUnit_Framework_TestCase { function testDeleteFile() { // generate filename - $filename = 'tmp-' . uniqid() . '.txt'; + $filename = 'tmp-' . $this->getUniqueID() . '.txt'; $filename2 = $filename . '.backup'; // a second file with similar name // save file with content - $cryptedFile = file_put_contents('crypt:///' .\Test_Encryption_Trashbin::TEST_ENCRYPTION_TRASHBIN_USER1. '/files/'. $filename, $this->dataShort); - $cryptedFile2 = file_put_contents('crypt:///' .\Test_Encryption_Trashbin::TEST_ENCRYPTION_TRASHBIN_USER1. '/files/'. $filename2, $this->dataShort); + $cryptedFile = file_put_contents('crypt:///' .self::TEST_ENCRYPTION_TRASHBIN_USER1. '/files/'. $filename, $this->dataShort); + $cryptedFile2 = file_put_contents('crypt:///' .self::TEST_ENCRYPTION_TRASHBIN_USER1. '/files/'. $filename2, $this->dataShort); // test that data was successfully written $this->assertTrue(is_int($cryptedFile)); @@ -132,59 +116,55 @@ class Test_Encryption_Trashbin extends \PHPUnit_Framework_TestCase { // check if key for admin exists $this->assertTrue($this->view->file_exists( - '/' . \Test_Encryption_Trashbin::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_encryption/keyfiles/' . $filename - . '.key')); + '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_encryption/keys/' . $filename . '/fileKey')); $this->assertTrue($this->view->file_exists( - '/' . \Test_Encryption_Trashbin::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_encryption/keyfiles/' . $filename2 - . '.key')); + '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_encryption/keys/' . $filename2 . '/fileKey')); // check if share key for admin exists $this->assertTrue($this->view->file_exists( - '/' . \Test_Encryption_Trashbin::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_encryption/share-keys/' - . $filename . '.' . \Test_Encryption_Trashbin::TEST_ENCRYPTION_TRASHBIN_USER1 . '.shareKey')); + '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_encryption/keys/' + . $filename . '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '.shareKey')); $this->assertTrue($this->view->file_exists( - '/' . \Test_Encryption_Trashbin::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_encryption/share-keys/' - . $filename2 . '.' . \Test_Encryption_Trashbin::TEST_ENCRYPTION_TRASHBIN_USER1 . '.shareKey')); + '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_encryption/keys/' + . $filename2 . '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '.shareKey')); // delete first file - \OC\FIles\Filesystem::unlink($filename); + \OC\Files\Filesystem::unlink($filename); // check if file not exists $this->assertFalse($this->view->file_exists( - '/' . \Test_Encryption_Trashbin::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files/' . $filename)); + '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files/' . $filename)); // check if key for admin not exists $this->assertFalse($this->view->file_exists( - '/' . \Test_Encryption_Trashbin::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_encryption/keyfiles/' . $filename - . '.key')); + '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_encryption/keys/' . $filename . '/fileKey')); // check if share key for admin not exists $this->assertFalse($this->view->file_exists( - '/' . \Test_Encryption_Trashbin::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_encryption/share-keys/' - . $filename . '.' . \Test_Encryption_Trashbin::TEST_ENCRYPTION_TRASHBIN_USER1 . '.shareKey')); + '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_encryption/keys/' + . $filename . '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '.shareKey')); // check that second file still exists $this->assertTrue($this->view->file_exists( - '/' . \Test_Encryption_Trashbin::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files/' . $filename2)); + '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files/' . $filename2)); // check that key for second file still exists $this->assertTrue($this->view->file_exists( - '/' . \Test_Encryption_Trashbin::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_encryption/keyfiles/' . $filename2 - . '.key')); + '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_encryption/keys/' . $filename2 . '/fileKey')); // check that share key for second file still exists $this->assertTrue($this->view->file_exists( - '/' . \Test_Encryption_Trashbin::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_encryption/share-keys/' - . $filename2 . '.' . \Test_Encryption_Trashbin::TEST_ENCRYPTION_TRASHBIN_USER1 . '.shareKey')); + '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_encryption/keys/' + . $filename2 . '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '.shareKey')); // get files $trashFiles = $this->view->getDirectoryContent( - '/' . \Test_Encryption_Trashbin::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_trashbin/files/'); + '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_trashbin/files/'); $trashFileSuffix = null; // find created file with timestamp foreach ($trashFiles as $file) { - if (strncmp($file['path'], $filename, strlen($filename))) { + if (strpos($file['path'], $filename . '.d') !== false) { $path_parts = pathinfo($file['name']); $trashFileSuffix = $path_parts['extension']; } @@ -193,15 +173,16 @@ class Test_Encryption_Trashbin extends \PHPUnit_Framework_TestCase { // check if we found the file we created $this->assertNotNull($trashFileSuffix); + $this->assertTrue($this->view->is_dir('/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_trashbin/keys/' . $filename . '.' . $trashFileSuffix)); + // check if key for admin not exists $this->assertTrue($this->view->file_exists( - '/' . \Test_Encryption_Trashbin::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_trashbin/keyfiles/' . $filename - . '.key.' . $trashFileSuffix)); + '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_trashbin/keys/' . $filename . '.' . $trashFileSuffix . '/fileKey')); // check if share key for admin not exists $this->assertTrue($this->view->file_exists( - '/' . \Test_Encryption_Trashbin::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_trashbin/share-keys/' . $filename - . '.' . \Test_Encryption_Trashbin::TEST_ENCRYPTION_TRASHBIN_USER1 . '.shareKey.' . $trashFileSuffix)); + '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_trashbin/keys/' . $filename + . '.' . $trashFileSuffix . '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '.shareKey')); } /** @@ -210,67 +191,67 @@ class Test_Encryption_Trashbin extends \PHPUnit_Framework_TestCase { */ function testRestoreFile() { // generate filename - $filename = 'tmp-' . uniqid() . '.txt'; + $filename = 'tmp-' . $this->getUniqueID() . '.txt'; $filename2 = $filename . '.backup'; // a second file with similar name // save file with content - $cryptedFile = file_put_contents('crypt:///' .\Test_Encryption_Trashbin::TEST_ENCRYPTION_TRASHBIN_USER1. '/files/'. $filename, $this->dataShort); - $cryptedFile2 = file_put_contents('crypt:///' .\Test_Encryption_Trashbin::TEST_ENCRYPTION_TRASHBIN_USER1. '/files/'. $filename2, $this->dataShort); + $cryptedFile = file_put_contents('crypt:///' . self::TEST_ENCRYPTION_TRASHBIN_USER1. '/files/'. $filename, $this->dataShort); + $cryptedFile2 = file_put_contents('crypt:///' . self::TEST_ENCRYPTION_TRASHBIN_USER1. '/files/'. $filename2, $this->dataShort); // delete both files \OC\Files\Filesystem::unlink($filename); \OC\Files\Filesystem::unlink($filename2); - $trashFiles = $this->view->getDirectoryContent( - '/' . \Test_Encryption_Trashbin::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_trashbin/files/'); + $trashFiles = $this->view->getDirectoryContent('/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_trashbin/files/'); $trashFileSuffix = null; $trashFileSuffix2 = null; // find created file with timestamp foreach ($trashFiles as $file) { - if (strncmp($file['path'], $filename, strlen($filename))) { + if (strpos($file['path'], $filename . '.d') !== false) { $path_parts = pathinfo($file['name']); $trashFileSuffix = $path_parts['extension']; } - if (strncmp($file['path'], $filename2, strlen($filename2))) { - $path_parts = pathinfo($file['name']); - $trashFileSuffix2 = $path_parts['extension']; - } } // prepare file information $timestamp = str_replace('d', '', $trashFileSuffix); + // before calling the restore operation the keys shouldn't be there + $this->assertFalse($this->view->file_exists( + '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_encryption/keys/' . $filename . '/fileKey')); + $this->assertFalse($this->view->file_exists( + '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_encryption/keys/' + . $filename . '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '.shareKey')); + // restore first file $this->assertTrue(\OCA\Files_Trashbin\Trashbin::restore($filename . '.' . $trashFileSuffix, $filename, $timestamp)); // check if file exists $this->assertTrue($this->view->file_exists( - '/' . \Test_Encryption_Trashbin::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files/' . $filename)); + '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files/' . $filename)); // check if key for admin exists $this->assertTrue($this->view->file_exists( - '/' . \Test_Encryption_Trashbin::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_encryption/keyfiles/' - . $filename . '.key')); + '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_encryption/keys/' . $filename . '/fileKey')); // check if share key for admin exists $this->assertTrue($this->view->file_exists( - '/' . \Test_Encryption_Trashbin::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_encryption/share-keys/' - . $filename . '.' . \Test_Encryption_Trashbin::TEST_ENCRYPTION_TRASHBIN_USER1 . '.shareKey')); + '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_encryption/keys/' + . $filename . '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '.shareKey')); // check that second file was NOT restored $this->assertFalse($this->view->file_exists( - '/' . \Test_Encryption_Trashbin::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files/' . $filename2)); + '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files/' . $filename2)); // check if key for admin exists $this->assertFalse($this->view->file_exists( - '/' . \Test_Encryption_Trashbin::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_encryption/keyfiles/' - . $filename2 . '.key')); + '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_encryption/keys/' . $filename2 . '/fileKey')); // check if share key for admin exists $this->assertFalse($this->view->file_exists( - '/' . \Test_Encryption_Trashbin::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_encryption/share-keys/' - . $filename2 . '.' . \Test_Encryption_Trashbin::TEST_ENCRYPTION_TRASHBIN_USER1 . '.shareKey')); + '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_encryption/keys/' + . $filename2 . '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '.shareKey')); } /** @@ -280,7 +261,7 @@ class Test_Encryption_Trashbin extends \PHPUnit_Framework_TestCase { function testPermanentDeleteFile() { // generate filename - $filename = 'tmp-' . uniqid() . '.txt'; + $filename = 'tmp-' . $this->getUniqueID() . '.txt'; // save file with content $cryptedFile = file_put_contents('crypt:///' .$this->userId. '/files/' . $filename, $this->dataShort); @@ -290,30 +271,29 @@ class Test_Encryption_Trashbin extends \PHPUnit_Framework_TestCase { // check if key for admin exists $this->assertTrue($this->view->file_exists( - '/' . \Test_Encryption_Trashbin::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_encryption/keyfiles/' . $filename - . '.key')); + '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_encryption/keys/' . $filename . '/fileKey')); // check if share key for admin exists $this->assertTrue($this->view->file_exists( - '/' . \Test_Encryption_Trashbin::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_encryption/share-keys/' - . $filename . '.' . \Test_Encryption_Trashbin::TEST_ENCRYPTION_TRASHBIN_USER1 . '.shareKey')); + '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_encryption/keys/' + . $filename . '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '.shareKey')); // delete file \OC\Files\Filesystem::unlink($filename); // check if file not exists $this->assertFalse($this->view->file_exists( - '/' . \Test_Encryption_Trashbin::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files/' . $filename)); + '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files/' . $filename)); // check if key for admin not exists $this->assertFalse($this->view->file_exists( - '/' . \Test_Encryption_Trashbin::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_encryption/keyfiles/' . $filename - . '.key')); + '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_encryption/keys/' . $filename . '/' + . $filename . '.key')); // check if share key for admin not exists $this->assertFalse($this->view->file_exists( - '/' . \Test_Encryption_Trashbin::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_encryption/share-keys/' - . $filename . '.' . \Test_Encryption_Trashbin::TEST_ENCRYPTION_TRASHBIN_USER1 . '.shareKey')); + '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_encryption/keys/' + . $filename . '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '.shareKey')); // find created file with timestamp $query = \OC_DB::prepare('SELECT `timestamp`,`type` FROM `*PREFIX*files_trash`' @@ -327,13 +307,13 @@ class Test_Encryption_Trashbin extends \PHPUnit_Framework_TestCase { // check if key for admin exists $this->assertTrue($this->view->file_exists( - '/' . \Test_Encryption_Trashbin::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_trashbin/keyfiles/' . $filename - . '.key.' . $trashFileSuffix)); + '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_trashbin/keys/' . $filename + . '.' . $trashFileSuffix . '/fileKey')); // check if share key for admin exists $this->assertTrue($this->view->file_exists( - '/' . \Test_Encryption_Trashbin::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_trashbin/share-keys/' . $filename - . '.' . \Test_Encryption_Trashbin::TEST_ENCRYPTION_TRASHBIN_USER1 . '.shareKey.' . $trashFileSuffix)); + '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_trashbin/keys/' + . $filename . '.' . $trashFileSuffix . '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '.shareKey')); // get timestamp from file $timestamp = str_replace('d', '', $trashFileSuffix); @@ -343,18 +323,18 @@ class Test_Encryption_Trashbin extends \PHPUnit_Framework_TestCase { // check if key for admin not exists $this->assertFalse($this->view->file_exists( - '/' . \Test_Encryption_Trashbin::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_trashbin/files/' . $filename . '.' + '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_trashbin/files/' . $filename . '.' . $trashFileSuffix)); // check if key for admin not exists $this->assertFalse($this->view->file_exists( - '/' . \Test_Encryption_Trashbin::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_trashbin/keyfiles/' . $filename - . '.key.' . $trashFileSuffix)); + '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_trashbin/keys/' . $filename + . '.' . $trashFileSuffix . '/fileKey')); // check if share key for admin not exists $this->assertFalse($this->view->file_exists( - '/' . \Test_Encryption_Trashbin::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_trashbin/share-keys/' . $filename - . '.' . \Test_Encryption_Trashbin::TEST_ENCRYPTION_TRASHBIN_USER1 . '.shareKey.' . $trashFileSuffix)); + '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '/files_trashbin/keys/' . $filename + . '.' . $trashFileSuffix . '/' . self::TEST_ENCRYPTION_TRASHBIN_USER1 . '.shareKey')); } } diff --git a/apps/files_encryption/tests/util.php b/apps/files_encryption/tests/util.php index 210ffcc5410..c75f406cb61 100755 --- a/apps/files_encryption/tests/util.php +++ b/apps/files_encryption/tests/util.php @@ -6,12 +6,12 @@ * See the COPYING-README file. */ -use OCA\Encryption; +namespace OCA\Files_Encryption\Tests; /** - * Class Test_Encryption_Util + * Class Util */ -class Test_Encryption_Util extends \PHPUnit_Framework_TestCase { +class Util extends TestCase { const TEST_ENCRYPTION_UTIL_USER1 = "test-util-user1"; const TEST_ENCRYPTION_UTIL_USER2 = "test-util-user2"; @@ -24,14 +24,14 @@ class Test_Encryption_Util extends \PHPUnit_Framework_TestCase { public $publicKeyDir; public $pass; /** - * @var OC\Files\View + * @var \OC\Files\View */ public $view; public $keyfilesPath; public $publicKeyPath; public $privateKeyPath; /** - * @var \OCA\Encryption\Util + * @var \OCA\Files_Encryption\Util */ public $util; public $dataShort; @@ -41,16 +41,12 @@ class Test_Encryption_Util extends \PHPUnit_Framework_TestCase { public $stateFilesTrashbin; public static function setUpBeforeClass() { - // reset backend - \OC_User::clearBackends(); - \OC_User::useBackend('database'); - - self::setupHooks(); + parent::setUpBeforeClass(); // create test user - \Test_Encryption_Util::loginHelper(\Test_Encryption_Util::TEST_ENCRYPTION_UTIL_USER1, true); - \Test_Encryption_Util::loginHelper(\Test_Encryption_Util::TEST_ENCRYPTION_UTIL_USER2, true); - \Test_Encryption_Util::loginHelper(\Test_Encryption_Util::TEST_ENCRYPTION_UTIL_LEGACY_USER, true); + self::loginHelper(self::TEST_ENCRYPTION_UTIL_USER1, true); + self::loginHelper(self::TEST_ENCRYPTION_UTIL_USER2, true); + self::loginHelper(self::TEST_ENCRYPTION_UTIL_LEGACY_USER, true); // create groups \OC_Group::createGroup(self::TEST_ENCRYPTION_UTIL_GROUP1); @@ -60,13 +56,14 @@ class Test_Encryption_Util extends \PHPUnit_Framework_TestCase { \OC_Group::addToGroup(self::TEST_ENCRYPTION_UTIL_USER1, self::TEST_ENCRYPTION_UTIL_GROUP1); } + protected function setUp() { + parent::setUp(); - function setUp() { // login user - \Test_Encryption_Util::loginHelper(\Test_Encryption_Util::TEST_ENCRYPTION_UTIL_USER1); - \OC_User::setUserId(\Test_Encryption_Util::TEST_ENCRYPTION_UTIL_USER1); - $this->userId = \Test_Encryption_Util::TEST_ENCRYPTION_UTIL_USER1; - $this->pass = \Test_Encryption_Util::TEST_ENCRYPTION_UTIL_USER1; + self::loginHelper(self::TEST_ENCRYPTION_UTIL_USER1); + \OC_User::setUserId(self::TEST_ENCRYPTION_UTIL_USER1); + $this->userId = self::TEST_ENCRYPTION_UTIL_USER1; + $this->pass = self::TEST_ENCRYPTION_UTIL_USER1; // set content for encrypting / decrypting in tests $this->dataUrl = __DIR__ . '/../lib/crypt.php'; @@ -77,66 +74,53 @@ class Test_Encryption_Util extends \PHPUnit_Framework_TestCase { $this->legacyEncryptedDataKey = __DIR__ . '/encryption.key'; $this->legacyKey = "30943623843030686906\0\0\0\0"; - $keypair = Encryption\Crypt::createKeypair(); + $keypair = \OCA\Files_Encryption\Crypt::createKeypair(); $this->genPublicKey = $keypair['publicKey']; $this->genPrivateKey = $keypair['privateKey']; - $this->publicKeyDir = '/' . 'public-keys'; + $this->publicKeyDir = \OCA\Files_Encryption\Keymanager::getPublicKeyPath(); $this->encryptionDir = '/' . $this->userId . '/' . 'files_encryption'; - $this->keyfilesPath = $this->encryptionDir . '/' . 'keyfiles'; + $this->keysPath = $this->encryptionDir . '/' . 'keys'; $this->publicKeyPath = - $this->publicKeyDir . '/' . $this->userId . '.public.key'; // e.g. data/public-keys/admin.public.key + $this->publicKeyDir . '/' . $this->userId . '.publicKey'; // e.g. data/public-keys/admin.publicKey $this->privateKeyPath = - $this->encryptionDir . '/' . $this->userId . '.private.key'; // e.g. data/admin/admin.private.key + $this->encryptionDir . '/' . $this->userId . '.privateKey'; // e.g. data/admin/admin.privateKey $this->view = new \OC\Files\View('/'); - $this->util = new Encryption\Util($this->view, $this->userId); + $this->util = new \OCA\Files_Encryption\Util($this->view, $this->userId); // remember files_trashbin state - $this->stateFilesTrashbin = OC_App::isEnabled('files_trashbin'); + $this->stateFilesTrashbin = \OC_App::isEnabled('files_trashbin'); // we don't want to tests with app files_trashbin enabled \OC_App::disable('files_trashbin'); } - function tearDown() { + protected function tearDown() { // reset app files_trashbin if ($this->stateFilesTrashbin) { - OC_App::enable('files_trashbin'); + \OC_App::enable('files_trashbin'); } else { - OC_App::disable('files_trashbin'); + \OC_App::disable('files_trashbin'); } + + parent::tearDown(); } public static function tearDownAfterClass() { // cleanup test user - \OC_User::deleteUser(\Test_Encryption_Util::TEST_ENCRYPTION_UTIL_USER1); - \OC_User::deleteUser(\Test_Encryption_Util::TEST_ENCRYPTION_UTIL_USER2); - \OC_User::deleteUser(\Test_Encryption_Util::TEST_ENCRYPTION_UTIL_LEGACY_USER); + \OC_User::deleteUser(self::TEST_ENCRYPTION_UTIL_USER1); + \OC_User::deleteUser(self::TEST_ENCRYPTION_UTIL_USER2); + \OC_User::deleteUser(self::TEST_ENCRYPTION_UTIL_LEGACY_USER); //cleanup groups \OC_Group::deleteGroup(self::TEST_ENCRYPTION_UTIL_GROUP1); \OC_Group::deleteGroup(self::TEST_ENCRYPTION_UTIL_GROUP2); - \OC_Hook::clear(); - \OC_FileProxy::clearProxies(); - - // Delete keys in /data/ - $view = new \OC\Files\View('/'); - $view->rmdir('public-keys'); - $view->rmdir('owncloud_private_key'); - } - - public static function setupHooks() { - // Filesystem related hooks - \OCA\Encryption\Helper::registerFilesystemHooks(); - - // clear and register hooks - \OC_FileProxy::clearProxies(); - \OC_FileProxy::register(new OCA\Encryption\Proxy()); + parent::tearDownAfterClass(); } /** @@ -144,11 +128,11 @@ class Test_Encryption_Util extends \PHPUnit_Framework_TestCase { * test that paths set during User construction are correct */ function testKeyPaths() { - $util = new Encryption\Util($this->view, $this->userId); + $util = new \OCA\Files_Encryption\Util($this->view, $this->userId); $this->assertEquals($this->publicKeyDir, $util->getPath('publicKeyDir')); $this->assertEquals($this->encryptionDir, $util->getPath('encryptionDir')); - $this->assertEquals($this->keyfilesPath, $util->getPath('keyfilesPath')); + $this->assertEquals($this->keysPath, $util->getPath('keysPath')); $this->assertEquals($this->publicKeyPath, $util->getPath('publicKeyPath')); $this->assertEquals($this->privateKeyPath, $util->getPath('privateKeyPath')); @@ -160,12 +144,12 @@ class Test_Encryption_Util extends \PHPUnit_Framework_TestCase { */ function testIsEncryptedPath() { - $util = new Encryption\Util($this->view, $this->userId); + $util = new \OCA\Files_Encryption\Util($this->view, $this->userId); self::loginHelper($this->userId); - $unencryptedFile = '/tmpUnencrypted-' . uniqid() . '.txt'; - $encryptedFile = '/tmpEncrypted-' . uniqid() . '.txt'; + $unencryptedFile = '/tmpUnencrypted-' . $this->getUniqueID() . '.txt'; + $encryptedFile = '/tmpEncrypted-' . $this->getUniqueID() . '.txt'; // Disable encryption proxy to write a unencrypted file $proxyStatus = \OC_FileProxy::$enabled; @@ -213,7 +197,7 @@ class Test_Encryption_Util extends \PHPUnit_Framework_TestCase { // // $params['uid'] = $this->userId; // $params['password'] = $this->pass; -// $this->assertFalse(OCA\Encryption\Hooks::login($params)); +// $this->assertFalse(OCA\Files_Encryption\Hooks::login($params)); // // $this->view->unlink($this->privateKeyPath); // } @@ -223,7 +207,7 @@ class Test_Encryption_Util extends \PHPUnit_Framework_TestCase { */ function testRecoveryEnabledForUser() { - $util = new Encryption\Util($this->view, $this->userId); + $util = new \OCA\Files_Encryption\Util($this->view, $this->userId); // Record the value so we can return it to it's original state later $enabled = $util->recoveryEnabledForUser(); @@ -244,9 +228,9 @@ class Test_Encryption_Util extends \PHPUnit_Framework_TestCase { */ function testGetUidAndFilename() { - \OC_User::setUserId(\Test_Encryption_Util::TEST_ENCRYPTION_UTIL_USER1); + \OC_User::setUserId(self::TEST_ENCRYPTION_UTIL_USER1); - $filename = '/tmp-' . uniqid() . '.test'; + $filename = '/tmp-' . $this->getUniqueID() . '.test'; // Disable encryption proxy to prevent recursive calls $proxyStatus = \OC_FileProxy::$enabled; @@ -257,11 +241,11 @@ class Test_Encryption_Util extends \PHPUnit_Framework_TestCase { // Re-enable proxy - our work is done \OC_FileProxy::$enabled = $proxyStatus; - $util = new Encryption\Util($this->view, $this->userId); + $util = new \OCA\Files_Encryption\Util($this->view, $this->userId); list($fileOwnerUid, $file) = $util->getUidAndFilename($filename); - $this->assertEquals(\Test_Encryption_Util::TEST_ENCRYPTION_UTIL_USER1, $fileOwnerUid); + $this->assertEquals(self::TEST_ENCRYPTION_UTIL_USER1, $fileOwnerUid); $this->assertEquals($file, $filename); @@ -272,9 +256,9 @@ class Test_Encryption_Util extends \PHPUnit_Framework_TestCase { * Test that data that is read by the crypto stream wrapper */ function testGetFileSize() { - \Test_Encryption_Util::loginHelper(\Test_Encryption_Util::TEST_ENCRYPTION_UTIL_USER1); + self::loginHelper(self::TEST_ENCRYPTION_UTIL_USER1); - $filename = 'tmp-' . uniqid(); + $filename = 'tmp-' . $this->getUniqueID(); $externalFilename = '/' . $this->userId . '/files/' . $filename; // Test for 0 byte files @@ -298,8 +282,8 @@ class Test_Encryption_Util extends \PHPUnit_Framework_TestCase { function testEncryptAll() { - $filename = "/encryptAll" . uniqid() . ".txt"; - $util = new Encryption\Util($this->view, $this->userId); + $filename = "/encryptAll" . $this->getUniqueID() . ".txt"; + $util = new \OCA\Files_Encryption\Util($this->view, $this->userId); // disable encryption to upload a unencrypted file \OC_App::disable('files_encryption'); @@ -329,7 +313,7 @@ class Test_Encryption_Util extends \PHPUnit_Framework_TestCase { function testDecryptAll() { - $filename = "/decryptAll" . uniqid() . ".txt"; + $filename = "/decryptAll" . $this->getUniqueID() . ".txt"; $datadir = \OC_Config::getValue('datadirectory', \OC::$SERVERROOT . '/data/'); $userdir = $datadir . '/' . $this->userId . '/files/'; @@ -354,18 +338,18 @@ class Test_Encryption_Util extends \PHPUnit_Framework_TestCase { $this->assertSame($encContent, $content); // now we load the encryption app again - OC_App::loadApp('files_encryption'); + \OC_App::loadApp('files_encryption'); // init encryption app $params = array('uid' => \OCP\User::getUser(), 'password' => \OCP\User::getUser()); - $view = new OC\Files\View('/'); - $util = new \OCA\Encryption\Util($view, \OCP\User::getUser()); + $view = new \OC\Files\View('/'); + $util = new \OCA\Files_Encryption\Util($view, \OCP\User::getUser()); $result = $util->initEncryption($params); - $this->assertTrue($result instanceof \OCA\Encryption\Session); + $this->assertTrue($result instanceof \OCA\Files_Encryption\Session); $successful = $util->decryptAll(); @@ -389,17 +373,19 @@ class Test_Encryption_Util extends \PHPUnit_Framework_TestCase { // file should no longer be encrypted $this->assertEquals(0, $fileInfoUnencrypted['encrypted']); + $backupPath = $this->getBackupPath('decryptAll'); + // check if the keys where moved to the backup location - $this->assertTrue($this->view->is_dir($this->userId . '/files_encryption/keyfiles.backup')); - $this->assertTrue($this->view->file_exists($this->userId . '/files_encryption/keyfiles.backup/' . $filename . '.key')); - $this->assertTrue($this->view->is_dir($this->userId . '/files_encryption/share-keys.backup')); - $this->assertTrue($this->view->file_exists($this->userId . '/files_encryption/share-keys.backup/' . $filename . '.' . $user . '.shareKey')); + $this->assertTrue($this->view->is_dir($backupPath . '/keys')); + $this->assertTrue($this->view->file_exists($backupPath . '/keys/' . $filename . '/fileKey')); + $this->assertTrue($this->view->file_exists($backupPath . '/keys/' . $filename . '/' . $user . '.shareKey')); + $this->assertTrue($this->view->file_exists($backupPath . '/' . $user . '.privateKey')); + $this->assertTrue($this->view->file_exists($backupPath . '/' . $user . '.publicKey')); // cleanup $this->view->unlink($this->userId . '/files/' . $filename); - $this->view->deleteAll($this->userId . '/files_encryption/keyfiles.backup'); - $this->view->deleteAll($this->userId . '/files_encryption/share-keys.backup'); - OC_App::enable('files_encryption'); + $this->view->deleteAll($backupPath); + \OC_App::enable('files_encryption'); } @@ -411,47 +397,37 @@ class Test_Encryption_Util extends \PHPUnit_Framework_TestCase { // create some dummy key files $encPath = '/' . self::TEST_ENCRYPTION_UTIL_USER1 . '/files_encryption'; - $this->view->file_put_contents($encPath . '/keyfiles/foo.key', 'key'); - $this->view->file_put_contents($encPath . '/share-keys/foo.user1.shareKey', 'share key'); - - $util = new \OCA\Encryption\Util($this->view, self::TEST_ENCRYPTION_UTIL_USER1); - - $util->backupAllKeys('testing'); + $this->view->mkdir($encPath . '/keys/foo'); + $this->view->file_put_contents($encPath . '/keys/foo/fileKey', 'key'); + $this->view->file_put_contents($encPath . '/keys/foo/user1.shareKey', 'share key'); - $encFolderContent = $this->view->getDirectoryContent($encPath); + $util = new \OCA\Files_Encryption\Util($this->view, self::TEST_ENCRYPTION_UTIL_USER1); - $backupPath = ''; - foreach ($encFolderContent as $c) { - $name = $c['name']; - if (substr($name, 0, strlen('backup')) === 'backup') { - $backupPath = $encPath . '/'. $c['name']; - break; - } - } + $util->backupAllKeys('testBackupAllKeys'); - $this->assertTrue($backupPath !== ''); + $backupPath = $this->getBackupPath('testBackupAllKeys'); // check backupDir Content - $this->assertTrue($this->view->is_dir($backupPath . '/keyfiles')); - $this->assertTrue($this->view->is_dir($backupPath . '/share-keys')); - $this->assertTrue($this->view->file_exists($backupPath . '/keyfiles/foo.key')); - $this->assertTrue($this->view->file_exists($backupPath . '/share-keys/foo.user1.shareKey')); - $this->assertTrue($this->view->file_exists($backupPath . '/' . self::TEST_ENCRYPTION_UTIL_USER1 . '.private.key')); - $this->assertTrue($this->view->file_exists($backupPath . '/' . self::TEST_ENCRYPTION_UTIL_USER1 . '.public.key')); + $this->assertTrue($this->view->is_dir($backupPath . '/keys')); + $this->assertTrue($this->view->is_dir($backupPath . '/keys/foo')); + $this->assertTrue($this->view->file_exists($backupPath . '/keys/foo/fileKey')); + $this->assertTrue($this->view->file_exists($backupPath . '/keys/foo/user1.shareKey')); + $this->assertTrue($this->view->file_exists($backupPath . '/' . self::TEST_ENCRYPTION_UTIL_USER1 . '.privateKey')); + $this->assertTrue($this->view->file_exists($backupPath . '/' . self::TEST_ENCRYPTION_UTIL_USER1 . '.publicKey')); //cleanup $this->view->deleteAll($backupPath); - $this->view->unlink($encPath . '/keyfiles/foo.key', 'key'); - $this->view->unlink($encPath . '/share-keys/foo.user1.shareKey', 'share key'); + $this->view->unlink($encPath . '/keys/foo/fileKey'); + $this->view->unlink($encPath . '/keys/foo/user1.shareKey'); } function testDescryptAllWithBrokenFiles() { - $file1 = "/decryptAll1" . uniqid() . ".txt"; - $file2 = "/decryptAll2" . uniqid() . ".txt"; + $file1 = "/decryptAll1" . $this->getUniqueID() . ".txt"; + $file2 = "/decryptAll2" . $this->getUniqueID() . ".txt"; - $util = new Encryption\Util($this->view, $this->userId); + $util = new \OCA\Files_Encryption\Util($this->view, $this->userId); $this->view->file_put_contents($this->userId . '/files/' . $file1, $this->dataShort); $this->view->file_put_contents($this->userId . '/files/' . $file2, $this->dataShort); @@ -466,8 +442,11 @@ class Test_Encryption_Util extends \PHPUnit_Framework_TestCase { // rename keyfile for file1 so that the decryption for file1 fails // Expected behaviour: decryptAll() returns false, file2 gets decrypted anyway - $this->view->rename($this->userId . '/files_encryption/keyfiles/' . $file1 . '.key', - $this->userId . '/files_encryption/keyfiles/' . $file1 . '.key.moved'); + $this->view->rename($this->userId . '/files_encryption/keys/' . $file1 . '/fileKey', + $this->userId . '/files_encryption/keys/' . $file1 . '/fileKey.moved'); + + // need to reset key cache that we don't use the cached key + $this->resetKeyCache(); // decrypt all encrypted files $result = $util->decryptAll(); @@ -485,12 +464,13 @@ class Test_Encryption_Util extends \PHPUnit_Framework_TestCase { $this->assertEquals(0, $fileInfoUnencrypted2['encrypted']); // keyfiles and share keys should still exist - $this->assertTrue($this->view->is_dir($this->userId . '/files_encryption/keyfiles/')); - $this->assertTrue($this->view->is_dir($this->userId . '/files_encryption/share-keys/')); + $this->assertTrue($this->view->is_dir($this->userId . '/files_encryption/keys/')); + $this->assertTrue($this->view->file_exists($this->userId . '/files_encryption/keys/' . $file1 . '/fileKey.moved')); + $this->assertTrue($this->view->file_exists($this->userId . '/files_encryption/keys/' . $file1 . '/' . $this->userId . '.shareKey')); // rename the keyfile for file1 back - $this->view->rename($this->userId . '/files_encryption/keyfiles/' . $file1 . '.key.moved', - $this->userId . '/files_encryption/keyfiles/' . $file1 . '.key'); + $this->view->rename($this->userId . '/files_encryption/keys/' . $file1 . '/fileKey.moved', + $this->userId . '/files_encryption/keys/' . $file1 . '/fileKey'); // try again to decrypt all encrypted files $result = $util->decryptAll(); @@ -508,15 +488,30 @@ class Test_Encryption_Util extends \PHPUnit_Framework_TestCase { $this->assertEquals(0, $fileInfoUnencrypted2['encrypted']); // keyfiles and share keys should be deleted - $this->assertFalse($this->view->is_dir($this->userId . '/files_encryption/keyfiles/')); - $this->assertFalse($this->view->is_dir($this->userId . '/files_encryption/share-keys/')); + $this->assertFalse($this->view->is_dir($this->userId . '/files_encryption/keys/')); //cleanup + $backupPath = $this->getBackupPath('decryptAll'); $this->view->unlink($this->userId . '/files/' . $file1); $this->view->unlink($this->userId . '/files/' . $file2); - $this->view->deleteAll($this->userId . '/files_encryption/keyfiles.backup'); - $this->view->deleteAll($this->userId . '/files_encryption/share-keys.backup'); + $this->view->deleteAll($backupPath); + + } + + function getBackupPath($extension) { + $encPath = '/' . self::TEST_ENCRYPTION_UTIL_USER1 . '/files_encryption'; + $encFolderContent = $this->view->getDirectoryContent($encPath); + + $backupPath = ''; + foreach ($encFolderContent as $c) { + $name = $c['name']; + if (substr($name, 0, strlen('backup.' . $extension)) === 'backup.' . $extension) { + $backupPath = $encPath . '/'. $c['name']; + break; + } + } + return $backupPath; } /** @@ -543,6 +538,43 @@ class Test_Encryption_Util extends \PHPUnit_Framework_TestCase { } /** + * Tests that filterShareReadyUsers() returns the correct list of + * users that are ready or not ready for encryption + */ + public function testFilterShareReadyUsers() { + $appConfig = \OC::$server->getAppConfig(); + + $publicShareKeyId = $appConfig->getValue('files_encryption', 'publicShareKeyId'); + $recoveryKeyId = $appConfig->getValue('files_encryption', 'recoveryKeyId'); + + $usersToTest = array( + 'readyUser', + 'notReadyUser', + 'nonExistingUser', + $publicShareKeyId, + $recoveryKeyId, + ); + self::loginHelper('readyUser', true); + self::loginHelper('notReadyUser', true); + // delete encryption dir to make it not ready + $this->view->unlink('notReadyUser/files_encryption/'); + + // login as user1 + self::loginHelper(self::TEST_ENCRYPTION_UTIL_USER1); + + $result = $this->util->filterShareReadyUsers($usersToTest); + $this->assertEquals( + array('readyUser', $publicShareKeyId, $recoveryKeyId), + $result['ready'] + ); + $this->assertEquals( + array('notReadyUser', 'nonExistingUser'), + $result['unready'] + ); + \OC_User::deleteUser('readyUser'); + } + + /** * @param string $user * @param bool $create * @param bool $password @@ -569,7 +601,7 @@ class Test_Encryption_Util extends \PHPUnit_Framework_TestCase { if ($loadEncryption) { $params['uid'] = $user; $params['password'] = $password; - OCA\Encryption\Hooks::login($params); + \OCA\Files_Encryption\Hooks::login($params); } } @@ -588,15 +620,17 @@ class Test_Encryption_Util extends \PHPUnit_Framework_TestCase { * @return boolean */ private function setMigrationStatus($status, $user) { - return \OC_Preferences::setValue($user, 'files_encryption', 'migration_status', (string)$status); + \OC::$server->getConfig()->setUserValue($user, 'files_encryption', 'migration_status', (string)$status); + // the update will definitely be executed -> return value is always true + return true; } } /** - * dummy class extends \OCA\Encryption\Util to access protected methods for testing + * dummy class extends \OCA\Files_Encryption\Util to access protected methods for testing */ -class DummyUtilClass extends \OCA\Encryption\Util { +class DummyUtilClass extends \OCA\Files_Encryption\Util { public function testIsMountPointApplicableToUser($mount) { return $this->isMountPointApplicableToUser($mount); } diff --git a/apps/files_encryption/tests/webdav.php b/apps/files_encryption/tests/webdav.php index c838ddd29d1..83f4c0a77de 100755 --- a/apps/files_encryption/tests/webdav.php +++ b/apps/files_encryption/tests/webdav.php @@ -20,16 +20,14 @@ * */ -require_once __DIR__ . '/util.php'; - -use OCA\Encryption; +namespace OCA\Files_Encryption\Tests; /** - * Class Test_Encryption_Webdav + * Class Webdav * * this class provide basic webdav tests for PUT,GET and DELETE */ -class Test_Encryption_Webdav extends \PHPUnit_Framework_TestCase { +class Webdav extends TestCase { const TEST_ENCRYPTION_WEBDAV_USER1 = "test-webdav-user1"; @@ -45,33 +43,23 @@ class Test_Encryption_Webdav extends \PHPUnit_Framework_TestCase { private $storage; public static function setUpBeforeClass() { - // reset backend - \OC_User::clearBackends(); - \OC_User::useBackend('database'); - - // Filesystem related hooks - \OCA\Encryption\Helper::registerFilesystemHooks(); - - // Filesystem related hooks - \OCA\Encryption\Helper::registerUserHooks(); - - // clear and register hooks - \OC_FileProxy::clearProxies(); - \OC_FileProxy::register(new OCA\Encryption\Proxy()); + parent::setUpBeforeClass(); // create test user - \Test_Encryption_Util::loginHelper(\Test_Encryption_Webdav::TEST_ENCRYPTION_WEBDAV_USER1, true); + self::loginHelper(self::TEST_ENCRYPTION_WEBDAV_USER1, true); } - function setUp() { + protected function setUp() { + parent::setUp(); + // reset backend \OC_User::useBackend('database'); // set user id - \OC_User::setUserId(\Test_Encryption_Webdav::TEST_ENCRYPTION_WEBDAV_USER1); - $this->userId = \Test_Encryption_Webdav::TEST_ENCRYPTION_WEBDAV_USER1; - $this->pass = \Test_Encryption_Webdav::TEST_ENCRYPTION_WEBDAV_USER1; + \OC_User::setUserId(self::TEST_ENCRYPTION_WEBDAV_USER1); + $this->userId = self::TEST_ENCRYPTION_WEBDAV_USER1; + $this->pass = self::TEST_ENCRYPTION_WEBDAV_USER1; // init filesystem view $this->view = new \OC\Files\View('/'); @@ -80,35 +68,31 @@ class Test_Encryption_Webdav extends \PHPUnit_Framework_TestCase { $this->dataShort = 'hats'; // remember files_trashbin state - $this->stateFilesTrashbin = OC_App::isEnabled('files_trashbin'); + $this->stateFilesTrashbin = \OC_App::isEnabled('files_trashbin'); // we don't want to tests with app files_trashbin enabled \OC_App::disable('files_trashbin'); // create test user - \Test_Encryption_Util::loginHelper(\Test_Encryption_Webdav::TEST_ENCRYPTION_WEBDAV_USER1); + self::loginHelper(self::TEST_ENCRYPTION_WEBDAV_USER1); } - function tearDown() { + protected function tearDown() { // reset app files_trashbin if ($this->stateFilesTrashbin) { - OC_App::enable('files_trashbin'); + \OC_App::enable('files_trashbin'); } else { - OC_App::disable('files_trashbin'); + \OC_App::disable('files_trashbin'); } + + parent::tearDown(); } public static function tearDownAfterClass() { // cleanup test user - \OC_User::deleteUser(\Test_Encryption_Webdav::TEST_ENCRYPTION_WEBDAV_USER1); - - \OC_Hook::clear(); - \OC_FileProxy::clearProxies(); + \OC_User::deleteUser(self::TEST_ENCRYPTION_WEBDAV_USER1); - // Delete keys in /data/ - $view = new \OC\Files\View('/'); - $view->rmdir('public-keys'); - $view->rmdir('owncloud_private_key'); + parent::tearDownAfterClass(); } /** @@ -117,7 +101,7 @@ class Test_Encryption_Webdav extends \PHPUnit_Framework_TestCase { function testWebdavPUT() { // generate filename - $filename = '/tmp-' . uniqid() . '.txt'; + $filename = '/tmp-' . $this->getUniqueID() . '.txt'; // set server vars $_SERVER['REQUEST_METHOD'] = 'OPTIONS'; @@ -137,11 +121,11 @@ class Test_Encryption_Webdav extends \PHPUnit_Framework_TestCase { // check if key-file was created $this->assertTrue($this->view->file_exists( - '/' . $this->userId . '/files_encryption/keyfiles/' . $filename . '.key')); + '/' . $this->userId . '/files_encryption/keys/' . $filename . '/fileKey')); // check if shareKey-file was created $this->assertTrue($this->view->file_exists( - '/' . $this->userId . '/files_encryption/share-keys/' . $filename . '.' . $this->userId . '.shareKey')); + '/' . $this->userId . '/files_encryption/keys/' . $filename . '/' . $this->userId . '.shareKey')); // disable encryption proxy to prevent recursive calls $proxyStatus = \OC_FileProxy::$enabled; @@ -154,7 +138,7 @@ class Test_Encryption_Webdav extends \PHPUnit_Framework_TestCase { \OC_FileProxy::$enabled = $proxyStatus; // check if encrypted content is valid - $this->assertTrue(Encryption\Crypt::isCatfileContent($encryptedContent)); + $this->assertTrue(\OCA\Files_Encryption\Crypt::isCatfileContent($encryptedContent)); // get decrypted file contents $decrypt = file_get_contents('crypt:///' . $this->userId . '/files' . $filename); @@ -211,11 +195,11 @@ class Test_Encryption_Webdav extends \PHPUnit_Framework_TestCase { // check if key-file was removed $this->assertFalse($this->view->file_exists( - '/' . $this->userId . '/files_encryption/keyfiles' . $filename . '.key')); + '/' . $this->userId . '/files_encryption/keys/' . $filename . '/fileKey')); // check if shareKey-file was removed $this->assertFalse($this->view->file_exists( - '/' . $this->userId . '/files_encryption/share-keys' . $filename . '.' . $this->userId . '.shareKey')); + '/' . $this->userId . '/files_encryption/keys/' . $filename . '/' . $this->userId . '.shareKey')); } /** @@ -227,14 +211,14 @@ class Test_Encryption_Webdav extends \PHPUnit_Framework_TestCase { */ function handleWebdavRequest($body = false) { // Backends - $authBackend = new OC_Connector_Sabre_Auth(); - $lockBackend = new OC_Connector_Sabre_Locks(); - $requestBackend = new OC_Connector_Sabre_Request(); + $authBackend = new \OC_Connector_Sabre_Auth(); + $lockBackend = new \OC_Connector_Sabre_Locks(); + $requestBackend = new \OC_Connector_Sabre_Request(); // Create ownCloud Dir $root = '/' . $this->userId . '/files'; $view = new \OC\Files\View($root); - $publicDir = new OC_Connector_Sabre_Directory($view, $view->getFileInfo('')); + $publicDir = new \OC_Connector_Sabre_Directory($view, $view->getFileInfo('')); $objectTree = new \OC\Connector\Sabre\ObjectTree(); $mountManager = \OC\Files\Filesystem::getMountManager(); $objectTree->init($publicDir, $view, $mountManager); @@ -248,8 +232,8 @@ class Test_Encryption_Webdav extends \PHPUnit_Framework_TestCase { $server->addPlugin(new \Sabre\DAV\Auth\Plugin($authBackend, 'ownCloud')); $server->addPlugin(new \Sabre\DAV\Locks\Plugin($lockBackend)); $server->addPlugin(new \Sabre\DAV\Browser\Plugin(false)); // Show something in the Browser, but no upload - $server->addPlugin(new OC_Connector_Sabre_QuotaPlugin($view)); - $server->addPlugin(new OC_Connector_Sabre_MaintenancePlugin()); + $server->addPlugin(new \OC_Connector_Sabre_QuotaPlugin($view)); + $server->addPlugin(new \OC_Connector_Sabre_MaintenancePlugin()); $server->debugExceptions = true; // And off we go! diff --git a/apps/files_external/3rdparty/aws-sdk-php/Aws/Common/Aws.php b/apps/files_external/3rdparty/aws-sdk-php/Aws/Common/Aws.php index 1824e09c664..9cd4ae2e16f 100644 --- a/apps/files_external/3rdparty/aws-sdk-php/Aws/Common/Aws.php +++ b/apps/files_external/3rdparty/aws-sdk-php/Aws/Common/Aws.php @@ -28,7 +28,7 @@ class Aws extends ServiceBuilder /** * @var string Current version of the SDK */ - const VERSION = '2.6.15'; + const VERSION = '2.7.5'; /** * Create a new service locator for the AWS SDK diff --git a/apps/files_external/3rdparty/aws-sdk-php/Aws/Common/Client/AbstractClient.php b/apps/files_external/3rdparty/aws-sdk-php/Aws/Common/Client/AbstractClient.php index 0e2aa1a88ed..c9ee86a66ff 100644 --- a/apps/files_external/3rdparty/aws-sdk-php/Aws/Common/Client/AbstractClient.php +++ b/apps/files_external/3rdparty/aws-sdk-php/Aws/Common/Client/AbstractClient.php @@ -17,7 +17,6 @@ namespace Aws\Common\Client; use Aws\Common\Aws; -use Aws\Common\Credentials\Credentials; use Aws\Common\Credentials\CredentialsInterface; use Aws\Common\Credentials\NullCredentials; use Aws\Common\Enum\ClientOptions as Options; @@ -111,13 +110,7 @@ abstract class AbstractClient extends Client implements AwsClientInterface /** * Get an endpoint for a specific region from a service description - * - * @param ServiceDescriptionInterface $description Service description - * @param string $region Region of the endpoint - * @param string $scheme URL scheme - * - * @return string - * @throws InvalidArgumentException + * @deprecated This function will no longer be updated to work with new regions. */ public static function getEndpoint(ServiceDescriptionInterface $description, $region, $scheme) { @@ -177,12 +170,27 @@ abstract class AbstractClient extends Client implements AwsClientInterface $config = $this->getConfig(); $formerRegion = $config->get(Options::REGION); $global = $this->serviceDescription->getData('globalEndpoint'); + $provider = $config->get('endpoint_provider'); + + if (!$provider) { + throw new \RuntimeException('No endpoint provider configured'); + } // Only change the region if the service does not have a global endpoint if (!$global || $this->serviceDescription->getData('namespace') === 'S3') { - $baseUrl = self::getEndpoint($this->serviceDescription, $region, $config->get(Options::SCHEME)); - $this->setBaseUrl($baseUrl); - $config->set(Options::BASE_URL, $baseUrl)->set(Options::REGION, $region); + + $endpoint = call_user_func( + $provider, + array( + 'scheme' => $config->get(Options::SCHEME), + 'region' => $region, + 'service' => $config->get(Options::SERVICE) + ) + ); + + $this->setBaseUrl($endpoint['endpoint']); + $config->set(Options::BASE_URL, $endpoint['endpoint']); + $config->set(Options::REGION, $region); // Update the signature if necessary $signature = $this->getSignature(); diff --git a/apps/files_external/3rdparty/aws-sdk-php/Aws/Common/Client/ClientBuilder.php b/apps/files_external/3rdparty/aws-sdk-php/Aws/Common/Client/ClientBuilder.php index dd81cba2351..b34a67ffd92 100644 --- a/apps/files_external/3rdparty/aws-sdk-php/Aws/Common/Client/ClientBuilder.php +++ b/apps/files_external/3rdparty/aws-sdk-php/Aws/Common/Client/ClientBuilder.php @@ -20,13 +20,13 @@ use Aws\Common\Credentials\Credentials; use Aws\Common\Credentials\CredentialsInterface; use Aws\Common\Credentials\NullCredentials; use Aws\Common\Enum\ClientOptions as Options; -use Aws\Common\Enum\Region; use Aws\Common\Exception\ExceptionListener; use Aws\Common\Exception\InvalidArgumentException; use Aws\Common\Exception\NamespaceExceptionFactory; use Aws\Common\Exception\Parser\DefaultXmlExceptionParser; use Aws\Common\Exception\Parser\ExceptionParserInterface; use Aws\Common\Iterator\AwsResourceIteratorFactory; +use Aws\Common\RulesEndpointProvider; use Aws\Common\Signature\EndpointSignatureInterface; use Aws\Common\Signature\SignatureInterface; use Aws\Common\Signature\SignatureV2; @@ -38,7 +38,6 @@ use Guzzle\Plugin\Backoff\CurlBackoffStrategy; use Guzzle\Plugin\Backoff\ExponentialBackoffStrategy; use Guzzle\Plugin\Backoff\HttpBackoffStrategy; use Guzzle\Plugin\Backoff\TruncatedBackoffStrategy; -use Guzzle\Service\Client; use Guzzle\Service\Description\ServiceDescription; use Guzzle\Service\Resource\ResourceIteratorClassFactory; use Guzzle\Log\LogAdapterInterface; @@ -200,6 +199,10 @@ class ClientBuilder (self::$commonConfigRequirements + $this->configRequirements) ); + if (!isset($config['endpoint_provider'])) { + $config['endpoint_provider'] = RulesEndpointProvider::fromDefaults(); + } + // Resolve the endpoint, signature, and credentials $description = $this->updateConfigFromDescription($config); $signature = $this->getSignature($description, $config); @@ -366,33 +369,36 @@ class ClientBuilder $this->setIteratorsConfig($iterators); } - // Ensure that the service description has regions - if (!$description->getData('regions')) { - throw new InvalidArgumentException( - 'No regions found in the ' . $description->getData('serviceFullName'). ' description' - ); - } - // Make sure a valid region is set $region = $config->get(Options::REGION); $global = $description->getData('globalEndpoint'); + if (!$global && !$region) { throw new InvalidArgumentException( 'A region is required when using ' . $description->getData('serviceFullName') - . '. Set "region" to one of: ' . implode(', ', array_keys($description->getData('regions'))) ); } elseif ($global && (!$region || $description->getData('namespace') !== 'S3')) { - $region = Region::US_EAST_1; - $config->set(Options::REGION, $region); + $region = 'us-east-1'; + $config->set(Options::REGION, 'us-east-1'); } if (!$config->get(Options::BASE_URL)) { - // Set the base URL using the scheme and hostname of the service's region - $config->set(Options::BASE_URL, AbstractClient::getEndpoint( - $description, - $region, - $config->get(Options::SCHEME) - )); + $endpoint = call_user_func( + $config->get('endpoint_provider'), + array( + 'scheme' => $config->get(Options::SCHEME), + 'region' => $region, + 'service' => $config->get(Options::SERVICE) + ) + ); + $config->set(Options::BASE_URL, $endpoint['endpoint']); + + // Set a signature if one was not explicitly provided. + if (!$config->hasKey(Options::SIGNATURE) + && isset($endpoint['signatureVersion']) + ) { + $config->set(Options::SIGNATURE, $endpoint['signatureVersion']); + } } return $description; diff --git a/apps/files_external/3rdparty/aws-sdk-php/Aws/Common/Enum/Region.php b/apps/files_external/3rdparty/aws-sdk-php/Aws/Common/Enum/Region.php index b44bd971beb..017d1d7e16c 100644 --- a/apps/files_external/3rdparty/aws-sdk-php/Aws/Common/Enum/Region.php +++ b/apps/files_external/3rdparty/aws-sdk-php/Aws/Common/Enum/Region.php @@ -39,6 +39,9 @@ class Region extends Enum const EU_WEST_1 = 'eu-west-1'; const IRELAND = 'eu-west-1'; + + const EU_CENTRAL_1 = 'eu-central-1'; + const FRANKFURT = 'eu-central-1'; const AP_SOUTHEAST_1 = 'ap-southeast-1'; const SINGAPORE = 'ap-southeast-1'; diff --git a/apps/files_external/3rdparty/aws-sdk-php/Aws/Common/Hash/HashUtils.php b/apps/files_external/3rdparty/aws-sdk-php/Aws/Common/Hash/HashUtils.php index dd82ff75edd..f66af6edf53 100644 --- a/apps/files_external/3rdparty/aws-sdk-php/Aws/Common/Hash/HashUtils.php +++ b/apps/files_external/3rdparty/aws-sdk-php/Aws/Common/Hash/HashUtils.php @@ -38,6 +38,10 @@ class HashUtils $useNative = function_exists('hex2bin'); } + if (!$useNative && strlen($hash) % 2 !== 0) { + $hash = '0' . $hash; + } + return $useNative ? hex2bin($hash) : pack("H*", $hash); } diff --git a/apps/files_external/3rdparty/aws-sdk-php/Aws/Common/Model/MultipartUpload/AbstractUploadBuilder.php b/apps/files_external/3rdparty/aws-sdk-php/Aws/Common/Model/MultipartUpload/AbstractUploadBuilder.php index a1ad678610c..8690d5cb562 100644 --- a/apps/files_external/3rdparty/aws-sdk-php/Aws/Common/Model/MultipartUpload/AbstractUploadBuilder.php +++ b/apps/files_external/3rdparty/aws-sdk-php/Aws/Common/Model/MultipartUpload/AbstractUploadBuilder.php @@ -49,7 +49,7 @@ abstract class AbstractUploadBuilder /** * Return a new instance of the UploadBuilder * - * @return self + * @return static */ public static function newInstance() { @@ -61,7 +61,7 @@ abstract class AbstractUploadBuilder * * @param AwsClientInterface $client Client to use * - * @return self + * @return $this */ public function setClient(AwsClientInterface $client) { @@ -78,7 +78,7 @@ abstract class AbstractUploadBuilder * multipart upload. When an ID is passed, the builder will create a * state object using the data from a ListParts API response. * - * @return self + * @return $this */ public function resumeFrom($state) { @@ -94,7 +94,7 @@ abstract class AbstractUploadBuilder * You can also stream from a resource returned from fopen or a Guzzle * {@see EntityBody} object. * - * @return self + * @return $this * @throws InvalidArgumentException when the source cannot be found or opened */ public function setSource($source) @@ -123,7 +123,7 @@ abstract class AbstractUploadBuilder * * @param array $headers Headers to add to the uploaded object * - * @return self + * @return $this */ public function setHeaders(array $headers) { diff --git a/apps/files_external/3rdparty/aws-sdk-php/Aws/Common/Resources/aws-config.php b/apps/files_external/3rdparty/aws-sdk-php/Aws/Common/Resources/aws-config.php index 6a1e30c6413..710ad0d3385 100644 --- a/apps/files_external/3rdparty/aws-sdk-php/Aws/Common/Resources/aws-config.php +++ b/apps/files_external/3rdparty/aws-sdk-php/Aws/Common/Resources/aws-config.php @@ -78,6 +78,12 @@ return array( 'class' => 'Aws\CloudWatch\CloudWatchClient' ), + 'cloudwatchlogs' => array( + 'alias' => 'CloudWatchLogs', + 'extends' => 'default_settings', + 'class' => 'Aws\CloudWatchLogs\CloudWatchLogsClient' + ), + 'cognito-identity' => array( 'alias' => 'CognitoIdentity', 'extends' => 'default_settings', @@ -94,10 +100,16 @@ return array( 'cognitosync' => array('extends' => 'cognito-sync'), - 'cloudwatchlogs' => array( - 'alias' => 'CloudWatchLogs', + 'codedeploy' => array( + 'alias' => 'CodeDeploy', 'extends' => 'default_settings', - 'class' => 'Aws\CloudWatchLogs\CloudWatchLogsClient' + 'class' => 'Aws\CodeDeploy\CodeDeployClient' + ), + + 'config' => array( + 'alias' => 'ConfigService', + 'extends' => 'default_settings', + 'class' => 'Aws\ConfigService\ConfigServiceClient' ), 'datapipeline' => array( @@ -173,6 +185,18 @@ return array( 'class' => 'Aws\Kinesis\KinesisClient' ), + 'kms' => array( + 'alias' => 'Kms', + 'extends' => 'default_settings', + 'class' => 'Aws\Kms\KmsClient' + ), + + 'lambda' => array( + 'alias' => 'Lambda', + 'extends' => 'default_settings', + 'class' => 'Aws\Lambda\LambdaClient' + ), + 'iam' => array( 'alias' => 'Iam', 'extends' => 'default_settings', diff --git a/apps/files_external/3rdparty/aws-sdk-php/Aws/Common/Resources/public-endpoints.php b/apps/files_external/3rdparty/aws-sdk-php/Aws/Common/Resources/public-endpoints.php new file mode 100644 index 00000000000..f24f3404f21 --- /dev/null +++ b/apps/files_external/3rdparty/aws-sdk-php/Aws/Common/Resources/public-endpoints.php @@ -0,0 +1,64 @@ +<?php +return array( + 'version' => 2, + 'endpoints' => array( + '*/*' => array( + 'endpoint' => '{service}.{region}.amazonaws.com' + ), + 'cn-north-1/*' => array( + 'endpoint' => '{service}.{region}.amazonaws.com.cn', + 'signatureVersion' => 'v4' + ), + 'us-gov-west-1/iam' => array( + 'endpoint' => 'iam.us-gov.amazonaws.com' + ), + 'us-gov-west-1/sts' => array( + 'endpoint' => 'sts.us-gov.amazonaws.com' + ), + 'us-gov-west-1/s3' => array( + 'endpoint' => 's3-{region}.amazonaws.com' + ), + '*/cloudfront' => array( + 'endpoint' => 'cloudfront.amazonaws.com' + ), + '*/iam' => array( + 'endpoint' => 'iam.amazonaws.com' + ), + '*/importexport' => array( + 'endpoint' => 'importexport.amazonaws.com' + ), + '*/route53' => array( + 'endpoint' => 'route53.amazonaws.com' + ), + '*/sts' => array( + 'endpoint' => 'sts.amazonaws.com' + ), + 'us-east-1/sdb' => array( + 'endpoint' => 'sdb.amazonaws.com' + ), + 'us-east-1/s3' => array( + 'endpoint' => 's3.amazonaws.com' + ), + 'us-west-1/s3' => array( + 'endpoint' => 's3-{region}.amazonaws.com' + ), + 'us-west-2/s3' => array( + 'endpoint' => 's3-{region}.amazonaws.com' + ), + 'eu-west-1/s3' => array( + 'endpoint' => 's3-{region}.amazonaws.com' + ), + 'ap-southeast-1/s3' => array( + 'endpoint' => 's3-{region}.amazonaws.com' + ), + 'ap-southeast-2/s3' => array( + 'endpoint' => 's3-{region}.amazonaws.com' + ), + 'ap-northeast-1/s3' => array( + 'endpoint' => 's3-{region}.amazonaws.com' + ), + 'sa-east-1/s3' => array( + 'endpoint' => 's3-{region}.amazonaws.com' + ) + ) +); diff --git a/apps/files_external/3rdparty/aws-sdk-php/Aws/Common/RulesEndpointProvider.php b/apps/files_external/3rdparty/aws-sdk-php/Aws/Common/RulesEndpointProvider.php new file mode 100644 index 00000000000..ec57cb862ca --- /dev/null +++ b/apps/files_external/3rdparty/aws-sdk-php/Aws/Common/RulesEndpointProvider.php @@ -0,0 +1,67 @@ +<?php +namespace Aws\Common; + +/** + * Provides endpoints based on a rules configuration file. + */ +class RulesEndpointProvider +{ + /** @var array */ + private $patterns; + + /** + * @param array $patterns Hash of endpoint patterns mapping to endpoint + * configurations. + */ + public function __construct(array $patterns) + { + $this->patterns = $patterns; + } + + /** + * Creates and returns the default RulesEndpointProvider based on the + * public rule sets. + * + * @return self + */ + public static function fromDefaults() + { + return new self(require __DIR__ . '/Resources/public-endpoints.php'); + } + + public function __invoke(array $args = array()) + { + if (!isset($args['service'])) { + throw new \InvalidArgumentException('Requires a "service" value'); + } + + if (!isset($args['region'])) { + throw new \InvalidArgumentException('Requires a "region" value'); + } + + foreach ($this->getKeys($args['region'], $args['service']) as $key) { + if (isset($this->patterns['endpoints'][$key])) { + return $this->expand($this->patterns['endpoints'][$key], $args); + } + } + + throw new \RuntimeException('Could not resolve endpoint'); + } + + private function expand(array $config, array $args) + { + $scheme = isset($args['scheme']) ? $args['scheme'] : 'https'; + $config['endpoint'] = $scheme . '://' . str_replace( + array('{service}', '{region}'), + array($args['service'], $args['region']), + $config['endpoint'] + ); + + return $config; + } + + private function getKeys($region, $service) + { + return array("$region/$service", "$region/*", "*/$service", "*/*"); + } +} diff --git a/apps/files_external/3rdparty/aws-sdk-php/Aws/Common/Signature/SignatureV4.php b/apps/files_external/3rdparty/aws-sdk-php/Aws/Common/Signature/SignatureV4.php index fda63a95fc4..38b60b4594b 100644 --- a/apps/files_external/3rdparty/aws-sdk-php/Aws/Common/Signature/SignatureV4.php +++ b/apps/files_external/3rdparty/aws-sdk-php/Aws/Common/Signature/SignatureV4.php @@ -19,7 +19,6 @@ namespace Aws\Common\Signature; use Aws\Common\Credentials\CredentialsInterface; use Aws\Common\Enum\DateFormat; use Aws\Common\HostNameUtils; -use Guzzle\Http\Message\EntityEnclosingRequest; use Guzzle\Http\Message\EntityEnclosingRequestInterface; use Guzzle\Http\Message\RequestFactory; use Guzzle\Http\Message\RequestInterface; @@ -304,43 +303,42 @@ class SignatureV4 extends AbstractSignature implements EndpointSignatureInterfac */ private function createSigningContext(RequestInterface $request, $payload) { + $signable = array( + 'host' => true, + 'date' => true, + 'content-md5' => true + ); + // Normalize the path as required by SigV4 and ensure it's absolute $canon = $request->getMethod() . "\n" . $this->createCanonicalizedPath($request) . "\n" . $this->getCanonicalizedQueryString($request) . "\n"; - // Create the canonical headers - $headers = array(); + $canonHeaders = array(); + foreach ($request->getHeaders()->getAll() as $key => $values) { $key = strtolower($key); - if ($key != 'user-agent') { - $headers[$key] = array(); - foreach ($values as $value) { - $headers[$key][] = preg_replace('/\s+/', ' ', trim($value)); - } - // Sort the value if there is more than one - if (count($values) > 1) { - sort($headers[$key]); + if (isset($signable[$key]) || substr($key, 0, 6) === 'x-amz-') { + $values = $values->toArray(); + if (count($values) == 1) { + $values = $values[0]; + } else { + sort($values); + $values = implode(',', $values); } + $canonHeaders[$key] = $key . ':' . preg_replace('/\s+/', ' ', $values); } } - // The headers must be sorted - ksort($headers); - - // Continue to build the canonical request by adding headers - foreach ($headers as $key => $values) { - // Combine multi-value headers into a comma separated list - $canon .= $key . ':' . implode(',', $values) . "\n"; - } - - // Create the signed headers - $signedHeaders = implode(';', array_keys($headers)); - $canon .= "\n{$signedHeaders}\n{$payload}"; + ksort($canonHeaders); + $signedHeadersString = implode(';', array_keys($canonHeaders)); + $canon .= implode("\n", $canonHeaders) . "\n\n" + . $signedHeadersString . "\n" + . $payload; return array( 'canonical_request' => $canon, - 'signed_headers' => $signedHeaders + 'signed_headers' => $signedHeadersString ); } @@ -394,6 +392,8 @@ class SignatureV4 extends AbstractSignature implements EndpointSignatureInterfac foreach ($queryParams as $key => $values) { if (is_array($values)) { sort($values); + } elseif ($values === 0) { + $values = array('0'); } elseif (!$values) { $values = array(''); } diff --git a/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Model/Acp.php b/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Model/Acp.php index 8325a2b6570..6c19f668400 100644 --- a/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Model/Acp.php +++ b/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Model/Acp.php @@ -54,7 +54,7 @@ class Acp implements ToArrayInterface, \IteratorAggregate, \Countable * * @param array $data Array of ACP data * - * @return self + * @return Acp */ public static function fromArray(array $data) { @@ -100,7 +100,7 @@ class Acp implements ToArrayInterface, \IteratorAggregate, \Countable * * @param Grantee $owner ACP policy owner * - * @return self + * @return $this * * @throws InvalidArgumentException if the grantee does not have an ID set */ @@ -130,7 +130,7 @@ class Acp implements ToArrayInterface, \IteratorAggregate, \Countable * * @param array|\Traversable $grants List of grants for the ACP * - * @return self + * @return $this * * @throws InvalidArgumentException */ @@ -167,7 +167,7 @@ class Acp implements ToArrayInterface, \IteratorAggregate, \Countable * * @param Grant $grant Grant to add * - * @return self + * @return $this */ public function addGrant(Grant $grant) { @@ -205,7 +205,7 @@ class Acp implements ToArrayInterface, \IteratorAggregate, \Countable * * @param AbstractCommand $command Command to be updated * - * @return self + * @return $this */ public function updateCommand(AbstractCommand $command) { diff --git a/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Model/AcpBuilder.php b/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Model/AcpBuilder.php index 0e41c3cb0a0..b6d1be72167 100644 --- a/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Model/AcpBuilder.php +++ b/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Model/AcpBuilder.php @@ -36,11 +36,11 @@ class AcpBuilder /** * Static method for chainable instantiation * - * @return self + * @return static */ public static function newInstance() { - return new self; + return new static; } /** @@ -49,7 +49,7 @@ class AcpBuilder * @param string $id Owner identifier * @param string $displayName Owner display name * - * @return self + * @return $this */ public function setOwner($id, $displayName = null) { @@ -65,7 +65,7 @@ class AcpBuilder * @param string $id Grantee identifier * @param string $displayName Grantee display name * - * @return self + * @return $this */ public function addGrantForUser($permission, $id, $displayName = null) { @@ -81,7 +81,7 @@ class AcpBuilder * @param string $permission Permission for the Grant * @param string $email Grantee email address * - * @return self + * @return $this */ public function addGrantForEmail($permission, $email) { @@ -97,7 +97,7 @@ class AcpBuilder * @param string $permission Permission for the Grant * @param string $group Grantee group * - * @return self + * @return $this */ public function addGrantForGroup($permission, $group) { @@ -113,7 +113,7 @@ class AcpBuilder * @param string $permission Permission for the Grant * @param Grantee $grantee The Grantee for the Grant * - * @return self + * @return $this */ public function addGrant($permission, Grantee $grantee) { diff --git a/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Model/ClearBucket.php b/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Model/ClearBucket.php index 77ce9378f45..09982d8ae7d 100644 --- a/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Model/ClearBucket.php +++ b/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Model/ClearBucket.php @@ -81,7 +81,7 @@ class ClearBucket extends AbstractHasDispatcher * * @param string $bucket Name of the bucket to clear * - * @return self + * @return $this */ public function setBucket($bucket) { @@ -114,7 +114,7 @@ class ClearBucket extends AbstractHasDispatcher * * @param \Iterator $iterator Iterator used to yield the keys to be deleted * - * @return self + * @return $this */ public function setIterator(\Iterator $iterator) { @@ -129,7 +129,7 @@ class ClearBucket extends AbstractHasDispatcher * @param string $mfa MFA token to send with each request. The value is the concatenation of the authentication * device's serial number, a space, and the value displayed on your authentication device. * - * @return self + * @return $this */ public function setMfa($mfa) { diff --git a/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Model/DeleteObjectsBatch.php b/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Model/DeleteObjectsBatch.php index 17d8af33a73..ab6425bbb87 100644 --- a/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Model/DeleteObjectsBatch.php +++ b/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Model/DeleteObjectsBatch.php @@ -38,7 +38,7 @@ class DeleteObjectsBatch extends AbstractBatchDecorator * @param string $bucket Bucket that contains the objects to delete * @param string $mfa MFA token to use with the request * - * @return self + * @return static */ public static function factory(AwsClientInterface $client, $bucket, $mfa = null) { @@ -47,7 +47,7 @@ class DeleteObjectsBatch extends AbstractBatchDecorator ->transferWith(new DeleteObjectsTransfer($client, $bucket, $mfa)) ->build(); - return new self($batch); + return new static($batch); } /** @@ -56,7 +56,7 @@ class DeleteObjectsBatch extends AbstractBatchDecorator * @param string $key Key of the object * @param string $versionId VersionID of the object * - * @return self + * @return $this */ public function addKey($key, $versionId = null) { @@ -82,6 +82,6 @@ class DeleteObjectsBatch extends AbstractBatchDecorator throw new InvalidArgumentException('Item must be a DeleteObject command or array containing a Key and VersionId key.'); } - return $this->decoratedBatch->add($item); + return parent::add($item); } } diff --git a/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Model/DeleteObjectsTransfer.php b/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Model/DeleteObjectsTransfer.php index c3d3828c4e3..5918ff18ff7 100644 --- a/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Model/DeleteObjectsTransfer.php +++ b/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Model/DeleteObjectsTransfer.php @@ -64,7 +64,7 @@ class DeleteObjectsTransfer implements BatchTransferInterface * * @param string $token MFA token * - * @return self + * @return $this */ public function setMfa($token) { diff --git a/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Model/Grant.php b/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Model/Grant.php index afc2757e8cc..2e35f059511 100644 --- a/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Model/Grant.php +++ b/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Model/Grant.php @@ -63,7 +63,7 @@ class Grant implements ToArrayInterface * * @param Grantee $grantee Affected grantee * - * @return self + * @return $this */ public function setGrantee(Grantee $grantee) { @@ -87,7 +87,7 @@ class Grant implements ToArrayInterface * * @param string $permission Permission applied * - * @return self + * @return $this * * @throws InvalidArgumentException */ diff --git a/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Model/Grantee.php b/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Model/Grantee.php index f49c70fca1c..7634b84a350 100644 --- a/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Model/Grantee.php +++ b/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Model/Grantee.php @@ -214,7 +214,7 @@ class Grantee implements ToArrayInterface */ public function getHeaderValue() { - $key = self::$headerMap[$this->type]; + $key = static::$headerMap[$this->type]; return "{$key}=\"{$this->id}\""; } diff --git a/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Model/MultipartUpload/UploadBuilder.php b/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Model/MultipartUpload/UploadBuilder.php index cae7658d72e..e30f23a36cf 100644 --- a/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Model/MultipartUpload/UploadBuilder.php +++ b/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Model/MultipartUpload/UploadBuilder.php @@ -67,7 +67,7 @@ class UploadBuilder extends AbstractUploadBuilder * * @param string $bucket Name of the bucket * - * @return self + * @return $this */ public function setBucket($bucket) { @@ -79,7 +79,7 @@ class UploadBuilder extends AbstractUploadBuilder * * @param string $key Key of the object to upload * - * @return self + * @return $this */ public function setKey($key) { @@ -91,7 +91,7 @@ class UploadBuilder extends AbstractUploadBuilder * * @param int $minSize Minimum acceptable part size in bytes * - * @return self + * @return $this */ public function setMinPartSize($minSize) { @@ -107,7 +107,7 @@ class UploadBuilder extends AbstractUploadBuilder * * @param int $concurrency Concurrency level * - * @return self + * @return $this */ public function setConcurrency($concurrency) { @@ -121,7 +121,7 @@ class UploadBuilder extends AbstractUploadBuilder * * @param string $md5 MD5 hash of the entire body * - * @return self + * @return $this */ public function setMd5($md5) { @@ -137,7 +137,7 @@ class UploadBuilder extends AbstractUploadBuilder * * @param bool $calculateMd5 Set to true to calculate the MD5 hash of the body * - * @return self + * @return $this */ public function calculateMd5($calculateMd5) { @@ -152,7 +152,7 @@ class UploadBuilder extends AbstractUploadBuilder * * @param bool $usePartMd5 Set to true to calculate the MD5 has of each part * - * @return self + * @return $this */ public function calculatePartMd5($usePartMd5) { @@ -166,7 +166,7 @@ class UploadBuilder extends AbstractUploadBuilder * * @param Acp $acp ACP to set on the object * - * @return self + * @return $this */ public function setAcp(Acp $acp) { @@ -179,7 +179,7 @@ class UploadBuilder extends AbstractUploadBuilder * @param string $name Option name * @param string $value Option value * - * @return self + * @return $this */ public function setOption($name, $value) { @@ -193,7 +193,7 @@ class UploadBuilder extends AbstractUploadBuilder * * @param array $options Array of CreateMultipartUpload operation parameters * - * @return self + * @return $this */ public function addOptions(array $options) { @@ -207,7 +207,7 @@ class UploadBuilder extends AbstractUploadBuilder * * @param array $options Transfer options * - * @return self + * @return $this */ public function setTransferOptions(array $options) { diff --git a/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Resources/s3-2006-03-01.php b/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Resources/s3-2006-03-01.php index 8739cef6a04..0d7b023f029 100644 --- a/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Resources/s3-2006-03-01.php +++ b/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Resources/s3-2006-03-01.php @@ -45,6 +45,11 @@ return array ( 'https' => true, 'hostname' => 's3-eu-west-1.amazonaws.com', ), + 'eu-central-1' => array( + 'http' => true, + 'https' => true, + 'hostname' => 's3-eu-central-1.amazonaws.com', + ), 'ap-northeast-1' => array( 'http' => true, 'https' => true, @@ -355,6 +360,11 @@ return array ( 'location' => 'header', 'sentAs' => 'x-amz-copy-source-server-side-encryption-customer-key-MD5', ), + 'CopySourceSSEKMSKeyId' => array( + 'type' => 'string', + 'location' => 'header', + 'sentAs' => 'x-amz-copy-source-server-side-encryption-aws-kms-key-id', + ), 'ACP' => array( 'type' => 'object', 'additionalProperties' => true, @@ -564,6 +574,11 @@ return array ( 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption-customer-key-MD5', ), + 'SSEKMSKeyId' => array( + 'type' => 'string', + 'location' => 'header', + 'sentAs' => 'x-amz-server-side-encryption-aws-kms-key-id', + ), 'ACP' => array( 'type' => 'object', 'additionalProperties' => true, @@ -1068,6 +1083,11 @@ return array ( 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption-customer-key-MD5', ), + 'SSEKMSKeyId' => array( + 'type' => 'string', + 'location' => 'header', + 'sentAs' => 'x-amz-server-side-encryption-aws-kms-key-id', + ), 'SaveAs' => array( 'location' => 'response_body', ), @@ -1236,6 +1256,11 @@ return array ( 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption-customer-key-MD5', ), + 'SSEKMSKeyId' => array( + 'type' => 'string', + 'location' => 'header', + 'sentAs' => 'x-amz-server-side-encryption-aws-kms-key-id', + ), ), 'errorResponses' => array( array( @@ -1843,10 +1868,22 @@ return array ( 'location' => 'uri', ), 'TopicConfiguration' => array( - 'required' => true, 'type' => 'object', 'location' => 'xml', 'properties' => array( + 'Id' => array( + 'type' => 'string', + ), + 'Events' => array( + 'type' => 'array', + 'data' => array( + 'xmlFlattened' => true, + ), + 'items' => array( + 'name' => 'Event', + 'type' => 'string', + ), + ), 'Event' => array( 'type' => 'string', ), @@ -1855,6 +1892,59 @@ return array ( ), ), ), + 'QueueConfiguration' => array( + 'type' => 'object', + 'location' => 'xml', + 'properties' => array( + 'Id' => array( + 'type' => 'string', + ), + 'Event' => array( + 'type' => 'string', + ), + 'Events' => array( + 'type' => 'array', + 'data' => array( + 'xmlFlattened' => true, + ), + 'items' => array( + 'name' => 'Event', + 'type' => 'string', + ), + ), + 'Queue' => array( + 'type' => 'string', + ), + ), + ), + 'CloudFunctionConfiguration' => array( + 'type' => 'object', + 'location' => 'xml', + 'properties' => array( + 'Id' => array( + 'type' => 'string', + ), + 'Event' => array( + 'type' => 'string', + ), + 'Events' => array( + 'type' => 'array', + 'data' => array( + 'xmlFlattened' => true, + ), + 'items' => array( + 'name' => 'Event', + 'type' => 'string', + ), + ), + 'CloudFunction' => array( + 'type' => 'string', + ), + 'InvocationRole' => array( + 'type' => 'string', + ), + ), + ), ), ), 'PutBucketPolicy' => array( @@ -2241,6 +2331,11 @@ return array ( 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption-customer-key-MD5', ), + 'SSEKMSKeyId' => array( + 'type' => 'string', + 'location' => 'header', + 'sentAs' => 'x-amz-server-side-encryption-aws-kms-key-id', + ), 'ACP' => array( 'type' => 'object', 'additionalProperties' => true, @@ -2399,6 +2494,11 @@ return array ( 'Aws\\S3\\S3Client::explodeKey', ), ), + 'VersionId' => array( + 'type' => 'string', + 'location' => 'query', + 'sentAs' => 'versionId', + ), 'Days' => array( 'required' => true, 'type' => 'numeric', @@ -2488,6 +2588,11 @@ return array ( 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption-customer-key-MD5', ), + 'SSEKMSKeyId' => array( + 'type' => 'string', + 'location' => 'header', + 'sentAs' => 'x-amz-server-side-encryption-aws-kms-key-id', + ), ), ), 'UploadPartCopy' => array( @@ -2602,6 +2707,11 @@ return array ( 'location' => 'header', 'sentAs' => 'x-amz-copy-source-server-side-encryption-customer-key-MD5', ), + 'CopySourceSSEKMSKeyId' => array( + 'type' => 'string', + 'location' => 'header', + 'sentAs' => 'x-amz-server-side-encryption-aws-kms-key-id', + ), 'command.expects' => array( 'static' => true, 'default' => 'application/xml', @@ -2655,6 +2765,11 @@ return array ( 'location' => 'header', 'sentAs' => 'x-amz-version-id', ), + 'SSEKMSKeyId' => array( + 'type' => 'string', + 'location' => 'header', + 'sentAs' => 'x-amz-server-side-encryption-aws-kms-key-id', + ), 'RequestId' => array( 'location' => 'header', 'sentAs' => 'x-amz-request-id', @@ -2698,6 +2813,11 @@ return array ( 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption-customer-key-MD5', ), + 'SSEKMSKeyId' => array( + 'type' => 'string', + 'location' => 'header', + 'sentAs' => 'x-amz-server-side-encryption-aws-kms-key-id', + ), 'RequestId' => array( 'location' => 'header', 'sentAs' => 'x-amz-request-id', @@ -2750,6 +2870,11 @@ return array ( 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption-customer-key-MD5', ), + 'SSEKMSKeyId' => array( + 'type' => 'string', + 'location' => 'header', + 'sentAs' => 'x-amz-server-side-encryption-aws-kms-key-id', + ), 'RequestId' => array( 'location' => 'header', 'sentAs' => 'x-amz-request-id', @@ -3197,6 +3322,21 @@ return array ( 'type' => 'object', 'location' => 'xml', 'properties' => array( + 'Id' => array( + 'type' => 'string', + ), + 'Events' => array( + 'type' => 'array', + 'sentAs' => 'Event', + 'data' => array( + 'xmlFlattened' => true, + ), + 'items' => array( + 'name' => 'Event', + 'type' => 'string', + 'sentAs' => 'Event', + ), + ), 'Event' => array( 'type' => 'string', ), @@ -3205,6 +3345,63 @@ return array ( ), ), ), + 'QueueConfiguration' => array( + 'type' => 'object', + 'location' => 'xml', + 'properties' => array( + 'Id' => array( + 'type' => 'string', + ), + 'Event' => array( + 'type' => 'string', + ), + 'Events' => array( + 'type' => 'array', + 'sentAs' => 'Event', + 'data' => array( + 'xmlFlattened' => true, + ), + 'items' => array( + 'name' => 'Event', + 'type' => 'string', + 'sentAs' => 'Event', + ), + ), + 'Queue' => array( + 'type' => 'string', + ), + ), + ), + 'CloudFunctionConfiguration' => array( + 'type' => 'object', + 'location' => 'xml', + 'properties' => array( + 'Id' => array( + 'type' => 'string', + ), + 'Event' => array( + 'type' => 'string', + ), + 'Events' => array( + 'type' => 'array', + 'sentAs' => 'Event', + 'data' => array( + 'xmlFlattened' => true, + ), + 'items' => array( + 'name' => 'Event', + 'type' => 'string', + 'sentAs' => 'Event', + ), + ), + 'CloudFunction' => array( + 'type' => 'string', + ), + 'InvocationRole' => array( + 'type' => 'string', + ), + ), + ), 'RequestId' => array( 'location' => 'header', 'sentAs' => 'x-amz-request-id', @@ -3478,6 +3675,11 @@ return array ( 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption-customer-key-MD5', ), + 'SSEKMSKeyId' => array( + 'type' => 'string', + 'location' => 'header', + 'sentAs' => 'x-amz-server-side-encryption-aws-kms-key-id', + ), 'RequestId' => array( 'location' => 'header', 'sentAs' => 'x-amz-request-id', @@ -3676,6 +3878,11 @@ return array ( 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption-customer-key-MD5', ), + 'SSEKMSKeyId' => array( + 'type' => 'string', + 'location' => 'header', + 'sentAs' => 'x-amz-server-side-encryption-aws-kms-key-id', + ), 'RequestId' => array( 'location' => 'header', 'sentAs' => 'x-amz-request-id', @@ -3745,6 +3952,10 @@ return array ( 'type' => 'string', 'location' => 'xml', ), + 'Delimiter' => array( + 'type' => 'string', + 'location' => 'xml', + ), 'NextUploadIdMarker' => array( 'type' => 'string', 'location' => 'xml', @@ -3949,6 +4160,10 @@ return array ( 'type' => 'string', 'location' => 'xml', ), + 'Delimiter' => array( + 'type' => 'string', + 'location' => 'xml', + ), 'MaxKeys' => array( 'type' => 'numeric', 'location' => 'xml', @@ -4042,6 +4257,10 @@ return array ( 'type' => 'string', 'location' => 'xml', ), + 'Delimiter' => array( + 'type' => 'string', + 'location' => 'xml', + ), 'MaxKeys' => array( 'type' => 'numeric', 'location' => 'xml', @@ -4298,6 +4517,11 @@ return array ( 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption-customer-key-MD5', ), + 'SSEKMSKeyId' => array( + 'type' => 'string', + 'location' => 'header', + 'sentAs' => 'x-amz-server-side-encryption-aws-kms-key-id', + ), 'RequestId' => array( 'location' => 'header', 'sentAs' => 'x-amz-request-id', @@ -4349,6 +4573,11 @@ return array ( 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption-customer-key-MD5', ), + 'SSEKMSKeyId' => array( + 'type' => 'string', + 'location' => 'header', + 'sentAs' => 'x-amz-server-side-encryption-aws-kms-key-id', + ), 'RequestId' => array( 'location' => 'header', 'sentAs' => 'x-amz-request-id', @@ -4387,6 +4616,11 @@ return array ( 'location' => 'header', 'sentAs' => 'x-amz-server-side-encryption-customer-key-MD5', ), + 'SSEKMSKeyId' => array( + 'type' => 'string', + 'location' => 'header', + 'sentAs' => 'x-amz-server-side-encryption-aws-kms-key-id', + ), 'RequestId' => array( 'location' => 'header', 'sentAs' => 'x-amz-request-id', diff --git a/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/S3Client.php b/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/S3Client.php index 219e37eb92d..7f7c7cf22c4 100644 --- a/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/S3Client.php +++ b/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/S3Client.php @@ -24,7 +24,6 @@ use Aws\Common\Enum\ClientOptions as Options; use Aws\Common\Exception\RuntimeException; use Aws\Common\Exception\InvalidArgumentException; use Aws\Common\Signature\SignatureV4; -use Aws\Common\Signature\SignatureInterface; use Aws\Common\Model\MultipartUpload\AbstractTransfer; use Aws\S3\Exception\AccessDeniedException; use Aws\S3\Exception\Parser\S3ExceptionParser; @@ -156,7 +155,7 @@ class S3Client extends AbstractClient * * @param array|Collection $config Client configuration data * - * @return self + * @return S3Client * @link http://docs.aws.amazon.com/aws-sdk-php/guide/latest/configuration.html#client-configuration-options */ public static function factory($config = array()) @@ -165,10 +164,10 @@ class S3Client extends AbstractClient // Configure the custom exponential backoff plugin for retrying S3 specific errors if (!isset($config[Options::BACKOFF])) { - $config[Options::BACKOFF] = self::createBackoffPlugin($exceptionParser); + $config[Options::BACKOFF] = static::createBackoffPlugin($exceptionParser); } - $config[Options::SIGNATURE] = $signature = self::createSignature($config); + $config[Options::SIGNATURE] = $signature = static::createSignature($config); $client = ClientBuilder::factory(__NAMESPACE__) ->setConfig($config) @@ -222,7 +221,7 @@ class S3Client extends AbstractClient // Add aliases for some S3 operations $default = CompositeFactory::getDefaultChain($client); $default->add( - new AliasFactory($client, self::$commandAliases), + new AliasFactory($client, static::$commandAliases), 'Guzzle\Service\Command\Factory\ServiceDescriptionFactory' ); $client->setCommandFactory($default); @@ -266,11 +265,16 @@ class S3Client extends AbstractClient { $currentValue = isset($config[Options::SIGNATURE]) ? $config[Options::SIGNATURE] : null; + // Force v4 if no value is provided, a region is in the config, and + // the region starts with "cn-" or "eu-central-". + $requiresV4 = !$currentValue + && isset($config['region']) + && (strpos($config['region'], 'eu-central-') === 0 + || strpos($config['region'], 'cn-') === 0); + // Use the Amazon S3 signature V4 when the value is set to "v4" or when // the value is not set and the region starts with "cn-". - if ($currentValue == 'v4' || - (!$currentValue && isset($config['region']) && substr($config['region'], 0, 3) == 'cn-') - ) { + if ($currentValue == 'v4' || $requiresV4) { // Force SignatureV4 for specific regions or if specified in the config $currentValue = new S3SignatureV4('s3'); } elseif (!$currentValue || $currentValue == 's3') { @@ -456,7 +460,7 @@ class S3Client extends AbstractClient /** * Register the Amazon S3 stream wrapper and associates it with this client object * - * @return self + * @return $this */ public function registerStreamWrapper() { @@ -515,8 +519,7 @@ class S3Client extends AbstractClient ->setTransferOptions($options->toArray()) ->addOptions($options['params']) ->setOption('ACL', $acl) - ->build() - ->upload(); + ->build(); if ($options['before_upload']) { $transfer->getEventDispatcher()->addListener( @@ -525,7 +528,7 @@ class S3Client extends AbstractClient ); } - return $transfer; + return $transfer->upload(); } /** diff --git a/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/S3SignatureV4.php b/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/S3SignatureV4.php index 7587af0fcba..edbb4fcd082 100644 --- a/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/S3SignatureV4.php +++ b/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/S3SignatureV4.php @@ -32,7 +32,10 @@ class S3SignatureV4 extends SignatureV4 implements S3SignatureInterface public function signRequest(RequestInterface $request, CredentialsInterface $credentials) { if (!$request->hasHeader('x-amz-content-sha256')) { - $request->setHeader('x-amz-content-sha256', $this->getPresignedPayload($request)); + $request->setHeader( + 'x-amz-content-sha256', + $this->getPayload($request) + ); } parent::signRequest($request, $credentials); @@ -44,14 +47,7 @@ class S3SignatureV4 extends SignatureV4 implements S3SignatureInterface */ protected function getPresignedPayload(RequestInterface $request) { - $result = parent::getPresignedPayload($request); - - // If the body is empty, then sign with 'UNSIGNED-PAYLOAD' - if ($result === self::DEFAULT_PAYLOAD) { - $result = hash('sha256', 'UNSIGNED-PAYLOAD'); - } - - return $result; + return 'UNSIGNED-PAYLOAD'; } /** diff --git a/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/StreamWrapper.php b/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/StreamWrapper.php index 3bb85aae6df..b0bdb21f564 100644 --- a/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/StreamWrapper.php +++ b/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/StreamWrapper.php @@ -133,7 +133,7 @@ class StreamWrapper } stream_wrapper_register('s3', get_called_class(), STREAM_IS_URL); - self::$client = $client; + static::$client = $client; } /** @@ -172,7 +172,7 @@ class StreamWrapper } // When using mode "x" validate if the file exists before attempting to read - if ($mode == 'x' && self::$client->doesObjectExist($params['Bucket'], $params['Key'], $this->getOptions())) { + if ($mode == 'x' && static::$client->doesObjectExist($params['Bucket'], $params['Key'], $this->getOptions())) { $errors[] = "{$path} already exists on Amazon S3"; } @@ -219,7 +219,7 @@ class StreamWrapper } try { - self::$client->putObject($params); + static::$client->putObject($params); return true; } catch (\Exception $e) { return $this->triggerError($e->getMessage()); @@ -283,7 +283,7 @@ class StreamWrapper { try { $this->clearStatInfo($path); - self::$client->deleteObject($this->getParams($path)); + static::$client->deleteObject($this->getParams($path)); return true; } catch (\Exception $e) { return $this->triggerError($e->getMessage()); @@ -316,15 +316,15 @@ class StreamWrapper public function url_stat($path, $flags) { // Check if this path is in the url_stat cache - if (isset(self::$nextStat[$path])) { - return self::$nextStat[$path]; + if (isset(static::$nextStat[$path])) { + return static::$nextStat[$path]; } $parts = $this->getParams($path); if (!$parts['Key']) { // Stat "directories": buckets, or "s3://" - if (!$parts['Bucket'] || self::$client->doesBucketExist($parts['Bucket'])) { + if (!$parts['Bucket'] || static::$client->doesBucketExist($parts['Bucket'])) { return $this->formatUrlStat($path); } else { return $this->triggerError("File or directory not found: {$path}", $flags); @@ -333,7 +333,7 @@ class StreamWrapper try { try { - $result = self::$client->headObject($parts)->toArray(); + $result = static::$client->headObject($parts)->toArray(); if (substr($parts['Key'], -1, 1) == '/' && $result['ContentLength'] == 0) { // Return as if it is a bucket to account for console bucket objects (e.g., zero-byte object "foo/") return $this->formatUrlStat($path); @@ -343,7 +343,7 @@ class StreamWrapper } } catch (NoSuchKeyException $e) { // Maybe this isn't an actual key, but a prefix. Do a prefix listing of objects to determine. - $result = self::$client->listObjects(array( + $result = static::$client->listObjects(array( 'Bucket' => $parts['Bucket'], 'Prefix' => rtrim($parts['Key'], '/') . '/', 'MaxKeys' => 1 @@ -404,7 +404,7 @@ class StreamWrapper try { if (!$params['Key']) { - self::$client->deleteBucket(array('Bucket' => $params['Bucket'])); + static::$client->deleteBucket(array('Bucket' => $params['Bucket'])); $this->clearStatInfo($path); return true; } @@ -412,7 +412,7 @@ class StreamWrapper // Use a key that adds a trailing slash if needed. $prefix = rtrim($params['Key'], '/') . '/'; - $result = self::$client->listObjects(array( + $result = static::$client->listObjects(array( 'Bucket' => $params['Bucket'], 'Prefix' => $prefix, 'MaxKeys' => 1 @@ -476,7 +476,7 @@ class StreamWrapper $operationParams['Delimiter'] = $delimiter; } - $objectIterator = self::$client->getIterator('ListObjects', $operationParams, array( + $objectIterator = static::$client->getIterator('ListObjects', $operationParams, array( 'return_prefixes' => true, 'sort_results' => true )); @@ -554,7 +554,7 @@ class StreamWrapper // Cache the object data for quick url_stat lookups used with // RecursiveDirectoryIterator. - self::$nextStat = array($key => $stat); + static::$nextStat = array($key => $stat); $this->objectIterator->next(); return $result; @@ -582,14 +582,14 @@ class StreamWrapper try { // Copy the object and allow overriding default parameters if desired, but by default copy metadata - self::$client->copyObject($this->getOptions() + array( + static::$client->copyObject($this->getOptions() + array( 'Bucket' => $partsTo['Bucket'], 'Key' => $partsTo['Key'], 'CopySource' => '/' . $partsFrom['Bucket'] . '/' . rawurlencode($partsFrom['Key']), 'MetadataDirective' => 'COPY' )); // Delete the original object - self::$client->deleteObject(array( + static::$client->deleteObject(array( 'Bucket' => $partsFrom['Bucket'], 'Key' => $partsFrom['Key'] ) + $this->getOptions()); @@ -685,7 +685,7 @@ class StreamWrapper protected function openReadStream(array $params, array &$errors) { // Create the command and serialize the request - $request = $this->getSignedRequest(self::$client->getCommand('GetObject', $params)); + $request = $this->getSignedRequest(static::$client->getCommand('GetObject', $params)); // Create a stream that uses the EntityBody object $factory = $this->getOption('stream_factory') ?: new PhpStreamRequestFactory(); $this->body = $factory->fromRequest($request, array(), array('stream_class' => 'Guzzle\Http\EntityBody')); @@ -723,7 +723,7 @@ class StreamWrapper { try { // Get the body of the object - $this->body = self::$client->getObject($params)->get('Body'); + $this->body = static::$client->getObject($params)->get('Body'); $this->body->seek(0, SEEK_END); } catch (S3Exception $e) { // The object does not exist, so use a simple write stream @@ -810,7 +810,7 @@ class StreamWrapper */ protected function clearStatInfo($path = null) { - self::$nextStat = array(); + static::$nextStat = array(); if ($path) { clearstatcache(true, $path); } @@ -826,12 +826,12 @@ class StreamWrapper */ private function createBucket($path, array $params) { - if (self::$client->doesBucketExist($params['Bucket'])) { + if (static::$client->doesBucketExist($params['Bucket'])) { return $this->triggerError("Directory already exists: {$path}"); } try { - self::$client->createBucket($params); + static::$client->createBucket($params); $this->clearStatInfo($path); return true; } catch (\Exception $e) { @@ -854,12 +854,12 @@ class StreamWrapper $params['Body'] = ''; // Fail if this pseudo directory key already exists - if (self::$client->doesObjectExist($params['Bucket'], $params['Key'])) { + if (static::$client->doesObjectExist($params['Bucket'], $params['Key'])) { return $this->triggerError("Directory already exists: {$path}"); } try { - self::$client->putObject($params); + static::$client->putObject($params); $this->clearStatInfo($path); return true; } catch (\Exception $e) { diff --git a/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Sync/AbstractSyncBuilder.php b/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Sync/AbstractSyncBuilder.php index a2fe0fc5b8f..df69f4a8519 100644 --- a/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Sync/AbstractSyncBuilder.php +++ b/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Sync/AbstractSyncBuilder.php @@ -65,7 +65,7 @@ abstract class AbstractSyncBuilder protected $debug; /** - * @return self + * @return static */ public static function getInstance() { @@ -77,7 +77,7 @@ abstract class AbstractSyncBuilder * * @param string $bucket Amazon S3 bucket name * - * @return self + * @return $this */ public function setBucket($bucket) { @@ -91,7 +91,7 @@ abstract class AbstractSyncBuilder * * @param S3Client $client Amazon S3 client * - * @return self + * @return $this */ public function setClient(S3Client $client) { @@ -105,7 +105,7 @@ abstract class AbstractSyncBuilder * * @param \Iterator $iterator * - * @return self + * @return $this */ public function setSourceIterator(\Iterator $iterator) { @@ -119,7 +119,7 @@ abstract class AbstractSyncBuilder * * @param FileNameConverterInterface $converter Filename to object key provider * - * @return self + * @return $this */ public function setSourceFilenameConverter(FilenameConverterInterface $converter) { @@ -133,7 +133,7 @@ abstract class AbstractSyncBuilder * * @param FileNameConverterInterface $converter Filename to object key provider * - * @return self + * @return $this */ public function setTargetFilenameConverter(FilenameConverterInterface $converter) { @@ -148,7 +148,7 @@ abstract class AbstractSyncBuilder * * @param string $baseDir Base directory, which will be deleted from each uploaded object key * - * @return self + * @return $this */ public function setBaseDir($baseDir) { @@ -164,7 +164,7 @@ abstract class AbstractSyncBuilder * * @param string $keyPrefix Prefix for each uploaded key * - * @return self + * @return $this */ public function setKeyPrefix($keyPrefix) { @@ -179,7 +179,7 @@ abstract class AbstractSyncBuilder * * @param string $delimiter Delimiter to use to separate paths * - * @return self + * @return $this */ public function setDelimiter($delimiter) { @@ -193,7 +193,7 @@ abstract class AbstractSyncBuilder * * @param array $params Associative array of PutObject (upload) GetObject (download) parameters * - * @return self + * @return $this */ public function setOperationParams(array $params) { @@ -207,7 +207,7 @@ abstract class AbstractSyncBuilder * * @param int $concurrency Number of concurrent transfers * - * @return self + * @return $this */ public function setConcurrency($concurrency) { @@ -221,7 +221,7 @@ abstract class AbstractSyncBuilder * * @param bool $force Set to true to force transfers without checking if it has changed * - * @return self + * @return $this */ public function force($force = false) { @@ -235,7 +235,7 @@ abstract class AbstractSyncBuilder * * @param bool|resource $enabledOrResource Set to true or false to enable or disable debug output. Pass an opened * fopen resource to write to instead of writing to standard out. - * @return self + * @return $this */ public function enableDebugOutput($enabledOrResource = true) { @@ -249,7 +249,7 @@ abstract class AbstractSyncBuilder * * @param string $search Regular expression search (in preg_match format). Any filename that matches this regex * will not be transferred. - * @return self + * @return $this */ public function addRegexFilter($search) { @@ -301,7 +301,7 @@ abstract class AbstractSyncBuilder /** * Hook to implement in subclasses * - * @return self + * @return AbstractSync */ abstract protected function specificBuild(); diff --git a/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Sync/DownloadSyncBuilder.php b/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Sync/DownloadSyncBuilder.php index b0a1e8cda4c..d9cd044449a 100644 --- a/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Sync/DownloadSyncBuilder.php +++ b/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Sync/DownloadSyncBuilder.php @@ -38,7 +38,7 @@ class DownloadSyncBuilder extends AbstractSyncBuilder * * @param string $directory Directory * - * @return self + * @return $this */ public function setDirectory($directory) { diff --git a/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Sync/UploadSyncBuilder.php b/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Sync/UploadSyncBuilder.php index ad6333d687b..20830590692 100644 --- a/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Sync/UploadSyncBuilder.php +++ b/apps/files_external/3rdparty/aws-sdk-php/Aws/S3/Sync/UploadSyncBuilder.php @@ -36,7 +36,7 @@ class UploadSyncBuilder extends AbstractSyncBuilder * * @param string $path Path that contains files to upload * - * @return self + * @return $this */ public function uploadFromDirectory($path) { @@ -54,7 +54,7 @@ class UploadSyncBuilder extends AbstractSyncBuilder * * @param string $glob Glob expression * - * @return self + * @return $this * @link http://www.php.net/manual/en/function.glob.php */ public function uploadFromGlob($glob) @@ -71,7 +71,7 @@ class UploadSyncBuilder extends AbstractSyncBuilder * * @param string $acl Canned ACL for each upload * - * @return self + * @return $this */ public function setAcl($acl) { @@ -85,7 +85,7 @@ class UploadSyncBuilder extends AbstractSyncBuilder * * @param Acp $acp Access control policy * - * @return self + * @return $this */ public function setAcp(Acp $acp) { @@ -100,7 +100,7 @@ class UploadSyncBuilder extends AbstractSyncBuilder * * @param int $size Size threshold * - * @return self + * @return $this */ public function setMultipartUploadSize($size) { diff --git a/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/ApcClassLoader.php b/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/ApcClassLoader.php index 8ee49fb45d3..513362a5030 100644 --- a/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/ApcClassLoader.php +++ b/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/ApcClassLoader.php @@ -15,7 +15,7 @@ namespace Symfony\Component\ClassLoader; * ApcClassLoader implements a wrapping autoloader cached in APC for PHP 5.3. * * It expects an object implementing a findFile method to find the file. This - * allow using it as a wrapper around the other loaders of the component (the + * allows using it as a wrapper around the other loaders of the component (the * ClassLoader and the UniversalClassLoader for instance) but also around any * other autoloader following this convention (the Composer one for instance) * @@ -46,7 +46,7 @@ class ApcClassLoader /** * The class loader object being decorated. * - * @var \Symfony\Component\ClassLoader\ClassLoader + * @var object * A class loader object that implements the findFile() method. */ protected $decorated; @@ -133,5 +133,4 @@ class ApcClassLoader { return call_user_func_array(array($this->decorated, $method), $args); } - } diff --git a/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/ClassMapGenerator.php b/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/ClassMapGenerator.php index 7f83dbc5592..efc95ec8be9 100644 --- a/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/ClassMapGenerator.php +++ b/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/ClassMapGenerator.php @@ -71,7 +71,6 @@ class ClassMapGenerator foreach ($classes as $class) { $map[$class] = $path; } - } return $map; diff --git a/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Psr4ClassLoader.php b/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Psr4ClassLoader.php index 429812d1156..1c0c37e0988 100644 --- a/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Psr4ClassLoader.php +++ b/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Psr4ClassLoader.php @@ -32,7 +32,7 @@ class Psr4ClassLoader public function addPrefix($prefix, $baseDir) { $prefix = trim($prefix, '\\').'\\'; - $baseDir = rtrim($baseDir, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR; + $baseDir = rtrim($baseDir, DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR; $this->prefixes[] = array($prefix, $baseDir); } @@ -49,7 +49,7 @@ class Psr4ClassLoader list($currentPrefix, $currentBaseDir) = $current; if (0 === strpos($class, $currentPrefix)) { $classWithoutPrefix = substr($class, strlen($currentPrefix)); - $file = $currentBaseDir . str_replace('\\', DIRECTORY_SEPARATOR, $classWithoutPrefix) . '.php'; + $file = $currentBaseDir.str_replace('\\', DIRECTORY_SEPARATOR, $classWithoutPrefix).'.php'; if (file_exists($file)) { return $file; } diff --git a/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/README.md b/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/README.md index fc222b1c9e3..3c785049d20 100644 --- a/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/README.md +++ b/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/README.md @@ -9,51 +9,63 @@ standard or the PEAR naming convention. First, register the autoloader: - require_once __DIR__.'/src/Symfony/Component/ClassLoader/UniversalClassLoader.php'; +```php +require_once __DIR__.'/src/Symfony/Component/ClassLoader/UniversalClassLoader.php'; - use Symfony\Component\ClassLoader\UniversalClassLoader; +use Symfony\Component\ClassLoader\UniversalClassLoader; - $loader = new UniversalClassLoader(); - $loader->register(); +$loader = new UniversalClassLoader(); +$loader->register(); +``` Then, register some namespaces with the `registerNamespace()` method: - $loader->registerNamespace('Symfony', __DIR__.'/src'); - $loader->registerNamespace('Monolog', __DIR__.'/vendor/monolog/src'); +```php +$loader->registerNamespace('Symfony', __DIR__.'/src'); +$loader->registerNamespace('Monolog', __DIR__.'/vendor/monolog/src'); +``` The `registerNamespace()` method takes a namespace prefix and a path where to look for the classes as arguments. You can also register a sub-namespaces: - $loader->registerNamespace('Doctrine\\Common', __DIR__.'/vendor/doctrine-common/lib'); +```php +$loader->registerNamespace('Doctrine\\Common', __DIR__.'/vendor/doctrine-common/lib'); +``` The order of registration is significant and the first registered namespace takes precedence over later registered one. You can also register more than one path for a given namespace: - $loader->registerNamespace('Symfony', array(__DIR__.'/src', __DIR__.'/symfony/src')); +```php +$loader->registerNamespace('Symfony', array(__DIR__.'/src', __DIR__.'/symfony/src')); +``` Alternatively, you can use the `registerNamespaces()` method to register more than one namespace at once: - $loader->registerNamespaces(array( - 'Symfony' => array(__DIR__.'/src', __DIR__.'/symfony/src'), - 'Doctrine\\Common' => __DIR__.'/vendor/doctrine-common/lib', - 'Doctrine' => __DIR__.'/vendor/doctrine/lib', - 'Monolog' => __DIR__.'/vendor/monolog/src', - )); +```php +$loader->registerNamespaces(array( + 'Symfony' => array(__DIR__.'/src', __DIR__.'/symfony/src'), + 'Doctrine\\Common' => __DIR__.'/vendor/doctrine-common/lib', + 'Doctrine' => __DIR__.'/vendor/doctrine/lib', + 'Monolog' => __DIR__.'/vendor/monolog/src', +)); +``` For better performance, you can use the APC based version of the universal class loader: - require_once __DIR__.'/src/Symfony/Component/ClassLoader/UniversalClassLoader.php'; - require_once __DIR__.'/src/Symfony/Component/ClassLoader/ApcUniversalClassLoader.php'; +```php +require_once __DIR__.'/src/Symfony/Component/ClassLoader/UniversalClassLoader.php'; +require_once __DIR__.'/src/Symfony/Component/ClassLoader/ApcUniversalClassLoader.php'; - use Symfony\Component\ClassLoader\ApcUniversalClassLoader; +use Symfony\Component\ClassLoader\ApcUniversalClassLoader; - $loader = new ApcUniversalClassLoader('apc.prefix.'); +$loader = new ApcUniversalClassLoader('apc.prefix.'); +``` Furthermore, the component provides tools to aggregate classes into a single file, which is especially useful to improve performance on servers that do not diff --git a/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/ApcUniversalClassLoaderTest.php b/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/ApcUniversalClassLoaderTest.php index 38a17f28453..9755256c79a 100644 --- a/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/ApcUniversalClassLoaderTest.php +++ b/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/ApcUniversalClassLoaderTest.php @@ -55,13 +55,13 @@ class ApcUniversalClassLoaderTest extends \PHPUnit_Framework_TestCase $this->assertTrue(class_exists($className), $message); } - public function getLoadClassTests() - { - return array( + public function getLoadClassTests() + { + return array( array('\\Apc\\Namespaced\\Foo', 'Apc\\Namespaced\\Foo', '->loadClass() loads Apc\Namespaced\Foo class'), array('Apc_Pearlike_Foo', 'Apc_Pearlike_Foo', '->loadClass() loads Apc_Pearlike_Foo class'), ); - } + } /** * @dataProvider getLoadClassFromFallbackTests @@ -77,15 +77,15 @@ class ApcUniversalClassLoaderTest extends \PHPUnit_Framework_TestCase $this->assertTrue(class_exists($className), $message); } - public function getLoadClassFromFallbackTests() - { - return array( + public function getLoadClassFromFallbackTests() + { + return array( array('\\Apc\\Namespaced\\Baz', 'Apc\\Namespaced\\Baz', '->loadClass() loads Apc\Namespaced\Baz class'), array('Apc_Pearlike_Baz', 'Apc_Pearlike_Baz', '->loadClass() loads Apc_Pearlike_Baz class'), array('\\Apc\\Namespaced\\FooBar', 'Apc\\Namespaced\\FooBar', '->loadClass() loads Apc\Namespaced\Baz class from fallback dir'), array('Apc_Pearlike_FooBar', 'Apc_Pearlike_FooBar', '->loadClass() loads Apc_Pearlike_Baz class from fallback dir'), ); - } + } /** * @dataProvider getLoadClassNamespaceCollisionTests @@ -100,9 +100,9 @@ class ApcUniversalClassLoaderTest extends \PHPUnit_Framework_TestCase $this->assertTrue(class_exists($className), $message); } - public function getLoadClassNamespaceCollisionTests() - { - return array( + public function getLoadClassNamespaceCollisionTests() + { + return array( array( array( 'Apc\\NamespaceCollision\\A' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/Apc/alpha', @@ -136,7 +136,7 @@ class ApcUniversalClassLoaderTest extends \PHPUnit_Framework_TestCase '->loadClass() loads NamespaceCollision\A\B\Bar from beta.', ), ); - } + } /** * @dataProvider getLoadClassPrefixCollisionTests @@ -150,9 +150,9 @@ class ApcUniversalClassLoaderTest extends \PHPUnit_Framework_TestCase $this->assertTrue(class_exists($className), $message); } - public function getLoadClassPrefixCollisionTests() - { - return array( + public function getLoadClassPrefixCollisionTests() + { + return array( array( array( 'ApcPrefixCollision_A_' => __DIR__.DIRECTORY_SEPARATOR.'Fixtures/Apc/alpha/Apc', @@ -186,5 +186,5 @@ class ApcUniversalClassLoaderTest extends \PHPUnit_Framework_TestCase '->loadClass() loads ApcPrefixCollision_A_B_Bar from beta.', ), ); - } + } } diff --git a/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/ClassMapGeneratorTest.php b/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/ClassMapGeneratorTest.php index b8600fc54ed..35617e363ea 100644 --- a/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/ClassMapGeneratorTest.php +++ b/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/ClassMapGeneratorTest.php @@ -76,7 +76,7 @@ class ClassMapGeneratorTest extends \PHPUnit_Framework_TestCase 'Namespaced\\Foo' => realpath(__DIR__).'/Fixtures/Namespaced/Foo.php', 'Namespaced\\Baz' => realpath(__DIR__).'/Fixtures/Namespaced/Baz.php', 'Namespaced\\WithComments' => realpath(__DIR__).'/Fixtures/Namespaced/WithComments.php', - ) + ), ), array(__DIR__.'/Fixtures/beta/NamespaceCollision', array( 'NamespaceCollision\\A\\B\\Bar' => realpath(__DIR__).'/Fixtures/beta/NamespaceCollision/A/B/Bar.php', diff --git a/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/A.php b/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/A.php index dff891dcb79..b0f9425950f 100644 --- a/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/A.php +++ b/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/A.php @@ -2,4 +2,6 @@ namespace ClassesWithParents; -class A extends B {} +class A extends B +{ +} diff --git a/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/B.php b/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/B.php index 196bf7a2d31..22c751a7e5d 100644 --- a/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/B.php +++ b/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/Fixtures/ClassesWithParents/B.php @@ -2,4 +2,6 @@ namespace ClassesWithParents; -class B implements CInterface {} +class B implements CInterface +{ +} diff --git a/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/Fixtures/classmap/SomeClass.php b/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/Fixtures/classmap/SomeClass.php index 26fabbd96e2..c63cef9233e 100644 --- a/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/Fixtures/classmap/SomeClass.php +++ b/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/Fixtures/classmap/SomeClass.php @@ -13,5 +13,4 @@ namespace ClassMap; class SomeClass extends SomeParent implements SomeInterface { - } diff --git a/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/Fixtures/classmap/SomeInterface.php b/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/Fixtures/classmap/SomeInterface.php index 09d7a8f35a4..1fe5e09aa1f 100644 --- a/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/Fixtures/classmap/SomeInterface.php +++ b/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/Fixtures/classmap/SomeInterface.php @@ -13,5 +13,4 @@ namespace ClassMap; interface SomeInterface { - } diff --git a/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/Fixtures/classmap/SomeParent.php b/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/Fixtures/classmap/SomeParent.php index 5a859a94607..ce2f9fc6c47 100644 --- a/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/Fixtures/classmap/SomeParent.php +++ b/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/Fixtures/classmap/SomeParent.php @@ -13,5 +13,4 @@ namespace ClassMap; abstract class SomeParent { - } diff --git a/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/Fixtures/classmap/multipleNs.php b/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/Fixtures/classmap/multipleNs.php index d19e07fc11a..7db8cd3b67c 100644 --- a/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/Fixtures/classmap/multipleNs.php +++ b/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/Fixtures/classmap/multipleNs.php @@ -1,14 +1,24 @@ <?php namespace { - class A {} + class A + { + } } namespace Alpha { - class A {} - class B {} + class A + { + } + class B + { + } } namespace Beta { - class A {} - class B {} + class A + { + } + class B + { + } } diff --git a/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/Fixtures/classmap/sameNsMultipleClasses.php b/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/Fixtures/classmap/sameNsMultipleClasses.php index d5ef5e5aa25..b34b9dd28be 100644 --- a/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/Fixtures/classmap/sameNsMultipleClasses.php +++ b/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/Fixtures/classmap/sameNsMultipleClasses.php @@ -11,5 +11,9 @@ namespace Foo\Bar; -class A {} -class B {} +class A +{ +} +class B +{ +} diff --git a/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/Fixtures/deps/traits.php b/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/Fixtures/deps/traits.php index a5537ac92fa..82b30a6f9d0 100644 --- a/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/Fixtures/deps/traits.php +++ b/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/Fixtures/deps/traits.php @@ -1,7 +1,8 @@ <?php trait TD -{} +{ +} trait TZ { diff --git a/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/Fixtures/php5.4/traits.php b/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/Fixtures/php5.4/traits.php index 2d92c378e1a..70950be6ff2 100644 --- a/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/Fixtures/php5.4/traits.php +++ b/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/Fixtures/php5.4/traits.php @@ -25,6 +25,7 @@ namespace Foo { class CBar implements IBar { - use TBar, TFooBar; + use TBar; + use TFooBar; } } diff --git a/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/Psr4ClassLoaderTest.php b/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/Psr4ClassLoaderTest.php index 65cae485ad2..21a7afbd6e7 100644 --- a/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/Psr4ClassLoaderTest.php +++ b/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/Tests/Psr4ClassLoaderTest.php @@ -24,7 +24,7 @@ class Psr4ClassLoaderTest extends \PHPUnit_Framework_TestCase $loader = new Psr4ClassLoader(); $loader->addPrefix( 'Acme\\DemoLib', - __DIR__ . DIRECTORY_SEPARATOR . 'Fixtures' . DIRECTORY_SEPARATOR . 'psr-4' + __DIR__.DIRECTORY_SEPARATOR.'Fixtures'.DIRECTORY_SEPARATOR.'psr-4' ); $loader->loadClass($className); $this->assertTrue(class_exists($className), sprintf('loadClass() should load %s', $className)); @@ -39,7 +39,7 @@ class Psr4ClassLoaderTest extends \PHPUnit_Framework_TestCase array('Acme\\DemoLib\\Foo'), array('Acme\\DemoLib\\Class_With_Underscores'), array('Acme\\DemoLib\\Lets\\Go\\Deeper\\Foo'), - array('Acme\\DemoLib\\Lets\\Go\\Deeper\\Class_With_Underscores') + array('Acme\\DemoLib\\Lets\\Go\\Deeper\\Class_With_Underscores'), ); } @@ -52,7 +52,7 @@ class Psr4ClassLoaderTest extends \PHPUnit_Framework_TestCase $loader = new Psr4ClassLoader(); $loader->addPrefix( 'Acme\\DemoLib', - __DIR__ . DIRECTORY_SEPARATOR . 'Fixtures' . DIRECTORY_SEPARATOR . 'psr-4' + __DIR__.DIRECTORY_SEPARATOR.'Fixtures'.DIRECTORY_SEPARATOR.'psr-4' ); $loader->loadClass($className); $this->assertFalse(class_exists($className), sprintf('loadClass() should not load %s', $className)); @@ -65,7 +65,7 @@ class Psr4ClassLoaderTest extends \PHPUnit_Framework_TestCase { return array( array('Acme\\DemoLib\\I_Do_Not_Exist'), - array('UnknownVendor\\SomeLib\\I_Do_Not_Exist') + array('UnknownVendor\\SomeLib\\I_Do_Not_Exist'), ); } } diff --git a/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/UniversalClassLoader.php b/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/UniversalClassLoader.php index 43f9a7d02c4..8a3149f3198 100644 --- a/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/UniversalClassLoader.php +++ b/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/UniversalClassLoader.php @@ -287,7 +287,6 @@ class UniversalClassLoader return $file; } } - } else { // PEAR-like class name $normalizedClass = str_replace('_', DIRECTORY_SEPARATOR, $class).'.php'; diff --git a/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/XcacheClassLoader.php b/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/XcacheClassLoader.php index 299a79af932..30096bc83f1 100644 --- a/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/XcacheClassLoader.php +++ b/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/ClassLoader/XcacheClassLoader.php @@ -12,7 +12,7 @@ namespace Symfony\Component\ClassLoader; /** - * XcacheClassLoader implements a wrapping autoloader cached in Xcache for PHP 5.3. + * XcacheClassLoader implements a wrapping autoloader cached in XCache for PHP 5.3. * * It expects an object implementing a findFile method to find the file. This * allows using it as a wrapper around the other loaders of the component (the @@ -43,31 +43,35 @@ namespace Symfony\Component\ClassLoader; class XcacheClassLoader { private $prefix; - private $classFinder; + + /** + * @var object A class loader object that implements the findFile() method + */ + private $decorated; /** * Constructor. * - * @param string $prefix A prefix to create a namespace in Xcache - * @param object $classFinder An object that implements findFile() method. + * @param string $prefix The XCache namespace prefix to use. + * @param object $decorated A class loader object that implements the findFile() method. * * @throws \RuntimeException * @throws \InvalidArgumentException * * @api */ - public function __construct($prefix, $classFinder) + public function __construct($prefix, $decorated) { - if (!extension_loaded('Xcache')) { - throw new \RuntimeException('Unable to use XcacheClassLoader as Xcache is not enabled.'); + if (!extension_loaded('xcache')) { + throw new \RuntimeException('Unable to use XcacheClassLoader as XCache is not enabled.'); } - if (!method_exists($classFinder, 'findFile')) { + if (!method_exists($decorated, 'findFile')) { throw new \InvalidArgumentException('The class finder must implement a "findFile" method.'); } $this->prefix = $prefix; - $this->classFinder = $classFinder; + $this->decorated = $decorated; } /** @@ -116,10 +120,18 @@ class XcacheClassLoader if (xcache_isset($this->prefix.$class)) { $file = xcache_get($this->prefix.$class); } else { - $file = $this->classFinder->findFile($class); + $file = $this->decorated->findFile($class); xcache_set($this->prefix.$class, $file); } return $file; } + + /** + * Passes through all unknown calls onto the decorated object. + */ + public function __call($method, $args) + { + return call_user_func_array(array($this->decorated, $method), $args); + } } diff --git a/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/EventDispatcher/Debug/TraceableEventDispatcher.php b/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/EventDispatcher/Debug/TraceableEventDispatcher.php index 410226bb363..b797667208b 100644 --- a/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/EventDispatcher/Debug/TraceableEventDispatcher.php +++ b/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/EventDispatcher/Debug/TraceableEventDispatcher.php @@ -271,7 +271,7 @@ class TraceableEventDispatcher implements TraceableEventDispatcherInterface if ($listener instanceof \Closure) { $info += array( 'type' => 'Closure', - 'pretty' => 'closure' + 'pretty' => 'closure', ); } elseif (is_string($listener)) { try { diff --git a/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/EventDispatcher/EventDispatcherInterface.php b/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/EventDispatcher/EventDispatcherInterface.php index 3fdbfd8822e..c85ebdafc15 100644 --- a/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/EventDispatcher/EventDispatcherInterface.php +++ b/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/EventDispatcher/EventDispatcherInterface.php @@ -64,8 +64,8 @@ interface EventDispatcherInterface /** * Removes an event listener from the specified events. * - * @param string|array $eventName The event(s) to remove a listener from - * @param callable $listener The listener to remove + * @param string $eventName The event to remove a listener from + * @param callable $listener The listener to remove */ public function removeListener($eventName, $listener); diff --git a/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/EventDispatcher/README.md b/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/EventDispatcher/README.md index 22bf74fdc9d..c928f136692 100644 --- a/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/EventDispatcher/README.md +++ b/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/EventDispatcher/README.md @@ -4,16 +4,18 @@ EventDispatcher Component The Symfony2 EventDispatcher component implements the Mediator pattern in a simple and effective way to make your projects truly extensible. - use Symfony\Component\EventDispatcher\EventDispatcher; - use Symfony\Component\EventDispatcher\Event; +```php +use Symfony\Component\EventDispatcher\EventDispatcher; +use Symfony\Component\EventDispatcher\Event; - $dispatcher = new EventDispatcher(); +$dispatcher = new EventDispatcher(); - $dispatcher->addListener('event_name', function (Event $event) { - // ... - }); +$dispatcher->addListener('event_name', function (Event $event) { + // ... +}); - $dispatcher->dispatch('event_name'); +$dispatcher->dispatch('event_name'); +``` Resources --------- diff --git a/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/EventDispatcher/Tests/Debug/TraceableEventDispatcherTest.php b/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/EventDispatcher/Tests/Debug/TraceableEventDispatcherTest.php index 8ccfabb1ca4..47dd5da1682 100644 --- a/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/EventDispatcher/Tests/Debug/TraceableEventDispatcherTest.php +++ b/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/EventDispatcher/Tests/Debug/TraceableEventDispatcherTest.php @@ -24,7 +24,7 @@ class TraceableEventDispatcherTest extends \PHPUnit_Framework_TestCase $dispatcher = new EventDispatcher(); $tdispatcher = new TraceableEventDispatcher($dispatcher, new Stopwatch()); - $tdispatcher->addListener('foo', $listener = function () { ; }); + $tdispatcher->addListener('foo', $listener = function () {; }); $listeners = $dispatcher->getListeners('foo'); $this->assertCount(1, $listeners); $this->assertSame($listener, $listeners[0]); @@ -38,7 +38,7 @@ class TraceableEventDispatcherTest extends \PHPUnit_Framework_TestCase $dispatcher = new EventDispatcher(); $tdispatcher = new TraceableEventDispatcher($dispatcher, new Stopwatch()); - $tdispatcher->addListener('foo', $listener = function () { ; }); + $tdispatcher->addListener('foo', $listener = function () {; }); $this->assertSame($dispatcher->getListeners('foo'), $tdispatcher->getListeners('foo')); } @@ -50,7 +50,7 @@ class TraceableEventDispatcherTest extends \PHPUnit_Framework_TestCase $this->assertFalse($dispatcher->hasListeners('foo')); $this->assertFalse($tdispatcher->hasListeners('foo')); - $tdispatcher->addListener('foo', $listener = function () { ; }); + $tdispatcher->addListener('foo', $listener = function () {; }); $this->assertTrue($dispatcher->hasListeners('foo')); $this->assertTrue($tdispatcher->hasListeners('foo')); } @@ -75,7 +75,7 @@ class TraceableEventDispatcherTest extends \PHPUnit_Framework_TestCase { $dispatcher = new EventDispatcher(); $tdispatcher = new TraceableEventDispatcher($dispatcher, new Stopwatch()); - $tdispatcher->addListener('foo', $listener = function () { ; }); + $tdispatcher->addListener('foo', $listener = function () {; }); $this->assertEquals(array(), $tdispatcher->getCalledListeners()); $this->assertEquals(array('foo.closure' => array('event' => 'foo', 'type' => 'Closure', 'pretty' => 'closure')), $tdispatcher->getNotCalledListeners()); @@ -92,8 +92,8 @@ class TraceableEventDispatcherTest extends \PHPUnit_Framework_TestCase $dispatcher = new EventDispatcher(); $tdispatcher = new TraceableEventDispatcher($dispatcher, new Stopwatch(), $logger); - $tdispatcher->addListener('foo', $listener1 = function () { ; }); - $tdispatcher->addListener('foo', $listener2 = function () { ; }); + $tdispatcher->addListener('foo', $listener1 = function () {; }); + $tdispatcher->addListener('foo', $listener2 = function () {; }); $logger->expects($this->at(0))->method('debug')->with("Notified event \"foo\" to listener \"closure\"."); $logger->expects($this->at(1))->method('debug')->with("Notified event \"foo\" to listener \"closure\"."); @@ -108,7 +108,7 @@ class TraceableEventDispatcherTest extends \PHPUnit_Framework_TestCase $dispatcher = new EventDispatcher(); $tdispatcher = new TraceableEventDispatcher($dispatcher, new Stopwatch(), $logger); $tdispatcher->addListener('foo', $listener1 = function (Event $event) { $event->stopPropagation(); }); - $tdispatcher->addListener('foo', $listener2 = function () { ; }); + $tdispatcher->addListener('foo', $listener2 = function () {; }); $logger->expects($this->at(0))->method('debug')->with("Notified event \"foo\" to listener \"closure\"."); $logger->expects($this->at(1))->method('debug')->with("Listener \"closure\" stopped propagation of the event \"foo\"."); diff --git a/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/EventDispatcher/Tests/DependencyInjection/RegisterListenersPassTest.php b/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/EventDispatcher/Tests/DependencyInjection/RegisterListenersPassTest.php index 5959db0d422..b291e1ee3c4 100644 --- a/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/EventDispatcher/Tests/DependencyInjection/RegisterListenersPassTest.php +++ b/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/EventDispatcher/Tests/DependencyInjection/RegisterListenersPassTest.php @@ -37,7 +37,10 @@ class RegisterListenersPassTest extends \PHPUnit_Framework_TestCase ->method('getClass') ->will($this->returnValue('stdClass')); - $builder = $this->getMock('Symfony\Component\DependencyInjection\ContainerBuilder'); + $builder = $this->getMock( + 'Symfony\Component\DependencyInjection\ContainerBuilder', + array('hasDefinition', 'findTaggedServiceIds', 'getDefinition') + ); $builder->expects($this->any()) ->method('hasDefinition') ->will($this->returnValue(true)); @@ -69,7 +72,10 @@ class RegisterListenersPassTest extends \PHPUnit_Framework_TestCase ->method('getClass') ->will($this->returnValue('Symfony\Component\EventDispatcher\Tests\DependencyInjection\SubscriberService')); - $builder = $this->getMock('Symfony\Component\DependencyInjection\ContainerBuilder'); + $builder = $this->getMock( + 'Symfony\Component\DependencyInjection\ContainerBuilder', + array('hasDefinition', 'findTaggedServiceIds', 'getDefinition', 'findDefinition') + ); $builder->expects($this->any()) ->method('hasDefinition') ->will($this->returnValue(true)); @@ -136,5 +142,7 @@ class RegisterListenersPassTest extends \PHPUnit_Framework_TestCase class SubscriberService implements \Symfony\Component\EventDispatcher\EventSubscriberInterface { - public static function getSubscribedEvents() {} + public static function getSubscribedEvents() + { + } } diff --git a/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/EventDispatcher/Tests/EventDispatcherTest.php b/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/EventDispatcher/Tests/EventDispatcherTest.php index efc0c29fab8..2bd0750b141 100644 --- a/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/EventDispatcher/Tests/EventDispatcherTest.php +++ b/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/EventDispatcher/Tests/EventDispatcherTest.php @@ -362,7 +362,7 @@ class TestEventSubscriberWithMultipleListeners implements EventSubscriberInterfa { return array('pre.foo' => array( array('preFoo1'), - array('preFoo2', 10) + array('preFoo2', 10), )); } } diff --git a/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/EventDispatcher/Tests/GenericEventTest.php b/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/EventDispatcher/Tests/GenericEventTest.php index 5dfda92f2af..1090bcb2960 100644 --- a/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/EventDispatcher/Tests/GenericEventTest.php +++ b/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/EventDispatcher/Tests/GenericEventTest.php @@ -18,7 +18,6 @@ use Symfony\Component\EventDispatcher\GenericEvent; */ class GenericEventTest extends \PHPUnit_Framework_TestCase { - /** * @var GenericEvent */ diff --git a/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/EventDispatcher/composer.json b/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/EventDispatcher/composer.json index 3715ece302f..75fd243d529 100644 --- a/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/EventDispatcher/composer.json +++ b/apps/files_external/3rdparty/aws-sdk-php/Symfony/Component/EventDispatcher/composer.json @@ -19,7 +19,7 @@ "php": ">=5.3.3" }, "require-dev": { - "symfony/dependency-injection": "~2.0", + "symfony/dependency-injection": "~2.0,<2.6.0", "symfony/config": "~2.0", "symfony/stopwatch": "~2.2", "psr/log": "~1.0" diff --git a/apps/files_external/3rdparty/google-api-php-client/NOTICE b/apps/files_external/3rdparty/google-api-php-client/NOTICE deleted file mode 100644 index 22d7cb59867..00000000000 --- a/apps/files_external/3rdparty/google-api-php-client/NOTICE +++ /dev/null @@ -1,4 +0,0 @@ -This product contains the following libraries: - -XRDS-Simple library from http://code.google.com/p/diso/ -Apache License 2.0 diff --git a/apps/files_external/3rdparty/google-api-php-client/README b/apps/files_external/3rdparty/google-api-php-client/README deleted file mode 100644 index 42c42c0d5c7..00000000000 --- a/apps/files_external/3rdparty/google-api-php-client/README +++ /dev/null @@ -1,40 +0,0 @@ -Google APIs Client Library for PHP -===================================== - -== Description -The Google API Client Library enables you to work with Google APIs such as Google+, Drive, Tasks, or Latitude on your server. - -Requirements: - PHP 5.2.x or higher [http://www.php.net/] - PHP Curl extension [http://www.php.net/manual/en/intro.curl.php] - PHP JSON extension [http://php.net/manual/en/book.json.php] - -Project page: - http://code.google.com/p/google-api-php-client - -OAuth 2 instructions: - http://code.google.com/p/google-api-php-client/wiki/OAuth2 - -Report a defect or feature request here: - http://code.google.com/p/google-api-php-client/issues/entry - -Subscribe to project updates in your feed reader: - http://code.google.com/feeds/p/google-api-php-client/updates/basic - -Supported sample applications: - http://code.google.com/p/google-api-php-client/wiki/Samples - -== Basic Example - <?php - require_once 'path/to/src/Google_Client.php'; - require_once 'path/to/src/contrib/apiBooksService.php'; - - $client = new Google_Client(); - $service = new Google_BooksService($client); - - $optParams = array('filter' => 'free-ebooks'); - $results = $service->volumes->listVolumes('Henry David Thoreau', $optParams); - - foreach ($results['items'] as $item) { - print($item['volumeInfo']['title'] . '<br>'); - } diff --git a/apps/files_external/3rdparty/google-api-php-client/README.md b/apps/files_external/3rdparty/google-api-php-client/README.md new file mode 100644 index 00000000000..e799f6725da --- /dev/null +++ b/apps/files_external/3rdparty/google-api-php-client/README.md @@ -0,0 +1,77 @@ +[](https://travis-ci.org/google/google-api-php-client) + +# Google APIs Client Library for PHP # + +## Description ## +The Google API Client Library enables you to work with Google APIs such as Google+, Drive, or YouTube on your server. + +## Beta ## +This library is in Beta. We're comfortable enough with the stability and features of the library that we want you to build real production applications on it. We will make an effort to support the public and protected surface of the library and maintain backwards compatibility in the future. While we are still in Beta, we reserve the right to make incompatible changes. If we do remove some functionality (typically because better functionality exists or if the feature proved infeasible), our intention is to deprecate and provide ample time for developers to update their code. + +## Requirements ## +* [PHP 5.2.1 or higher](http://www.php.net/) +* [PHP JSON extension](http://php.net/manual/en/book.json.php) + +*Note*: some features (service accounts and id token verification) require PHP 5.3.0 and above due to cryptographic algorithm requirements. + +## Developer Documentation ## +http://developers.google.com/api-client-library/php + +## Installation ## + +For the latest installation and setup instructions, see [the documentation](https://developers.google.com/api-client-library/php/start/installation). + +## Basic Example ## +See the examples/ directory for examples of the key client features. +```PHP +<?php + require_once 'google-api-php-client/autoload.php'; // or wherever autoload.php is located + $client = new Google_Client(); + $client->setApplicationName("Client_Library_Examples"); + $client->setDeveloperKey("YOUR_APP_KEY"); + $service = new Google_Service_Books($client); + $optParams = array('filter' => 'free-ebooks'); + $results = $service->volumes->listVolumes('Henry David Thoreau', $optParams); + + foreach ($results as $item) { + echo $item['volumeInfo']['title'], "<br /> \n"; + } +``` + +## Frequently Asked Questions ## + +### What do I do if something isn't working? ### + +For support with the library the best place to ask is via the google-api-php-client tag on StackOverflow: http://stackoverflow.com/questions/tagged/google-api-php-client + +If there is a specific bug with the library, please file a issue in the Github issues tracker, including a (minimal) example of the failing code and any specific errors retrieved. Feature requests can also be filed, as long as they are core library requests, and not-API specific: for those, refer to the documentation for the individual APIs for the best place to file requests. Please try to provide a clear statement of the problem that the feature would address. + +### How do I contribute? ### + +We accept contributions via Github Pull Requests, but all contributors need to be covered by the standard Google Contributor License Agreement. You can find links, and more instructions, in the documentation: https://developers.google.com/api-client-library/php/contribute + +### Why do you still support 5.2? ### + +When we started working on the 1.0.0 branch we knew there were several fundamental issues to fix with the 0.6 releases of the library. At that time we looked at the usage of the library, and other related projects, and determined that there was still a large and active base of PHP 5.2 installs. You can see this in statistics such as the PHP versions chart in the WordPress stats: http://wordpress.org/about/stats/. We will keep looking at the types of usage we see, and try to take advantage of newer PHP features where possible. + +### Why does Google_..._Service have weird names? ### + +The _Service classes are generally automatically generated from the API discovery documents: https://developers.google.com/discovery/. Sometimes new features are added to APIs with unusual names, which can cause some unexpected or non-standard style naming in the PHP classes. + +### How do I deal with non-JSON response types? ### + +Some services return XML or similar by default, rather than JSON, which is what the library supports. You can request a JSON response by adding an 'alt' argument to optional params that is normally the last argument to a method call: + +``` +$opt_params = array( + 'alt' => "json" +); +``` + +## Code Quality ## + +Copy the ruleset.xml in style/ into a new directory named GAPI/ in your +/usr/share/php/PHP/CodeSniffer/Standards (or appropriate equivalent directory), +and run code sniffs with: + + phpcs --standard=GAPI src/ diff --git a/apps/files_external/3rdparty/google-api-php-client/src/auth/Google_Auth.php b/apps/files_external/3rdparty/google-api-php-client/src/Google/Auth/Abstract.php index 010782d4a60..0832df3a408 100644 --- a/apps/files_external/3rdparty/google-api-php-client/src/auth/Google_Auth.php +++ b/apps/files_external/3rdparty/google-api-php-client/src/Google/Auth/Abstract.php @@ -14,23 +14,22 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -require_once "Google_AuthNone.php"; -require_once "Google_OAuth2.php"; +require_once "Google/Http/Request.php"; /** * Abstract class for the Authentication in the API client * @author Chris Chabot <chabotc@google.com> * */ -abstract class Google_Auth { - abstract public function authenticate($service); - abstract public function sign(Google_HttpRequest $request); - abstract public function createAuthUrl($scope); - - abstract public function getAccessToken(); - abstract public function setAccessToken($accessToken); - abstract public function setDeveloperKey($developerKey); - abstract public function refreshToken($refreshToken); - abstract public function revokeToken(); +abstract class Google_Auth_Abstract +{ + /** + * An utility function that first calls $this->auth->sign($request) and then + * executes makeRequest() on that signed request. Used for when a request + * should be authenticated + * @param Google_Http_Request $request + * @return Google_Http_Request $request + */ + abstract public function authenticatedRequest(Google_Http_Request $request); + abstract public function sign(Google_Http_Request $request); } diff --git a/apps/files_external/3rdparty/google-api-php-client/src/auth/Google_AssertionCredentials.php b/apps/files_external/3rdparty/google-api-php-client/src/Google/Auth/AssertionCredentials.php index d9b4394ba38..3db0a779df3 100644 --- a/apps/files_external/3rdparty/google-api-php-client/src/auth/Google_AssertionCredentials.php +++ b/apps/files_external/3rdparty/google-api-php-client/src/Google/Auth/AssertionCredentials.php @@ -15,12 +15,17 @@ * limitations under the License. */ +require_once "Google/Auth/OAuth2.php"; +require_once "Google/Signer/P12.php"; +require_once "Google/Utils.php"; + /** * Credentials object used for OAuth 2.0 Signed JWT assertion grants. * * @author Chirag Shah <chirags@google.com> */ -class Google_AssertionCredentials { +class Google_Auth_AssertionCredentials +{ const MAX_TOKEN_LIFETIME_SECS = 3600; public $serviceAccountName; @@ -34,6 +39,7 @@ class Google_AssertionCredentials { * @link http://tools.ietf.org/html/draft-ietf-oauth-json-web-token-06 */ public $prn; + private $useCache; /** * @param $serviceAccountName @@ -42,8 +48,9 @@ class Google_AssertionCredentials { * @param string $privateKeyPassword * @param string $assertionType * @param bool|string $sub The email address of the user for which the - * application is requesting delegated access. - * + * application is requesting delegated access. + * @param bool useCache Whether to generate a cache key and allow + * automatic caching of the generated token. */ public function __construct( $serviceAccountName, @@ -51,7 +58,9 @@ class Google_AssertionCredentials { $privateKey, $privateKeyPassword = 'notasecret', $assertionType = 'http://oauth.net/grant_type/jwt/1.0/bearer', - $sub = false) { + $sub = false, + $useCache = true + ) { $this->serviceAccountName = $serviceAccountName; $this->scopes = is_string($scopes) ? $scopes : implode(' ', $scopes); $this->privateKey = $privateKey; @@ -59,13 +68,32 @@ class Google_AssertionCredentials { $this->assertionType = $assertionType; $this->sub = $sub; $this->prn = $sub; + $this->useCache = $useCache; + } + + /** + * Generate a unique key to represent this credential. + * @return string + */ + public function getCacheKey() + { + if (!$this->useCache) { + return false; + } + $h = $this->sub; + $h .= $this->assertionType; + $h .= $this->privateKey; + $h .= $this->scopes; + $h .= $this->serviceAccountName; + return md5($h); } - public function generateAssertion() { + public function generateAssertion() + { $now = time(); $jwtParams = array( - 'aud' => Google_OAuth2::OAUTH2_TOKEN_URI, + 'aud' => Google_Auth_OAuth2::OAUTH2_TOKEN_URI, 'scope' => $this->scopes, 'iat' => $now, 'exp' => $now + self::MAX_TOKEN_LIFETIME_SECS, @@ -86,16 +114,22 @@ class Google_AssertionCredentials { * @param array $payload * @return string The signed JWT. */ - private function makeSignedJwt($payload) { + private function makeSignedJwt($payload) + { $header = array('typ' => 'JWT', 'alg' => 'RS256'); + $payload = json_encode($payload); + // Handle some overzealous escaping in PHP json that seemed to cause some errors + // with claimsets. + $payload = str_replace('\/', '/', $payload); + $segments = array( Google_Utils::urlSafeB64Encode(json_encode($header)), - Google_Utils::urlSafeB64Encode(json_encode($payload)) + Google_Utils::urlSafeB64Encode($payload) ); $signingInput = implode('.', $segments); - $signer = new Google_P12Signer($this->privateKey, $this->privateKeyPassword); + $signer = new Google_Signer_P12($this->privateKey, $this->privateKeyPassword); $signature = $signer->sign($signingInput); $segments[] = Google_Utils::urlSafeB64Encode($signature); diff --git a/apps/files_external/3rdparty/google-api-php-client/src/Google/Auth/Exception.php b/apps/files_external/3rdparty/google-api-php-client/src/Google/Auth/Exception.php new file mode 100644 index 00000000000..65067ee4436 --- /dev/null +++ b/apps/files_external/3rdparty/google-api-php-client/src/Google/Auth/Exception.php @@ -0,0 +1,22 @@ +<?php +/* + * Copyright 2013 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +require_once "Google/Exception.php"; + +class Google_Auth_Exception extends Google_Exception +{ +} diff --git a/apps/files_external/3rdparty/google-api-php-client/src/auth/Google_LoginTicket.php b/apps/files_external/3rdparty/google-api-php-client/src/Google/Auth/LoginTicket.php index c0ce614232b..bcf798ae5ff 100644 --- a/apps/files_external/3rdparty/google-api-php-client/src/auth/Google_LoginTicket.php +++ b/apps/files_external/3rdparty/google-api-php-client/src/Google/Auth/LoginTicket.php @@ -15,13 +15,16 @@ * limitations under the License. */ +require_once "Google/Auth/Exception.php"; + /** * Class to hold information about an authenticated login. * * @author Brian Eaton <beaton@google.com> */ -class Google_LoginTicket { - const USER_ATTR = "id"; +class Google_Auth_LoginTicket +{ + const USER_ATTR = "sub"; // Information from id token envelope. private $envelope; @@ -35,21 +38,23 @@ class Google_LoginTicket { * @param string $envelope Header from a verified authentication token. * @param string $payload Information from a verified authentication token. */ - public function __construct($envelope, $payload) { + public function __construct($envelope, $payload) + { $this->envelope = $envelope; $this->payload = $payload; } /** * Returns the numeric identifier for the user. - * @throws Google_AuthException + * @throws Google_Auth_Exception * @return */ - public function getUserId() { + public function getUserId() + { if (array_key_exists(self::USER_ATTR, $this->payload)) { return $this->payload[self::USER_ATTR]; } - throw new Google_AuthException("No user_id in token"); + throw new Google_Auth_Exception("No user_id in token"); } /** @@ -57,7 +62,8 @@ class Google_LoginTicket { * various information about the user session. * @return array */ - public function getAttributes() { + public function getAttributes() + { return array("envelope" => $this->envelope, "payload" => $this->payload); } } diff --git a/apps/files_external/3rdparty/google-api-php-client/src/Google/Auth/OAuth2.php b/apps/files_external/3rdparty/google-api-php-client/src/Google/Auth/OAuth2.php new file mode 100644 index 00000000000..5630d755e04 --- /dev/null +++ b/apps/files_external/3rdparty/google-api-php-client/src/Google/Auth/OAuth2.php @@ -0,0 +1,620 @@ +<?php +/* + * Copyright 2008 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +require_once "Google/Auth/Abstract.php"; +require_once "Google/Auth/AssertionCredentials.php"; +require_once "Google/Auth/Exception.php"; +require_once "Google/Auth/LoginTicket.php"; +require_once "Google/Client.php"; +require_once "Google/Http/Request.php"; +require_once "Google/Utils.php"; +require_once "Google/Verifier/Pem.php"; + +/** + * Authentication class that deals with the OAuth 2 web-server authentication flow + * + * @author Chris Chabot <chabotc@google.com> + * @author Chirag Shah <chirags@google.com> + * + */ +class Google_Auth_OAuth2 extends Google_Auth_Abstract +{ + const OAUTH2_REVOKE_URI = 'https://accounts.google.com/o/oauth2/revoke'; + const OAUTH2_TOKEN_URI = 'https://accounts.google.com/o/oauth2/token'; + const OAUTH2_AUTH_URL = 'https://accounts.google.com/o/oauth2/auth'; + const CLOCK_SKEW_SECS = 300; // five minutes in seconds + const AUTH_TOKEN_LIFETIME_SECS = 300; // five minutes in seconds + const MAX_TOKEN_LIFETIME_SECS = 86400; // one day in seconds + const OAUTH2_ISSUER = 'accounts.google.com'; + + /** @var Google_Auth_AssertionCredentials $assertionCredentials */ + private $assertionCredentials; + + /** + * @var string The state parameters for CSRF and other forgery protection. + */ + private $state; + + /** + * @var array The token bundle. + */ + private $token = array(); + + /** + * @var Google_Client the base client + */ + private $client; + + /** + * Instantiates the class, but does not initiate the login flow, leaving it + * to the discretion of the caller. + */ + public function __construct(Google_Client $client) + { + $this->client = $client; + } + + /** + * Perform an authenticated / signed apiHttpRequest. + * This function takes the apiHttpRequest, calls apiAuth->sign on it + * (which can modify the request in what ever way fits the auth mechanism) + * and then calls apiCurlIO::makeRequest on the signed request + * + * @param Google_Http_Request $request + * @return Google_Http_Request The resulting HTTP response including the + * responseHttpCode, responseHeaders and responseBody. + */ + public function authenticatedRequest(Google_Http_Request $request) + { + $request = $this->sign($request); + return $this->client->getIo()->makeRequest($request); + } + + /** + * @param string $code + * @throws Google_Auth_Exception + * @return string + */ + public function authenticate($code) + { + if (strlen($code) == 0) { + throw new Google_Auth_Exception("Invalid code"); + } + + // We got here from the redirect from a successful authorization grant, + // fetch the access token + $request = new Google_Http_Request( + self::OAUTH2_TOKEN_URI, + 'POST', + array(), + array( + 'code' => $code, + 'grant_type' => 'authorization_code', + 'redirect_uri' => $this->client->getClassConfig($this, 'redirect_uri'), + 'client_id' => $this->client->getClassConfig($this, 'client_id'), + 'client_secret' => $this->client->getClassConfig($this, 'client_secret') + ) + ); + $request->disableGzip(); + $response = $this->client->getIo()->makeRequest($request); + + if ($response->getResponseHttpCode() == 200) { + $this->setAccessToken($response->getResponseBody()); + $this->token['created'] = time(); + return $this->getAccessToken(); + } else { + $decodedResponse = json_decode($response->getResponseBody(), true); + if ($decodedResponse != null && $decodedResponse['error']) { + $decodedResponse = $decodedResponse['error']; + if (isset($decodedResponse['error_description'])) { + $decodedResponse .= ": " . $decodedResponse['error_description']; + } + } + throw new Google_Auth_Exception( + sprintf( + "Error fetching OAuth2 access token, message: '%s'", + $decodedResponse + ), + $response->getResponseHttpCode() + ); + } + } + + /** + * Create a URL to obtain user authorization. + * The authorization endpoint allows the user to first + * authenticate, and then grant/deny the access request. + * @param string $scope The scope is expressed as a list of space-delimited strings. + * @return string + */ + public function createAuthUrl($scope) + { + $params = array( + 'response_type' => 'code', + 'redirect_uri' => $this->client->getClassConfig($this, 'redirect_uri'), + 'client_id' => $this->client->getClassConfig($this, 'client_id'), + 'scope' => $scope, + 'access_type' => $this->client->getClassConfig($this, 'access_type'), + ); + + $params = $this->maybeAddParam($params, 'approval_prompt'); + $params = $this->maybeAddParam($params, 'login_hint'); + $params = $this->maybeAddParam($params, 'hd'); + $params = $this->maybeAddParam($params, 'openid.realm'); + $params = $this->maybeAddParam($params, 'prompt'); + $params = $this->maybeAddParam($params, 'include_granted_scopes'); + + // If the list of scopes contains plus.login, add request_visible_actions + // to auth URL. + $rva = $this->client->getClassConfig($this, 'request_visible_actions'); + if (strpos($scope, 'plus.login') && strlen($rva) > 0) { + $params['request_visible_actions'] = $rva; + } + + if (isset($this->state)) { + $params['state'] = $this->state; + } + + return self::OAUTH2_AUTH_URL . "?" . http_build_query($params, '', '&'); + } + + /** + * @param string $token + * @throws Google_Auth_Exception + */ + public function setAccessToken($token) + { + $token = json_decode($token, true); + if ($token == null) { + throw new Google_Auth_Exception('Could not json decode the token'); + } + if (! isset($token['access_token'])) { + throw new Google_Auth_Exception("Invalid token format"); + } + $this->token = $token; + } + + public function getAccessToken() + { + return json_encode($this->token); + } + + public function getRefreshToken() + { + if (array_key_exists('refresh_token', $this->token)) { + return $this->token['refresh_token']; + } else { + return null; + } + } + + public function setState($state) + { + $this->state = $state; + } + + public function setAssertionCredentials(Google_Auth_AssertionCredentials $creds) + { + $this->assertionCredentials = $creds; + } + + /** + * Include an accessToken in a given apiHttpRequest. + * @param Google_Http_Request $request + * @return Google_Http_Request + * @throws Google_Auth_Exception + */ + public function sign(Google_Http_Request $request) + { + // add the developer key to the request before signing it + if ($this->client->getClassConfig($this, 'developer_key')) { + $request->setQueryParam('key', $this->client->getClassConfig($this, 'developer_key')); + } + + // Cannot sign the request without an OAuth access token. + if (null == $this->token && null == $this->assertionCredentials) { + return $request; + } + + // Check if the token is set to expire in the next 30 seconds + // (or has already expired). + if ($this->isAccessTokenExpired()) { + if ($this->assertionCredentials) { + $this->refreshTokenWithAssertion(); + } else { + if (! array_key_exists('refresh_token', $this->token)) { + throw new Google_Auth_Exception( + "The OAuth 2.0 access token has expired," + ." and a refresh token is not available. Refresh tokens" + ." are not returned for responses that were auto-approved." + ); + } + $this->refreshToken($this->token['refresh_token']); + } + } + + // Add the OAuth2 header to the request + $request->setRequestHeaders( + array('Authorization' => 'Bearer ' . $this->token['access_token']) + ); + + return $request; + } + + /** + * Fetches a fresh access token with the given refresh token. + * @param string $refreshToken + * @return void + */ + public function refreshToken($refreshToken) + { + $this->refreshTokenRequest( + array( + 'client_id' => $this->client->getClassConfig($this, 'client_id'), + 'client_secret' => $this->client->getClassConfig($this, 'client_secret'), + 'refresh_token' => $refreshToken, + 'grant_type' => 'refresh_token' + ) + ); + } + + /** + * Fetches a fresh access token with a given assertion token. + * @param Google_Auth_AssertionCredentials $assertionCredentials optional. + * @return void + */ + public function refreshTokenWithAssertion($assertionCredentials = null) + { + if (!$assertionCredentials) { + $assertionCredentials = $this->assertionCredentials; + } + + $cacheKey = $assertionCredentials->getCacheKey(); + + if ($cacheKey) { + // We can check whether we have a token available in the + // cache. If it is expired, we can retrieve a new one from + // the assertion. + $token = $this->client->getCache()->get($cacheKey); + if ($token) { + $this->setAccessToken($token); + } + if (!$this->isAccessTokenExpired()) { + return; + } + } + + $this->refreshTokenRequest( + array( + 'grant_type' => 'assertion', + 'assertion_type' => $assertionCredentials->assertionType, + 'assertion' => $assertionCredentials->generateAssertion(), + ) + ); + + if ($cacheKey) { + // Attempt to cache the token. + $this->client->getCache()->set( + $cacheKey, + $this->getAccessToken() + ); + } + } + + private function refreshTokenRequest($params) + { + $http = new Google_Http_Request( + self::OAUTH2_TOKEN_URI, + 'POST', + array(), + $params + ); + $http->disableGzip(); + $request = $this->client->getIo()->makeRequest($http); + + $code = $request->getResponseHttpCode(); + $body = $request->getResponseBody(); + if (200 == $code) { + $token = json_decode($body, true); + if ($token == null) { + throw new Google_Auth_Exception("Could not json decode the access token"); + } + + if (! isset($token['access_token']) || ! isset($token['expires_in'])) { + throw new Google_Auth_Exception("Invalid token format"); + } + + if (isset($token['id_token'])) { + $this->token['id_token'] = $token['id_token']; + } + $this->token['access_token'] = $token['access_token']; + $this->token['expires_in'] = $token['expires_in']; + $this->token['created'] = time(); + } else { + throw new Google_Auth_Exception("Error refreshing the OAuth2 token, message: '$body'", $code); + } + } + + /** + * Revoke an OAuth2 access token or refresh token. This method will revoke the current access + * token, if a token isn't provided. + * @throws Google_Auth_Exception + * @param string|null $token The token (access token or a refresh token) that should be revoked. + * @return boolean Returns True if the revocation was successful, otherwise False. + */ + public function revokeToken($token = null) + { + if (!$token) { + if (!$this->token) { + // Not initialized, no token to actually revoke + return false; + } elseif (array_key_exists('refresh_token', $this->token)) { + $token = $this->token['refresh_token']; + } else { + $token = $this->token['access_token']; + } + } + $request = new Google_Http_Request( + self::OAUTH2_REVOKE_URI, + 'POST', + array(), + "token=$token" + ); + $request->disableGzip(); + $response = $this->client->getIo()->makeRequest($request); + $code = $response->getResponseHttpCode(); + if ($code == 200) { + $this->token = null; + return true; + } + + return false; + } + + /** + * Returns if the access_token is expired. + * @return bool Returns True if the access_token is expired. + */ + public function isAccessTokenExpired() + { + if (!$this->token || !isset($this->token['created'])) { + return true; + } + + // If the token is set to expire in the next 30 seconds. + $expired = ($this->token['created'] + + ($this->token['expires_in'] - 30)) < time(); + + return $expired; + } + + // Gets federated sign-on certificates to use for verifying identity tokens. + // Returns certs as array structure, where keys are key ids, and values + // are PEM encoded certificates. + private function getFederatedSignOnCerts() + { + return $this->retrieveCertsFromLocation( + $this->client->getClassConfig($this, 'federated_signon_certs_url') + ); + } + + /** + * Retrieve and cache a certificates file. + * @param $url location + * @return array certificates + */ + public function retrieveCertsFromLocation($url) + { + // If we're retrieving a local file, just grab it. + if ("http" != substr($url, 0, 4)) { + $file = file_get_contents($url); + if ($file) { + return json_decode($file, true); + } else { + throw new Google_Auth_Exception( + "Failed to retrieve verification certificates: '" . + $url . "'." + ); + } + } + + // This relies on makeRequest caching certificate responses. + $request = $this->client->getIo()->makeRequest( + new Google_Http_Request( + $url + ) + ); + if ($request->getResponseHttpCode() == 200) { + $certs = json_decode($request->getResponseBody(), true); + if ($certs) { + return $certs; + } + } + throw new Google_Auth_Exception( + "Failed to retrieve verification certificates: '" . + $request->getResponseBody() . "'.", + $request->getResponseHttpCode() + ); + } + + /** + * Verifies an id token and returns the authenticated apiLoginTicket. + * Throws an exception if the id token is not valid. + * The audience parameter can be used to control which id tokens are + * accepted. By default, the id token must have been issued to this OAuth2 client. + * + * @param $id_token + * @param $audience + * @return Google_Auth_LoginTicket + */ + public function verifyIdToken($id_token = null, $audience = null) + { + if (!$id_token) { + $id_token = $this->token['id_token']; + } + $certs = $this->getFederatedSignonCerts(); + if (!$audience) { + $audience = $this->client->getClassConfig($this, 'client_id'); + } + + return $this->verifySignedJwtWithCerts($id_token, $certs, $audience, self::OAUTH2_ISSUER); + } + + /** + * Verifies the id token, returns the verified token contents. + * + * @param $jwt the token + * @param $certs array of certificates + * @param $required_audience the expected consumer of the token + * @param [$issuer] the expected issues, defaults to Google + * @param [$max_expiry] the max lifetime of a token, defaults to MAX_TOKEN_LIFETIME_SECS + * @return token information if valid, false if not + */ + public function verifySignedJwtWithCerts( + $jwt, + $certs, + $required_audience, + $issuer = null, + $max_expiry = null + ) { + if (!$max_expiry) { + // Set the maximum time we will accept a token for. + $max_expiry = self::MAX_TOKEN_LIFETIME_SECS; + } + + $segments = explode(".", $jwt); + if (count($segments) != 3) { + throw new Google_Auth_Exception("Wrong number of segments in token: $jwt"); + } + $signed = $segments[0] . "." . $segments[1]; + $signature = Google_Utils::urlSafeB64Decode($segments[2]); + + // Parse envelope. + $envelope = json_decode(Google_Utils::urlSafeB64Decode($segments[0]), true); + if (!$envelope) { + throw new Google_Auth_Exception("Can't parse token envelope: " . $segments[0]); + } + + // Parse token + $json_body = Google_Utils::urlSafeB64Decode($segments[1]); + $payload = json_decode($json_body, true); + if (!$payload) { + throw new Google_Auth_Exception("Can't parse token payload: " . $segments[1]); + } + + // Check signature + $verified = false; + foreach ($certs as $keyName => $pem) { + $public_key = new Google_Verifier_Pem($pem); + if ($public_key->verify($signed, $signature)) { + $verified = true; + break; + } + } + + if (!$verified) { + throw new Google_Auth_Exception("Invalid token signature: $jwt"); + } + + // Check issued-at timestamp + $iat = 0; + if (array_key_exists("iat", $payload)) { + $iat = $payload["iat"]; + } + if (!$iat) { + throw new Google_Auth_Exception("No issue time in token: $json_body"); + } + $earliest = $iat - self::CLOCK_SKEW_SECS; + + // Check expiration timestamp + $now = time(); + $exp = 0; + if (array_key_exists("exp", $payload)) { + $exp = $payload["exp"]; + } + if (!$exp) { + throw new Google_Auth_Exception("No expiration time in token: $json_body"); + } + if ($exp >= $now + $max_expiry) { + throw new Google_Auth_Exception( + sprintf("Expiration time too far in future: %s", $json_body) + ); + } + + $latest = $exp + self::CLOCK_SKEW_SECS; + if ($now < $earliest) { + throw new Google_Auth_Exception( + sprintf( + "Token used too early, %s < %s: %s", + $now, + $earliest, + $json_body + ) + ); + } + if ($now > $latest) { + throw new Google_Auth_Exception( + sprintf( + "Token used too late, %s > %s: %s", + $now, + $latest, + $json_body + ) + ); + } + + $iss = $payload['iss']; + if ($issuer && $iss != $issuer) { + throw new Google_Auth_Exception( + sprintf( + "Invalid issuer, %s != %s: %s", + $iss, + $issuer, + $json_body + ) + ); + } + + // Check audience + $aud = $payload["aud"]; + if ($aud != $required_audience) { + throw new Google_Auth_Exception( + sprintf( + "Wrong recipient, %s != %s:", + $aud, + $required_audience, + $json_body + ) + ); + } + + // All good. + return new Google_Auth_LoginTicket($envelope, $payload); + } + + /** + * Add a parameter to the auth params if not empty string. + */ + private function maybeAddParam($params, $name) + { + $param = $this->client->getClassConfig($this, $name); + if ($param != '') { + $params[$name] = $param; + } + return $params; + } +} diff --git a/apps/files_external/3rdparty/google-api-php-client/src/Google/Auth/Simple.php b/apps/files_external/3rdparty/google-api-php-client/src/Google/Auth/Simple.php new file mode 100644 index 00000000000..e83900fc26f --- /dev/null +++ b/apps/files_external/3rdparty/google-api-php-client/src/Google/Auth/Simple.php @@ -0,0 +1,62 @@ +<?php +/* + * Copyright 2010 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +require_once "Google/Auth/Abstract.php"; +require_once "Google/Http/Request.php"; + +/** + * Simple API access implementation. Can either be used to make requests + * completely unauthenticated, or by using a Simple API Access developer + * key. + * @author Chris Chabot <chabotc@google.com> + * @author Chirag Shah <chirags@google.com> + */ +class Google_Auth_Simple extends Google_Auth_Abstract +{ + private $key = null; + private $client; + + public function __construct(Google_Client $client, $config = null) + { + $this->client = $client; + } + + /** + * Perform an authenticated / signed apiHttpRequest. + * This function takes the apiHttpRequest, calls apiAuth->sign on it + * (which can modify the request in what ever way fits the auth mechanism) + * and then calls apiCurlIO::makeRequest on the signed request + * + * @param Google_Http_Request $request + * @return Google_Http_Request The resulting HTTP response including the + * responseHttpCode, responseHeaders and responseBody. + */ + public function authenticatedRequest(Google_Http_Request $request) + { + $request = $this->sign($request); + return $this->io->makeRequest($request); + } + + public function sign(Google_Http_Request $request) + { + $key = $this->client->getClassConfig($this, 'developer_key'); + if ($key) { + $request->setQueryParam('key', $key); + } + return $request; + } +} diff --git a/apps/files_external/3rdparty/google-api-php-client/src/cache/Google_Cache.php b/apps/files_external/3rdparty/google-api-php-client/src/Google/Cache/Abstract.php index 809c55e2b15..ff19f36ac46 100644 --- a/apps/files_external/3rdparty/google-api-php-client/src/cache/Google_Cache.php +++ b/apps/files_external/3rdparty/google-api-php-client/src/Google/Cache/Abstract.php @@ -15,15 +15,15 @@ * limitations under the License. */ -require_once "Google_FileCache.php"; -require_once "Google_MemcacheCache.php"; - /** * Abstract storage class * * @author Chris Chabot <chabotc@google.com> */ -abstract class Google_Cache { +abstract class Google_Cache_Abstract +{ + + abstract public function __construct(Google_Client $client); /** * Retrieves the data for the given key, or false if they @@ -33,7 +33,7 @@ abstract class Google_Cache { * @param boolean|int $expiration Expiration time in seconds * */ - abstract function get($key, $expiration = false); + abstract public function get($key, $expiration = false); /** * Store the key => $value set. The $value is serialized @@ -42,14 +42,12 @@ abstract class Google_Cache { * @param string $key Key of the data * @param string $value data */ - abstract function set($key, $value); + abstract public function set($key, $value); /** * Removes the key/data pair for the given $key * * @param String $key */ - abstract function delete($key); + abstract public function delete($key); } - - diff --git a/apps/files_external/3rdparty/google-api-php-client/src/Google/Cache/Apc.php b/apps/files_external/3rdparty/google-api-php-client/src/Google/Cache/Apc.php new file mode 100644 index 00000000000..051b537a4e1 --- /dev/null +++ b/apps/files_external/3rdparty/google-api-php-client/src/Google/Cache/Apc.php @@ -0,0 +1,73 @@ +<?php +/* + * Copyright 2010 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +require_once "Google/Cache/Abstract.php"; +require_once "Google/Cache/Exception.php"; + +/** + * A persistent storage class based on the APC cache, which is not + * really very persistent, as soon as you restart your web server + * the storage will be wiped, however for debugging and/or speed + * it can be useful, and cache is a lot cheaper then storage. + * + * @author Chris Chabot <chabotc@google.com> + */ +class Google_Cache_Apc extends Google_Cache_Abstract +{ + public function __construct(Google_Client $client) + { + if (! function_exists('apc_add') ) { + throw new Google_Cache_Exception("Apc functions not available"); + } + } + + /** + * @inheritDoc + */ + public function get($key, $expiration = false) + { + $ret = apc_fetch($key); + if ($ret === false) { + return false; + } + if (is_numeric($expiration) && (time() - $ret['time'] > $expiration)) { + $this->delete($key); + return false; + } + return $ret['data']; + } + + /** + * @inheritDoc + */ + public function set($key, $value) + { + $rc = apc_store($key, array('time' => time(), 'data' => $value)); + if ($rc == false) { + throw new Google_Cache_Exception("Couldn't store data"); + } + } + + /** + * @inheritDoc + * @param String $key + */ + public function delete($key) + { + apc_delete($key); + } +} diff --git a/apps/files_external/3rdparty/google-api-php-client/src/Google/Cache/Exception.php b/apps/files_external/3rdparty/google-api-php-client/src/Google/Cache/Exception.php new file mode 100644 index 00000000000..23b624608e8 --- /dev/null +++ b/apps/files_external/3rdparty/google-api-php-client/src/Google/Cache/Exception.php @@ -0,0 +1,21 @@ +<?php +/* + * Copyright 2013 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +require_once "Google/Exception.php"; + +class Google_Cache_Exception extends Google_Exception +{ +} diff --git a/apps/files_external/3rdparty/google-api-php-client/src/Google/Cache/File.php b/apps/files_external/3rdparty/google-api-php-client/src/Google/Cache/File.php new file mode 100644 index 00000000000..8d0d62fe88c --- /dev/null +++ b/apps/files_external/3rdparty/google-api-php-client/src/Google/Cache/File.php @@ -0,0 +1,145 @@ +<?php +/* + * Copyright 2008 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +require_once "Google/Cache/Abstract.php"; +require_once "Google/Cache/Exception.php"; + +/* + * This class implements a basic on disk storage. While that does + * work quite well it's not the most elegant and scalable solution. + * It will also get you into a heap of trouble when you try to run + * this in a clustered environment. + * + * @author Chris Chabot <chabotc@google.com> + */ +class Google_Cache_File extends Google_Cache_Abstract +{ + const MAX_LOCK_RETRIES = 10; + private $path; + private $fh; + + public function __construct(Google_Client $client) + { + $this->path = $client->getClassConfig($this, 'directory'); + } + + public function get($key, $expiration = false) + { + $storageFile = $this->getCacheFile($key); + $data = false; + + if (!file_exists($storageFile)) { + return false; + } + + if ($expiration) { + $mtime = filemtime($storageFile); + if ((time() - $mtime) >= $expiration) { + $this->delete($key); + return false; + } + } + + if ($this->acquireReadLock($storageFile)) { + $data = fread($this->fh, filesize($storageFile)); + $data = unserialize($data); + $this->unlock($storageFile); + } + + return $data; + } + + public function set($key, $value) + { + $storageFile = $this->getWriteableCacheFile($key); + if ($this->acquireWriteLock($storageFile)) { + // We serialize the whole request object, since we don't only want the + // responseContent but also the postBody used, headers, size, etc. + $data = serialize($value); + $result = fwrite($this->fh, $data); + $this->unlock($storageFile); + } + } + + public function delete($key) + { + $file = $this->getCacheFile($key); + if (file_exists($file) && !unlink($file)) { + throw new Google_Cache_Exception("Cache file could not be deleted"); + } + } + + private function getWriteableCacheFile($file) + { + return $this->getCacheFile($file, true); + } + + private function getCacheFile($file, $forWrite = false) + { + return $this->getCacheDir($file, $forWrite) . '/' . md5($file); + } + + private function getCacheDir($file, $forWrite) + { + // use the first 2 characters of the hash as a directory prefix + // this should prevent slowdowns due to huge directory listings + // and thus give some basic amount of scalability + $storageDir = $this->path . '/' . substr(md5($file), 0, 2); + if ($forWrite && ! is_dir($storageDir)) { + if (! mkdir($storageDir, 0755, true)) { + throw new Google_Cache_Exception("Could not create storage directory: $storageDir"); + } + } + return $storageDir; + } + + private function acquireReadLock($storageFile) + { + return $this->acquireLock(LOCK_SH, $storageFile); + } + + private function acquireWriteLock($storageFile) + { + $rc = $this->acquireLock(LOCK_EX, $storageFile); + if (!$rc) { + $this->delete($storageFile); + } + return $rc; + } + + private function acquireLock($type, $storageFile) + { + $mode = $type == LOCK_EX ? "w" : "r"; + $this->fh = fopen($storageFile, $mode); + $count = 0; + while (!flock($this->fh, $type | LOCK_NB)) { + // Sleep for 10ms. + usleep(10000); + if (++$count < self::MAX_LOCK_RETRIES) { + return false; + } + } + return true; + } + + public function unlock($storageFile) + { + if ($this->fh) { + flock($this->fh, LOCK_UN); + } + } +} diff --git a/apps/files_external/3rdparty/google-api-php-client/src/Google/Cache/Memcache.php b/apps/files_external/3rdparty/google-api-php-client/src/Google/Cache/Memcache.php new file mode 100644 index 00000000000..1104afb8aeb --- /dev/null +++ b/apps/files_external/3rdparty/google-api-php-client/src/Google/Cache/Memcache.php @@ -0,0 +1,137 @@ +<?php +/* + * Copyright 2008 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +require_once "Google/Cache/Abstract.php"; +require_once "Google/Cache/Exception.php"; + +/** + * A persistent storage class based on the memcache, which is not + * really very persistent, as soon as you restart your memcache daemon + * the storage will be wiped. + * + * Will use either the memcache or memcached extensions, preferring + * memcached. + * + * @author Chris Chabot <chabotc@google.com> + */ +class Google_Cache_Memcache extends Google_Cache_Abstract +{ + private $connection = false; + private $mc = false; + private $host; + private $port; + + public function __construct(Google_Client $client) + { + if (!function_exists('memcache_connect') && !class_exists("Memcached")) { + throw new Google_Cache_Exception("Memcache functions not available"); + } + if ($client->isAppEngine()) { + // No credentials needed for GAE. + $this->mc = new Memcached(); + $this->connection = true; + } else { + $this->host = $client->getClassConfig($this, 'host'); + $this->port = $client->getClassConfig($this, 'port'); + if (empty($this->host) || (empty($this->port) && (string) $this->port != "0")) { + throw new Google_Cache_Exception("You need to supply a valid memcache host and port"); + } + } + } + + /** + * @inheritDoc + */ + public function get($key, $expiration = false) + { + $this->connect(); + $ret = false; + if ($this->mc) { + $ret = $this->mc->get($key); + } else { + $ret = memcache_get($this->connection, $key); + } + if ($ret === false) { + return false; + } + if (is_numeric($expiration) && (time() - $ret['time'] > $expiration)) { + $this->delete($key); + return false; + } + return $ret['data']; + } + + /** + * @inheritDoc + * @param string $key + * @param string $value + * @throws Google_Cache_Exception + */ + public function set($key, $value) + { + $this->connect(); + // we store it with the cache_time default expiration so objects will at + // least get cleaned eventually. + $data = array('time' => time(), 'data' => $value); + $rc = false; + if ($this->mc) { + $rc = $this->mc->set($key, $data); + } else { + $rc = memcache_set($this->connection, $key, $data, false); + } + if ($rc == false) { + throw new Google_Cache_Exception("Couldn't store data in cache"); + } + } + + /** + * @inheritDoc + * @param String $key + */ + public function delete($key) + { + $this->connect(); + if ($this->mc) { + $this->mc->delete($key, 0); + } else { + memcache_delete($this->connection, $key, 0); + } + } + + /** + * Lazy initialiser for memcache connection. Uses pconnect for to take + * advantage of the persistence pool where possible. + */ + private function connect() + { + if ($this->connection) { + return; + } + + if (class_exists("Memcached")) { + $this->mc = new Memcached(); + $this->mc->addServer($this->host, $this->port); + $this->connection = true; + } else { + $this->connection = memcache_pconnect($this->host, $this->port); + } + + if (! $this->connection) { + throw new Google_Cache_Exception("Couldn't connect to memcache server"); + } + } +} diff --git a/apps/files_external/3rdparty/google-api-php-client/src/Google/Client.php b/apps/files_external/3rdparty/google-api-php-client/src/Google/Client.php new file mode 100644 index 00000000000..e15b4f4ea3c --- /dev/null +++ b/apps/files_external/3rdparty/google-api-php-client/src/Google/Client.php @@ -0,0 +1,665 @@ +<?php +/* + * Copyright 2010 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +require_once 'Google/Auth/AssertionCredentials.php'; +require_once 'Google/Cache/File.php'; +require_once 'Google/Cache/Memcache.php'; +require_once 'Google/Config.php'; +require_once 'Google/Collection.php'; +require_once 'Google/Exception.php'; +require_once 'Google/IO/Curl.php'; +require_once 'Google/IO/Stream.php'; +require_once 'Google/Model.php'; +require_once 'Google/Service.php'; +require_once 'Google/Service/Resource.php'; + +/** + * The Google API Client + * http://code.google.com/p/google-api-php-client/ + * + * @author Chris Chabot <chabotc@google.com> + * @author Chirag Shah <chirags@google.com> + */ +class Google_Client +{ + const LIBVER = "1.0.6-beta"; + const USER_AGENT_SUFFIX = "google-api-php-client/"; + /** + * @var Google_Auth_Abstract $auth + */ + private $auth; + + /** + * @var Google_IO_Abstract $io + */ + private $io; + + /** + * @var Google_Cache_Abstract $cache + */ + private $cache; + + /** + * @var Google_Config $config + */ + private $config; + + /** + * @var boolean $deferExecution + */ + private $deferExecution = false; + + /** @var array $scopes */ + // Scopes requested by the client + protected $requestedScopes = array(); + + // definitions of services that are discovered. + protected $services = array(); + + // Used to track authenticated state, can't discover services after doing authenticate() + private $authenticated = false; + + /** + * Construct the Google Client. + * + * @param $config Google_Config or string for the ini file to load + */ + public function __construct($config = null) + { + if (is_string($config) && strlen($config)) { + $config = new Google_Config($config); + } else if ( !($config instanceof Google_Config)) { + $config = new Google_Config(); + + if ($this->isAppEngine()) { + // Automatically use Memcache if we're in AppEngine. + $config->setCacheClass('Google_Cache_Memcache'); + } + + if (version_compare(phpversion(), "5.3.4", "<=") || $this->isAppEngine()) { + // Automatically disable compress.zlib, as currently unsupported. + $config->setClassConfig('Google_Http_Request', 'disable_gzip', true); + } + } + + if ($config->getIoClass() == Google_Config::USE_AUTO_IO_SELECTION) { + if (function_exists('curl_version') && function_exists('curl_exec')) { + $config->setIoClass("Google_IO_Curl"); + } else { + $config->setIoClass("Google_IO_Stream"); + } + } + + $this->config = $config; + } + + /** + * Get a string containing the version of the library. + * + * @return string + */ + public function getLibraryVersion() + { + return self::LIBVER; + } + + /** + * Attempt to exchange a code for an valid authentication token. + * Helper wrapped around the OAuth 2.0 implementation. + * + * @param $code string code from accounts.google.com + * @return string token + */ + public function authenticate($code) + { + $this->authenticated = true; + return $this->getAuth()->authenticate($code); + } + + /** + * Set the auth config from the JSON string provided. + * This structure should match the file downloaded from + * the "Download JSON" button on in the Google Developer + * Console. + * @param string $json the configuration json + */ + public function setAuthConfig($json) + { + $data = json_decode($json); + $key = isset($data->installed) ? 'installed' : 'web'; + if (!isset($data->$key)) { + throw new Google_Exception("Invalid client secret JSON file."); + } + $this->setClientId($data->$key->client_id); + $this->setClientSecret($data->$key->client_secret); + if (isset($data->$key->redirect_uris)) { + $this->setRedirectUri($data->$key->redirect_uris[0]); + } + } + + /** + * Set the auth config from the JSON file in the path + * provided. This should match the file downloaded from + * the "Download JSON" button on in the Google Developer + * Console. + * @param string $file the file location of the client json + */ + public function setAuthConfigFile($file) + { + $this->setAuthConfig(file_get_contents($file)); + } + + /** + * @return array + * @visible For Testing + */ + public function prepareScopes() + { + if (empty($this->requestedScopes)) { + throw new Google_Auth_Exception("No scopes specified"); + } + $scopes = implode(' ', $this->requestedScopes); + return $scopes; + } + + /** + * Set the OAuth 2.0 access token using the string that resulted from calling createAuthUrl() + * or Google_Client#getAccessToken(). + * @param string $accessToken JSON encoded string containing in the following format: + * {"access_token":"TOKEN", "refresh_token":"TOKEN", "token_type":"Bearer", + * "expires_in":3600, "id_token":"TOKEN", "created":1320790426} + */ + public function setAccessToken($accessToken) + { + if ($accessToken == 'null') { + $accessToken = null; + } + $this->getAuth()->setAccessToken($accessToken); + } + + + + /** + * Set the authenticator object + * @param Google_Auth_Abstract $auth + */ + public function setAuth(Google_Auth_Abstract $auth) + { + $this->config->setAuthClass(get_class($auth)); + $this->auth = $auth; + } + + /** + * Set the IO object + * @param Google_Io_Abstract $auth + */ + public function setIo(Google_Io_Abstract $io) + { + $this->config->setIoClass(get_class($io)); + $this->io = $io; + } + + /** + * Set the Cache object + * @param Google_Cache_Abstract $auth + */ + public function setCache(Google_Cache_Abstract $cache) + { + $this->config->setCacheClass(get_class($cache)); + $this->cache = $cache; + } + + /** + * Construct the OAuth 2.0 authorization request URI. + * @return string + */ + public function createAuthUrl() + { + $scopes = $this->prepareScopes(); + return $this->getAuth()->createAuthUrl($scopes); + } + + /** + * Get the OAuth 2.0 access token. + * @return string $accessToken JSON encoded string in the following format: + * {"access_token":"TOKEN", "refresh_token":"TOKEN", "token_type":"Bearer", + * "expires_in":3600,"id_token":"TOKEN", "created":1320790426} + */ + public function getAccessToken() + { + $token = $this->getAuth()->getAccessToken(); + // The response is json encoded, so could be the string null. + // It is arguable whether this check should be here or lower + // in the library. + return (null == $token || 'null' == $token || '[]' == $token) ? null : $token; + } + + /** + * Get the OAuth 2.0 refresh token. + * @return string $refreshToken refresh token or null if not available + */ + public function getRefreshToken() + { + return $this->getAuth()->getRefreshToken(); + } + + /** + * Returns if the access_token is expired. + * @return bool Returns True if the access_token is expired. + */ + public function isAccessTokenExpired() + { + return $this->getAuth()->isAccessTokenExpired(); + } + + /** + * Set OAuth 2.0 "state" parameter to achieve per-request customization. + * @see http://tools.ietf.org/html/draft-ietf-oauth-v2-22#section-3.1.2.2 + * @param string $state + */ + public function setState($state) + { + $this->getAuth()->setState($state); + } + + /** + * @param string $accessType Possible values for access_type include: + * {@code "offline"} to request offline access from the user. + * {@code "online"} to request online access from the user. + */ + public function setAccessType($accessType) + { + $this->config->setAccessType($accessType); + } + + /** + * @param string $approvalPrompt Possible values for approval_prompt include: + * {@code "force"} to force the approval UI to appear. (This is the default value) + * {@code "auto"} to request auto-approval when possible. + */ + public function setApprovalPrompt($approvalPrompt) + { + $this->config->setApprovalPrompt($approvalPrompt); + } + + /** + * Set the login hint, email address or sub id. + * @param string $loginHint + */ + public function setLoginHint($loginHint) + { + $this->config->setLoginHint($loginHint); + } + + /** + * Set the application name, this is included in the User-Agent HTTP header. + * @param string $applicationName + */ + public function setApplicationName($applicationName) + { + $this->config->setApplicationName($applicationName); + } + + /** + * Set the OAuth 2.0 Client ID. + * @param string $clientId + */ + public function setClientId($clientId) + { + $this->config->setClientId($clientId); + } + + /** + * Set the OAuth 2.0 Client Secret. + * @param string $clientSecret + */ + public function setClientSecret($clientSecret) + { + $this->config->setClientSecret($clientSecret); + } + + /** + * Set the OAuth 2.0 Redirect URI. + * @param string $redirectUri + */ + public function setRedirectUri($redirectUri) + { + $this->config->setRedirectUri($redirectUri); + } + + /** + * If 'plus.login' is included in the list of requested scopes, you can use + * this method to define types of app activities that your app will write. + * You can find a list of available types here: + * @link https://developers.google.com/+/api/moment-types + * + * @param array $requestVisibleActions Array of app activity types + */ + public function setRequestVisibleActions($requestVisibleActions) + { + if (is_array($requestVisibleActions)) { + $requestVisibleActions = join(" ", $requestVisibleActions); + } + $this->config->setRequestVisibleActions($requestVisibleActions); + } + + /** + * Set the developer key to use, these are obtained through the API Console. + * @see http://code.google.com/apis/console-help/#generatingdevkeys + * @param string $developerKey + */ + public function setDeveloperKey($developerKey) + { + $this->config->setDeveloperKey($developerKey); + } + + /** + * Set the hd (hosted domain) parameter streamlines the login process for + * Google Apps hosted accounts. By including the domain of the user, you + * restrict sign-in to accounts at that domain. + * @param $hd string - the domain to use. + */ + public function setHostedDomain($hd) + { + $this->config->setHostedDomain($hd); + } + + /** + * Set the prompt hint. Valid values are none, consent and select_account. + * If no value is specified and the user has not previously authorized + * access, then the user is shown a consent screen. + * @param $prompt string + */ + public function setPrompt($prompt) + { + $this->config->setPrompt($prompt); + } + + /** + * openid.realm is a parameter from the OpenID 2.0 protocol, not from OAuth + * 2.0. It is used in OpenID 2.0 requests to signify the URL-space for which + * an authentication request is valid. + * @param $realm string - the URL-space to use. + */ + public function setOpenidRealm($realm) + { + $this->config->setOpenidRealm($realm); + } + + /** + * If this is provided with the value true, and the authorization request is + * granted, the authorization will include any previous authorizations + * granted to this user/application combination for other scopes. + * @param $include boolean - the URL-space to use. + */ + public function setIncludeGrantedScopes($include) + { + $this->config->setIncludeGrantedScopes($include); + } + + /** + * Fetches a fresh OAuth 2.0 access token with the given refresh token. + * @param string $refreshToken + * @return void + */ + public function refreshToken($refreshToken) + { + return $this->getAuth()->refreshToken($refreshToken); + } + + /** + * Revoke an OAuth2 access token or refresh token. This method will revoke the current access + * token, if a token isn't provided. + * @throws Google_Auth_Exception + * @param string|null $token The token (access token or a refresh token) that should be revoked. + * @return boolean Returns True if the revocation was successful, otherwise False. + */ + public function revokeToken($token = null) + { + return $this->getAuth()->revokeToken($token); + } + + /** + * Verify an id_token. This method will verify the current id_token, if one + * isn't provided. + * @throws Google_Auth_Exception + * @param string|null $token The token (id_token) that should be verified. + * @return Google_Auth_LoginTicket Returns an apiLoginTicket if the verification was + * successful. + */ + public function verifyIdToken($token = null) + { + return $this->getAuth()->verifyIdToken($token); + } + + /** + * Verify a JWT that was signed with your own certificates. + * + * @param $jwt the token + * @param $certs array of certificates + * @param $required_audience the expected consumer of the token + * @param [$issuer] the expected issues, defaults to Google + * @param [$max_expiry] the max lifetime of a token, defaults to MAX_TOKEN_LIFETIME_SECS + * @return token information if valid, false if not + */ + public function verifySignedJwt($id_token, $cert_location, $audience, $issuer, $max_expiry = null) + { + $auth = new Google_Auth_OAuth2($this); + $certs = $auth->retrieveCertsFromLocation($cert_location); + return $auth->verifySignedJwtWithCerts($id_token, $certs, $audience, $issuer, $max_expiry); + } + + /** + * @param Google_Auth_AssertionCredentials $creds + * @return void + */ + public function setAssertionCredentials(Google_Auth_AssertionCredentials $creds) + { + $this->getAuth()->setAssertionCredentials($creds); + } + + /** + * Set the scopes to be requested. Must be called before createAuthUrl(). + * Will remove any previously configured scopes. + * @param array $scopes, ie: array('https://www.googleapis.com/auth/plus.login', + * 'https://www.googleapis.com/auth/moderator') + */ + public function setScopes($scopes) + { + $this->requestedScopes = array(); + $this->addScope($scopes); + } + + /** + * This functions adds a scope to be requested as part of the OAuth2.0 flow. + * Will append any scopes not previously requested to the scope parameter. + * A single string will be treated as a scope to request. An array of strings + * will each be appended. + * @param $scope_or_scopes string|array e.g. "profile" + */ + public function addScope($scope_or_scopes) + { + if (is_string($scope_or_scopes) && !in_array($scope_or_scopes, $this->requestedScopes)) { + $this->requestedScopes[] = $scope_or_scopes; + } else if (is_array($scope_or_scopes)) { + foreach ($scope_or_scopes as $scope) { + $this->addScope($scope); + } + } + } + + /** + * Returns the list of scopes requested by the client + * @return array the list of scopes + * + */ + public function getScopes() + { + return $this->requestedScopes; + } + + /** + * Declare whether batch calls should be used. This may increase throughput + * by making multiple requests in one connection. + * + * @param boolean $useBatch True if the batch support should + * be enabled. Defaults to False. + */ + public function setUseBatch($useBatch) + { + // This is actually an alias for setDefer. + $this->setDefer($useBatch); + } + + /** + * Declare whether making API calls should make the call immediately, or + * return a request which can be called with ->execute(); + * + * @param boolean $defer True if calls should not be executed right away. + */ + public function setDefer($defer) + { + $this->deferExecution = $defer; + } + + /** + * Helper method to execute deferred HTTP requests. + * + * @return object of the type of the expected class or array. + */ + public function execute($request) + { + if ($request instanceof Google_Http_Request) { + $request->setUserAgent( + $this->getApplicationName() + . " " . self::USER_AGENT_SUFFIX + . $this->getLibraryVersion() + ); + if (!$this->getClassConfig("Google_Http_Request", "disable_gzip")) { + $request->enableGzip(); + } + $request->maybeMoveParametersToBody(); + return Google_Http_REST::execute($this, $request); + } else if ($request instanceof Google_Http_Batch) { + return $request->execute(); + } else { + throw new Google_Exception("Do not know how to execute this type of object."); + } + } + + /** + * Whether or not to return raw requests + * @return boolean + */ + public function shouldDefer() + { + return $this->deferExecution; + } + + /** + * @return Google_Auth_Abstract Authentication implementation + */ + public function getAuth() + { + if (!isset($this->auth)) { + $class = $this->config->getAuthClass(); + $this->auth = new $class($this); + } + return $this->auth; + } + + /** + * @return Google_IO_Abstract IO implementation + */ + public function getIo() + { + if (!isset($this->io)) { + $class = $this->config->getIoClass(); + $this->io = new $class($this); + } + return $this->io; + } + + /** + * @return Google_Cache_Abstract Cache implementation + */ + public function getCache() + { + if (!isset($this->cache)) { + $class = $this->config->getCacheClass(); + $this->cache = new $class($this); + } + return $this->cache; + } + + /** + * Retrieve custom configuration for a specific class. + * @param $class string|object - class or instance of class to retrieve + * @param $key string optional - key to retrieve + */ + public function getClassConfig($class, $key = null) + { + if (!is_string($class)) { + $class = get_class($class); + } + return $this->config->getClassConfig($class, $key); + } + + /** + * Set configuration specific to a given class. + * $config->setClassConfig('Google_Cache_File', + * array('directory' => '/tmp/cache')); + * @param $class The class name for the configuration + * @param $config string key or an array of configuration values + * @param $value optional - if $config is a key, the value + * + */ + public function setClassConfig($class, $config, $value = null) + { + if (!is_string($class)) { + $class = get_class($class); + } + return $this->config->setClassConfig($class, $config, $value); + + } + + /** + * @return string the base URL to use for calls to the APIs + */ + public function getBasePath() + { + return $this->config->getBasePath(); + } + + /** + * @return string the name of the application + */ + public function getApplicationName() + { + return $this->config->getApplicationName(); + } + + /** + * Are we running in Google AppEngine? + * return bool + */ + public function isAppEngine() + { + return (isset($_SERVER['SERVER_SOFTWARE']) && + strpos($_SERVER['SERVER_SOFTWARE'], 'Google App Engine') !== false); + } +} diff --git a/apps/files_external/3rdparty/google-api-php-client/src/Google/Collection.php b/apps/files_external/3rdparty/google-api-php-client/src/Google/Collection.php new file mode 100644 index 00000000000..6e7bf9b0f1e --- /dev/null +++ b/apps/files_external/3rdparty/google-api-php-client/src/Google/Collection.php @@ -0,0 +1,96 @@ +<?php + +require_once "Google/Model.php"; + +/** + * Extension to the regular Google_Model that automatically + * exposes the items array for iteration, so you can just + * iterate over the object rather than a reference inside. + */ +class Google_Collection extends Google_Model implements Iterator, Countable +{ + protected $collection_key = 'items'; + + public function rewind() + { + if (isset($this->modelData[$this->collection_key]) + && is_array($this->modelData[$this->collection_key])) { + reset($this->modelData[$this->collection_key]); + } + } + + public function current() + { + $this->coerceType($this->key()); + if (is_array($this->modelData[$this->collection_key])) { + return current($this->modelData[$this->collection_key]); + } + } + + public function key() + { + if (isset($this->modelData[$this->collection_key]) + && is_array($this->modelData[$this->collection_key])) { + return key($this->modelData[$this->collection_key]); + } + } + + public function next() + { + return next($this->modelData[$this->collection_key]); + } + + public function valid() + { + $key = $this->key(); + return $key !== null && $key !== false; + } + + public function count() + { + return count($this->modelData[$this->collection_key]); + } + + public function offsetExists ($offset) + { + if (!is_numeric($offset)) { + return parent::offsetExists($offset); + } + return isset($this->modelData[$this->collection_key][$offset]); + } + + public function offsetGet($offset) + { + if (!is_numeric($offset)) { + return parent::offsetGet($offset); + } + $this->coerceType($offset); + return $this->modelData[$this->collection_key][$offset]; + } + + public function offsetSet($offset, $value) + { + if (!is_numeric($offset)) { + return parent::offsetSet($offset, $value); + } + $this->modelData[$this->collection_key][$offset] = $value; + } + + public function offsetUnset($offset) + { + if (!is_numeric($offset)) { + return parent::offsetUnset($offset); + } + unset($this->modelData[$this->collection_key][$offset]); + } + + private function coerceType($offset) + { + $typeKey = $this->keyType($this->collection_key); + if (isset($this->$typeKey) && !is_object($this->modelData[$this->collection_key][$offset])) { + $type = $this->$typeKey; + $this->modelData[$this->collection_key][$offset] = + new $type($this->modelData[$this->collection_key][$offset]); + } + } +} diff --git a/apps/files_external/3rdparty/google-api-php-client/src/Google/Config.php b/apps/files_external/3rdparty/google-api-php-client/src/Google/Config.php new file mode 100644 index 00000000000..84083058fe5 --- /dev/null +++ b/apps/files_external/3rdparty/google-api-php-client/src/Google/Config.php @@ -0,0 +1,371 @@ +<?php +/* + * Copyright 2010 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * A class to contain the library configuration for the Google API client. + */ +class Google_Config +{ + const GZIP_DISABLED = true; + const GZIP_ENABLED = false; + const GZIP_UPLOADS_ENABLED = true; + const GZIP_UPLOADS_DISABLED = false; + const USE_AUTO_IO_SELECTION = "auto"; + protected $configuration; + + /** + * Create a new Google_Config. Can accept an ini file location with the + * local configuration. For example: + * application_name="My App" + * + * @param [$ini_file_location] - optional - The location of the ini file to load + */ + public function __construct($ini_file_location = null) + { + $this->configuration = array( + // The application_name is included in the User-Agent HTTP header. + 'application_name' => '', + + // Which Authentication, Storage and HTTP IO classes to use. + 'auth_class' => 'Google_Auth_OAuth2', + 'io_class' => self::USE_AUTO_IO_SELECTION, + 'cache_class' => 'Google_Cache_File', + + // Don't change these unless you're working against a special development + // or testing environment. + 'base_path' => 'https://www.googleapis.com', + + // Definition of class specific values, like file paths and so on. + 'classes' => array( + 'Google_IO_Abstract' => array( + 'request_timeout_seconds' => 100, + ), + 'Google_Http_Request' => array( + // Disable the use of gzip on calls if set to true. Defaults to false. + 'disable_gzip' => self::GZIP_ENABLED, + + // We default gzip to disabled on uploads even if gzip is otherwise + // enabled, due to some issues seen with small packet sizes for uploads. + // Please test with this option before enabling gzip for uploads in + // a production environment. + 'enable_gzip_for_uploads' => self::GZIP_UPLOADS_DISABLED, + ), + // If you want to pass in OAuth 2.0 settings, they will need to be + // structured like this. + 'Google_Auth_OAuth2' => array( + // Keys for OAuth 2.0 access, see the API console at + // https://developers.google.com/console + 'client_id' => '', + 'client_secret' => '', + 'redirect_uri' => '', + + // Simple API access key, also from the API console. Ensure you get + // a Server key, and not a Browser key. + 'developer_key' => '', + + // Other parameters. + 'hd' => '', + 'prompt' => '', + 'openid.realm' => '', + 'include_granted_scopes' => '', + 'login_hint' => '', + 'request_visible_actions' => '', + 'access_type' => 'online', + 'approval_prompt' => 'auto', + 'federated_signon_certs_url' => + 'https://www.googleapis.com/oauth2/v1/certs', + ), + // Set a default directory for the file cache. + 'Google_Cache_File' => array( + 'directory' => sys_get_temp_dir() . '/Google_Client' + ) + ), + ); + if ($ini_file_location) { + $ini = parse_ini_file($ini_file_location, true); + if (is_array($ini) && count($ini)) { + $this->configuration = array_merge($this->configuration, $ini); + } + } + } + + /** + * Set configuration specific to a given class. + * $config->setClassConfig('Google_Cache_File', + * array('directory' => '/tmp/cache')); + * @param $class The class name for the configuration + * @param $config string key or an array of configuration values + * @param $value optional - if $config is a key, the value + */ + public function setClassConfig($class, $config, $value = null) + { + if (!is_array($config)) { + if (!isset($this->configuration['classes'][$class])) { + $this->configuration['classes'][$class] = array(); + } + $this->configuration['classes'][$class][$config] = $value; + } else { + $this->configuration['classes'][$class] = $config; + } + } + + public function getClassConfig($class, $key = null) + { + if (!isset($this->configuration['classes'][$class])) { + return null; + } + if ($key === null) { + return $this->configuration['classes'][$class]; + } else { + return $this->configuration['classes'][$class][$key]; + } + } + + /** + * Return the configured cache class. + * @return string + */ + public function getCacheClass() + { + return $this->configuration['cache_class']; + } + + /** + * Return the configured Auth class. + * @return string + */ + public function getAuthClass() + { + return $this->configuration['auth_class']; + } + + /** + * Set the auth class. + * + * @param $class the class name to set + */ + public function setAuthClass($class) + { + $prev = $this->configuration['auth_class']; + if (!isset($this->configuration['classes'][$class]) && + isset($this->configuration['classes'][$prev])) { + $this->configuration['classes'][$class] = + $this->configuration['classes'][$prev]; + } + $this->configuration['auth_class'] = $class; + } + + /** + * Set the IO class. + * + * @param $class the class name to set + */ + public function setIoClass($class) + { + $prev = $this->configuration['io_class']; + if (!isset($this->configuration['classes'][$class]) && + isset($this->configuration['classes'][$prev])) { + $this->configuration['classes'][$class] = + $this->configuration['classes'][$prev]; + } + $this->configuration['io_class'] = $class; + } + + /** + * Set the cache class. + * + * @param $class the class name to set + */ + public function setCacheClass($class) + { + $prev = $this->configuration['cache_class']; + if (!isset($this->configuration['classes'][$class]) && + isset($this->configuration['classes'][$prev])) { + $this->configuration['classes'][$class] = + $this->configuration['classes'][$prev]; + } + $this->configuration['cache_class'] = $class; + } + + /** + * Return the configured IO class. + * @return string + */ + public function getIoClass() + { + return $this->configuration['io_class']; + } + + /** + * Set the application name, this is included in the User-Agent HTTP header. + * @param string $name + */ + public function setApplicationName($name) + { + $this->configuration['application_name'] = $name; + } + + /** + * @return string the name of the application + */ + public function getApplicationName() + { + return $this->configuration['application_name']; + } + + /** + * Set the client ID for the auth class. + * @param $key string - the API console client ID + */ + public function setClientId($clientId) + { + $this->setAuthConfig('client_id', $clientId); + } + + /** + * Set the client secret for the auth class. + * @param $key string - the API console client secret + */ + public function setClientSecret($secret) + { + $this->setAuthConfig('client_secret', $secret); + } + + /** + * Set the redirect uri for the auth class. Note that if using the + * Javascript based sign in flow, this should be the string 'postmessage'. + * @param $key string - the URI that users should be redirected to + */ + public function setRedirectUri($uri) + { + $this->setAuthConfig('redirect_uri', $uri); + } + + /** + * Set the app activities for the auth class. + * @param $rva string a space separated list of app activity types + */ + public function setRequestVisibleActions($rva) + { + $this->setAuthConfig('request_visible_actions', $rva); + } + + /** + * Set the the access type requested (offline or online.) + * @param $access string - the access type + */ + public function setAccessType($access) + { + $this->setAuthConfig('access_type', $access); + } + + /** + * Set when to show the approval prompt (auto or force) + * @param $approval string - the approval request + */ + public function setApprovalPrompt($approval) + { + $this->setAuthConfig('approval_prompt', $approval); + } + + /** + * Set the login hint (email address or sub identifier) + * @param $hint string + */ + public function setLoginHint($hint) + { + $this->setAuthConfig('login_hint', $hint); + } + + /** + * Set the developer key for the auth class. Note that this is separate value + * from the client ID - if it looks like a URL, its a client ID! + * @param $key string - the API console developer key + */ + public function setDeveloperKey($key) + { + $this->setAuthConfig('developer_key', $key); + } + + /** + * Set the hd (hosted domain) parameter streamlines the login process for + * Google Apps hosted accounts. By including the domain of the user, you + * restrict sign-in to accounts at that domain. + * @param $hd string - the domain to use. + */ + public function setHostedDomain($hd) + { + $this->setAuthConfig('hd', $hd); + } + + /** + * Set the prompt hint. Valid values are none, consent and select_account. + * If no value is specified and the user has not previously authorized + * access, then the user is shown a consent screen. + * @param $prompt string + */ + public function setPrompt($prompt) + { + $this->setAuthConfig('prompt', $prompt); + } + + /** + * openid.realm is a parameter from the OpenID 2.0 protocol, not from OAuth + * 2.0. It is used in OpenID 2.0 requests to signify the URL-space for which + * an authentication request is valid. + * @param $realm string - the URL-space to use. + */ + public function setOpenidRealm($realm) + { + $this->setAuthConfig('openid.realm', $realm); + } + + /** + * If this is provided with the value true, and the authorization request is + * granted, the authorization will include any previous authorizations + * granted to this user/application combination for other scopes. + * @param $include boolean - the URL-space to use. + */ + public function setIncludeGrantedScopes($include) + { + $this->setAuthConfig( + 'include_granted_scopes', + $include ? "true" : "false" + ); + } + + /** + * @return string the base URL to use for API calls + */ + public function getBasePath() + { + return $this->configuration['base_path']; + } + + /** + * Set the auth configuration for the current auth class. + * @param $key - the key to set + * @param $value - the parameter value + */ + private function setAuthConfig($key, $value) + { + if (!isset($this->configuration['classes'][$this->getAuthClass()])) { + $this->configuration['classes'][$this->getAuthClass()] = array(); + } + $this->configuration['classes'][$this->getAuthClass()][$key] = $value; + } +} diff --git a/apps/files_external/3rdparty/google-api-php-client/src/service/Google_Service.php b/apps/files_external/3rdparty/google-api-php-client/src/Google/Exception.php index 1f4731fb2f4..af80269718a 100644 --- a/apps/files_external/3rdparty/google-api-php-client/src/service/Google_Service.php +++ b/apps/files_external/3rdparty/google-api-php-client/src/Google/Exception.php @@ -1,6 +1,6 @@ <?php /* - * Copyright 2010 Google Inc. + * Copyright 2013 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,8 +15,6 @@ * limitations under the License. */ -class Google_Service { - public $version; - public $servicePath; - public $resource; +class Google_Exception extends Exception +{ } diff --git a/apps/files_external/3rdparty/google-api-php-client/src/service/Google_BatchRequest.php b/apps/files_external/3rdparty/google-api-php-client/src/Google/Http/Batch.php index 3916b223a7e..d851da50499 100644 --- a/apps/files_external/3rdparty/google-api-php-client/src/service/Google_BatchRequest.php +++ b/apps/files_external/3rdparty/google-api-php-client/src/Google/Http/Batch.php @@ -15,22 +15,39 @@ * limitations under the License. */ +require_once 'Google/Client.php'; +require_once 'Google/Http/Request.php'; +require_once 'Google/Http/REST.php'; + /** * @author Chirag Shah <chirags@google.com> */ -class Google_BatchRequest { +class Google_Http_Batch +{ /** @var string Multipart Boundary. */ private $boundary; /** @var array service requests to be executed. */ private $requests = array(); - public function __construct($boundary = false) { + /** @var Google_Client */ + private $client; + + private $expected_classes = array(); + + private $base_path; + + public function __construct(Google_Client $client, $boundary = false) + { + $this->client = $client; + $this->base_path = $this->client->getBasePath(); + $this->expected_classes = array(); $boundary = (false == $boundary) ? mt_rand() : $boundary; $this->boundary = str_replace('"', '', $boundary); } - public function add(Google_HttpRequest $request, $key = false) { + public function add(Google_Http_Request $request, $key = false) + { if (false == $key) { $key = mt_rand(); } @@ -38,36 +55,38 @@ class Google_BatchRequest { $this->requests[$key] = $request; } - public function execute() { + public function execute() + { $body = ''; - /** @var Google_HttpRequest $req */ - foreach($this->requests as $key => $req) { + /** @var Google_Http_Request $req */ + foreach ($this->requests as $key => $req) { $body .= "--{$this->boundary}\n"; $body .= $req->toBatchString($key) . "\n"; + $this->expected_classes["response-" . $key] = $req->getExpectedClass(); } $body = rtrim($body); $body .= "\n--{$this->boundary}--"; - global $apiConfig; - $url = $apiConfig['basePath'] . '/batch'; - $httpRequest = new Google_HttpRequest($url, 'POST'); - $httpRequest->setRequestHeaders(array( - 'Content-Type' => 'multipart/mixed; boundary=' . $this->boundary)); + $url = $this->base_path . '/batch'; + $httpRequest = new Google_Http_Request($url, 'POST'); + $httpRequest->setRequestHeaders( + array('Content-Type' => 'multipart/mixed; boundary=' . $this->boundary) + ); $httpRequest->setPostBody($body); - $response = Google_Client::$io->makeRequest($httpRequest); + $response = $this->client->getIo()->makeRequest($httpRequest); - $response = $this->parseResponse($response); - return $response; + return $this->parseResponse($response); } - public function parseResponse(Google_HttpRequest $response) { + public function parseResponse(Google_Http_Request $response) + { $contentType = $response->getResponseHeader('content-type'); $contentType = explode(';', $contentType); $boundary = false; - foreach($contentType as $part) { + foreach ($contentType as $part) { $part = (explode('=', $part, 2)); if (isset($part[0]) && 'boundary' == trim($part[0])) { $boundary = $part[1]; @@ -80,25 +99,39 @@ class Google_BatchRequest { $parts = explode("--$boundary", $body); $responses = array(); - foreach($parts as $part) { + foreach ($parts as $part) { $part = trim($part); if (!empty($part)) { list($metaHeaders, $part) = explode("\r\n\r\n", $part, 2); - $metaHeaders = Google_CurlIO::parseResponseHeaders($metaHeaders); + $metaHeaders = $this->client->getIo()->getHttpResponseHeaders($metaHeaders); $status = substr($part, 0, strpos($part, "\n")); $status = explode(" ", $status); $status = $status[1]; - list($partHeaders, $partBody) = Google_CurlIO::parseHttpResponse($part, false); - $response = new Google_HttpRequest(""); + list($partHeaders, $partBody) = $this->client->getIo()->ParseHttpResponse($part, false); + $response = new Google_Http_Request(""); $response->setResponseHttpCode($status); $response->setResponseHeaders($partHeaders); $response->setResponseBody($partBody); - $response = Google_REST::decodeHttpResponse($response); // Need content id. - $responses[$metaHeaders['content-id']] = $response; + $key = $metaHeaders['content-id']; + + if (isset($this->expected_classes[$key]) && + strlen($this->expected_classes[$key]) > 0) { + $class = $this->expected_classes[$key]; + $response->setExpectedClass($class); + } + + try { + $response = Google_Http_REST::decodeHttpResponse($response); + $responses[$key] = $response; + } catch (Google_Service_Exception $e) { + // Store the exception as the response, so succesful responses + // can be processed. + $responses[$key] = $e; + } } } @@ -107,4 +140,4 @@ class Google_BatchRequest { return null; } -}
\ No newline at end of file +} diff --git a/apps/files_external/3rdparty/google-api-php-client/src/io/Google_CacheParser.php b/apps/files_external/3rdparty/google-api-php-client/src/Google/Http/CacheParser.php index 7f5accfefe9..83f1c8d2f42 100644 --- a/apps/files_external/3rdparty/google-api-php-client/src/io/Google_CacheParser.php +++ b/apps/files_external/3rdparty/google-api-php-client/src/Google/Http/CacheParser.php @@ -14,26 +14,29 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + +require_once 'Google/Http/Request.php'; + /** * Implement the caching directives specified in rfc2616. This * implementation is guided by the guidance offered in rfc2616-sec13. * @author Chirag Shah <chirags@google.com> */ -class Google_CacheParser { +class Google_Http_CacheParser +{ public static $CACHEABLE_HTTP_METHODS = array('GET', 'HEAD'); public static $CACHEABLE_STATUS_CODES = array('200', '203', '300', '301'); - private function __construct() {} - /** * Check if an HTTP request can be cached by a private local cache. * * @static - * @param Google_HttpRequest $resp + * @param Google_Http_Request $resp * @return bool True if the request is cacheable. * False if the request is uncacheable. */ - public static function isRequestCacheable (Google_HttpRequest $resp) { + public static function isRequestCacheable(Google_Http_Request $resp) + { $method = $resp->getRequestMethod(); if (! in_array($method, self::$CACHEABLE_HTTP_METHODS)) { return false; @@ -54,11 +57,12 @@ class Google_CacheParser { * Check if an HTTP response can be cached by a private local cache. * * @static - * @param Google_HttpRequest $resp + * @param Google_Http_Request $resp * @return bool True if the response is cacheable. * False if the response is un-cacheable. */ - public static function isResponseCacheable (Google_HttpRequest $resp) { + public static function isResponseCacheable(Google_Http_Request $resp) + { // First, check if the HTTP request was cacheable before inspecting the // HTTP response. if (false == self::isRequestCacheable($resp)) { @@ -105,15 +109,17 @@ class Google_CacheParser { /** * @static - * @param Google_HttpRequest $resp + * @param Google_Http_Request $resp * @return bool True if the HTTP response is considered to be expired. * False if it is considered to be fresh. */ - public static function isExpired(Google_HttpRequest $resp) { + public static function isExpired(Google_Http_Request $resp) + { // HTTP/1.1 clients and caches MUST treat other invalid date formats, // especially including the value “0”, as in the past. $parsedExpires = false; $responseHeaders = $resp->getResponseHeaders(); + if (isset($responseHeaders['expires'])) { $rawExpires = $responseHeaders['expires']; // Check for a malformed expires header first. @@ -139,8 +145,12 @@ class Google_CacheParser { $parsedDate = strtotime($rawDate); if (empty($rawDate) || false == $parsedDate) { - $parsedDate = time(); + // We can't default this to now, as that means future cache reads + // will always pass with the logic below, so we will require a + // date be injected if not supplied. + throw new Google_Exception("All cacheable requests must have creation dates."); } + if (false == $freshnessLifetime && isset($responseHeaders['expires'])) { $freshnessLifetime = $parsedExpires - $parsedDate; } @@ -161,13 +171,14 @@ class Google_CacheParser { /** * Determine if a cache entry should be revalidated with by the origin. * - * @param Google_HttpRequest $response + * @param Google_Http_Request $response * @return bool True if the entry is expired, else return false. */ - public static function mustRevalidate(Google_HttpRequest $response) { + public static function mustRevalidate(Google_Http_Request $response) + { // [13.3] When a cache has a stale entry that it would like to use as a // response to a client's request, it first has to check with the origin // server to see if its cached entry is still usable. return self::isExpired($response); } -}
\ No newline at end of file +} diff --git a/apps/files_external/3rdparty/google-api-php-client/src/Google/Http/MediaFileUpload.php b/apps/files_external/3rdparty/google-api-php-client/src/Google/Http/MediaFileUpload.php new file mode 100644 index 00000000000..8005db4bb48 --- /dev/null +++ b/apps/files_external/3rdparty/google-api-php-client/src/Google/Http/MediaFileUpload.php @@ -0,0 +1,301 @@ +<?php +/** + * Copyright 2012 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +require_once 'Google/Client.php'; +require_once 'Google/Exception.php'; +require_once 'Google/Http/Request.php'; +require_once 'Google/Http/REST.php'; +require_once 'Google/Utils.php'; + +/** + * @author Chirag Shah <chirags@google.com> + * + */ +class Google_Http_MediaFileUpload +{ + const UPLOAD_MEDIA_TYPE = 'media'; + const UPLOAD_MULTIPART_TYPE = 'multipart'; + const UPLOAD_RESUMABLE_TYPE = 'resumable'; + + /** @var string $mimeType */ + private $mimeType; + + /** @var string $data */ + private $data; + + /** @var bool $resumable */ + private $resumable; + + /** @var int $chunkSize */ + private $chunkSize; + + /** @var int $size */ + private $size; + + /** @var string $resumeUri */ + private $resumeUri; + + /** @var int $progress */ + private $progress; + + /** @var Google_Client */ + private $client; + + /** @var Google_Http_Request */ + private $request; + + /** @var string */ + private $boundary; + + /** + * Result code from last HTTP call + * @var int + */ + private $httpResultCode; + + /** + * @param $mimeType string + * @param $data string The bytes you want to upload. + * @param $resumable bool + * @param bool $chunkSize File will be uploaded in chunks of this many bytes. + * only used if resumable=True + */ + public function __construct( + Google_Client $client, + Google_Http_Request $request, + $mimeType, + $data, + $resumable = false, + $chunkSize = false, + $boundary = false + ) { + $this->client = $client; + $this->request = $request; + $this->mimeType = $mimeType; + $this->data = $data; + $this->size = strlen($this->data); + $this->resumable = $resumable; + if (!$chunkSize) { + $chunkSize = 256 * 1024; + } + $this->chunkSize = $chunkSize; + $this->progress = 0; + $this->boundary = $boundary; + + // Process Media Request + $this->process(); + } + + /** + * Set the size of the file that is being uploaded. + * @param $size - int file size in bytes + */ + public function setFileSize($size) + { + $this->size = $size; + } + + /** + * Return the progress on the upload + * @return int progress in bytes uploaded. + */ + public function getProgress() + { + return $this->progress; + } + + /** + * Return the HTTP result code from the last call made. + * @return int code + */ + public function getHttpResultCode() + { + return $this->httpResultCode; + } + + /** + * Send the next part of the file to upload. + * @param [$chunk] the next set of bytes to send. If false will used $data passed + * at construct time. + */ + public function nextChunk($chunk = false) + { + if (false == $this->resumeUri) { + $this->resumeUri = $this->getResumeUri(); + } + + if (false == $chunk) { + $chunk = substr($this->data, $this->progress, $this->chunkSize); + } + + $lastBytePos = $this->progress + strlen($chunk) - 1; + $headers = array( + 'content-range' => "bytes $this->progress-$lastBytePos/$this->size", + 'content-type' => $this->request->getRequestHeader('content-type'), + 'content-length' => $this->chunkSize, + 'expect' => '', + ); + + $httpRequest = new Google_Http_Request( + $this->resumeUri, + 'PUT', + $headers, + $chunk + ); + + if ($this->client->getClassConfig("Google_Http_Request", "enable_gzip_for_uploads")) { + $httpRequest->enableGzip(); + } else { + $httpRequest->disableGzip(); + } + + $response = $this->client->getIo()->makeRequest($httpRequest); + $response->setExpectedClass($this->request->getExpectedClass()); + $code = $response->getResponseHttpCode(); + $this->httpResultCode = $code; + + if (308 == $code) { + // Track the amount uploaded. + $range = explode('-', $response->getResponseHeader('range')); + $this->progress = $range[1] + 1; + + // Allow for changing upload URLs. + $location = $response->getResponseHeader('location'); + if ($location) { + $this->resumeUri = $location; + } + + // No problems, but upload not complete. + return false; + } else { + return Google_Http_REST::decodeHttpResponse($response); + } + } + + /** + * @param $meta + * @param $params + * @return array|bool + * @visible for testing + */ + private function process() + { + $postBody = false; + $contentType = false; + + $meta = $this->request->getPostBody(); + $meta = is_string($meta) ? json_decode($meta, true) : $meta; + + $uploadType = $this->getUploadType($meta); + $this->request->setQueryParam('uploadType', $uploadType); + $this->transformToUploadUrl(); + $mimeType = $this->mimeType ? + $this->mimeType : + $this->request->getRequestHeader('content-type'); + + if (self::UPLOAD_RESUMABLE_TYPE == $uploadType) { + $contentType = $mimeType; + $postBody = is_string($meta) ? $meta : json_encode($meta); + } else if (self::UPLOAD_MEDIA_TYPE == $uploadType) { + $contentType = $mimeType; + $postBody = $this->data; + } else if (self::UPLOAD_MULTIPART_TYPE == $uploadType) { + // This is a multipart/related upload. + $boundary = $this->boundary ? $this->boundary : mt_rand(); + $boundary = str_replace('"', '', $boundary); + $contentType = 'multipart/related; boundary=' . $boundary; + $related = "--$boundary\r\n"; + $related .= "Content-Type: application/json; charset=UTF-8\r\n"; + $related .= "\r\n" . json_encode($meta) . "\r\n"; + $related .= "--$boundary\r\n"; + $related .= "Content-Type: $mimeType\r\n"; + $related .= "Content-Transfer-Encoding: base64\r\n"; + $related .= "\r\n" . base64_encode($this->data) . "\r\n"; + $related .= "--$boundary--"; + $postBody = $related; + } + + $this->request->setPostBody($postBody); + + if (isset($contentType) && $contentType) { + $contentTypeHeader['content-type'] = $contentType; + $this->request->setRequestHeaders($contentTypeHeader); + } + } + + private function transformToUploadUrl() + { + $base = $this->request->getBaseComponent(); + $this->request->setBaseComponent($base . '/upload'); + } + + /** + * Valid upload types: + * - resumable (UPLOAD_RESUMABLE_TYPE) + * - media (UPLOAD_MEDIA_TYPE) + * - multipart (UPLOAD_MULTIPART_TYPE) + * @param $meta + * @return string + * @visible for testing + */ + public function getUploadType($meta) + { + if ($this->resumable) { + return self::UPLOAD_RESUMABLE_TYPE; + } + + if (false == $meta && $this->data) { + return self::UPLOAD_MEDIA_TYPE; + } + + return self::UPLOAD_MULTIPART_TYPE; + } + + private function getResumeUri() + { + $result = null; + $body = $this->request->getPostBody(); + if ($body) { + $headers = array( + 'content-type' => 'application/json; charset=UTF-8', + 'content-length' => Google_Utils::getStrLen($body), + 'x-upload-content-type' => $this->mimeType, + 'x-upload-content-length' => $this->size, + 'expect' => '', + ); + $this->request->setRequestHeaders($headers); + } + + $response = $this->client->getIo()->makeRequest($this->request); + $location = $response->getResponseHeader('location'); + $code = $response->getResponseHttpCode(); + + if (200 == $code && true == $location) { + return $location; + } + $message = $code; + $body = @json_decode($response->getResponseBody()); + if (!empty( $body->error->errors ) ) { + $message .= ': '; + foreach ($body->error->errors as $error) { + $message .= "{$error->domain}, {$error->message};"; + } + $message = rtrim($message, ';'); + } + throw new Google_Exception("Failed to start the resumable upload (HTTP {$message})"); + } +} diff --git a/apps/files_external/3rdparty/google-api-php-client/src/io/Google_REST.php b/apps/files_external/3rdparty/google-api-php-client/src/Google/Http/REST.php index d0f3b3d564c..3c318e44ceb 100644 --- a/apps/files_external/3rdparty/google-api-php-client/src/io/Google_REST.php +++ b/apps/files_external/3rdparty/google-api-php-client/src/Google/Http/REST.php @@ -15,47 +15,54 @@ * limitations under the License. */ +require_once 'Google/Client.php'; +require_once 'Google/Http/Request.php'; +require_once 'Google/Service/Exception.php'; +require_once 'Google/Utils/URITemplate.php'; + /** * This class implements the RESTful transport of apiServiceRequest()'s * * @author Chris Chabot <chabotc@google.com> * @author Chirag Shah <chirags@google.com> */ -class Google_REST { +class Google_Http_REST +{ /** - * Executes a apiServiceRequest using a RESTful call by transforming it into - * an apiHttpRequest, and executed via apiIO::authenticatedRequest(). + * Executes a Google_Http_Request * - * @param Google_HttpRequest $req + * @param Google_Client $client + * @param Google_Http_Request $req * @return array decoded result - * @throws Google_ServiceException on server side error (ie: not authenticated, + * @throws Google_Service_Exception on server side error (ie: not authenticated, * invalid or malformed post body, invalid url) */ - static public function execute(Google_HttpRequest $req) { - $httpRequest = Google_Client::$io->makeRequest($req); - $decodedResponse = self::decodeHttpResponse($httpRequest); - $ret = isset($decodedResponse['data']) - ? $decodedResponse['data'] : $decodedResponse; - return $ret; + public static function execute(Google_Client $client, Google_Http_Request $req) + { + $httpRequest = $client->getIo()->makeRequest($req); + $httpRequest->setExpectedClass($req->getExpectedClass()); + return self::decodeHttpResponse($httpRequest); } - /** * Decode an HTTP Response. * @static - * @throws Google_ServiceException - * @param Google_HttpRequest $response The http response to be decoded. + * @throws Google_Service_Exception + * @param Google_Http_Request $response The http response to be decoded. * @return mixed|null */ - public static function decodeHttpResponse($response) { + public static function decodeHttpResponse($response) + { $code = $response->getResponseHttpCode(); $body = $response->getResponseBody(); $decoded = null; - + if ((intVal($code)) >= 300) { $decoded = json_decode($body, true); $err = 'Error calling ' . $response->getRequestMethod() . ' ' . $response->getUrl(); - if ($decoded != null && isset($decoded['error']['message']) && isset($decoded['error']['code'])) { + if (isset($decoded['error']) && + isset($decoded['error']['message']) && + isset($decoded['error']['code'])) { // if we're getting a json encoded error definition, use that instead of the raw response // body for improved readability $err .= ": ({$decoded['error']['code']}) {$decoded['error']['message']}"; @@ -63,14 +70,25 @@ class Google_REST { $err .= ": ($code) $body"; } - throw new Google_ServiceException($err, $code, null, $decoded['error']['errors']); + $errors = null; + // Specific check for APIs which don't return error details, such as Blogger. + if (isset($decoded['error']) && isset($decoded['error']['errors'])) { + $errors = $decoded['error']['errors']; + } + + throw new Google_Service_Exception($err, $code, null, $errors); } - + // Only attempt to decode the response, if the response code wasn't (204) 'no content' if ($code != '204') { $decoded = json_decode($body, true); if ($decoded === null || $decoded === "") { - throw new Google_ServiceException("Invalid json in service response: $body"); + throw new Google_Service_Exception("Invalid json in service response: $body"); + } + + if ($response->getExpectedClass()) { + $class = $response->getExpectedClass(); + $decoded = new $class($decoded); } } return $decoded; @@ -85,22 +103,18 @@ class Google_REST { * @param array $params * @return string $requestUrl */ - static function createRequestUri($servicePath, $restPath, $params) { + public static function createRequestUri($servicePath, $restPath, $params) + { $requestUrl = $servicePath . $restPath; $uriTemplateVars = array(); $queryVars = array(); foreach ($params as $paramName => $paramSpec) { - // Discovery v1.0 puts the canonical location under the 'location' field. - if (! isset($paramSpec['location'])) { - $paramSpec['location'] = $paramSpec['restParameterType']; - } - if ($paramSpec['type'] == 'boolean') { $paramSpec['value'] = ($paramSpec['value']) ? 'true' : 'false'; } if ($paramSpec['location'] == 'path') { $uriTemplateVars[$paramName] = $paramSpec['value']; - } else { + } else if ($paramSpec['location'] == 'query') { if (isset($paramSpec['repeated']) && is_array($paramSpec['value'])) { foreach ($paramSpec['value'] as $value) { $queryVars[] = $paramName . '=' . rawurlencode($value); @@ -112,12 +126,9 @@ class Google_REST { } if (count($uriTemplateVars)) { - $uriTemplateParser = new URI_Template_Parser($requestUrl); - $requestUrl = $uriTemplateParser->expand($uriTemplateVars); + $uriTemplateParser = new Google_Utils_URITemplate(); + $requestUrl = $uriTemplateParser->parse($requestUrl, $uriTemplateVars); } - //FIXME work around for the the uri template lib which url encodes - // the @'s & confuses our servers. - $requestUrl = str_replace('%40', '@', $requestUrl); if (count($queryVars)) { $requestUrl .= '?' . implode($queryVars, '&'); diff --git a/apps/files_external/3rdparty/google-api-php-client/src/Google/Http/Request.php b/apps/files_external/3rdparty/google-api-php-client/src/Google/Http/Request.php new file mode 100644 index 00000000000..8643694da89 --- /dev/null +++ b/apps/files_external/3rdparty/google-api-php-client/src/Google/Http/Request.php @@ -0,0 +1,476 @@ +<?php +/* + * Copyright 2010 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +require_once 'Google/Utils.php'; + +/** + * HTTP Request to be executed by IO classes. Upon execution, the + * responseHttpCode, responseHeaders and responseBody will be filled in. + * + * @author Chris Chabot <chabotc@google.com> + * @author Chirag Shah <chirags@google.com> + * + */ +class Google_Http_Request +{ + const GZIP_UA = " (gzip)"; + + private $batchHeaders = array( + 'Content-Type' => 'application/http', + 'Content-Transfer-Encoding' => 'binary', + 'MIME-Version' => '1.0', + ); + + protected $queryParams; + protected $requestMethod; + protected $requestHeaders; + protected $baseComponent = null; + protected $path; + protected $postBody; + protected $userAgent; + protected $canGzip = null; + + protected $responseHttpCode; + protected $responseHeaders; + protected $responseBody; + + protected $expectedClass; + + public $accessKey; + + public function __construct( + $url, + $method = 'GET', + $headers = array(), + $postBody = null + ) { + $this->setUrl($url); + $this->setRequestMethod($method); + $this->setRequestHeaders($headers); + $this->setPostBody($postBody); + } + + /** + * Misc function that returns the base url component of the $url + * used by the OAuth signing class to calculate the base string + * @return string The base url component of the $url. + */ + public function getBaseComponent() + { + return $this->baseComponent; + } + + /** + * Set the base URL that path and query parameters will be added to. + * @param $baseComponent string + */ + public function setBaseComponent($baseComponent) + { + $this->baseComponent = $baseComponent; + } + + /** + * Enable support for gzipped responses with this request. + */ + public function enableGzip() + { + $this->setRequestHeaders(array("Accept-Encoding" => "gzip")); + $this->canGzip = true; + $this->setUserAgent($this->userAgent); + } + + /** + * Disable support for gzip responses with this request. + */ + public function disableGzip() + { + if ( + isset($this->requestHeaders['accept-encoding']) && + $this->requestHeaders['accept-encoding'] == "gzip" + ) { + unset($this->requestHeaders['accept-encoding']); + } + $this->canGzip = false; + $this->userAgent = str_replace(self::GZIP_UA, "", $this->userAgent); + } + + /** + * Can this request accept a gzip response? + * @return bool + */ + public function canGzip() + { + return $this->canGzip; + } + + /** + * Misc function that returns an array of the query parameters of the current + * url used by the OAuth signing class to calculate the signature + * @return array Query parameters in the query string. + */ + public function getQueryParams() + { + return $this->queryParams; + } + + /** + * Set a new query parameter. + * @param $key - string to set, does not need to be URL encoded + * @param $value - string to set, does not need to be URL encoded + */ + public function setQueryParam($key, $value) + { + $this->queryParams[$key] = $value; + } + + /** + * @return string HTTP Response Code. + */ + public function getResponseHttpCode() + { + return (int) $this->responseHttpCode; + } + + /** + * @param int $responseHttpCode HTTP Response Code. + */ + public function setResponseHttpCode($responseHttpCode) + { + $this->responseHttpCode = $responseHttpCode; + } + + /** + * @return $responseHeaders (array) HTTP Response Headers. + */ + public function getResponseHeaders() + { + return $this->responseHeaders; + } + + /** + * @return string HTTP Response Body + */ + public function getResponseBody() + { + return $this->responseBody; + } + + /** + * Set the class the response to this request should expect. + * + * @param $class string the class name + */ + public function setExpectedClass($class) + { + $this->expectedClass = $class; + } + + /** + * Retrieve the expected class the response should expect. + * @return string class name + */ + public function getExpectedClass() + { + return $this->expectedClass; + } + + /** + * @param array $headers The HTTP response headers + * to be normalized. + */ + public function setResponseHeaders($headers) + { + $headers = Google_Utils::normalize($headers); + if ($this->responseHeaders) { + $headers = array_merge($this->responseHeaders, $headers); + } + + $this->responseHeaders = $headers; + } + + /** + * @param string $key + * @return array|boolean Returns the requested HTTP header or + * false if unavailable. + */ + public function getResponseHeader($key) + { + return isset($this->responseHeaders[$key]) + ? $this->responseHeaders[$key] + : false; + } + + /** + * @param string $responseBody The HTTP response body. + */ + public function setResponseBody($responseBody) + { + $this->responseBody = $responseBody; + } + + /** + * @return string $url The request URL. + */ + public function getUrl() + { + return $this->baseComponent . $this->path . + (count($this->queryParams) ? + "?" . $this->buildQuery($this->queryParams) : + ''); + } + + /** + * @return string $method HTTP Request Method. + */ + public function getRequestMethod() + { + return $this->requestMethod; + } + + /** + * @return array $headers HTTP Request Headers. + */ + public function getRequestHeaders() + { + return $this->requestHeaders; + } + + /** + * @param string $key + * @return array|boolean Returns the requested HTTP header or + * false if unavailable. + */ + public function getRequestHeader($key) + { + return isset($this->requestHeaders[$key]) + ? $this->requestHeaders[$key] + : false; + } + + /** + * @return string $postBody HTTP Request Body. + */ + public function getPostBody() + { + return $this->postBody; + } + + /** + * @param string $url the url to set + */ + public function setUrl($url) + { + if (substr($url, 0, 4) != 'http') { + // Force the path become relative. + if (substr($url, 0, 1) !== '/') { + $url = '/' . $url; + } + } + $parts = parse_url($url); + if (isset($parts['host'])) { + $this->baseComponent = sprintf( + "%s%s%s", + isset($parts['scheme']) ? $parts['scheme'] . "://" : '', + isset($parts['host']) ? $parts['host'] : '', + isset($parts['port']) ? ":" . $parts['port'] : '' + ); + } + $this->path = isset($parts['path']) ? $parts['path'] : ''; + $this->queryParams = array(); + if (isset($parts['query'])) { + $this->queryParams = $this->parseQuery($parts['query']); + } + } + + /** + * @param string $method Set he HTTP Method and normalize + * it to upper-case, as required by HTTP. + * + */ + public function setRequestMethod($method) + { + $this->requestMethod = strtoupper($method); + } + + /** + * @param array $headers The HTTP request headers + * to be set and normalized. + */ + public function setRequestHeaders($headers) + { + $headers = Google_Utils::normalize($headers); + if ($this->requestHeaders) { + $headers = array_merge($this->requestHeaders, $headers); + } + $this->requestHeaders = $headers; + } + + /** + * @param string $postBody the postBody to set + */ + public function setPostBody($postBody) + { + $this->postBody = $postBody; + } + + /** + * Set the User-Agent Header. + * @param string $userAgent The User-Agent. + */ + public function setUserAgent($userAgent) + { + $this->userAgent = $userAgent; + if ($this->canGzip) { + $this->userAgent = $userAgent . self::GZIP_UA; + } + } + + /** + * @return string The User-Agent. + */ + public function getUserAgent() + { + return $this->userAgent; + } + + /** + * Returns a cache key depending on if this was an OAuth signed request + * in which case it will use the non-signed url and access key to make this + * cache key unique per authenticated user, else use the plain request url + * @return string The md5 hash of the request cache key. + */ + public function getCacheKey() + { + $key = $this->getUrl(); + + if (isset($this->accessKey)) { + $key .= $this->accessKey; + } + + if (isset($this->requestHeaders['authorization'])) { + $key .= $this->requestHeaders['authorization']; + } + + return md5($key); + } + + public function getParsedCacheControl() + { + $parsed = array(); + $rawCacheControl = $this->getResponseHeader('cache-control'); + if ($rawCacheControl) { + $rawCacheControl = str_replace(', ', '&', $rawCacheControl); + parse_str($rawCacheControl, $parsed); + } + + return $parsed; + } + + /** + * @param string $id + * @return string A string representation of the HTTP Request. + */ + public function toBatchString($id) + { + $str = ''; + $path = parse_url($this->getUrl(), PHP_URL_PATH) . "?" . + http_build_query($this->queryParams); + $str .= $this->getRequestMethod() . ' ' . $path . " HTTP/1.1\n"; + + foreach ($this->getRequestHeaders() as $key => $val) { + $str .= $key . ': ' . $val . "\n"; + } + + if ($this->getPostBody()) { + $str .= "\n"; + $str .= $this->getPostBody(); + } + + $headers = ''; + foreach ($this->batchHeaders as $key => $val) { + $headers .= $key . ': ' . $val . "\n"; + } + + $headers .= "Content-ID: $id\n"; + $str = $headers . "\n" . $str; + + return $str; + } + + /** + * Our own version of parse_str that allows for multiple variables + * with the same name. + * @param $string - the query string to parse + */ + private function parseQuery($string) + { + $return = array(); + $parts = explode("&", $string); + foreach ($parts as $part) { + list($key, $value) = explode('=', $part, 2); + $value = urldecode($value); + if (isset($return[$key])) { + if (!is_array($return[$key])) { + $return[$key] = array($return[$key]); + } + $return[$key][] = $value; + } else { + $return[$key] = $value; + } + } + return $return; + } + + /** + * A version of build query that allows for multiple + * duplicate keys. + * @param $parts array of key value pairs + */ + private function buildQuery($parts) + { + $return = array(); + foreach ($parts as $key => $value) { + if (is_array($value)) { + foreach ($value as $v) { + $return[] = urlencode($key) . "=" . urlencode($v); + } + } else { + $return[] = urlencode($key) . "=" . urlencode($value); + } + } + return implode('&', $return); + } + + /** + * If we're POSTing and have no body to send, we can send the query + * parameters in there, which avoids length issues with longer query + * params. + */ + public function maybeMoveParametersToBody() + { + if ($this->getRequestMethod() == "POST" && empty($this->postBody)) { + $this->setRequestHeaders( + array( + "content-type" => + "application/x-www-form-urlencoded; charset=UTF-8" + ) + ); + $this->setPostBody($this->buildQuery($this->queryParams)); + $this->queryParams = array(); + } + } +} diff --git a/apps/files_external/3rdparty/google-api-php-client/src/Google/IO/Abstract.php b/apps/files_external/3rdparty/google-api-php-client/src/Google/IO/Abstract.php new file mode 100644 index 00000000000..a4025e874ad --- /dev/null +++ b/apps/files_external/3rdparty/google-api-php-client/src/Google/IO/Abstract.php @@ -0,0 +1,332 @@ +<?php +/* + * Copyright 2013 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Abstract IO base class + */ + +require_once 'Google/Client.php'; +require_once 'Google/IO/Exception.php'; +require_once 'Google/Http/CacheParser.php'; +require_once 'Google/Http/Request.php'; + +abstract class Google_IO_Abstract +{ + const UNKNOWN_CODE = 0; + const FORM_URLENCODED = 'application/x-www-form-urlencoded'; + private static $CONNECTION_ESTABLISHED_HEADERS = array( + "HTTP/1.0 200 Connection established\r\n\r\n", + "HTTP/1.1 200 Connection established\r\n\r\n", + ); + private static $ENTITY_HTTP_METHODS = array("POST" => null, "PUT" => null); + + /** @var Google_Client */ + protected $client; + + public function __construct(Google_Client $client) + { + $this->client = $client; + $timeout = $client->getClassConfig('Google_IO_Abstract', 'request_timeout_seconds'); + if ($timeout > 0) { + $this->setTimeout($timeout); + } + } + + /** + * Executes a Google_Http_Request and returns the resulting populated Google_Http_Request + * @param Google_Http_Request $request + * @return Google_Http_Request $request + */ + abstract public function executeRequest(Google_Http_Request $request); + + /** + * Set options that update the transport implementation's behavior. + * @param $options + */ + abstract public function setOptions($options); + + /** + * Set the maximum request time in seconds. + * @param $timeout in seconds + */ + abstract public function setTimeout($timeout); + + /** + * Get the maximum request time in seconds. + * @return timeout in seconds + */ + abstract public function getTimeout(); + + /** + * Test for the presence of a cURL header processing bug + * + * The cURL bug was present in versions prior to 7.30.0 and caused the header + * length to be miscalculated when a "Connection established" header added by + * some proxies was present. + * + * @return boolean + */ + abstract protected function needsQuirk(); + + /** + * @visible for testing. + * Cache the response to an HTTP request if it is cacheable. + * @param Google_Http_Request $request + * @return bool Returns true if the insertion was successful. + * Otherwise, return false. + */ + public function setCachedRequest(Google_Http_Request $request) + { + // Determine if the request is cacheable. + if (Google_Http_CacheParser::isResponseCacheable($request)) { + $this->client->getCache()->set($request->getCacheKey(), $request); + return true; + } + + return false; + } + + /** + * Execute an HTTP Request + * + * @param Google_HttpRequest $request the http request to be executed + * @return Google_HttpRequest http request with the response http code, + * response headers and response body filled in + * @throws Google_IO_Exception on curl or IO error + */ + public function makeRequest(Google_Http_Request $request) + { + // First, check to see if we have a valid cached version. + $cached = $this->getCachedRequest($request); + if ($cached !== false && $cached instanceof Google_Http_Request) { + if (!$this->checkMustRevalidateCachedRequest($cached, $request)) { + return $cached; + } + } + + if (array_key_exists($request->getRequestMethod(), self::$ENTITY_HTTP_METHODS)) { + $request = $this->processEntityRequest($request); + } + + list($responseData, $responseHeaders, $respHttpCode) = $this->executeRequest($request); + + if ($respHttpCode == 304 && $cached) { + // If the server responded NOT_MODIFIED, return the cached request. + $this->updateCachedRequest($cached, $responseHeaders); + return $cached; + } + + if (!isset($responseHeaders['Date']) && !isset($responseHeaders['date'])) { + $responseHeaders['Date'] = date("r"); + } + + $request->setResponseHttpCode($respHttpCode); + $request->setResponseHeaders($responseHeaders); + $request->setResponseBody($responseData); + // Store the request in cache (the function checks to see if the request + // can actually be cached) + $this->setCachedRequest($request); + return $request; + } + + /** + * @visible for testing. + * @param Google_Http_Request $request + * @return Google_Http_Request|bool Returns the cached object or + * false if the operation was unsuccessful. + */ + public function getCachedRequest(Google_Http_Request $request) + { + if (false === Google_Http_CacheParser::isRequestCacheable($request)) { + return false; + } + + return $this->client->getCache()->get($request->getCacheKey()); + } + + /** + * @visible for testing + * Process an http request that contains an enclosed entity. + * @param Google_Http_Request $request + * @return Google_Http_Request Processed request with the enclosed entity. + */ + public function processEntityRequest(Google_Http_Request $request) + { + $postBody = $request->getPostBody(); + $contentType = $request->getRequestHeader("content-type"); + + // Set the default content-type as application/x-www-form-urlencoded. + if (false == $contentType) { + $contentType = self::FORM_URLENCODED; + $request->setRequestHeaders(array('content-type' => $contentType)); + } + + // Force the payload to match the content-type asserted in the header. + if ($contentType == self::FORM_URLENCODED && is_array($postBody)) { + $postBody = http_build_query($postBody, '', '&'); + $request->setPostBody($postBody); + } + + // Make sure the content-length header is set. + if (!$postBody || is_string($postBody)) { + $postsLength = strlen($postBody); + $request->setRequestHeaders(array('content-length' => $postsLength)); + } + + return $request; + } + + /** + * Check if an already cached request must be revalidated, and if so update + * the request with the correct ETag headers. + * @param Google_Http_Request $cached A previously cached response. + * @param Google_Http_Request $request The outbound request. + * return bool If the cached object needs to be revalidated, false if it is + * still current and can be re-used. + */ + protected function checkMustRevalidateCachedRequest($cached, $request) + { + if (Google_Http_CacheParser::mustRevalidate($cached)) { + $addHeaders = array(); + if ($cached->getResponseHeader('etag')) { + // [13.3.4] If an entity tag has been provided by the origin server, + // we must use that entity tag in any cache-conditional request. + $addHeaders['If-None-Match'] = $cached->getResponseHeader('etag'); + } elseif ($cached->getResponseHeader('date')) { + $addHeaders['If-Modified-Since'] = $cached->getResponseHeader('date'); + } + + $request->setRequestHeaders($addHeaders); + return true; + } else { + return false; + } + } + + /** + * Update a cached request, using the headers from the last response. + * @param Google_HttpRequest $cached A previously cached response. + * @param mixed Associative array of response headers from the last request. + */ + protected function updateCachedRequest($cached, $responseHeaders) + { + if (isset($responseHeaders['connection'])) { + $hopByHop = array_merge( + self::$HOP_BY_HOP, + explode( + ',', + $responseHeaders['connection'] + ) + ); + + $endToEnd = array(); + foreach ($hopByHop as $key) { + if (isset($responseHeaders[$key])) { + $endToEnd[$key] = $responseHeaders[$key]; + } + } + $cached->setResponseHeaders($endToEnd); + } + } + + /** + * Used by the IO lib and also the batch processing. + * + * @param $respData + * @param $headerSize + * @return array + */ + public function parseHttpResponse($respData, $headerSize) + { + // check proxy header + foreach (self::$CONNECTION_ESTABLISHED_HEADERS as $established_header) { + if (stripos($respData, $established_header) !== false) { + // existed, remove it + $respData = str_ireplace($established_header, '', $respData); + // Subtract the proxy header size unless the cURL bug prior to 7.30.0 + // is present which prevented the proxy header size from being taken into + // account. + if (!$this->needsQuirk()) { + $headerSize -= strlen($established_header); + } + break; + } + } + + if ($headerSize) { + $responseBody = substr($respData, $headerSize); + $responseHeaders = substr($respData, 0, $headerSize); + } else { + $responseSegments = explode("\r\n\r\n", $respData, 2); + $responseHeaders = $responseSegments[0]; + $responseBody = isset($responseSegments[1]) ? $responseSegments[1] : + null; + } + + $responseHeaders = $this->getHttpResponseHeaders($responseHeaders); + return array($responseHeaders, $responseBody); + } + + /** + * Parse out headers from raw headers + * @param rawHeaders array or string + * @return array + */ + public function getHttpResponseHeaders($rawHeaders) + { + if (is_array($rawHeaders)) { + return $this->parseArrayHeaders($rawHeaders); + } else { + return $this->parseStringHeaders($rawHeaders); + } + } + + private function parseStringHeaders($rawHeaders) + { + $headers = array(); + $responseHeaderLines = explode("\r\n", $rawHeaders); + foreach ($responseHeaderLines as $headerLine) { + if ($headerLine && strpos($headerLine, ':') !== false) { + list($header, $value) = explode(': ', $headerLine, 2); + $header = strtolower($header); + if (isset($headers[$header])) { + $headers[$header] .= "\n" . $value; + } else { + $headers[$header] = $value; + } + } + } + return $headers; + } + + private function parseArrayHeaders($rawHeaders) + { + $header_count = count($rawHeaders); + $headers = array(); + + for ($i = 0; $i < $header_count; $i++) { + $header = $rawHeaders[$i]; + // Times will have colons in - so we just want the first match. + $header_parts = explode(': ', $header, 2); + if (count($header_parts) == 2) { + $headers[$header_parts[0]] = $header_parts[1]; + } + } + + return $headers; + } +} diff --git a/apps/files_external/3rdparty/google-api-php-client/src/Google/IO/Curl.php b/apps/files_external/3rdparty/google-api-php-client/src/Google/IO/Curl.php new file mode 100644 index 00000000000..57a057114cc --- /dev/null +++ b/apps/files_external/3rdparty/google-api-php-client/src/Google/IO/Curl.php @@ -0,0 +1,137 @@ +<?php +/* + * Copyright 2014 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Curl based implementation of Google_IO. + * + * @author Stuart Langley <slangley@google.com> + */ + +require_once 'Google/IO/Abstract.php'; + +class Google_IO_Curl extends Google_IO_Abstract +{ + // cURL hex representation of version 7.30.0 + const NO_QUIRK_VERSION = 0x071E00; + + private $options = array(); + /** + * Execute an HTTP Request + * + * @param Google_HttpRequest $request the http request to be executed + * @return Google_HttpRequest http request with the response http code, + * response headers and response body filled in + * @throws Google_IO_Exception on curl or IO error + */ + public function executeRequest(Google_Http_Request $request) + { + $curl = curl_init(); + + if ($request->getPostBody()) { + curl_setopt($curl, CURLOPT_POSTFIELDS, $request->getPostBody()); + } + + $requestHeaders = $request->getRequestHeaders(); + if ($requestHeaders && is_array($requestHeaders)) { + $curlHeaders = array(); + foreach ($requestHeaders as $k => $v) { + $curlHeaders[] = "$k: $v"; + } + curl_setopt($curl, CURLOPT_HTTPHEADER, $curlHeaders); + } + + curl_setopt($curl, CURLOPT_URL, $request->getUrl()); + + curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $request->getRequestMethod()); + curl_setopt($curl, CURLOPT_USERAGENT, $request->getUserAgent()); + + curl_setopt($curl, CURLOPT_FOLLOWLOCATION, false); + curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true); + curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); + curl_setopt($curl, CURLOPT_HEADER, true); + + if ($request->canGzip()) { + curl_setopt($curl, CURLOPT_ENCODING, 'gzip,deflate'); + } + + foreach ($this->options as $key => $var) { + curl_setopt($curl, $key, $var); + } + + if (!isset($this->options[CURLOPT_CAINFO])) { + curl_setopt($curl, CURLOPT_CAINFO, dirname(__FILE__) . '/cacerts.pem'); + } + + $response = curl_exec($curl); + if ($response === false) { + throw new Google_IO_Exception(curl_error($curl)); + } + $headerSize = curl_getinfo($curl, CURLINFO_HEADER_SIZE); + + list($responseHeaders, $responseBody) = $this->parseHttpResponse($response, $headerSize); + + $responseCode = curl_getinfo($curl, CURLINFO_HTTP_CODE); + + return array($responseBody, $responseHeaders, $responseCode); + } + + /** + * Set options that update the transport implementation's behavior. + * @param $options + */ + public function setOptions($options) + { + $this->options = $options + $this->options; + } + + /** + * Set the maximum request time in seconds. + * @param $timeout in seconds + */ + public function setTimeout($timeout) + { + // Since this timeout is really for putting a bound on the time + // we'll set them both to the same. If you need to specify a longer + // CURLOPT_TIMEOUT, or a tigher CONNECTTIMEOUT, the best thing to + // do is use the setOptions method for the values individually. + $this->options[CURLOPT_CONNECTTIMEOUT] = $timeout; + $this->options[CURLOPT_TIMEOUT] = $timeout; + } + + /** + * Get the maximum request time in seconds. + * @return timeout in seconds + */ + public function getTimeout() + { + return $this->options[CURLOPT_TIMEOUT]; + } + + /** + * Test for the presence of a cURL header processing bug + * + * {@inheritDoc} + * + * @return boolean + */ + protected function needsQuirk() + { + $ver = curl_version(); + $versionNum = $ver['version_number']; + return $versionNum < Google_IO_Curl::NO_QUIRK_VERSION; + } +} diff --git a/apps/files_external/3rdparty/google-api-php-client/src/Google/IO/Exception.php b/apps/files_external/3rdparty/google-api-php-client/src/Google/IO/Exception.php new file mode 100644 index 00000000000..28c2d8ce645 --- /dev/null +++ b/apps/files_external/3rdparty/google-api-php-client/src/Google/IO/Exception.php @@ -0,0 +1,22 @@ +<?php +/* + * Copyright 2013 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +require_once 'Google/Exception.php'; + +class Google_IO_Exception extends Google_Exception +{ +} diff --git a/apps/files_external/3rdparty/google-api-php-client/src/Google/IO/Stream.php b/apps/files_external/3rdparty/google-api-php-client/src/Google/IO/Stream.php new file mode 100644 index 00000000000..917578d87a0 --- /dev/null +++ b/apps/files_external/3rdparty/google-api-php-client/src/Google/IO/Stream.php @@ -0,0 +1,211 @@ +<?php +/* + * Copyright 2013 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Http Streams based implementation of Google_IO. + * + * @author Stuart Langley <slangley@google.com> + */ + +require_once 'Google/IO/Abstract.php'; + +class Google_IO_Stream extends Google_IO_Abstract +{ + const TIMEOUT = "timeout"; + const ZLIB = "compress.zlib://"; + private $options = array(); + private $trappedErrorNumber; + private $trappedErrorString; + + private static $DEFAULT_HTTP_CONTEXT = array( + "follow_location" => 0, + "ignore_errors" => 1, + ); + + private static $DEFAULT_SSL_CONTEXT = array( + "verify_peer" => true, + ); + + /** + * Execute an HTTP Request + * + * @param Google_HttpRequest $request the http request to be executed + * @return Google_HttpRequest http request with the response http code, + * response headers and response body filled in + * @throws Google_IO_Exception on curl or IO error + */ + public function executeRequest(Google_Http_Request $request) + { + $default_options = stream_context_get_options(stream_context_get_default()); + + $requestHttpContext = array_key_exists('http', $default_options) ? + $default_options['http'] : array(); + + if ($request->getPostBody()) { + $requestHttpContext["content"] = $request->getPostBody(); + } + + $requestHeaders = $request->getRequestHeaders(); + if ($requestHeaders && is_array($requestHeaders)) { + $headers = ""; + foreach ($requestHeaders as $k => $v) { + $headers .= "$k: $v\r\n"; + } + $requestHttpContext["header"] = $headers; + } + + $requestHttpContext["method"] = $request->getRequestMethod(); + $requestHttpContext["user_agent"] = $request->getUserAgent(); + + $requestSslContext = array_key_exists('ssl', $default_options) ? + $default_options['ssl'] : array(); + + if (!array_key_exists("cafile", $requestSslContext)) { + $requestSslContext["cafile"] = dirname(__FILE__) . '/cacerts.pem'; + } + + $options = array( + "http" => array_merge( + self::$DEFAULT_HTTP_CONTEXT, + $requestHttpContext + ), + "ssl" => array_merge( + self::$DEFAULT_SSL_CONTEXT, + $requestSslContext + ) + ); + + $context = stream_context_create($options); + + $url = $request->getUrl(); + + if ($request->canGzip()) { + $url = self::ZLIB . $url; + } + + // We are trapping any thrown errors in this method only and + // throwing an exception. + $this->trappedErrorNumber = null; + $this->trappedErrorString = null; + + // START - error trap. + set_error_handler(array($this, 'trapError')); + $fh = fopen($url, 'r', false, $context); + restore_error_handler(); + // END - error trap. + + if ($this->trappedErrorNumber) { + throw new Google_IO_Exception( + sprintf( + "HTTP Error: Unable to connect: '%s'", + $this->trappedErrorString + ), + $this->trappedErrorNumber + ); + } + + $response_data = false; + $respHttpCode = self::UNKNOWN_CODE; + if ($fh) { + if (isset($this->options[self::TIMEOUT])) { + stream_set_timeout($fh, $this->options[self::TIMEOUT]); + } + + $response_data = stream_get_contents($fh); + fclose($fh); + + $respHttpCode = $this->getHttpResponseCode($http_response_header); + } + + if (false === $response_data) { + throw new Google_IO_Exception( + sprintf( + "HTTP Error: Unable to connect: '%s'", + $respHttpCode + ), + $respHttpCode + ); + } + + $responseHeaders = $this->getHttpResponseHeaders($http_response_header); + + return array($response_data, $responseHeaders, $respHttpCode); + } + + /** + * Set options that update the transport implementation's behavior. + * @param $options + */ + public function setOptions($options) + { + $this->options = $options + $this->options; + } + + /** + * Method to handle errors, used for error handling around + * stream connection methods. + */ + public function trapError($errno, $errstr) + { + $this->trappedErrorNumber = $errno; + $this->trappedErrorString = $errstr; + } + + /** + * Set the maximum request time in seconds. + * @param $timeout in seconds + */ + public function setTimeout($timeout) + { + $this->options[self::TIMEOUT] = $timeout; + } + + /** + * Get the maximum request time in seconds. + * @return timeout in seconds + */ + public function getTimeout() + { + return $this->options[self::TIMEOUT]; + } + + /** + * Test for the presence of a cURL header processing bug + * + * {@inheritDoc} + * + * @return boolean + */ + protected function needsQuirk() + { + return false; + } + + protected function getHttpResponseCode($response_headers) + { + $header_count = count($response_headers); + + for ($i = 0; $i < $header_count; $i++) { + $header = $response_headers[$i]; + if (strncasecmp("HTTP", $header, strlen("HTTP")) == 0) { + $response = explode(' ', $header); + return $response[1]; + } + } + return self::UNKNOWN_CODE; + } +} diff --git a/apps/files_external/3rdparty/google-api-php-client/src/io/cacerts.pem b/apps/files_external/3rdparty/google-api-php-client/src/Google/IO/cacerts.pem index da36ed1ba6d..79a49289cbe 100644 --- a/apps/files_external/3rdparty/google-api-php-client/src/io/cacerts.pem +++ b/apps/files_external/3rdparty/google-api-php-client/src/Google/IO/cacerts.pem @@ -712,3 +712,27 @@ IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd -----END CERTIFICATE----- +GeoTrust Global CA +================== + +-----BEGIN CERTIFICATE----- +MIIDfTCCAuagAwIBAgIDErvmMA0GCSqGSIb3DQEBBQUAME4xCzAJBgNVBAYTAlVT +MRAwDgYDVQQKEwdFcXVpZmF4MS0wKwYDVQQLEyRFcXVpZmF4IFNlY3VyZSBDZXJ0 +aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDIwNTIxMDQwMDAwWhcNMTgwODIxMDQwMDAw +WjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UE +AxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9m +OSm9BXiLnTjoBbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIu +T8rxh0PBFpVXLVDviS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6c +JmTM386DGXHKTubU1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmR +Cw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5asz +PeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo4HwMIHtMB8GA1UdIwQYMBaAFEjm +aPkr0rKV10fYIyAQTzOYkJ/UMB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrM +TjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjA6BgNVHR8EMzAxMC+g +LaArhilodHRwOi8vY3JsLmdlb3RydXN0LmNvbS9jcmxzL3NlY3VyZWNhLmNybDBO +BgNVHSAERzBFMEMGBFUdIAAwOzA5BggrBgEFBQcCARYtaHR0cHM6Ly93d3cuZ2Vv +dHJ1c3QuY29tL3Jlc291cmNlcy9yZXBvc2l0b3J5MA0GCSqGSIb3DQEBBQUAA4GB +AHbhEm5OSxYShjAGsoEIz/AIx8dxfmbuwu3UOx//8PDITtZDOLC5MH0Y0FWDomrL +NhGc6Ehmo21/uBPUR/6LWlxz/K7ZGzIZOKuXNBSqltLroxwUCEm2u+WR74M26x1W +b8ravHNjkOR/ez4iyz0H7V84dJzjA1BOoa+Y7mHyhD8S +-----END CERTIFICATE----- diff --git a/apps/files_external/3rdparty/google-api-php-client/src/Google/Model.php b/apps/files_external/3rdparty/google-api-php-client/src/Google/Model.php new file mode 100644 index 00000000000..2bb9a333d66 --- /dev/null +++ b/apps/files_external/3rdparty/google-api-php-client/src/Google/Model.php @@ -0,0 +1,265 @@ +<?php +/* + * Copyright 2011 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * This class defines attributes, valid values, and usage which is generated + * from a given json schema. + * http://tools.ietf.org/html/draft-zyp-json-schema-03#section-5 + * + * @author Chirag Shah <chirags@google.com> + * + */ +class Google_Model implements ArrayAccess +{ + protected $internal_gapi_mappings = array(); + protected $modelData = array(); + protected $processed = array(); + + /** + * Polymorphic - accepts a variable number of arguments dependent + * on the type of the model subclass. + */ + public function __construct() + { + if (func_num_args() == 1 && is_array(func_get_arg(0))) { + // Initialize the model with the array's contents. + $array = func_get_arg(0); + $this->mapTypes($array); + } + } + + public function __get($key) + { + $keyTypeName = $this->keyType($key); + $keyDataType = $this->dataType($key); + if (isset($this->$keyTypeName) && !isset($this->processed[$key])) { + if (isset($this->modelData[$key])) { + $val = $this->modelData[$key]; + } else if (isset($this->$keyDataType) && + ($this->$keyDataType == 'array' || $this->$keyDataType == 'map')) { + $val = array(); + } else { + $val = null; + } + + if ($this->isAssociativeArray($val)) { + if (isset($this->$keyDataType) && 'map' == $this->$keyDataType) { + foreach ($val as $arrayKey => $arrayItem) { + $this->modelData[$key][$arrayKey] = + $this->createObjectFromName($keyTypeName, $arrayItem); + } + } else { + $this->modelData[$key] = $this->createObjectFromName($keyTypeName, $val); + } + } else if (is_array($val)) { + $arrayObject = array(); + foreach ($val as $arrayIndex => $arrayItem) { + $arrayObject[$arrayIndex] = + $this->createObjectFromName($keyTypeName, $arrayItem); + } + $this->modelData[$key] = $arrayObject; + } + $this->processed[$key] = true; + } + + return isset($this->modelData[$key]) ? $this->modelData[$key] : null; + } + + /** + * Initialize this object's properties from an array. + * + * @param array $array Used to seed this object's properties. + * @return void + */ + protected function mapTypes($array) + { + // Hard initilise simple types, lazy load more complex ones. + foreach ($array as $key => $val) { + if ( !property_exists($this, $this->keyType($key)) && + property_exists($this, $key)) { + $this->$key = $val; + unset($array[$key]); + } elseif (property_exists($this, $camelKey = Google_Utils::camelCase($key))) { + // This checks if property exists as camelCase, leaving it in array as snake_case + // in case of backwards compatibility issues. + $this->$camelKey = $val; + } + } + $this->modelData = $array; + } + + /** + * Create a simplified object suitable for straightforward + * conversion to JSON. This is relatively expensive + * due to the usage of reflection, but shouldn't be called + * a whole lot, and is the most straightforward way to filter. + */ + public function toSimpleObject() + { + $object = new stdClass(); + + // Process all other data. + foreach ($this->modelData as $key => $val) { + $result = $this->getSimpleValue($val); + if ($result !== null) { + $object->$key = $result; + } + } + + // Process all public properties. + $reflect = new ReflectionObject($this); + $props = $reflect->getProperties(ReflectionProperty::IS_PUBLIC); + foreach ($props as $member) { + $name = $member->getName(); + $result = $this->getSimpleValue($this->$name); + if ($result !== null) { + $name = $this->getMappedName($name); + $object->$name = $result; + } + } + + return $object; + } + + /** + * Handle different types of values, primarily + * other objects and map and array data types. + */ + private function getSimpleValue($value) + { + if ($value instanceof Google_Model) { + return $value->toSimpleObject(); + } else if (is_array($value)) { + $return = array(); + foreach ($value as $key => $a_value) { + $a_value = $this->getSimpleValue($a_value); + if ($a_value !== null) { + $key = $this->getMappedName($key); + $return[$key] = $a_value; + } + } + return $return; + } + return $value; + } + + /** + * If there is an internal name mapping, use that. + */ + private function getMappedName($key) + { + if (isset($this->internal_gapi_mappings) && + isset($this->internal_gapi_mappings[$key])) { + $key = $this->internal_gapi_mappings[$key]; + } + return $key; + } + + /** + * Returns true only if the array is associative. + * @param array $array + * @return bool True if the array is associative. + */ + protected function isAssociativeArray($array) + { + if (!is_array($array)) { + return false; + } + $keys = array_keys($array); + foreach ($keys as $key) { + if (is_string($key)) { + return true; + } + } + return false; + } + + /** + * Given a variable name, discover its type. + * + * @param $name + * @param $item + * @return object The object from the item. + */ + private function createObjectFromName($name, $item) + { + $type = $this->$name; + return new $type($item); + } + + /** + * Verify if $obj is an array. + * @throws Google_Exception Thrown if $obj isn't an array. + * @param array $obj Items that should be validated. + * @param string $method Method expecting an array as an argument. + */ + public function assertIsArray($obj, $method) + { + if ($obj && !is_array($obj)) { + throw new Google_Exception( + "Incorrect parameter type passed to $method(). Expected an array." + ); + } + } + + public function offsetExists($offset) + { + return isset($this->$offset) || isset($this->modelData[$offset]); + } + + public function offsetGet($offset) + { + return isset($this->$offset) ? + $this->$offset : + $this->__get($offset); + } + + public function offsetSet($offset, $value) + { + if (property_exists($this, $offset)) { + $this->$offset = $value; + } else { + $this->modelData[$offset] = $value; + $this->processed[$offset] = true; + } + } + + public function offsetUnset($offset) + { + unset($this->modelData[$offset]); + } + + protected function keyType($key) + { + return $key . "Type"; + } + + protected function dataType($key) + { + return $key . "DataType"; + } + + public function __isset($key) + { + return isset($this->modelData[$key]); + } + + public function __unset($key) + { + unset($this->modelData[$key]); + } +} diff --git a/apps/files_external/3rdparty/google-api-php-client/src/Google/Service.php b/apps/files_external/3rdparty/google-api-php-client/src/Google/Service.php new file mode 100644 index 00000000000..2e0b6c52282 --- /dev/null +++ b/apps/files_external/3rdparty/google-api-php-client/src/Google/Service.php @@ -0,0 +1,39 @@ +<?php +/* + * Copyright 2010 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +class Google_Service +{ + public $version; + public $servicePath; + public $availableScopes; + public $resource; + private $client; + + public function __construct(Google_Client $client) + { + $this->client = $client; + } + + /** + * Return the associated Google_Client class. + * @return Google_Client + */ + public function getClient() + { + return $this->client; + } +} diff --git a/apps/files_external/3rdparty/google-api-php-client/src/Google/Service/Drive.php b/apps/files_external/3rdparty/google-api-php-client/src/Google/Service/Drive.php new file mode 100644 index 00000000000..291a6091232 --- /dev/null +++ b/apps/files_external/3rdparty/google-api-php-client/src/Google/Service/Drive.php @@ -0,0 +1,6136 @@ +<?php +/* + * Copyright 2010 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + */ + +/** + * Service definition for Drive (v2). + * + * <p> + * The API to interact with Drive. + * </p> + * + * <p> + * For more information about this service, see the API + * <a href="https://developers.google.com/drive/" target="_blank">Documentation</a> + * </p> + * + * @author Google, Inc. + */ +class Google_Service_Drive extends Google_Service +{ + /** View and manage the files and documents in your Google Drive. */ + const DRIVE = "https://www.googleapis.com/auth/drive"; + /** View and manage its own configuration data in your Google Drive. */ + const DRIVE_APPDATA = "https://www.googleapis.com/auth/drive.appdata"; + /** View your Google Drive apps. */ + const DRIVE_APPS_READONLY = "https://www.googleapis.com/auth/drive.apps.readonly"; + /** View and manage Google Drive files that you have opened or created with this app. */ + const DRIVE_FILE = "https://www.googleapis.com/auth/drive.file"; + /** View metadata for files and documents in your Google Drive. */ + const DRIVE_METADATA_READONLY = "https://www.googleapis.com/auth/drive.metadata.readonly"; + /** View the files and documents in your Google Drive. */ + const DRIVE_READONLY = "https://www.googleapis.com/auth/drive.readonly"; + /** Modify your Google Apps Script scripts' behavior. */ + const DRIVE_SCRIPTS = "https://www.googleapis.com/auth/drive.scripts"; + + public $about; + public $apps; + public $changes; + public $channels; + public $children; + public $comments; + public $files; + public $parents; + public $permissions; + public $properties; + public $realtime; + public $replies; + public $revisions; + + + /** + * Constructs the internal representation of the Drive service. + * + * @param Google_Client $client + */ + public function __construct(Google_Client $client) + { + parent::__construct($client); + $this->servicePath = 'drive/v2/'; + $this->version = 'v2'; + $this->serviceName = 'drive'; + + $this->about = new Google_Service_Drive_About_Resource( + $this, + $this->serviceName, + 'about', + array( + 'methods' => array( + 'get' => array( + 'path' => 'about', + 'httpMethod' => 'GET', + 'parameters' => array( + 'includeSubscribed' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + 'maxChangeIdCount' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'startChangeId' => array( + 'location' => 'query', + 'type' => 'string', + ), + ), + ), + ) + ) + ); + $this->apps = new Google_Service_Drive_Apps_Resource( + $this, + $this->serviceName, + 'apps', + array( + 'methods' => array( + 'get' => array( + 'path' => 'apps/{appId}', + 'httpMethod' => 'GET', + 'parameters' => array( + 'appId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'list' => array( + 'path' => 'apps', + 'httpMethod' => 'GET', + 'parameters' => array( + 'languageCode' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'appFilterExtensions' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'appFilterMimeTypes' => array( + 'location' => 'query', + 'type' => 'string', + ), + ), + ), + ) + ) + ); + $this->changes = new Google_Service_Drive_Changes_Resource( + $this, + $this->serviceName, + 'changes', + array( + 'methods' => array( + 'get' => array( + 'path' => 'changes/{changeId}', + 'httpMethod' => 'GET', + 'parameters' => array( + 'changeId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'list' => array( + 'path' => 'changes', + 'httpMethod' => 'GET', + 'parameters' => array( + 'includeSubscribed' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + 'startChangeId' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'includeDeleted' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + 'maxResults' => array( + 'location' => 'query', + 'type' => 'integer', + ), + 'pageToken' => array( + 'location' => 'query', + 'type' => 'string', + ), + ), + ),'watch' => array( + 'path' => 'changes/watch', + 'httpMethod' => 'POST', + 'parameters' => array( + 'includeSubscribed' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + 'startChangeId' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'includeDeleted' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + 'maxResults' => array( + 'location' => 'query', + 'type' => 'integer', + ), + 'pageToken' => array( + 'location' => 'query', + 'type' => 'string', + ), + ), + ), + ) + ) + ); + $this->channels = new Google_Service_Drive_Channels_Resource( + $this, + $this->serviceName, + 'channels', + array( + 'methods' => array( + 'stop' => array( + 'path' => 'channels/stop', + 'httpMethod' => 'POST', + 'parameters' => array(), + ), + ) + ) + ); + $this->children = new Google_Service_Drive_Children_Resource( + $this, + $this->serviceName, + 'children', + array( + 'methods' => array( + 'delete' => array( + 'path' => 'files/{folderId}/children/{childId}', + 'httpMethod' => 'DELETE', + 'parameters' => array( + 'folderId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'childId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'get' => array( + 'path' => 'files/{folderId}/children/{childId}', + 'httpMethod' => 'GET', + 'parameters' => array( + 'folderId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'childId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'insert' => array( + 'path' => 'files/{folderId}/children', + 'httpMethod' => 'POST', + 'parameters' => array( + 'folderId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'list' => array( + 'path' => 'files/{folderId}/children', + 'httpMethod' => 'GET', + 'parameters' => array( + 'folderId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'q' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'pageToken' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'maxResults' => array( + 'location' => 'query', + 'type' => 'integer', + ), + ), + ), + ) + ) + ); + $this->comments = new Google_Service_Drive_Comments_Resource( + $this, + $this->serviceName, + 'comments', + array( + 'methods' => array( + 'delete' => array( + 'path' => 'files/{fileId}/comments/{commentId}', + 'httpMethod' => 'DELETE', + 'parameters' => array( + 'fileId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'commentId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'get' => array( + 'path' => 'files/{fileId}/comments/{commentId}', + 'httpMethod' => 'GET', + 'parameters' => array( + 'fileId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'commentId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'includeDeleted' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + ), + ),'insert' => array( + 'path' => 'files/{fileId}/comments', + 'httpMethod' => 'POST', + 'parameters' => array( + 'fileId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'list' => array( + 'path' => 'files/{fileId}/comments', + 'httpMethod' => 'GET', + 'parameters' => array( + 'fileId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'pageToken' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'updatedMin' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'includeDeleted' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + 'maxResults' => array( + 'location' => 'query', + 'type' => 'integer', + ), + ), + ),'patch' => array( + 'path' => 'files/{fileId}/comments/{commentId}', + 'httpMethod' => 'PATCH', + 'parameters' => array( + 'fileId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'commentId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'update' => array( + 'path' => 'files/{fileId}/comments/{commentId}', + 'httpMethod' => 'PUT', + 'parameters' => array( + 'fileId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'commentId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ), + ) + ) + ); + $this->files = new Google_Service_Drive_Files_Resource( + $this, + $this->serviceName, + 'files', + array( + 'methods' => array( + 'copy' => array( + 'path' => 'files/{fileId}/copy', + 'httpMethod' => 'POST', + 'parameters' => array( + 'fileId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'convert' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + 'ocrLanguage' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'visibility' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'pinned' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + 'ocr' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + 'timedTextTrackName' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'timedTextLanguage' => array( + 'location' => 'query', + 'type' => 'string', + ), + ), + ),'delete' => array( + 'path' => 'files/{fileId}', + 'httpMethod' => 'DELETE', + 'parameters' => array( + 'fileId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'emptyTrash' => array( + 'path' => 'files/trash', + 'httpMethod' => 'DELETE', + 'parameters' => array(), + ),'get' => array( + 'path' => 'files/{fileId}', + 'httpMethod' => 'GET', + 'parameters' => array( + 'fileId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'updateViewedDate' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + 'projection' => array( + 'location' => 'query', + 'type' => 'string', + ), + ), + ),'insert' => array( + 'path' => 'files', + 'httpMethod' => 'POST', + 'parameters' => array( + 'convert' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + 'useContentAsIndexableText' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + 'ocrLanguage' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'visibility' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'pinned' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + 'ocr' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + 'timedTextTrackName' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'timedTextLanguage' => array( + 'location' => 'query', + 'type' => 'string', + ), + ), + ),'list' => array( + 'path' => 'files', + 'httpMethod' => 'GET', + 'parameters' => array( + 'q' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'pageToken' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'corpus' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'projection' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'maxResults' => array( + 'location' => 'query', + 'type' => 'integer', + ), + ), + ),'patch' => array( + 'path' => 'files/{fileId}', + 'httpMethod' => 'PATCH', + 'parameters' => array( + 'fileId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'addParents' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'updateViewedDate' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + 'removeParents' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'setModifiedDate' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + 'convert' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + 'useContentAsIndexableText' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + 'ocrLanguage' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'pinned' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + 'newRevision' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + 'ocr' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + 'timedTextLanguage' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'timedTextTrackName' => array( + 'location' => 'query', + 'type' => 'string', + ), + ), + ),'touch' => array( + 'path' => 'files/{fileId}/touch', + 'httpMethod' => 'POST', + 'parameters' => array( + 'fileId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'trash' => array( + 'path' => 'files/{fileId}/trash', + 'httpMethod' => 'POST', + 'parameters' => array( + 'fileId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'untrash' => array( + 'path' => 'files/{fileId}/untrash', + 'httpMethod' => 'POST', + 'parameters' => array( + 'fileId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'update' => array( + 'path' => 'files/{fileId}', + 'httpMethod' => 'PUT', + 'parameters' => array( + 'fileId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'addParents' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'updateViewedDate' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + 'removeParents' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'setModifiedDate' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + 'convert' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + 'useContentAsIndexableText' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + 'ocrLanguage' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'pinned' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + 'newRevision' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + 'ocr' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + 'timedTextLanguage' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'timedTextTrackName' => array( + 'location' => 'query', + 'type' => 'string', + ), + ), + ),'watch' => array( + 'path' => 'files/{fileId}/watch', + 'httpMethod' => 'POST', + 'parameters' => array( + 'fileId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'updateViewedDate' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + 'projection' => array( + 'location' => 'query', + 'type' => 'string', + ), + ), + ), + ) + ) + ); + $this->parents = new Google_Service_Drive_Parents_Resource( + $this, + $this->serviceName, + 'parents', + array( + 'methods' => array( + 'delete' => array( + 'path' => 'files/{fileId}/parents/{parentId}', + 'httpMethod' => 'DELETE', + 'parameters' => array( + 'fileId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'parentId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'get' => array( + 'path' => 'files/{fileId}/parents/{parentId}', + 'httpMethod' => 'GET', + 'parameters' => array( + 'fileId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'parentId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'insert' => array( + 'path' => 'files/{fileId}/parents', + 'httpMethod' => 'POST', + 'parameters' => array( + 'fileId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'list' => array( + 'path' => 'files/{fileId}/parents', + 'httpMethod' => 'GET', + 'parameters' => array( + 'fileId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ), + ) + ) + ); + $this->permissions = new Google_Service_Drive_Permissions_Resource( + $this, + $this->serviceName, + 'permissions', + array( + 'methods' => array( + 'delete' => array( + 'path' => 'files/{fileId}/permissions/{permissionId}', + 'httpMethod' => 'DELETE', + 'parameters' => array( + 'fileId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'permissionId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'get' => array( + 'path' => 'files/{fileId}/permissions/{permissionId}', + 'httpMethod' => 'GET', + 'parameters' => array( + 'fileId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'permissionId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'getIdForEmail' => array( + 'path' => 'permissionIds/{email}', + 'httpMethod' => 'GET', + 'parameters' => array( + 'email' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'insert' => array( + 'path' => 'files/{fileId}/permissions', + 'httpMethod' => 'POST', + 'parameters' => array( + 'fileId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'emailMessage' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'sendNotificationEmails' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + ), + ),'list' => array( + 'path' => 'files/{fileId}/permissions', + 'httpMethod' => 'GET', + 'parameters' => array( + 'fileId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'patch' => array( + 'path' => 'files/{fileId}/permissions/{permissionId}', + 'httpMethod' => 'PATCH', + 'parameters' => array( + 'fileId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'permissionId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'transferOwnership' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + ), + ),'update' => array( + 'path' => 'files/{fileId}/permissions/{permissionId}', + 'httpMethod' => 'PUT', + 'parameters' => array( + 'fileId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'permissionId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'transferOwnership' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + ), + ), + ) + ) + ); + $this->properties = new Google_Service_Drive_Properties_Resource( + $this, + $this->serviceName, + 'properties', + array( + 'methods' => array( + 'delete' => array( + 'path' => 'files/{fileId}/properties/{propertyKey}', + 'httpMethod' => 'DELETE', + 'parameters' => array( + 'fileId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'propertyKey' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'visibility' => array( + 'location' => 'query', + 'type' => 'string', + ), + ), + ),'get' => array( + 'path' => 'files/{fileId}/properties/{propertyKey}', + 'httpMethod' => 'GET', + 'parameters' => array( + 'fileId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'propertyKey' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'visibility' => array( + 'location' => 'query', + 'type' => 'string', + ), + ), + ),'insert' => array( + 'path' => 'files/{fileId}/properties', + 'httpMethod' => 'POST', + 'parameters' => array( + 'fileId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'list' => array( + 'path' => 'files/{fileId}/properties', + 'httpMethod' => 'GET', + 'parameters' => array( + 'fileId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'patch' => array( + 'path' => 'files/{fileId}/properties/{propertyKey}', + 'httpMethod' => 'PATCH', + 'parameters' => array( + 'fileId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'propertyKey' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'visibility' => array( + 'location' => 'query', + 'type' => 'string', + ), + ), + ),'update' => array( + 'path' => 'files/{fileId}/properties/{propertyKey}', + 'httpMethod' => 'PUT', + 'parameters' => array( + 'fileId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'propertyKey' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'visibility' => array( + 'location' => 'query', + 'type' => 'string', + ), + ), + ), + ) + ) + ); + $this->realtime = new Google_Service_Drive_Realtime_Resource( + $this, + $this->serviceName, + 'realtime', + array( + 'methods' => array( + 'get' => array( + 'path' => 'files/{fileId}/realtime', + 'httpMethod' => 'GET', + 'parameters' => array( + 'fileId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'revision' => array( + 'location' => 'query', + 'type' => 'integer', + ), + ), + ),'update' => array( + 'path' => 'files/{fileId}/realtime', + 'httpMethod' => 'PUT', + 'parameters' => array( + 'fileId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'baseRevision' => array( + 'location' => 'query', + 'type' => 'string', + ), + ), + ), + ) + ) + ); + $this->replies = new Google_Service_Drive_Replies_Resource( + $this, + $this->serviceName, + 'replies', + array( + 'methods' => array( + 'delete' => array( + 'path' => 'files/{fileId}/comments/{commentId}/replies/{replyId}', + 'httpMethod' => 'DELETE', + 'parameters' => array( + 'fileId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'commentId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'replyId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'get' => array( + 'path' => 'files/{fileId}/comments/{commentId}/replies/{replyId}', + 'httpMethod' => 'GET', + 'parameters' => array( + 'fileId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'commentId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'replyId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'includeDeleted' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + ), + ),'insert' => array( + 'path' => 'files/{fileId}/comments/{commentId}/replies', + 'httpMethod' => 'POST', + 'parameters' => array( + 'fileId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'commentId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'list' => array( + 'path' => 'files/{fileId}/comments/{commentId}/replies', + 'httpMethod' => 'GET', + 'parameters' => array( + 'fileId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'commentId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'pageToken' => array( + 'location' => 'query', + 'type' => 'string', + ), + 'includeDeleted' => array( + 'location' => 'query', + 'type' => 'boolean', + ), + 'maxResults' => array( + 'location' => 'query', + 'type' => 'integer', + ), + ), + ),'patch' => array( + 'path' => 'files/{fileId}/comments/{commentId}/replies/{replyId}', + 'httpMethod' => 'PATCH', + 'parameters' => array( + 'fileId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'commentId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'replyId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'update' => array( + 'path' => 'files/{fileId}/comments/{commentId}/replies/{replyId}', + 'httpMethod' => 'PUT', + 'parameters' => array( + 'fileId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'commentId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'replyId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ), + ) + ) + ); + $this->revisions = new Google_Service_Drive_Revisions_Resource( + $this, + $this->serviceName, + 'revisions', + array( + 'methods' => array( + 'delete' => array( + 'path' => 'files/{fileId}/revisions/{revisionId}', + 'httpMethod' => 'DELETE', + 'parameters' => array( + 'fileId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'revisionId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'get' => array( + 'path' => 'files/{fileId}/revisions/{revisionId}', + 'httpMethod' => 'GET', + 'parameters' => array( + 'fileId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'revisionId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'list' => array( + 'path' => 'files/{fileId}/revisions', + 'httpMethod' => 'GET', + 'parameters' => array( + 'fileId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'patch' => array( + 'path' => 'files/{fileId}/revisions/{revisionId}', + 'httpMethod' => 'PATCH', + 'parameters' => array( + 'fileId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'revisionId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ),'update' => array( + 'path' => 'files/{fileId}/revisions/{revisionId}', + 'httpMethod' => 'PUT', + 'parameters' => array( + 'fileId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + 'revisionId' => array( + 'location' => 'path', + 'type' => 'string', + 'required' => true, + ), + ), + ), + ) + ) + ); + } +} + + +/** + * The "about" collection of methods. + * Typical usage is: + * <code> + * $driveService = new Google_Service_Drive(...); + * $about = $driveService->about; + * </code> + */ +class Google_Service_Drive_About_Resource extends Google_Service_Resource +{ + + /** + * Gets the information about the current user along with Drive API settings + * (about.get) + * + * @param array $optParams Optional parameters. + * + * @opt_param bool includeSubscribed + * When calculating the number of remaining change IDs, whether to include public files the user + * has opened and shared files. When set to false, this counts only change IDs for owned files and + * any shared or public files that the user has explicitly added to a folder they own. + * @opt_param string maxChangeIdCount + * Maximum number of remaining change IDs to count + * @opt_param string startChangeId + * Change ID to start counting from when calculating number of remaining change IDs + * @return Google_Service_Drive_About + */ + public function get($optParams = array()) + { + $params = array(); + $params = array_merge($params, $optParams); + return $this->call('get', array($params), "Google_Service_Drive_About"); + } +} + +/** + * The "apps" collection of methods. + * Typical usage is: + * <code> + * $driveService = new Google_Service_Drive(...); + * $apps = $driveService->apps; + * </code> + */ +class Google_Service_Drive_Apps_Resource extends Google_Service_Resource +{ + + /** + * Gets a specific app. (apps.get) + * + * @param string $appId + * The ID of the app. + * @param array $optParams Optional parameters. + * @return Google_Service_Drive_App + */ + public function get($appId, $optParams = array()) + { + $params = array('appId' => $appId); + $params = array_merge($params, $optParams); + return $this->call('get', array($params), "Google_Service_Drive_App"); + } + /** + * Lists a user's installed apps. (apps.listApps) + * + * @param array $optParams Optional parameters. + * + * @opt_param string languageCode + * A language or locale code, as defined by BCP 47, with some extensions from Unicode's LDML format + * (http://www.unicode.org/reports/tr35/). + * @opt_param string appFilterExtensions + * A comma-separated list of file extensions for open with filtering. All apps within the given app + * query scope which can open any of the given file extensions will be included in the response. If + * appFilterMimeTypes are provided as well, the result is a union of the two resulting app lists. + * @opt_param string appFilterMimeTypes + * A comma-separated list of MIME types for open with filtering. All apps within the given app + * query scope which can open any of the given MIME types will be included in the response. If + * appFilterExtensions are provided as well, the result is a union of the two resulting app lists. + * @return Google_Service_Drive_AppList + */ + public function listApps($optParams = array()) + { + $params = array(); + $params = array_merge($params, $optParams); + return $this->call('list', array($params), "Google_Service_Drive_AppList"); + } +} + +/** + * The "changes" collection of methods. + * Typical usage is: + * <code> + * $driveService = new Google_Service_Drive(...); + * $changes = $driveService->changes; + * </code> + */ +class Google_Service_Drive_Changes_Resource extends Google_Service_Resource +{ + + /** + * Gets a specific change. (changes.get) + * + * @param string $changeId + * The ID of the change. + * @param array $optParams Optional parameters. + * @return Google_Service_Drive_Change + */ + public function get($changeId, $optParams = array()) + { + $params = array('changeId' => $changeId); + $params = array_merge($params, $optParams); + return $this->call('get', array($params), "Google_Service_Drive_Change"); + } + /** + * Lists the changes for a user. (changes.listChanges) + * + * @param array $optParams Optional parameters. + * + * @opt_param bool includeSubscribed + * Whether to include public files the user has opened and shared files. When set to false, the + * list only includes owned files plus any shared or public files the user has explicitly added to + * a folder they own. + * @opt_param string startChangeId + * Change ID to start listing changes from. + * @opt_param bool includeDeleted + * Whether to include deleted items. + * @opt_param int maxResults + * Maximum number of changes to return. + * @opt_param string pageToken + * Page token for changes. + * @return Google_Service_Drive_ChangeList + */ + public function listChanges($optParams = array()) + { + $params = array(); + $params = array_merge($params, $optParams); + return $this->call('list', array($params), "Google_Service_Drive_ChangeList"); + } + /** + * Subscribe to changes for a user. (changes.watch) + * + * @param Google_Channel $postBody + * @param array $optParams Optional parameters. + * + * @opt_param bool includeSubscribed + * Whether to include public files the user has opened and shared files. When set to false, the + * list only includes owned files plus any shared or public files the user has explicitly added to + * a folder they own. + * @opt_param string startChangeId + * Change ID to start listing changes from. + * @opt_param bool includeDeleted + * Whether to include deleted items. + * @opt_param int maxResults + * Maximum number of changes to return. + * @opt_param string pageToken + * Page token for changes. + * @return Google_Service_Drive_Channel + */ + public function watch(Google_Service_Drive_Channel $postBody, $optParams = array()) + { + $params = array('postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('watch', array($params), "Google_Service_Drive_Channel"); + } +} + +/** + * The "channels" collection of methods. + * Typical usage is: + * <code> + * $driveService = new Google_Service_Drive(...); + * $channels = $driveService->channels; + * </code> + */ +class Google_Service_Drive_Channels_Resource extends Google_Service_Resource +{ + + /** + * Stop watching resources through this channel (channels.stop) + * + * @param Google_Channel $postBody + * @param array $optParams Optional parameters. + */ + public function stop(Google_Service_Drive_Channel $postBody, $optParams = array()) + { + $params = array('postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('stop', array($params)); + } +} + +/** + * The "children" collection of methods. + * Typical usage is: + * <code> + * $driveService = new Google_Service_Drive(...); + * $children = $driveService->children; + * </code> + */ +class Google_Service_Drive_Children_Resource extends Google_Service_Resource +{ + + /** + * Removes a child from a folder. (children.delete) + * + * @param string $folderId + * The ID of the folder. + * @param string $childId + * The ID of the child. + * @param array $optParams Optional parameters. + */ + public function delete($folderId, $childId, $optParams = array()) + { + $params = array('folderId' => $folderId, 'childId' => $childId); + $params = array_merge($params, $optParams); + return $this->call('delete', array($params)); + } + /** + * Gets a specific child reference. (children.get) + * + * @param string $folderId + * The ID of the folder. + * @param string $childId + * The ID of the child. + * @param array $optParams Optional parameters. + * @return Google_Service_Drive_ChildReference + */ + public function get($folderId, $childId, $optParams = array()) + { + $params = array('folderId' => $folderId, 'childId' => $childId); + $params = array_merge($params, $optParams); + return $this->call('get', array($params), "Google_Service_Drive_ChildReference"); + } + /** + * Inserts a file into a folder. (children.insert) + * + * @param string $folderId + * The ID of the folder. + * @param Google_ChildReference $postBody + * @param array $optParams Optional parameters. + * @return Google_Service_Drive_ChildReference + */ + public function insert($folderId, Google_Service_Drive_ChildReference $postBody, $optParams = array()) + { + $params = array('folderId' => $folderId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('insert', array($params), "Google_Service_Drive_ChildReference"); + } + /** + * Lists a folder's children. (children.listChildren) + * + * @param string $folderId + * The ID of the folder. + * @param array $optParams Optional parameters. + * + * @opt_param string q + * Query string for searching children. + * @opt_param string pageToken + * Page token for children. + * @opt_param int maxResults + * Maximum number of children to return. + * @return Google_Service_Drive_ChildList + */ + public function listChildren($folderId, $optParams = array()) + { + $params = array('folderId' => $folderId); + $params = array_merge($params, $optParams); + return $this->call('list', array($params), "Google_Service_Drive_ChildList"); + } +} + +/** + * The "comments" collection of methods. + * Typical usage is: + * <code> + * $driveService = new Google_Service_Drive(...); + * $comments = $driveService->comments; + * </code> + */ +class Google_Service_Drive_Comments_Resource extends Google_Service_Resource +{ + + /** + * Deletes a comment. (comments.delete) + * + * @param string $fileId + * The ID of the file. + * @param string $commentId + * The ID of the comment. + * @param array $optParams Optional parameters. + */ + public function delete($fileId, $commentId, $optParams = array()) + { + $params = array('fileId' => $fileId, 'commentId' => $commentId); + $params = array_merge($params, $optParams); + return $this->call('delete', array($params)); + } + /** + * Gets a comment by ID. (comments.get) + * + * @param string $fileId + * The ID of the file. + * @param string $commentId + * The ID of the comment. + * @param array $optParams Optional parameters. + * + * @opt_param bool includeDeleted + * If set, this will succeed when retrieving a deleted comment, and will include any deleted + * replies. + * @return Google_Service_Drive_Comment + */ + public function get($fileId, $commentId, $optParams = array()) + { + $params = array('fileId' => $fileId, 'commentId' => $commentId); + $params = array_merge($params, $optParams); + return $this->call('get', array($params), "Google_Service_Drive_Comment"); + } + /** + * Creates a new comment on the given file. (comments.insert) + * + * @param string $fileId + * The ID of the file. + * @param Google_Comment $postBody + * @param array $optParams Optional parameters. + * @return Google_Service_Drive_Comment + */ + public function insert($fileId, Google_Service_Drive_Comment $postBody, $optParams = array()) + { + $params = array('fileId' => $fileId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('insert', array($params), "Google_Service_Drive_Comment"); + } + /** + * Lists a file's comments. (comments.listComments) + * + * @param string $fileId + * The ID of the file. + * @param array $optParams Optional parameters. + * + * @opt_param string pageToken + * The continuation token, used to page through large result sets. To get the next page of results, + * set this parameter to the value of "nextPageToken" from the previous response. + * @opt_param string updatedMin + * Only discussions that were updated after this timestamp will be returned. Formatted as an RFC + * 3339 timestamp. + * @opt_param bool includeDeleted + * If set, all comments and replies, including deleted comments and replies (with content stripped) + * will be returned. + * @opt_param int maxResults + * The maximum number of discussions to include in the response, used for paging. + * @return Google_Service_Drive_CommentList + */ + public function listComments($fileId, $optParams = array()) + { + $params = array('fileId' => $fileId); + $params = array_merge($params, $optParams); + return $this->call('list', array($params), "Google_Service_Drive_CommentList"); + } + /** + * Updates an existing comment. This method supports patch semantics. + * (comments.patch) + * + * @param string $fileId + * The ID of the file. + * @param string $commentId + * The ID of the comment. + * @param Google_Comment $postBody + * @param array $optParams Optional parameters. + * @return Google_Service_Drive_Comment + */ + public function patch($fileId, $commentId, Google_Service_Drive_Comment $postBody, $optParams = array()) + { + $params = array('fileId' => $fileId, 'commentId' => $commentId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('patch', array($params), "Google_Service_Drive_Comment"); + } + /** + * Updates an existing comment. (comments.update) + * + * @param string $fileId + * The ID of the file. + * @param string $commentId + * The ID of the comment. + * @param Google_Comment $postBody + * @param array $optParams Optional parameters. + * @return Google_Service_Drive_Comment + */ + public function update($fileId, $commentId, Google_Service_Drive_Comment $postBody, $optParams = array()) + { + $params = array('fileId' => $fileId, 'commentId' => $commentId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('update', array($params), "Google_Service_Drive_Comment"); + } +} + +/** + * The "files" collection of methods. + * Typical usage is: + * <code> + * $driveService = new Google_Service_Drive(...); + * $files = $driveService->files; + * </code> + */ +class Google_Service_Drive_Files_Resource extends Google_Service_Resource +{ + + /** + * Creates a copy of the specified file. (files.copy) + * + * @param string $fileId + * The ID of the file to copy. + * @param Google_DriveFile $postBody + * @param array $optParams Optional parameters. + * + * @opt_param bool convert + * Whether to convert this file to the corresponding Google Docs format. + * @opt_param string ocrLanguage + * If ocr is true, hints at the language to use. Valid values are ISO 639-1 codes. + * @opt_param string visibility + * The visibility of the new file. This parameter is only relevant when the source is not a native + * Google Doc and convert=false. + * @opt_param bool pinned + * Whether to pin the head revision of the new copy. A file can have a maximum of 200 pinned + * revisions. + * @opt_param bool ocr + * Whether to attempt OCR on .jpg, .png, .gif, or .pdf uploads. + * @opt_param string timedTextTrackName + * The timed text track name. + * @opt_param string timedTextLanguage + * The language of the timed text. + * @return Google_Service_Drive_DriveFile + */ + public function copy($fileId, Google_Service_Drive_DriveFile $postBody, $optParams = array()) + { + $params = array('fileId' => $fileId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('copy', array($params), "Google_Service_Drive_DriveFile"); + } + /** + * Permanently deletes a file by ID. Skips the trash. (files.delete) + * + * @param string $fileId + * The ID of the file to delete. + * @param array $optParams Optional parameters. + */ + public function delete($fileId, $optParams = array()) + { + $params = array('fileId' => $fileId); + $params = array_merge($params, $optParams); + return $this->call('delete', array($params)); + } + /** + * Permanently deletes all of the user's trashed files. (files.emptyTrash) + * + * @param array $optParams Optional parameters. + */ + public function emptyTrash($optParams = array()) + { + $params = array(); + $params = array_merge($params, $optParams); + return $this->call('emptyTrash', array($params)); + } + /** + * Gets a file's metadata by ID. (files.get) + * + * @param string $fileId + * The ID for the file in question. + * @param array $optParams Optional parameters. + * + * @opt_param bool updateViewedDate + * Whether to update the view date after successfully retrieving the file. + * @opt_param string projection + * This parameter is deprecated and has no function. + * @return Google_Service_Drive_DriveFile + */ + public function get($fileId, $optParams = array()) + { + $params = array('fileId' => $fileId); + $params = array_merge($params, $optParams); + return $this->call('get', array($params), "Google_Service_Drive_DriveFile"); + } + /** + * Insert a new file. (files.insert) + * + * @param Google_DriveFile $postBody + * @param array $optParams Optional parameters. + * + * @opt_param bool convert + * Whether to convert this file to the corresponding Google Docs format. + * @opt_param bool useContentAsIndexableText + * Whether to use the content as indexable text. + * @opt_param string ocrLanguage + * If ocr is true, hints at the language to use. Valid values are ISO 639-1 codes. + * @opt_param string visibility + * The visibility of the new file. This parameter is only relevant when convert=false. + * @opt_param bool pinned + * Whether to pin the head revision of the uploaded file. A file can have a maximum of 200 pinned + * revisions. + * @opt_param bool ocr + * Whether to attempt OCR on .jpg, .png, .gif, or .pdf uploads. + * @opt_param string timedTextTrackName + * The timed text track name. + * @opt_param string timedTextLanguage + * The language of the timed text. + * @return Google_Service_Drive_DriveFile + */ + public function insert(Google_Service_Drive_DriveFile $postBody, $optParams = array()) + { + $params = array('postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('insert', array($params), "Google_Service_Drive_DriveFile"); + } + /** + * Lists the user's files. (files.listFiles) + * + * @param array $optParams Optional parameters. + * + * @opt_param string q + * Query string for searching files. + * @opt_param string pageToken + * Page token for files. + * @opt_param string corpus + * The body of items (files/documents) to which the query applies. + * @opt_param string projection + * This parameter is deprecated and has no function. + * @opt_param int maxResults + * Maximum number of files to return. + * @return Google_Service_Drive_FileList + */ + public function listFiles($optParams = array()) + { + $params = array(); + $params = array_merge($params, $optParams); + return $this->call('list', array($params), "Google_Service_Drive_FileList"); + } + /** + * Updates file metadata and/or content. This method supports patch semantics. + * (files.patch) + * + * @param string $fileId + * The ID of the file to update. + * @param Google_DriveFile $postBody + * @param array $optParams Optional parameters. + * + * @opt_param string addParents + * Comma-separated list of parent IDs to add. + * @opt_param bool updateViewedDate + * Whether to update the view date after successfully updating the file. + * @opt_param string removeParents + * Comma-separated list of parent IDs to remove. + * @opt_param bool setModifiedDate + * Whether to set the modified date with the supplied modified date. + * @opt_param bool convert + * Whether to convert this file to the corresponding Google Docs format. + * @opt_param bool useContentAsIndexableText + * Whether to use the content as indexable text. + * @opt_param string ocrLanguage + * If ocr is true, hints at the language to use. Valid values are ISO 639-1 codes. + * @opt_param bool pinned + * Whether to pin the new revision. A file can have a maximum of 200 pinned revisions. + * @opt_param bool newRevision + * Whether a blob upload should create a new revision. If false, the blob data in the current head + * revision is replaced. If true or not set, a new blob is created as head revision, and previous + * revisions are preserved (causing increased use of the user's data storage quota). + * @opt_param bool ocr + * Whether to attempt OCR on .jpg, .png, .gif, or .pdf uploads. + * @opt_param string timedTextLanguage + * The language of the timed text. + * @opt_param string timedTextTrackName + * The timed text track name. + * @return Google_Service_Drive_DriveFile + */ + public function patch($fileId, Google_Service_Drive_DriveFile $postBody, $optParams = array()) + { + $params = array('fileId' => $fileId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('patch', array($params), "Google_Service_Drive_DriveFile"); + } + /** + * Set the file's updated time to the current server time. (files.touch) + * + * @param string $fileId + * The ID of the file to update. + * @param array $optParams Optional parameters. + * @return Google_Service_Drive_DriveFile + */ + public function touch($fileId, $optParams = array()) + { + $params = array('fileId' => $fileId); + $params = array_merge($params, $optParams); + return $this->call('touch', array($params), "Google_Service_Drive_DriveFile"); + } + /** + * Moves a file to the trash. (files.trash) + * + * @param string $fileId + * The ID of the file to trash. + * @param array $optParams Optional parameters. + * @return Google_Service_Drive_DriveFile + */ + public function trash($fileId, $optParams = array()) + { + $params = array('fileId' => $fileId); + $params = array_merge($params, $optParams); + return $this->call('trash', array($params), "Google_Service_Drive_DriveFile"); + } + /** + * Restores a file from the trash. (files.untrash) + * + * @param string $fileId + * The ID of the file to untrash. + * @param array $optParams Optional parameters. + * @return Google_Service_Drive_DriveFile + */ + public function untrash($fileId, $optParams = array()) + { + $params = array('fileId' => $fileId); + $params = array_merge($params, $optParams); + return $this->call('untrash', array($params), "Google_Service_Drive_DriveFile"); + } + /** + * Updates file metadata and/or content. (files.update) + * + * @param string $fileId + * The ID of the file to update. + * @param Google_DriveFile $postBody + * @param array $optParams Optional parameters. + * + * @opt_param string addParents + * Comma-separated list of parent IDs to add. + * @opt_param bool updateViewedDate + * Whether to update the view date after successfully updating the file. + * @opt_param string removeParents + * Comma-separated list of parent IDs to remove. + * @opt_param bool setModifiedDate + * Whether to set the modified date with the supplied modified date. + * @opt_param bool convert + * Whether to convert this file to the corresponding Google Docs format. + * @opt_param bool useContentAsIndexableText + * Whether to use the content as indexable text. + * @opt_param string ocrLanguage + * If ocr is true, hints at the language to use. Valid values are ISO 639-1 codes. + * @opt_param bool pinned + * Whether to pin the new revision. A file can have a maximum of 200 pinned revisions. + * @opt_param bool newRevision + * Whether a blob upload should create a new revision. If false, the blob data in the current head + * revision is replaced. If true or not set, a new blob is created as head revision, and previous + * revisions are preserved (causing increased use of the user's data storage quota). + * @opt_param bool ocr + * Whether to attempt OCR on .jpg, .png, .gif, or .pdf uploads. + * @opt_param string timedTextLanguage + * The language of the timed text. + * @opt_param string timedTextTrackName + * The timed text track name. + * @return Google_Service_Drive_DriveFile + */ + public function update($fileId, Google_Service_Drive_DriveFile $postBody, $optParams = array()) + { + $params = array('fileId' => $fileId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('update', array($params), "Google_Service_Drive_DriveFile"); + } + /** + * Subscribe to changes on a file (files.watch) + * + * @param string $fileId + * The ID for the file in question. + * @param Google_Channel $postBody + * @param array $optParams Optional parameters. + * + * @opt_param bool updateViewedDate + * Whether to update the view date after successfully retrieving the file. + * @opt_param string projection + * This parameter is deprecated and has no function. + * @return Google_Service_Drive_Channel + */ + public function watch($fileId, Google_Service_Drive_Channel $postBody, $optParams = array()) + { + $params = array('fileId' => $fileId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('watch', array($params), "Google_Service_Drive_Channel"); + } +} + +/** + * The "parents" collection of methods. + * Typical usage is: + * <code> + * $driveService = new Google_Service_Drive(...); + * $parents = $driveService->parents; + * </code> + */ +class Google_Service_Drive_Parents_Resource extends Google_Service_Resource +{ + + /** + * Removes a parent from a file. (parents.delete) + * + * @param string $fileId + * The ID of the file. + * @param string $parentId + * The ID of the parent. + * @param array $optParams Optional parameters. + */ + public function delete($fileId, $parentId, $optParams = array()) + { + $params = array('fileId' => $fileId, 'parentId' => $parentId); + $params = array_merge($params, $optParams); + return $this->call('delete', array($params)); + } + /** + * Gets a specific parent reference. (parents.get) + * + * @param string $fileId + * The ID of the file. + * @param string $parentId + * The ID of the parent. + * @param array $optParams Optional parameters. + * @return Google_Service_Drive_ParentReference + */ + public function get($fileId, $parentId, $optParams = array()) + { + $params = array('fileId' => $fileId, 'parentId' => $parentId); + $params = array_merge($params, $optParams); + return $this->call('get', array($params), "Google_Service_Drive_ParentReference"); + } + /** + * Adds a parent folder for a file. (parents.insert) + * + * @param string $fileId + * The ID of the file. + * @param Google_ParentReference $postBody + * @param array $optParams Optional parameters. + * @return Google_Service_Drive_ParentReference + */ + public function insert($fileId, Google_Service_Drive_ParentReference $postBody, $optParams = array()) + { + $params = array('fileId' => $fileId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('insert', array($params), "Google_Service_Drive_ParentReference"); + } + /** + * Lists a file's parents. (parents.listParents) + * + * @param string $fileId + * The ID of the file. + * @param array $optParams Optional parameters. + * @return Google_Service_Drive_ParentList + */ + public function listParents($fileId, $optParams = array()) + { + $params = array('fileId' => $fileId); + $params = array_merge($params, $optParams); + return $this->call('list', array($params), "Google_Service_Drive_ParentList"); + } +} + +/** + * The "permissions" collection of methods. + * Typical usage is: + * <code> + * $driveService = new Google_Service_Drive(...); + * $permissions = $driveService->permissions; + * </code> + */ +class Google_Service_Drive_Permissions_Resource extends Google_Service_Resource +{ + + /** + * Deletes a permission from a file. (permissions.delete) + * + * @param string $fileId + * The ID for the file. + * @param string $permissionId + * The ID for the permission. + * @param array $optParams Optional parameters. + */ + public function delete($fileId, $permissionId, $optParams = array()) + { + $params = array('fileId' => $fileId, 'permissionId' => $permissionId); + $params = array_merge($params, $optParams); + return $this->call('delete', array($params)); + } + /** + * Gets a permission by ID. (permissions.get) + * + * @param string $fileId + * The ID for the file. + * @param string $permissionId + * The ID for the permission. + * @param array $optParams Optional parameters. + * @return Google_Service_Drive_Permission + */ + public function get($fileId, $permissionId, $optParams = array()) + { + $params = array('fileId' => $fileId, 'permissionId' => $permissionId); + $params = array_merge($params, $optParams); + return $this->call('get', array($params), "Google_Service_Drive_Permission"); + } + /** + * Returns the permission ID for an email address. (permissions.getIdForEmail) + * + * @param string $email + * The email address for which to return a permission ID + * @param array $optParams Optional parameters. + * @return Google_Service_Drive_PermissionId + */ + public function getIdForEmail($email, $optParams = array()) + { + $params = array('email' => $email); + $params = array_merge($params, $optParams); + return $this->call('getIdForEmail', array($params), "Google_Service_Drive_PermissionId"); + } + /** + * Inserts a permission for a file. (permissions.insert) + * + * @param string $fileId + * The ID for the file. + * @param Google_Permission $postBody + * @param array $optParams Optional parameters. + * + * @opt_param string emailMessage + * A custom message to include in notification emails. + * @opt_param bool sendNotificationEmails + * Whether to send notification emails when sharing to users or groups. This parameter is ignored + * and an email is sent if the role is owner. + * @return Google_Service_Drive_Permission + */ + public function insert($fileId, Google_Service_Drive_Permission $postBody, $optParams = array()) + { + $params = array('fileId' => $fileId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('insert', array($params), "Google_Service_Drive_Permission"); + } + /** + * Lists a file's permissions. (permissions.listPermissions) + * + * @param string $fileId + * The ID for the file. + * @param array $optParams Optional parameters. + * @return Google_Service_Drive_PermissionList + */ + public function listPermissions($fileId, $optParams = array()) + { + $params = array('fileId' => $fileId); + $params = array_merge($params, $optParams); + return $this->call('list', array($params), "Google_Service_Drive_PermissionList"); + } + /** + * Updates a permission. This method supports patch semantics. + * (permissions.patch) + * + * @param string $fileId + * The ID for the file. + * @param string $permissionId + * The ID for the permission. + * @param Google_Permission $postBody + * @param array $optParams Optional parameters. + * + * @opt_param bool transferOwnership + * Whether changing a role to 'owner' should also downgrade the current owners to writers. + * @return Google_Service_Drive_Permission + */ + public function patch($fileId, $permissionId, Google_Service_Drive_Permission $postBody, $optParams = array()) + { + $params = array('fileId' => $fileId, 'permissionId' => $permissionId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('patch', array($params), "Google_Service_Drive_Permission"); + } + /** + * Updates a permission. (permissions.update) + * + * @param string $fileId + * The ID for the file. + * @param string $permissionId + * The ID for the permission. + * @param Google_Permission $postBody + * @param array $optParams Optional parameters. + * + * @opt_param bool transferOwnership + * Whether changing a role to 'owner' should also downgrade the current owners to writers. + * @return Google_Service_Drive_Permission + */ + public function update($fileId, $permissionId, Google_Service_Drive_Permission $postBody, $optParams = array()) + { + $params = array('fileId' => $fileId, 'permissionId' => $permissionId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('update', array($params), "Google_Service_Drive_Permission"); + } +} + +/** + * The "properties" collection of methods. + * Typical usage is: + * <code> + * $driveService = new Google_Service_Drive(...); + * $properties = $driveService->properties; + * </code> + */ +class Google_Service_Drive_Properties_Resource extends Google_Service_Resource +{ + + /** + * Deletes a property. (properties.delete) + * + * @param string $fileId + * The ID of the file. + * @param string $propertyKey + * The key of the property. + * @param array $optParams Optional parameters. + * + * @opt_param string visibility + * The visibility of the property. + */ + public function delete($fileId, $propertyKey, $optParams = array()) + { + $params = array('fileId' => $fileId, 'propertyKey' => $propertyKey); + $params = array_merge($params, $optParams); + return $this->call('delete', array($params)); + } + /** + * Gets a property by its key. (properties.get) + * + * @param string $fileId + * The ID of the file. + * @param string $propertyKey + * The key of the property. + * @param array $optParams Optional parameters. + * + * @opt_param string visibility + * The visibility of the property. + * @return Google_Service_Drive_Property + */ + public function get($fileId, $propertyKey, $optParams = array()) + { + $params = array('fileId' => $fileId, 'propertyKey' => $propertyKey); + $params = array_merge($params, $optParams); + return $this->call('get', array($params), "Google_Service_Drive_Property"); + } + /** + * Adds a property to a file. (properties.insert) + * + * @param string $fileId + * The ID of the file. + * @param Google_Property $postBody + * @param array $optParams Optional parameters. + * @return Google_Service_Drive_Property + */ + public function insert($fileId, Google_Service_Drive_Property $postBody, $optParams = array()) + { + $params = array('fileId' => $fileId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('insert', array($params), "Google_Service_Drive_Property"); + } + /** + * Lists a file's properties. (properties.listProperties) + * + * @param string $fileId + * The ID of the file. + * @param array $optParams Optional parameters. + * @return Google_Service_Drive_PropertyList + */ + public function listProperties($fileId, $optParams = array()) + { + $params = array('fileId' => $fileId); + $params = array_merge($params, $optParams); + return $this->call('list', array($params), "Google_Service_Drive_PropertyList"); + } + /** + * Updates a property. This method supports patch semantics. (properties.patch) + * + * @param string $fileId + * The ID of the file. + * @param string $propertyKey + * The key of the property. + * @param Google_Property $postBody + * @param array $optParams Optional parameters. + * + * @opt_param string visibility + * The visibility of the property. + * @return Google_Service_Drive_Property + */ + public function patch($fileId, $propertyKey, Google_Service_Drive_Property $postBody, $optParams = array()) + { + $params = array('fileId' => $fileId, 'propertyKey' => $propertyKey, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('patch', array($params), "Google_Service_Drive_Property"); + } + /** + * Updates a property. (properties.update) + * + * @param string $fileId + * The ID of the file. + * @param string $propertyKey + * The key of the property. + * @param Google_Property $postBody + * @param array $optParams Optional parameters. + * + * @opt_param string visibility + * The visibility of the property. + * @return Google_Service_Drive_Property + */ + public function update($fileId, $propertyKey, Google_Service_Drive_Property $postBody, $optParams = array()) + { + $params = array('fileId' => $fileId, 'propertyKey' => $propertyKey, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('update', array($params), "Google_Service_Drive_Property"); + } +} + +/** + * The "realtime" collection of methods. + * Typical usage is: + * <code> + * $driveService = new Google_Service_Drive(...); + * $realtime = $driveService->realtime; + * </code> + */ +class Google_Service_Drive_Realtime_Resource extends Google_Service_Resource +{ + + /** + * Exports the contents of the Realtime API data model associated with this file + * as JSON. (realtime.get) + * + * @param string $fileId + * The ID of the file that the Realtime API data model is associated with. + * @param array $optParams Optional parameters. + * + * @opt_param int revision + * The revision of the Realtime API data model to export. Revisions start at 1 (the initial empty + * data model) and are incremented with each change. If this parameter is excluded, the most recent + * data model will be returned. + */ + public function get($fileId, $optParams = array()) + { + $params = array('fileId' => $fileId); + $params = array_merge($params, $optParams); + return $this->call('get', array($params)); + } + /** + * Overwrites the Realtime API data model associated with this file with the + * provided JSON data model. (realtime.update) + * + * @param string $fileId + * The ID of the file that the Realtime API data model is associated with. + * @param array $optParams Optional parameters. + * + * @opt_param string baseRevision + * The revision of the model to diff the uploaded model against. If set, the uploaded model is + * diffed against the provided revision and those differences are merged with any changes made to + * the model after the provided revision. If not set, the uploaded model replaces the current model + * on the server. + */ + public function update($fileId, $optParams = array()) + { + $params = array('fileId' => $fileId); + $params = array_merge($params, $optParams); + return $this->call('update', array($params)); + } +} + +/** + * The "replies" collection of methods. + * Typical usage is: + * <code> + * $driveService = new Google_Service_Drive(...); + * $replies = $driveService->replies; + * </code> + */ +class Google_Service_Drive_Replies_Resource extends Google_Service_Resource +{ + + /** + * Deletes a reply. (replies.delete) + * + * @param string $fileId + * The ID of the file. + * @param string $commentId + * The ID of the comment. + * @param string $replyId + * The ID of the reply. + * @param array $optParams Optional parameters. + */ + public function delete($fileId, $commentId, $replyId, $optParams = array()) + { + $params = array('fileId' => $fileId, 'commentId' => $commentId, 'replyId' => $replyId); + $params = array_merge($params, $optParams); + return $this->call('delete', array($params)); + } + /** + * Gets a reply. (replies.get) + * + * @param string $fileId + * The ID of the file. + * @param string $commentId + * The ID of the comment. + * @param string $replyId + * The ID of the reply. + * @param array $optParams Optional parameters. + * + * @opt_param bool includeDeleted + * If set, this will succeed when retrieving a deleted reply. + * @return Google_Service_Drive_CommentReply + */ + public function get($fileId, $commentId, $replyId, $optParams = array()) + { + $params = array('fileId' => $fileId, 'commentId' => $commentId, 'replyId' => $replyId); + $params = array_merge($params, $optParams); + return $this->call('get', array($params), "Google_Service_Drive_CommentReply"); + } + /** + * Creates a new reply to the given comment. (replies.insert) + * + * @param string $fileId + * The ID of the file. + * @param string $commentId + * The ID of the comment. + * @param Google_CommentReply $postBody + * @param array $optParams Optional parameters. + * @return Google_Service_Drive_CommentReply + */ + public function insert($fileId, $commentId, Google_Service_Drive_CommentReply $postBody, $optParams = array()) + { + $params = array('fileId' => $fileId, 'commentId' => $commentId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('insert', array($params), "Google_Service_Drive_CommentReply"); + } + /** + * Lists all of the replies to a comment. (replies.listReplies) + * + * @param string $fileId + * The ID of the file. + * @param string $commentId + * The ID of the comment. + * @param array $optParams Optional parameters. + * + * @opt_param string pageToken + * The continuation token, used to page through large result sets. To get the next page of results, + * set this parameter to the value of "nextPageToken" from the previous response. + * @opt_param bool includeDeleted + * If set, all replies, including deleted replies (with content stripped) will be returned. + * @opt_param int maxResults + * The maximum number of replies to include in the response, used for paging. + * @return Google_Service_Drive_CommentReplyList + */ + public function listReplies($fileId, $commentId, $optParams = array()) + { + $params = array('fileId' => $fileId, 'commentId' => $commentId); + $params = array_merge($params, $optParams); + return $this->call('list', array($params), "Google_Service_Drive_CommentReplyList"); + } + /** + * Updates an existing reply. This method supports patch semantics. + * (replies.patch) + * + * @param string $fileId + * The ID of the file. + * @param string $commentId + * The ID of the comment. + * @param string $replyId + * The ID of the reply. + * @param Google_CommentReply $postBody + * @param array $optParams Optional parameters. + * @return Google_Service_Drive_CommentReply + */ + public function patch($fileId, $commentId, $replyId, Google_Service_Drive_CommentReply $postBody, $optParams = array()) + { + $params = array('fileId' => $fileId, 'commentId' => $commentId, 'replyId' => $replyId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('patch', array($params), "Google_Service_Drive_CommentReply"); + } + /** + * Updates an existing reply. (replies.update) + * + * @param string $fileId + * The ID of the file. + * @param string $commentId + * The ID of the comment. + * @param string $replyId + * The ID of the reply. + * @param Google_CommentReply $postBody + * @param array $optParams Optional parameters. + * @return Google_Service_Drive_CommentReply + */ + public function update($fileId, $commentId, $replyId, Google_Service_Drive_CommentReply $postBody, $optParams = array()) + { + $params = array('fileId' => $fileId, 'commentId' => $commentId, 'replyId' => $replyId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('update', array($params), "Google_Service_Drive_CommentReply"); + } +} + +/** + * The "revisions" collection of methods. + * Typical usage is: + * <code> + * $driveService = new Google_Service_Drive(...); + * $revisions = $driveService->revisions; + * </code> + */ +class Google_Service_Drive_Revisions_Resource extends Google_Service_Resource +{ + + /** + * Removes a revision. (revisions.delete) + * + * @param string $fileId + * The ID of the file. + * @param string $revisionId + * The ID of the revision. + * @param array $optParams Optional parameters. + */ + public function delete($fileId, $revisionId, $optParams = array()) + { + $params = array('fileId' => $fileId, 'revisionId' => $revisionId); + $params = array_merge($params, $optParams); + return $this->call('delete', array($params)); + } + /** + * Gets a specific revision. (revisions.get) + * + * @param string $fileId + * The ID of the file. + * @param string $revisionId + * The ID of the revision. + * @param array $optParams Optional parameters. + * @return Google_Service_Drive_Revision + */ + public function get($fileId, $revisionId, $optParams = array()) + { + $params = array('fileId' => $fileId, 'revisionId' => $revisionId); + $params = array_merge($params, $optParams); + return $this->call('get', array($params), "Google_Service_Drive_Revision"); + } + /** + * Lists a file's revisions. (revisions.listRevisions) + * + * @param string $fileId + * The ID of the file. + * @param array $optParams Optional parameters. + * @return Google_Service_Drive_RevisionList + */ + public function listRevisions($fileId, $optParams = array()) + { + $params = array('fileId' => $fileId); + $params = array_merge($params, $optParams); + return $this->call('list', array($params), "Google_Service_Drive_RevisionList"); + } + /** + * Updates a revision. This method supports patch semantics. (revisions.patch) + * + * @param string $fileId + * The ID for the file. + * @param string $revisionId + * The ID for the revision. + * @param Google_Revision $postBody + * @param array $optParams Optional parameters. + * @return Google_Service_Drive_Revision + */ + public function patch($fileId, $revisionId, Google_Service_Drive_Revision $postBody, $optParams = array()) + { + $params = array('fileId' => $fileId, 'revisionId' => $revisionId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('patch', array($params), "Google_Service_Drive_Revision"); + } + /** + * Updates a revision. (revisions.update) + * + * @param string $fileId + * The ID for the file. + * @param string $revisionId + * The ID for the revision. + * @param Google_Revision $postBody + * @param array $optParams Optional parameters. + * @return Google_Service_Drive_Revision + */ + public function update($fileId, $revisionId, Google_Service_Drive_Revision $postBody, $optParams = array()) + { + $params = array('fileId' => $fileId, 'revisionId' => $revisionId, 'postBody' => $postBody); + $params = array_merge($params, $optParams); + return $this->call('update', array($params), "Google_Service_Drive_Revision"); + } +} + + + + +class Google_Service_Drive_About extends Google_Collection +{ + protected $collection_key = 'quotaBytesByService'; + protected $internal_gapi_mappings = array( + ); + protected $additionalRoleInfoType = 'Google_Service_Drive_AboutAdditionalRoleInfo'; + protected $additionalRoleInfoDataType = 'array'; + public $domainSharingPolicy; + public $etag; + protected $exportFormatsType = 'Google_Service_Drive_AboutExportFormats'; + protected $exportFormatsDataType = 'array'; + protected $featuresType = 'Google_Service_Drive_AboutFeatures'; + protected $featuresDataType = 'array'; + protected $importFormatsType = 'Google_Service_Drive_AboutImportFormats'; + protected $importFormatsDataType = 'array'; + public $isCurrentAppInstalled; + public $kind; + public $languageCode; + public $largestChangeId; + protected $maxUploadSizesType = 'Google_Service_Drive_AboutMaxUploadSizes'; + protected $maxUploadSizesDataType = 'array'; + public $name; + public $permissionId; + protected $quotaBytesByServiceType = 'Google_Service_Drive_AboutQuotaBytesByService'; + protected $quotaBytesByServiceDataType = 'array'; + public $quotaBytesTotal; + public $quotaBytesUsed; + public $quotaBytesUsedAggregate; + public $quotaBytesUsedInTrash; + public $quotaType; + public $remainingChangeIds; + public $rootFolderId; + public $selfLink; + protected $userType = 'Google_Service_Drive_User'; + protected $userDataType = ''; + + public function setAdditionalRoleInfo($additionalRoleInfo) + { + $this->additionalRoleInfo = $additionalRoleInfo; + } + + public function getAdditionalRoleInfo() + { + return $this->additionalRoleInfo; + } + + public function setDomainSharingPolicy($domainSharingPolicy) + { + $this->domainSharingPolicy = $domainSharingPolicy; + } + + public function getDomainSharingPolicy() + { + return $this->domainSharingPolicy; + } + + public function setEtag($etag) + { + $this->etag = $etag; + } + + public function getEtag() + { + return $this->etag; + } + + public function setExportFormats($exportFormats) + { + $this->exportFormats = $exportFormats; + } + + public function getExportFormats() + { + return $this->exportFormats; + } + + public function setFeatures($features) + { + $this->features = $features; + } + + public function getFeatures() + { + return $this->features; + } + + public function setImportFormats($importFormats) + { + $this->importFormats = $importFormats; + } + + public function getImportFormats() + { + return $this->importFormats; + } + + public function setIsCurrentAppInstalled($isCurrentAppInstalled) + { + $this->isCurrentAppInstalled = $isCurrentAppInstalled; + } + + public function getIsCurrentAppInstalled() + { + return $this->isCurrentAppInstalled; + } + + public function setKind($kind) + { + $this->kind = $kind; + } + + public function getKind() + { + return $this->kind; + } + + public function setLanguageCode($languageCode) + { + $this->languageCode = $languageCode; + } + + public function getLanguageCode() + { + return $this->languageCode; + } + + public function setLargestChangeId($largestChangeId) + { + $this->largestChangeId = $largestChangeId; + } + + public function getLargestChangeId() + { + return $this->largestChangeId; + } + + public function setMaxUploadSizes($maxUploadSizes) + { + $this->maxUploadSizes = $maxUploadSizes; + } + + public function getMaxUploadSizes() + { + return $this->maxUploadSizes; + } + + public function setName($name) + { + $this->name = $name; + } + + public function getName() + { + return $this->name; + } + + public function setPermissionId($permissionId) + { + $this->permissionId = $permissionId; + } + + public function getPermissionId() + { + return $this->permissionId; + } + + public function setQuotaBytesByService($quotaBytesByService) + { + $this->quotaBytesByService = $quotaBytesByService; + } + + public function getQuotaBytesByService() + { + return $this->quotaBytesByService; + } + + public function setQuotaBytesTotal($quotaBytesTotal) + { + $this->quotaBytesTotal = $quotaBytesTotal; + } + + public function getQuotaBytesTotal() + { + return $this->quotaBytesTotal; + } + + public function setQuotaBytesUsed($quotaBytesUsed) + { + $this->quotaBytesUsed = $quotaBytesUsed; + } + + public function getQuotaBytesUsed() + { + return $this->quotaBytesUsed; + } + + public function setQuotaBytesUsedAggregate($quotaBytesUsedAggregate) + { + $this->quotaBytesUsedAggregate = $quotaBytesUsedAggregate; + } + + public function getQuotaBytesUsedAggregate() + { + return $this->quotaBytesUsedAggregate; + } + + public function setQuotaBytesUsedInTrash($quotaBytesUsedInTrash) + { + $this->quotaBytesUsedInTrash = $quotaBytesUsedInTrash; + } + + public function getQuotaBytesUsedInTrash() + { + return $this->quotaBytesUsedInTrash; + } + + public function setQuotaType($quotaType) + { + $this->quotaType = $quotaType; + } + + public function getQuotaType() + { + return $this->quotaType; + } + + public function setRemainingChangeIds($remainingChangeIds) + { + $this->remainingChangeIds = $remainingChangeIds; + } + + public function getRemainingChangeIds() + { + return $this->remainingChangeIds; + } + + public function setRootFolderId($rootFolderId) + { + $this->rootFolderId = $rootFolderId; + } + + public function getRootFolderId() + { + return $this->rootFolderId; + } + + public function setSelfLink($selfLink) + { + $this->selfLink = $selfLink; + } + + public function getSelfLink() + { + return $this->selfLink; + } + + public function setUser(Google_Service_Drive_User $user) + { + $this->user = $user; + } + + public function getUser() + { + return $this->user; + } +} + +class Google_Service_Drive_AboutAdditionalRoleInfo extends Google_Collection +{ + protected $collection_key = 'roleSets'; + protected $internal_gapi_mappings = array( + ); + protected $roleSetsType = 'Google_Service_Drive_AboutAdditionalRoleInfoRoleSets'; + protected $roleSetsDataType = 'array'; + public $type; + + public function setRoleSets($roleSets) + { + $this->roleSets = $roleSets; + } + + public function getRoleSets() + { + return $this->roleSets; + } + + public function setType($type) + { + $this->type = $type; + } + + public function getType() + { + return $this->type; + } +} + +class Google_Service_Drive_AboutAdditionalRoleInfoRoleSets extends Google_Collection +{ + protected $collection_key = 'additionalRoles'; + protected $internal_gapi_mappings = array( + ); + public $additionalRoles; + public $primaryRole; + + public function setAdditionalRoles($additionalRoles) + { + $this->additionalRoles = $additionalRoles; + } + + public function getAdditionalRoles() + { + return $this->additionalRoles; + } + + public function setPrimaryRole($primaryRole) + { + $this->primaryRole = $primaryRole; + } + + public function getPrimaryRole() + { + return $this->primaryRole; + } +} + +class Google_Service_Drive_AboutExportFormats extends Google_Collection +{ + protected $collection_key = 'targets'; + protected $internal_gapi_mappings = array( + ); + public $source; + public $targets; + + public function setSource($source) + { + $this->source = $source; + } + + public function getSource() + { + return $this->source; + } + + public function setTargets($targets) + { + $this->targets = $targets; + } + + public function getTargets() + { + return $this->targets; + } +} + +class Google_Service_Drive_AboutFeatures extends Google_Model +{ + protected $internal_gapi_mappings = array( + ); + public $featureName; + public $featureRate; + + public function setFeatureName($featureName) + { + $this->featureName = $featureName; + } + + public function getFeatureName() + { + return $this->featureName; + } + + public function setFeatureRate($featureRate) + { + $this->featureRate = $featureRate; + } + + public function getFeatureRate() + { + return $this->featureRate; + } +} + +class Google_Service_Drive_AboutImportFormats extends Google_Collection +{ + protected $collection_key = 'targets'; + protected $internal_gapi_mappings = array( + ); + public $source; + public $targets; + + public function setSource($source) + { + $this->source = $source; + } + + public function getSource() + { + return $this->source; + } + + public function setTargets($targets) + { + $this->targets = $targets; + } + + public function getTargets() + { + return $this->targets; + } +} + +class Google_Service_Drive_AboutMaxUploadSizes extends Google_Model +{ + protected $internal_gapi_mappings = array( + ); + public $size; + public $type; + + public function setSize($size) + { + $this->size = $size; + } + + public function getSize() + { + return $this->size; + } + + public function setType($type) + { + $this->type = $type; + } + + public function getType() + { + return $this->type; + } +} + +class Google_Service_Drive_AboutQuotaBytesByService extends Google_Model +{ + protected $internal_gapi_mappings = array( + ); + public $bytesUsed; + public $serviceName; + + public function setBytesUsed($bytesUsed) + { + $this->bytesUsed = $bytesUsed; + } + + public function getBytesUsed() + { + return $this->bytesUsed; + } + + public function setServiceName($serviceName) + { + $this->serviceName = $serviceName; + } + + public function getServiceName() + { + return $this->serviceName; + } +} + +class Google_Service_Drive_App extends Google_Collection +{ + protected $collection_key = 'secondaryMimeTypes'; + protected $internal_gapi_mappings = array( + ); + public $authorized; + public $createInFolderTemplate; + public $createUrl; + public $hasDriveWideScope; + protected $iconsType = 'Google_Service_Drive_AppIcons'; + protected $iconsDataType = 'array'; + public $id; + public $installed; + public $kind; + public $longDescription; + public $name; + public $objectType; + public $openUrlTemplate; + public $primaryFileExtensions; + public $primaryMimeTypes; + public $productId; + public $productUrl; + public $secondaryFileExtensions; + public $secondaryMimeTypes; + public $shortDescription; + public $supportsCreate; + public $supportsImport; + public $supportsMultiOpen; + public $supportsOfflineCreate; + public $useByDefault; + + public function setAuthorized($authorized) + { + $this->authorized = $authorized; + } + + public function getAuthorized() + { + return $this->authorized; + } + + public function setCreateInFolderTemplate($createInFolderTemplate) + { + $this->createInFolderTemplate = $createInFolderTemplate; + } + + public function getCreateInFolderTemplate() + { + return $this->createInFolderTemplate; + } + + public function setCreateUrl($createUrl) + { + $this->createUrl = $createUrl; + } + + public function getCreateUrl() + { + return $this->createUrl; + } + + public function setHasDriveWideScope($hasDriveWideScope) + { + $this->hasDriveWideScope = $hasDriveWideScope; + } + + public function getHasDriveWideScope() + { + return $this->hasDriveWideScope; + } + + public function setIcons($icons) + { + $this->icons = $icons; + } + + public function getIcons() + { + return $this->icons; + } + + public function setId($id) + { + $this->id = $id; + } + + public function getId() + { + return $this->id; + } + + public function setInstalled($installed) + { + $this->installed = $installed; + } + + public function getInstalled() + { + return $this->installed; + } + + public function setKind($kind) + { + $this->kind = $kind; + } + + public function getKind() + { + return $this->kind; + } + + public function setLongDescription($longDescription) + { + $this->longDescription = $longDescription; + } + + public function getLongDescription() + { + return $this->longDescription; + } + + public function setName($name) + { + $this->name = $name; + } + + public function getName() + { + return $this->name; + } + + public function setObjectType($objectType) + { + $this->objectType = $objectType; + } + + public function getObjectType() + { + return $this->objectType; + } + + public function setOpenUrlTemplate($openUrlTemplate) + { + $this->openUrlTemplate = $openUrlTemplate; + } + + public function getOpenUrlTemplate() + { + return $this->openUrlTemplate; + } + + public function setPrimaryFileExtensions($primaryFileExtensions) + { + $this->primaryFileExtensions = $primaryFileExtensions; + } + + public function getPrimaryFileExtensions() + { + return $this->primaryFileExtensions; + } + + public function setPrimaryMimeTypes($primaryMimeTypes) + { + $this->primaryMimeTypes = $primaryMimeTypes; + } + + public function getPrimaryMimeTypes() + { + return $this->primaryMimeTypes; + } + + public function setProductId($productId) + { + $this->productId = $productId; + } + + public function getProductId() + { + return $this->productId; + } + + public function setProductUrl($productUrl) + { + $this->productUrl = $productUrl; + } + + public function getProductUrl() + { + return $this->productUrl; + } + + public function setSecondaryFileExtensions($secondaryFileExtensions) + { + $this->secondaryFileExtensions = $secondaryFileExtensions; + } + + public function getSecondaryFileExtensions() + { + return $this->secondaryFileExtensions; + } + + public function setSecondaryMimeTypes($secondaryMimeTypes) + { + $this->secondaryMimeTypes = $secondaryMimeTypes; + } + + public function getSecondaryMimeTypes() + { + return $this->secondaryMimeTypes; + } + + public function setShortDescription($shortDescription) + { + $this->shortDescription = $shortDescription; + } + + public function getShortDescription() + { + return $this->shortDescription; + } + + public function setSupportsCreate($supportsCreate) + { + $this->supportsCreate = $supportsCreate; + } + + public function getSupportsCreate() + { + return $this->supportsCreate; + } + + public function setSupportsImport($supportsImport) + { + $this->supportsImport = $supportsImport; + } + + public function getSupportsImport() + { + return $this->supportsImport; + } + + public function setSupportsMultiOpen($supportsMultiOpen) + { + $this->supportsMultiOpen = $supportsMultiOpen; + } + + public function getSupportsMultiOpen() + { + return $this->supportsMultiOpen; + } + + public function setSupportsOfflineCreate($supportsOfflineCreate) + { + $this->supportsOfflineCreate = $supportsOfflineCreate; + } + + public function getSupportsOfflineCreate() + { + return $this->supportsOfflineCreate; + } + + public function setUseByDefault($useByDefault) + { + $this->useByDefault = $useByDefault; + } + + public function getUseByDefault() + { + return $this->useByDefault; + } +} + +class Google_Service_Drive_AppIcons extends Google_Model +{ + protected $internal_gapi_mappings = array( + ); + public $category; + public $iconUrl; + public $size; + + public function setCategory($category) + { + $this->category = $category; + } + + public function getCategory() + { + return $this->category; + } + + public function setIconUrl($iconUrl) + { + $this->iconUrl = $iconUrl; + } + + public function getIconUrl() + { + return $this->iconUrl; + } + + public function setSize($size) + { + $this->size = $size; + } + + public function getSize() + { + return $this->size; + } +} + +class Google_Service_Drive_AppList extends Google_Collection +{ + protected $collection_key = 'items'; + protected $internal_gapi_mappings = array( + ); + public $defaultAppIds; + public $etag; + protected $itemsType = 'Google_Service_Drive_App'; + protected $itemsDataType = 'array'; + public $kind; + public $selfLink; + + public function setDefaultAppIds($defaultAppIds) + { + $this->defaultAppIds = $defaultAppIds; + } + + public function getDefaultAppIds() + { + return $this->defaultAppIds; + } + + public function setEtag($etag) + { + $this->etag = $etag; + } + + public function getEtag() + { + return $this->etag; + } + + public function setItems($items) + { + $this->items = $items; + } + + public function getItems() + { + return $this->items; + } + + public function setKind($kind) + { + $this->kind = $kind; + } + + public function getKind() + { + return $this->kind; + } + + public function setSelfLink($selfLink) + { + $this->selfLink = $selfLink; + } + + public function getSelfLink() + { + return $this->selfLink; + } +} + +class Google_Service_Drive_Change extends Google_Model +{ + protected $internal_gapi_mappings = array( + ); + public $deleted; + protected $fileType = 'Google_Service_Drive_DriveFile'; + protected $fileDataType = ''; + public $fileId; + public $id; + public $kind; + public $modificationDate; + public $selfLink; + + public function setDeleted($deleted) + { + $this->deleted = $deleted; + } + + public function getDeleted() + { + return $this->deleted; + } + + public function setFile(Google_Service_Drive_DriveFile $file) + { + $this->file = $file; + } + + public function getFile() + { + return $this->file; + } + + public function setFileId($fileId) + { + $this->fileId = $fileId; + } + + public function getFileId() + { + return $this->fileId; + } + + public function setId($id) + { + $this->id = $id; + } + + public function getId() + { + return $this->id; + } + + public function setKind($kind) + { + $this->kind = $kind; + } + + public function getKind() + { + return $this->kind; + } + + public function setModificationDate($modificationDate) + { + $this->modificationDate = $modificationDate; + } + + public function getModificationDate() + { + return $this->modificationDate; + } + + public function setSelfLink($selfLink) + { + $this->selfLink = $selfLink; + } + + public function getSelfLink() + { + return $this->selfLink; + } +} + +class Google_Service_Drive_ChangeList extends Google_Collection +{ + protected $collection_key = 'items'; + protected $internal_gapi_mappings = array( + ); + public $etag; + protected $itemsType = 'Google_Service_Drive_Change'; + protected $itemsDataType = 'array'; + public $kind; + public $largestChangeId; + public $nextLink; + public $nextPageToken; + public $selfLink; + + public function setEtag($etag) + { + $this->etag = $etag; + } + + public function getEtag() + { + return $this->etag; + } + + public function setItems($items) + { + $this->items = $items; + } + + public function getItems() + { + return $this->items; + } + + public function setKind($kind) + { + $this->kind = $kind; + } + + public function getKind() + { + return $this->kind; + } + + public function setLargestChangeId($largestChangeId) + { + $this->largestChangeId = $largestChangeId; + } + + public function getLargestChangeId() + { + return $this->largestChangeId; + } + + public function setNextLink($nextLink) + { + $this->nextLink = $nextLink; + } + + public function getNextLink() + { + return $this->nextLink; + } + + public function setNextPageToken($nextPageToken) + { + $this->nextPageToken = $nextPageToken; + } + + public function getNextPageToken() + { + return $this->nextPageToken; + } + + public function setSelfLink($selfLink) + { + $this->selfLink = $selfLink; + } + + public function getSelfLink() + { + return $this->selfLink; + } +} + +class Google_Service_Drive_Channel extends Google_Model +{ + protected $internal_gapi_mappings = array( + ); + public $address; + public $expiration; + public $id; + public $kind; + public $params; + public $payload; + public $resourceId; + public $resourceUri; + public $token; + public $type; + + public function setAddress($address) + { + $this->address = $address; + } + + public function getAddress() + { + return $this->address; + } + + public function setExpiration($expiration) + { + $this->expiration = $expiration; + } + + public function getExpiration() + { + return $this->expiration; + } + + public function setId($id) + { + $this->id = $id; + } + + public function getId() + { + return $this->id; + } + + public function setKind($kind) + { + $this->kind = $kind; + } + + public function getKind() + { + return $this->kind; + } + + public function setParams($params) + { + $this->params = $params; + } + + public function getParams() + { + return $this->params; + } + + public function setPayload($payload) + { + $this->payload = $payload; + } + + public function getPayload() + { + return $this->payload; + } + + public function setResourceId($resourceId) + { + $this->resourceId = $resourceId; + } + + public function getResourceId() + { + return $this->resourceId; + } + + public function setResourceUri($resourceUri) + { + $this->resourceUri = $resourceUri; + } + + public function getResourceUri() + { + return $this->resourceUri; + } + + public function setToken($token) + { + $this->token = $token; + } + + public function getToken() + { + return $this->token; + } + + public function setType($type) + { + $this->type = $type; + } + + public function getType() + { + return $this->type; + } +} + +class Google_Service_Drive_ChannelParams extends Google_Model +{ + protected $internal_gapi_mappings = array( + ); +} + +class Google_Service_Drive_ChildList extends Google_Collection +{ + protected $collection_key = 'items'; + protected $internal_gapi_mappings = array( + ); + public $etag; + protected $itemsType = 'Google_Service_Drive_ChildReference'; + protected $itemsDataType = 'array'; + public $kind; + public $nextLink; + public $nextPageToken; + public $selfLink; + + public function setEtag($etag) + { + $this->etag = $etag; + } + + public function getEtag() + { + return $this->etag; + } + + public function setItems($items) + { + $this->items = $items; + } + + public function getItems() + { + return $this->items; + } + + public function setKind($kind) + { + $this->kind = $kind; + } + + public function getKind() + { + return $this->kind; + } + + public function setNextLink($nextLink) + { + $this->nextLink = $nextLink; + } + + public function getNextLink() + { + return $this->nextLink; + } + + public function setNextPageToken($nextPageToken) + { + $this->nextPageToken = $nextPageToken; + } + + public function getNextPageToken() + { + return $this->nextPageToken; + } + + public function setSelfLink($selfLink) + { + $this->selfLink = $selfLink; + } + + public function getSelfLink() + { + return $this->selfLink; + } +} + +class Google_Service_Drive_ChildReference extends Google_Model +{ + protected $internal_gapi_mappings = array( + ); + public $childLink; + public $id; + public $kind; + public $selfLink; + + public function setChildLink($childLink) + { + $this->childLink = $childLink; + } + + public function getChildLink() + { + return $this->childLink; + } + + public function setId($id) + { + $this->id = $id; + } + + public function getId() + { + return $this->id; + } + + public function setKind($kind) + { + $this->kind = $kind; + } + + public function getKind() + { + return $this->kind; + } + + public function setSelfLink($selfLink) + { + $this->selfLink = $selfLink; + } + + public function getSelfLink() + { + return $this->selfLink; + } +} + +class Google_Service_Drive_Comment extends Google_Collection +{ + protected $collection_key = 'replies'; + protected $internal_gapi_mappings = array( + ); + public $anchor; + protected $authorType = 'Google_Service_Drive_User'; + protected $authorDataType = ''; + public $commentId; + public $content; + protected $contextType = 'Google_Service_Drive_CommentContext'; + protected $contextDataType = ''; + public $createdDate; + public $deleted; + public $fileId; + public $fileTitle; + public $htmlContent; + public $kind; + public $modifiedDate; + protected $repliesType = 'Google_Service_Drive_CommentReply'; + protected $repliesDataType = 'array'; + public $selfLink; + public $status; + + public function setAnchor($anchor) + { + $this->anchor = $anchor; + } + + public function getAnchor() + { + return $this->anchor; + } + + public function setAuthor(Google_Service_Drive_User $author) + { + $this->author = $author; + } + + public function getAuthor() + { + return $this->author; + } + + public function setCommentId($commentId) + { + $this->commentId = $commentId; + } + + public function getCommentId() + { + return $this->commentId; + } + + public function setContent($content) + { + $this->content = $content; + } + + public function getContent() + { + return $this->content; + } + + public function setContext(Google_Service_Drive_CommentContext $context) + { + $this->context = $context; + } + + public function getContext() + { + return $this->context; + } + + public function setCreatedDate($createdDate) + { + $this->createdDate = $createdDate; + } + + public function getCreatedDate() + { + return $this->createdDate; + } + + public function setDeleted($deleted) + { + $this->deleted = $deleted; + } + + public function getDeleted() + { + return $this->deleted; + } + + public function setFileId($fileId) + { + $this->fileId = $fileId; + } + + public function getFileId() + { + return $this->fileId; + } + + public function setFileTitle($fileTitle) + { + $this->fileTitle = $fileTitle; + } + + public function getFileTitle() + { + return $this->fileTitle; + } + + public function setHtmlContent($htmlContent) + { + $this->htmlContent = $htmlContent; + } + + public function getHtmlContent() + { + return $this->htmlContent; + } + + public function setKind($kind) + { + $this->kind = $kind; + } + + public function getKind() + { + return $this->kind; + } + + public function setModifiedDate($modifiedDate) + { + $this->modifiedDate = $modifiedDate; + } + + public function getModifiedDate() + { + return $this->modifiedDate; + } + + public function setReplies($replies) + { + $this->replies = $replies; + } + + public function getReplies() + { + return $this->replies; + } + + public function setSelfLink($selfLink) + { + $this->selfLink = $selfLink; + } + + public function getSelfLink() + { + return $this->selfLink; + } + + public function setStatus($status) + { + $this->status = $status; + } + + public function getStatus() + { + return $this->status; + } +} + +class Google_Service_Drive_CommentContext extends Google_Model +{ + protected $internal_gapi_mappings = array( + ); + public $type; + public $value; + + public function setType($type) + { + $this->type = $type; + } + + public function getType() + { + return $this->type; + } + + public function setValue($value) + { + $this->value = $value; + } + + public function getValue() + { + return $this->value; + } +} + +class Google_Service_Drive_CommentList extends Google_Collection +{ + protected $collection_key = 'items'; + protected $internal_gapi_mappings = array( + ); + protected $itemsType = 'Google_Service_Drive_Comment'; + protected $itemsDataType = 'array'; + public $kind; + public $nextLink; + public $nextPageToken; + public $selfLink; + + public function setItems($items) + { + $this->items = $items; + } + + public function getItems() + { + return $this->items; + } + + public function setKind($kind) + { + $this->kind = $kind; + } + + public function getKind() + { + return $this->kind; + } + + public function setNextLink($nextLink) + { + $this->nextLink = $nextLink; + } + + public function getNextLink() + { + return $this->nextLink; + } + + public function setNextPageToken($nextPageToken) + { + $this->nextPageToken = $nextPageToken; + } + + public function getNextPageToken() + { + return $this->nextPageToken; + } + + public function setSelfLink($selfLink) + { + $this->selfLink = $selfLink; + } + + public function getSelfLink() + { + return $this->selfLink; + } +} + +class Google_Service_Drive_CommentReply extends Google_Model +{ + protected $internal_gapi_mappings = array( + ); + protected $authorType = 'Google_Service_Drive_User'; + protected $authorDataType = ''; + public $content; + public $createdDate; + public $deleted; + public $htmlContent; + public $kind; + public $modifiedDate; + public $replyId; + public $verb; + + public function setAuthor(Google_Service_Drive_User $author) + { + $this->author = $author; + } + + public function getAuthor() + { + return $this->author; + } + + public function setContent($content) + { + $this->content = $content; + } + + public function getContent() + { + return $this->content; + } + + public function setCreatedDate($createdDate) + { + $this->createdDate = $createdDate; + } + + public function getCreatedDate() + { + return $this->createdDate; + } + + public function setDeleted($deleted) + { + $this->deleted = $deleted; + } + + public function getDeleted() + { + return $this->deleted; + } + + public function setHtmlContent($htmlContent) + { + $this->htmlContent = $htmlContent; + } + + public function getHtmlContent() + { + return $this->htmlContent; + } + + public function setKind($kind) + { + $this->kind = $kind; + } + + public function getKind() + { + return $this->kind; + } + + public function setModifiedDate($modifiedDate) + { + $this->modifiedDate = $modifiedDate; + } + + public function getModifiedDate() + { + return $this->modifiedDate; + } + + public function setReplyId($replyId) + { + $this->replyId = $replyId; + } + + public function getReplyId() + { + return $this->replyId; + } + + public function setVerb($verb) + { + $this->verb = $verb; + } + + public function getVerb() + { + return $this->verb; + } +} + +class Google_Service_Drive_CommentReplyList extends Google_Collection +{ + protected $collection_key = 'items'; + protected $internal_gapi_mappings = array( + ); + protected $itemsType = 'Google_Service_Drive_CommentReply'; + protected $itemsDataType = 'array'; + public $kind; + public $nextLink; + public $nextPageToken; + public $selfLink; + + public function setItems($items) + { + $this->items = $items; + } + + public function getItems() + { + return $this->items; + } + + public function setKind($kind) + { + $this->kind = $kind; + } + + public function getKind() + { + return $this->kind; + } + + public function setNextLink($nextLink) + { + $this->nextLink = $nextLink; + } + + public function getNextLink() + { + return $this->nextLink; + } + + public function setNextPageToken($nextPageToken) + { + $this->nextPageToken = $nextPageToken; + } + + public function getNextPageToken() + { + return $this->nextPageToken; + } + + public function setSelfLink($selfLink) + { + $this->selfLink = $selfLink; + } + + public function getSelfLink() + { + return $this->selfLink; + } +} + +class Google_Service_Drive_DriveFile extends Google_Collection +{ + protected $collection_key = 'properties'; + protected $internal_gapi_mappings = array( + ); + public $alternateLink; + public $appDataContents; + public $copyable; + public $createdDate; + public $defaultOpenWithLink; + public $description; + public $downloadUrl; + public $editable; + public $embedLink; + public $etag; + public $explicitlyTrashed; + public $exportLinks; + public $fileExtension; + public $fileSize; + public $headRevisionId; + public $iconLink; + public $id; + protected $imageMediaMetadataType = 'Google_Service_Drive_DriveFileImageMediaMetadata'; + protected $imageMediaMetadataDataType = ''; + protected $indexableTextType = 'Google_Service_Drive_DriveFileIndexableText'; + protected $indexableTextDataType = ''; + public $kind; + protected $labelsType = 'Google_Service_Drive_DriveFileLabels'; + protected $labelsDataType = ''; + protected $lastModifyingUserType = 'Google_Service_Drive_User'; + protected $lastModifyingUserDataType = ''; + public $lastModifyingUserName; + public $lastViewedByMeDate; + public $markedViewedByMeDate; + public $md5Checksum; + public $mimeType; + public $modifiedByMeDate; + public $modifiedDate; + public $openWithLinks; + public $originalFilename; + public $ownerNames; + protected $ownersType = 'Google_Service_Drive_User'; + protected $ownersDataType = 'array'; + protected $parentsType = 'Google_Service_Drive_ParentReference'; + protected $parentsDataType = 'array'; + protected $permissionsType = 'Google_Service_Drive_Permission'; + protected $permissionsDataType = 'array'; + protected $propertiesType = 'Google_Service_Drive_Property'; + protected $propertiesDataType = 'array'; + public $quotaBytesUsed; + public $selfLink; + public $shared; + public $sharedWithMeDate; + protected $sharingUserType = 'Google_Service_Drive_User'; + protected $sharingUserDataType = ''; + protected $thumbnailType = 'Google_Service_Drive_DriveFileThumbnail'; + protected $thumbnailDataType = ''; + public $thumbnailLink; + public $title; + protected $userPermissionType = 'Google_Service_Drive_Permission'; + protected $userPermissionDataType = ''; + public $version; + protected $videoMediaMetadataType = 'Google_Service_Drive_DriveFileVideoMediaMetadata'; + protected $videoMediaMetadataDataType = ''; + public $webContentLink; + public $webViewLink; + public $writersCanShare; + + public function setAlternateLink($alternateLink) + { + $this->alternateLink = $alternateLink; + } + + public function getAlternateLink() + { + return $this->alternateLink; + } + + public function setAppDataContents($appDataContents) + { + $this->appDataContents = $appDataContents; + } + + public function getAppDataContents() + { + return $this->appDataContents; + } + + public function setCopyable($copyable) + { + $this->copyable = $copyable; + } + + public function getCopyable() + { + return $this->copyable; + } + + public function setCreatedDate($createdDate) + { + $this->createdDate = $createdDate; + } + + public function getCreatedDate() + { + return $this->createdDate; + } + + public function setDefaultOpenWithLink($defaultOpenWithLink) + { + $this->defaultOpenWithLink = $defaultOpenWithLink; + } + + public function getDefaultOpenWithLink() + { + return $this->defaultOpenWithLink; + } + + public function setDescription($description) + { + $this->description = $description; + } + + public function getDescription() + { + return $this->description; + } + + public function setDownloadUrl($downloadUrl) + { + $this->downloadUrl = $downloadUrl; + } + + public function getDownloadUrl() + { + return $this->downloadUrl; + } + + public function setEditable($editable) + { + $this->editable = $editable; + } + + public function getEditable() + { + return $this->editable; + } + + public function setEmbedLink($embedLink) + { + $this->embedLink = $embedLink; + } + + public function getEmbedLink() + { + return $this->embedLink; + } + + public function setEtag($etag) + { + $this->etag = $etag; + } + + public function getEtag() + { + return $this->etag; + } + + public function setExplicitlyTrashed($explicitlyTrashed) + { + $this->explicitlyTrashed = $explicitlyTrashed; + } + + public function getExplicitlyTrashed() + { + return $this->explicitlyTrashed; + } + + public function setExportLinks($exportLinks) + { + $this->exportLinks = $exportLinks; + } + + public function getExportLinks() + { + return $this->exportLinks; + } + + public function setFileExtension($fileExtension) + { + $this->fileExtension = $fileExtension; + } + + public function getFileExtension() + { + return $this->fileExtension; + } + + public function setFileSize($fileSize) + { + $this->fileSize = $fileSize; + } + + public function getFileSize() + { + return $this->fileSize; + } + + public function setHeadRevisionId($headRevisionId) + { + $this->headRevisionId = $headRevisionId; + } + + public function getHeadRevisionId() + { + return $this->headRevisionId; + } + + public function setIconLink($iconLink) + { + $this->iconLink = $iconLink; + } + + public function getIconLink() + { + return $this->iconLink; + } + + public function setId($id) + { + $this->id = $id; + } + + public function getId() + { + return $this->id; + } + + public function setImageMediaMetadata(Google_Service_Drive_DriveFileImageMediaMetadata $imageMediaMetadata) + { + $this->imageMediaMetadata = $imageMediaMetadata; + } + + public function getImageMediaMetadata() + { + return $this->imageMediaMetadata; + } + + public function setIndexableText(Google_Service_Drive_DriveFileIndexableText $indexableText) + { + $this->indexableText = $indexableText; + } + + public function getIndexableText() + { + return $this->indexableText; + } + + public function setKind($kind) + { + $this->kind = $kind; + } + + public function getKind() + { + return $this->kind; + } + + public function setLabels(Google_Service_Drive_DriveFileLabels $labels) + { + $this->labels = $labels; + } + + public function getLabels() + { + return $this->labels; + } + + public function setLastModifyingUser(Google_Service_Drive_User $lastModifyingUser) + { + $this->lastModifyingUser = $lastModifyingUser; + } + + public function getLastModifyingUser() + { + return $this->lastModifyingUser; + } + + public function setLastModifyingUserName($lastModifyingUserName) + { + $this->lastModifyingUserName = $lastModifyingUserName; + } + + public function getLastModifyingUserName() + { + return $this->lastModifyingUserName; + } + + public function setLastViewedByMeDate($lastViewedByMeDate) + { + $this->lastViewedByMeDate = $lastViewedByMeDate; + } + + public function getLastViewedByMeDate() + { + return $this->lastViewedByMeDate; + } + + public function setMarkedViewedByMeDate($markedViewedByMeDate) + { + $this->markedViewedByMeDate = $markedViewedByMeDate; + } + + public function getMarkedViewedByMeDate() + { + return $this->markedViewedByMeDate; + } + + public function setMd5Checksum($md5Checksum) + { + $this->md5Checksum = $md5Checksum; + } + + public function getMd5Checksum() + { + return $this->md5Checksum; + } + + public function setMimeType($mimeType) + { + $this->mimeType = $mimeType; + } + + public function getMimeType() + { + return $this->mimeType; + } + + public function setModifiedByMeDate($modifiedByMeDate) + { + $this->modifiedByMeDate = $modifiedByMeDate; + } + + public function getModifiedByMeDate() + { + return $this->modifiedByMeDate; + } + + public function setModifiedDate($modifiedDate) + { + $this->modifiedDate = $modifiedDate; + } + + public function getModifiedDate() + { + return $this->modifiedDate; + } + + public function setOpenWithLinks($openWithLinks) + { + $this->openWithLinks = $openWithLinks; + } + + public function getOpenWithLinks() + { + return $this->openWithLinks; + } + + public function setOriginalFilename($originalFilename) + { + $this->originalFilename = $originalFilename; + } + + public function getOriginalFilename() + { + return $this->originalFilename; + } + + public function setOwnerNames($ownerNames) + { + $this->ownerNames = $ownerNames; + } + + public function getOwnerNames() + { + return $this->ownerNames; + } + + public function setOwners($owners) + { + $this->owners = $owners; + } + + public function getOwners() + { + return $this->owners; + } + + public function setParents($parents) + { + $this->parents = $parents; + } + + public function getParents() + { + return $this->parents; + } + + public function setPermissions($permissions) + { + $this->permissions = $permissions; + } + + public function getPermissions() + { + return $this->permissions; + } + + public function setProperties($properties) + { + $this->properties = $properties; + } + + public function getProperties() + { + return $this->properties; + } + + public function setQuotaBytesUsed($quotaBytesUsed) + { + $this->quotaBytesUsed = $quotaBytesUsed; + } + + public function getQuotaBytesUsed() + { + return $this->quotaBytesUsed; + } + + public function setSelfLink($selfLink) + { + $this->selfLink = $selfLink; + } + + public function getSelfLink() + { + return $this->selfLink; + } + + public function setShared($shared) + { + $this->shared = $shared; + } + + public function getShared() + { + return $this->shared; + } + + public function setSharedWithMeDate($sharedWithMeDate) + { + $this->sharedWithMeDate = $sharedWithMeDate; + } + + public function getSharedWithMeDate() + { + return $this->sharedWithMeDate; + } + + public function setSharingUser(Google_Service_Drive_User $sharingUser) + { + $this->sharingUser = $sharingUser; + } + + public function getSharingUser() + { + return $this->sharingUser; + } + + public function setThumbnail(Google_Service_Drive_DriveFileThumbnail $thumbnail) + { + $this->thumbnail = $thumbnail; + } + + public function getThumbnail() + { + return $this->thumbnail; + } + + public function setThumbnailLink($thumbnailLink) + { + $this->thumbnailLink = $thumbnailLink; + } + + public function getThumbnailLink() + { + return $this->thumbnailLink; + } + + public function setTitle($title) + { + $this->title = $title; + } + + public function getTitle() + { + return $this->title; + } + + public function setUserPermission(Google_Service_Drive_Permission $userPermission) + { + $this->userPermission = $userPermission; + } + + public function getUserPermission() + { + return $this->userPermission; + } + + public function setVersion($version) + { + $this->version = $version; + } + + public function getVersion() + { + return $this->version; + } + + public function setVideoMediaMetadata(Google_Service_Drive_DriveFileVideoMediaMetadata $videoMediaMetadata) + { + $this->videoMediaMetadata = $videoMediaMetadata; + } + + public function getVideoMediaMetadata() + { + return $this->videoMediaMetadata; + } + + public function setWebContentLink($webContentLink) + { + $this->webContentLink = $webContentLink; + } + + public function getWebContentLink() + { + return $this->webContentLink; + } + + public function setWebViewLink($webViewLink) + { + $this->webViewLink = $webViewLink; + } + + public function getWebViewLink() + { + return $this->webViewLink; + } + + public function setWritersCanShare($writersCanShare) + { + $this->writersCanShare = $writersCanShare; + } + + public function getWritersCanShare() + { + return $this->writersCanShare; + } +} + +class Google_Service_Drive_DriveFileExportLinks extends Google_Model +{ + protected $internal_gapi_mappings = array( + ); +} + +class Google_Service_Drive_DriveFileImageMediaMetadata extends Google_Model +{ + protected $internal_gapi_mappings = array( + ); + public $aperture; + public $cameraMake; + public $cameraModel; + public $colorSpace; + public $date; + public $exposureBias; + public $exposureMode; + public $exposureTime; + public $flashUsed; + public $focalLength; + public $height; + public $isoSpeed; + public $lens; + protected $locationType = 'Google_Service_Drive_DriveFileImageMediaMetadataLocation'; + protected $locationDataType = ''; + public $maxApertureValue; + public $meteringMode; + public $rotation; + public $sensor; + public $subjectDistance; + public $whiteBalance; + public $width; + + public function setAperture($aperture) + { + $this->aperture = $aperture; + } + + public function getAperture() + { + return $this->aperture; + } + + public function setCameraMake($cameraMake) + { + $this->cameraMake = $cameraMake; + } + + public function getCameraMake() + { + return $this->cameraMake; + } + + public function setCameraModel($cameraModel) + { + $this->cameraModel = $cameraModel; + } + + public function getCameraModel() + { + return $this->cameraModel; + } + + public function setColorSpace($colorSpace) + { + $this->colorSpace = $colorSpace; + } + + public function getColorSpace() + { + return $this->colorSpace; + } + + public function setDate($date) + { + $this->date = $date; + } + + public function getDate() + { + return $this->date; + } + + public function setExposureBias($exposureBias) + { + $this->exposureBias = $exposureBias; + } + + public function getExposureBias() + { + return $this->exposureBias; + } + + public function setExposureMode($exposureMode) + { + $this->exposureMode = $exposureMode; + } + + public function getExposureMode() + { + return $this->exposureMode; + } + + public function setExposureTime($exposureTime) + { + $this->exposureTime = $exposureTime; + } + + public function getExposureTime() + { + return $this->exposureTime; + } + + public function setFlashUsed($flashUsed) + { + $this->flashUsed = $flashUsed; + } + + public function getFlashUsed() + { + return $this->flashUsed; + } + + public function setFocalLength($focalLength) + { + $this->focalLength = $focalLength; + } + + public function getFocalLength() + { + return $this->focalLength; + } + + public function setHeight($height) + { + $this->height = $height; + } + + public function getHeight() + { + return $this->height; + } + + public function setIsoSpeed($isoSpeed) + { + $this->isoSpeed = $isoSpeed; + } + + public function getIsoSpeed() + { + return $this->isoSpeed; + } + + public function setLens($lens) + { + $this->lens = $lens; + } + + public function getLens() + { + return $this->lens; + } + + public function setLocation(Google_Service_Drive_DriveFileImageMediaMetadataLocation $location) + { + $this->location = $location; + } + + public function getLocation() + { + return $this->location; + } + + public function setMaxApertureValue($maxApertureValue) + { + $this->maxApertureValue = $maxApertureValue; + } + + public function getMaxApertureValue() + { + return $this->maxApertureValue; + } + + public function setMeteringMode($meteringMode) + { + $this->meteringMode = $meteringMode; + } + + public function getMeteringMode() + { + return $this->meteringMode; + } + + public function setRotation($rotation) + { + $this->rotation = $rotation; + } + + public function getRotation() + { + return $this->rotation; + } + + public function setSensor($sensor) + { + $this->sensor = $sensor; + } + + public function getSensor() + { + return $this->sensor; + } + + public function setSubjectDistance($subjectDistance) + { + $this->subjectDistance = $subjectDistance; + } + + public function getSubjectDistance() + { + return $this->subjectDistance; + } + + public function setWhiteBalance($whiteBalance) + { + $this->whiteBalance = $whiteBalance; + } + + public function getWhiteBalance() + { + return $this->whiteBalance; + } + + public function setWidth($width) + { + $this->width = $width; + } + + public function getWidth() + { + return $this->width; + } +} + +class Google_Service_Drive_DriveFileImageMediaMetadataLocation extends Google_Model +{ + protected $internal_gapi_mappings = array( + ); + public $altitude; + public $latitude; + public $longitude; + + public function setAltitude($altitude) + { + $this->altitude = $altitude; + } + + public function getAltitude() + { + return $this->altitude; + } + + public function setLatitude($latitude) + { + $this->latitude = $latitude; + } + + public function getLatitude() + { + return $this->latitude; + } + + public function setLongitude($longitude) + { + $this->longitude = $longitude; + } + + public function getLongitude() + { + return $this->longitude; + } +} + +class Google_Service_Drive_DriveFileIndexableText extends Google_Model +{ + protected $internal_gapi_mappings = array( + ); + public $text; + + public function setText($text) + { + $this->text = $text; + } + + public function getText() + { + return $this->text; + } +} + +class Google_Service_Drive_DriveFileLabels extends Google_Model +{ + protected $internal_gapi_mappings = array( + ); + public $hidden; + public $restricted; + public $starred; + public $trashed; + public $viewed; + + public function setHidden($hidden) + { + $this->hidden = $hidden; + } + + public function getHidden() + { + return $this->hidden; + } + + public function setRestricted($restricted) + { + $this->restricted = $restricted; + } + + public function getRestricted() + { + return $this->restricted; + } + + public function setStarred($starred) + { + $this->starred = $starred; + } + + public function getStarred() + { + return $this->starred; + } + + public function setTrashed($trashed) + { + $this->trashed = $trashed; + } + + public function getTrashed() + { + return $this->trashed; + } + + public function setViewed($viewed) + { + $this->viewed = $viewed; + } + + public function getViewed() + { + return $this->viewed; + } +} + +class Google_Service_Drive_DriveFileOpenWithLinks extends Google_Model +{ + protected $internal_gapi_mappings = array( + ); +} + +class Google_Service_Drive_DriveFileThumbnail extends Google_Model +{ + protected $internal_gapi_mappings = array( + ); + public $image; + public $mimeType; + + public function setImage($image) + { + $this->image = $image; + } + + public function getImage() + { + return $this->image; + } + + public function setMimeType($mimeType) + { + $this->mimeType = $mimeType; + } + + public function getMimeType() + { + return $this->mimeType; + } +} + +class Google_Service_Drive_DriveFileVideoMediaMetadata extends Google_Model +{ + protected $internal_gapi_mappings = array( + ); + public $durationMillis; + public $height; + public $width; + + public function setDurationMillis($durationMillis) + { + $this->durationMillis = $durationMillis; + } + + public function getDurationMillis() + { + return $this->durationMillis; + } + + public function setHeight($height) + { + $this->height = $height; + } + + public function getHeight() + { + return $this->height; + } + + public function setWidth($width) + { + $this->width = $width; + } + + public function getWidth() + { + return $this->width; + } +} + +class Google_Service_Drive_FileList extends Google_Collection +{ + protected $collection_key = 'items'; + protected $internal_gapi_mappings = array( + ); + public $etag; + protected $itemsType = 'Google_Service_Drive_DriveFile'; + protected $itemsDataType = 'array'; + public $kind; + public $nextLink; + public $nextPageToken; + public $selfLink; + + public function setEtag($etag) + { + $this->etag = $etag; + } + + public function getEtag() + { + return $this->etag; + } + + public function setItems($items) + { + $this->items = $items; + } + + public function getItems() + { + return $this->items; + } + + public function setKind($kind) + { + $this->kind = $kind; + } + + public function getKind() + { + return $this->kind; + } + + public function setNextLink($nextLink) + { + $this->nextLink = $nextLink; + } + + public function getNextLink() + { + return $this->nextLink; + } + + public function setNextPageToken($nextPageToken) + { + $this->nextPageToken = $nextPageToken; + } + + public function getNextPageToken() + { + return $this->nextPageToken; + } + + public function setSelfLink($selfLink) + { + $this->selfLink = $selfLink; + } + + public function getSelfLink() + { + return $this->selfLink; + } +} + +class Google_Service_Drive_ParentList extends Google_Collection +{ + protected $collection_key = 'items'; + protected $internal_gapi_mappings = array( + ); + public $etag; + protected $itemsType = 'Google_Service_Drive_ParentReference'; + protected $itemsDataType = 'array'; + public $kind; + public $selfLink; + + public function setEtag($etag) + { + $this->etag = $etag; + } + + public function getEtag() + { + return $this->etag; + } + + public function setItems($items) + { + $this->items = $items; + } + + public function getItems() + { + return $this->items; + } + + public function setKind($kind) + { + $this->kind = $kind; + } + + public function getKind() + { + return $this->kind; + } + + public function setSelfLink($selfLink) + { + $this->selfLink = $selfLink; + } + + public function getSelfLink() + { + return $this->selfLink; + } +} + +class Google_Service_Drive_ParentReference extends Google_Model +{ + protected $internal_gapi_mappings = array( + ); + public $id; + public $isRoot; + public $kind; + public $parentLink; + public $selfLink; + + public function setId($id) + { + $this->id = $id; + } + + public function getId() + { + return $this->id; + } + + public function setIsRoot($isRoot) + { + $this->isRoot = $isRoot; + } + + public function getIsRoot() + { + return $this->isRoot; + } + + public function setKind($kind) + { + $this->kind = $kind; + } + + public function getKind() + { + return $this->kind; + } + + public function setParentLink($parentLink) + { + $this->parentLink = $parentLink; + } + + public function getParentLink() + { + return $this->parentLink; + } + + public function setSelfLink($selfLink) + { + $this->selfLink = $selfLink; + } + + public function getSelfLink() + { + return $this->selfLink; + } +} + +class Google_Service_Drive_Permission extends Google_Collection +{ + protected $collection_key = 'additionalRoles'; + protected $internal_gapi_mappings = array( + ); + public $additionalRoles; + public $authKey; + public $domain; + public $emailAddress; + public $etag; + public $id; + public $kind; + public $name; + public $photoLink; + public $role; + public $selfLink; + public $type; + public $value; + public $withLink; + + public function setAdditionalRoles($additionalRoles) + { + $this->additionalRoles = $additionalRoles; + } + + public function getAdditionalRoles() + { + return $this->additionalRoles; + } + + public function setAuthKey($authKey) + { + $this->authKey = $authKey; + } + + public function getAuthKey() + { + return $this->authKey; + } + + public function setDomain($domain) + { + $this->domain = $domain; + } + + public function getDomain() + { + return $this->domain; + } + + public function setEmailAddress($emailAddress) + { + $this->emailAddress = $emailAddress; + } + + public function getEmailAddress() + { + return $this->emailAddress; + } + + public function setEtag($etag) + { + $this->etag = $etag; + } + + public function getEtag() + { + return $this->etag; + } + + public function setId($id) + { + $this->id = $id; + } + + public function getId() + { + return $this->id; + } + + public function setKind($kind) + { + $this->kind = $kind; + } + + public function getKind() + { + return $this->kind; + } + + public function setName($name) + { + $this->name = $name; + } + + public function getName() + { + return $this->name; + } + + public function setPhotoLink($photoLink) + { + $this->photoLink = $photoLink; + } + + public function getPhotoLink() + { + return $this->photoLink; + } + + public function setRole($role) + { + $this->role = $role; + } + + public function getRole() + { + return $this->role; + } + + public function setSelfLink($selfLink) + { + $this->selfLink = $selfLink; + } + + public function getSelfLink() + { + return $this->selfLink; + } + + public function setType($type) + { + $this->type = $type; + } + + public function getType() + { + return $this->type; + } + + public function setValue($value) + { + $this->value = $value; + } + + public function getValue() + { + return $this->value; + } + + public function setWithLink($withLink) + { + $this->withLink = $withLink; + } + + public function getWithLink() + { + return $this->withLink; + } +} + +class Google_Service_Drive_PermissionId extends Google_Model +{ + protected $internal_gapi_mappings = array( + ); + public $id; + public $kind; + + public function setId($id) + { + $this->id = $id; + } + + public function getId() + { + return $this->id; + } + + public function setKind($kind) + { + $this->kind = $kind; + } + + public function getKind() + { + return $this->kind; + } +} + +class Google_Service_Drive_PermissionList extends Google_Collection +{ + protected $collection_key = 'items'; + protected $internal_gapi_mappings = array( + ); + public $etag; + protected $itemsType = 'Google_Service_Drive_Permission'; + protected $itemsDataType = 'array'; + public $kind; + public $selfLink; + + public function setEtag($etag) + { + $this->etag = $etag; + } + + public function getEtag() + { + return $this->etag; + } + + public function setItems($items) + { + $this->items = $items; + } + + public function getItems() + { + return $this->items; + } + + public function setKind($kind) + { + $this->kind = $kind; + } + + public function getKind() + { + return $this->kind; + } + + public function setSelfLink($selfLink) + { + $this->selfLink = $selfLink; + } + + public function getSelfLink() + { + return $this->selfLink; + } +} + +class Google_Service_Drive_Property extends Google_Model +{ + protected $internal_gapi_mappings = array( + ); + public $etag; + public $key; + public $kind; + public $selfLink; + public $value; + public $visibility; + + public function setEtag($etag) + { + $this->etag = $etag; + } + + public function getEtag() + { + return $this->etag; + } + + public function setKey($key) + { + $this->key = $key; + } + + public function getKey() + { + return $this->key; + } + + public function setKind($kind) + { + $this->kind = $kind; + } + + public function getKind() + { + return $this->kind; + } + + public function setSelfLink($selfLink) + { + $this->selfLink = $selfLink; + } + + public function getSelfLink() + { + return $this->selfLink; + } + + public function setValue($value) + { + $this->value = $value; + } + + public function getValue() + { + return $this->value; + } + + public function setVisibility($visibility) + { + $this->visibility = $visibility; + } + + public function getVisibility() + { + return $this->visibility; + } +} + +class Google_Service_Drive_PropertyList extends Google_Collection +{ + protected $collection_key = 'items'; + protected $internal_gapi_mappings = array( + ); + public $etag; + protected $itemsType = 'Google_Service_Drive_Property'; + protected $itemsDataType = 'array'; + public $kind; + public $selfLink; + + public function setEtag($etag) + { + $this->etag = $etag; + } + + public function getEtag() + { + return $this->etag; + } + + public function setItems($items) + { + $this->items = $items; + } + + public function getItems() + { + return $this->items; + } + + public function setKind($kind) + { + $this->kind = $kind; + } + + public function getKind() + { + return $this->kind; + } + + public function setSelfLink($selfLink) + { + $this->selfLink = $selfLink; + } + + public function getSelfLink() + { + return $this->selfLink; + } +} + +class Google_Service_Drive_Revision extends Google_Model +{ + protected $internal_gapi_mappings = array( + ); + public $downloadUrl; + public $etag; + public $exportLinks; + public $fileSize; + public $id; + public $kind; + protected $lastModifyingUserType = 'Google_Service_Drive_User'; + protected $lastModifyingUserDataType = ''; + public $lastModifyingUserName; + public $md5Checksum; + public $mimeType; + public $modifiedDate; + public $originalFilename; + public $pinned; + public $publishAuto; + public $published; + public $publishedLink; + public $publishedOutsideDomain; + public $selfLink; + + public function setDownloadUrl($downloadUrl) + { + $this->downloadUrl = $downloadUrl; + } + + public function getDownloadUrl() + { + return $this->downloadUrl; + } + + public function setEtag($etag) + { + $this->etag = $etag; + } + + public function getEtag() + { + return $this->etag; + } + + public function setExportLinks($exportLinks) + { + $this->exportLinks = $exportLinks; + } + + public function getExportLinks() + { + return $this->exportLinks; + } + + public function setFileSize($fileSize) + { + $this->fileSize = $fileSize; + } + + public function getFileSize() + { + return $this->fileSize; + } + + public function setId($id) + { + $this->id = $id; + } + + public function getId() + { + return $this->id; + } + + public function setKind($kind) + { + $this->kind = $kind; + } + + public function getKind() + { + return $this->kind; + } + + public function setLastModifyingUser(Google_Service_Drive_User $lastModifyingUser) + { + $this->lastModifyingUser = $lastModifyingUser; + } + + public function getLastModifyingUser() + { + return $this->lastModifyingUser; + } + + public function setLastModifyingUserName($lastModifyingUserName) + { + $this->lastModifyingUserName = $lastModifyingUserName; + } + + public function getLastModifyingUserName() + { + return $this->lastModifyingUserName; + } + + public function setMd5Checksum($md5Checksum) + { + $this->md5Checksum = $md5Checksum; + } + + public function getMd5Checksum() + { + return $this->md5Checksum; + } + + public function setMimeType($mimeType) + { + $this->mimeType = $mimeType; + } + + public function getMimeType() + { + return $this->mimeType; + } + + public function setModifiedDate($modifiedDate) + { + $this->modifiedDate = $modifiedDate; + } + + public function getModifiedDate() + { + return $this->modifiedDate; + } + + public function setOriginalFilename($originalFilename) + { + $this->originalFilename = $originalFilename; + } + + public function getOriginalFilename() + { + return $this->originalFilename; + } + + public function setPinned($pinned) + { + $this->pinned = $pinned; + } + + public function getPinned() + { + return $this->pinned; + } + + public function setPublishAuto($publishAuto) + { + $this->publishAuto = $publishAuto; + } + + public function getPublishAuto() + { + return $this->publishAuto; + } + + public function setPublished($published) + { + $this->published = $published; + } + + public function getPublished() + { + return $this->published; + } + + public function setPublishedLink($publishedLink) + { + $this->publishedLink = $publishedLink; + } + + public function getPublishedLink() + { + return $this->publishedLink; + } + + public function setPublishedOutsideDomain($publishedOutsideDomain) + { + $this->publishedOutsideDomain = $publishedOutsideDomain; + } + + public function getPublishedOutsideDomain() + { + return $this->publishedOutsideDomain; + } + + public function setSelfLink($selfLink) + { + $this->selfLink = $selfLink; + } + + public function getSelfLink() + { + return $this->selfLink; + } +} + +class Google_Service_Drive_RevisionExportLinks extends Google_Model +{ + protected $internal_gapi_mappings = array( + ); +} + +class Google_Service_Drive_RevisionList extends Google_Collection +{ + protected $collection_key = 'items'; + protected $internal_gapi_mappings = array( + ); + public $etag; + protected $itemsType = 'Google_Service_Drive_Revision'; + protected $itemsDataType = 'array'; + public $kind; + public $selfLink; + + public function setEtag($etag) + { + $this->etag = $etag; + } + + public function getEtag() + { + return $this->etag; + } + + public function setItems($items) + { + $this->items = $items; + } + + public function getItems() + { + return $this->items; + } + + public function setKind($kind) + { + $this->kind = $kind; + } + + public function getKind() + { + return $this->kind; + } + + public function setSelfLink($selfLink) + { + $this->selfLink = $selfLink; + } + + public function getSelfLink() + { + return $this->selfLink; + } +} + +class Google_Service_Drive_User extends Google_Model +{ + protected $internal_gapi_mappings = array( + ); + public $displayName; + public $emailAddress; + public $isAuthenticatedUser; + public $kind; + public $permissionId; + protected $pictureType = 'Google_Service_Drive_UserPicture'; + protected $pictureDataType = ''; + + public function setDisplayName($displayName) + { + $this->displayName = $displayName; + } + + public function getDisplayName() + { + return $this->displayName; + } + + public function setEmailAddress($emailAddress) + { + $this->emailAddress = $emailAddress; + } + + public function getEmailAddress() + { + return $this->emailAddress; + } + + public function setIsAuthenticatedUser($isAuthenticatedUser) + { + $this->isAuthenticatedUser = $isAuthenticatedUser; + } + + public function getIsAuthenticatedUser() + { + return $this->isAuthenticatedUser; + } + + public function setKind($kind) + { + $this->kind = $kind; + } + + public function getKind() + { + return $this->kind; + } + + public function setPermissionId($permissionId) + { + $this->permissionId = $permissionId; + } + + public function getPermissionId() + { + return $this->permissionId; + } + + public function setPicture(Google_Service_Drive_UserPicture $picture) + { + $this->picture = $picture; + } + + public function getPicture() + { + return $this->picture; + } +} + +class Google_Service_Drive_UserPicture extends Google_Model +{ + protected $internal_gapi_mappings = array( + ); + public $url; + + public function setUrl($url) + { + $this->url = $url; + } + + public function getUrl() + { + return $this->url; + } +} diff --git a/apps/files_external/3rdparty/google-api-php-client/src/Google/Service/Exception.php b/apps/files_external/3rdparty/google-api-php-client/src/Google/Service/Exception.php new file mode 100644 index 00000000000..a780ff7b47c --- /dev/null +++ b/apps/files_external/3rdparty/google-api-php-client/src/Google/Service/Exception.php @@ -0,0 +1,53 @@ +<?php + +require_once 'Google/Exception.php'; + +class Google_Service_Exception extends Google_Exception +{ + /** + * Optional list of errors returned in a JSON body of an HTTP error response. + */ + protected $errors = array(); + + /** + * Override default constructor to add ability to set $errors. + * + * @param string $message + * @param int $code + * @param Exception|null $previous + * @param [{string, string}] errors List of errors returned in an HTTP + * response. Defaults to []. + */ + public function __construct( + $message, + $code = 0, + Exception $previous = null, + $errors = array() + ) { + if (version_compare(PHP_VERSION, '5.3.0') >= 0) { + parent::__construct($message, $code, $previous); + } else { + parent::__construct($message, $code); + } + + $this->errors = $errors; + } + + /** + * An example of the possible errors returned. + * + * { + * "domain": "global", + * "reason": "authError", + * "message": "Invalid Credentials", + * "locationType": "header", + * "location": "Authorization", + * } + * + * @return [{string, string}] List of errors return in an HTTP response or []. + */ + public function getErrors() + { + return $this->errors; + } +} diff --git a/apps/files_external/3rdparty/google-api-php-client/src/Google/Service/Resource.php b/apps/files_external/3rdparty/google-api-php-client/src/Google/Service/Resource.php new file mode 100644 index 00000000000..d396907e1d0 --- /dev/null +++ b/apps/files_external/3rdparty/google-api-php-client/src/Google/Service/Resource.php @@ -0,0 +1,210 @@ +<?php +/** + * Copyright 2010 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +require_once 'Google/Client.php'; +require_once 'Google/Exception.php'; +require_once 'Google/Utils.php'; +require_once 'Google/Http/Request.php'; +require_once 'Google/Http/MediaFileUpload.php'; +require_once 'Google/Http/REST.php'; + +/** + * Implements the actual methods/resources of the discovered Google API using magic function + * calling overloading (__call()), which on call will see if the method name (plus.activities.list) + * is available in this service, and if so construct an apiHttpRequest representing it. + * + * @author Chris Chabot <chabotc@google.com> + * @author Chirag Shah <chirags@google.com> + * + */ +class Google_Service_Resource +{ + // Valid query parameters that work, but don't appear in discovery. + private $stackParameters = array( + 'alt' => array('type' => 'string', 'location' => 'query'), + 'fields' => array('type' => 'string', 'location' => 'query'), + 'trace' => array('type' => 'string', 'location' => 'query'), + 'userIp' => array('type' => 'string', 'location' => 'query'), + 'userip' => array('type' => 'string', 'location' => 'query'), + 'quotaUser' => array('type' => 'string', 'location' => 'query'), + 'data' => array('type' => 'string', 'location' => 'body'), + 'mimeType' => array('type' => 'string', 'location' => 'header'), + 'uploadType' => array('type' => 'string', 'location' => 'query'), + 'mediaUpload' => array('type' => 'complex', 'location' => 'query'), + ); + + /** @var Google_Service $service */ + private $service; + + /** @var Google_Client $client */ + private $client; + + /** @var string $serviceName */ + private $serviceName; + + /** @var string $resourceName */ + private $resourceName; + + /** @var array $methods */ + private $methods; + + public function __construct($service, $serviceName, $resourceName, $resource) + { + $this->service = $service; + $this->client = $service->getClient(); + $this->serviceName = $serviceName; + $this->resourceName = $resourceName; + $this->methods = isset($resource['methods']) ? + $resource['methods'] : + array($resourceName => $resource); + } + + /** + * TODO(ianbarber): This function needs simplifying. + * @param $name + * @param $arguments + * @param $expected_class - optional, the expected class name + * @return Google_Http_Request|expected_class + * @throws Google_Exception + */ + public function call($name, $arguments, $expected_class = null) + { + if (! isset($this->methods[$name])) { + throw new Google_Exception( + "Unknown function: " . + "{$this->serviceName}->{$this->resourceName}->{$name}()" + ); + } + $method = $this->methods[$name]; + $parameters = $arguments[0]; + + // postBody is a special case since it's not defined in the discovery + // document as parameter, but we abuse the param entry for storing it. + $postBody = null; + if (isset($parameters['postBody'])) { + if ($parameters['postBody'] instanceof Google_Model) { + // In the cases the post body is an existing object, we want + // to use the smart method to create a simple object for + // for JSONification. + $parameters['postBody'] = $parameters['postBody']->toSimpleObject(); + } else if (is_object($parameters['postBody'])) { + // If the post body is another kind of object, we will try and + // wrangle it into a sensible format. + $parameters['postBody'] = + $this->convertToArrayAndStripNulls($parameters['postBody']); + } + $postBody = json_encode($parameters['postBody']); + unset($parameters['postBody']); + } + + // TODO(ianbarber): optParams here probably should have been + // handled already - this may well be redundant code. + if (isset($parameters['optParams'])) { + $optParams = $parameters['optParams']; + unset($parameters['optParams']); + $parameters = array_merge($parameters, $optParams); + } + + if (!isset($method['parameters'])) { + $method['parameters'] = array(); + } + + $method['parameters'] = array_merge( + $method['parameters'], + $this->stackParameters + ); + foreach ($parameters as $key => $val) { + if ($key != 'postBody' && ! isset($method['parameters'][$key])) { + throw new Google_Exception("($name) unknown parameter: '$key'"); + } + } + + foreach ($method['parameters'] as $paramName => $paramSpec) { + if (isset($paramSpec['required']) && + $paramSpec['required'] && + ! isset($parameters[$paramName]) + ) { + throw new Google_Exception("($name) missing required param: '$paramName'"); + } + if (isset($parameters[$paramName])) { + $value = $parameters[$paramName]; + $parameters[$paramName] = $paramSpec; + $parameters[$paramName]['value'] = $value; + unset($parameters[$paramName]['required']); + } else { + // Ensure we don't pass nulls. + unset($parameters[$paramName]); + } + } + + $servicePath = $this->service->servicePath; + + $url = Google_Http_REST::createRequestUri( + $servicePath, + $method['path'], + $parameters + ); + $httpRequest = new Google_Http_Request( + $url, + $method['httpMethod'], + null, + $postBody + ); + $httpRequest->setBaseComponent($this->client->getBasePath()); + + if ($postBody) { + $contentTypeHeader = array(); + $contentTypeHeader['content-type'] = 'application/json; charset=UTF-8'; + $httpRequest->setRequestHeaders($contentTypeHeader); + $httpRequest->setPostBody($postBody); + } + + $httpRequest = $this->client->getAuth()->sign($httpRequest); + $httpRequest->setExpectedClass($expected_class); + + if (isset($parameters['data']) && + ($parameters['uploadType']['value'] == 'media' || $parameters['uploadType']['value'] == 'multipart')) { + // If we are doing a simple media upload, trigger that as a convenience. + $mfu = new Google_Http_MediaFileUpload( + $this->client, + $httpRequest, + isset($parameters['mimeType']) ? $parameters['mimeType']['value'] : 'application/octet-stream', + $parameters['data']['value'] + ); + } + + if ($this->client->shouldDefer()) { + // If we are in batch or upload mode, return the raw request. + return $httpRequest; + } + + return $this->client->execute($httpRequest); + } + + protected function convertToArrayAndStripNulls($o) + { + $o = (array) $o; + foreach ($o as $k => $v) { + if ($v === null) { + unset($o[$k]); + } elseif (is_object($v) || is_array($v)) { + $o[$k] = $this->convertToArrayAndStripNulls($o[$k]); + } + } + return $o; + } +} diff --git a/apps/files_external/3rdparty/google-api-php-client/src/auth/Google_Signer.php b/apps/files_external/3rdparty/google-api-php-client/src/Google/Signer/Abstract.php index 7892baac8df..250180920db 100644 --- a/apps/files_external/3rdparty/google-api-php-client/src/auth/Google_Signer.php +++ b/apps/files_external/3rdparty/google-api-php-client/src/Google/Signer/Abstract.php @@ -15,14 +15,13 @@ * limitations under the License. */ -require_once "Google_P12Signer.php"; - /** * Signs data. * * @author Brian Eaton <beaton@google.com> */ -abstract class Google_Signer { +abstract class Google_Signer_Abstract +{ /** * Signs data, returns the signature as binary data. */ diff --git a/apps/files_external/3rdparty/google-api-php-client/src/Google/Signer/P12.php b/apps/files_external/3rdparty/google-api-php-client/src/Google/Signer/P12.php new file mode 100644 index 00000000000..7cc6098bb63 --- /dev/null +++ b/apps/files_external/3rdparty/google-api-php-client/src/Google/Signer/P12.php @@ -0,0 +1,91 @@ +<?php +/* + * Copyright 2011 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +require_once 'Google/Auth/Exception.php'; +require_once 'Google/Signer/Abstract.php'; + +/** + * Signs data. + * + * Only used for testing. + * + * @author Brian Eaton <beaton@google.com> + */ +class Google_Signer_P12 extends Google_Signer_Abstract +{ + // OpenSSL private key resource + private $privateKey; + + // Creates a new signer from a .p12 file. + public function __construct($p12, $password) + { + if (!function_exists('openssl_x509_read')) { + throw new Google_Exception( + 'The Google PHP API library needs the openssl PHP extension' + ); + } + + // If the private key is provided directly, then this isn't in the p12 + // format. Different versions of openssl support different p12 formats + // and the key from google wasn't being accepted by the version available + // at the time. + if (!$password && strpos($p12, "-----BEGIN RSA PRIVATE KEY-----") !== false) { + $this->privateKey = openssl_pkey_get_private($p12); + } else { + // This throws on error + $certs = array(); + if (!openssl_pkcs12_read($p12, $certs, $password)) { + throw new Google_Auth_Exception( + "Unable to parse the p12 file. " . + "Is this a .p12 file? Is the password correct? OpenSSL error: " . + openssl_error_string() + ); + } + // TODO(beaton): is this part of the contract for the openssl_pkcs12_read + // method? What happens if there are multiple private keys? Do we care? + if (!array_key_exists("pkey", $certs) || !$certs["pkey"]) { + throw new Google_Auth_Exception("No private key found in p12 file."); + } + $this->privateKey = openssl_pkey_get_private($certs['pkey']); + } + + if (!$this->privateKey) { + throw new Google_Auth_Exception("Unable to load private key"); + } + } + + public function __destruct() + { + if ($this->privateKey) { + openssl_pkey_free($this->privateKey); + } + } + + public function sign($data) + { + if (version_compare(PHP_VERSION, '5.3.0') < 0) { + throw new Google_Auth_Exception( + "PHP 5.3.0 or higher is required to use service accounts." + ); + } + $hash = defined("OPENSSL_ALGO_SHA256") ? OPENSSL_ALGO_SHA256 : "sha256"; + if (!openssl_sign($data, $signature, $this->privateKey, $hash)) { + throw new Google_Auth_Exception("Unable to sign data"); + } + return $signature; + } +} diff --git a/apps/files_external/3rdparty/google-api-php-client/src/service/Google_Utils.php b/apps/files_external/3rdparty/google-api-php-client/src/Google/Utils.php index be94902c2ed..f5ef32cd4d6 100644 --- a/apps/files_external/3rdparty/google-api-php-client/src/service/Google_Utils.php +++ b/apps/files_external/3rdparty/google-api-php-client/src/Google/Utils.php @@ -21,25 +21,33 @@ * * @author Chirag Shah <chirags@google.com> */ -class Google_Utils { - public static function urlSafeB64Encode($data) { +class Google_Utils +{ + public static function urlSafeB64Encode($data) + { $b64 = base64_encode($data); - $b64 = str_replace(array('+', '/', '\r', '\n', '='), - array('-', '_'), - $b64); + $b64 = str_replace( + array('+', '/', '\r', '\n', '='), + array('-', '_'), + $b64 + ); return $b64; } - public static function urlSafeB64Decode($b64) { - $b64 = str_replace(array('-', '_'), - array('+', '/'), - $b64); + public static function urlSafeB64Decode($b64) + { + $b64 = str_replace( + array('-', '_'), + array('+', '/'), + $b64 + ); return base64_decode($b64); } /** - * Misc function used to count the number of bytes in a post body, in the world of multi-byte chars - * and the unpredictability of strlen/mb_strlen/sizeof, this is the only way to do that in a sane + * Misc function used to count the number of bytes in a post body, in the + * world of multi-byte chars and the unpredictability of + * strlen/mb_strlen/sizeof, this is the only way to do that in a sane * manner at the moment. * * This algorithm was originally developed for the @@ -51,7 +59,8 @@ class Google_Utils { * @param string $str * @return int The number of bytes in a string. */ - static public function getStrLen($str) { + public static function getStrLen($str) + { $strlenVar = strlen($str); $d = $ret = 0; for ($count = 0; $count < $strlenVar; ++ $count) { @@ -61,31 +70,26 @@ class Google_Utils { // characters U-00000000 - U-0000007F (same as ASCII) $ret ++; break; - case (($ordinalValue & 0xE0) == 0xC0): // characters U-00000080 - U-000007FF, mask 110XXXXX // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $ret += 2; break; - case (($ordinalValue & 0xF0) == 0xE0): // characters U-00000800 - U-0000FFFF, mask 1110XXXX // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $ret += 3; break; - case (($ordinalValue & 0xF8) == 0xF0): // characters U-00010000 - U-001FFFFF, mask 11110XXX // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $ret += 4; break; - case (($ordinalValue & 0xFC) == 0xF8): // characters U-00200000 - U-03FFFFFF, mask 111110XX // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 $ret += 5; break; - case (($ordinalValue & 0xFE) == 0xFC): // characters U-04000000 - U-7FFFFFFF, mask 1111110X // see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8 @@ -103,7 +107,8 @@ class Google_Utils { * @param array $arr * @return array Normalized array. */ - public static function normalize($arr) { + public static function normalize($arr) + { if (!is_array($arr)) { return array(); } @@ -114,4 +119,17 @@ class Google_Utils { } return $normalized; } -}
\ No newline at end of file + + /** + * Convert a string to camelCase + * @param string $value + * @return string + */ + public static function camelCase($value) + { + $value = ucwords(str_replace(array('-', '_'), ' ', $value)); + $value = str_replace(' ', '', $value); + $value[0] = strtolower($value[0]); + return $value; + } +} diff --git a/apps/files_external/3rdparty/google-api-php-client/src/Google/Utils/URITemplate.php b/apps/files_external/3rdparty/google-api-php-client/src/Google/Utils/URITemplate.php new file mode 100644 index 00000000000..f5ee38bb333 --- /dev/null +++ b/apps/files_external/3rdparty/google-api-php-client/src/Google/Utils/URITemplate.php @@ -0,0 +1,333 @@ +<?php +/* + * Copyright 2013 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Implementation of levels 1-3 of the URI Template spec. + * @see http://tools.ietf.org/html/rfc6570 + */ +class Google_Utils_URITemplate +{ + const TYPE_MAP = "1"; + const TYPE_LIST = "2"; + const TYPE_SCALAR = "4"; + + /** + * @var $operators array + * These are valid at the start of a template block to + * modify the way in which the variables inside are + * processed. + */ + private $operators = array( + "+" => "reserved", + "/" => "segments", + "." => "dotprefix", + "#" => "fragment", + ";" => "semicolon", + "?" => "form", + "&" => "continuation" + ); + + /** + * @var reserved array + * These are the characters which should not be URL encoded in reserved + * strings. + */ + private $reserved = array( + "=", ",", "!", "@", "|", ":", "/", "?", "#", + "[", "]",'$', "&", "'", "(", ")", "*", "+", ";" + ); + private $reservedEncoded = array( + "%3D", "%2C", "%21", "%40", "%7C", "%3A", "%2F", "%3F", + "%23", "%5B", "%5D", "%24", "%26", "%27", "%28", "%29", + "%2A", "%2B", "%3B" + ); + + public function parse($string, array $parameters) + { + return $this->resolveNextSection($string, $parameters); + } + + /** + * This function finds the first matching {...} block and + * executes the replacement. It then calls itself to find + * subsequent blocks, if any. + */ + private function resolveNextSection($string, $parameters) + { + $start = strpos($string, "{"); + if ($start === false) { + return $string; + } + $end = strpos($string, "}"); + if ($end === false) { + return $string; + } + $string = $this->replace($string, $start, $end, $parameters); + return $this->resolveNextSection($string, $parameters); + } + + private function replace($string, $start, $end, $parameters) + { + // We know a data block will have {} round it, so we can strip that. + $data = substr($string, $start + 1, $end - $start - 1); + + // If the first character is one of the reserved operators, it effects + // the processing of the stream. + if (isset($this->operators[$data[0]])) { + $op = $this->operators[$data[0]]; + $data = substr($data, 1); + $prefix = ""; + $prefix_on_missing = false; + + switch ($op) { + case "reserved": + // Reserved means certain characters should not be URL encoded + $data = $this->replaceVars($data, $parameters, ",", null, true); + break; + case "fragment": + // Comma separated with fragment prefix. Bare values only. + $prefix = "#"; + $prefix_on_missing = true; + $data = $this->replaceVars($data, $parameters, ",", null, true); + break; + case "segments": + // Slash separated data. Bare values only. + $prefix = "/"; + $data =$this->replaceVars($data, $parameters, "/"); + break; + case "dotprefix": + // Dot separated data. Bare values only. + $prefix = "."; + $prefix_on_missing = true; + $data = $this->replaceVars($data, $parameters, "."); + break; + case "semicolon": + // Semicolon prefixed and separated. Uses the key name + $prefix = ";"; + $data = $this->replaceVars($data, $parameters, ";", "=", false, true, false); + break; + case "form": + // Standard URL format. Uses the key name + $prefix = "?"; + $data = $this->replaceVars($data, $parameters, "&", "="); + break; + case "continuation": + // Standard URL, but with leading ampersand. Uses key name. + $prefix = "&"; + $data = $this->replaceVars($data, $parameters, "&", "="); + break; + } + + // Add the initial prefix character if data is valid. + if ($data || ($data !== false && $prefix_on_missing)) { + $data = $prefix . $data; + } + + } else { + // If no operator we replace with the defaults. + $data = $this->replaceVars($data, $parameters); + } + // This is chops out the {...} and replaces with the new section. + return substr($string, 0, $start) . $data . substr($string, $end + 1); + } + + private function replaceVars( + $section, + $parameters, + $sep = ",", + $combine = null, + $reserved = false, + $tag_empty = false, + $combine_on_empty = true + ) { + if (strpos($section, ",") === false) { + // If we only have a single value, we can immediately process. + return $this->combine( + $section, + $parameters, + $sep, + $combine, + $reserved, + $tag_empty, + $combine_on_empty + ); + } else { + // If we have multiple values, we need to split and loop over them. + // Each is treated individually, then glued together with the + // separator character. + $vars = explode(",", $section); + return $this->combineList( + $vars, + $sep, + $parameters, + $combine, + $reserved, + false, // Never emit empty strings in multi-param replacements + $combine_on_empty + ); + } + } + + public function combine( + $key, + $parameters, + $sep, + $combine, + $reserved, + $tag_empty, + $combine_on_empty + ) { + $length = false; + $explode = false; + $skip_final_combine = false; + $value = false; + + // Check for length restriction. + if (strpos($key, ":") !== false) { + list($key, $length) = explode(":", $key); + } + + // Check for explode parameter. + if ($key[strlen($key) - 1] == "*") { + $explode = true; + $key = substr($key, 0, -1); + $skip_final_combine = true; + } + + // Define the list separator. + $list_sep = $explode ? $sep : ","; + + if (isset($parameters[$key])) { + $data_type = $this->getDataType($parameters[$key]); + switch($data_type) { + case self::TYPE_SCALAR: + $value = $this->getValue($parameters[$key], $length); + break; + case self::TYPE_LIST: + $values = array(); + foreach ($parameters[$key] as $pkey => $pvalue) { + $pvalue = $this->getValue($pvalue, $length); + if ($combine && $explode) { + $values[$pkey] = $key . $combine . $pvalue; + } else { + $values[$pkey] = $pvalue; + } + } + $value = implode($list_sep, $values); + if ($value == '') { + return ''; + } + break; + case self::TYPE_MAP: + $values = array(); + foreach ($parameters[$key] as $pkey => $pvalue) { + $pvalue = $this->getValue($pvalue, $length); + if ($explode) { + $pkey = $this->getValue($pkey, $length); + $values[] = $pkey . "=" . $pvalue; // Explode triggers = combine. + } else { + $values[] = $pkey; + $values[] = $pvalue; + } + } + $value = implode($list_sep, $values); + if ($value == '') { + return false; + } + break; + } + } else if ($tag_empty) { + // If we are just indicating empty values with their key name, return that. + return $key; + } else { + // Otherwise we can skip this variable due to not being defined. + return false; + } + + if ($reserved) { + $value = str_replace($this->reservedEncoded, $this->reserved, $value); + } + + // If we do not need to include the key name, we just return the raw + // value. + if (!$combine || $skip_final_combine) { + return $value; + } + + // Else we combine the key name: foo=bar, if value is not the empty string. + return $key . ($value != '' || $combine_on_empty ? $combine . $value : ''); + } + + /** + * Return the type of a passed in value + */ + private function getDataType($data) + { + if (is_array($data)) { + reset($data); + if (key($data) !== 0) { + return self::TYPE_MAP; + } + return self::TYPE_LIST; + } + return self::TYPE_SCALAR; + } + + /** + * Utility function that merges multiple combine calls + * for multi-key templates. + */ + private function combineList( + $vars, + $sep, + $parameters, + $combine, + $reserved, + $tag_empty, + $combine_on_empty + ) { + $ret = array(); + foreach ($vars as $var) { + $response = $this->combine( + $var, + $parameters, + $sep, + $combine, + $reserved, + $tag_empty, + $combine_on_empty + ); + if ($response === false) { + continue; + } + $ret[] = $response; + } + return implode($sep, $ret); + } + + /** + * Utility function to encode and trim values + */ + private function getValue($value, $length) + { + if ($length) { + $value = substr($value, 0, $length); + } + $value = rawurlencode($value); + return $value; + } +} diff --git a/apps/files_external/3rdparty/google-api-php-client/src/auth/Google_Verifier.php b/apps/files_external/3rdparty/google-api-php-client/src/Google/Verifier/Abstract.php index 2839a371df1..e6c9eeb03cc 100644 --- a/apps/files_external/3rdparty/google-api-php-client/src/auth/Google_Verifier.php +++ b/apps/files_external/3rdparty/google-api-php-client/src/Google/Verifier/Abstract.php @@ -15,14 +15,13 @@ * limitations under the License. */ -require_once "Google_PemVerifier.php"; - /** * Verifies signatures. * * @author Brian Eaton <beaton@google.com> */ -abstract class Google_Verifier { +abstract class Google_Verifier_Abstract +{ /** * Checks a signature, returns true if the signature is correct, * false otherwise. diff --git a/apps/files_external/3rdparty/google-api-php-client/src/auth/Google_PemVerifier.php b/apps/files_external/3rdparty/google-api-php-client/src/Google/Verifier/Pem.php index 6c1c85fa20e..f281575e172 100644 --- a/apps/files_external/3rdparty/google-api-php-client/src/auth/Google_PemVerifier.php +++ b/apps/files_external/3rdparty/google-api-php-client/src/Google/Verifier/Pem.php @@ -14,13 +14,17 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + +require_once 'Google/Auth/Exception.php'; +require_once 'Google/Verifier/Abstract.php'; /** * Verifies signatures using PEM encoded certificates. * * @author Brian Eaton <beaton@google.com> */ -class Google_PemVerifier extends Google_Verifier { +class Google_Verifier_Pem extends Google_Verifier_Abstract +{ private $publicKey; /** @@ -28,20 +32,22 @@ class Google_PemVerifier extends Google_Verifier { * * $pem: a PEM encoded certificate (not a file). * @param $pem - * @throws Google_AuthException + * @throws Google_Auth_Exception * @throws Google_Exception */ - function __construct($pem) { + public function __construct($pem) + { if (!function_exists('openssl_x509_read')) { throw new Google_Exception('Google API PHP client needs the openssl PHP extension'); } $this->publicKey = openssl_x509_read($pem); if (!$this->publicKey) { - throw new Google_AuthException("Unable to parse PEM: $pem"); + throw new Google_Auth_Exception("Unable to parse PEM: $pem"); } } - function __destruct() { + public function __destruct() + { if ($this->publicKey) { openssl_x509_free($this->publicKey); } @@ -53,13 +59,15 @@ class Google_PemVerifier extends Google_Verifier { * Returns true if the signature is valid, false otherwise. * @param $data * @param $signature - * @throws Google_AuthException + * @throws Google_Auth_Exception * @return bool */ - function verify($data, $signature) { - $status = openssl_verify($data, $signature, $this->publicKey, "sha256"); + public function verify($data, $signature) + { + $hash = defined("OPENSSL_ALGO_SHA256") ? OPENSSL_ALGO_SHA256 : "sha256"; + $status = openssl_verify($data, $signature, $this->publicKey, $hash); if ($status === -1) { - throw new Google_AuthException('Signature verification error: ' . openssl_error_string()); + throw new Google_Auth_Exception('Signature verification error: ' . openssl_error_string()); } return $status === 1; } diff --git a/apps/files_external/3rdparty/google-api-php-client/src/Google_Client.php b/apps/files_external/3rdparty/google-api-php-client/src/Google_Client.php deleted file mode 100644 index 498d3a8e9dd..00000000000 --- a/apps/files_external/3rdparty/google-api-php-client/src/Google_Client.php +++ /dev/null @@ -1,462 +0,0 @@ -<?php -/* - * Copyright 2010 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// Check for the required json and curl extensions, the Google APIs PHP Client -// won't function without them. -if (! function_exists('curl_init')) { - throw new Exception('Google PHP API Client requires the CURL PHP extension'); -} - -if (! function_exists('json_decode')) { - throw new Exception('Google PHP API Client requires the JSON PHP extension'); -} - -if (! function_exists('http_build_query')) { - throw new Exception('Google PHP API Client requires http_build_query()'); -} - -if (! ini_get('date.timezone') && function_exists('date_default_timezone_set')) { - date_default_timezone_set('UTC'); -} - -// hack around with the include paths a bit so the library 'just works' -set_include_path(dirname(__FILE__) . PATH_SEPARATOR . get_include_path()); - -require_once "config.php"; -// If a local configuration file is found, merge it's values with the default configuration -if (file_exists(dirname(__FILE__) . '/local_config.php')) { - $defaultConfig = $apiConfig; - require_once (dirname(__FILE__) . '/local_config.php'); - $apiConfig = array_merge($defaultConfig, $apiConfig); -} - -// Include the top level classes, they each include their own dependencies -require_once 'service/Google_Model.php'; -require_once 'service/Google_Service.php'; -require_once 'service/Google_ServiceResource.php'; -require_once 'auth/Google_AssertionCredentials.php'; -require_once 'auth/Google_Signer.php'; -require_once 'auth/Google_P12Signer.php'; -require_once 'service/Google_BatchRequest.php'; -require_once 'external/URITemplateParser.php'; -require_once 'auth/Google_Auth.php'; -require_once 'cache/Google_Cache.php'; -require_once 'io/Google_IO.php'; -require_once('service/Google_MediaFileUpload.php'); - -/** - * The Google API Client - * http://code.google.com/p/google-api-php-client/ - * - * @author Chris Chabot <chabotc@google.com> - * @author Chirag Shah <chirags@google.com> - */ -class Google_Client { - /** - * @static - * @var Google_Auth $auth - */ - static $auth; - - /** - * @static - * @var Google_IO $io - */ - static $io; - - /** - * @static - * @var Google_Cache $cache - */ - static $cache; - - /** - * @static - * @var boolean $useBatch - */ - static $useBatch = false; - - /** @var array $scopes */ - protected $scopes = array(); - - /** @var bool $useObjects */ - protected $useObjects = false; - - // definitions of services that are discovered. - protected $services = array(); - - // Used to track authenticated state, can't discover services after doing authenticate() - private $authenticated = false; - - public function __construct($config = array()) { - global $apiConfig; - $apiConfig = array_merge($apiConfig, $config); - self::$cache = new $apiConfig['cacheClass'](); - self::$auth = new $apiConfig['authClass'](); - self::$io = new $apiConfig['ioClass'](); - } - - /** - * Add a service - */ - public function addService($service, $version = false) { - global $apiConfig; - if ($this->authenticated) { - throw new Google_Exception('Cant add services after having authenticated'); - } - $this->services[$service] = array(); - if (isset($apiConfig['services'][$service])) { - // Merge the service descriptor with the default values - $this->services[$service] = array_merge($this->services[$service], $apiConfig['services'][$service]); - } - } - - public function authenticate($code = null) { - $service = $this->prepareService(); - $this->authenticated = true; - return self::$auth->authenticate($service, $code); - } - - /** - * @return array - * @visible For Testing - */ - public function prepareService() { - $service = array(); - $scopes = array(); - if ($this->scopes) { - $scopes = $this->scopes; - } else { - foreach ($this->services as $key => $val) { - if (isset($val['scope'])) { - if (is_array($val['scope'])) { - $scopes = array_merge($val['scope'], $scopes); - } else { - $scopes[] = $val['scope']; - } - } else { - $scopes[] = 'https://www.googleapis.com/auth/' . $key; - } - unset($val['discoveryURI']); - unset($val['scope']); - $service = array_merge($service, $val); - } - } - $service['scope'] = implode(' ', $scopes); - return $service; - } - - /** - * Set the OAuth 2.0 access token using the string that resulted from calling authenticate() - * or Google_Client#getAccessToken(). - * @param string $accessToken JSON encoded string containing in the following format: - * {"access_token":"TOKEN", "refresh_token":"TOKEN", "token_type":"Bearer", - * "expires_in":3600, "id_token":"TOKEN", "created":1320790426} - */ - public function setAccessToken($accessToken) { - if ($accessToken == null || 'null' == $accessToken) { - $accessToken = null; - } - self::$auth->setAccessToken($accessToken); - } - - /** - * Set the type of Auth class the client should use. - * @param string $authClassName - */ - public function setAuthClass($authClassName) { - self::$auth = new $authClassName(); - } - - /** - * Construct the OAuth 2.0 authorization request URI. - * @return string - */ - public function createAuthUrl() { - $service = $this->prepareService(); - return self::$auth->createAuthUrl($service['scope']); - } - - /** - * Get the OAuth 2.0 access token. - * @return string $accessToken JSON encoded string in the following format: - * {"access_token":"TOKEN", "refresh_token":"TOKEN", "token_type":"Bearer", - * "expires_in":3600,"id_token":"TOKEN", "created":1320790426} - */ - public function getAccessToken() { - $token = self::$auth->getAccessToken(); - return (null == $token || 'null' == $token) ? null : $token; - } - - /** - * Returns if the access_token is expired. - * @return bool Returns True if the access_token is expired. - */ - public function isAccessTokenExpired() { - return self::$auth->isAccessTokenExpired(); - } - - /** - * Set the developer key to use, these are obtained through the API Console. - * @see http://code.google.com/apis/console-help/#generatingdevkeys - * @param string $developerKey - */ - public function setDeveloperKey($developerKey) { - self::$auth->setDeveloperKey($developerKey); - } - - /** - * Set OAuth 2.0 "state" parameter to achieve per-request customization. - * @see http://tools.ietf.org/html/draft-ietf-oauth-v2-22#section-3.1.2.2 - * @param string $state - */ - public function setState($state) { - self::$auth->setState($state); - } - - /** - * @param string $accessType Possible values for access_type include: - * {@code "offline"} to request offline access from the user. (This is the default value) - * {@code "online"} to request online access from the user. - */ - public function setAccessType($accessType) { - self::$auth->setAccessType($accessType); - } - - /** - * @param string $approvalPrompt Possible values for approval_prompt include: - * {@code "force"} to force the approval UI to appear. (This is the default value) - * {@code "auto"} to request auto-approval when possible. - */ - public function setApprovalPrompt($approvalPrompt) { - self::$auth->setApprovalPrompt($approvalPrompt); - } - - /** - * Set the application name, this is included in the User-Agent HTTP header. - * @param string $applicationName - */ - public function setApplicationName($applicationName) { - global $apiConfig; - $apiConfig['application_name'] = $applicationName; - } - - /** - * Set the OAuth 2.0 Client ID. - * @param string $clientId - */ - public function setClientId($clientId) { - global $apiConfig; - $apiConfig['oauth2_client_id'] = $clientId; - self::$auth->clientId = $clientId; - } - - /** - * Get the OAuth 2.0 Client ID. - */ - public function getClientId() { - return self::$auth->clientId; - } - - /** - * Set the OAuth 2.0 Client Secret. - * @param string $clientSecret - */ - public function setClientSecret($clientSecret) { - global $apiConfig; - $apiConfig['oauth2_client_secret'] = $clientSecret; - self::$auth->clientSecret = $clientSecret; - } - - /** - * Get the OAuth 2.0 Client Secret. - */ - public function getClientSecret() { - return self::$auth->clientSecret; - } - - /** - * Set the OAuth 2.0 Redirect URI. - * @param string $redirectUri - */ - public function setRedirectUri($redirectUri) { - global $apiConfig; - $apiConfig['oauth2_redirect_uri'] = $redirectUri; - self::$auth->redirectUri = $redirectUri; - } - - /** - * Get the OAuth 2.0 Redirect URI. - */ - public function getRedirectUri() { - return self::$auth->redirectUri; - } - - /** - * Fetches a fresh OAuth 2.0 access token with the given refresh token. - * @param string $refreshToken - * @return void - */ - public function refreshToken($refreshToken) { - self::$auth->refreshToken($refreshToken); - } - - /** - * Revoke an OAuth2 access token or refresh token. This method will revoke the current access - * token, if a token isn't provided. - * @throws Google_AuthException - * @param string|null $token The token (access token or a refresh token) that should be revoked. - * @return boolean Returns True if the revocation was successful, otherwise False. - */ - public function revokeToken($token = null) { - self::$auth->revokeToken($token); - } - - /** - * Verify an id_token. This method will verify the current id_token, if one - * isn't provided. - * @throws Google_AuthException - * @param string|null $token The token (id_token) that should be verified. - * @return Google_LoginTicket Returns an apiLoginTicket if the verification was - * successful. - */ - public function verifyIdToken($token = null) { - return self::$auth->verifyIdToken($token); - } - - /** - * @param Google_AssertionCredentials $creds - * @return void - */ - public function setAssertionCredentials(Google_AssertionCredentials $creds) { - self::$auth->setAssertionCredentials($creds); - } - - /** - * This function allows you to overrule the automatically generated scopes, - * so that you can ask for more or less permission in the auth flow - * Set this before you call authenticate() though! - * @param array $scopes, ie: array('https://www.googleapis.com/auth/plus.me', 'https://www.googleapis.com/auth/moderator') - */ - public function setScopes($scopes) { - $this->scopes = is_string($scopes) ? explode(" ", $scopes) : $scopes; - } - - /** - * Returns the list of scopes set on the client - * @return array the list of scopes - * - */ - public function getScopes() { - return $this->scopes; - } - - /** - * Declare if objects should be returned by the api service classes. - * - * @param boolean $useObjects True if objects should be returned by the service classes. - * False if associative arrays should be returned (default behavior). - * @experimental - */ - public function setUseObjects($useObjects) { - global $apiConfig; - $apiConfig['use_objects'] = $useObjects; - } - - /** - * Declare if objects should be returned by the api service classes. - * - * @param boolean $useBatch True if the experimental batch support should - * be enabled. Defaults to False. - * @experimental - */ - public function setUseBatch($useBatch) { - self::$useBatch = $useBatch; - } - - /** - * @static - * @return Google_Auth the implementation of apiAuth. - */ - public static function getAuth() { - return Google_Client::$auth; - } - - /** - * @static - * @return Google_IO the implementation of apiIo. - */ - public static function getIo() { - return Google_Client::$io; - } - - /** - * @return Google_Cache the implementation of apiCache. - */ - public function getCache() { - return Google_Client::$cache; - } -} - -// Exceptions that the Google PHP API Library can throw -class Google_Exception extends Exception {} -class Google_AuthException extends Google_Exception {} -class Google_CacheException extends Google_Exception {} -class Google_IOException extends Google_Exception {} -class Google_ServiceException extends Google_Exception { - /** - * Optional list of errors returned in a JSON body of an HTTP error response. - */ - protected $errors = array(); - - /** - * Override default constructor to add ability to set $errors. - * - * @param string $message - * @param int $code - * @param Exception|null $previous - * @param [{string, string}] errors List of errors returned in an HTTP - * response. Defaults to []. - */ - public function __construct($message, $code = 0, Exception $previous = null, - $errors = array()) { - if(version_compare(PHP_VERSION, '5.3.0') >= 0) { - parent::__construct($message, $code, $previous); - } else { - parent::__construct($message, $code); - } - - $this->errors = $errors; - } - - /** - * An example of the possible errors returned. - * - * { - * "domain": "global", - * "reason": "authError", - * "message": "Invalid Credentials", - * "locationType": "header", - * "location": "Authorization", - * } - * - * @return [{string, string}] List of errors return in an HTTP response or []. - */ - public function getErrors() { - return $this->errors; - } -} diff --git a/apps/files_external/3rdparty/google-api-php-client/src/auth/Google_AuthNone.php b/apps/files_external/3rdparty/google-api-php-client/src/auth/Google_AuthNone.php deleted file mode 100644 index 6ca6bc2b0db..00000000000 --- a/apps/files_external/3rdparty/google-api-php-client/src/auth/Google_AuthNone.php +++ /dev/null @@ -1,48 +0,0 @@ -<?php -/* - * Copyright 2010 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * Do-nothing authentication implementation, use this if you want to make un-authenticated calls - * @author Chris Chabot <chabotc@google.com> - * @author Chirag Shah <chirags@google.com> - */ -class Google_AuthNone extends Google_Auth { - public $key = null; - - public function __construct() { - global $apiConfig; - if (!empty($apiConfig['developer_key'])) { - $this->setDeveloperKey($apiConfig['developer_key']); - } - } - - public function setDeveloperKey($key) {$this->key = $key;} - public function authenticate($service) {/*noop*/} - public function setAccessToken($accessToken) {/* noop*/} - public function getAccessToken() {return null;} - public function createAuthUrl($scope) {return null;} - public function refreshToken($refreshToken) {/* noop*/} - public function revokeToken() {/* noop*/} - - public function sign(Google_HttpRequest $request) { - if ($this->key) { - $request->setUrl($request->getUrl() . ((strpos($request->getUrl(), '?') === false) ? '?' : '&') - . 'key='.urlencode($this->key)); - } - return $request; - } -} diff --git a/apps/files_external/3rdparty/google-api-php-client/src/auth/Google_OAuth2.php b/apps/files_external/3rdparty/google-api-php-client/src/auth/Google_OAuth2.php deleted file mode 100644 index a07d4365a7a..00000000000 --- a/apps/files_external/3rdparty/google-api-php-client/src/auth/Google_OAuth2.php +++ /dev/null @@ -1,445 +0,0 @@ -<?php -/* - * Copyright 2008 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -require_once "Google_Verifier.php"; -require_once "Google_LoginTicket.php"; -require_once "service/Google_Utils.php"; - -/** - * Authentication class that deals with the OAuth 2 web-server authentication flow - * - * @author Chris Chabot <chabotc@google.com> - * @author Chirag Shah <chirags@google.com> - * - */ -class Google_OAuth2 extends Google_Auth { - public $clientId; - public $clientSecret; - public $developerKey; - public $token; - public $redirectUri; - public $state; - public $accessType = 'offline'; - public $approvalPrompt = 'force'; - - /** @var Google_AssertionCredentials $assertionCredentials */ - public $assertionCredentials; - - const OAUTH2_REVOKE_URI = 'https://accounts.google.com/o/oauth2/revoke'; - const OAUTH2_TOKEN_URI = 'https://accounts.google.com/o/oauth2/token'; - const OAUTH2_AUTH_URL = 'https://accounts.google.com/o/oauth2/auth'; - const OAUTH2_FEDERATED_SIGNON_CERTS_URL = 'https://www.googleapis.com/oauth2/v1/certs'; - const CLOCK_SKEW_SECS = 300; // five minutes in seconds - const AUTH_TOKEN_LIFETIME_SECS = 300; // five minutes in seconds - const MAX_TOKEN_LIFETIME_SECS = 86400; // one day in seconds - - /** - * Instantiates the class, but does not initiate the login flow, leaving it - * to the discretion of the caller (which is done by calling authenticate()). - */ - public function __construct() { - global $apiConfig; - - if (! empty($apiConfig['developer_key'])) { - $this->developerKey = $apiConfig['developer_key']; - } - - if (! empty($apiConfig['oauth2_client_id'])) { - $this->clientId = $apiConfig['oauth2_client_id']; - } - - if (! empty($apiConfig['oauth2_client_secret'])) { - $this->clientSecret = $apiConfig['oauth2_client_secret']; - } - - if (! empty($apiConfig['oauth2_redirect_uri'])) { - $this->redirectUri = $apiConfig['oauth2_redirect_uri']; - } - - if (! empty($apiConfig['oauth2_access_type'])) { - $this->accessType = $apiConfig['oauth2_access_type']; - } - - if (! empty($apiConfig['oauth2_approval_prompt'])) { - $this->approvalPrompt = $apiConfig['oauth2_approval_prompt']; - } - - } - - /** - * @param $service - * @param string|null $code - * @throws Google_AuthException - * @return string - */ - public function authenticate($service, $code = null) { - if (!$code && isset($_GET['code'])) { - $code = $_GET['code']; - } - - if ($code) { - // We got here from the redirect from a successful authorization grant, fetch the access token - $request = Google_Client::$io->makeRequest(new Google_HttpRequest(self::OAUTH2_TOKEN_URI, 'POST', array(), array( - 'code' => $code, - 'grant_type' => 'authorization_code', - 'redirect_uri' => $this->redirectUri, - 'client_id' => $this->clientId, - 'client_secret' => $this->clientSecret - ))); - - if ($request->getResponseHttpCode() == 200) { - $this->setAccessToken($request->getResponseBody()); - $this->token['created'] = time(); - return $this->getAccessToken(); - } else { - $response = $request->getResponseBody(); - $decodedResponse = json_decode($response, true); - if ($decodedResponse != null && $decodedResponse['error']) { - $response = $decodedResponse['error']; - } - throw new Google_AuthException("Error fetching OAuth2 access token, message: '$response'", $request->getResponseHttpCode()); - } - } - - $authUrl = $this->createAuthUrl($service['scope']); - header('Location: ' . $authUrl); - return true; - } - - /** - * Create a URL to obtain user authorization. - * The authorization endpoint allows the user to first - * authenticate, and then grant/deny the access request. - * @param string $scope The scope is expressed as a list of space-delimited strings. - * @return string - */ - public function createAuthUrl($scope) { - $params = array( - 'response_type=code', - 'redirect_uri=' . urlencode($this->redirectUri), - 'client_id=' . urlencode($this->clientId), - 'scope=' . urlencode($scope), - 'access_type=' . urlencode($this->accessType), - 'approval_prompt=' . urlencode($this->approvalPrompt), - ); - - if (isset($this->state)) { - $params[] = 'state=' . urlencode($this->state); - } - $params = implode('&', $params); - return self::OAUTH2_AUTH_URL . "?$params"; - } - - /** - * @param string $token - * @throws Google_AuthException - */ - public function setAccessToken($token) { - $token = json_decode($token, true); - if ($token == null) { - throw new Google_AuthException('Could not json decode the token'); - } - if (! isset($token['access_token'])) { - throw new Google_AuthException("Invalid token format"); - } - $this->token = $token; - } - - public function getAccessToken() { - return json_encode($this->token); - } - - public function setDeveloperKey($developerKey) { - $this->developerKey = $developerKey; - } - - public function setState($state) { - $this->state = $state; - } - - public function setAccessType($accessType) { - $this->accessType = $accessType; - } - - public function setApprovalPrompt($approvalPrompt) { - $this->approvalPrompt = $approvalPrompt; - } - - public function setAssertionCredentials(Google_AssertionCredentials $creds) { - $this->assertionCredentials = $creds; - } - - /** - * Include an accessToken in a given apiHttpRequest. - * @param Google_HttpRequest $request - * @return Google_HttpRequest - * @throws Google_AuthException - */ - public function sign(Google_HttpRequest $request) { - // add the developer key to the request before signing it - if ($this->developerKey) { - $requestUrl = $request->getUrl(); - $requestUrl .= (strpos($request->getUrl(), '?') === false) ? '?' : '&'; - $requestUrl .= 'key=' . urlencode($this->developerKey); - $request->setUrl($requestUrl); - } - - // Cannot sign the request without an OAuth access token. - if (null == $this->token && null == $this->assertionCredentials) { - return $request; - } - - // Check if the token is set to expire in the next 30 seconds - // (or has already expired). - if ($this->isAccessTokenExpired()) { - if ($this->assertionCredentials) { - $this->refreshTokenWithAssertion(); - } else { - if (! array_key_exists('refresh_token', $this->token)) { - throw new Google_AuthException("The OAuth 2.0 access token has expired, " - . "and a refresh token is not available. Refresh tokens are not " - . "returned for responses that were auto-approved."); - } - $this->refreshToken($this->token['refresh_token']); - } - } - - // Add the OAuth2 header to the request - $request->setRequestHeaders( - array('Authorization' => 'Bearer ' . $this->token['access_token']) - ); - - return $request; - } - - /** - * Fetches a fresh access token with the given refresh token. - * @param string $refreshToken - * @return void - */ - public function refreshToken($refreshToken) { - $this->refreshTokenRequest(array( - 'client_id' => $this->clientId, - 'client_secret' => $this->clientSecret, - 'refresh_token' => $refreshToken, - 'grant_type' => 'refresh_token' - )); - } - - /** - * Fetches a fresh access token with a given assertion token. - * @param Google_AssertionCredentials $assertionCredentials optional. - * @return void - */ - public function refreshTokenWithAssertion($assertionCredentials = null) { - if (!$assertionCredentials) { - $assertionCredentials = $this->assertionCredentials; - } - - $this->refreshTokenRequest(array( - 'grant_type' => 'assertion', - 'assertion_type' => $assertionCredentials->assertionType, - 'assertion' => $assertionCredentials->generateAssertion(), - )); - } - - private function refreshTokenRequest($params) { - $http = new Google_HttpRequest(self::OAUTH2_TOKEN_URI, 'POST', array(), $params); - $request = Google_Client::$io->makeRequest($http); - - $code = $request->getResponseHttpCode(); - $body = $request->getResponseBody(); - if (200 == $code) { - $token = json_decode($body, true); - if ($token == null) { - throw new Google_AuthException("Could not json decode the access token"); - } - - if (! isset($token['access_token']) || ! isset($token['expires_in'])) { - throw new Google_AuthException("Invalid token format"); - } - - $this->token['access_token'] = $token['access_token']; - $this->token['expires_in'] = $token['expires_in']; - $this->token['created'] = time(); - } else { - throw new Google_AuthException("Error refreshing the OAuth2 token, message: '$body'", $code); - } - } - - /** - * Revoke an OAuth2 access token or refresh token. This method will revoke the current access - * token, if a token isn't provided. - * @throws Google_AuthException - * @param string|null $token The token (access token or a refresh token) that should be revoked. - * @return boolean Returns True if the revocation was successful, otherwise False. - */ - public function revokeToken($token = null) { - if (!$token) { - $token = $this->token['access_token']; - } - $request = new Google_HttpRequest(self::OAUTH2_REVOKE_URI, 'POST', array(), "token=$token"); - $response = Google_Client::$io->makeRequest($request); - $code = $response->getResponseHttpCode(); - if ($code == 200) { - $this->token = null; - return true; - } - - return false; - } - - /** - * Returns if the access_token is expired. - * @return bool Returns True if the access_token is expired. - */ - public function isAccessTokenExpired() { - if (null == $this->token) { - return true; - } - - // If the token is set to expire in the next 30 seconds. - $expired = ($this->token['created'] - + ($this->token['expires_in'] - 30)) < time(); - - return $expired; - } - - // Gets federated sign-on certificates to use for verifying identity tokens. - // Returns certs as array structure, where keys are key ids, and values - // are PEM encoded certificates. - private function getFederatedSignOnCerts() { - // This relies on makeRequest caching certificate responses. - $request = Google_Client::$io->makeRequest(new Google_HttpRequest( - self::OAUTH2_FEDERATED_SIGNON_CERTS_URL)); - if ($request->getResponseHttpCode() == 200) { - $certs = json_decode($request->getResponseBody(), true); - if ($certs) { - return $certs; - } - } - throw new Google_AuthException( - "Failed to retrieve verification certificates: '" . - $request->getResponseBody() . "'.", - $request->getResponseHttpCode()); - } - - /** - * Verifies an id token and returns the authenticated apiLoginTicket. - * Throws an exception if the id token is not valid. - * The audience parameter can be used to control which id tokens are - * accepted. By default, the id token must have been issued to this OAuth2 client. - * - * @param $id_token - * @param $audience - * @return Google_LoginTicket - */ - public function verifyIdToken($id_token = null, $audience = null) { - if (!$id_token) { - $id_token = $this->token['id_token']; - } - - $certs = $this->getFederatedSignonCerts(); - if (!$audience) { - $audience = $this->clientId; - } - return $this->verifySignedJwtWithCerts($id_token, $certs, $audience); - } - - // Verifies the id token, returns the verified token contents. - // Visible for testing. - function verifySignedJwtWithCerts($jwt, $certs, $required_audience) { - $segments = explode(".", $jwt); - if (count($segments) != 3) { - throw new Google_AuthException("Wrong number of segments in token: $jwt"); - } - $signed = $segments[0] . "." . $segments[1]; - $signature = Google_Utils::urlSafeB64Decode($segments[2]); - - // Parse envelope. - $envelope = json_decode(Google_Utils::urlSafeB64Decode($segments[0]), true); - if (!$envelope) { - throw new Google_AuthException("Can't parse token envelope: " . $segments[0]); - } - - // Parse token - $json_body = Google_Utils::urlSafeB64Decode($segments[1]); - $payload = json_decode($json_body, true); - if (!$payload) { - throw new Google_AuthException("Can't parse token payload: " . $segments[1]); - } - - // Check signature - $verified = false; - foreach ($certs as $keyName => $pem) { - $public_key = new Google_PemVerifier($pem); - if ($public_key->verify($signed, $signature)) { - $verified = true; - break; - } - } - - if (!$verified) { - throw new Google_AuthException("Invalid token signature: $jwt"); - } - - // Check issued-at timestamp - $iat = 0; - if (array_key_exists("iat", $payload)) { - $iat = $payload["iat"]; - } - if (!$iat) { - throw new Google_AuthException("No issue time in token: $json_body"); - } - $earliest = $iat - self::CLOCK_SKEW_SECS; - - // Check expiration timestamp - $now = time(); - $exp = 0; - if (array_key_exists("exp", $payload)) { - $exp = $payload["exp"]; - } - if (!$exp) { - throw new Google_AuthException("No expiration time in token: $json_body"); - } - if ($exp >= $now + self::MAX_TOKEN_LIFETIME_SECS) { - throw new Google_AuthException( - "Expiration time too far in future: $json_body"); - } - - $latest = $exp + self::CLOCK_SKEW_SECS; - if ($now < $earliest) { - throw new Google_AuthException( - "Token used too early, $now < $earliest: $json_body"); - } - if ($now > $latest) { - throw new Google_AuthException( - "Token used too late, $now > $latest: $json_body"); - } - - // TODO(beaton): check issuer field? - - // Check audience - $aud = $payload["aud"]; - if ($aud != $required_audience) { - throw new Google_AuthException("Wrong recipient, $aud != $required_audience: $json_body"); - } - - // All good. - return new Google_LoginTicket($envelope, $payload); - } -} diff --git a/apps/files_external/3rdparty/google-api-php-client/src/auth/Google_P12Signer.php b/apps/files_external/3rdparty/google-api-php-client/src/auth/Google_P12Signer.php deleted file mode 100644 index 1bed5909913..00000000000 --- a/apps/files_external/3rdparty/google-api-php-client/src/auth/Google_P12Signer.php +++ /dev/null @@ -1,70 +0,0 @@ -<?php -/* - * Copyright 2011 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * Signs data. - * - * Only used for testing. - * - * @author Brian Eaton <beaton@google.com> - */ -class Google_P12Signer extends Google_Signer { - // OpenSSL private key resource - private $privateKey; - - // Creates a new signer from a .p12 file. - function __construct($p12, $password) { - if (!function_exists('openssl_x509_read')) { - throw new Exception( - 'The Google PHP API library needs the openssl PHP extension'); - } - - // This throws on error - $certs = array(); - if (!openssl_pkcs12_read($p12, $certs, $password)) { - throw new Google_AuthException("Unable to parse the p12 file. " . - "Is this a .p12 file? Is the password correct? OpenSSL error: " . - openssl_error_string()); - } - // TODO(beaton): is this part of the contract for the openssl_pkcs12_read - // method? What happens if there are multiple private keys? Do we care? - if (!array_key_exists("pkey", $certs) || !$certs["pkey"]) { - throw new Google_AuthException("No private key found in p12 file."); - } - $this->privateKey = openssl_pkey_get_private($certs["pkey"]); - if (!$this->privateKey) { - throw new Google_AuthException("Unable to load private key in "); - } - } - - function __destruct() { - if ($this->privateKey) { - openssl_pkey_free($this->privateKey); - } - } - - function sign($data) { - if(version_compare(PHP_VERSION, '5.3.0') < 0) { - throw new Google_AuthException( - "PHP 5.3.0 or higher is required to use service accounts."); - } - if (!openssl_sign($data, $signature, $this->privateKey, "sha256")) { - throw new Google_AuthException("Unable to sign data"); - } - return $signature; - } -} diff --git a/apps/files_external/3rdparty/google-api-php-client/src/cache/Google_ApcCache.php b/apps/files_external/3rdparty/google-api-php-client/src/cache/Google_ApcCache.php deleted file mode 100644 index 3523c98dcca..00000000000 --- a/apps/files_external/3rdparty/google-api-php-client/src/cache/Google_ApcCache.php +++ /dev/null @@ -1,98 +0,0 @@ -<?php -/* - * Copyright 2010 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * A persistent storage class based on the APC cache, which is not - * really very persistent, as soon as you restart your web server - * the storage will be wiped, however for debugging and/or speed - * it can be useful, kinda, and cache is a lot cheaper then storage. - * - * @author Chris Chabot <chabotc@google.com> - */ -class googleApcCache extends Google_Cache { - - public function __construct() { - if (! function_exists('apc_add')) { - throw new Google_CacheException("Apc functions not available"); - } - } - - private function isLocked($key) { - if ((@apc_fetch($key . '.lock')) === false) { - return false; - } - return true; - } - - private function createLock($key) { - // the interesting thing is that this could fail if the lock was created in the meantime.. - // but we'll ignore that out of convenience - @apc_add($key . '.lock', '', 5); - } - - private function removeLock($key) { - // suppress all warnings, if some other process removed it that's ok too - @apc_delete($key . '.lock'); - } - - private function waitForLock($key) { - // 20 x 250 = 5 seconds - $tries = 20; - $cnt = 0; - do { - // 250 ms is a long time to sleep, but it does stop the server from burning all resources on polling locks.. - usleep(250); - $cnt ++; - } while ($cnt <= $tries && $this->isLocked($key)); - if ($this->isLocked($key)) { - // 5 seconds passed, assume the owning process died off and remove it - $this->removeLock($key); - } - } - - /** - * @inheritDoc - */ - public function get($key, $expiration = false) { - - if (($ret = @apc_fetch($key)) === false) { - return false; - } - if (!$expiration || (time() - $ret['time'] > $expiration)) { - $this->delete($key); - return false; - } - return unserialize($ret['data']); - } - - /** - * @inheritDoc - */ - public function set($key, $value) { - if (@apc_store($key, array('time' => time(), 'data' => serialize($value))) == false) { - throw new Google_CacheException("Couldn't store data"); - } - } - - /** - * @inheritDoc - * @param String $key - */ - public function delete($key) { - @apc_delete($key); - } -} diff --git a/apps/files_external/3rdparty/google-api-php-client/src/cache/Google_FileCache.php b/apps/files_external/3rdparty/google-api-php-client/src/cache/Google_FileCache.php deleted file mode 100644 index 1e32859a48b..00000000000 --- a/apps/files_external/3rdparty/google-api-php-client/src/cache/Google_FileCache.php +++ /dev/null @@ -1,137 +0,0 @@ -<?php -/* - * Copyright 2008 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* - * This class implements a basic on disk storage. While that does - * work quite well it's not the most elegant and scalable solution. - * It will also get you into a heap of trouble when you try to run - * this in a clustered environment. In those cases please use the - * MySql back-end - * - * @author Chris Chabot <chabotc@google.com> - */ -class Google_FileCache extends Google_Cache { - private $path; - - public function __construct() { - global $apiConfig; - $this->path = $apiConfig['ioFileCache_directory']; - } - - private function isLocked($storageFile) { - // our lock file convention is simple: /the/file/path.lock - return file_exists($storageFile . '.lock'); - } - - private function createLock($storageFile) { - $storageDir = dirname($storageFile); - if (! is_dir($storageDir)) { - // @codeCoverageIgnoreStart - if (! @mkdir($storageDir, 0755, true)) { - // make sure the failure isn't because of a concurrency issue - if (! is_dir($storageDir)) { - throw new Google_CacheException("Could not create storage directory: $storageDir"); - } - } - // @codeCoverageIgnoreEnd - } - @touch($storageFile . '.lock'); - } - - private function removeLock($storageFile) { - // suppress all warnings, if some other process removed it that's ok too - @unlink($storageFile . '.lock'); - } - - private function waitForLock($storageFile) { - // 20 x 250 = 5 seconds - $tries = 20; - $cnt = 0; - do { - // make sure PHP picks up on file changes. This is an expensive action but really can't be avoided - clearstatcache(); - // 250 ms is a long time to sleep, but it does stop the server from burning all resources on polling locks.. - usleep(250); - $cnt ++; - } while ($cnt <= $tries && $this->isLocked($storageFile)); - if ($this->isLocked($storageFile)) { - // 5 seconds passed, assume the owning process died off and remove it - $this->removeLock($storageFile); - } - } - - private function getCacheDir($hash) { - // use the first 2 characters of the hash as a directory prefix - // this should prevent slowdowns due to huge directory listings - // and thus give some basic amount of scalability - return $this->path . '/' . substr($hash, 0, 2); - } - - private function getCacheFile($hash) { - return $this->getCacheDir($hash) . '/' . $hash; - } - - public function get($key, $expiration = false) { - $storageFile = $this->getCacheFile(md5($key)); - // See if this storage file is locked, if so we wait up to 5 seconds for the lock owning process to - // complete it's work. If the lock is not released within that time frame, it's cleaned up. - // This should give us a fair amount of 'Cache Stampeding' protection - if ($this->isLocked($storageFile)) { - $this->waitForLock($storageFile); - } - if (file_exists($storageFile) && is_readable($storageFile)) { - $now = time(); - if (! $expiration || (($mtime = @filemtime($storageFile)) !== false && ($now - $mtime) < $expiration)) { - if (($data = @file_get_contents($storageFile)) !== false) { - $data = unserialize($data); - return $data; - } - } - } - return false; - } - - public function set($key, $value) { - $storageDir = $this->getCacheDir(md5($key)); - $storageFile = $this->getCacheFile(md5($key)); - if ($this->isLocked($storageFile)) { - // some other process is writing to this file too, wait until it's done to prevent hiccups - $this->waitForLock($storageFile); - } - if (! is_dir($storageDir)) { - if (! @mkdir($storageDir, 0755, true)) { - throw new Google_CacheException("Could not create storage directory: $storageDir"); - } - } - // we serialize the whole request object, since we don't only want the - // responseContent but also the postBody used, headers, size, etc - $data = serialize($value); - $this->createLock($storageFile); - if (! @file_put_contents($storageFile, $data)) { - $this->removeLock($storageFile); - throw new Google_CacheException("Could not store data in the file"); - } - $this->removeLock($storageFile); - } - - public function delete($key) { - $file = $this->getCacheFile(md5($key)); - if (! @unlink($file)) { - throw new Google_CacheException("Cache file could not be deleted"); - } - } -} diff --git a/apps/files_external/3rdparty/google-api-php-client/src/cache/Google_MemcacheCache.php b/apps/files_external/3rdparty/google-api-php-client/src/cache/Google_MemcacheCache.php deleted file mode 100644 index 22493f8b1ec..00000000000 --- a/apps/files_external/3rdparty/google-api-php-client/src/cache/Google_MemcacheCache.php +++ /dev/null @@ -1,130 +0,0 @@ -<?php -/* - * Copyright 2008 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * A persistent storage class based on the memcache, which is not - * really very persistent, as soon as you restart your memcache daemon - * the storage will be wiped, however for debugging and/or speed - * it can be useful, kinda, and cache is a lot cheaper then storage. - * - * @author Chris Chabot <chabotc@google.com> - */ -class Google_MemcacheCache extends Google_Cache { - private $connection = false; - - public function __construct() { - global $apiConfig; - if (! function_exists('memcache_connect')) { - throw new Google_CacheException("Memcache functions not available"); - } - $this->host = $apiConfig['ioMemCacheCache_host']; - $this->port = $apiConfig['ioMemCacheCache_port']; - if (empty($this->host) || empty($this->port)) { - throw new Google_CacheException("You need to supply a valid memcache host and port"); - } - } - - private function isLocked($key) { - $this->check(); - if ((@memcache_get($this->connection, $key . '.lock')) === false) { - return false; - } - return true; - } - - private function createLock($key) { - $this->check(); - // the interesting thing is that this could fail if the lock was created in the meantime.. - // but we'll ignore that out of convenience - @memcache_add($this->connection, $key . '.lock', '', 0, 5); - } - - private function removeLock($key) { - $this->check(); - // suppress all warnings, if some other process removed it that's ok too - @memcache_delete($this->connection, $key . '.lock'); - } - - private function waitForLock($key) { - $this->check(); - // 20 x 250 = 5 seconds - $tries = 20; - $cnt = 0; - do { - // 250 ms is a long time to sleep, but it does stop the server from burning all resources on polling locks.. - usleep(250); - $cnt ++; - } while ($cnt <= $tries && $this->isLocked($key)); - if ($this->isLocked($key)) { - // 5 seconds passed, assume the owning process died off and remove it - $this->removeLock($key); - } - } - - // I prefer lazy initialization since the cache isn't used every request - // so this potentially saves a lot of overhead - private function connect() { - if (! $this->connection = @memcache_pconnect($this->host, $this->port)) { - throw new Google_CacheException("Couldn't connect to memcache server"); - } - } - - private function check() { - if (! $this->connection) { - $this->connect(); - } - } - - /** - * @inheritDoc - */ - public function get($key, $expiration = false) { - $this->check(); - if (($ret = @memcache_get($this->connection, $key)) === false) { - return false; - } - if (! $expiration || (time() - $ret['time'] > $expiration)) { - $this->delete($key); - return false; - } - return $ret['data']; - } - - /** - * @inheritDoc - * @param string $key - * @param string $value - * @throws Google_CacheException - */ - public function set($key, $value) { - $this->check(); - // we store it with the cache_time default expiration so objects will at least get cleaned eventually. - if (@memcache_set($this->connection, $key, array('time' => time(), - 'data' => $value), false) == false) { - throw new Google_CacheException("Couldn't store data in cache"); - } - } - - /** - * @inheritDoc - * @param String $key - */ - public function delete($key) { - $this->check(); - @memcache_delete($this->connection, $key); - } -} diff --git a/apps/files_external/3rdparty/google-api-php-client/src/config.php b/apps/files_external/3rdparty/google-api-php-client/src/config.php deleted file mode 100644 index e3a57138d05..00000000000 --- a/apps/files_external/3rdparty/google-api-php-client/src/config.php +++ /dev/null @@ -1,81 +0,0 @@ -<?php -/* - * Copyright 2010 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -global $apiConfig; -$apiConfig = array( - // True if objects should be returned by the service classes. - // False if associative arrays should be returned (default behavior). - 'use_objects' => false, - - // The application_name is included in the User-Agent HTTP header. - 'application_name' => '', - - // OAuth2 Settings, you can get these keys at https://code.google.com/apis/console - 'oauth2_client_id' => '', - 'oauth2_client_secret' => '', - 'oauth2_redirect_uri' => '', - - // The developer key, you get this at https://code.google.com/apis/console - 'developer_key' => '', - - // Site name to show in the Google's OAuth 1 authentication screen. - 'site_name' => 'www.example.org', - - // Which Authentication, Storage and HTTP IO classes to use. - 'authClass' => 'Google_OAuth2', - 'ioClass' => 'Google_CurlIO', - 'cacheClass' => 'Google_FileCache', - - // Don't change these unless you're working against a special development or testing environment. - 'basePath' => 'https://www.googleapis.com', - - // IO Class dependent configuration, you only have to configure the values - // for the class that was configured as the ioClass above - 'ioFileCache_directory' => - (function_exists('sys_get_temp_dir') ? - sys_get_temp_dir() . '/Google_Client' : - '/tmp/Google_Client'), - - // Definition of service specific values like scopes, oauth token URLs, etc - 'services' => array( - 'analytics' => array('scope' => 'https://www.googleapis.com/auth/analytics.readonly'), - 'calendar' => array( - 'scope' => array( - "https://www.googleapis.com/auth/calendar", - "https://www.googleapis.com/auth/calendar.readonly", - ) - ), - 'books' => array('scope' => 'https://www.googleapis.com/auth/books'), - 'latitude' => array( - 'scope' => array( - 'https://www.googleapis.com/auth/latitude.all.best', - 'https://www.googleapis.com/auth/latitude.all.city', - ) - ), - 'moderator' => array('scope' => 'https://www.googleapis.com/auth/moderator'), - 'oauth2' => array( - 'scope' => array( - 'https://www.googleapis.com/auth/userinfo.profile', - 'https://www.googleapis.com/auth/userinfo.email', - ) - ), - 'plus' => array('scope' => 'https://www.googleapis.com/auth/plus.login'), - 'siteVerification' => array('scope' => 'https://www.googleapis.com/auth/siteverification'), - 'tasks' => array('scope' => 'https://www.googleapis.com/auth/tasks'), - 'urlshortener' => array('scope' => 'https://www.googleapis.com/auth/urlshortener') - ) -); diff --git a/apps/files_external/3rdparty/google-api-php-client/src/contrib/Google_DriveService.php b/apps/files_external/3rdparty/google-api-php-client/src/contrib/Google_DriveService.php deleted file mode 100644 index 896e8b93826..00000000000 --- a/apps/files_external/3rdparty/google-api-php-client/src/contrib/Google_DriveService.php +++ /dev/null @@ -1,3143 +0,0 @@ -<?php -/* - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - */ - - - /** - * The "about" collection of methods. - * Typical usage is: - * <code> - * $driveService = new Google_DriveService(...); - * $about = $driveService->about; - * </code> - */ - class Google_AboutServiceResource extends Google_ServiceResource { - - - /** - * Gets the information about the current user along with Drive API settings (about.get) - * - * @param array $optParams Optional parameters. - * - * @opt_param bool includeSubscribed When calculating the number of remaining change IDs, whether to include shared files and public files the user has opened. When set to false, this counts only change IDs for owned files and any shared or public files that the user has explictly added to a folder in Drive. - * @opt_param string maxChangeIdCount Maximum number of remaining change IDs to count - * @opt_param string startChangeId Change ID to start counting from when calculating number of remaining change IDs - * @return Google_About - */ - public function get($optParams = array()) { - $params = array(); - $params = array_merge($params, $optParams); - $data = $this->__call('get', array($params)); - if ($this->useObjects()) { - return new Google_About($data); - } else { - return $data; - } - } - } - - /** - * The "apps" collection of methods. - * Typical usage is: - * <code> - * $driveService = new Google_DriveService(...); - * $apps = $driveService->apps; - * </code> - */ - class Google_AppsServiceResource extends Google_ServiceResource { - - - /** - * Gets a specific app. (apps.get) - * - * @param string $appId The ID of the app. - * @param array $optParams Optional parameters. - * @return Google_App - */ - public function get($appId, $optParams = array()) { - $params = array('appId' => $appId); - $params = array_merge($params, $optParams); - $data = $this->__call('get', array($params)); - if ($this->useObjects()) { - return new Google_App($data); - } else { - return $data; - } - } - /** - * Lists a user's installed apps. (apps.list) - * - * @param array $optParams Optional parameters. - * @return Google_AppList - */ - public function listApps($optParams = array()) { - $params = array(); - $params = array_merge($params, $optParams); - $data = $this->__call('list', array($params)); - if ($this->useObjects()) { - return new Google_AppList($data); - } else { - return $data; - } - } - } - - /** - * The "changes" collection of methods. - * Typical usage is: - * <code> - * $driveService = new Google_DriveService(...); - * $changes = $driveService->changes; - * </code> - */ - class Google_ChangesServiceResource extends Google_ServiceResource { - - - /** - * Gets a specific change. (changes.get) - * - * @param string $changeId The ID of the change. - * @param array $optParams Optional parameters. - * @return Google_Change - */ - public function get($changeId, $optParams = array()) { - $params = array('changeId' => $changeId); - $params = array_merge($params, $optParams); - $data = $this->__call('get', array($params)); - if ($this->useObjects()) { - return new Google_Change($data); - } else { - return $data; - } - } - /** - * Lists the changes for a user. (changes.list) - * - * @param array $optParams Optional parameters. - * - * @opt_param bool includeDeleted Whether to include deleted items. - * @opt_param bool includeSubscribed Whether to include shared files and public files the user has opened. When set to false, the list will include owned files plus any shared or public files the user has explictly added to a folder in Drive. - * @opt_param int maxResults Maximum number of changes to return. - * @opt_param string pageToken Page token for changes. - * @opt_param string startChangeId Change ID to start listing changes from. - * @return Google_ChangeList - */ - public function listChanges($optParams = array()) { - $params = array(); - $params = array_merge($params, $optParams); - $data = $this->__call('list', array($params)); - if ($this->useObjects()) { - return new Google_ChangeList($data); - } else { - return $data; - } - } - } - - /** - * The "children" collection of methods. - * Typical usage is: - * <code> - * $driveService = new Google_DriveService(...); - * $children = $driveService->children; - * </code> - */ - class Google_ChildrenServiceResource extends Google_ServiceResource { - - - /** - * Removes a child from a folder. (children.delete) - * - * @param string $folderId The ID of the folder. - * @param string $childId The ID of the child. - * @param array $optParams Optional parameters. - */ - public function delete($folderId, $childId, $optParams = array()) { - $params = array('folderId' => $folderId, 'childId' => $childId); - $params = array_merge($params, $optParams); - $data = $this->__call('delete', array($params)); - return $data; - } - /** - * Gets a specific child reference. (children.get) - * - * @param string $folderId The ID of the folder. - * @param string $childId The ID of the child. - * @param array $optParams Optional parameters. - * @return Google_ChildReference - */ - public function get($folderId, $childId, $optParams = array()) { - $params = array('folderId' => $folderId, 'childId' => $childId); - $params = array_merge($params, $optParams); - $data = $this->__call('get', array($params)); - if ($this->useObjects()) { - return new Google_ChildReference($data); - } else { - return $data; - } - } - /** - * Inserts a file into a folder. (children.insert) - * - * @param string $folderId The ID of the folder. - * @param Google_ChildReference $postBody - * @param array $optParams Optional parameters. - * @return Google_ChildReference - */ - public function insert($folderId, Google_ChildReference $postBody, $optParams = array()) { - $params = array('folderId' => $folderId, 'postBody' => $postBody); - $params = array_merge($params, $optParams); - $data = $this->__call('insert', array($params)); - if ($this->useObjects()) { - return new Google_ChildReference($data); - } else { - return $data; - } - } - /** - * Lists a folder's children. (children.list) - * - * @param string $folderId The ID of the folder. - * @param array $optParams Optional parameters. - * - * @opt_param int maxResults Maximum number of children to return. - * @opt_param string pageToken Page token for children. - * @opt_param string q Query string for searching children. - * @return Google_ChildList - */ - public function listChildren($folderId, $optParams = array()) { - $params = array('folderId' => $folderId); - $params = array_merge($params, $optParams); - $data = $this->__call('list', array($params)); - if ($this->useObjects()) { - return new Google_ChildList($data); - } else { - return $data; - } - } - } - - /** - * The "comments" collection of methods. - * Typical usage is: - * <code> - * $driveService = new Google_DriveService(...); - * $comments = $driveService->comments; - * </code> - */ - class Google_CommentsServiceResource extends Google_ServiceResource { - - - /** - * Deletes a comment. (comments.delete) - * - * @param string $fileId The ID of the file. - * @param string $commentId The ID of the comment. - * @param array $optParams Optional parameters. - */ - public function delete($fileId, $commentId, $optParams = array()) { - $params = array('fileId' => $fileId, 'commentId' => $commentId); - $params = array_merge($params, $optParams); - $data = $this->__call('delete', array($params)); - return $data; - } - /** - * Gets a comment by ID. (comments.get) - * - * @param string $fileId The ID of the file. - * @param string $commentId The ID of the comment. - * @param array $optParams Optional parameters. - * - * @opt_param bool includeDeleted If set, this will succeed when retrieving a deleted comment, and will include any deleted replies. - * @return Google_Comment - */ - public function get($fileId, $commentId, $optParams = array()) { - $params = array('fileId' => $fileId, 'commentId' => $commentId); - $params = array_merge($params, $optParams); - $data = $this->__call('get', array($params)); - if ($this->useObjects()) { - return new Google_Comment($data); - } else { - return $data; - } - } - /** - * Creates a new comment on the given file. (comments.insert) - * - * @param string $fileId The ID of the file. - * @param Google_Comment $postBody - * @param array $optParams Optional parameters. - * @return Google_Comment - */ - public function insert($fileId, Google_Comment $postBody, $optParams = array()) { - $params = array('fileId' => $fileId, 'postBody' => $postBody); - $params = array_merge($params, $optParams); - $data = $this->__call('insert', array($params)); - if ($this->useObjects()) { - return new Google_Comment($data); - } else { - return $data; - } - } - /** - * Lists a file's comments. (comments.list) - * - * @param string $fileId The ID of the file. - * @param array $optParams Optional parameters. - * - * @opt_param bool includeDeleted If set, all comments and replies, including deleted comments and replies (with content stripped) will be returned. - * @opt_param int maxResults The maximum number of discussions to include in the response, used for paging. - * @opt_param string pageToken The continuation token, used to page through large result sets. To get the next page of results, set this parameter to the value of "nextPageToken" from the previous response. - * @opt_param string updatedMin Only discussions that were updated after this timestamp will be returned. Formatted as an RFC 3339 timestamp. - * @return Google_CommentList - */ - public function listComments($fileId, $optParams = array()) { - $params = array('fileId' => $fileId); - $params = array_merge($params, $optParams); - $data = $this->__call('list', array($params)); - if ($this->useObjects()) { - return new Google_CommentList($data); - } else { - return $data; - } - } - /** - * Updates an existing comment. This method supports patch semantics. (comments.patch) - * - * @param string $fileId The ID of the file. - * @param string $commentId The ID of the comment. - * @param Google_Comment $postBody - * @param array $optParams Optional parameters. - * @return Google_Comment - */ - public function patch($fileId, $commentId, Google_Comment $postBody, $optParams = array()) { - $params = array('fileId' => $fileId, 'commentId' => $commentId, 'postBody' => $postBody); - $params = array_merge($params, $optParams); - $data = $this->__call('patch', array($params)); - if ($this->useObjects()) { - return new Google_Comment($data); - } else { - return $data; - } - } - /** - * Updates an existing comment. (comments.update) - * - * @param string $fileId The ID of the file. - * @param string $commentId The ID of the comment. - * @param Google_Comment $postBody - * @param array $optParams Optional parameters. - * @return Google_Comment - */ - public function update($fileId, $commentId, Google_Comment $postBody, $optParams = array()) { - $params = array('fileId' => $fileId, 'commentId' => $commentId, 'postBody' => $postBody); - $params = array_merge($params, $optParams); - $data = $this->__call('update', array($params)); - if ($this->useObjects()) { - return new Google_Comment($data); - } else { - return $data; - } - } - } - - /** - * The "files" collection of methods. - * Typical usage is: - * <code> - * $driveService = new Google_DriveService(...); - * $files = $driveService->files; - * </code> - */ - class Google_FilesServiceResource extends Google_ServiceResource { - - - /** - * Creates a copy of the specified file. (files.copy) - * - * @param string $fileId The ID of the file to copy. - * @param Google_DriveFile $postBody - * @param array $optParams Optional parameters. - * - * @opt_param bool convert Whether to convert this file to the corresponding Google Docs format. - * @opt_param bool ocr Whether to attempt OCR on .jpg, .png, .gif, or .pdf uploads. - * @opt_param string ocrLanguage If ocr is true, hints at the language to use. Valid values are ISO 639-1 codes. - * @opt_param bool pinned Whether to pin the head revision of the new copy. - * @opt_param string timedTextLanguage The language of the timed text. - * @opt_param string timedTextTrackName The timed text track name. - * @return Google_DriveFile - */ - public function copy($fileId, Google_DriveFile $postBody, $optParams = array()) { - $params = array('fileId' => $fileId, 'postBody' => $postBody); - $params = array_merge($params, $optParams); - $data = $this->__call('copy', array($params)); - if ($this->useObjects()) { - return new Google_DriveFile($data); - } else { - return $data; - } - } - /** - * Permanently deletes a file by ID. Skips the trash. (files.delete) - * - * @param string $fileId The ID of the file to delete. - * @param array $optParams Optional parameters. - */ - public function delete($fileId, $optParams = array()) { - $params = array('fileId' => $fileId); - $params = array_merge($params, $optParams); - $data = $this->__call('delete', array($params)); - return $data; - } - /** - * Gets a file's metadata by ID. (files.get) - * - * @param string $fileId The ID for the file in question. - * @param array $optParams Optional parameters. - * - * @opt_param string projection This parameter is deprecated and has no function. - * @opt_param bool updateViewedDate Whether to update the view date after successfully retrieving the file. - * @return Google_DriveFile - */ - public function get($fileId, $optParams = array()) { - $params = array('fileId' => $fileId); - $params = array_merge($params, $optParams); - $data = $this->__call('get', array($params)); - if ($this->useObjects()) { - return new Google_DriveFile($data); - } else { - return $data; - } - } - /** - * Insert a new file. (files.insert) - * - * @param Google_DriveFile $postBody - * @param array $optParams Optional parameters. - * - * @opt_param bool convert Whether to convert this file to the corresponding Google Docs format. - * @opt_param bool ocr Whether to attempt OCR on .jpg, .png, .gif, or .pdf uploads. - * @opt_param string ocrLanguage If ocr is true, hints at the language to use. Valid values are ISO 639-1 codes. - * @opt_param bool pinned Whether to pin the head revision of the uploaded file. - * @opt_param string timedTextLanguage The language of the timed text. - * @opt_param string timedTextTrackName The timed text track name. - * @opt_param bool useContentAsIndexableText Whether to use the content as indexable text. - * @return Google_DriveFile - */ - public function insert(Google_DriveFile $postBody, $optParams = array()) { - $params = array('postBody' => $postBody); - $params = array_merge($params, $optParams); - $data = $this->__call('insert', array($params)); - if ($this->useObjects()) { - return new Google_DriveFile($data); - } else { - return $data; - } - } - /** - * Lists the user's files. (files.list) - * - * @param array $optParams Optional parameters. - * - * @opt_param int maxResults Maximum number of files to return. - * @opt_param string pageToken Page token for files. - * @opt_param string projection This parameter is deprecated and has no function. - * @opt_param string q Query string for searching files. - * @return Google_FileList - */ - public function listFiles($optParams = array()) { - $params = array(); - $params = array_merge($params, $optParams); - $data = $this->__call('list', array($params)); - if ($this->useObjects()) { - return new Google_FileList($data); - } else { - return $data; - } - } - /** - * Updates file metadata and/or content. This method supports patch semantics. (files.patch) - * - * @param string $fileId The ID of the file to update. - * @param Google_DriveFile $postBody - * @param array $optParams Optional parameters. - * - * @opt_param bool convert Whether to convert this file to the corresponding Google Docs format. - * @opt_param bool newRevision Whether a blob upload should create a new revision. If not set or false, the blob data in the current head revision is replaced. If true, a new blob is created as head revision, and previous revisions are preserved (causing increased use of the user's data storage quota). - * @opt_param bool ocr Whether to attempt OCR on .jpg, .png, .gif, or .pdf uploads. - * @opt_param string ocrLanguage If ocr is true, hints at the language to use. Valid values are ISO 639-1 codes. - * @opt_param bool pinned Whether to pin the new revision. - * @opt_param bool setModifiedDate Whether to set the modified date with the supplied modified date. - * @opt_param string timedTextLanguage The language of the timed text. - * @opt_param string timedTextTrackName The timed text track name. - * @opt_param bool updateViewedDate Whether to update the view date after successfully updating the file. - * @opt_param bool useContentAsIndexableText Whether to use the content as indexable text. - * @return Google_DriveFile - */ - public function patch($fileId, Google_DriveFile $postBody, $optParams = array()) { - $params = array('fileId' => $fileId, 'postBody' => $postBody); - $params = array_merge($params, $optParams); - $data = $this->__call('patch', array($params)); - if ($this->useObjects()) { - return new Google_DriveFile($data); - } else { - return $data; - } - } - /** - * Set the file's updated time to the current server time. (files.touch) - * - * @param string $fileId The ID of the file to update. - * @param array $optParams Optional parameters. - * @return Google_DriveFile - */ - public function touch($fileId, $optParams = array()) { - $params = array('fileId' => $fileId); - $params = array_merge($params, $optParams); - $data = $this->__call('touch', array($params)); - if ($this->useObjects()) { - return new Google_DriveFile($data); - } else { - return $data; - } - } - /** - * Moves a file to the trash. (files.trash) - * - * @param string $fileId The ID of the file to trash. - * @param array $optParams Optional parameters. - * @return Google_DriveFile - */ - public function trash($fileId, $optParams = array()) { - $params = array('fileId' => $fileId); - $params = array_merge($params, $optParams); - $data = $this->__call('trash', array($params)); - if ($this->useObjects()) { - return new Google_DriveFile($data); - } else { - return $data; - } - } - /** - * Restores a file from the trash. (files.untrash) - * - * @param string $fileId The ID of the file to untrash. - * @param array $optParams Optional parameters. - * @return Google_DriveFile - */ - public function untrash($fileId, $optParams = array()) { - $params = array('fileId' => $fileId); - $params = array_merge($params, $optParams); - $data = $this->__call('untrash', array($params)); - if ($this->useObjects()) { - return new Google_DriveFile($data); - } else { - return $data; - } - } - /** - * Updates file metadata and/or content. (files.update) - * - * @param string $fileId The ID of the file to update. - * @param Google_DriveFile $postBody - * @param array $optParams Optional parameters. - * - * @opt_param bool convert Whether to convert this file to the corresponding Google Docs format. - * @opt_param bool newRevision Whether a blob upload should create a new revision. If not set or false, the blob data in the current head revision is replaced. If true, a new blob is created as head revision, and previous revisions are preserved (causing increased use of the user's data storage quota). - * @opt_param bool ocr Whether to attempt OCR on .jpg, .png, .gif, or .pdf uploads. - * @opt_param string ocrLanguage If ocr is true, hints at the language to use. Valid values are ISO 639-1 codes. - * @opt_param bool pinned Whether to pin the new revision. - * @opt_param bool setModifiedDate Whether to set the modified date with the supplied modified date. - * @opt_param string timedTextLanguage The language of the timed text. - * @opt_param string timedTextTrackName The timed text track name. - * @opt_param bool updateViewedDate Whether to update the view date after successfully updating the file. - * @opt_param bool useContentAsIndexableText Whether to use the content as indexable text. - * @return Google_DriveFile - */ - public function update($fileId, Google_DriveFile $postBody, $optParams = array()) { - $params = array('fileId' => $fileId, 'postBody' => $postBody); - $params = array_merge($params, $optParams); - $data = $this->__call('update', array($params)); - if ($this->useObjects()) { - return new Google_DriveFile($data); - } else { - return $data; - } - } - } - - /** - * The "parents" collection of methods. - * Typical usage is: - * <code> - * $driveService = new Google_DriveService(...); - * $parents = $driveService->parents; - * </code> - */ - class Google_ParentsServiceResource extends Google_ServiceResource { - - - /** - * Removes a parent from a file. (parents.delete) - * - * @param string $fileId The ID of the file. - * @param string $parentId The ID of the parent. - * @param array $optParams Optional parameters. - */ - public function delete($fileId, $parentId, $optParams = array()) { - $params = array('fileId' => $fileId, 'parentId' => $parentId); - $params = array_merge($params, $optParams); - $data = $this->__call('delete', array($params)); - return $data; - } - /** - * Gets a specific parent reference. (parents.get) - * - * @param string $fileId The ID of the file. - * @param string $parentId The ID of the parent. - * @param array $optParams Optional parameters. - * @return Google_ParentReference - */ - public function get($fileId, $parentId, $optParams = array()) { - $params = array('fileId' => $fileId, 'parentId' => $parentId); - $params = array_merge($params, $optParams); - $data = $this->__call('get', array($params)); - if ($this->useObjects()) { - return new Google_ParentReference($data); - } else { - return $data; - } - } - /** - * Adds a parent folder for a file. (parents.insert) - * - * @param string $fileId The ID of the file. - * @param Google_ParentReference $postBody - * @param array $optParams Optional parameters. - * @return Google_ParentReference - */ - public function insert($fileId, Google_ParentReference $postBody, $optParams = array()) { - $params = array('fileId' => $fileId, 'postBody' => $postBody); - $params = array_merge($params, $optParams); - $data = $this->__call('insert', array($params)); - if ($this->useObjects()) { - return new Google_ParentReference($data); - } else { - return $data; - } - } - /** - * Lists a file's parents. (parents.list) - * - * @param string $fileId The ID of the file. - * @param array $optParams Optional parameters. - * @return Google_ParentList - */ - public function listParents($fileId, $optParams = array()) { - $params = array('fileId' => $fileId); - $params = array_merge($params, $optParams); - $data = $this->__call('list', array($params)); - if ($this->useObjects()) { - return new Google_ParentList($data); - } else { - return $data; - } - } - } - - /** - * The "permissions" collection of methods. - * Typical usage is: - * <code> - * $driveService = new Google_DriveService(...); - * $permissions = $driveService->permissions; - * </code> - */ - class Google_PermissionsServiceResource extends Google_ServiceResource { - - - /** - * Deletes a permission from a file. (permissions.delete) - * - * @param string $fileId The ID for the file. - * @param string $permissionId The ID for the permission. - * @param array $optParams Optional parameters. - */ - public function delete($fileId, $permissionId, $optParams = array()) { - $params = array('fileId' => $fileId, 'permissionId' => $permissionId); - $params = array_merge($params, $optParams); - $data = $this->__call('delete', array($params)); - return $data; - } - /** - * Gets a permission by ID. (permissions.get) - * - * @param string $fileId The ID for the file. - * @param string $permissionId The ID for the permission. - * @param array $optParams Optional parameters. - * @return Google_Permission - */ - public function get($fileId, $permissionId, $optParams = array()) { - $params = array('fileId' => $fileId, 'permissionId' => $permissionId); - $params = array_merge($params, $optParams); - $data = $this->__call('get', array($params)); - if ($this->useObjects()) { - return new Google_Permission($data); - } else { - return $data; - } - } - /** - * Inserts a permission for a file. (permissions.insert) - * - * @param string $fileId The ID for the file. - * @param Google_Permission $postBody - * @param array $optParams Optional parameters. - * - * @opt_param string emailMessage A custom message to include in notification emails. - * @opt_param bool sendNotificationEmails Whether to send notification emails when sharing to users or groups. - * @return Google_Permission - */ - public function insert($fileId, Google_Permission $postBody, $optParams = array()) { - $params = array('fileId' => $fileId, 'postBody' => $postBody); - $params = array_merge($params, $optParams); - $data = $this->__call('insert', array($params)); - if ($this->useObjects()) { - return new Google_Permission($data); - } else { - return $data; - } - } - /** - * Lists a file's permissions. (permissions.list) - * - * @param string $fileId The ID for the file. - * @param array $optParams Optional parameters. - * @return Google_PermissionList - */ - public function listPermissions($fileId, $optParams = array()) { - $params = array('fileId' => $fileId); - $params = array_merge($params, $optParams); - $data = $this->__call('list', array($params)); - if ($this->useObjects()) { - return new Google_PermissionList($data); - } else { - return $data; - } - } - /** - * Updates a permission. This method supports patch semantics. (permissions.patch) - * - * @param string $fileId The ID for the file. - * @param string $permissionId The ID for the permission. - * @param Google_Permission $postBody - * @param array $optParams Optional parameters. - * - * @opt_param bool transferOwnership Whether changing a role to 'owner' should also downgrade the current owners to writers. - * @return Google_Permission - */ - public function patch($fileId, $permissionId, Google_Permission $postBody, $optParams = array()) { - $params = array('fileId' => $fileId, 'permissionId' => $permissionId, 'postBody' => $postBody); - $params = array_merge($params, $optParams); - $data = $this->__call('patch', array($params)); - if ($this->useObjects()) { - return new Google_Permission($data); - } else { - return $data; - } - } - /** - * Updates a permission. (permissions.update) - * - * @param string $fileId The ID for the file. - * @param string $permissionId The ID for the permission. - * @param Google_Permission $postBody - * @param array $optParams Optional parameters. - * - * @opt_param bool transferOwnership Whether changing a role to 'owner' should also downgrade the current owners to writers. - * @return Google_Permission - */ - public function update($fileId, $permissionId, Google_Permission $postBody, $optParams = array()) { - $params = array('fileId' => $fileId, 'permissionId' => $permissionId, 'postBody' => $postBody); - $params = array_merge($params, $optParams); - $data = $this->__call('update', array($params)); - if ($this->useObjects()) { - return new Google_Permission($data); - } else { - return $data; - } - } - } - - /** - * The "properties" collection of methods. - * Typical usage is: - * <code> - * $driveService = new Google_DriveService(...); - * $properties = $driveService->properties; - * </code> - */ - class Google_PropertiesServiceResource extends Google_ServiceResource { - - - /** - * Deletes a property. (properties.delete) - * - * @param string $fileId The ID of the file. - * @param string $propertyKey The key of the property. - * @param array $optParams Optional parameters. - * - * @opt_param string visibility The visibility of the property. - */ - public function delete($fileId, $propertyKey, $optParams = array()) { - $params = array('fileId' => $fileId, 'propertyKey' => $propertyKey); - $params = array_merge($params, $optParams); - $data = $this->__call('delete', array($params)); - return $data; - } - /** - * Gets a property by its key. (properties.get) - * - * @param string $fileId The ID of the file. - * @param string $propertyKey The key of the property. - * @param array $optParams Optional parameters. - * - * @opt_param string visibility The visibility of the property. - * @return Google_Property - */ - public function get($fileId, $propertyKey, $optParams = array()) { - $params = array('fileId' => $fileId, 'propertyKey' => $propertyKey); - $params = array_merge($params, $optParams); - $data = $this->__call('get', array($params)); - if ($this->useObjects()) { - return new Google_Property($data); - } else { - return $data; - } - } - /** - * Adds a property to a file. (properties.insert) - * - * @param string $fileId The ID of the file. - * @param Google_Property $postBody - * @param array $optParams Optional parameters. - * @return Google_Property - */ - public function insert($fileId, Google_Property $postBody, $optParams = array()) { - $params = array('fileId' => $fileId, 'postBody' => $postBody); - $params = array_merge($params, $optParams); - $data = $this->__call('insert', array($params)); - if ($this->useObjects()) { - return new Google_Property($data); - } else { - return $data; - } - } - /** - * Lists a file's properties. (properties.list) - * - * @param string $fileId The ID of the file. - * @param array $optParams Optional parameters. - * @return Google_PropertyList - */ - public function listProperties($fileId, $optParams = array()) { - $params = array('fileId' => $fileId); - $params = array_merge($params, $optParams); - $data = $this->__call('list', array($params)); - if ($this->useObjects()) { - return new Google_PropertyList($data); - } else { - return $data; - } - } - /** - * Updates a property. This method supports patch semantics. (properties.patch) - * - * @param string $fileId The ID of the file. - * @param string $propertyKey The key of the property. - * @param Google_Property $postBody - * @param array $optParams Optional parameters. - * - * @opt_param string visibility The visibility of the property. - * @return Google_Property - */ - public function patch($fileId, $propertyKey, Google_Property $postBody, $optParams = array()) { - $params = array('fileId' => $fileId, 'propertyKey' => $propertyKey, 'postBody' => $postBody); - $params = array_merge($params, $optParams); - $data = $this->__call('patch', array($params)); - if ($this->useObjects()) { - return new Google_Property($data); - } else { - return $data; - } - } - /** - * Updates a property. (properties.update) - * - * @param string $fileId The ID of the file. - * @param string $propertyKey The key of the property. - * @param Google_Property $postBody - * @param array $optParams Optional parameters. - * - * @opt_param string visibility The visibility of the property. - * @return Google_Property - */ - public function update($fileId, $propertyKey, Google_Property $postBody, $optParams = array()) { - $params = array('fileId' => $fileId, 'propertyKey' => $propertyKey, 'postBody' => $postBody); - $params = array_merge($params, $optParams); - $data = $this->__call('update', array($params)); - if ($this->useObjects()) { - return new Google_Property($data); - } else { - return $data; - } - } - } - - /** - * The "replies" collection of methods. - * Typical usage is: - * <code> - * $driveService = new Google_DriveService(...); - * $replies = $driveService->replies; - * </code> - */ - class Google_RepliesServiceResource extends Google_ServiceResource { - - - /** - * Deletes a reply. (replies.delete) - * - * @param string $fileId The ID of the file. - * @param string $commentId The ID of the comment. - * @param string $replyId The ID of the reply. - * @param array $optParams Optional parameters. - */ - public function delete($fileId, $commentId, $replyId, $optParams = array()) { - $params = array('fileId' => $fileId, 'commentId' => $commentId, 'replyId' => $replyId); - $params = array_merge($params, $optParams); - $data = $this->__call('delete', array($params)); - return $data; - } - /** - * Gets a reply. (replies.get) - * - * @param string $fileId The ID of the file. - * @param string $commentId The ID of the comment. - * @param string $replyId The ID of the reply. - * @param array $optParams Optional parameters. - * - * @opt_param bool includeDeleted If set, this will succeed when retrieving a deleted reply. - * @return Google_CommentReply - */ - public function get($fileId, $commentId, $replyId, $optParams = array()) { - $params = array('fileId' => $fileId, 'commentId' => $commentId, 'replyId' => $replyId); - $params = array_merge($params, $optParams); - $data = $this->__call('get', array($params)); - if ($this->useObjects()) { - return new Google_CommentReply($data); - } else { - return $data; - } - } - /** - * Creates a new reply to the given comment. (replies.insert) - * - * @param string $fileId The ID of the file. - * @param string $commentId The ID of the comment. - * @param Google_CommentReply $postBody - * @param array $optParams Optional parameters. - * @return Google_CommentReply - */ - public function insert($fileId, $commentId, Google_CommentReply $postBody, $optParams = array()) { - $params = array('fileId' => $fileId, 'commentId' => $commentId, 'postBody' => $postBody); - $params = array_merge($params, $optParams); - $data = $this->__call('insert', array($params)); - if ($this->useObjects()) { - return new Google_CommentReply($data); - } else { - return $data; - } - } - /** - * Lists all of the replies to a comment. (replies.list) - * - * @param string $fileId The ID of the file. - * @param string $commentId The ID of the comment. - * @param array $optParams Optional parameters. - * - * @opt_param bool includeDeleted If set, all replies, including deleted replies (with content stripped) will be returned. - * @opt_param int maxResults The maximum number of replies to include in the response, used for paging. - * @opt_param string pageToken The continuation token, used to page through large result sets. To get the next page of results, set this parameter to the value of "nextPageToken" from the previous response. - * @return Google_CommentReplyList - */ - public function listReplies($fileId, $commentId, $optParams = array()) { - $params = array('fileId' => $fileId, 'commentId' => $commentId); - $params = array_merge($params, $optParams); - $data = $this->__call('list', array($params)); - if ($this->useObjects()) { - return new Google_CommentReplyList($data); - } else { - return $data; - } - } - /** - * Updates an existing reply. This method supports patch semantics. (replies.patch) - * - * @param string $fileId The ID of the file. - * @param string $commentId The ID of the comment. - * @param string $replyId The ID of the reply. - * @param Google_CommentReply $postBody - * @param array $optParams Optional parameters. - * @return Google_CommentReply - */ - public function patch($fileId, $commentId, $replyId, Google_CommentReply $postBody, $optParams = array()) { - $params = array('fileId' => $fileId, 'commentId' => $commentId, 'replyId' => $replyId, 'postBody' => $postBody); - $params = array_merge($params, $optParams); - $data = $this->__call('patch', array($params)); - if ($this->useObjects()) { - return new Google_CommentReply($data); - } else { - return $data; - } - } - /** - * Updates an existing reply. (replies.update) - * - * @param string $fileId The ID of the file. - * @param string $commentId The ID of the comment. - * @param string $replyId The ID of the reply. - * @param Google_CommentReply $postBody - * @param array $optParams Optional parameters. - * @return Google_CommentReply - */ - public function update($fileId, $commentId, $replyId, Google_CommentReply $postBody, $optParams = array()) { - $params = array('fileId' => $fileId, 'commentId' => $commentId, 'replyId' => $replyId, 'postBody' => $postBody); - $params = array_merge($params, $optParams); - $data = $this->__call('update', array($params)); - if ($this->useObjects()) { - return new Google_CommentReply($data); - } else { - return $data; - } - } - } - - /** - * The "revisions" collection of methods. - * Typical usage is: - * <code> - * $driveService = new Google_DriveService(...); - * $revisions = $driveService->revisions; - * </code> - */ - class Google_RevisionsServiceResource extends Google_ServiceResource { - - - /** - * Removes a revision. (revisions.delete) - * - * @param string $fileId The ID of the file. - * @param string $revisionId The ID of the revision. - * @param array $optParams Optional parameters. - */ - public function delete($fileId, $revisionId, $optParams = array()) { - $params = array('fileId' => $fileId, 'revisionId' => $revisionId); - $params = array_merge($params, $optParams); - $data = $this->__call('delete', array($params)); - return $data; - } - /** - * Gets a specific revision. (revisions.get) - * - * @param string $fileId The ID of the file. - * @param string $revisionId The ID of the revision. - * @param array $optParams Optional parameters. - * @return Google_Revision - */ - public function get($fileId, $revisionId, $optParams = array()) { - $params = array('fileId' => $fileId, 'revisionId' => $revisionId); - $params = array_merge($params, $optParams); - $data = $this->__call('get', array($params)); - if ($this->useObjects()) { - return new Google_Revision($data); - } else { - return $data; - } - } - /** - * Lists a file's revisions. (revisions.list) - * - * @param string $fileId The ID of the file. - * @param array $optParams Optional parameters. - * @return Google_RevisionList - */ - public function listRevisions($fileId, $optParams = array()) { - $params = array('fileId' => $fileId); - $params = array_merge($params, $optParams); - $data = $this->__call('list', array($params)); - if ($this->useObjects()) { - return new Google_RevisionList($data); - } else { - return $data; - } - } - /** - * Updates a revision. This method supports patch semantics. (revisions.patch) - * - * @param string $fileId The ID for the file. - * @param string $revisionId The ID for the revision. - * @param Google_Revision $postBody - * @param array $optParams Optional parameters. - * @return Google_Revision - */ - public function patch($fileId, $revisionId, Google_Revision $postBody, $optParams = array()) { - $params = array('fileId' => $fileId, 'revisionId' => $revisionId, 'postBody' => $postBody); - $params = array_merge($params, $optParams); - $data = $this->__call('patch', array($params)); - if ($this->useObjects()) { - return new Google_Revision($data); - } else { - return $data; - } - } - /** - * Updates a revision. (revisions.update) - * - * @param string $fileId The ID for the file. - * @param string $revisionId The ID for the revision. - * @param Google_Revision $postBody - * @param array $optParams Optional parameters. - * @return Google_Revision - */ - public function update($fileId, $revisionId, Google_Revision $postBody, $optParams = array()) { - $params = array('fileId' => $fileId, 'revisionId' => $revisionId, 'postBody' => $postBody); - $params = array_merge($params, $optParams); - $data = $this->__call('update', array($params)); - if ($this->useObjects()) { - return new Google_Revision($data); - } else { - return $data; - } - } - } - -/** - * Service definition for Google_Drive (v2). - * - * <p> - * The API to interact with Drive. - * </p> - * - * <p> - * For more information about this service, see the - * <a href="https://developers.google.com/drive/" target="_blank">API Documentation</a> - * </p> - * - * @author Google, Inc. - */ -class Google_DriveService extends Google_Service { - public $about; - public $apps; - public $changes; - public $children; - public $comments; - public $files; - public $parents; - public $permissions; - public $properties; - public $replies; - public $revisions; - /** - * Constructs the internal representation of the Drive service. - * - * @param Google_Client $client - */ - public function __construct(Google_Client $client) { - $this->servicePath = 'drive/v2/'; - $this->version = 'v2'; - $this->serviceName = 'drive'; - - $client->addService($this->serviceName, $this->version); - $this->about = new Google_AboutServiceResource($this, $this->serviceName, 'about', json_decode('{"methods": {"get": {"id": "drive.about.get", "path": "about", "httpMethod": "GET", "parameters": {"includeSubscribed": {"type": "boolean", "default": "true", "location": "query"}, "maxChangeIdCount": {"type": "string", "default": "1", "format": "int64", "location": "query"}, "startChangeId": {"type": "string", "format": "int64", "location": "query"}}, "response": {"$ref": "About"}, "scopes": ["https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/drive.file", "https://www.googleapis.com/auth/drive.metadata.readonly", "https://www.googleapis.com/auth/drive.readonly"]}}}', true)); - $this->apps = new Google_AppsServiceResource($this, $this->serviceName, 'apps', json_decode('{"methods": {"get": {"id": "drive.apps.get", "path": "apps/{appId}", "httpMethod": "GET", "parameters": {"appId": {"type": "string", "required": true, "location": "path"}}, "response": {"$ref": "App"}, "scopes": ["https://www.googleapis.com/auth/drive.apps.readonly"]}, "list": {"id": "drive.apps.list", "path": "apps", "httpMethod": "GET", "response": {"$ref": "AppList"}, "scopes": ["https://www.googleapis.com/auth/drive.apps.readonly"]}}}', true)); - $this->changes = new Google_ChangesServiceResource($this, $this->serviceName, 'changes', json_decode('{"methods": {"get": {"id": "drive.changes.get", "path": "changes/{changeId}", "httpMethod": "GET", "parameters": {"changeId": {"type": "string", "required": true, "location": "path"}}, "response": {"$ref": "Change"}, "scopes": ["https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/drive.file", "https://www.googleapis.com/auth/drive.metadata.readonly", "https://www.googleapis.com/auth/drive.readonly"]}, "list": {"id": "drive.changes.list", "path": "changes", "httpMethod": "GET", "parameters": {"includeDeleted": {"type": "boolean", "default": "true", "location": "query"}, "includeSubscribed": {"type": "boolean", "default": "true", "location": "query"}, "maxResults": {"type": "integer", "default": "100", "format": "int32", "minimum": "0", "location": "query"}, "pageToken": {"type": "string", "location": "query"}, "startChangeId": {"type": "string", "format": "int64", "location": "query"}}, "response": {"$ref": "ChangeList"}, "scopes": ["https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/drive.file", "https://www.googleapis.com/auth/drive.metadata.readonly", "https://www.googleapis.com/auth/drive.readonly"], "supportsSubscription": true}}}', true)); - $this->children = new Google_ChildrenServiceResource($this, $this->serviceName, 'children', json_decode('{"methods": {"delete": {"id": "drive.children.delete", "path": "files/{folderId}/children/{childId}", "httpMethod": "DELETE", "parameters": {"childId": {"type": "string", "required": true, "location": "path"}, "folderId": {"type": "string", "required": true, "location": "path"}}, "scopes": ["https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/drive.file"]}, "get": {"id": "drive.children.get", "path": "files/{folderId}/children/{childId}", "httpMethod": "GET", "parameters": {"childId": {"type": "string", "required": true, "location": "path"}, "folderId": {"type": "string", "required": true, "location": "path"}}, "response": {"$ref": "ChildReference"}, "scopes": ["https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/drive.file", "https://www.googleapis.com/auth/drive.metadata.readonly", "https://www.googleapis.com/auth/drive.readonly"]}, "insert": {"id": "drive.children.insert", "path": "files/{folderId}/children", "httpMethod": "POST", "parameters": {"folderId": {"type": "string", "required": true, "location": "path"}}, "request": {"$ref": "ChildReference"}, "response": {"$ref": "ChildReference"}, "scopes": ["https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/drive.file"]}, "list": {"id": "drive.children.list", "path": "files/{folderId}/children", "httpMethod": "GET", "parameters": {"folderId": {"type": "string", "required": true, "location": "path"}, "maxResults": {"type": "integer", "default": "100", "format": "int32", "minimum": "0", "location": "query"}, "pageToken": {"type": "string", "location": "query"}, "q": {"type": "string", "location": "query"}}, "response": {"$ref": "ChildList"}, "scopes": ["https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/drive.file", "https://www.googleapis.com/auth/drive.metadata.readonly", "https://www.googleapis.com/auth/drive.readonly"]}}}', true)); - $this->comments = new Google_CommentsServiceResource($this, $this->serviceName, 'comments', json_decode('{"methods": {"delete": {"id": "drive.comments.delete", "path": "files/{fileId}/comments/{commentId}", "httpMethod": "DELETE", "parameters": {"commentId": {"type": "string", "required": true, "location": "path"}, "fileId": {"type": "string", "required": true, "location": "path"}}, "scopes": ["https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/drive.file", "https://www.googleapis.com/auth/drive.readonly"]}, "get": {"id": "drive.comments.get", "path": "files/{fileId}/comments/{commentId}", "httpMethod": "GET", "parameters": {"commentId": {"type": "string", "required": true, "location": "path"}, "fileId": {"type": "string", "required": true, "location": "path"}, "includeDeleted": {"type": "boolean", "default": "false", "location": "query"}}, "response": {"$ref": "Comment"}, "scopes": ["https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/drive.file", "https://www.googleapis.com/auth/drive.readonly"]}, "insert": {"id": "drive.comments.insert", "path": "files/{fileId}/comments", "httpMethod": "POST", "parameters": {"fileId": {"type": "string", "required": true, "location": "path"}}, "request": {"$ref": "Comment"}, "response": {"$ref": "Comment"}, "scopes": ["https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/drive.file", "https://www.googleapis.com/auth/drive.readonly"]}, "list": {"id": "drive.comments.list", "path": "files/{fileId}/comments", "httpMethod": "GET", "parameters": {"fileId": {"type": "string", "required": true, "location": "path"}, "includeDeleted": {"type": "boolean", "default": "false", "location": "query"}, "maxResults": {"type": "integer", "default": "20", "format": "int32", "minimum": "0", "maximum": "100", "location": "query"}, "pageToken": {"type": "string", "location": "query"}, "updatedMin": {"type": "string", "location": "query"}}, "response": {"$ref": "CommentList"}, "scopes": ["https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/drive.file", "https://www.googleapis.com/auth/drive.readonly"]}, "patch": {"id": "drive.comments.patch", "path": "files/{fileId}/comments/{commentId}", "httpMethod": "PATCH", "parameters": {"commentId": {"type": "string", "required": true, "location": "path"}, "fileId": {"type": "string", "required": true, "location": "path"}}, "request": {"$ref": "Comment"}, "response": {"$ref": "Comment"}, "scopes": ["https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/drive.file"]}, "update": {"id": "drive.comments.update", "path": "files/{fileId}/comments/{commentId}", "httpMethod": "PUT", "parameters": {"commentId": {"type": "string", "required": true, "location": "path"}, "fileId": {"type": "string", "required": true, "location": "path"}}, "request": {"$ref": "Comment"}, "response": {"$ref": "Comment"}, "scopes": ["https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/drive.file"]}}}', true)); - $this->files = new Google_FilesServiceResource($this, $this->serviceName, 'files', json_decode('{"methods": {"copy": {"id": "drive.files.copy", "path": "files/{fileId}/copy", "httpMethod": "POST", "parameters": {"convert": {"type": "boolean", "default": "false", "location": "query"}, "fileId": {"type": "string", "required": true, "location": "path"}, "ocr": {"type": "boolean", "default": "false", "location": "query"}, "ocrLanguage": {"type": "string", "location": "query"}, "pinned": {"type": "boolean", "default": "false", "location": "query"}, "timedTextLanguage": {"type": "string", "location": "query"}, "timedTextTrackName": {"type": "string", "location": "query"}}, "request": {"$ref": "File"}, "response": {"$ref": "File"}, "scopes": ["https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/drive.file"]}, "delete": {"id": "drive.files.delete", "path": "files/{fileId}", "httpMethod": "DELETE", "parameters": {"fileId": {"type": "string", "required": true, "location": "path"}}, "scopes": ["https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/drive.file"]}, "get": {"id": "drive.files.get", "path": "files/{fileId}", "httpMethod": "GET", "parameters": {"fileId": {"type": "string", "required": true, "location": "path"}, "projection": {"type": "string", "enum": ["BASIC", "FULL"], "location": "query"}, "updateViewedDate": {"type": "boolean", "default": "false", "location": "query"}}, "response": {"$ref": "File"}, "scopes": ["https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/drive.file", "https://www.googleapis.com/auth/drive.metadata.readonly", "https://www.googleapis.com/auth/drive.readonly"], "supportsSubscription": true}, "insert": {"id": "drive.files.insert", "path": "files", "httpMethod": "POST", "parameters": {"convert": {"type": "boolean", "default": "false", "location": "query"}, "ocr": {"type": "boolean", "default": "false", "location": "query"}, "ocrLanguage": {"type": "string", "location": "query"}, "pinned": {"type": "boolean", "default": "false", "location": "query"}, "timedTextLanguage": {"type": "string", "location": "query"}, "timedTextTrackName": {"type": "string", "location": "query"}, "useContentAsIndexableText": {"type": "boolean", "default": "false", "location": "query"}}, "request": {"$ref": "File"}, "response": {"$ref": "File"}, "scopes": ["https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/drive.file"], "supportsMediaUpload": true, "mediaUpload": {"accept": ["*/*"], "maxSize": "10GB", "protocols": {"simple": {"multipart": true, "path": "/upload/drive/v2/files"}, "resumable": {"multipart": true, "path": "/resumable/upload/drive/v2/files"}}}, "supportsSubscription": true}, "list": {"id": "drive.files.list", "path": "files", "httpMethod": "GET", "parameters": {"maxResults": {"type": "integer", "default": "100", "format": "int32", "minimum": "0", "location": "query"}, "pageToken": {"type": "string", "location": "query"}, "projection": {"type": "string", "enum": ["BASIC", "FULL"], "location": "query"}, "q": {"type": "string", "location": "query"}}, "response": {"$ref": "FileList"}, "scopes": ["https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/drive.file", "https://www.googleapis.com/auth/drive.metadata.readonly", "https://www.googleapis.com/auth/drive.readonly"]}, "patch": {"id": "drive.files.patch", "path": "files/{fileId}", "httpMethod": "PATCH", "parameters": {"convert": {"type": "boolean", "default": "false", "location": "query"}, "fileId": {"type": "string", "required": true, "location": "path"}, "newRevision": {"type": "boolean", "default": "true", "location": "query"}, "ocr": {"type": "boolean", "default": "false", "location": "query"}, "ocrLanguage": {"type": "string", "location": "query"}, "pinned": {"type": "boolean", "default": "false", "location": "query"}, "setModifiedDate": {"type": "boolean", "default": "false", "location": "query"}, "timedTextLanguage": {"type": "string", "location": "query"}, "timedTextTrackName": {"type": "string", "location": "query"}, "updateViewedDate": {"type": "boolean", "default": "true", "location": "query"}, "useContentAsIndexableText": {"type": "boolean", "default": "false", "location": "query"}}, "request": {"$ref": "File"}, "response": {"$ref": "File"}, "scopes": ["https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/drive.file", "https://www.googleapis.com/auth/drive.scripts"]}, "touch": {"id": "drive.files.touch", "path": "files/{fileId}/touch", "httpMethod": "POST", "parameters": {"fileId": {"type": "string", "required": true, "location": "path"}}, "response": {"$ref": "File"}, "scopes": ["https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/drive.file"]}, "trash": {"id": "drive.files.trash", "path": "files/{fileId}/trash", "httpMethod": "POST", "parameters": {"fileId": {"type": "string", "required": true, "location": "path"}}, "response": {"$ref": "File"}, "scopes": ["https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/drive.file"]}, "untrash": {"id": "drive.files.untrash", "path": "files/{fileId}/untrash", "httpMethod": "POST", "parameters": {"fileId": {"type": "string", "required": true, "location": "path"}}, "response": {"$ref": "File"}, "scopes": ["https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/drive.file"]}, "update": {"id": "drive.files.update", "path": "files/{fileId}", "httpMethod": "PUT", "parameters": {"convert": {"type": "boolean", "default": "false", "location": "query"}, "fileId": {"type": "string", "required": true, "location": "path"}, "newRevision": {"type": "boolean", "default": "true", "location": "query"}, "ocr": {"type": "boolean", "default": "false", "location": "query"}, "ocrLanguage": {"type": "string", "location": "query"}, "pinned": {"type": "boolean", "default": "false", "location": "query"}, "setModifiedDate": {"type": "boolean", "default": "false", "location": "query"}, "timedTextLanguage": {"type": "string", "location": "query"}, "timedTextTrackName": {"type": "string", "location": "query"}, "updateViewedDate": {"type": "boolean", "default": "true", "location": "query"}, "useContentAsIndexableText": {"type": "boolean", "default": "false", "location": "query"}}, "request": {"$ref": "File"}, "response": {"$ref": "File"}, "scopes": ["https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/drive.file", "https://www.googleapis.com/auth/drive.scripts"], "supportsMediaUpload": true, "mediaUpload": {"accept": ["*/*"], "maxSize": "10GB", "protocols": {"simple": {"multipart": true, "path": "/upload/drive/v2/files/{fileId}"}, "resumable": {"multipart": true, "path": "/resumable/upload/drive/v2/files/{fileId}"}}}}}}', true)); - $this->parents = new Google_ParentsServiceResource($this, $this->serviceName, 'parents', json_decode('{"methods": {"delete": {"id": "drive.parents.delete", "path": "files/{fileId}/parents/{parentId}", "httpMethod": "DELETE", "parameters": {"fileId": {"type": "string", "required": true, "location": "path"}, "parentId": {"type": "string", "required": true, "location": "path"}}, "scopes": ["https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/drive.file"]}, "get": {"id": "drive.parents.get", "path": "files/{fileId}/parents/{parentId}", "httpMethod": "GET", "parameters": {"fileId": {"type": "string", "required": true, "location": "path"}, "parentId": {"type": "string", "required": true, "location": "path"}}, "response": {"$ref": "ParentReference"}, "scopes": ["https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/drive.file", "https://www.googleapis.com/auth/drive.metadata.readonly", "https://www.googleapis.com/auth/drive.readonly"]}, "insert": {"id": "drive.parents.insert", "path": "files/{fileId}/parents", "httpMethod": "POST", "parameters": {"fileId": {"type": "string", "required": true, "location": "path"}}, "request": {"$ref": "ParentReference"}, "response": {"$ref": "ParentReference"}, "scopes": ["https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/drive.file"]}, "list": {"id": "drive.parents.list", "path": "files/{fileId}/parents", "httpMethod": "GET", "parameters": {"fileId": {"type": "string", "required": true, "location": "path"}}, "response": {"$ref": "ParentList"}, "scopes": ["https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/drive.file", "https://www.googleapis.com/auth/drive.metadata.readonly", "https://www.googleapis.com/auth/drive.readonly"]}}}', true)); - $this->permissions = new Google_PermissionsServiceResource($this, $this->serviceName, 'permissions', json_decode('{"methods": {"delete": {"id": "drive.permissions.delete", "path": "files/{fileId}/permissions/{permissionId}", "httpMethod": "DELETE", "parameters": {"fileId": {"type": "string", "required": true, "location": "path"}, "permissionId": {"type": "string", "required": true, "location": "path"}}, "scopes": ["https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/drive.file"]}, "get": {"id": "drive.permissions.get", "path": "files/{fileId}/permissions/{permissionId}", "httpMethod": "GET", "parameters": {"fileId": {"type": "string", "required": true, "location": "path"}, "permissionId": {"type": "string", "required": true, "location": "path"}}, "response": {"$ref": "Permission"}, "scopes": ["https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/drive.file", "https://www.googleapis.com/auth/drive.metadata.readonly", "https://www.googleapis.com/auth/drive.readonly"]}, "insert": {"id": "drive.permissions.insert", "path": "files/{fileId}/permissions", "httpMethod": "POST", "parameters": {"emailMessage": {"type": "string", "location": "query"}, "fileId": {"type": "string", "required": true, "location": "path"}, "sendNotificationEmails": {"type": "boolean", "default": "true", "location": "query"}}, "request": {"$ref": "Permission"}, "response": {"$ref": "Permission"}, "scopes": ["https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/drive.file"]}, "list": {"id": "drive.permissions.list", "path": "files/{fileId}/permissions", "httpMethod": "GET", "parameters": {"fileId": {"type": "string", "required": true, "location": "path"}}, "response": {"$ref": "PermissionList"}, "scopes": ["https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/drive.file", "https://www.googleapis.com/auth/drive.metadata.readonly", "https://www.googleapis.com/auth/drive.readonly"]}, "patch": {"id": "drive.permissions.patch", "path": "files/{fileId}/permissions/{permissionId}", "httpMethod": "PATCH", "parameters": {"fileId": {"type": "string", "required": true, "location": "path"}, "permissionId": {"type": "string", "required": true, "location": "path"}, "transferOwnership": {"type": "boolean", "default": "false", "location": "query"}}, "request": {"$ref": "Permission"}, "response": {"$ref": "Permission"}, "scopes": ["https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/drive.file"]}, "update": {"id": "drive.permissions.update", "path": "files/{fileId}/permissions/{permissionId}", "httpMethod": "PUT", "parameters": {"fileId": {"type": "string", "required": true, "location": "path"}, "permissionId": {"type": "string", "required": true, "location": "path"}, "transferOwnership": {"type": "boolean", "default": "false", "location": "query"}}, "request": {"$ref": "Permission"}, "response": {"$ref": "Permission"}, "scopes": ["https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/drive.file"]}}}', true)); - $this->properties = new Google_PropertiesServiceResource($this, $this->serviceName, 'properties', json_decode('{"methods": {"delete": {"id": "drive.properties.delete", "path": "files/{fileId}/properties/{propertyKey}", "httpMethod": "DELETE", "parameters": {"fileId": {"type": "string", "required": true, "location": "path"}, "propertyKey": {"type": "string", "required": true, "location": "path"}, "visibility": {"type": "string", "default": "private", "location": "query"}}, "scopes": ["https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/drive.file"]}, "get": {"id": "drive.properties.get", "path": "files/{fileId}/properties/{propertyKey}", "httpMethod": "GET", "parameters": {"fileId": {"type": "string", "required": true, "location": "path"}, "propertyKey": {"type": "string", "required": true, "location": "path"}, "visibility": {"type": "string", "default": "private", "location": "query"}}, "response": {"$ref": "Property"}, "scopes": ["https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/drive.file", "https://www.googleapis.com/auth/drive.metadata.readonly", "https://www.googleapis.com/auth/drive.readonly"]}, "insert": {"id": "drive.properties.insert", "path": "files/{fileId}/properties", "httpMethod": "POST", "parameters": {"fileId": {"type": "string", "required": true, "location": "path"}}, "request": {"$ref": "Property"}, "response": {"$ref": "Property"}, "scopes": ["https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/drive.file"]}, "list": {"id": "drive.properties.list", "path": "files/{fileId}/properties", "httpMethod": "GET", "parameters": {"fileId": {"type": "string", "required": true, "location": "path"}}, "response": {"$ref": "PropertyList"}, "scopes": ["https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/drive.file", "https://www.googleapis.com/auth/drive.metadata.readonly", "https://www.googleapis.com/auth/drive.readonly"]}, "patch": {"id": "drive.properties.patch", "path": "files/{fileId}/properties/{propertyKey}", "httpMethod": "PATCH", "parameters": {"fileId": {"type": "string", "required": true, "location": "path"}, "propertyKey": {"type": "string", "required": true, "location": "path"}, "visibility": {"type": "string", "default": "private", "location": "query"}}, "request": {"$ref": "Property"}, "response": {"$ref": "Property"}, "scopes": ["https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/drive.file"]}, "update": {"id": "drive.properties.update", "path": "files/{fileId}/properties/{propertyKey}", "httpMethod": "PUT", "parameters": {"fileId": {"type": "string", "required": true, "location": "path"}, "propertyKey": {"type": "string", "required": true, "location": "path"}, "visibility": {"type": "string", "default": "private", "location": "query"}}, "request": {"$ref": "Property"}, "response": {"$ref": "Property"}, "scopes": ["https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/drive.file"]}}}', true)); - $this->replies = new Google_RepliesServiceResource($this, $this->serviceName, 'replies', json_decode('{"methods": {"delete": {"id": "drive.replies.delete", "path": "files/{fileId}/comments/{commentId}/replies/{replyId}", "httpMethod": "DELETE", "parameters": {"commentId": {"type": "string", "required": true, "location": "path"}, "fileId": {"type": "string", "required": true, "location": "path"}, "replyId": {"type": "string", "required": true, "location": "path"}}, "scopes": ["https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/drive.file"]}, "get": {"id": "drive.replies.get", "path": "files/{fileId}/comments/{commentId}/replies/{replyId}", "httpMethod": "GET", "parameters": {"commentId": {"type": "string", "required": true, "location": "path"}, "fileId": {"type": "string", "required": true, "location": "path"}, "includeDeleted": {"type": "boolean", "default": "false", "location": "query"}, "replyId": {"type": "string", "required": true, "location": "path"}}, "response": {"$ref": "CommentReply"}, "scopes": ["https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/drive.file", "https://www.googleapis.com/auth/drive.readonly"]}, "insert": {"id": "drive.replies.insert", "path": "files/{fileId}/comments/{commentId}/replies", "httpMethod": "POST", "parameters": {"commentId": {"type": "string", "required": true, "location": "path"}, "fileId": {"type": "string", "required": true, "location": "path"}}, "request": {"$ref": "CommentReply"}, "response": {"$ref": "CommentReply"}, "scopes": ["https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/drive.file"]}, "list": {"id": "drive.replies.list", "path": "files/{fileId}/comments/{commentId}/replies", "httpMethod": "GET", "parameters": {"commentId": {"type": "string", "required": true, "location": "path"}, "fileId": {"type": "string", "required": true, "location": "path"}, "includeDeleted": {"type": "boolean", "default": "false", "location": "query"}, "maxResults": {"type": "integer", "default": "20", "format": "int32", "minimum": "0", "maximum": "100", "location": "query"}, "pageToken": {"type": "string", "location": "query"}}, "response": {"$ref": "CommentReplyList"}, "scopes": ["https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/drive.file", "https://www.googleapis.com/auth/drive.readonly"]}, "patch": {"id": "drive.replies.patch", "path": "files/{fileId}/comments/{commentId}/replies/{replyId}", "httpMethod": "PATCH", "parameters": {"commentId": {"type": "string", "required": true, "location": "path"}, "fileId": {"type": "string", "required": true, "location": "path"}, "replyId": {"type": "string", "required": true, "location": "path"}}, "request": {"$ref": "CommentReply"}, "response": {"$ref": "CommentReply"}, "scopes": ["https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/drive.file"]}, "update": {"id": "drive.replies.update", "path": "files/{fileId}/comments/{commentId}/replies/{replyId}", "httpMethod": "PUT", "parameters": {"commentId": {"type": "string", "required": true, "location": "path"}, "fileId": {"type": "string", "required": true, "location": "path"}, "replyId": {"type": "string", "required": true, "location": "path"}}, "request": {"$ref": "CommentReply"}, "response": {"$ref": "CommentReply"}, "scopes": ["https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/drive.file"]}}}', true)); - $this->revisions = new Google_RevisionsServiceResource($this, $this->serviceName, 'revisions', json_decode('{"methods": {"delete": {"id": "drive.revisions.delete", "path": "files/{fileId}/revisions/{revisionId}", "httpMethod": "DELETE", "parameters": {"fileId": {"type": "string", "required": true, "location": "path"}, "revisionId": {"type": "string", "required": true, "location": "path"}}, "scopes": ["https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/drive.file"]}, "get": {"id": "drive.revisions.get", "path": "files/{fileId}/revisions/{revisionId}", "httpMethod": "GET", "parameters": {"fileId": {"type": "string", "required": true, "location": "path"}, "revisionId": {"type": "string", "required": true, "location": "path"}}, "response": {"$ref": "Revision"}, "scopes": ["https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/drive.file", "https://www.googleapis.com/auth/drive.metadata.readonly", "https://www.googleapis.com/auth/drive.readonly"]}, "list": {"id": "drive.revisions.list", "path": "files/{fileId}/revisions", "httpMethod": "GET", "parameters": {"fileId": {"type": "string", "required": true, "location": "path"}}, "response": {"$ref": "RevisionList"}, "scopes": ["https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/drive.file", "https://www.googleapis.com/auth/drive.metadata.readonly", "https://www.googleapis.com/auth/drive.readonly"]}, "patch": {"id": "drive.revisions.patch", "path": "files/{fileId}/revisions/{revisionId}", "httpMethod": "PATCH", "parameters": {"fileId": {"type": "string", "required": true, "location": "path"}, "revisionId": {"type": "string", "required": true, "location": "path"}}, "request": {"$ref": "Revision"}, "response": {"$ref": "Revision"}, "scopes": ["https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/drive.file"]}, "update": {"id": "drive.revisions.update", "path": "files/{fileId}/revisions/{revisionId}", "httpMethod": "PUT", "parameters": {"fileId": {"type": "string", "required": true, "location": "path"}, "revisionId": {"type": "string", "required": true, "location": "path"}}, "request": {"$ref": "Revision"}, "response": {"$ref": "Revision"}, "scopes": ["https://www.googleapis.com/auth/drive", "https://www.googleapis.com/auth/drive.file"]}}}', true)); - - } -} - - - -class Google_About extends Google_Model { - protected $__additionalRoleInfoType = 'Google_AboutAdditionalRoleInfo'; - protected $__additionalRoleInfoDataType = 'array'; - public $additionalRoleInfo; - public $domainSharingPolicy; - public $etag; - protected $__exportFormatsType = 'Google_AboutExportFormats'; - protected $__exportFormatsDataType = 'array'; - public $exportFormats; - protected $__featuresType = 'Google_AboutFeatures'; - protected $__featuresDataType = 'array'; - public $features; - protected $__importFormatsType = 'Google_AboutImportFormats'; - protected $__importFormatsDataType = 'array'; - public $importFormats; - public $isCurrentAppInstalled; - public $kind; - public $largestChangeId; - protected $__maxUploadSizesType = 'Google_AboutMaxUploadSizes'; - protected $__maxUploadSizesDataType = 'array'; - public $maxUploadSizes; - public $name; - public $permissionId; - public $quotaBytesTotal; - public $quotaBytesUsed; - public $quotaBytesUsedAggregate; - public $quotaBytesUsedInTrash; - public $remainingChangeIds; - public $rootFolderId; - public $selfLink; - protected $__userType = 'Google_User'; - protected $__userDataType = ''; - public $user; - public function setAdditionalRoleInfo(/* array(Google_AboutAdditionalRoleInfo) */ $additionalRoleInfo) { - $this->assertIsArray($additionalRoleInfo, 'Google_AboutAdditionalRoleInfo', __METHOD__); - $this->additionalRoleInfo = $additionalRoleInfo; - } - public function getAdditionalRoleInfo() { - return $this->additionalRoleInfo; - } - public function setDomainSharingPolicy($domainSharingPolicy) { - $this->domainSharingPolicy = $domainSharingPolicy; - } - public function getDomainSharingPolicy() { - return $this->domainSharingPolicy; - } - public function setEtag($etag) { - $this->etag = $etag; - } - public function getEtag() { - return $this->etag; - } - public function setExportFormats(/* array(Google_AboutExportFormats) */ $exportFormats) { - $this->assertIsArray($exportFormats, 'Google_AboutExportFormats', __METHOD__); - $this->exportFormats = $exportFormats; - } - public function getExportFormats() { - return $this->exportFormats; - } - public function setFeatures(/* array(Google_AboutFeatures) */ $features) { - $this->assertIsArray($features, 'Google_AboutFeatures', __METHOD__); - $this->features = $features; - } - public function getFeatures() { - return $this->features; - } - public function setImportFormats(/* array(Google_AboutImportFormats) */ $importFormats) { - $this->assertIsArray($importFormats, 'Google_AboutImportFormats', __METHOD__); - $this->importFormats = $importFormats; - } - public function getImportFormats() { - return $this->importFormats; - } - public function setIsCurrentAppInstalled($isCurrentAppInstalled) { - $this->isCurrentAppInstalled = $isCurrentAppInstalled; - } - public function getIsCurrentAppInstalled() { - return $this->isCurrentAppInstalled; - } - public function setKind($kind) { - $this->kind = $kind; - } - public function getKind() { - return $this->kind; - } - public function setLargestChangeId($largestChangeId) { - $this->largestChangeId = $largestChangeId; - } - public function getLargestChangeId() { - return $this->largestChangeId; - } - public function setMaxUploadSizes(/* array(Google_AboutMaxUploadSizes) */ $maxUploadSizes) { - $this->assertIsArray($maxUploadSizes, 'Google_AboutMaxUploadSizes', __METHOD__); - $this->maxUploadSizes = $maxUploadSizes; - } - public function getMaxUploadSizes() { - return $this->maxUploadSizes; - } - public function setName($name) { - $this->name = $name; - } - public function getName() { - return $this->name; - } - public function setPermissionId($permissionId) { - $this->permissionId = $permissionId; - } - public function getPermissionId() { - return $this->permissionId; - } - public function setQuotaBytesTotal($quotaBytesTotal) { - $this->quotaBytesTotal = $quotaBytesTotal; - } - public function getQuotaBytesTotal() { - return $this->quotaBytesTotal; - } - public function setQuotaBytesUsed($quotaBytesUsed) { - $this->quotaBytesUsed = $quotaBytesUsed; - } - public function getQuotaBytesUsed() { - return $this->quotaBytesUsed; - } - public function setQuotaBytesUsedAggregate($quotaBytesUsedAggregate) { - $this->quotaBytesUsedAggregate = $quotaBytesUsedAggregate; - } - public function getQuotaBytesUsedAggregate() { - return $this->quotaBytesUsedAggregate; - } - public function setQuotaBytesUsedInTrash($quotaBytesUsedInTrash) { - $this->quotaBytesUsedInTrash = $quotaBytesUsedInTrash; - } - public function getQuotaBytesUsedInTrash() { - return $this->quotaBytesUsedInTrash; - } - public function setRemainingChangeIds($remainingChangeIds) { - $this->remainingChangeIds = $remainingChangeIds; - } - public function getRemainingChangeIds() { - return $this->remainingChangeIds; - } - public function setRootFolderId($rootFolderId) { - $this->rootFolderId = $rootFolderId; - } - public function getRootFolderId() { - return $this->rootFolderId; - } - public function setSelfLink($selfLink) { - $this->selfLink = $selfLink; - } - public function getSelfLink() { - return $this->selfLink; - } - public function setUser(Google_User $user) { - $this->user = $user; - } - public function getUser() { - return $this->user; - } -} - -class Google_AboutAdditionalRoleInfo extends Google_Model { - protected $__roleSetsType = 'Google_AboutAdditionalRoleInfoRoleSets'; - protected $__roleSetsDataType = 'array'; - public $roleSets; - public $type; - public function setRoleSets(/* array(Google_AboutAdditionalRoleInfoRoleSets) */ $roleSets) { - $this->assertIsArray($roleSets, 'Google_AboutAdditionalRoleInfoRoleSets', __METHOD__); - $this->roleSets = $roleSets; - } - public function getRoleSets() { - return $this->roleSets; - } - public function setType($type) { - $this->type = $type; - } - public function getType() { - return $this->type; - } -} - -class Google_AboutAdditionalRoleInfoRoleSets extends Google_Model { - public $additionalRoles; - public $primaryRole; - public function setAdditionalRoles(/* array(Google_string) */ $additionalRoles) { - $this->assertIsArray($additionalRoles, 'Google_string', __METHOD__); - $this->additionalRoles = $additionalRoles; - } - public function getAdditionalRoles() { - return $this->additionalRoles; - } - public function setPrimaryRole($primaryRole) { - $this->primaryRole = $primaryRole; - } - public function getPrimaryRole() { - return $this->primaryRole; - } -} - -class Google_AboutExportFormats extends Google_Model { - public $source; - public $targets; - public function setSource($source) { - $this->source = $source; - } - public function getSource() { - return $this->source; - } - public function setTargets(/* array(Google_string) */ $targets) { - $this->assertIsArray($targets, 'Google_string', __METHOD__); - $this->targets = $targets; - } - public function getTargets() { - return $this->targets; - } -} - -class Google_AboutFeatures extends Google_Model { - public $featureName; - public $featureRate; - public function setFeatureName($featureName) { - $this->featureName = $featureName; - } - public function getFeatureName() { - return $this->featureName; - } - public function setFeatureRate($featureRate) { - $this->featureRate = $featureRate; - } - public function getFeatureRate() { - return $this->featureRate; - } -} - -class Google_AboutImportFormats extends Google_Model { - public $source; - public $targets; - public function setSource($source) { - $this->source = $source; - } - public function getSource() { - return $this->source; - } - public function setTargets(/* array(Google_string) */ $targets) { - $this->assertIsArray($targets, 'Google_string', __METHOD__); - $this->targets = $targets; - } - public function getTargets() { - return $this->targets; - } -} - -class Google_AboutMaxUploadSizes extends Google_Model { - public $size; - public $type; - public function setSize($size) { - $this->size = $size; - } - public function getSize() { - return $this->size; - } - public function setType($type) { - $this->type = $type; - } - public function getType() { - return $this->type; - } -} - -class Google_App extends Google_Model { - public $authorized; - protected $__iconsType = 'Google_AppIcons'; - protected $__iconsDataType = 'array'; - public $icons; - public $id; - public $installed; - public $kind; - public $name; - public $objectType; - public $primaryFileExtensions; - public $primaryMimeTypes; - public $productUrl; - public $secondaryFileExtensions; - public $secondaryMimeTypes; - public $supportsCreate; - public $supportsImport; - public $useByDefault; - public function setAuthorized($authorized) { - $this->authorized = $authorized; - } - public function getAuthorized() { - return $this->authorized; - } - public function setIcons(/* array(Google_AppIcons) */ $icons) { - $this->assertIsArray($icons, 'Google_AppIcons', __METHOD__); - $this->icons = $icons; - } - public function getIcons() { - return $this->icons; - } - public function setId($id) { - $this->id = $id; - } - public function getId() { - return $this->id; - } - public function setInstalled($installed) { - $this->installed = $installed; - } - public function getInstalled() { - return $this->installed; - } - public function setKind($kind) { - $this->kind = $kind; - } - public function getKind() { - return $this->kind; - } - public function setName($name) { - $this->name = $name; - } - public function getName() { - return $this->name; - } - public function setObjectType($objectType) { - $this->objectType = $objectType; - } - public function getObjectType() { - return $this->objectType; - } - public function setPrimaryFileExtensions(/* array(Google_string) */ $primaryFileExtensions) { - $this->assertIsArray($primaryFileExtensions, 'Google_string', __METHOD__); - $this->primaryFileExtensions = $primaryFileExtensions; - } - public function getPrimaryFileExtensions() { - return $this->primaryFileExtensions; - } - public function setPrimaryMimeTypes(/* array(Google_string) */ $primaryMimeTypes) { - $this->assertIsArray($primaryMimeTypes, 'Google_string', __METHOD__); - $this->primaryMimeTypes = $primaryMimeTypes; - } - public function getPrimaryMimeTypes() { - return $this->primaryMimeTypes; - } - public function setProductUrl($productUrl) { - $this->productUrl = $productUrl; - } - public function getProductUrl() { - return $this->productUrl; - } - public function setSecondaryFileExtensions(/* array(Google_string) */ $secondaryFileExtensions) { - $this->assertIsArray($secondaryFileExtensions, 'Google_string', __METHOD__); - $this->secondaryFileExtensions = $secondaryFileExtensions; - } - public function getSecondaryFileExtensions() { - return $this->secondaryFileExtensions; - } - public function setSecondaryMimeTypes(/* array(Google_string) */ $secondaryMimeTypes) { - $this->assertIsArray($secondaryMimeTypes, 'Google_string', __METHOD__); - $this->secondaryMimeTypes = $secondaryMimeTypes; - } - public function getSecondaryMimeTypes() { - return $this->secondaryMimeTypes; - } - public function setSupportsCreate($supportsCreate) { - $this->supportsCreate = $supportsCreate; - } - public function getSupportsCreate() { - return $this->supportsCreate; - } - public function setSupportsImport($supportsImport) { - $this->supportsImport = $supportsImport; - } - public function getSupportsImport() { - return $this->supportsImport; - } - public function setUseByDefault($useByDefault) { - $this->useByDefault = $useByDefault; - } - public function getUseByDefault() { - return $this->useByDefault; - } -} - -class Google_AppIcons extends Google_Model { - public $category; - public $iconUrl; - public $size; - public function setCategory($category) { - $this->category = $category; - } - public function getCategory() { - return $this->category; - } - public function setIconUrl($iconUrl) { - $this->iconUrl = $iconUrl; - } - public function getIconUrl() { - return $this->iconUrl; - } - public function setSize($size) { - $this->size = $size; - } - public function getSize() { - return $this->size; - } -} - -class Google_AppList extends Google_Model { - public $etag; - protected $__itemsType = 'Google_App'; - protected $__itemsDataType = 'array'; - public $items; - public $kind; - public $selfLink; - public function setEtag($etag) { - $this->etag = $etag; - } - public function getEtag() { - return $this->etag; - } - public function setItems(/* array(Google_App) */ $items) { - $this->assertIsArray($items, 'Google_App', __METHOD__); - $this->items = $items; - } - public function getItems() { - return $this->items; - } - public function setKind($kind) { - $this->kind = $kind; - } - public function getKind() { - return $this->kind; - } - public function setSelfLink($selfLink) { - $this->selfLink = $selfLink; - } - public function getSelfLink() { - return $this->selfLink; - } -} - -class Google_Change extends Google_Model { - public $deleted; - protected $__fileType = 'Google_DriveFile'; - protected $__fileDataType = ''; - public $file; - public $fileId; - public $id; - public $kind; - public $selfLink; - public function setDeleted($deleted) { - $this->deleted = $deleted; - } - public function getDeleted() { - return $this->deleted; - } - public function setFile(Google_DriveFile $file) { - $this->file = $file; - } - public function getFile() { - return $this->file; - } - public function setFileId($fileId) { - $this->fileId = $fileId; - } - public function getFileId() { - return $this->fileId; - } - public function setId($id) { - $this->id = $id; - } - public function getId() { - return $this->id; - } - public function setKind($kind) { - $this->kind = $kind; - } - public function getKind() { - return $this->kind; - } - public function setSelfLink($selfLink) { - $this->selfLink = $selfLink; - } - public function getSelfLink() { - return $this->selfLink; - } -} - -class Google_ChangeList extends Google_Model { - public $etag; - protected $__itemsType = 'Google_Change'; - protected $__itemsDataType = 'array'; - public $items; - public $kind; - public $largestChangeId; - public $nextLink; - public $nextPageToken; - public $selfLink; - public function setEtag($etag) { - $this->etag = $etag; - } - public function getEtag() { - return $this->etag; - } - public function setItems(/* array(Google_Change) */ $items) { - $this->assertIsArray($items, 'Google_Change', __METHOD__); - $this->items = $items; - } - public function getItems() { - return $this->items; - } - public function setKind($kind) { - $this->kind = $kind; - } - public function getKind() { - return $this->kind; - } - public function setLargestChangeId($largestChangeId) { - $this->largestChangeId = $largestChangeId; - } - public function getLargestChangeId() { - return $this->largestChangeId; - } - public function setNextLink($nextLink) { - $this->nextLink = $nextLink; - } - public function getNextLink() { - return $this->nextLink; - } - public function setNextPageToken($nextPageToken) { - $this->nextPageToken = $nextPageToken; - } - public function getNextPageToken() { - return $this->nextPageToken; - } - public function setSelfLink($selfLink) { - $this->selfLink = $selfLink; - } - public function getSelfLink() { - return $this->selfLink; - } -} - -class Google_ChildList extends Google_Model { - public $etag; - protected $__itemsType = 'Google_ChildReference'; - protected $__itemsDataType = 'array'; - public $items; - public $kind; - public $nextLink; - public $nextPageToken; - public $selfLink; - public function setEtag($etag) { - $this->etag = $etag; - } - public function getEtag() { - return $this->etag; - } - public function setItems(/* array(Google_ChildReference) */ $items) { - $this->assertIsArray($items, 'Google_ChildReference', __METHOD__); - $this->items = $items; - } - public function getItems() { - return $this->items; - } - public function setKind($kind) { - $this->kind = $kind; - } - public function getKind() { - return $this->kind; - } - public function setNextLink($nextLink) { - $this->nextLink = $nextLink; - } - public function getNextLink() { - return $this->nextLink; - } - public function setNextPageToken($nextPageToken) { - $this->nextPageToken = $nextPageToken; - } - public function getNextPageToken() { - return $this->nextPageToken; - } - public function setSelfLink($selfLink) { - $this->selfLink = $selfLink; - } - public function getSelfLink() { - return $this->selfLink; - } -} - -class Google_ChildReference extends Google_Model { - public $childLink; - public $id; - public $kind; - public $selfLink; - public function setChildLink($childLink) { - $this->childLink = $childLink; - } - public function getChildLink() { - return $this->childLink; - } - public function setId($id) { - $this->id = $id; - } - public function getId() { - return $this->id; - } - public function setKind($kind) { - $this->kind = $kind; - } - public function getKind() { - return $this->kind; - } - public function setSelfLink($selfLink) { - $this->selfLink = $selfLink; - } - public function getSelfLink() { - return $this->selfLink; - } -} - -class Google_Comment extends Google_Model { - public $anchor; - protected $__authorType = 'Google_User'; - protected $__authorDataType = ''; - public $author; - public $commentId; - public $content; - protected $__contextType = 'Google_CommentContext'; - protected $__contextDataType = ''; - public $context; - public $createdDate; - public $deleted; - public $fileId; - public $fileTitle; - public $htmlContent; - public $kind; - public $modifiedDate; - protected $__repliesType = 'Google_CommentReply'; - protected $__repliesDataType = 'array'; - public $replies; - public $selfLink; - public $status; - public function setAnchor($anchor) { - $this->anchor = $anchor; - } - public function getAnchor() { - return $this->anchor; - } - public function setAuthor(Google_User $author) { - $this->author = $author; - } - public function getAuthor() { - return $this->author; - } - public function setCommentId($commentId) { - $this->commentId = $commentId; - } - public function getCommentId() { - return $this->commentId; - } - public function setContent($content) { - $this->content = $content; - } - public function getContent() { - return $this->content; - } - public function setContext(Google_CommentContext $context) { - $this->context = $context; - } - public function getContext() { - return $this->context; - } - public function setCreatedDate($createdDate) { - $this->createdDate = $createdDate; - } - public function getCreatedDate() { - return $this->createdDate; - } - public function setDeleted($deleted) { - $this->deleted = $deleted; - } - public function getDeleted() { - return $this->deleted; - } - public function setFileId($fileId) { - $this->fileId = $fileId; - } - public function getFileId() { - return $this->fileId; - } - public function setFileTitle($fileTitle) { - $this->fileTitle = $fileTitle; - } - public function getFileTitle() { - return $this->fileTitle; - } - public function setHtmlContent($htmlContent) { - $this->htmlContent = $htmlContent; - } - public function getHtmlContent() { - return $this->htmlContent; - } - public function setKind($kind) { - $this->kind = $kind; - } - public function getKind() { - return $this->kind; - } - public function setModifiedDate($modifiedDate) { - $this->modifiedDate = $modifiedDate; - } - public function getModifiedDate() { - return $this->modifiedDate; - } - public function setReplies(/* array(Google_CommentReply) */ $replies) { - $this->assertIsArray($replies, 'Google_CommentReply', __METHOD__); - $this->replies = $replies; - } - public function getReplies() { - return $this->replies; - } - public function setSelfLink($selfLink) { - $this->selfLink = $selfLink; - } - public function getSelfLink() { - return $this->selfLink; - } - public function setStatus($status) { - $this->status = $status; - } - public function getStatus() { - return $this->status; - } -} - -class Google_CommentContext extends Google_Model { - public $type; - public $value; - public function setType($type) { - $this->type = $type; - } - public function getType() { - return $this->type; - } - public function setValue($value) { - $this->value = $value; - } - public function getValue() { - return $this->value; - } -} - -class Google_CommentList extends Google_Model { - protected $__itemsType = 'Google_Comment'; - protected $__itemsDataType = 'array'; - public $items; - public $kind; - public $nextPageToken; - public function setItems(/* array(Google_Comment) */ $items) { - $this->assertIsArray($items, 'Google_Comment', __METHOD__); - $this->items = $items; - } - public function getItems() { - return $this->items; - } - public function setKind($kind) { - $this->kind = $kind; - } - public function getKind() { - return $this->kind; - } - public function setNextPageToken($nextPageToken) { - $this->nextPageToken = $nextPageToken; - } - public function getNextPageToken() { - return $this->nextPageToken; - } -} - -class Google_CommentReply extends Google_Model { - protected $__authorType = 'Google_User'; - protected $__authorDataType = ''; - public $author; - public $content; - public $createdDate; - public $deleted; - public $htmlContent; - public $kind; - public $modifiedDate; - public $replyId; - public $verb; - public function setAuthor(Google_User $author) { - $this->author = $author; - } - public function getAuthor() { - return $this->author; - } - public function setContent($content) { - $this->content = $content; - } - public function getContent() { - return $this->content; - } - public function setCreatedDate($createdDate) { - $this->createdDate = $createdDate; - } - public function getCreatedDate() { - return $this->createdDate; - } - public function setDeleted($deleted) { - $this->deleted = $deleted; - } - public function getDeleted() { - return $this->deleted; - } - public function setHtmlContent($htmlContent) { - $this->htmlContent = $htmlContent; - } - public function getHtmlContent() { - return $this->htmlContent; - } - public function setKind($kind) { - $this->kind = $kind; - } - public function getKind() { - return $this->kind; - } - public function setModifiedDate($modifiedDate) { - $this->modifiedDate = $modifiedDate; - } - public function getModifiedDate() { - return $this->modifiedDate; - } - public function setReplyId($replyId) { - $this->replyId = $replyId; - } - public function getReplyId() { - return $this->replyId; - } - public function setVerb($verb) { - $this->verb = $verb; - } - public function getVerb() { - return $this->verb; - } -} - -class Google_CommentReplyList extends Google_Model { - protected $__itemsType = 'Google_CommentReply'; - protected $__itemsDataType = 'array'; - public $items; - public $kind; - public $nextPageToken; - public function setItems(/* array(Google_CommentReply) */ $items) { - $this->assertIsArray($items, 'Google_CommentReply', __METHOD__); - $this->items = $items; - } - public function getItems() { - return $this->items; - } - public function setKind($kind) { - $this->kind = $kind; - } - public function getKind() { - return $this->kind; - } - public function setNextPageToken($nextPageToken) { - $this->nextPageToken = $nextPageToken; - } - public function getNextPageToken() { - return $this->nextPageToken; - } -} - -class Google_DriveFile extends Google_Model { - public $alternateLink; - public $appDataContents; - public $createdDate; - public $description; - public $downloadUrl; - public $editable; - public $embedLink; - public $etag; - public $explicitlyTrashed; - public $exportLinks; - public $fileExtension; - public $fileSize; - public $iconLink; - public $id; - protected $__imageMediaMetadataType = 'Google_DriveFileImageMediaMetadata'; - protected $__imageMediaMetadataDataType = ''; - public $imageMediaMetadata; - protected $__indexableTextType = 'Google_DriveFileIndexableText'; - protected $__indexableTextDataType = ''; - public $indexableText; - public $kind; - protected $__labelsType = 'Google_DriveFileLabels'; - protected $__labelsDataType = ''; - public $labels; - protected $__lastModifyingUserType = 'Google_User'; - protected $__lastModifyingUserDataType = ''; - public $lastModifyingUser; - public $lastModifyingUserName; - public $lastViewedByMeDate; - public $md5Checksum; - public $mimeType; - public $modifiedByMeDate; - public $modifiedDate; - public $originalFilename; - public $ownerNames; - protected $__ownersType = 'Google_User'; - protected $__ownersDataType = 'array'; - public $owners; - protected $__parentsType = 'Google_ParentReference'; - protected $__parentsDataType = 'array'; - public $parents; - public $quotaBytesUsed; - public $selfLink; - public $shared; - public $sharedWithMeDate; - protected $__thumbnailType = 'Google_DriveFileThumbnail'; - protected $__thumbnailDataType = ''; - public $thumbnail; - public $thumbnailLink; - public $title; - protected $__userPermissionType = 'Google_Permission'; - protected $__userPermissionDataType = ''; - public $userPermission; - public $webContentLink; - public $webViewLink; - public $writersCanShare; - public function setAlternateLink($alternateLink) { - $this->alternateLink = $alternateLink; - } - public function getAlternateLink() { - return $this->alternateLink; - } - public function setAppDataContents($appDataContents) { - $this->appDataContents = $appDataContents; - } - public function getAppDataContents() { - return $this->appDataContents; - } - public function setCreatedDate($createdDate) { - $this->createdDate = $createdDate; - } - public function getCreatedDate() { - return $this->createdDate; - } - public function setDescription($description) { - $this->description = $description; - } - public function getDescription() { - return $this->description; - } - public function setDownloadUrl($downloadUrl) { - $this->downloadUrl = $downloadUrl; - } - public function getDownloadUrl() { - return $this->downloadUrl; - } - public function setEditable($editable) { - $this->editable = $editable; - } - public function getEditable() { - return $this->editable; - } - public function setEmbedLink($embedLink) { - $this->embedLink = $embedLink; - } - public function getEmbedLink() { - return $this->embedLink; - } - public function setEtag($etag) { - $this->etag = $etag; - } - public function getEtag() { - return $this->etag; - } - public function setExplicitlyTrashed($explicitlyTrashed) { - $this->explicitlyTrashed = $explicitlyTrashed; - } - public function getExplicitlyTrashed() { - return $this->explicitlyTrashed; - } - public function setExportLinks($exportLinks) { - $this->exportLinks = $exportLinks; - } - public function getExportLinks() { - return $this->exportLinks; - } - public function setFileExtension($fileExtension) { - $this->fileExtension = $fileExtension; - } - public function getFileExtension() { - return $this->fileExtension; - } - public function setFileSize($fileSize) { - $this->fileSize = $fileSize; - } - public function getFileSize() { - return $this->fileSize; - } - public function setIconLink($iconLink) { - $this->iconLink = $iconLink; - } - public function getIconLink() { - return $this->iconLink; - } - public function setId($id) { - $this->id = $id; - } - public function getId() { - return $this->id; - } - public function setImageMediaMetadata(Google_DriveFileImageMediaMetadata $imageMediaMetadata) { - $this->imageMediaMetadata = $imageMediaMetadata; - } - public function getImageMediaMetadata() { - return $this->imageMediaMetadata; - } - public function setIndexableText(Google_DriveFileIndexableText $indexableText) { - $this->indexableText = $indexableText; - } - public function getIndexableText() { - return $this->indexableText; - } - public function setKind($kind) { - $this->kind = $kind; - } - public function getKind() { - return $this->kind; - } - public function setLabels(Google_DriveFileLabels $labels) { - $this->labels = $labels; - } - public function getLabels() { - return $this->labels; - } - public function setLastModifyingUser(Google_User $lastModifyingUser) { - $this->lastModifyingUser = $lastModifyingUser; - } - public function getLastModifyingUser() { - return $this->lastModifyingUser; - } - public function setLastModifyingUserName($lastModifyingUserName) { - $this->lastModifyingUserName = $lastModifyingUserName; - } - public function getLastModifyingUserName() { - return $this->lastModifyingUserName; - } - public function setLastViewedByMeDate($lastViewedByMeDate) { - $this->lastViewedByMeDate = $lastViewedByMeDate; - } - public function getLastViewedByMeDate() { - return $this->lastViewedByMeDate; - } - public function setMd5Checksum($md5Checksum) { - $this->md5Checksum = $md5Checksum; - } - public function getMd5Checksum() { - return $this->md5Checksum; - } - public function setMimeType($mimeType) { - $this->mimeType = $mimeType; - } - public function getMimeType() { - return $this->mimeType; - } - public function setModifiedByMeDate($modifiedByMeDate) { - $this->modifiedByMeDate = $modifiedByMeDate; - } - public function getModifiedByMeDate() { - return $this->modifiedByMeDate; - } - public function setModifiedDate($modifiedDate) { - $this->modifiedDate = $modifiedDate; - } - public function getModifiedDate() { - return $this->modifiedDate; - } - public function setOriginalFilename($originalFilename) { - $this->originalFilename = $originalFilename; - } - public function getOriginalFilename() { - return $this->originalFilename; - } - public function setOwnerNames(/* array(Google_string) */ $ownerNames) { - $this->assertIsArray($ownerNames, 'Google_string', __METHOD__); - $this->ownerNames = $ownerNames; - } - public function getOwnerNames() { - return $this->ownerNames; - } - public function setOwners(/* array(Google_User) */ $owners) { - $this->assertIsArray($owners, 'Google_User', __METHOD__); - $this->owners = $owners; - } - public function getOwners() { - return $this->owners; - } - public function setParents(/* array(Google_ParentReference) */ $parents) { - $this->assertIsArray($parents, 'Google_ParentReference', __METHOD__); - $this->parents = $parents; - } - public function getParents() { - return $this->parents; - } - public function setQuotaBytesUsed($quotaBytesUsed) { - $this->quotaBytesUsed = $quotaBytesUsed; - } - public function getQuotaBytesUsed() { - return $this->quotaBytesUsed; - } - public function setSelfLink($selfLink) { - $this->selfLink = $selfLink; - } - public function getSelfLink() { - return $this->selfLink; - } - public function setShared($shared) { - $this->shared = $shared; - } - public function getShared() { - return $this->shared; - } - public function setSharedWithMeDate($sharedWithMeDate) { - $this->sharedWithMeDate = $sharedWithMeDate; - } - public function getSharedWithMeDate() { - return $this->sharedWithMeDate; - } - public function setThumbnail(Google_DriveFileThumbnail $thumbnail) { - $this->thumbnail = $thumbnail; - } - public function getThumbnail() { - return $this->thumbnail; - } - public function setThumbnailLink($thumbnailLink) { - $this->thumbnailLink = $thumbnailLink; - } - public function getThumbnailLink() { - return $this->thumbnailLink; - } - public function setTitle($title) { - $this->title = $title; - } - public function getTitle() { - return $this->title; - } - public function setUserPermission(Google_Permission $userPermission) { - $this->userPermission = $userPermission; - } - public function getUserPermission() { - return $this->userPermission; - } - public function setWebContentLink($webContentLink) { - $this->webContentLink = $webContentLink; - } - public function getWebContentLink() { - return $this->webContentLink; - } - public function setWebViewLink($webViewLink) { - $this->webViewLink = $webViewLink; - } - public function getWebViewLink() { - return $this->webViewLink; - } - public function setWritersCanShare($writersCanShare) { - $this->writersCanShare = $writersCanShare; - } - public function getWritersCanShare() { - return $this->writersCanShare; - } -} - -class Google_DriveFileImageMediaMetadata extends Google_Model { - public $aperture; - public $cameraMake; - public $cameraModel; - public $colorSpace; - public $date; - public $exposureBias; - public $exposureMode; - public $exposureTime; - public $flashUsed; - public $focalLength; - public $height; - public $isoSpeed; - public $lens; - protected $__locationType = 'Google_DriveFileImageMediaMetadataLocation'; - protected $__locationDataType = ''; - public $location; - public $maxApertureValue; - public $meteringMode; - public $rotation; - public $sensor; - public $subjectDistance; - public $whiteBalance; - public $width; - public function setAperture($aperture) { - $this->aperture = $aperture; - } - public function getAperture() { - return $this->aperture; - } - public function setCameraMake($cameraMake) { - $this->cameraMake = $cameraMake; - } - public function getCameraMake() { - return $this->cameraMake; - } - public function setCameraModel($cameraModel) { - $this->cameraModel = $cameraModel; - } - public function getCameraModel() { - return $this->cameraModel; - } - public function setColorSpace($colorSpace) { - $this->colorSpace = $colorSpace; - } - public function getColorSpace() { - return $this->colorSpace; - } - public function setDate($date) { - $this->date = $date; - } - public function getDate() { - return $this->date; - } - public function setExposureBias($exposureBias) { - $this->exposureBias = $exposureBias; - } - public function getExposureBias() { - return $this->exposureBias; - } - public function setExposureMode($exposureMode) { - $this->exposureMode = $exposureMode; - } - public function getExposureMode() { - return $this->exposureMode; - } - public function setExposureTime($exposureTime) { - $this->exposureTime = $exposureTime; - } - public function getExposureTime() { - return $this->exposureTime; - } - public function setFlashUsed($flashUsed) { - $this->flashUsed = $flashUsed; - } - public function getFlashUsed() { - return $this->flashUsed; - } - public function setFocalLength($focalLength) { - $this->focalLength = $focalLength; - } - public function getFocalLength() { - return $this->focalLength; - } - public function setHeight($height) { - $this->height = $height; - } - public function getHeight() { - return $this->height; - } - public function setIsoSpeed($isoSpeed) { - $this->isoSpeed = $isoSpeed; - } - public function getIsoSpeed() { - return $this->isoSpeed; - } - public function setLens($lens) { - $this->lens = $lens; - } - public function getLens() { - return $this->lens; - } - public function setLocation(Google_DriveFileImageMediaMetadataLocation $location) { - $this->location = $location; - } - public function getLocation() { - return $this->location; - } - public function setMaxApertureValue($maxApertureValue) { - $this->maxApertureValue = $maxApertureValue; - } - public function getMaxApertureValue() { - return $this->maxApertureValue; - } - public function setMeteringMode($meteringMode) { - $this->meteringMode = $meteringMode; - } - public function getMeteringMode() { - return $this->meteringMode; - } - public function setRotation($rotation) { - $this->rotation = $rotation; - } - public function getRotation() { - return $this->rotation; - } - public function setSensor($sensor) { - $this->sensor = $sensor; - } - public function getSensor() { - return $this->sensor; - } - public function setSubjectDistance($subjectDistance) { - $this->subjectDistance = $subjectDistance; - } - public function getSubjectDistance() { - return $this->subjectDistance; - } - public function setWhiteBalance($whiteBalance) { - $this->whiteBalance = $whiteBalance; - } - public function getWhiteBalance() { - return $this->whiteBalance; - } - public function setWidth($width) { - $this->width = $width; - } - public function getWidth() { - return $this->width; - } -} - -class Google_DriveFileImageMediaMetadataLocation extends Google_Model { - public $altitude; - public $latitude; - public $longitude; - public function setAltitude($altitude) { - $this->altitude = $altitude; - } - public function getAltitude() { - return $this->altitude; - } - public function setLatitude($latitude) { - $this->latitude = $latitude; - } - public function getLatitude() { - return $this->latitude; - } - public function setLongitude($longitude) { - $this->longitude = $longitude; - } - public function getLongitude() { - return $this->longitude; - } -} - -class Google_DriveFileIndexableText extends Google_Model { - public $text; - public function setText($text) { - $this->text = $text; - } - public function getText() { - return $this->text; - } -} - -class Google_DriveFileLabels extends Google_Model { - public $hidden; - public $restricted; - public $starred; - public $trashed; - public $viewed; - public function setHidden($hidden) { - $this->hidden = $hidden; - } - public function getHidden() { - return $this->hidden; - } - public function setRestricted($restricted) { - $this->restricted = $restricted; - } - public function getRestricted() { - return $this->restricted; - } - public function setStarred($starred) { - $this->starred = $starred; - } - public function getStarred() { - return $this->starred; - } - public function setTrashed($trashed) { - $this->trashed = $trashed; - } - public function getTrashed() { - return $this->trashed; - } - public function setViewed($viewed) { - $this->viewed = $viewed; - } - public function getViewed() { - return $this->viewed; - } -} - -class Google_DriveFileThumbnail extends Google_Model { - public $image; - public $mimeType; - public function setImage($image) { - $this->image = $image; - } - public function getImage() { - return $this->image; - } - public function setMimeType($mimeType) { - $this->mimeType = $mimeType; - } - public function getMimeType() { - return $this->mimeType; - } -} - -class Google_FileList extends Google_Model { - public $etag; - protected $__itemsType = 'Google_DriveFile'; - protected $__itemsDataType = 'array'; - public $items; - public $kind; - public $nextLink; - public $nextPageToken; - public $selfLink; - public function setEtag($etag) { - $this->etag = $etag; - } - public function getEtag() { - return $this->etag; - } - public function setItems(/* array(Google_DriveFile) */ $items) { - $this->assertIsArray($items, 'Google_DriveFile', __METHOD__); - $this->items = $items; - } - public function getItems() { - return $this->items; - } - public function setKind($kind) { - $this->kind = $kind; - } - public function getKind() { - return $this->kind; - } - public function setNextLink($nextLink) { - $this->nextLink = $nextLink; - } - public function getNextLink() { - return $this->nextLink; - } - public function setNextPageToken($nextPageToken) { - $this->nextPageToken = $nextPageToken; - } - public function getNextPageToken() { - return $this->nextPageToken; - } - public function setSelfLink($selfLink) { - $this->selfLink = $selfLink; - } - public function getSelfLink() { - return $this->selfLink; - } -} - -class Google_ParentList extends Google_Model { - public $etag; - protected $__itemsType = 'Google_ParentReference'; - protected $__itemsDataType = 'array'; - public $items; - public $kind; - public $selfLink; - public function setEtag($etag) { - $this->etag = $etag; - } - public function getEtag() { - return $this->etag; - } - public function setItems(/* array(Google_ParentReference) */ $items) { - $this->assertIsArray($items, 'Google_ParentReference', __METHOD__); - $this->items = $items; - } - public function getItems() { - return $this->items; - } - public function setKind($kind) { - $this->kind = $kind; - } - public function getKind() { - return $this->kind; - } - public function setSelfLink($selfLink) { - $this->selfLink = $selfLink; - } - public function getSelfLink() { - return $this->selfLink; - } -} - -class Google_ParentReference extends Google_Model { - public $id; - public $isRoot; - public $kind; - public $parentLink; - public $selfLink; - public function setId($id) { - $this->id = $id; - } - public function getId() { - return $this->id; - } - public function setIsRoot($isRoot) { - $this->isRoot = $isRoot; - } - public function getIsRoot() { - return $this->isRoot; - } - public function setKind($kind) { - $this->kind = $kind; - } - public function getKind() { - return $this->kind; - } - public function setParentLink($parentLink) { - $this->parentLink = $parentLink; - } - public function getParentLink() { - return $this->parentLink; - } - public function setSelfLink($selfLink) { - $this->selfLink = $selfLink; - } - public function getSelfLink() { - return $this->selfLink; - } -} - -class Google_Permission extends Google_Model { - public $additionalRoles; - public $authKey; - public $etag; - public $id; - public $kind; - public $name; - public $photoLink; - public $role; - public $selfLink; - public $type; - public $value; - public $withLink; - public function setAdditionalRoles(/* array(Google_string) */ $additionalRoles) { - $this->assertIsArray($additionalRoles, 'Google_string', __METHOD__); - $this->additionalRoles = $additionalRoles; - } - public function getAdditionalRoles() { - return $this->additionalRoles; - } - public function setAuthKey($authKey) { - $this->authKey = $authKey; - } - public function getAuthKey() { - return $this->authKey; - } - public function setEtag($etag) { - $this->etag = $etag; - } - public function getEtag() { - return $this->etag; - } - public function setId($id) { - $this->id = $id; - } - public function getId() { - return $this->id; - } - public function setKind($kind) { - $this->kind = $kind; - } - public function getKind() { - return $this->kind; - } - public function setName($name) { - $this->name = $name; - } - public function getName() { - return $this->name; - } - public function setPhotoLink($photoLink) { - $this->photoLink = $photoLink; - } - public function getPhotoLink() { - return $this->photoLink; - } - public function setRole($role) { - $this->role = $role; - } - public function getRole() { - return $this->role; - } - public function setSelfLink($selfLink) { - $this->selfLink = $selfLink; - } - public function getSelfLink() { - return $this->selfLink; - } - public function setType($type) { - $this->type = $type; - } - public function getType() { - return $this->type; - } - public function setValue($value) { - $this->value = $value; - } - public function getValue() { - return $this->value; - } - public function setWithLink($withLink) { - $this->withLink = $withLink; - } - public function getWithLink() { - return $this->withLink; - } -} - -class Google_PermissionList extends Google_Model { - public $etag; - protected $__itemsType = 'Google_Permission'; - protected $__itemsDataType = 'array'; - public $items; - public $kind; - public $selfLink; - public function setEtag($etag) { - $this->etag = $etag; - } - public function getEtag() { - return $this->etag; - } - public function setItems(/* array(Google_Permission) */ $items) { - $this->assertIsArray($items, 'Google_Permission', __METHOD__); - $this->items = $items; - } - public function getItems() { - return $this->items; - } - public function setKind($kind) { - $this->kind = $kind; - } - public function getKind() { - return $this->kind; - } - public function setSelfLink($selfLink) { - $this->selfLink = $selfLink; - } - public function getSelfLink() { - return $this->selfLink; - } -} - -class Google_Property extends Google_Model { - public $etag; - public $key; - public $kind; - public $selfLink; - public $value; - public $visibility; - public function setEtag($etag) { - $this->etag = $etag; - } - public function getEtag() { - return $this->etag; - } - public function setKey($key) { - $this->key = $key; - } - public function getKey() { - return $this->key; - } - public function setKind($kind) { - $this->kind = $kind; - } - public function getKind() { - return $this->kind; - } - public function setSelfLink($selfLink) { - $this->selfLink = $selfLink; - } - public function getSelfLink() { - return $this->selfLink; - } - public function setValue($value) { - $this->value = $value; - } - public function getValue() { - return $this->value; - } - public function setVisibility($visibility) { - $this->visibility = $visibility; - } - public function getVisibility() { - return $this->visibility; - } -} - -class Google_PropertyList extends Google_Model { - public $etag; - protected $__itemsType = 'Google_Property'; - protected $__itemsDataType = 'array'; - public $items; - public $kind; - public $selfLink; - public function setEtag($etag) { - $this->etag = $etag; - } - public function getEtag() { - return $this->etag; - } - public function setItems(/* array(Google_Property) */ $items) { - $this->assertIsArray($items, 'Google_Property', __METHOD__); - $this->items = $items; - } - public function getItems() { - return $this->items; - } - public function setKind($kind) { - $this->kind = $kind; - } - public function getKind() { - return $this->kind; - } - public function setSelfLink($selfLink) { - $this->selfLink = $selfLink; - } - public function getSelfLink() { - return $this->selfLink; - } -} - -class Google_Revision extends Google_Model { - public $downloadUrl; - public $etag; - public $exportLinks; - public $fileSize; - public $id; - public $kind; - protected $__lastModifyingUserType = 'Google_User'; - protected $__lastModifyingUserDataType = ''; - public $lastModifyingUser; - public $lastModifyingUserName; - public $md5Checksum; - public $mimeType; - public $modifiedDate; - public $originalFilename; - public $pinned; - public $publishAuto; - public $published; - public $publishedLink; - public $publishedOutsideDomain; - public $selfLink; - public function setDownloadUrl($downloadUrl) { - $this->downloadUrl = $downloadUrl; - } - public function getDownloadUrl() { - return $this->downloadUrl; - } - public function setEtag($etag) { - $this->etag = $etag; - } - public function getEtag() { - return $this->etag; - } - public function setExportLinks($exportLinks) { - $this->exportLinks = $exportLinks; - } - public function getExportLinks() { - return $this->exportLinks; - } - public function setFileSize($fileSize) { - $this->fileSize = $fileSize; - } - public function getFileSize() { - return $this->fileSize; - } - public function setId($id) { - $this->id = $id; - } - public function getId() { - return $this->id; - } - public function setKind($kind) { - $this->kind = $kind; - } - public function getKind() { - return $this->kind; - } - public function setLastModifyingUser(Google_User $lastModifyingUser) { - $this->lastModifyingUser = $lastModifyingUser; - } - public function getLastModifyingUser() { - return $this->lastModifyingUser; - } - public function setLastModifyingUserName($lastModifyingUserName) { - $this->lastModifyingUserName = $lastModifyingUserName; - } - public function getLastModifyingUserName() { - return $this->lastModifyingUserName; - } - public function setMd5Checksum($md5Checksum) { - $this->md5Checksum = $md5Checksum; - } - public function getMd5Checksum() { - return $this->md5Checksum; - } - public function setMimeType($mimeType) { - $this->mimeType = $mimeType; - } - public function getMimeType() { - return $this->mimeType; - } - public function setModifiedDate($modifiedDate) { - $this->modifiedDate = $modifiedDate; - } - public function getModifiedDate() { - return $this->modifiedDate; - } - public function setOriginalFilename($originalFilename) { - $this->originalFilename = $originalFilename; - } - public function getOriginalFilename() { - return $this->originalFilename; - } - public function setPinned($pinned) { - $this->pinned = $pinned; - } - public function getPinned() { - return $this->pinned; - } - public function setPublishAuto($publishAuto) { - $this->publishAuto = $publishAuto; - } - public function getPublishAuto() { - return $this->publishAuto; - } - public function setPublished($published) { - $this->published = $published; - } - public function getPublished() { - return $this->published; - } - public function setPublishedLink($publishedLink) { - $this->publishedLink = $publishedLink; - } - public function getPublishedLink() { - return $this->publishedLink; - } - public function setPublishedOutsideDomain($publishedOutsideDomain) { - $this->publishedOutsideDomain = $publishedOutsideDomain; - } - public function getPublishedOutsideDomain() { - return $this->publishedOutsideDomain; - } - public function setSelfLink($selfLink) { - $this->selfLink = $selfLink; - } - public function getSelfLink() { - return $this->selfLink; - } -} - -class Google_RevisionList extends Google_Model { - public $etag; - protected $__itemsType = 'Google_Revision'; - protected $__itemsDataType = 'array'; - public $items; - public $kind; - public $selfLink; - public function setEtag($etag) { - $this->etag = $etag; - } - public function getEtag() { - return $this->etag; - } - public function setItems(/* array(Google_Revision) */ $items) { - $this->assertIsArray($items, 'Google_Revision', __METHOD__); - $this->items = $items; - } - public function getItems() { - return $this->items; - } - public function setKind($kind) { - $this->kind = $kind; - } - public function getKind() { - return $this->kind; - } - public function setSelfLink($selfLink) { - $this->selfLink = $selfLink; - } - public function getSelfLink() { - return $this->selfLink; - } -} - -class Google_User extends Google_Model { - public $displayName; - public $isAuthenticatedUser; - public $kind; - public $permissionId; - protected $__pictureType = 'Google_UserPicture'; - protected $__pictureDataType = ''; - public $picture; - public function setDisplayName($displayName) { - $this->displayName = $displayName; - } - public function getDisplayName() { - return $this->displayName; - } - public function setIsAuthenticatedUser($isAuthenticatedUser) { - $this->isAuthenticatedUser = $isAuthenticatedUser; - } - public function getIsAuthenticatedUser() { - return $this->isAuthenticatedUser; - } - public function setKind($kind) { - $this->kind = $kind; - } - public function getKind() { - return $this->kind; - } - public function setPermissionId($permissionId) { - $this->permissionId = $permissionId; - } - public function getPermissionId() { - return $this->permissionId; - } - public function setPicture(Google_UserPicture $picture) { - $this->picture = $picture; - } - public function getPicture() { - return $this->picture; - } -} - -class Google_UserPicture extends Google_Model { - public $url; - public function setUrl($url) { - $this->url = $url; - } - public function getUrl() { - return $this->url; - } -} diff --git a/apps/files_external/3rdparty/google-api-php-client/src/external/URITemplateParser.php b/apps/files_external/3rdparty/google-api-php-client/src/external/URITemplateParser.php deleted file mode 100644 index 594adbb15e2..00000000000 --- a/apps/files_external/3rdparty/google-api-php-client/src/external/URITemplateParser.php +++ /dev/null @@ -1,209 +0,0 @@ -<?php -/* -Copyright (c) 2010 Kevin M Burns Jr, http://kevburnsjr.com/ - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ - -/** - * A URI Template Parser which is used by the apiREST class to resolve the REST requests - * Blogpost: http://lab.kevburnsjr.com/php-uri-template-parser - * Source: http://github.com/KevBurnsJr/php-uri-template-parser - */ -class URI_Template_Parser { - - public static $operators = array('+', ';', '?', '/', '.'); - public static $reserved_operators = array('|', '!', '@'); - public static $explode_modifiers = array('+', '*'); - public static $partial_modifiers = array(':', '^'); - - public static $gen_delims = array(':', '/', '?', '#', '[', ']', '@'); - public static $gen_delims_pct = array('%3A', '%2F', '%3F', '%23', '%5B', '%5D', '%40'); - public static $sub_delims = array('!', '$', '&', '\'', '(', ')', '*', '+', ',', ';', '='); - public static $sub_delims_pct = array('%21', '%24', '%26', '%27', '%28', '%29', '%2A', '%2B', '%2C', '%3B', '%3D'); - public static $reserved; - public static $reserved_pct; - - public function __construct($template) { - self::$reserved = array_merge(self::$gen_delims, self::$sub_delims); - self::$reserved_pct = array_merge(self::$gen_delims_pct, self::$sub_delims_pct); - $this->template = $template; - } - - public function expand($data) { - // Modification to make this a bit more performant (since gettype is very slow) - if (! is_array($data)) { - $data = (array)$data; - } - /* - // Original code, which uses a slow gettype() statement, kept in place for if the assumption that is_array always works here is incorrect - switch (gettype($data)) { - case "boolean": - case "integer": - case "double": - case "string": - case "object": - $data = (array)$data; - break; - } -*/ - - // Resolve template vars - preg_match_all('/\{([^\}]*)\}/', $this->template, $em); - - foreach ($em[1] as $i => $bare_expression) { - preg_match('/^([\+\;\?\/\.]{1})?(.*)$/', $bare_expression, $lm); - $exp = new StdClass(); - $exp->expression = $em[0][$i]; - $exp->operator = $lm[1]; - $exp->variable_list = $lm[2]; - $exp->varspecs = explode(',', $exp->variable_list); - $exp->vars = array(); - foreach ($exp->varspecs as $varspec) { - preg_match('/^([a-zA-Z0-9_]+)([\*\+]{1})?([\:\^][0-9-]+)?(\=[^,]+)?$/', $varspec, $vm); - $var = new StdClass(); - $var->name = $vm[1]; - $var->modifier = isset($vm[2]) && $vm[2] ? $vm[2] : null; - $var->modifier = isset($vm[3]) && $vm[3] ? $vm[3] : $var->modifier; - $var->default = isset($vm[4]) ? substr($vm[4], 1) : null; - $exp->vars[] = $var; - } - - // Add processing flags - $exp->reserved = false; - $exp->prefix = ''; - $exp->delimiter = ','; - switch ($exp->operator) { - case '+': - $exp->reserved = 'true'; - break; - case ';': - $exp->prefix = ';'; - $exp->delimiter = ';'; - break; - case '?': - $exp->prefix = '?'; - $exp->delimiter = '&'; - break; - case '/': - $exp->prefix = '/'; - $exp->delimiter = '/'; - break; - case '.': - $exp->prefix = '.'; - $exp->delimiter = '.'; - break; - } - $expressions[] = $exp; - } - - // Expansion - $this->expansion = $this->template; - - foreach ($expressions as $exp) { - $part = $exp->prefix; - $exp->one_var_defined = false; - foreach ($exp->vars as $var) { - $val = ''; - if ($exp->one_var_defined && isset($data[$var->name])) { - $part .= $exp->delimiter; - } - // Variable present - if (isset($data[$var->name])) { - $exp->one_var_defined = true; - $var->data = $data[$var->name]; - - $val = self::val_from_var($var, $exp); - - // Variable missing - } else { - if ($var->default) { - $exp->one_var_defined = true; - $val = $var->default; - } - } - $part .= $val; - } - if (! $exp->one_var_defined) $part = ''; - $this->expansion = str_replace($exp->expression, $part, $this->expansion); - } - - return $this->expansion; - } - - private function val_from_var($var, $exp) { - $val = ''; - if (is_array($var->data)) { - $i = 0; - if ($exp->operator == '?' && ! $var->modifier) { - $val .= $var->name . '='; - } - foreach ($var->data as $k => $v) { - $del = $var->modifier ? $exp->delimiter : ','; - $ek = rawurlencode($k); - $ev = rawurlencode($v); - - // Array - if ($k !== $i) { - if ($var->modifier == '+') { - $val .= $var->name . '.'; - } - if ($exp->operator == '?' && $var->modifier || $exp->operator == ';' && $var->modifier == '*' || $exp->operator == ';' && $var->modifier == '+') { - $val .= $ek . '='; - } else { - $val .= $ek . $del; - } - - // List - } else { - if ($var->modifier == '+') { - if ($exp->operator == ';' && $var->modifier == '*' || $exp->operator == ';' && $var->modifier == '+' || $exp->operator == '?' && $var->modifier == '+') { - $val .= $var->name . '='; - } else { - $val .= $var->name . '.'; - } - } - } - $val .= $ev . $del; - $i ++; - } - $val = trim($val, $del); - - // Strings, numbers, etc. - } else { - if ($exp->operator == '?') { - $val = $var->name . (isset($var->data) ? '=' : ''); - } else if ($exp->operator == ';') { - $val = $var->name . ($var->data ? '=' : ''); - } - $val .= rawurlencode($var->data); - if ($exp->operator == '+') { - $val = str_replace(self::$reserved_pct, self::$reserved, $val); - } - } - return $val; - } - - public function match($uri) {} - - public function __toString() { - return $this->template; - } -} diff --git a/apps/files_external/3rdparty/google-api-php-client/src/io/Google_CurlIO.php b/apps/files_external/3rdparty/google-api-php-client/src/io/Google_CurlIO.php deleted file mode 100644 index 65352f29882..00000000000 --- a/apps/files_external/3rdparty/google-api-php-client/src/io/Google_CurlIO.php +++ /dev/null @@ -1,278 +0,0 @@ -<?php -/* - * Copyright 2010 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * Curl based implementation of apiIO. - * - * @author Chris Chabot <chabotc@google.com> - * @author Chirag Shah <chirags@google.com> - */ - -require_once 'Google_CacheParser.php'; - -class Google_CurlIO implements Google_IO { - const CONNECTION_ESTABLISHED = "HTTP/1.0 200 Connection established\r\n\r\n"; - const FORM_URLENCODED = 'application/x-www-form-urlencoded'; - - private static $ENTITY_HTTP_METHODS = array("POST" => null, "PUT" => null); - private static $HOP_BY_HOP = array( - 'connection', 'keep-alive', 'proxy-authenticate', 'proxy-authorization', - 'te', 'trailers', 'transfer-encoding', 'upgrade'); - - private $curlParams = array ( - CURLOPT_RETURNTRANSFER => true, - CURLOPT_FOLLOWLOCATION => 0, - CURLOPT_FAILONERROR => false, - CURLOPT_SSL_VERIFYPEER => true, - CURLOPT_HEADER => true, - CURLOPT_VERBOSE => false, - ); - - /** - * Perform an authenticated / signed apiHttpRequest. - * This function takes the apiHttpRequest, calls apiAuth->sign on it - * (which can modify the request in what ever way fits the auth mechanism) - * and then calls apiCurlIO::makeRequest on the signed request - * - * @param Google_HttpRequest $request - * @return Google_HttpRequest The resulting HTTP response including the - * responseHttpCode, responseHeaders and responseBody. - */ - public function authenticatedRequest(Google_HttpRequest $request) { - $request = Google_Client::$auth->sign($request); - return $this->makeRequest($request); - } - - /** - * Execute a apiHttpRequest - * - * @param Google_HttpRequest $request the http request to be executed - * @return Google_HttpRequest http request with the response http code, response - * headers and response body filled in - * @throws Google_IOException on curl or IO error - */ - public function makeRequest(Google_HttpRequest $request) { - // First, check to see if we have a valid cached version. - $cached = $this->getCachedRequest($request); - if ($cached !== false) { - if (Google_CacheParser::mustRevalidate($cached)) { - $addHeaders = array(); - if ($cached->getResponseHeader('etag')) { - // [13.3.4] If an entity tag has been provided by the origin server, - // we must use that entity tag in any cache-conditional request. - $addHeaders['If-None-Match'] = $cached->getResponseHeader('etag'); - } elseif ($cached->getResponseHeader('date')) { - $addHeaders['If-Modified-Since'] = $cached->getResponseHeader('date'); - } - - $request->setRequestHeaders($addHeaders); - } else { - // No need to revalidate the request, return it directly - return $cached; - } - } - - if (array_key_exists($request->getRequestMethod(), - self::$ENTITY_HTTP_METHODS)) { - $request = $this->processEntityRequest($request); - } - - $ch = curl_init(); - curl_setopt_array($ch, $this->curlParams); - curl_setopt($ch, CURLOPT_URL, $request->getUrl()); - if ($request->getPostBody()) { - curl_setopt($ch, CURLOPT_POSTFIELDS, $request->getPostBody()); - } - - $requestHeaders = $request->getRequestHeaders(); - if ($requestHeaders && is_array($requestHeaders)) { - $parsed = array(); - foreach ($requestHeaders as $k => $v) { - $parsed[] = "$k: $v"; - } - curl_setopt($ch, CURLOPT_HTTPHEADER, $parsed); - } - - curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $request->getRequestMethod()); - curl_setopt($ch, CURLOPT_USERAGENT, $request->getUserAgent()); - $respData = curl_exec($ch); - - // Retry if certificates are missing. - if (curl_errno($ch) == CURLE_SSL_CACERT) { - error_log('SSL certificate problem, verify that the CA cert is OK.' - . ' Retrying with the CA cert bundle from google-api-php-client.'); - curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__) . '/cacerts.pem'); - $respData = curl_exec($ch); - } - - $respHeaderSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE); - $respHttpCode = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE); - $curlErrorNum = curl_errno($ch); - $curlError = curl_error($ch); - curl_close($ch); - if ($curlErrorNum != CURLE_OK) { - throw new Google_IOException("HTTP Error: ($respHttpCode) $curlError"); - } - - // Parse out the raw response into usable bits - list($responseHeaders, $responseBody) = - self::parseHttpResponse($respData, $respHeaderSize); - - if ($respHttpCode == 304 && $cached) { - // If the server responded NOT_MODIFIED, return the cached request. - if (isset($responseHeaders['connection'])) { - $hopByHop = array_merge( - self::$HOP_BY_HOP, - explode(',', $responseHeaders['connection']) - ); - - $endToEnd = array(); - foreach($hopByHop as $key) { - if (isset($responseHeaders[$key])) { - $endToEnd[$key] = $responseHeaders[$key]; - } - } - $cached->setResponseHeaders($endToEnd); - } - return $cached; - } - - // Fill in the apiHttpRequest with the response values - $request->setResponseHttpCode($respHttpCode); - $request->setResponseHeaders($responseHeaders); - $request->setResponseBody($responseBody); - // Store the request in cache (the function checks to see if the request - // can actually be cached) - $this->setCachedRequest($request); - // And finally return it - return $request; - } - - /** - * @visible for testing. - * Cache the response to an HTTP request if it is cacheable. - * @param Google_HttpRequest $request - * @return bool Returns true if the insertion was successful. - * Otherwise, return false. - */ - public function setCachedRequest(Google_HttpRequest $request) { - // Determine if the request is cacheable. - if (Google_CacheParser::isResponseCacheable($request)) { - Google_Client::$cache->set($request->getCacheKey(), $request); - return true; - } - - return false; - } - - /** - * @visible for testing. - * @param Google_HttpRequest $request - * @return Google_HttpRequest|bool Returns the cached object or - * false if the operation was unsuccessful. - */ - public function getCachedRequest(Google_HttpRequest $request) { - if (false == Google_CacheParser::isRequestCacheable($request)) { - false; - } - - return Google_Client::$cache->get($request->getCacheKey()); - } - - /** - * @param $respData - * @param $headerSize - * @return array - */ - public static function parseHttpResponse($respData, $headerSize) { - if (stripos($respData, self::CONNECTION_ESTABLISHED) !== false) { - $respData = str_ireplace(self::CONNECTION_ESTABLISHED, '', $respData); - } - - if ($headerSize) { - $responseBody = substr($respData, $headerSize); - $responseHeaders = substr($respData, 0, $headerSize); - } else { - list($responseHeaders, $responseBody) = explode("\r\n\r\n", $respData, 2); - } - - $responseHeaders = self::parseResponseHeaders($responseHeaders); - return array($responseHeaders, $responseBody); - } - - public static function parseResponseHeaders($rawHeaders) { - $responseHeaders = array(); - - $responseHeaderLines = explode("\r\n", $rawHeaders); - foreach ($responseHeaderLines as $headerLine) { - if ($headerLine && strpos($headerLine, ':') !== false) { - list($header, $value) = explode(': ', $headerLine, 2); - $header = strtolower($header); - if (isset($responseHeaders[$header])) { - $responseHeaders[$header] .= "\n" . $value; - } else { - $responseHeaders[$header] = $value; - } - } - } - return $responseHeaders; - } - - /** - * @visible for testing - * Process an http request that contains an enclosed entity. - * @param Google_HttpRequest $request - * @return Google_HttpRequest Processed request with the enclosed entity. - */ - public function processEntityRequest(Google_HttpRequest $request) { - $postBody = $request->getPostBody(); - $contentType = $request->getRequestHeader("content-type"); - - // Set the default content-type as application/x-www-form-urlencoded. - if (false == $contentType) { - $contentType = self::FORM_URLENCODED; - $request->setRequestHeaders(array('content-type' => $contentType)); - } - - // Force the payload to match the content-type asserted in the header. - if ($contentType == self::FORM_URLENCODED && is_array($postBody)) { - $postBody = http_build_query($postBody, '', '&'); - $request->setPostBody($postBody); - } - - // Make sure the content-length header is set. - if (!$postBody || is_string($postBody)) { - $postsLength = strlen($postBody); - $request->setRequestHeaders(array('content-length' => $postsLength)); - } - - return $request; - } - - /** - * Set options that update cURL's default behavior. - * The list of accepted options are: - * {@link http://php.net/manual/en/function.curl-setopt.php] - * - * @param array $optCurlParams Multiple options used by a cURL session. - */ - public function setOptions($optCurlParams) { - foreach ($optCurlParams as $key => $val) { - $this->curlParams[$key] = $val; - } - } -}
\ No newline at end of file diff --git a/apps/files_external/3rdparty/google-api-php-client/src/io/Google_HttpRequest.php b/apps/files_external/3rdparty/google-api-php-client/src/io/Google_HttpRequest.php deleted file mode 100644 index b98eae54008..00000000000 --- a/apps/files_external/3rdparty/google-api-php-client/src/io/Google_HttpRequest.php +++ /dev/null @@ -1,304 +0,0 @@ -<?php -/* - * Copyright 2010 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * HTTP Request to be executed by apiIO classes. Upon execution, the - * responseHttpCode, responseHeaders and responseBody will be filled in. - * - * @author Chris Chabot <chabotc@google.com> - * @author Chirag Shah <chirags@google.com> - * - */ -class Google_HttpRequest { - const USER_AGENT_SUFFIX = "google-api-php-client/0.6.0"; - private $batchHeaders = array( - 'Content-Type' => 'application/http', - 'Content-Transfer-Encoding' => 'binary', - 'MIME-Version' => '1.0', - 'Content-Length' => '' - ); - - protected $url; - protected $requestMethod; - protected $requestHeaders; - protected $postBody; - protected $userAgent; - - protected $responseHttpCode; - protected $responseHeaders; - protected $responseBody; - - public $accessKey; - - public function __construct($url, $method = 'GET', $headers = array(), $postBody = null) { - $this->setUrl($url); - $this->setRequestMethod($method); - $this->setRequestHeaders($headers); - $this->setPostBody($postBody); - - global $apiConfig; - if (empty($apiConfig['application_name'])) { - $this->userAgent = self::USER_AGENT_SUFFIX; - } else { - $this->userAgent = $apiConfig['application_name'] . " " . self::USER_AGENT_SUFFIX; - } - } - - /** - * Misc function that returns the base url component of the $url - * used by the OAuth signing class to calculate the base string - * @return string The base url component of the $url. - * @see http://oauth.net/core/1.0a/#anchor13 - */ - public function getBaseUrl() { - if ($pos = strpos($this->url, '?')) { - return substr($this->url, 0, $pos); - } - return $this->url; - } - - /** - * Misc function that returns an array of the query parameters of the current - * url used by the OAuth signing class to calculate the signature - * @return array Query parameters in the query string. - */ - public function getQueryParams() { - if ($pos = strpos($this->url, '?')) { - $queryStr = substr($this->url, $pos + 1); - $params = array(); - parse_str($queryStr, $params); - return $params; - } - return array(); - } - - /** - * @return string HTTP Response Code. - */ - public function getResponseHttpCode() { - return (int) $this->responseHttpCode; - } - - /** - * @param int $responseHttpCode HTTP Response Code. - */ - public function setResponseHttpCode($responseHttpCode) { - $this->responseHttpCode = $responseHttpCode; - } - - /** - * @return $responseHeaders (array) HTTP Response Headers. - */ - public function getResponseHeaders() { - return $this->responseHeaders; - } - - /** - * @return string HTTP Response Body - */ - public function getResponseBody() { - return $this->responseBody; - } - - /** - * @param array $headers The HTTP response headers - * to be normalized. - */ - public function setResponseHeaders($headers) { - $headers = Google_Utils::normalize($headers); - if ($this->responseHeaders) { - $headers = array_merge($this->responseHeaders, $headers); - } - - $this->responseHeaders = $headers; - } - - /** - * @param string $key - * @return array|boolean Returns the requested HTTP header or - * false if unavailable. - */ - public function getResponseHeader($key) { - return isset($this->responseHeaders[$key]) - ? $this->responseHeaders[$key] - : false; - } - - /** - * @param string $responseBody The HTTP response body. - */ - public function setResponseBody($responseBody) { - $this->responseBody = $responseBody; - } - - /** - * @return string $url The request URL. - */ - - public function getUrl() { - return $this->url; - } - - /** - * @return string $method HTTP Request Method. - */ - public function getRequestMethod() { - return $this->requestMethod; - } - - /** - * @return array $headers HTTP Request Headers. - */ - public function getRequestHeaders() { - return $this->requestHeaders; - } - - /** - * @param string $key - * @return array|boolean Returns the requested HTTP header or - * false if unavailable. - */ - public function getRequestHeader($key) { - return isset($this->requestHeaders[$key]) - ? $this->requestHeaders[$key] - : false; - } - - /** - * @return string $postBody HTTP Request Body. - */ - public function getPostBody() { - return $this->postBody; - } - - /** - * @param string $url the url to set - */ - public function setUrl($url) { - if (substr($url, 0, 4) == 'http') { - $this->url = $url; - } else { - // Force the path become relative. - if (substr($url, 0, 1) !== '/') { - $url = '/' . $url; - } - global $apiConfig; - $this->url = $apiConfig['basePath'] . $url; - } - } - - /** - * @param string $method Set he HTTP Method and normalize - * it to upper-case, as required by HTTP. - * - */ - public function setRequestMethod($method) { - $this->requestMethod = strtoupper($method); - } - - /** - * @param array $headers The HTTP request headers - * to be set and normalized. - */ - public function setRequestHeaders($headers) { - $headers = Google_Utils::normalize($headers); - if ($this->requestHeaders) { - $headers = array_merge($this->requestHeaders, $headers); - } - $this->requestHeaders = $headers; - } - - /** - * @param string $postBody the postBody to set - */ - public function setPostBody($postBody) { - $this->postBody = $postBody; - } - - /** - * Set the User-Agent Header. - * @param string $userAgent The User-Agent. - */ - public function setUserAgent($userAgent) { - $this->userAgent = $userAgent; - } - - /** - * @return string The User-Agent. - */ - public function getUserAgent() { - return $this->userAgent; - } - - /** - * Returns a cache key depending on if this was an OAuth signed request - * in which case it will use the non-signed url and access key to make this - * cache key unique per authenticated user, else use the plain request url - * @return string The md5 hash of the request cache key. - */ - public function getCacheKey() { - $key = $this->getUrl(); - - if (isset($this->accessKey)) { - $key .= $this->accessKey; - } - - if (isset($this->requestHeaders['authorization'])) { - $key .= $this->requestHeaders['authorization']; - } - - return md5($key); - } - - public function getParsedCacheControl() { - $parsed = array(); - $rawCacheControl = $this->getResponseHeader('cache-control'); - if ($rawCacheControl) { - $rawCacheControl = str_replace(', ', '&', $rawCacheControl); - parse_str($rawCacheControl, $parsed); - } - - return $parsed; - } - - /** - * @param string $id - * @return string A string representation of the HTTP Request. - */ - public function toBatchString($id) { - $str = ''; - foreach($this->batchHeaders as $key => $val) { - $str .= $key . ': ' . $val . "\n"; - } - - $str .= "Content-ID: $id\n"; - $str .= "\n"; - - $path = parse_url($this->getUrl(), PHP_URL_PATH); - $str .= $this->getRequestMethod() . ' ' . $path . " HTTP/1.1\n"; - foreach($this->getRequestHeaders() as $key => $val) { - $str .= $key . ': ' . $val . "\n"; - } - - if ($this->getPostBody()) { - $str .= "\n"; - $str .= $this->getPostBody(); - } - - return $str; - } -} diff --git a/apps/files_external/3rdparty/google-api-php-client/src/io/Google_IO.php b/apps/files_external/3rdparty/google-api-php-client/src/io/Google_IO.php deleted file mode 100644 index 5445e699038..00000000000 --- a/apps/files_external/3rdparty/google-api-php-client/src/io/Google_IO.php +++ /dev/null @@ -1,49 +0,0 @@ -<?php -/** - * Copyright 2010 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -require_once 'io/Google_HttpRequest.php'; -require_once 'io/Google_CurlIO.php'; -require_once 'io/Google_REST.php'; - -/** - * Abstract IO class - * - * @author Chris Chabot <chabotc@google.com> - */ -interface Google_IO { - /** - * An utility function that first calls $this->auth->sign($request) and then executes makeRequest() - * on that signed request. Used for when a request should be authenticated - * @param Google_HttpRequest $request - * @return Google_HttpRequest $request - */ - public function authenticatedRequest(Google_HttpRequest $request); - - /** - * Executes a apIHttpRequest and returns the resulting populated httpRequest - * @param Google_HttpRequest $request - * @return Google_HttpRequest $request - */ - public function makeRequest(Google_HttpRequest $request); - - /** - * Set options that update the transport implementation's behavior. - * @param $options - */ - public function setOptions($options); - -} diff --git a/apps/files_external/3rdparty/google-api-php-client/src/service/Google_MediaFileUpload.php b/apps/files_external/3rdparty/google-api-php-client/src/service/Google_MediaFileUpload.php deleted file mode 100644 index c64e18851df..00000000000 --- a/apps/files_external/3rdparty/google-api-php-client/src/service/Google_MediaFileUpload.php +++ /dev/null @@ -1,262 +0,0 @@ -<?php -/** - * Copyright 2012 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @author Chirag Shah <chirags@google.com> - * - */ -class Google_MediaFileUpload { - const UPLOAD_MEDIA_TYPE = 'media'; - const UPLOAD_MULTIPART_TYPE = 'multipart'; - const UPLOAD_RESUMABLE_TYPE = 'resumable'; - - /** @var string $mimeType */ - public $mimeType; - - /** @var string $data */ - public $data; - - /** @var bool $resumable */ - public $resumable; - - /** @var int $chunkSize */ - public $chunkSize; - - /** @var int $size */ - public $size; - - /** @var string $resumeUri */ - public $resumeUri; - - /** @var int $progress */ - public $progress; - - /** - * @param $mimeType string - * @param $data string The bytes you want to upload. - * @param $resumable bool - * @param bool $chunkSize File will be uploaded in chunks of this many bytes. - * only used if resumable=True - */ - public function __construct($mimeType, $data, $resumable=false, $chunkSize=false) { - $this->mimeType = $mimeType; - $this->data = $data; - $this->size = strlen($this->data); - $this->resumable = $resumable; - if(!$chunkSize) { - $chunkSize = 256 * 1024; - } - $this->chunkSize = $chunkSize; - $this->progress = 0; - } - - public function setFileSize($size) { - $this->size = $size; - } - - /** - * @static - * @param $meta - * @param $params - * @return array|bool - */ - public static function process($meta, &$params) { - $payload = array(); - $meta = is_string($meta) ? json_decode($meta, true) : $meta; - $uploadType = self::getUploadType($meta, $payload, $params); - if (!$uploadType) { - // Process as a normal API request. - return false; - } - - // Process as a media upload request. - $params['uploadType'] = array( - 'type' => 'string', - 'location' => 'query', - 'value' => $uploadType, - ); - - $mimeType = isset($params['mimeType']) - ? $params['mimeType']['value'] - : false; - unset($params['mimeType']); - - if (!$mimeType) { - $mimeType = $payload['content-type']; - } - - if (isset($params['file'])) { - // This is a standard file upload with curl. - $file = $params['file']['value']; - unset($params['file']); - return self::processFileUpload($file, $mimeType); - } - - $data = isset($params['data']) - ? $params['data']['value'] - : false; - unset($params['data']); - - if (self::UPLOAD_RESUMABLE_TYPE == $uploadType) { - $payload['content-type'] = $mimeType; - $payload['postBody'] = is_string($meta) ? $meta : json_encode($meta); - - } elseif (self::UPLOAD_MEDIA_TYPE == $uploadType) { - // This is a simple media upload. - $payload['content-type'] = $mimeType; - $payload['postBody'] = $data; - } - - elseif (self::UPLOAD_MULTIPART_TYPE == $uploadType) { - // This is a multipart/related upload. - $boundary = isset($params['boundary']['value']) ? $params['boundary']['value'] : mt_rand(); - $boundary = str_replace('"', '', $boundary); - $payload['content-type'] = 'multipart/related; boundary=' . $boundary; - $related = "--$boundary\r\n"; - $related .= "Content-Type: application/json; charset=UTF-8\r\n"; - $related .= "\r\n" . json_encode($meta) . "\r\n"; - $related .= "--$boundary\r\n"; - $related .= "Content-Type: $mimeType\r\n"; - $related .= "Content-Transfer-Encoding: base64\r\n"; - $related .= "\r\n" . base64_encode($data) . "\r\n"; - $related .= "--$boundary--"; - $payload['postBody'] = $related; - } - - return $payload; - } - - /** - * Prepares a standard file upload via cURL. - * @param $file - * @param $mime - * @return array Includes the processed file name. - * @visible For testing. - */ - public static function processFileUpload($file, $mime) { - if (!$file) return array(); - if (substr($file, 0, 1) != '@') { - $file = '@' . $file; - } - - // This is a standard file upload with curl. - $params = array('postBody' => array('file' => $file)); - if ($mime) { - $params['content-type'] = $mime; - } - - return $params; - } - - /** - * Valid upload types: - * - resumable (UPLOAD_RESUMABLE_TYPE) - * - media (UPLOAD_MEDIA_TYPE) - * - multipart (UPLOAD_MULTIPART_TYPE) - * - none (false) - * @param $meta - * @param $payload - * @param $params - * @return bool|string - */ - public static function getUploadType($meta, &$payload, &$params) { - if (isset($params['mediaUpload']) - && get_class($params['mediaUpload']['value']) == 'Google_MediaFileUpload') { - $upload = $params['mediaUpload']['value']; - unset($params['mediaUpload']); - $payload['content-type'] = $upload->mimeType; - if (isset($upload->resumable) && $upload->resumable) { - return self::UPLOAD_RESUMABLE_TYPE; - } - } - - // Allow the developer to override the upload type. - if (isset($params['uploadType'])) { - return $params['uploadType']['value']; - } - - $data = isset($params['data']['value']) - ? $params['data']['value'] : false; - - if (false == $data && false == isset($params['file'])) { - // No upload data available. - return false; - } - - if (isset($params['file'])) { - return self::UPLOAD_MEDIA_TYPE; - } - - if (false == $meta) { - return self::UPLOAD_MEDIA_TYPE; - } - - return self::UPLOAD_MULTIPART_TYPE; - } - - - public function nextChunk(Google_HttpRequest $req, $chunk=false) { - if (false == $this->resumeUri) { - $this->resumeUri = $this->getResumeUri($req); - } - - if (false == $chunk) { - $chunk = substr($this->data, $this->progress, $this->chunkSize); - } - - $lastBytePos = $this->progress + strlen($chunk) - 1; - $headers = array( - 'content-range' => "bytes $this->progress-$lastBytePos/$this->size", - 'content-type' => $req->getRequestHeader('content-type'), - 'content-length' => $this->chunkSize, - 'expect' => '', - ); - - $httpRequest = new Google_HttpRequest($this->resumeUri, 'PUT', $headers, $chunk); - $response = Google_Client::$io->authenticatedRequest($httpRequest); - $code = $response->getResponseHttpCode(); - if (308 == $code) { - $range = explode('-', $response->getResponseHeader('range')); - $this->progress = $range[1] + 1; - return false; - } else { - return Google_REST::decodeHttpResponse($response); - } - } - - private function getResumeUri(Google_HttpRequest $httpRequest) { - $result = null; - $body = $httpRequest->getPostBody(); - if ($body) { - $httpRequest->setRequestHeaders(array( - 'content-type' => 'application/json; charset=UTF-8', - 'content-length' => Google_Utils::getStrLen($body), - 'x-upload-content-type' => $this->mimeType, - 'x-upload-content-length' => $this->size, - 'expect' => '', - )); - } - - $response = Google_Client::$io->makeRequest($httpRequest); - $location = $response->getResponseHeader('location'); - $code = $response->getResponseHttpCode(); - if (200 == $code && true == $location) { - return $location; - } - throw new Google_Exception("Failed to start the resumable upload"); - } -}
\ No newline at end of file diff --git a/apps/files_external/3rdparty/google-api-php-client/src/service/Google_Model.php b/apps/files_external/3rdparty/google-api-php-client/src/service/Google_Model.php deleted file mode 100644 index cb44cb25748..00000000000 --- a/apps/files_external/3rdparty/google-api-php-client/src/service/Google_Model.php +++ /dev/null @@ -1,115 +0,0 @@ -<?php -/* - * Copyright 2011 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * This class defines attributes, valid values, and usage which is generated from - * a given json schema. http://tools.ietf.org/html/draft-zyp-json-schema-03#section-5 - * - * @author Chirag Shah <chirags@google.com> - * - */ -class Google_Model { - public function __construct( /* polymorphic */ ) { - if (func_num_args() == 1 && is_array(func_get_arg(0))) { - // Initialize the model with the array's contents. - $array = func_get_arg(0); - $this->mapTypes($array); - } - } - - /** - * Initialize this object's properties from an array. - * - * @param array $array Used to seed this object's properties. - * @return void - */ - protected function mapTypes($array) { - foreach ($array as $key => $val) { - $this->$key = $val; - - $keyTypeName = "__$key" . 'Type'; - $keyDataType = "__$key" . 'DataType'; - if ($this->useObjects() && property_exists($this, $keyTypeName)) { - if ($this->isAssociativeArray($val)) { - if (isset($this->$keyDataType) && 'map' == $this->$keyDataType) { - foreach($val as $arrayKey => $arrayItem) { - $val[$arrayKey] = $this->createObjectFromName($keyTypeName, $arrayItem); - } - $this->$key = $val; - } else { - $this->$key = $this->createObjectFromName($keyTypeName, $val); - } - } else if (is_array($val)) { - $arrayObject = array(); - foreach ($val as $arrayIndex => $arrayItem) { - $arrayObject[$arrayIndex] = $this->createObjectFromName($keyTypeName, $arrayItem); - } - $this->$key = $arrayObject; - } - } - } - } - - /** - * Returns true only if the array is associative. - * @param array $array - * @return bool True if the array is associative. - */ - protected function isAssociativeArray($array) { - if (!is_array($array)) { - return false; - } - $keys = array_keys($array); - foreach($keys as $key) { - if (is_string($key)) { - return true; - } - } - return false; - } - - /** - * Given a variable name, discover its type. - * - * @param $name - * @param $item - * @return object The object from the item. - */ - private function createObjectFromName($name, $item) { - $type = $this->$name; - return new $type($item); - } - - protected function useObjects() { - global $apiConfig; - return (isset($apiConfig['use_objects']) && $apiConfig['use_objects']); - } - - /** - * Verify if $obj is an array. - * @throws Google_Exception Thrown if $obj isn't an array. - * @param array $obj Items that should be validated. - * @param string $type Array items should be of this type. - * @param string $method Method expecting an array as an argument. - */ - public function assertIsArray($obj, $type, $method) { - if ($obj && !is_array($obj)) { - throw new Google_Exception("Incorrect parameter type passed to $method(), expected an" - . " array containing items of type $type."); - } - } -} diff --git a/apps/files_external/3rdparty/google-api-php-client/src/service/Google_ServiceResource.php b/apps/files_external/3rdparty/google-api-php-client/src/service/Google_ServiceResource.php deleted file mode 100644 index bb3af4db809..00000000000 --- a/apps/files_external/3rdparty/google-api-php-client/src/service/Google_ServiceResource.php +++ /dev/null @@ -1,205 +0,0 @@ -<?php -/** - * Copyright 2010 Google Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * Implements the actual methods/resources of the discovered Google API using magic function - * calling overloading (__call()), which on call will see if the method name (plus.activities.list) - * is available in this service, and if so construct an apiHttpRequest representing it. - * - * @author Chris Chabot <chabotc@google.com> - * @author Chirag Shah <chirags@google.com> - * - */ -class Google_ServiceResource { - // Valid query parameters that work, but don't appear in discovery. - private $stackParameters = array( - 'alt' => array('type' => 'string', 'location' => 'query'), - 'boundary' => array('type' => 'string', 'location' => 'query'), - 'fields' => array('type' => 'string', 'location' => 'query'), - 'trace' => array('type' => 'string', 'location' => 'query'), - 'userIp' => array('type' => 'string', 'location' => 'query'), - 'userip' => array('type' => 'string', 'location' => 'query'), - 'quotaUser' => array('type' => 'string', 'location' => 'query'), - 'file' => array('type' => 'complex', 'location' => 'body'), - 'data' => array('type' => 'string', 'location' => 'body'), - 'mimeType' => array('type' => 'string', 'location' => 'header'), - 'uploadType' => array('type' => 'string', 'location' => 'query'), - 'mediaUpload' => array('type' => 'complex', 'location' => 'query'), - ); - - /** @var Google_Service $service */ - private $service; - - /** @var string $serviceName */ - private $serviceName; - - /** @var string $resourceName */ - private $resourceName; - - /** @var array $methods */ - private $methods; - - public function __construct($service, $serviceName, $resourceName, $resource) { - $this->service = $service; - $this->serviceName = $serviceName; - $this->resourceName = $resourceName; - $this->methods = isset($resource['methods']) ? $resource['methods'] : array($resourceName => $resource); - } - - /** - * @param $name - * @param $arguments - * @return Google_HttpRequest|array - * @throws Google_Exception - */ - public function __call($name, $arguments) { - if (! isset($this->methods[$name])) { - throw new Google_Exception("Unknown function: {$this->serviceName}->{$this->resourceName}->{$name}()"); - } - $method = $this->methods[$name]; - $parameters = $arguments[0]; - - // postBody is a special case since it's not defined in the discovery document as parameter, but we abuse the param entry for storing it - $postBody = null; - if (isset($parameters['postBody'])) { - if (is_object($parameters['postBody'])) { - $this->stripNull($parameters['postBody']); - } - - // Some APIs require the postBody to be set under the data key. - if (is_array($parameters['postBody']) && 'latitude' == $this->serviceName) { - if (!isset($parameters['postBody']['data'])) { - $rawBody = $parameters['postBody']; - unset($parameters['postBody']); - $parameters['postBody']['data'] = $rawBody; - } - } - - $postBody = is_array($parameters['postBody']) || is_object($parameters['postBody']) - ? json_encode($parameters['postBody']) - : $parameters['postBody']; - unset($parameters['postBody']); - - if (isset($parameters['optParams'])) { - $optParams = $parameters['optParams']; - unset($parameters['optParams']); - $parameters = array_merge($parameters, $optParams); - } - } - - if (!isset($method['parameters'])) { - $method['parameters'] = array(); - } - - $method['parameters'] = array_merge($method['parameters'], $this->stackParameters); - foreach ($parameters as $key => $val) { - if ($key != 'postBody' && ! isset($method['parameters'][$key])) { - throw new Google_Exception("($name) unknown parameter: '$key'"); - } - } - if (isset($method['parameters'])) { - foreach ($method['parameters'] as $paramName => $paramSpec) { - if (isset($paramSpec['required']) && $paramSpec['required'] && ! isset($parameters[$paramName])) { - throw new Google_Exception("($name) missing required param: '$paramName'"); - } - if (isset($parameters[$paramName])) { - $value = $parameters[$paramName]; - $parameters[$paramName] = $paramSpec; - $parameters[$paramName]['value'] = $value; - unset($parameters[$paramName]['required']); - } else { - unset($parameters[$paramName]); - } - } - } - - // Discovery v1.0 puts the canonical method id under the 'id' field. - if (! isset($method['id'])) { - $method['id'] = $method['rpcMethod']; - } - - // Discovery v1.0 puts the canonical path under the 'path' field. - if (! isset($method['path'])) { - $method['path'] = $method['restPath']; - } - - $servicePath = $this->service->servicePath; - - // Process Media Request - $contentType = false; - if (isset($method['mediaUpload'])) { - $media = Google_MediaFileUpload::process($postBody, $parameters); - if ($media) { - $contentType = isset($media['content-type']) ? $media['content-type']: null; - $postBody = isset($media['postBody']) ? $media['postBody'] : null; - $servicePath = $method['mediaUpload']['protocols']['simple']['path']; - $method['path'] = ''; - } - } - - $url = Google_REST::createRequestUri($servicePath, $method['path'], $parameters); - $httpRequest = new Google_HttpRequest($url, $method['httpMethod'], null, $postBody); - if ($postBody) { - $contentTypeHeader = array(); - if (isset($contentType) && $contentType) { - $contentTypeHeader['content-type'] = $contentType; - } else { - $contentTypeHeader['content-type'] = 'application/json; charset=UTF-8'; - $contentTypeHeader['content-length'] = Google_Utils::getStrLen($postBody); - } - $httpRequest->setRequestHeaders($contentTypeHeader); - } - - $httpRequest = Google_Client::$auth->sign($httpRequest); - if (Google_Client::$useBatch) { - return $httpRequest; - } - - // Terminate immediately if this is a resumable request. - if (isset($parameters['uploadType']['value']) - && Google_MediaFileUpload::UPLOAD_RESUMABLE_TYPE == $parameters['uploadType']['value']) { - $contentTypeHeader = array(); - if (isset($contentType) && $contentType) { - $contentTypeHeader['content-type'] = $contentType; - } - $httpRequest->setRequestHeaders($contentTypeHeader); - if ($postBody) { - $httpRequest->setPostBody($postBody); - } - return $httpRequest; - } - - return Google_REST::execute($httpRequest); - } - - public function useObjects() { - global $apiConfig; - return (isset($apiConfig['use_objects']) && $apiConfig['use_objects']); - } - - protected function stripNull(&$o) { - $o = (array) $o; - foreach ($o as $k => $v) { - if ($v === null || strstr($k, "\0*\0__")) { - unset($o[$k]); - } - elseif (is_object($v) || is_array($v)) { - $this->stripNull($o[$k]); - } - } - } -} diff --git a/apps/files_external/ajax/google.php b/apps/files_external/ajax/google.php index 40c10aa5d07..b80f24bbd2c 100644 --- a/apps/files_external/ajax/google.php +++ b/apps/files_external/ajax/google.php @@ -1,7 +1,7 @@ <?php set_include_path(get_include_path().PATH_SEPARATOR. \OC_App::getAppPath('files_external').'/3rdparty/google-api-php-client/src'); -require_once 'Google_Client.php'; +require_once 'Google/Client.php'; OCP\JSON::checkAppEnabled('files_external'); OCP\JSON::checkLoggedIn(); @@ -14,6 +14,7 @@ if (isset($_POST['client_id']) && isset($_POST['client_secret']) && isset($_POST $client->setClientSecret($_POST['client_secret']); $client->setRedirectUri($_POST['redirect']); $client->setScopes(array('https://www.googleapis.com/auth/drive')); + $client->setAccessType('offline'); if (isset($_POST['step'])) { $step = $_POST['step']; if ($step == 1) { diff --git a/apps/files_external/appinfo/app.php b/apps/files_external/appinfo/app.php index ea14f7adbcf..0aafcad559a 100644 --- a/apps/files_external/appinfo/app.php +++ b/apps/files_external/appinfo/app.php @@ -90,7 +90,7 @@ OC_Mount_Config::registerBackend('\OC\Files\Storage\FTP', array( 'host' => (string)$l->t('Host'), 'user' => (string)$l->t('Username'), 'password' => '*'.$l->t('Password'), - 'root' => '&'.$l->t('Root'), + 'root' => '&'.$l->t('Remote subfolder'), 'secure' => '!'.$l->t('Secure ftps://')), 'has_dependencies' => true)); @@ -132,7 +132,7 @@ if (!OC_Util::runningOnWindows()) { 'user' => (string)$l->t('Username'), 'password' => '*'.$l->t('Password'), 'share' => (string)$l->t('Share'), - 'root' => '&'.$l->t('Root')), + 'root' => '&'.$l->t('Remote subfolder')), 'has_dependencies' => true)); OC_Mount_Config::registerBackend('\OC\Files\Storage\SMB_OC', array( @@ -142,7 +142,7 @@ if (!OC_Util::runningOnWindows()) { 'host' => (string)$l->t('Host'), 'username_as_share' => '!'.$l->t('Username as share'), 'share' => '&'.$l->t('Share'), - 'root' => '&'.$l->t('Root')), + 'root' => '&'.$l->t('Remote subfolder')), 'has_dependencies' => true)); } @@ -153,7 +153,7 @@ OC_Mount_Config::registerBackend('\OC\Files\Storage\DAV', array( 'host' => (string)$l->t('URL'), 'user' => (string)$l->t('Username'), 'password' => '*'.$l->t('Password'), - 'root' => '&'.$l->t('Root'), + 'root' => '&'.$l->t('Remote subfolder'), 'secure' => '!'.$l->t('Secure https://')), 'has_dependencies' => true)); @@ -175,5 +175,7 @@ OC_Mount_Config::registerBackend('\OC\Files\Storage\SFTP', array( 'host' => (string)$l->t('Host'), 'user' => (string)$l->t('Username'), 'password' => '*'.$l->t('Password'), - 'root' => '&'.$l->t('Root')))); + 'root' => '&'.$l->t('Remote subfolder')))); +$mountProvider = new \OCA\Files_External\Config\ConfigAdapter(); +\OC::$server->getMountProviderCollection()->registerProvider($mountProvider); diff --git a/apps/files_external/appinfo/info.xml b/apps/files_external/appinfo/info.xml index 6acb58960d4..f23dea83caa 100644 --- a/apps/files_external/appinfo/info.xml +++ b/apps/files_external/appinfo/info.xml @@ -3,9 +3,9 @@ <id>files_external</id> <name>External storage support</name> <description> - This application enables administrators to configure connections to external storage provides, such as FTP servers, S3 or SWIFT object stores, Google Drive, Dropbox, other ownCloud servers, WebDAV servers and more. Administrators can choose in the GUI which type of storage to enable, and can mount these storage locations for a user, a group, or the entire system. Users will see a new folder appear in their root ownCloud directory, and then can then access and use it like any other ownCloud folder. External Storage also allows users to share files stored in these external location. In these cases, the credentials for the owner of the file are used then the recipient requests the file from external storage, thereby ensuring that the recipient can get at the file that was shared. + This application enables administrators to configure connections to external storage providers, such as FTP servers, S3 or SWIFT object stores, Google Drive, Dropbox, other ownCloud servers, WebDAV servers, and more. Administrators can choose which types of storage to enable and can mount these storage locations for a user, a group, or the entire system. Users will see a new folder appear in their root ownCloud directory, which they can access and use like any other ownCloud folder. External Storage also allows users to share files stored in these external locations. In these cases, the credentials for the owner of the file are used when the recipient requests the file from external storage, thereby ensuring that the recipient can access the shared file. - In addition to the GUI, it is possible to configure external storage manually at the command line. This option provides the advanced user with more flexibility for configuring bulk external storage mounts, as well as setting mount priorities. More information is available in the External Storage GUI documentation and the External Storage Configuration File documentation. + External Storage can be configured using the GUI or at the command line. This second option provides the advanced user with more flexibility for configuring bulk external storage mounts and setting mount priorities. More information is available in the External Storage GUI documentation and the External Storage Configuration File documentation. </description> <licence>AGPL</licence> <author>Robin Appelman, Michael Gapczynski, Vincent Petry</author> diff --git a/apps/files_external/img/app.svg b/apps/files_external/img/app.svg index df1bfd163ff..6cafe174f60 100644 --- a/apps/files_external/img/app.svg +++ b/apps/files_external/img/app.svg @@ -1,212 +1,4 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<svg - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:cc="http://creativecommons.org/ns#" - xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" - xmlns:svg="http://www.w3.org/2000/svg" - xmlns="http://www.w3.org/2000/svg" - xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" - xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" - height="32px" - width="32px" - version="1.1" - id="svg2" - inkscape:version="0.48.5 r10040" - sodipodi:docname="app.svg"> - <metadata - id="metadata80"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> - </cc:Work> - </rdf:RDF> - </metadata> - <sodipodi:namedview - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1" - objecttolerance="10" - gridtolerance="10" - guidetolerance="10" - inkscape:pageopacity="0" - inkscape:pageshadow="2" - inkscape:window-width="1920" - inkscape:window-height="1014" - id="namedview78" - showgrid="false" - inkscape:zoom="7.375" - inkscape:cx="-13.559322" - inkscape:cy="16" - inkscape:window-x="0" - inkscape:window-y="27" - inkscape:window-maximized="1" - inkscape:current-layer="svg2" /> - <defs - id="defs4"> - <linearGradient - id="m" - y2="21.387" - gradientUnits="userSpaceOnUse" - x2="27.557" - gradientTransform="matrix(.89186 0 0 1.0539 3.1208 3.4122)" - y1="7.1627" - x1="27.557"> - <stop - stop-color="#fff" - offset="0" - id="stop7" /> - <stop - stop-color="#fff" - stop-opacity=".23529" - offset=".0097359" - id="stop9" /> - <stop - stop-color="#fff" - stop-opacity=".15686" - offset=".99001" - id="stop11" /> - <stop - stop-color="#fff" - stop-opacity=".39216" - offset="1" - id="stop13" /> - </linearGradient> - <linearGradient - id="l" - y2="43.761" - gradientUnits="userSpaceOnUse" - x2="35.793" - gradientTransform="matrix(.64444 0 0 .64286 .53352 -1.1074)" - y1="17.118" - x1="35.793"> - <stop - stop-color="#b4cee1" - offset="0" - id="stop16" /> - <stop - stop-color="#5d9fcd" - offset="1" - id="stop18" /> - </linearGradient> - <linearGradient - id="k" - y2="609.51" - gradientUnits="userSpaceOnUse" - x2="302.86" - gradientTransform="matrix(.051143 0 0 .015916 -2.49 22.299)" - y1="366.65" - x1="302.86"> - <stop - stop-opacity="0" - offset="0" - id="stop21" /> - <stop - offset=".5" - id="stop23" /> - <stop - stop-opacity="0" - offset="1" - id="stop25" /> - </linearGradient> - <radialGradient - id="n" - gradientUnits="userSpaceOnUse" - cy="486.65" - cx="605.71" - gradientTransform="matrix(.019836 0 0 .015916 16.388 22.299)" - r="117.14"> - <stop - offset="0" - id="stop28" /> - <stop - stop-opacity="0" - offset="1" - id="stop30" /> - </radialGradient> - <radialGradient - id="o" - gradientUnits="userSpaceOnUse" - cy="486.65" - cx="605.71" - gradientTransform="matrix(-.019836 0 0 .015916 15.601 22.299)" - r="117.14"> - <stop - offset="0" - id="stop33" /> - <stop - stop-opacity="0" - offset="1" - id="stop35" /> - </radialGradient> - <linearGradient - id="j" - y2="34.143" - gradientUnits="userSpaceOnUse" - x2="21.37" - gradientTransform="matrix(.54384 0 0 .61466 3.2689 3.0908)" - y1="4.7324" - x1="21.37"> - <stop - stop-color="#fff" - offset="0" - id="stop38" /> - <stop - stop-color="#fff" - stop-opacity=".23529" - offset=".11063" - id="stop40" /> - <stop - stop-color="#fff" - stop-opacity=".15686" - offset=".99001" - id="stop42" /> - <stop - stop-color="#fff" - stop-opacity=".39216" - offset="1" - id="stop44" /> - </linearGradient> - <linearGradient - id="i" - y2="16" - gradientUnits="userSpaceOnUse" - x2="62.989" - gradientTransform="matrix(.61905 0 0 .61905 -30.392 -.57170)" - y1="13" - x1="62.989"> - <stop - stop-color="#f9f9f9" - offset="0" - id="stop47" /> - <stop - stop-color="#d8d8d8" - offset="1" - id="stop49" /> - </linearGradient> - <linearGradient - id="d" - y2="3.6337" - gradientUnits="userSpaceOnUse" - y1="53.514" - gradientTransform="matrix(.50703 0 0 .503 68.029 -.67050)" - x2="-51.786" - x1="-51.786"> - <stop - stop-opacity=".32174" - offset="0" - id="stop52" /> - <stop - stop-opacity=".27826" - offset="1" - id="stop54" /> - </linearGradient> - </defs> - <path - d="m 14.902928,3.2372882 4.76117,4.5146377 -7.141758,6.7719561 4.761174,4.514639 7.141756,-6.771956 4.761171,4.514636 V 3.2372882 H 14.902928 z M 5.3805857,5.4946057 C 4.0617412,5.4946057 3,6.501372 3,7.7519259 V 25.810477 c 0,1.250555 1.0617412,2.257319 2.3805857,2.257319 H 24.42527 c 1.318844,0 2.380584,-1.006764 2.380584,-2.257319 v -6.771956 l -2.380584,-2.25732 v 9.029276 H 5.3805857 V 7.7519259 H 14.902928 L 12.52234,5.4946057 H 5.3805857 z" - id="path76" - inkscape:connector-curvature="0" - style="opacity:0.7;fill:#ffffff;fill-opacity:1" /> +<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" height="32px" width="32px" version="1.1" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/"> + <path d="m14.903 3.2373 4.7612 4.5146-7.1418 6.772 4.7612 4.5146 7.1418-6.772 4.7612 4.5146v-13.545h-14.283zm-9.5224 2.2573c-1.3189 0-2.3806 1.0068-2.3806 2.2573v18.058c0 1.2506 1.0617 2.2573 2.3806 2.2573h19.044c1.3188 0 2.3806-1.0068 2.3806-2.2573v-6.772l-2.3806-2.2573v9.0293h-19.044v-18.058h9.522l-2.381-2.2574h-7.1414z" fill="#fff"/> </svg> diff --git a/apps/files_external/js/app.js b/apps/files_external/js/app.js index 58ad1a0f6ef..bf853f926dc 100644 --- a/apps/files_external/js/app.js +++ b/apps/files_external/js/app.js @@ -9,8 +9,14 @@ */ if (!OCA.External) { + /** + * @namespace + */ OCA.External = {}; } +/** + * @namespace + */ OCA.External.App = { fileList: null, diff --git a/apps/files_external/js/mountsfilelist.js b/apps/files_external/js/mountsfilelist.js index 20bf0f785db..c45faafd9bf 100644 --- a/apps/files_external/js/mountsfilelist.js +++ b/apps/files_external/js/mountsfilelist.js @@ -10,15 +10,29 @@ (function() { /** - * External storage file list - */ + * @class OCA.External.FileList + * @augments OCA.Files.FileList + * + * @classdesc External storage file list. + * + * Displays a list of mount points visible + * for the current user. + * + * @param $el container element with existing markup for the #controls + * and a table + * @param [options] map of options, see other parameters + **/ var FileList = function($el, options) { this.initialize($el, options); }; - FileList.prototype = _.extend({}, OCA.Files.FileList.prototype, { + FileList.prototype = _.extend({}, OCA.Files.FileList.prototype, + /** @lends OCA.External.FileList.prototype */ { appName: 'External storage', + /** + * @private + */ initialize: function($el, options) { OCA.Files.FileList.prototype.initialize.apply(this, arguments); if (this.initialized) { @@ -26,6 +40,9 @@ } }, + /** + * @param {OCA.External.MountPointInfo} fileData + */ _createRow: function(fileData) { // TODO: hook earlier and render the whole row here var $tr = OCA.Files.FileList.prototype._createRow.apply(this, arguments); @@ -114,5 +131,15 @@ } }); + /** + * Mount point info attributes. + * + * @typedef {Object} OCA.External.MountPointInfo + * + * @property {String} name mount point name + * @property {String} scope mount point scope "personal" or "system" + * @property {String} backend external storage backend name + */ + OCA.External.FileList = FileList; })(); diff --git a/apps/files_external/js/settings.js b/apps/files_external/js/settings.js index 75d45ae1924..ee3d0b736da 100644 --- a/apps/files_external/js/settings.js +++ b/apps/files_external/js/settings.js @@ -468,14 +468,14 @@ $(document).ready(function() { OC.AppConfig.setValue('files_external', 'allow_user_mounting', 'no'); $('#userMountingBackends').addClass('hidden'); } - OC.msg.finishedSaving('#userMountingMsg', {status: 'success', data: {message: t('settings', 'Saved')}}); + OC.msg.finishedSaving('#userMountingMsg', {status: 'success', data: {message: t('files_external', 'Saved')}}); }); $('input[name="allowUserMountingBackends\\[\\]"]').bind('change', function() { OC.msg.startSaving('#userMountingMsg'); var userMountingBackends = $('input[name="allowUserMountingBackends\\[\\]"]:checked').map(function(){return $(this).val();}).get(); OC.AppConfig.setValue('files_external', 'user_mounting_backends', userMountingBackends.join()); - OC.msg.finishedSaving('#userMountingMsg', {status: 'success', data: {message: t('settings', 'Saved')}}); + OC.msg.finishedSaving('#userMountingMsg', {status: 'success', data: {message: t('files_external', 'Saved')}}); // disable allowUserMounting if(userMountingBackends.length === 0) { diff --git a/apps/files_external/l10n/ast.js b/apps/files_external/l10n/ast.js index d1d9f05b498..63a6fe63cfc 100644 --- a/apps/files_external/l10n/ast.js +++ b/apps/files_external/l10n/ast.js @@ -26,7 +26,7 @@ OC.L10N.register( "Host" : "Sirvidor", "Username" : "Nome d'usuariu", "Password" : "Contraseña", - "Root" : "Raíz", + "Remote subfolder" : "Subcarpeta remota", "Secure ftps://" : "Secure ftps://", "Client ID" : "ID de veceru", "Client secret" : "Veceru secretu", @@ -43,7 +43,6 @@ OC.L10N.register( "Username as share" : "Nome d'usuariu como Compartición", "URL" : "URL", "Secure https://" : "Secure https://", - "Remote subfolder" : "Subcarpeta remota", "Access granted" : "Accesu concedíu", "Error configuring Dropbox storage" : "Fallu configurando l'almacenamientu de Dropbox", "Grant access" : "Conceder accesu", @@ -54,11 +53,9 @@ OC.L10N.register( "(group)" : "(grupu)", "Saved" : "Guardáu", "<b>Note:</b> " : "<b>Nota:</b> ", - " and " : "y", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Nota:</b> El soporte de cURL en PHP nun ta activáu o instaláu. Nun pue montase %s. Pídi-y al alministrador de sistema que lu instale.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Nota:</b> El soporte de FTP en PHP nun ta activáu o instaláu. Nun pue montase %s. Pídi-y al alministrador de sistema que lu instale.", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Nota:</b> \"%s\" nun ta instaláu. Nun pue montase %s. Pídi-y al alministrador de sistema que lu instale.", - "You don't have any external storages" : "Nun tienes almacenamientos esternos", "Name" : "Nome", "Storage type" : "Triba d'almacenamientu", "Scope" : "Ámbitu", diff --git a/apps/files_external/l10n/ast.json b/apps/files_external/l10n/ast.json index eeca7714b31..f3858591e09 100644 --- a/apps/files_external/l10n/ast.json +++ b/apps/files_external/l10n/ast.json @@ -24,7 +24,7 @@ "Host" : "Sirvidor", "Username" : "Nome d'usuariu", "Password" : "Contraseña", - "Root" : "Raíz", + "Remote subfolder" : "Subcarpeta remota", "Secure ftps://" : "Secure ftps://", "Client ID" : "ID de veceru", "Client secret" : "Veceru secretu", @@ -41,7 +41,6 @@ "Username as share" : "Nome d'usuariu como Compartición", "URL" : "URL", "Secure https://" : "Secure https://", - "Remote subfolder" : "Subcarpeta remota", "Access granted" : "Accesu concedíu", "Error configuring Dropbox storage" : "Fallu configurando l'almacenamientu de Dropbox", "Grant access" : "Conceder accesu", @@ -52,11 +51,9 @@ "(group)" : "(grupu)", "Saved" : "Guardáu", "<b>Note:</b> " : "<b>Nota:</b> ", - " and " : "y", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Nota:</b> El soporte de cURL en PHP nun ta activáu o instaláu. Nun pue montase %s. Pídi-y al alministrador de sistema que lu instale.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Nota:</b> El soporte de FTP en PHP nun ta activáu o instaláu. Nun pue montase %s. Pídi-y al alministrador de sistema que lu instale.", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Nota:</b> \"%s\" nun ta instaláu. Nun pue montase %s. Pídi-y al alministrador de sistema que lu instale.", - "You don't have any external storages" : "Nun tienes almacenamientos esternos", "Name" : "Nome", "Storage type" : "Triba d'almacenamientu", "Scope" : "Ámbitu", diff --git a/apps/files_external/l10n/bg_BG.js b/apps/files_external/l10n/bg_BG.js index 1944af503f1..dabf8715e82 100644 --- a/apps/files_external/l10n/bg_BG.js +++ b/apps/files_external/l10n/bg_BG.js @@ -26,7 +26,7 @@ OC.L10N.register( "Host" : "Сървър", "Username" : "Потребителско Име", "Password" : "Парола", - "Root" : "Root", + "Remote subfolder" : "Външна подпапка", "Secure ftps://" : "Сигурен ftps://", "Client ID" : "Client ID", "Client secret" : "Client secret", @@ -43,7 +43,6 @@ OC.L10N.register( "Username as share" : "Потребителско име като споделена папка", "URL" : "Интернет Адрес", "Secure https://" : "Подсигурен https://", - "Remote subfolder" : "Външна подпапка", "Access granted" : "Достъпът разрешен", "Error configuring Dropbox storage" : "Грешка при настройката на Dropbox дисковото пространство.", "Grant access" : "Разреши достъп", @@ -54,11 +53,9 @@ OC.L10N.register( "(group)" : "(група)", "Saved" : "Запазено", "<b>Note:</b> " : "<b>Бележка:</b> ", - " and " : "и", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Note:</b> PHP подръжката на cURL не е включена или инсталирана. Прикачването на %s не е възможно. Моля, поискай системния администратор да я инсталира.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Note:</b> PHP подръжката на FTP не е включена или инсталирана. Прикачването на %s не е възможно. Моля, поискай системния администратор да я инсталира.", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Note:</b> \"%s\" не е инсталиран. Прикачването на %s не е възможно. Моля, поискай системния администратор да я инсталира.", - "You don't have any external storages" : "Нямаш никакви външни дискови пространства", "Name" : "Име", "Storage type" : "Тип дисково пространство", "Scope" : "Обхват", diff --git a/apps/files_external/l10n/bg_BG.json b/apps/files_external/l10n/bg_BG.json index 0564415c3d6..5dc9e8d60a2 100644 --- a/apps/files_external/l10n/bg_BG.json +++ b/apps/files_external/l10n/bg_BG.json @@ -24,7 +24,7 @@ "Host" : "Сървър", "Username" : "Потребителско Име", "Password" : "Парола", - "Root" : "Root", + "Remote subfolder" : "Външна подпапка", "Secure ftps://" : "Сигурен ftps://", "Client ID" : "Client ID", "Client secret" : "Client secret", @@ -41,7 +41,6 @@ "Username as share" : "Потребителско име като споделена папка", "URL" : "Интернет Адрес", "Secure https://" : "Подсигурен https://", - "Remote subfolder" : "Външна подпапка", "Access granted" : "Достъпът разрешен", "Error configuring Dropbox storage" : "Грешка при настройката на Dropbox дисковото пространство.", "Grant access" : "Разреши достъп", @@ -52,11 +51,9 @@ "(group)" : "(група)", "Saved" : "Запазено", "<b>Note:</b> " : "<b>Бележка:</b> ", - " and " : "и", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Note:</b> PHP подръжката на cURL не е включена или инсталирана. Прикачването на %s не е възможно. Моля, поискай системния администратор да я инсталира.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Note:</b> PHP подръжката на FTP не е включена или инсталирана. Прикачването на %s не е възможно. Моля, поискай системния администратор да я инсталира.", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Note:</b> \"%s\" не е инсталиран. Прикачването на %s не е възможно. Моля, поискай системния администратор да я инсталира.", - "You don't have any external storages" : "Нямаш никакви външни дискови пространства", "Name" : "Име", "Storage type" : "Тип дисково пространство", "Scope" : "Обхват", diff --git a/apps/files_external/l10n/bn_BD.js b/apps/files_external/l10n/bn_BD.js index 1afb8c66ee1..79df8f58bf3 100644 --- a/apps/files_external/l10n/bn_BD.js +++ b/apps/files_external/l10n/bn_BD.js @@ -20,7 +20,6 @@ OC.L10N.register( "Host" : "হোস্ট", "Username" : "ব্যবহারকারী", "Password" : "কূটশব্দ", - "Root" : "শেকড়", "Secure ftps://" : "ftps:// অর্জন কর", "Client ID" : "ক্লায়েন্ট পরিচিতি", "Share" : "ভাগাভাগি কর", @@ -33,7 +32,6 @@ OC.L10N.register( "(group)" : "(গোষ্ঠি)", "Saved" : "সংরক্ষণ করা হলো", "<b>Note:</b> " : "<b>দ্রষ্টব্য:</b> ", - " and " : "এবং", "Name" : "রাম", "External Storage" : "বাহ্যিক সংরক্ষণাগার", "Folder name" : "ফোলডারের নাম", diff --git a/apps/files_external/l10n/bn_BD.json b/apps/files_external/l10n/bn_BD.json index 975bf7cace7..74da3dd1af3 100644 --- a/apps/files_external/l10n/bn_BD.json +++ b/apps/files_external/l10n/bn_BD.json @@ -18,7 +18,6 @@ "Host" : "হোস্ট", "Username" : "ব্যবহারকারী", "Password" : "কূটশব্দ", - "Root" : "শেকড়", "Secure ftps://" : "ftps:// অর্জন কর", "Client ID" : "ক্লায়েন্ট পরিচিতি", "Share" : "ভাগাভাগি কর", @@ -31,7 +30,6 @@ "(group)" : "(গোষ্ঠি)", "Saved" : "সংরক্ষণ করা হলো", "<b>Note:</b> " : "<b>দ্রষ্টব্য:</b> ", - " and " : "এবং", "Name" : "রাম", "External Storage" : "বাহ্যিক সংরক্ষণাগার", "Folder name" : "ফোলডারের নাম", diff --git a/apps/files_external/l10n/bs.js b/apps/files_external/l10n/bs.js index 349554cd2dd..b71d1832e51 100644 --- a/apps/files_external/l10n/bs.js +++ b/apps/files_external/l10n/bs.js @@ -1,7 +1,15 @@ OC.L10N.register( "files_external", { + "Local" : "Lokalno", + "Location" : "Lokacija", + "Port" : "Priključak", + "Username" : "Korisničko ime", + "Password" : "Lozinka", "Share" : "Podijeli", - "Name" : "Ime" + "Personal" : "Osobno", + "Saved" : "Spremljeno", + "Name" : "Ime", + "Delete" : "Izbriši" }, "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/apps/files_external/l10n/bs.json b/apps/files_external/l10n/bs.json index 123aaea647a..36141be81e4 100644 --- a/apps/files_external/l10n/bs.json +++ b/apps/files_external/l10n/bs.json @@ -1,5 +1,13 @@ { "translations": { + "Local" : "Lokalno", + "Location" : "Lokacija", + "Port" : "Priključak", + "Username" : "Korisničko ime", + "Password" : "Lozinka", "Share" : "Podijeli", - "Name" : "Ime" + "Personal" : "Osobno", + "Saved" : "Spremljeno", + "Name" : "Ime", + "Delete" : "Izbriši" },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" }
\ No newline at end of file diff --git a/apps/files_external/l10n/ca.js b/apps/files_external/l10n/ca.js index 4663654f63c..78aa5ad5b8d 100644 --- a/apps/files_external/l10n/ca.js +++ b/apps/files_external/l10n/ca.js @@ -26,7 +26,7 @@ OC.L10N.register( "Host" : "Equip remot", "Username" : "Nom d'usuari", "Password" : "Contrasenya", - "Root" : "Arrel", + "Remote subfolder" : "Subcarpeta remota", "Secure ftps://" : "Protocol segur ftps://", "Client ID" : "Client ID", "Client secret" : "Secret del client", @@ -43,7 +43,6 @@ OC.L10N.register( "Username as share" : "Nom d'usuari per compartir", "URL" : "URL", "Secure https://" : "Protocol segur https://", - "Remote subfolder" : "Subcarpeta remota", "Access granted" : "S'ha concedit l'accés", "Error configuring Dropbox storage" : "Error en configurar l'emmagatzemament Dropbox", "Grant access" : "Concedeix accés", @@ -54,11 +53,9 @@ OC.L10N.register( "(group)" : "(grup)", "Saved" : "Desat", "<b>Note:</b> " : "<b>Nota:</b> ", - " and " : "i", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Nota:</b> El suport cURL no està activat o instal·lat a PHP. No es pot muntar %s. Demaneu a l'administrador del sistema que l'instal·li.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Nota:</b> El suport FTP per PHP no està activat o no està instal·lat. No es pot muntar %s. Demaneu a l'administrador del sistema que l'instal·li.", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Nota:</b> %s no està instal·lat. No es pot muntar %s. Demaneu a l'administrador del sistema que l'instal·li.", - "You don't have any external storages" : "No teniu emmagatzaments externs", "Name" : "Nom", "Storage type" : "Tipus d'emmagatzemament", "Scope" : "Abast", diff --git a/apps/files_external/l10n/ca.json b/apps/files_external/l10n/ca.json index 6bd1dcca39b..01f63676b59 100644 --- a/apps/files_external/l10n/ca.json +++ b/apps/files_external/l10n/ca.json @@ -24,7 +24,7 @@ "Host" : "Equip remot", "Username" : "Nom d'usuari", "Password" : "Contrasenya", - "Root" : "Arrel", + "Remote subfolder" : "Subcarpeta remota", "Secure ftps://" : "Protocol segur ftps://", "Client ID" : "Client ID", "Client secret" : "Secret del client", @@ -41,7 +41,6 @@ "Username as share" : "Nom d'usuari per compartir", "URL" : "URL", "Secure https://" : "Protocol segur https://", - "Remote subfolder" : "Subcarpeta remota", "Access granted" : "S'ha concedit l'accés", "Error configuring Dropbox storage" : "Error en configurar l'emmagatzemament Dropbox", "Grant access" : "Concedeix accés", @@ -52,11 +51,9 @@ "(group)" : "(grup)", "Saved" : "Desat", "<b>Note:</b> " : "<b>Nota:</b> ", - " and " : "i", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Nota:</b> El suport cURL no està activat o instal·lat a PHP. No es pot muntar %s. Demaneu a l'administrador del sistema que l'instal·li.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Nota:</b> El suport FTP per PHP no està activat o no està instal·lat. No es pot muntar %s. Demaneu a l'administrador del sistema que l'instal·li.", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Nota:</b> %s no està instal·lat. No es pot muntar %s. Demaneu a l'administrador del sistema que l'instal·li.", - "You don't have any external storages" : "No teniu emmagatzaments externs", "Name" : "Nom", "Storage type" : "Tipus d'emmagatzemament", "Scope" : "Abast", diff --git a/apps/files_external/l10n/cs_CZ.js b/apps/files_external/l10n/cs_CZ.js index 29af393cf07..59eace0010d 100644 --- a/apps/files_external/l10n/cs_CZ.js +++ b/apps/files_external/l10n/cs_CZ.js @@ -26,7 +26,7 @@ OC.L10N.register( "Host" : "Počítač", "Username" : "Uživatelské jméno", "Password" : "Heslo", - "Root" : "Kořen", + "Remote subfolder" : "Vzdálený podadresář", "Secure ftps://" : "Zabezpečené ftps://", "Client ID" : "Klientské ID", "Client secret" : "Klientské tajemství", @@ -43,7 +43,6 @@ OC.L10N.register( "Username as share" : "Uživatelské jméno jako sdílený adresář", "URL" : "URL", "Secure https://" : "Zabezpečené https://", - "Remote subfolder" : "Vzdálený podadresář", "Access granted" : "Přístup povolen", "Error configuring Dropbox storage" : "Chyba při nastavení úložiště Dropbox", "Grant access" : "Povolit přístup", @@ -54,11 +53,12 @@ OC.L10N.register( "(group)" : "(skupina)", "Saved" : "Uloženo", "<b>Note:</b> " : "<b>Poznámka:</b>", - " and " : "a", + "and" : "a", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Poznámka:</b> cURL podpora v PHP není povolena nebo nainstalována. Není možné připojení %s. Prosím požádejte svého správce systému ať ji nainstaluje.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Poznámka:</b> FTP podpora v PHP není povolena nebo nainstalována. Není možné připojení %s. Prosím požádejte svého správce systému ať ji nainstaluje.", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Poznámka:</b> \"%s\" není instalováno. Není možné připojení %s. Prosím požádejte svého správce systému o instalaci.", - "You don't have any external storages" : "Nemáte žádná externí úložiště", + "No external storages configured" : "Nejsou nakonfigurována žádná externí úložiště", + "You can configure external storages in the personal settings" : "Externí úložiště můžete spravovat v osobním nastavení", "Name" : "Název", "Storage type" : "Typ úložiště", "Scope" : "Rozsah", diff --git a/apps/files_external/l10n/cs_CZ.json b/apps/files_external/l10n/cs_CZ.json index f8acc7d469d..46bbed2a7c4 100644 --- a/apps/files_external/l10n/cs_CZ.json +++ b/apps/files_external/l10n/cs_CZ.json @@ -24,7 +24,7 @@ "Host" : "Počítač", "Username" : "Uživatelské jméno", "Password" : "Heslo", - "Root" : "Kořen", + "Remote subfolder" : "Vzdálený podadresář", "Secure ftps://" : "Zabezpečené ftps://", "Client ID" : "Klientské ID", "Client secret" : "Klientské tajemství", @@ -41,7 +41,6 @@ "Username as share" : "Uživatelské jméno jako sdílený adresář", "URL" : "URL", "Secure https://" : "Zabezpečené https://", - "Remote subfolder" : "Vzdálený podadresář", "Access granted" : "Přístup povolen", "Error configuring Dropbox storage" : "Chyba při nastavení úložiště Dropbox", "Grant access" : "Povolit přístup", @@ -52,11 +51,12 @@ "(group)" : "(skupina)", "Saved" : "Uloženo", "<b>Note:</b> " : "<b>Poznámka:</b>", - " and " : "a", + "and" : "a", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Poznámka:</b> cURL podpora v PHP není povolena nebo nainstalována. Není možné připojení %s. Prosím požádejte svého správce systému ať ji nainstaluje.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Poznámka:</b> FTP podpora v PHP není povolena nebo nainstalována. Není možné připojení %s. Prosím požádejte svého správce systému ať ji nainstaluje.", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Poznámka:</b> \"%s\" není instalováno. Není možné připojení %s. Prosím požádejte svého správce systému o instalaci.", - "You don't have any external storages" : "Nemáte žádná externí úložiště", + "No external storages configured" : "Nejsou nakonfigurována žádná externí úložiště", + "You can configure external storages in the personal settings" : "Externí úložiště můžete spravovat v osobním nastavení", "Name" : "Název", "Storage type" : "Typ úložiště", "Scope" : "Rozsah", diff --git a/apps/files_external/l10n/da.js b/apps/files_external/l10n/da.js index 5420917e2a9..05cdb974bd8 100644 --- a/apps/files_external/l10n/da.js +++ b/apps/files_external/l10n/da.js @@ -26,7 +26,7 @@ OC.L10N.register( "Host" : "Vært", "Username" : "Brugernavn", "Password" : "Kodeord", - "Root" : "Root", + "Remote subfolder" : "Fjernundermappe", "Secure ftps://" : "Sikker ftps://", "Client ID" : "Klient-ID", "Client secret" : "Klient hemmelighed", @@ -43,7 +43,6 @@ OC.L10N.register( "Username as share" : "Brugernavn som deling", "URL" : "URL", "Secure https://" : "Sikker https://", - "Remote subfolder" : "Fjernundermappe", "Access granted" : "Adgang godkendt", "Error configuring Dropbox storage" : "Fejl ved konfiguration af Dropbox plads", "Grant access" : "Godkend adgang", @@ -54,11 +53,12 @@ OC.L10N.register( "(group)" : "(gruppe)", "Saved" : "Gemt", "<b>Note:</b> " : "<b>Note:</b> ", - " and " : "og", + "and" : "og", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Bemærk:</b> cURL-understøttelsen i PHP er enten ikke aktiveret eller installeret. Monteringen af %s er ikke mulig. Anmod din systemadministrator om at installere det.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Bemærk:</b> FTP understøttelsen i PHP er enten ikke aktiveret eller installeret. Montering af %s er ikke muligt. Anmod din systemadministrator om at installere det.", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Bemærk:</b> \"%s\" er ikke installeret. Monteringen af %s er ikke mulig. Anmod din systemadministrator om at installere det.", - "You don't have any external storages" : "Du har ingen eksterne lagre", + "No external storages configured" : "Der er ikke konfigureret eksterne lagerenheder", + "You can configure external storages in the personal settings" : "Du kan konfigurere eksterne lagerenheder i de personlige indstillinger", "Name" : "Navn", "Storage type" : "Lagertype", "Scope" : "Anvendelsesområde", diff --git a/apps/files_external/l10n/da.json b/apps/files_external/l10n/da.json index d5c468a5d8e..9e56044050a 100644 --- a/apps/files_external/l10n/da.json +++ b/apps/files_external/l10n/da.json @@ -24,7 +24,7 @@ "Host" : "Vært", "Username" : "Brugernavn", "Password" : "Kodeord", - "Root" : "Root", + "Remote subfolder" : "Fjernundermappe", "Secure ftps://" : "Sikker ftps://", "Client ID" : "Klient-ID", "Client secret" : "Klient hemmelighed", @@ -41,7 +41,6 @@ "Username as share" : "Brugernavn som deling", "URL" : "URL", "Secure https://" : "Sikker https://", - "Remote subfolder" : "Fjernundermappe", "Access granted" : "Adgang godkendt", "Error configuring Dropbox storage" : "Fejl ved konfiguration af Dropbox plads", "Grant access" : "Godkend adgang", @@ -52,11 +51,12 @@ "(group)" : "(gruppe)", "Saved" : "Gemt", "<b>Note:</b> " : "<b>Note:</b> ", - " and " : "og", + "and" : "og", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Bemærk:</b> cURL-understøttelsen i PHP er enten ikke aktiveret eller installeret. Monteringen af %s er ikke mulig. Anmod din systemadministrator om at installere det.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Bemærk:</b> FTP understøttelsen i PHP er enten ikke aktiveret eller installeret. Montering af %s er ikke muligt. Anmod din systemadministrator om at installere det.", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Bemærk:</b> \"%s\" er ikke installeret. Monteringen af %s er ikke mulig. Anmod din systemadministrator om at installere det.", - "You don't have any external storages" : "Du har ingen eksterne lagre", + "No external storages configured" : "Der er ikke konfigureret eksterne lagerenheder", + "You can configure external storages in the personal settings" : "Du kan konfigurere eksterne lagerenheder i de personlige indstillinger", "Name" : "Navn", "Storage type" : "Lagertype", "Scope" : "Anvendelsesområde", diff --git a/apps/files_external/l10n/de.js b/apps/files_external/l10n/de.js index d67bda49b4d..4acabfe214a 100644 --- a/apps/files_external/l10n/de.js +++ b/apps/files_external/l10n/de.js @@ -1,8 +1,8 @@ OC.L10N.register( "files_external", { - "Fetching request tokens failed. Verify that your Dropbox app key and secret are correct." : "Anfrage-Token holen fehlgeschlagen. Stelle bitte sicher, dass der Anwendungsschlüssel und Sicherheitsschlüssel für Dropbox korrekt sind.", - "Fetching access tokens failed. Verify that your Dropbox app key and secret are correct." : "Zugriff-Token holen fehlgeschlagen. Stelle bitte sicher, dass der Anwendungsschlüssel und Sicherheitsschlüssel für Dropbox korrekt sind.", + "Fetching request tokens failed. Verify that your Dropbox app key and secret are correct." : "Abrufen des Anfrage-Tokens fehlgeschlagen. Stelle bitte sicher, dass der Anwendungsschlüssel und Sicherheitsschlüssel für Dropbox korrekt sind.", + "Fetching access tokens failed. Verify that your Dropbox app key and secret are correct." : "Abrufen des Zugriff-Tokens fehlgeschlagen. Stelle bitte sicher, dass der Anwendungsschlüssel und Sicherheitsschlüssel für Dropbox korrekt sind.", "Please provide a valid Dropbox app key and secret." : "Bitte trage einen gültigen Dropbox-App-Key mit Secret ein.", "Step 1 failed. Exception: %s" : "Schritt 1 fehlgeschlagen. Fehlermeldung: %s", "Step 2 failed. Exception: %s" : "Schritt 2 fehlgeschlagen. Fehlermeldung: %s", @@ -26,7 +26,7 @@ OC.L10N.register( "Host" : "Host", "Username" : "Benutzername", "Password" : "Passwort", - "Root" : "Root", + "Remote subfolder" : "Remote subfolder", "Secure ftps://" : "Sicherer FTPS://", "Client ID" : "Client-ID", "Client secret" : "Geheime Zeichenkette des Client", @@ -38,12 +38,11 @@ OC.L10N.register( "Service Name (required for OpenStack Object Storage)" : "Name der Dienstleistung (Erforderlich für Openstack-Objektspeicher)", "URL of identity endpoint (required for OpenStack Object Storage)" : "URL des Identitätsendpunktes (Erforderlich für Openstack-Objektspeicher)", "Timeout of HTTP requests in seconds" : "Zeitüberschreitung von HTTP-Anfragen in Sekunden", - "Share" : "Teilen", + "Share" : "Share", "SMB / CIFS using OC login" : "SMB / CIFS mit OC-Login", "Username as share" : "Benutzername als Freigabe", "URL" : "URL", "Secure https://" : "Sicherer HTTPS://", - "Remote subfolder" : "Remote-Unterordner:", "Access granted" : "Zugriff gestattet", "Error configuring Dropbox storage" : "Fehler beim Einrichten von Dropbox", "Grant access" : "Zugriff gestatten", @@ -54,11 +53,12 @@ OC.L10N.register( "(group)" : "(group)", "Saved" : "Gespeichert", "<b>Note:</b> " : "<b>Hinweis:</b> ", - " and " : "und", + "and" : "und", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Hinweis:</b> Die cURL-Unterstützung von PHP ist nicht aktiviert oder installiert. Das Hinzufügen von %s ist nicht möglich. Bitte wende Dich zur Installation an Deinen Systemadministrator.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Hinweis:</b> Die FTP Unterstützung von PHP ist nicht aktiviert oder installiert. Das Hinzufügen von %s ist nicht möglich. Bitte wende Dich sich zur Installation an Deinen Systemadministrator.", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Hinweis:</b> \"%s\" ist nicht installiert. Das Hinzufügen von %s ist nicht möglich. Bitte wende Dich sich zur Installation an Deinen Systemadministrator.", - "You don't have any external storages" : "Du hast noch keinen externen Speicher", + "No external storages configured" : "Keine externen Speicher konfiguriert", + "You can configure external storages in the personal settings" : "Du kannst externe Speicher in den persönlichen Einstellungen konfigurieren", "Name" : "Name", "Storage type" : "Du hast noch keinen externen Speicher", "Scope" : "Anwendungsbereich", diff --git a/apps/files_external/l10n/de.json b/apps/files_external/l10n/de.json index fb4467cc1f2..17c31921196 100644 --- a/apps/files_external/l10n/de.json +++ b/apps/files_external/l10n/de.json @@ -1,6 +1,6 @@ { "translations": { - "Fetching request tokens failed. Verify that your Dropbox app key and secret are correct." : "Anfrage-Token holen fehlgeschlagen. Stelle bitte sicher, dass der Anwendungsschlüssel und Sicherheitsschlüssel für Dropbox korrekt sind.", - "Fetching access tokens failed. Verify that your Dropbox app key and secret are correct." : "Zugriff-Token holen fehlgeschlagen. Stelle bitte sicher, dass der Anwendungsschlüssel und Sicherheitsschlüssel für Dropbox korrekt sind.", + "Fetching request tokens failed. Verify that your Dropbox app key and secret are correct." : "Abrufen des Anfrage-Tokens fehlgeschlagen. Stelle bitte sicher, dass der Anwendungsschlüssel und Sicherheitsschlüssel für Dropbox korrekt sind.", + "Fetching access tokens failed. Verify that your Dropbox app key and secret are correct." : "Abrufen des Zugriff-Tokens fehlgeschlagen. Stelle bitte sicher, dass der Anwendungsschlüssel und Sicherheitsschlüssel für Dropbox korrekt sind.", "Please provide a valid Dropbox app key and secret." : "Bitte trage einen gültigen Dropbox-App-Key mit Secret ein.", "Step 1 failed. Exception: %s" : "Schritt 1 fehlgeschlagen. Fehlermeldung: %s", "Step 2 failed. Exception: %s" : "Schritt 2 fehlgeschlagen. Fehlermeldung: %s", @@ -24,7 +24,7 @@ "Host" : "Host", "Username" : "Benutzername", "Password" : "Passwort", - "Root" : "Root", + "Remote subfolder" : "Remote subfolder", "Secure ftps://" : "Sicherer FTPS://", "Client ID" : "Client-ID", "Client secret" : "Geheime Zeichenkette des Client", @@ -36,12 +36,11 @@ "Service Name (required for OpenStack Object Storage)" : "Name der Dienstleistung (Erforderlich für Openstack-Objektspeicher)", "URL of identity endpoint (required for OpenStack Object Storage)" : "URL des Identitätsendpunktes (Erforderlich für Openstack-Objektspeicher)", "Timeout of HTTP requests in seconds" : "Zeitüberschreitung von HTTP-Anfragen in Sekunden", - "Share" : "Teilen", + "Share" : "Share", "SMB / CIFS using OC login" : "SMB / CIFS mit OC-Login", "Username as share" : "Benutzername als Freigabe", "URL" : "URL", "Secure https://" : "Sicherer HTTPS://", - "Remote subfolder" : "Remote-Unterordner:", "Access granted" : "Zugriff gestattet", "Error configuring Dropbox storage" : "Fehler beim Einrichten von Dropbox", "Grant access" : "Zugriff gestatten", @@ -52,11 +51,12 @@ "(group)" : "(group)", "Saved" : "Gespeichert", "<b>Note:</b> " : "<b>Hinweis:</b> ", - " and " : "und", + "and" : "und", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Hinweis:</b> Die cURL-Unterstützung von PHP ist nicht aktiviert oder installiert. Das Hinzufügen von %s ist nicht möglich. Bitte wende Dich zur Installation an Deinen Systemadministrator.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Hinweis:</b> Die FTP Unterstützung von PHP ist nicht aktiviert oder installiert. Das Hinzufügen von %s ist nicht möglich. Bitte wende Dich sich zur Installation an Deinen Systemadministrator.", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Hinweis:</b> \"%s\" ist nicht installiert. Das Hinzufügen von %s ist nicht möglich. Bitte wende Dich sich zur Installation an Deinen Systemadministrator.", - "You don't have any external storages" : "Du hast noch keinen externen Speicher", + "No external storages configured" : "Keine externen Speicher konfiguriert", + "You can configure external storages in the personal settings" : "Du kannst externe Speicher in den persönlichen Einstellungen konfigurieren", "Name" : "Name", "Storage type" : "Du hast noch keinen externen Speicher", "Scope" : "Anwendungsbereich", diff --git a/apps/files_external/l10n/de_DE.js b/apps/files_external/l10n/de_DE.js index d12b171f639..11a9a41aaa8 100644 --- a/apps/files_external/l10n/de_DE.js +++ b/apps/files_external/l10n/de_DE.js @@ -1,8 +1,8 @@ OC.L10N.register( "files_external", { - "Fetching request tokens failed. Verify that your Dropbox app key and secret are correct." : "Anfrage-Token holen fehlgeschlagen. Stellen Sie sicher, dass der Anwendungsschlüssel und Sicherheitsschlüssel für Dropbox korrekt sind.", - "Fetching access tokens failed. Verify that your Dropbox app key and secret are correct." : "Zugriff-Token holen fehlgeschlagen. Stellen Sie sicher, dass der Anwendungsschlüssel und Sicherheitsschlüssel für Dropbox korrekt sind.", + "Fetching request tokens failed. Verify that your Dropbox app key and secret are correct." : "Abrufen des Anfrage-Tokens fehlgeschlagen. Stellen Sie sicher, dass der Anwendungsschlüssel und Sicherheitsschlüssel für Dropbox korrekt sind.", + "Fetching access tokens failed. Verify that your Dropbox app key and secret are correct." : "Abrufen des Zugriff-Tokens fehlgeschlagen. Stellen Sie sicher, dass der Anwendungsschlüssel und Sicherheitsschlüssel für Dropbox korrekt sind.", "Please provide a valid Dropbox app key and secret." : "Bitte tragen Sie einen gültigen Dropbox-App-Key mit Secret ein.", "Step 1 failed. Exception: %s" : "Schritt 1 fehlgeschlagen. Fehlermeldung: %s", "Step 2 failed. Exception: %s" : "Schritt 2 fehlgeschlagen. Fehlermeldung: %s", @@ -26,7 +26,7 @@ OC.L10N.register( "Host" : "Host", "Username" : "Benutzername", "Password" : "Passwort", - "Root" : "Root", + "Remote subfolder" : "Entfernter Unterordner:", "Secure ftps://" : "Sicherer FTPS://", "Client ID" : "Client-ID", "Client secret" : "Geheime Zeichenkette des Client", @@ -43,7 +43,6 @@ OC.L10N.register( "Username as share" : "Benutzername als Freigabe", "URL" : "Adresse", "Secure https://" : "Sicherer HTTPS://", - "Remote subfolder" : "Entfernter Unterordner:", "Access granted" : "Zugriff gestattet", "Error configuring Dropbox storage" : "Fehler beim Einrichten von Dropbox", "Grant access" : "Zugriff gestatten", @@ -54,11 +53,12 @@ OC.L10N.register( "(group)" : "(group)", "Saved" : "Gespeichert", "<b>Note:</b> " : "<b>Hinweis:</b> ", - " and " : "und", + "and" : "und", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Hinweis:</b> Die cURL-Unterstützung von PHP ist nicht aktiviert oder installiert. Das Hinzufügen von %s ist nicht möglich. Bitte wenden Sie sich zur Installation an Ihren Systemadministrator.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Hinweis:</b> Die FTP Unterstützung von PHP ist nicht aktiviert oder installiert. Das Hinzufügen von %s ist nicht möglich. Bitte wenden Sie sich zur Installation an Ihren Systemadministrator.", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Hinweis:</b> \"%s\" ist nicht installiert. Das Hinzufügen von %s ist nicht möglich. Bitte wenden Sie sich zur Installation an Ihren Systemadministrator.", - "You don't have any external storages" : "Sie haben noch keinen externen Speicher", + "No external storages configured" : "Keine externen Speicher konfiguriert", + "You can configure external storages in the personal settings" : "Sie können externe Speicher in den persönlichen Einstellungen konfigurieren", "Name" : "Name", "Storage type" : "Speichertyp", "Scope" : "Anwendungsbereich", diff --git a/apps/files_external/l10n/de_DE.json b/apps/files_external/l10n/de_DE.json index 43c24e0c94a..a530df9ed5f 100644 --- a/apps/files_external/l10n/de_DE.json +++ b/apps/files_external/l10n/de_DE.json @@ -1,6 +1,6 @@ { "translations": { - "Fetching request tokens failed. Verify that your Dropbox app key and secret are correct." : "Anfrage-Token holen fehlgeschlagen. Stellen Sie sicher, dass der Anwendungsschlüssel und Sicherheitsschlüssel für Dropbox korrekt sind.", - "Fetching access tokens failed. Verify that your Dropbox app key and secret are correct." : "Zugriff-Token holen fehlgeschlagen. Stellen Sie sicher, dass der Anwendungsschlüssel und Sicherheitsschlüssel für Dropbox korrekt sind.", + "Fetching request tokens failed. Verify that your Dropbox app key and secret are correct." : "Abrufen des Anfrage-Tokens fehlgeschlagen. Stellen Sie sicher, dass der Anwendungsschlüssel und Sicherheitsschlüssel für Dropbox korrekt sind.", + "Fetching access tokens failed. Verify that your Dropbox app key and secret are correct." : "Abrufen des Zugriff-Tokens fehlgeschlagen. Stellen Sie sicher, dass der Anwendungsschlüssel und Sicherheitsschlüssel für Dropbox korrekt sind.", "Please provide a valid Dropbox app key and secret." : "Bitte tragen Sie einen gültigen Dropbox-App-Key mit Secret ein.", "Step 1 failed. Exception: %s" : "Schritt 1 fehlgeschlagen. Fehlermeldung: %s", "Step 2 failed. Exception: %s" : "Schritt 2 fehlgeschlagen. Fehlermeldung: %s", @@ -24,7 +24,7 @@ "Host" : "Host", "Username" : "Benutzername", "Password" : "Passwort", - "Root" : "Root", + "Remote subfolder" : "Entfernter Unterordner:", "Secure ftps://" : "Sicherer FTPS://", "Client ID" : "Client-ID", "Client secret" : "Geheime Zeichenkette des Client", @@ -41,7 +41,6 @@ "Username as share" : "Benutzername als Freigabe", "URL" : "Adresse", "Secure https://" : "Sicherer HTTPS://", - "Remote subfolder" : "Entfernter Unterordner:", "Access granted" : "Zugriff gestattet", "Error configuring Dropbox storage" : "Fehler beim Einrichten von Dropbox", "Grant access" : "Zugriff gestatten", @@ -52,11 +51,12 @@ "(group)" : "(group)", "Saved" : "Gespeichert", "<b>Note:</b> " : "<b>Hinweis:</b> ", - " and " : "und", + "and" : "und", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Hinweis:</b> Die cURL-Unterstützung von PHP ist nicht aktiviert oder installiert. Das Hinzufügen von %s ist nicht möglich. Bitte wenden Sie sich zur Installation an Ihren Systemadministrator.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Hinweis:</b> Die FTP Unterstützung von PHP ist nicht aktiviert oder installiert. Das Hinzufügen von %s ist nicht möglich. Bitte wenden Sie sich zur Installation an Ihren Systemadministrator.", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Hinweis:</b> \"%s\" ist nicht installiert. Das Hinzufügen von %s ist nicht möglich. Bitte wenden Sie sich zur Installation an Ihren Systemadministrator.", - "You don't have any external storages" : "Sie haben noch keinen externen Speicher", + "No external storages configured" : "Keine externen Speicher konfiguriert", + "You can configure external storages in the personal settings" : "Sie können externe Speicher in den persönlichen Einstellungen konfigurieren", "Name" : "Name", "Storage type" : "Speichertyp", "Scope" : "Anwendungsbereich", diff --git a/apps/files_external/l10n/el.js b/apps/files_external/l10n/el.js index 28105a01d6b..ba31abd802f 100644 --- a/apps/files_external/l10n/el.js +++ b/apps/files_external/l10n/el.js @@ -26,7 +26,7 @@ OC.L10N.register( "Host" : "Διακομιστής", "Username" : "Όνομα χρήστη", "Password" : "Κωδικός πρόσβασης", - "Root" : "Root", + "Remote subfolder" : "Απομακρυσμένος υποφάκελος", "Secure ftps://" : "Ασφαλής ftps://", "Client ID" : "ID πελάτη", "Client secret" : "Μυστικό πελάτη", @@ -43,7 +43,6 @@ OC.L10N.register( "Username as share" : "Όνομα χρήστη ως διαμοιραζόμενος φάκελος", "URL" : "URL", "Secure https://" : "Ασφαλής σύνδεση https://", - "Remote subfolder" : "Απομακρυσμένος υποφάκελος", "Access granted" : "Πρόσβαση παρασχέθηκε", "Error configuring Dropbox storage" : "Σφάλμα ρυθμίζωντας αποθήκευση Dropbox ", "Grant access" : "Παροχή πρόσβασης", @@ -54,11 +53,10 @@ OC.L10N.register( "(group)" : "(ομάδα)", "Saved" : "Αποθηκεύτηκαν", "<b>Note:</b> " : "<b>Σημείωση:</b> ", - " and " : "και", + "and" : "και", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Σημείωση:</b> Η υποστήριξη cURL στην PHP δεν είναι ενεργοποιημένη ή εγκατεστημένη. Η προσάρτηση του %s δεν είναι δυνατή. Παρακαλώ ζητήστε από τον διαχειριστή συστημάτων σας να την εγκαταστήσει.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Σημείωση:</b> Η υποστήριξη FTP στην PHP δεν είναι ενεργοποιημένη ή εγκατεστημένη. Δεν είναι δυνατή η προσάρτηση του %s. Παρακαλώ ζητήστε από τον διαχειριστή συστημάτων σας να την εγκαταστήσει.", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Σημείωση:</b> Η επέκταση \"%s\" δεν είναι εγκατεστημένη. Δεν είναι δυνατή η προσάρτηση %s. Παρακαλώ ζητήστε από τον διαχειριστή συστημάτων σας να την εγκαταστήσει.", - "You don't have any external storages" : "Δεν έχετε κανέναν εξωτερικό αποθηκευτικό χώρο", "Name" : "Όνομα", "Storage type" : "Τύπος αποθηκευτικού χώρου", "Scope" : "Εύρος", diff --git a/apps/files_external/l10n/el.json b/apps/files_external/l10n/el.json index 4be10506a02..322949e30a1 100644 --- a/apps/files_external/l10n/el.json +++ b/apps/files_external/l10n/el.json @@ -24,7 +24,7 @@ "Host" : "Διακομιστής", "Username" : "Όνομα χρήστη", "Password" : "Κωδικός πρόσβασης", - "Root" : "Root", + "Remote subfolder" : "Απομακρυσμένος υποφάκελος", "Secure ftps://" : "Ασφαλής ftps://", "Client ID" : "ID πελάτη", "Client secret" : "Μυστικό πελάτη", @@ -41,7 +41,6 @@ "Username as share" : "Όνομα χρήστη ως διαμοιραζόμενος φάκελος", "URL" : "URL", "Secure https://" : "Ασφαλής σύνδεση https://", - "Remote subfolder" : "Απομακρυσμένος υποφάκελος", "Access granted" : "Πρόσβαση παρασχέθηκε", "Error configuring Dropbox storage" : "Σφάλμα ρυθμίζωντας αποθήκευση Dropbox ", "Grant access" : "Παροχή πρόσβασης", @@ -52,11 +51,10 @@ "(group)" : "(ομάδα)", "Saved" : "Αποθηκεύτηκαν", "<b>Note:</b> " : "<b>Σημείωση:</b> ", - " and " : "και", + "and" : "και", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Σημείωση:</b> Η υποστήριξη cURL στην PHP δεν είναι ενεργοποιημένη ή εγκατεστημένη. Η προσάρτηση του %s δεν είναι δυνατή. Παρακαλώ ζητήστε από τον διαχειριστή συστημάτων σας να την εγκαταστήσει.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Σημείωση:</b> Η υποστήριξη FTP στην PHP δεν είναι ενεργοποιημένη ή εγκατεστημένη. Δεν είναι δυνατή η προσάρτηση του %s. Παρακαλώ ζητήστε από τον διαχειριστή συστημάτων σας να την εγκαταστήσει.", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Σημείωση:</b> Η επέκταση \"%s\" δεν είναι εγκατεστημένη. Δεν είναι δυνατή η προσάρτηση %s. Παρακαλώ ζητήστε από τον διαχειριστή συστημάτων σας να την εγκαταστήσει.", - "You don't have any external storages" : "Δεν έχετε κανέναν εξωτερικό αποθηκευτικό χώρο", "Name" : "Όνομα", "Storage type" : "Τύπος αποθηκευτικού χώρου", "Scope" : "Εύρος", diff --git a/apps/files_external/l10n/en_GB.js b/apps/files_external/l10n/en_GB.js index 9f97d2c488c..123bf7242c7 100644 --- a/apps/files_external/l10n/en_GB.js +++ b/apps/files_external/l10n/en_GB.js @@ -26,7 +26,7 @@ OC.L10N.register( "Host" : "Host", "Username" : "Username", "Password" : "Password", - "Root" : "Root", + "Remote subfolder" : "Remote subfolder", "Secure ftps://" : "Secure ftps://", "Client ID" : "Client ID", "Client secret" : "Client secret", @@ -43,7 +43,6 @@ OC.L10N.register( "Username as share" : "Username as share", "URL" : "URL", "Secure https://" : "Secure https://", - "Remote subfolder" : "Remote subfolder", "Access granted" : "Access granted", "Error configuring Dropbox storage" : "Error configuring Dropbox storage", "Grant access" : "Grant access", @@ -54,11 +53,12 @@ OC.L10N.register( "(group)" : "(group)", "Saved" : "Saved", "<b>Note:</b> " : "<b>Note:</b> ", - " and " : " and ", + "and" : "and", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it.", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it.", - "You don't have any external storages" : "You don't have any external storage", + "No external storages configured" : "No external storage configured", + "You can configure external storages in the personal settings" : "You can configure external storage in the personal settings", "Name" : "Name", "Storage type" : "Storage type", "Scope" : "Scope", diff --git a/apps/files_external/l10n/en_GB.json b/apps/files_external/l10n/en_GB.json index d4e7ad11bbe..685955577db 100644 --- a/apps/files_external/l10n/en_GB.json +++ b/apps/files_external/l10n/en_GB.json @@ -24,7 +24,7 @@ "Host" : "Host", "Username" : "Username", "Password" : "Password", - "Root" : "Root", + "Remote subfolder" : "Remote subfolder", "Secure ftps://" : "Secure ftps://", "Client ID" : "Client ID", "Client secret" : "Client secret", @@ -41,7 +41,6 @@ "Username as share" : "Username as share", "URL" : "URL", "Secure https://" : "Secure https://", - "Remote subfolder" : "Remote subfolder", "Access granted" : "Access granted", "Error configuring Dropbox storage" : "Error configuring Dropbox storage", "Grant access" : "Grant access", @@ -52,11 +51,12 @@ "(group)" : "(group)", "Saved" : "Saved", "<b>Note:</b> " : "<b>Note:</b> ", - " and " : " and ", + "and" : "and", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it.", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it.", - "You don't have any external storages" : "You don't have any external storage", + "No external storages configured" : "No external storage configured", + "You can configure external storages in the personal settings" : "You can configure external storage in the personal settings", "Name" : "Name", "Storage type" : "Storage type", "Scope" : "Scope", diff --git a/apps/files_external/l10n/eo.js b/apps/files_external/l10n/eo.js index 1d5014cdf23..4eb13bb55e9 100644 --- a/apps/files_external/l10n/eo.js +++ b/apps/files_external/l10n/eo.js @@ -18,7 +18,7 @@ OC.L10N.register( "Host" : "Gastigo", "Username" : "Uzantonomo", "Password" : "Pasvorto", - "Root" : "Radiko", + "Remote subfolder" : "Malloka subdosierujo", "Secure ftps://" : "Sekura ftps://", "Client ID" : "Klientidentigilo", "Client secret" : "Klientosekreto", @@ -30,7 +30,6 @@ OC.L10N.register( "Share" : "Kunhavigi", "URL" : "URL", "Secure https://" : "Sekura https://", - "Remote subfolder" : "Malloka subdosierujo", "Access granted" : "Alirpermeso donita", "Error configuring Dropbox storage" : "Eraro dum agordado de la memorservo Dropbox", "Grant access" : "Doni alirpermeson", @@ -38,7 +37,6 @@ OC.L10N.register( "Personal" : "Persona", "Saved" : "Konservita", "<b>Note:</b> " : "<b>Noto:</b>", - " and " : "kaj", "Name" : "Nomo", "External Storage" : "Malena memorilo", "Folder name" : "Dosierujnomo", diff --git a/apps/files_external/l10n/eo.json b/apps/files_external/l10n/eo.json index cf63614fb88..2f31fb24214 100644 --- a/apps/files_external/l10n/eo.json +++ b/apps/files_external/l10n/eo.json @@ -16,7 +16,7 @@ "Host" : "Gastigo", "Username" : "Uzantonomo", "Password" : "Pasvorto", - "Root" : "Radiko", + "Remote subfolder" : "Malloka subdosierujo", "Secure ftps://" : "Sekura ftps://", "Client ID" : "Klientidentigilo", "Client secret" : "Klientosekreto", @@ -28,7 +28,6 @@ "Share" : "Kunhavigi", "URL" : "URL", "Secure https://" : "Sekura https://", - "Remote subfolder" : "Malloka subdosierujo", "Access granted" : "Alirpermeso donita", "Error configuring Dropbox storage" : "Eraro dum agordado de la memorservo Dropbox", "Grant access" : "Doni alirpermeson", @@ -36,7 +35,6 @@ "Personal" : "Persona", "Saved" : "Konservita", "<b>Note:</b> " : "<b>Noto:</b>", - " and " : "kaj", "Name" : "Nomo", "External Storage" : "Malena memorilo", "Folder name" : "Dosierujnomo", diff --git a/apps/files_external/l10n/es.js b/apps/files_external/l10n/es.js index 9306558b346..f91509a74da 100644 --- a/apps/files_external/l10n/es.js +++ b/apps/files_external/l10n/es.js @@ -1,8 +1,8 @@ OC.L10N.register( "files_external", { - "Fetching request tokens failed. Verify that your Dropbox app key and secret are correct." : "La descarga de los tokens solicitados ha fallado. Verifique que la llave y el secreto de su app Dropbox es correcta.", - "Fetching access tokens failed. Verify that your Dropbox app key and secret are correct." : "La descarga de los tokens de acceso ha fallado. Verifique que la llave y el secreto de su app Dropbox es correcta.", + "Fetching request tokens failed. Verify that your Dropbox app key and secret are correct." : "La descarga de los tokens solicitados ha fallado. Verifique que la clave y el secreto de su app Dropbox es correcta.", + "Fetching access tokens failed. Verify that your Dropbox app key and secret are correct." : "La descarga de los tokens de acceso ha fallado. Verifique que la clave y el secreto de su app Dropbox es correcta.", "Please provide a valid Dropbox app key and secret." : "Por favor, proporcione un una clave válida de la app Dropbox y una clave secreta.", "Step 1 failed. Exception: %s" : "El paso 1 falló. Excepción: %s", "Step 2 failed. Exception: %s" : "El paso 2 falló. Excepción: %s", @@ -26,7 +26,7 @@ OC.L10N.register( "Host" : "Servidor", "Username" : "Nombre de usuario", "Password" : "Contraseña", - "Root" : "Raíz", + "Remote subfolder" : "Subcarpeta remota", "Secure ftps://" : "Secure ftps://", "Client ID" : "ID de Cliente", "Client secret" : "Cliente secreto", @@ -43,7 +43,6 @@ OC.L10N.register( "Username as share" : "Nombre de Usuario como compartir", "URL" : "URL", "Secure https://" : "Secure https://", - "Remote subfolder" : "Subcarpeta remota", "Access granted" : "Acceso concedido", "Error configuring Dropbox storage" : "Error configurando el almacenamiento de Dropbox", "Grant access" : "Conceder acceso", @@ -54,11 +53,12 @@ OC.L10N.register( "(group)" : "(grupo)", "Saved" : "Guardado", "<b>Note:</b> " : "<b>Nota:</b> ", - " and " : "y", + "and" : "y", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Nota:</b> El soporte de cURL en PHP no está activado o instalado. No se puede montar %s. Pídale al administrador de sistema que lo instale.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Nota:</b> El soporte de FTP en PHP no está activado o instalado. No se puede montar %s. Pídale al administrador de sistema que lo instale.", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Nota:</b> \"%s\" no está instalado. No se puede montar %s. Pídale al administrador de sistema que lo instale.", - "You don't have any external storages" : "Usted no tiene ningún almacenamiento externo", + "No external storages configured" : "No hay almacenamientos externos configurados", + "You can configure external storages in the personal settings" : "Puede configurar almacenamientos externos en su configuración personal", "Name" : "Nombre", "Storage type" : "Tipo de almacenamiento", "Scope" : "Ámbito", diff --git a/apps/files_external/l10n/es.json b/apps/files_external/l10n/es.json index 1d9067106eb..4f2c206da8e 100644 --- a/apps/files_external/l10n/es.json +++ b/apps/files_external/l10n/es.json @@ -1,6 +1,6 @@ { "translations": { - "Fetching request tokens failed. Verify that your Dropbox app key and secret are correct." : "La descarga de los tokens solicitados ha fallado. Verifique que la llave y el secreto de su app Dropbox es correcta.", - "Fetching access tokens failed. Verify that your Dropbox app key and secret are correct." : "La descarga de los tokens de acceso ha fallado. Verifique que la llave y el secreto de su app Dropbox es correcta.", + "Fetching request tokens failed. Verify that your Dropbox app key and secret are correct." : "La descarga de los tokens solicitados ha fallado. Verifique que la clave y el secreto de su app Dropbox es correcta.", + "Fetching access tokens failed. Verify that your Dropbox app key and secret are correct." : "La descarga de los tokens de acceso ha fallado. Verifique que la clave y el secreto de su app Dropbox es correcta.", "Please provide a valid Dropbox app key and secret." : "Por favor, proporcione un una clave válida de la app Dropbox y una clave secreta.", "Step 1 failed. Exception: %s" : "El paso 1 falló. Excepción: %s", "Step 2 failed. Exception: %s" : "El paso 2 falló. Excepción: %s", @@ -24,7 +24,7 @@ "Host" : "Servidor", "Username" : "Nombre de usuario", "Password" : "Contraseña", - "Root" : "Raíz", + "Remote subfolder" : "Subcarpeta remota", "Secure ftps://" : "Secure ftps://", "Client ID" : "ID de Cliente", "Client secret" : "Cliente secreto", @@ -41,7 +41,6 @@ "Username as share" : "Nombre de Usuario como compartir", "URL" : "URL", "Secure https://" : "Secure https://", - "Remote subfolder" : "Subcarpeta remota", "Access granted" : "Acceso concedido", "Error configuring Dropbox storage" : "Error configurando el almacenamiento de Dropbox", "Grant access" : "Conceder acceso", @@ -52,11 +51,12 @@ "(group)" : "(grupo)", "Saved" : "Guardado", "<b>Note:</b> " : "<b>Nota:</b> ", - " and " : "y", + "and" : "y", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Nota:</b> El soporte de cURL en PHP no está activado o instalado. No se puede montar %s. Pídale al administrador de sistema que lo instale.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Nota:</b> El soporte de FTP en PHP no está activado o instalado. No se puede montar %s. Pídale al administrador de sistema que lo instale.", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Nota:</b> \"%s\" no está instalado. No se puede montar %s. Pídale al administrador de sistema que lo instale.", - "You don't have any external storages" : "Usted no tiene ningún almacenamiento externo", + "No external storages configured" : "No hay almacenamientos externos configurados", + "You can configure external storages in the personal settings" : "Puede configurar almacenamientos externos en su configuración personal", "Name" : "Nombre", "Storage type" : "Tipo de almacenamiento", "Scope" : "Ámbito", diff --git a/apps/files_external/l10n/et_EE.js b/apps/files_external/l10n/et_EE.js index 226190cb5f8..07bdfa7cdd3 100644 --- a/apps/files_external/l10n/et_EE.js +++ b/apps/files_external/l10n/et_EE.js @@ -26,7 +26,7 @@ OC.L10N.register( "Host" : "Host", "Username" : "Kasutajanimi", "Password" : "Parool", - "Root" : "Juur", + "Remote subfolder" : "Mujahl olev alamkaust", "Secure ftps://" : "Turvaline ftps://", "Client ID" : "Kliendi ID", "Client secret" : "Kliendi salasõna", @@ -43,7 +43,6 @@ OC.L10N.register( "Username as share" : "Kasutajanimi kui jagamine", "URL" : "URL", "Secure https://" : "Turvaline https://", - "Remote subfolder" : "Mujahl olev alamkaust", "Access granted" : "Ligipääs on antud", "Error configuring Dropbox storage" : "Viga Dropboxi salvestusruumi seadistamisel", "Grant access" : "Anna ligipääs", @@ -54,11 +53,9 @@ OC.L10N.register( "(group)" : "(grupp)", "Saved" : "Salvestatud", "<b>Note:</b> " : "<b>Märkus:</b>", - " and " : "ja", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Märkus:</b> cURL tugi puudub PHP paigalduses. FTP %s hoidla ühendamine pole võimalik. Palu oma süsteemihalduril paigaldata cURL tugi.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Märkus:</b> FTP tugi puudub PHP paigalduses. FTP %s hoidla ühendamine pole võimalik. Palu oma süsteemihalduril paigaldata FTP tugi.", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Märkus:</b> \"%s\" pole paigaldatud. Hoidla %s ühendamine pole võimalik. Palu oma süsteemihalduril paigaldata vajalik tugi.", - "You don't have any external storages" : "Sul pole ühtegi välist andmehoidlat", "Name" : "Nimi", "Storage type" : "Andmehoidla tüüp", "Scope" : "Skoop", diff --git a/apps/files_external/l10n/et_EE.json b/apps/files_external/l10n/et_EE.json index a32eca9e8c2..11592f9e9a7 100644 --- a/apps/files_external/l10n/et_EE.json +++ b/apps/files_external/l10n/et_EE.json @@ -24,7 +24,7 @@ "Host" : "Host", "Username" : "Kasutajanimi", "Password" : "Parool", - "Root" : "Juur", + "Remote subfolder" : "Mujahl olev alamkaust", "Secure ftps://" : "Turvaline ftps://", "Client ID" : "Kliendi ID", "Client secret" : "Kliendi salasõna", @@ -41,7 +41,6 @@ "Username as share" : "Kasutajanimi kui jagamine", "URL" : "URL", "Secure https://" : "Turvaline https://", - "Remote subfolder" : "Mujahl olev alamkaust", "Access granted" : "Ligipääs on antud", "Error configuring Dropbox storage" : "Viga Dropboxi salvestusruumi seadistamisel", "Grant access" : "Anna ligipääs", @@ -52,11 +51,9 @@ "(group)" : "(grupp)", "Saved" : "Salvestatud", "<b>Note:</b> " : "<b>Märkus:</b>", - " and " : "ja", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Märkus:</b> cURL tugi puudub PHP paigalduses. FTP %s hoidla ühendamine pole võimalik. Palu oma süsteemihalduril paigaldata cURL tugi.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Märkus:</b> FTP tugi puudub PHP paigalduses. FTP %s hoidla ühendamine pole võimalik. Palu oma süsteemihalduril paigaldata FTP tugi.", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Märkus:</b> \"%s\" pole paigaldatud. Hoidla %s ühendamine pole võimalik. Palu oma süsteemihalduril paigaldata vajalik tugi.", - "You don't have any external storages" : "Sul pole ühtegi välist andmehoidlat", "Name" : "Nimi", "Storage type" : "Andmehoidla tüüp", "Scope" : "Skoop", diff --git a/apps/files_external/l10n/eu.js b/apps/files_external/l10n/eu.js index db535359491..8da8ca68263 100644 --- a/apps/files_external/l10n/eu.js +++ b/apps/files_external/l10n/eu.js @@ -25,7 +25,7 @@ OC.L10N.register( "Host" : "Ostalaria", "Username" : "Erabiltzaile izena", "Password" : "Pasahitza", - "Root" : "Erroa", + "Remote subfolder" : "Urruneko azpikarpeta", "Secure ftps://" : "ftps:// segurua", "Client ID" : "Bezero ID", "Client secret" : "Bezeroaren Sekretua", @@ -42,7 +42,6 @@ OC.L10N.register( "Username as share" : "Erabiltzaile izena elkarbanaketa bezala", "URL" : "URL", "Secure https://" : "https:// segurua", - "Remote subfolder" : "Urruneko azpikarpeta", "Access granted" : "Sarrera baimendua", "Error configuring Dropbox storage" : "Errore bat egon da Dropbox biltegiratzea konfiguratzean", "Grant access" : "Baimendu sarrera", @@ -53,11 +52,9 @@ OC.L10N.register( "(group)" : "(taldea)", "Saved" : "Gordeta", "<b>Note:</b> " : "<b>Oharra:</b>", - " and " : "eta", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Oharra:</b> :PHPko cURL euskarria ez dago instalatuta edo gaitua. Ezinezko da %s muntatzea. Mesedez eskatu sistema administratzaleari instala dezan. ", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Oharra:</b> :PHPko FTP euskarria ez dago instalatuta edo gaitua. Ezinezko da %s muntatzea. Mesedez eskatu sistema administratzaleari instala dezan. ", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Oharra:</b>\"%s\" euskarria ez dago instalatuta Ezinezko da %s muntatzea. Mesedez eskatu sistema administratzaleari instala dezan. ", - "You don't have any external storages" : "Ez duzu kanpoko biltegiratzerik", "Name" : "Izena", "Storage type" : "Biltegiratze mota", "External Storage" : "Kanpoko biltegiratzea", diff --git a/apps/files_external/l10n/eu.json b/apps/files_external/l10n/eu.json index a5c642bd772..7ae84c8dbd3 100644 --- a/apps/files_external/l10n/eu.json +++ b/apps/files_external/l10n/eu.json @@ -23,7 +23,7 @@ "Host" : "Ostalaria", "Username" : "Erabiltzaile izena", "Password" : "Pasahitza", - "Root" : "Erroa", + "Remote subfolder" : "Urruneko azpikarpeta", "Secure ftps://" : "ftps:// segurua", "Client ID" : "Bezero ID", "Client secret" : "Bezeroaren Sekretua", @@ -40,7 +40,6 @@ "Username as share" : "Erabiltzaile izena elkarbanaketa bezala", "URL" : "URL", "Secure https://" : "https:// segurua", - "Remote subfolder" : "Urruneko azpikarpeta", "Access granted" : "Sarrera baimendua", "Error configuring Dropbox storage" : "Errore bat egon da Dropbox biltegiratzea konfiguratzean", "Grant access" : "Baimendu sarrera", @@ -51,11 +50,9 @@ "(group)" : "(taldea)", "Saved" : "Gordeta", "<b>Note:</b> " : "<b>Oharra:</b>", - " and " : "eta", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Oharra:</b> :PHPko cURL euskarria ez dago instalatuta edo gaitua. Ezinezko da %s muntatzea. Mesedez eskatu sistema administratzaleari instala dezan. ", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Oharra:</b> :PHPko FTP euskarria ez dago instalatuta edo gaitua. Ezinezko da %s muntatzea. Mesedez eskatu sistema administratzaleari instala dezan. ", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Oharra:</b>\"%s\" euskarria ez dago instalatuta Ezinezko da %s muntatzea. Mesedez eskatu sistema administratzaleari instala dezan. ", - "You don't have any external storages" : "Ez duzu kanpoko biltegiratzerik", "Name" : "Izena", "Storage type" : "Biltegiratze mota", "External Storage" : "Kanpoko biltegiratzea", diff --git a/apps/files_external/l10n/fi.js b/apps/files_external/l10n/fi.js new file mode 100644 index 00000000000..eaa9b89fc04 --- /dev/null +++ b/apps/files_external/l10n/fi.js @@ -0,0 +1,9 @@ +OC.L10N.register( + "files_external", + { + "Username" : "Käyttäjätunnus", + "Password" : "Salasana", + "URL" : "URL", + "Delete" : "Poista" +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/files_external/l10n/fi.json b/apps/files_external/l10n/fi.json new file mode 100644 index 00000000000..8a702552ca1 --- /dev/null +++ b/apps/files_external/l10n/fi.json @@ -0,0 +1,7 @@ +{ "translations": { + "Username" : "Käyttäjätunnus", + "Password" : "Salasana", + "URL" : "URL", + "Delete" : "Poista" +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/files_external/l10n/fi_FI.js b/apps/files_external/l10n/fi_FI.js index f7895f842c3..a6fb4c7b6b3 100644 --- a/apps/files_external/l10n/fi_FI.js +++ b/apps/files_external/l10n/fi_FI.js @@ -16,9 +16,11 @@ OC.L10N.register( "Host" : "Isäntä", "Username" : "Käyttäjätunnus", "Password" : "Salasana", + "Remote subfolder" : "Etäalikansio", "Secure ftps://" : "Salattu ftps://", "Timeout of HTTP requests in seconds" : "HTTP-pyyntöjen aikakatkaisu sekunneissa", "Share" : "Jaa", + "Username as share" : "Käyttäjänimi jakona", "URL" : "Verkko-osoite", "Secure https://" : "Salattu https://", "Access granted" : "Pääsy sallittu", @@ -31,11 +33,12 @@ OC.L10N.register( "(group)" : "(ryhmä)", "Saved" : "Tallennettu", "<b>Note:</b> " : "<b>Huomio:</b> ", - " and " : "ja", + "and" : "ja", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Huomio:</b> PHP:n cURL-tuki ei ole käytössä tai sitä ei ole asennettu. Kohteen %s liittäminen ei ole mahdollista. Pyydä järjestelmän ylläpitäjää ottamaan cURL-tuki käyttöön.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Huomio:</b> PHP:n FTP-tuki ei ole käytössä tai sitä ei ole asennettu. Kohteen %s liittäminen ei ole mahdollista. Pyydä järjestelmän ylläpitäjää ottamaan FTP-tuki käyttöön.", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Huomio:</b> \"%s\" ei ole asennettu. Kohteen %s liittäminen ei ole mahdollista. Pyydä järjestelmän ylläpitäjää asentamaan puuttuva kohde.", - "You don't have any external storages" : "Käytössäsi ei ole erillisiä tallennustiloja", + "No external storages configured" : "Erillisiä tallennusvälineitä ei ole määritelty", + "You can configure external storages in the personal settings" : "Voit määrittää erillisten tallennustilojen asetukset henkilökohtaisissa asetuksissasi", "Name" : "Nimi", "Storage type" : "Tallennustilan tyyppi", "External Storage" : "Erillinen tallennusväline", diff --git a/apps/files_external/l10n/fi_FI.json b/apps/files_external/l10n/fi_FI.json index dad235128fb..3f0465db07f 100644 --- a/apps/files_external/l10n/fi_FI.json +++ b/apps/files_external/l10n/fi_FI.json @@ -14,9 +14,11 @@ "Host" : "Isäntä", "Username" : "Käyttäjätunnus", "Password" : "Salasana", + "Remote subfolder" : "Etäalikansio", "Secure ftps://" : "Salattu ftps://", "Timeout of HTTP requests in seconds" : "HTTP-pyyntöjen aikakatkaisu sekunneissa", "Share" : "Jaa", + "Username as share" : "Käyttäjänimi jakona", "URL" : "Verkko-osoite", "Secure https://" : "Salattu https://", "Access granted" : "Pääsy sallittu", @@ -29,11 +31,12 @@ "(group)" : "(ryhmä)", "Saved" : "Tallennettu", "<b>Note:</b> " : "<b>Huomio:</b> ", - " and " : "ja", + "and" : "ja", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Huomio:</b> PHP:n cURL-tuki ei ole käytössä tai sitä ei ole asennettu. Kohteen %s liittäminen ei ole mahdollista. Pyydä järjestelmän ylläpitäjää ottamaan cURL-tuki käyttöön.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Huomio:</b> PHP:n FTP-tuki ei ole käytössä tai sitä ei ole asennettu. Kohteen %s liittäminen ei ole mahdollista. Pyydä järjestelmän ylläpitäjää ottamaan FTP-tuki käyttöön.", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Huomio:</b> \"%s\" ei ole asennettu. Kohteen %s liittäminen ei ole mahdollista. Pyydä järjestelmän ylläpitäjää asentamaan puuttuva kohde.", - "You don't have any external storages" : "Käytössäsi ei ole erillisiä tallennustiloja", + "No external storages configured" : "Erillisiä tallennusvälineitä ei ole määritelty", + "You can configure external storages in the personal settings" : "Voit määrittää erillisten tallennustilojen asetukset henkilökohtaisissa asetuksissasi", "Name" : "Nimi", "Storage type" : "Tallennustilan tyyppi", "External Storage" : "Erillinen tallennusväline", diff --git a/apps/files_external/l10n/fr.js b/apps/files_external/l10n/fr.js index bdaf0a19b01..f88e0134a17 100644 --- a/apps/files_external/l10n/fr.js +++ b/apps/files_external/l10n/fr.js @@ -4,8 +4,8 @@ OC.L10N.register( "Fetching request tokens failed. Verify that your Dropbox app key and secret are correct." : "La récupération des jetons d’authentification a échoué. Veuillez vérifier votre clé d'application Dropbox ainsi que le mot de passe.", "Fetching access tokens failed. Verify that your Dropbox app key and secret are correct." : "La requête d’accès aux jetons d’authentification a échoué. Veuillez vérifier votre App-Key Dropbox ainsi que le mot de passe.", "Please provide a valid Dropbox app key and secret." : "Veuillez fournir une clé d'application (app key) ainsi qu'un mot de passe valides.", - "Step 1 failed. Exception: %s" : "L’étape 1 a échoué. Erreur: %s", - "Step 2 failed. Exception: %s" : "L’étape 2 a échoué. Erreur: %s", + "Step 1 failed. Exception: %s" : "L’étape 1 a échoué. Erreur : %s", + "Step 2 failed. Exception: %s" : "L’étape 2 a échoué. Erreur : %s", "External storage" : "Stockage externe", "Local" : "Local", "Location" : "Emplacement", @@ -26,8 +26,8 @@ OC.L10N.register( "Host" : "Hôte", "Username" : "Nom d'utilisateur", "Password" : "Mot de passe", - "Root" : "Root", - "Secure ftps://" : "Sécuriser via ftps://", + "Remote subfolder" : "Sous-dossier distant", + "Secure ftps://" : "Sécurisation ftps://", "Client ID" : "ID Client", "Client secret" : "Secret client", "OpenStack Object Storage" : "Object de Stockage OpenStack", @@ -43,22 +43,21 @@ OC.L10N.register( "Username as share" : "Nom d'utilisateur du partage", "URL" : "URL", "Secure https://" : "Sécurisation https://", - "Remote subfolder" : "Sous-dossier distant", "Access granted" : "Accès autorisé", "Error configuring Dropbox storage" : "Erreur lors de la configuration du support de stockage Dropbox", "Grant access" : "Autoriser l'accès", "Error configuring Google Drive storage" : "Erreur lors de la configuration du support de stockage Google Drive", "Personal" : "Personnel", "System" : "Système", - "All users. Type to select user or group." : "Tous les utilisateurs. Commencez à saisir pour sélectionner un utilisateur ou un groupe.", + "All users. Type to select user or group." : "Tous les utilisateurs. Cliquez ici pour restreindre.", "(group)" : "(groupe)", "Saved" : "Sauvegarder", "<b>Note:</b> " : "<b>Attention :</b>", - " and " : "et", - "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Attention :</b> Le support de cURL de PHP n'est pas activé ou installé. Le montage de %s n'est pas possible. Contactez votre administrateur système pour l'installer.", - "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Attention : </b> Le support FTP de PHP n'est pas activé ou installé. Le montage de %s n'est pas possible. Contactez votre administrateur système pour l'installer.", + "and" : " et ", + "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Attention :</b> La prise en charge de cURL par PHP n'est pas activée ou installée. Le montage de %s n'est pas possible. Contactez votre administrateur système pour l'installer.", + "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Attention : </b> La prise en charge du FTP par PHP n'est pas activée ou installée. Le montage de %s n'est pas possible. Contactez votre administrateur système pour l'installer.", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Attention : </b> \"%s\" n'est pas installé. Le montage de %s n'est pas possible. Contactez votre administrateur système pour l'installer.", - "You don't have any external storages" : "Vous n'avez pas de support de stockage externe", + "You can configure external storages in the personal settings" : "Vous pouvez configurer vos stockages externes dans les paramètres personnels.", "Name" : "Nom", "Storage type" : "Type de support de stockage", "Scope" : "Portée", diff --git a/apps/files_external/l10n/fr.json b/apps/files_external/l10n/fr.json index e9f1c91b30d..77f810ba5c2 100644 --- a/apps/files_external/l10n/fr.json +++ b/apps/files_external/l10n/fr.json @@ -2,8 +2,8 @@ "Fetching request tokens failed. Verify that your Dropbox app key and secret are correct." : "La récupération des jetons d’authentification a échoué. Veuillez vérifier votre clé d'application Dropbox ainsi que le mot de passe.", "Fetching access tokens failed. Verify that your Dropbox app key and secret are correct." : "La requête d’accès aux jetons d’authentification a échoué. Veuillez vérifier votre App-Key Dropbox ainsi que le mot de passe.", "Please provide a valid Dropbox app key and secret." : "Veuillez fournir une clé d'application (app key) ainsi qu'un mot de passe valides.", - "Step 1 failed. Exception: %s" : "L’étape 1 a échoué. Erreur: %s", - "Step 2 failed. Exception: %s" : "L’étape 2 a échoué. Erreur: %s", + "Step 1 failed. Exception: %s" : "L’étape 1 a échoué. Erreur : %s", + "Step 2 failed. Exception: %s" : "L’étape 2 a échoué. Erreur : %s", "External storage" : "Stockage externe", "Local" : "Local", "Location" : "Emplacement", @@ -24,8 +24,8 @@ "Host" : "Hôte", "Username" : "Nom d'utilisateur", "Password" : "Mot de passe", - "Root" : "Root", - "Secure ftps://" : "Sécuriser via ftps://", + "Remote subfolder" : "Sous-dossier distant", + "Secure ftps://" : "Sécurisation ftps://", "Client ID" : "ID Client", "Client secret" : "Secret client", "OpenStack Object Storage" : "Object de Stockage OpenStack", @@ -41,22 +41,21 @@ "Username as share" : "Nom d'utilisateur du partage", "URL" : "URL", "Secure https://" : "Sécurisation https://", - "Remote subfolder" : "Sous-dossier distant", "Access granted" : "Accès autorisé", "Error configuring Dropbox storage" : "Erreur lors de la configuration du support de stockage Dropbox", "Grant access" : "Autoriser l'accès", "Error configuring Google Drive storage" : "Erreur lors de la configuration du support de stockage Google Drive", "Personal" : "Personnel", "System" : "Système", - "All users. Type to select user or group." : "Tous les utilisateurs. Commencez à saisir pour sélectionner un utilisateur ou un groupe.", + "All users. Type to select user or group." : "Tous les utilisateurs. Cliquez ici pour restreindre.", "(group)" : "(groupe)", "Saved" : "Sauvegarder", "<b>Note:</b> " : "<b>Attention :</b>", - " and " : "et", - "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Attention :</b> Le support de cURL de PHP n'est pas activé ou installé. Le montage de %s n'est pas possible. Contactez votre administrateur système pour l'installer.", - "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Attention : </b> Le support FTP de PHP n'est pas activé ou installé. Le montage de %s n'est pas possible. Contactez votre administrateur système pour l'installer.", + "and" : " et ", + "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Attention :</b> La prise en charge de cURL par PHP n'est pas activée ou installée. Le montage de %s n'est pas possible. Contactez votre administrateur système pour l'installer.", + "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Attention : </b> La prise en charge du FTP par PHP n'est pas activée ou installée. Le montage de %s n'est pas possible. Contactez votre administrateur système pour l'installer.", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Attention : </b> \"%s\" n'est pas installé. Le montage de %s n'est pas possible. Contactez votre administrateur système pour l'installer.", - "You don't have any external storages" : "Vous n'avez pas de support de stockage externe", + "You can configure external storages in the personal settings" : "Vous pouvez configurer vos stockages externes dans les paramètres personnels.", "Name" : "Nom", "Storage type" : "Type de support de stockage", "Scope" : "Portée", diff --git a/apps/files_external/l10n/gl.js b/apps/files_external/l10n/gl.js index 0ff342e958d..96cfb314a10 100644 --- a/apps/files_external/l10n/gl.js +++ b/apps/files_external/l10n/gl.js @@ -18,7 +18,7 @@ OC.L10N.register( "Secret Key" : "Clave secreta", "Hostname" : "Nome de máquina", "Port" : "Porto", - "Region" : "Autonomía", + "Region" : "Rexión", "Enable SSL" : "Activar SSL", "Enable Path Style" : "Activar o estilo de ruta", "App key" : "Clave da API", @@ -26,7 +26,7 @@ OC.L10N.register( "Host" : "Servidor", "Username" : "Nome de usuario", "Password" : "Contrasinal", - "Root" : "Root (raíz)", + "Remote subfolder" : "Subcartafol remoto", "Secure ftps://" : "ftps:// seguro", "Client ID" : "ID do cliente", "Client secret" : "Secreto do cliente", @@ -43,7 +43,6 @@ OC.L10N.register( "Username as share" : "Nome de usuario como compartición", "URL" : "URL", "Secure https://" : "https:// seguro", - "Remote subfolder" : "Subcartafol remoto", "Access granted" : "Concedeuse acceso", "Error configuring Dropbox storage" : "Produciuse un erro ao configurar o almacenamento en Dropbox", "Grant access" : "Permitir o acceso", @@ -54,11 +53,12 @@ OC.L10N.register( "(group)" : "(grupo)", "Saved" : "Gardado", "<b>Note:</b> " : "<b>Nota:</b> ", - " and " : "e", + "and" : "e", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Nota:</b> A compatibilidade de cURL en PHP non está activada, ou non está instalado. Non é posíbel a montaxe de %s. Consulte co administrador do sistema como instalalo.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Nota:</b> A compatibilidade de FTP en PHP non está activada, ou non está instalado. Non é posíbel a montaxe de %s. Consulte co administrador do sistema como instalalo.", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Nota:</b> «%s» non está instalado. Non é posíbel a montaxe de %s. Consulte co administrador do sistema como instalalo.", - "You don't have any external storages" : "Non ten ningún almacenamento externo", + "No external storages configured" : "Non hai un almacenamento externo configurado", + "You can configure external storages in the personal settings" : "Ten que configurar o almacenamento externo nos axustes persoais", "Name" : "Nome", "Storage type" : "Tipo de almacenamento", "Scope" : "Ámbito", diff --git a/apps/files_external/l10n/gl.json b/apps/files_external/l10n/gl.json index 549de28f928..918233634f4 100644 --- a/apps/files_external/l10n/gl.json +++ b/apps/files_external/l10n/gl.json @@ -16,7 +16,7 @@ "Secret Key" : "Clave secreta", "Hostname" : "Nome de máquina", "Port" : "Porto", - "Region" : "Autonomía", + "Region" : "Rexión", "Enable SSL" : "Activar SSL", "Enable Path Style" : "Activar o estilo de ruta", "App key" : "Clave da API", @@ -24,7 +24,7 @@ "Host" : "Servidor", "Username" : "Nome de usuario", "Password" : "Contrasinal", - "Root" : "Root (raíz)", + "Remote subfolder" : "Subcartafol remoto", "Secure ftps://" : "ftps:// seguro", "Client ID" : "ID do cliente", "Client secret" : "Secreto do cliente", @@ -41,7 +41,6 @@ "Username as share" : "Nome de usuario como compartición", "URL" : "URL", "Secure https://" : "https:// seguro", - "Remote subfolder" : "Subcartafol remoto", "Access granted" : "Concedeuse acceso", "Error configuring Dropbox storage" : "Produciuse un erro ao configurar o almacenamento en Dropbox", "Grant access" : "Permitir o acceso", @@ -52,11 +51,12 @@ "(group)" : "(grupo)", "Saved" : "Gardado", "<b>Note:</b> " : "<b>Nota:</b> ", - " and " : "e", + "and" : "e", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Nota:</b> A compatibilidade de cURL en PHP non está activada, ou non está instalado. Non é posíbel a montaxe de %s. Consulte co administrador do sistema como instalalo.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Nota:</b> A compatibilidade de FTP en PHP non está activada, ou non está instalado. Non é posíbel a montaxe de %s. Consulte co administrador do sistema como instalalo.", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Nota:</b> «%s» non está instalado. Non é posíbel a montaxe de %s. Consulte co administrador do sistema como instalalo.", - "You don't have any external storages" : "Non ten ningún almacenamento externo", + "No external storages configured" : "Non hai un almacenamento externo configurado", + "You can configure external storages in the personal settings" : "Ten que configurar o almacenamento externo nos axustes persoais", "Name" : "Nome", "Storage type" : "Tipo de almacenamento", "Scope" : "Ámbito", diff --git a/apps/files_external/l10n/hr.js b/apps/files_external/l10n/hr.js index c166841d9c6..37193bceeb0 100644 --- a/apps/files_external/l10n/hr.js +++ b/apps/files_external/l10n/hr.js @@ -26,7 +26,7 @@ OC.L10N.register( "Host" : "Glavno računalo", "Username" : "Korisničko ime", "Password" : "Lozinka", - "Root" : "Korijen", + "Remote subfolder" : "Udaljena podmapa", "Secure ftps://" : "Sigurni ftps://", "Client ID" : "ID klijenta", "Client secret" : "Klijentski tajni ključ", @@ -43,7 +43,6 @@ OC.L10N.register( "Username as share" : "Korisničko ime kao dijeljeni resurs", "URL" : "URL", "Secure https://" : "Siguran https://", - "Remote subfolder" : "Udaljena podmapa", "Access granted" : "Pristup odobren", "Error configuring Dropbox storage" : "Pogreška pri konfiguriranju spremišta u zajedničkoj mrežnoj mapi", "Grant access" : "Dodijeli pristup", @@ -54,11 +53,9 @@ OC.L10N.register( "(group)" : "(grupa)", "Saved" : "Spremljeno", "<b>Note:</b> " : "<b>Bilješka:</b>", - " and " : " i ", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Note:</b> Podrška cURL u PHP nije omogućena ili nije instalirana. Postavljanje%s nije moguće. Molimo zamolite svog administratora sustava da je instalira.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Note:</b> Podrška FTP u PHP nije omogućena ili nije instalirana. Postavljanje%s nije moguće. Molimo zamolite svotg administratora sustava da je instalira.", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Note:</b> \"%s\" nije instaliran. Postavljanje %s nije moguće. Molimo zamolitesvog administratora sustava da ga instalira.", - "You don't have any external storages" : "Vi nemate nikakvo vanjsko spremište", "Name" : "Naziv", "Storage type" : "Vrsta spremišta", "Scope" : "Opseg", diff --git a/apps/files_external/l10n/hr.json b/apps/files_external/l10n/hr.json index 069af3fa6c8..04e6c778538 100644 --- a/apps/files_external/l10n/hr.json +++ b/apps/files_external/l10n/hr.json @@ -24,7 +24,7 @@ "Host" : "Glavno računalo", "Username" : "Korisničko ime", "Password" : "Lozinka", - "Root" : "Korijen", + "Remote subfolder" : "Udaljena podmapa", "Secure ftps://" : "Sigurni ftps://", "Client ID" : "ID klijenta", "Client secret" : "Klijentski tajni ključ", @@ -41,7 +41,6 @@ "Username as share" : "Korisničko ime kao dijeljeni resurs", "URL" : "URL", "Secure https://" : "Siguran https://", - "Remote subfolder" : "Udaljena podmapa", "Access granted" : "Pristup odobren", "Error configuring Dropbox storage" : "Pogreška pri konfiguriranju spremišta u zajedničkoj mrežnoj mapi", "Grant access" : "Dodijeli pristup", @@ -52,11 +51,9 @@ "(group)" : "(grupa)", "Saved" : "Spremljeno", "<b>Note:</b> " : "<b>Bilješka:</b>", - " and " : " i ", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Note:</b> Podrška cURL u PHP nije omogućena ili nije instalirana. Postavljanje%s nije moguće. Molimo zamolite svog administratora sustava da je instalira.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Note:</b> Podrška FTP u PHP nije omogućena ili nije instalirana. Postavljanje%s nije moguće. Molimo zamolite svotg administratora sustava da je instalira.", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Note:</b> \"%s\" nije instaliran. Postavljanje %s nije moguće. Molimo zamolitesvog administratora sustava da ga instalira.", - "You don't have any external storages" : "Vi nemate nikakvo vanjsko spremište", "Name" : "Naziv", "Storage type" : "Vrsta spremišta", "Scope" : "Opseg", diff --git a/apps/files_external/l10n/hu_HU.js b/apps/files_external/l10n/hu_HU.js index bf2e0badb20..7ec61b91943 100644 --- a/apps/files_external/l10n/hu_HU.js +++ b/apps/files_external/l10n/hu_HU.js @@ -5,23 +5,45 @@ OC.L10N.register( "External storage" : "Külső tárolók", "Local" : "Helyi", "Location" : "Hely", + "Amazon S3" : "Amazon S3", + "Key" : "Kulcs", + "Secret" : "Titkos", + "Bucket" : "Bucket", + "Amazon S3 and compliant" : "Amazon S3-mal kompatibilisek", + "Access Key" : "Hozzáférési kulcs", + "Secret Key" : "Titkos kulcs", + "Hostname" : "Hosztnév", "Port" : "Port", "Region" : "Megye", + "Enable SSL" : "SSL engedélyezése", + "App key" : "App kulcs", + "App secret" : "App titkos kulcs", "Host" : "Kiszolgáló", "Username" : "Felhasználónév", "Password" : "Jelszó", + "Remote subfolder" : "Távoli alkönyvtár", + "Secure ftps://" : "Biztonságos ftps://", + "Timeout of HTTP requests in seconds" : "A HTTP-kérés időkorlátja másodpercben", "Share" : "Megosztás", + "Username as share" : "Felhasználónév és megosztás", "URL" : "URL", + "Secure https://" : "Biztonságos https://", "Access granted" : "Érvényes hozzáférés", "Error configuring Dropbox storage" : "A Dropbox tárolót nem sikerült beállítani", "Grant access" : "Megadom a hozzáférést", "Error configuring Google Drive storage" : "A Google Drive tárolót nem sikerült beállítani", "Personal" : "Személyes", + "System" : "Rendszer", + "(group)" : "(csoport)", "Saved" : "Elmentve", + "<b>Note:</b> " : "<b>Megjegyzés:</b>", + "and" : "és", "Name" : "Név", + "Storage type" : "Tároló típusa", "External Storage" : "Külső tárolási szolgáltatások becsatolása", "Folder name" : "Mappanév", "Configuration" : "Beállítások", + "Available for" : "Elérhető számukra", "Add storage" : "Tároló becsatolása", "Delete" : "Törlés", "Enable User External Storage" : "Külső tárolók engedélyezése a felhasználók részére" diff --git a/apps/files_external/l10n/hu_HU.json b/apps/files_external/l10n/hu_HU.json index 430188e2144..f8160e2eebf 100644 --- a/apps/files_external/l10n/hu_HU.json +++ b/apps/files_external/l10n/hu_HU.json @@ -3,23 +3,45 @@ "External storage" : "Külső tárolók", "Local" : "Helyi", "Location" : "Hely", + "Amazon S3" : "Amazon S3", + "Key" : "Kulcs", + "Secret" : "Titkos", + "Bucket" : "Bucket", + "Amazon S3 and compliant" : "Amazon S3-mal kompatibilisek", + "Access Key" : "Hozzáférési kulcs", + "Secret Key" : "Titkos kulcs", + "Hostname" : "Hosztnév", "Port" : "Port", "Region" : "Megye", + "Enable SSL" : "SSL engedélyezése", + "App key" : "App kulcs", + "App secret" : "App titkos kulcs", "Host" : "Kiszolgáló", "Username" : "Felhasználónév", "Password" : "Jelszó", + "Remote subfolder" : "Távoli alkönyvtár", + "Secure ftps://" : "Biztonságos ftps://", + "Timeout of HTTP requests in seconds" : "A HTTP-kérés időkorlátja másodpercben", "Share" : "Megosztás", + "Username as share" : "Felhasználónév és megosztás", "URL" : "URL", + "Secure https://" : "Biztonságos https://", "Access granted" : "Érvényes hozzáférés", "Error configuring Dropbox storage" : "A Dropbox tárolót nem sikerült beállítani", "Grant access" : "Megadom a hozzáférést", "Error configuring Google Drive storage" : "A Google Drive tárolót nem sikerült beállítani", "Personal" : "Személyes", + "System" : "Rendszer", + "(group)" : "(csoport)", "Saved" : "Elmentve", + "<b>Note:</b> " : "<b>Megjegyzés:</b>", + "and" : "és", "Name" : "Név", + "Storage type" : "Tároló típusa", "External Storage" : "Külső tárolási szolgáltatások becsatolása", "Folder name" : "Mappanév", "Configuration" : "Beállítások", + "Available for" : "Elérhető számukra", "Add storage" : "Tároló becsatolása", "Delete" : "Törlés", "Enable User External Storage" : "Külső tárolók engedélyezése a felhasználók részére" diff --git a/apps/files_external/l10n/id.js b/apps/files_external/l10n/id.js index 4673da66543..590bc3b34d5 100644 --- a/apps/files_external/l10n/id.js +++ b/apps/files_external/l10n/id.js @@ -1,32 +1,64 @@ OC.L10N.register( "files_external", { - "Please provide a valid Dropbox app key and secret." : "Masukkan kunci dan sandi aplikasi Dropbox yang benar.", + "Fetching request tokens failed. Verify that your Dropbox app key and secret are correct." : "Permintaan untuk mengambil token gagal. Pastikan kunci dan rahasia apl Dropbox Anda sudah benar.", + "Fetching access tokens failed. Verify that your Dropbox app key and secret are correct." : "Akses untuk mengambil token gagal. Pastikan kunci dan rahasia apl Dropbox Anda sudah benar.", + "Please provide a valid Dropbox app key and secret." : "Masukkan kunci dan rahasia aplikasi Dropbox yang benar.", + "Step 1 failed. Exception: %s" : "Langkah 1 gagal. Kecuali: %s", + "Step 2 failed. Exception: %s" : "Langkah 2 gagal. Kecuali: %s", "External storage" : "Penyimpanan eksternal", "Local" : "Lokal", "Location" : "lokasi", "Amazon S3" : "Amazon S3", - "Port" : "port", - "Region" : "daerah", + "Key" : "Kunci", + "Secret" : "Rahasia", + "Bucket" : "Keranjang", + "Amazon S3 and compliant" : "Amazon S3 dan yang sesuai", + "Access Key" : "Kunci Akses", + "Secret Key" : "Kunci Rahasia", + "Hostname" : "Nama Host", + "Port" : "Port", + "Region" : "Daerah", "Enable SSL" : "Aktifkan SSL", + "Enable Path Style" : "Aktifkan Gaya Path", + "App key" : "Kunci Apl", + "App secret" : "Rahasia Apl", "Host" : "Host", "Username" : "Nama Pengguna", "Password" : "Sandi", - "Root" : "Root", + "Remote subfolder" : "Subfolder remote", + "Secure ftps://" : "Secure ftps://", + "Client ID" : "ID Klien", + "Client secret" : "Rahasia klien", + "OpenStack Object Storage" : "OpenStack Object Storage", + "Region (optional for OpenStack Object Storage)" : "Daerah (tambahan untuk OpenStack Object Storage)", + "API Key (required for Rackspace Cloud Files)" : "Kunci API (diperlukan untuk Rackspace Cloud Files)", + "Tenantname (required for OpenStack Object Storage)" : "Tenantname (diperlukan untuk OpenStack Object Storage)", + "Password (required for OpenStack Object Storage)" : "Sandi (diperlukan untuk OpenStack Object Storage)", + "Service Name (required for OpenStack Object Storage)" : "Nama Layanan (diperlukan untuk OpenStack Object Storage)", + "URL of identity endpoint (required for OpenStack Object Storage)" : "URL of identity endpoint (diperlukan untuk OpenStack Object Storage)", + "Timeout of HTTP requests in seconds" : "Batas waktu permintaan HTTP dalam detik", "Share" : "Bagikan", - "URL" : "tautan", + "SMB / CIFS using OC login" : "SMB / CIFS menggunakan OC login", + "Username as share" : "Nama pengguna berbagi", + "URL" : "URL", + "Secure https://" : "Secure https://", "Access granted" : "Akses diberikan", "Error configuring Dropbox storage" : "Kesalahan dalam mengonfigurasi penyimpanan Dropbox", "Grant access" : "Berikan hak akses", "Error configuring Google Drive storage" : "Kesalahan dalam mengkonfigurasi penyimpanan Google Drive", "Personal" : "Pribadi", + "System" : "Sistem", + "All users. Type to select user or group." : "Semua pengguna. Ketik untuk memilih pengguna atau grup.", + "(group)" : "(grup)", "Saved" : "Disimpan", "<b>Note:</b> " : "<b>Catatan:</b> ", - " and " : "dan", - "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Catatan:</b> Dukungan cURL di PHP tidak diaktifkan atau belum diinstal. Mengaitkan %s tidak dimungkinkan. Silakan tanyakan ke administrator sistem Anda untuk menginstalnya.", - "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Catatan:</b> Dukungan FTP di PHP tidak diaktifkan atau belum diinstal. Mengaitkan %s tidak dimungkinkan. Silakan tanyakan ke administrator sistem Anda untuk menginstalnya.", - "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Catatan:</b> \"%s\" belum diinstal. Mengaitkan %s tidak dimungkinkan. Silakan tanyakan ke administrator sistem Anda untuk menginstalnya.", + "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Catatan:</b> Dukungan cURL di PHP tidak diaktifkan atau belum diinstal. Mengaitkan %s tidak dimungkinkan. Silakan minta administrator sistem Anda untuk menginstalnya.", + "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Catatan:</b> Dukungan FTP di PHP tidak diaktifkan atau belum diinstal. Mengaitkan %s tidak dimungkinkan. Silakan minta administrator sistem Anda untuk menginstalnya.", + "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Catatan:</b> \"%s\" belum diinstal. Mengaitkan %s tidak dimungkinkan. Silakan minta administrator sistem Anda untuk menginstalnya.", "Name" : "Nama", + "Storage type" : "Tipe penyimpanan", + "Scope" : "Skop", "External Storage" : "Penyimpanan Eksternal", "Folder name" : "Nama folder", "Configuration" : "Konfigurasi", diff --git a/apps/files_external/l10n/id.json b/apps/files_external/l10n/id.json index 067f79b2a20..f77d87cacb2 100644 --- a/apps/files_external/l10n/id.json +++ b/apps/files_external/l10n/id.json @@ -1,30 +1,62 @@ { "translations": { - "Please provide a valid Dropbox app key and secret." : "Masukkan kunci dan sandi aplikasi Dropbox yang benar.", + "Fetching request tokens failed. Verify that your Dropbox app key and secret are correct." : "Permintaan untuk mengambil token gagal. Pastikan kunci dan rahasia apl Dropbox Anda sudah benar.", + "Fetching access tokens failed. Verify that your Dropbox app key and secret are correct." : "Akses untuk mengambil token gagal. Pastikan kunci dan rahasia apl Dropbox Anda sudah benar.", + "Please provide a valid Dropbox app key and secret." : "Masukkan kunci dan rahasia aplikasi Dropbox yang benar.", + "Step 1 failed. Exception: %s" : "Langkah 1 gagal. Kecuali: %s", + "Step 2 failed. Exception: %s" : "Langkah 2 gagal. Kecuali: %s", "External storage" : "Penyimpanan eksternal", "Local" : "Lokal", "Location" : "lokasi", "Amazon S3" : "Amazon S3", - "Port" : "port", - "Region" : "daerah", + "Key" : "Kunci", + "Secret" : "Rahasia", + "Bucket" : "Keranjang", + "Amazon S3 and compliant" : "Amazon S3 dan yang sesuai", + "Access Key" : "Kunci Akses", + "Secret Key" : "Kunci Rahasia", + "Hostname" : "Nama Host", + "Port" : "Port", + "Region" : "Daerah", "Enable SSL" : "Aktifkan SSL", + "Enable Path Style" : "Aktifkan Gaya Path", + "App key" : "Kunci Apl", + "App secret" : "Rahasia Apl", "Host" : "Host", "Username" : "Nama Pengguna", "Password" : "Sandi", - "Root" : "Root", + "Remote subfolder" : "Subfolder remote", + "Secure ftps://" : "Secure ftps://", + "Client ID" : "ID Klien", + "Client secret" : "Rahasia klien", + "OpenStack Object Storage" : "OpenStack Object Storage", + "Region (optional for OpenStack Object Storage)" : "Daerah (tambahan untuk OpenStack Object Storage)", + "API Key (required for Rackspace Cloud Files)" : "Kunci API (diperlukan untuk Rackspace Cloud Files)", + "Tenantname (required for OpenStack Object Storage)" : "Tenantname (diperlukan untuk OpenStack Object Storage)", + "Password (required for OpenStack Object Storage)" : "Sandi (diperlukan untuk OpenStack Object Storage)", + "Service Name (required for OpenStack Object Storage)" : "Nama Layanan (diperlukan untuk OpenStack Object Storage)", + "URL of identity endpoint (required for OpenStack Object Storage)" : "URL of identity endpoint (diperlukan untuk OpenStack Object Storage)", + "Timeout of HTTP requests in seconds" : "Batas waktu permintaan HTTP dalam detik", "Share" : "Bagikan", - "URL" : "tautan", + "SMB / CIFS using OC login" : "SMB / CIFS menggunakan OC login", + "Username as share" : "Nama pengguna berbagi", + "URL" : "URL", + "Secure https://" : "Secure https://", "Access granted" : "Akses diberikan", "Error configuring Dropbox storage" : "Kesalahan dalam mengonfigurasi penyimpanan Dropbox", "Grant access" : "Berikan hak akses", "Error configuring Google Drive storage" : "Kesalahan dalam mengkonfigurasi penyimpanan Google Drive", "Personal" : "Pribadi", + "System" : "Sistem", + "All users. Type to select user or group." : "Semua pengguna. Ketik untuk memilih pengguna atau grup.", + "(group)" : "(grup)", "Saved" : "Disimpan", "<b>Note:</b> " : "<b>Catatan:</b> ", - " and " : "dan", - "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Catatan:</b> Dukungan cURL di PHP tidak diaktifkan atau belum diinstal. Mengaitkan %s tidak dimungkinkan. Silakan tanyakan ke administrator sistem Anda untuk menginstalnya.", - "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Catatan:</b> Dukungan FTP di PHP tidak diaktifkan atau belum diinstal. Mengaitkan %s tidak dimungkinkan. Silakan tanyakan ke administrator sistem Anda untuk menginstalnya.", - "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Catatan:</b> \"%s\" belum diinstal. Mengaitkan %s tidak dimungkinkan. Silakan tanyakan ke administrator sistem Anda untuk menginstalnya.", + "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Catatan:</b> Dukungan cURL di PHP tidak diaktifkan atau belum diinstal. Mengaitkan %s tidak dimungkinkan. Silakan minta administrator sistem Anda untuk menginstalnya.", + "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Catatan:</b> Dukungan FTP di PHP tidak diaktifkan atau belum diinstal. Mengaitkan %s tidak dimungkinkan. Silakan minta administrator sistem Anda untuk menginstalnya.", + "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Catatan:</b> \"%s\" belum diinstal. Mengaitkan %s tidak dimungkinkan. Silakan minta administrator sistem Anda untuk menginstalnya.", "Name" : "Nama", + "Storage type" : "Tipe penyimpanan", + "Scope" : "Skop", "External Storage" : "Penyimpanan Eksternal", "Folder name" : "Nama folder", "Configuration" : "Konfigurasi", diff --git a/apps/files_external/l10n/it.js b/apps/files_external/l10n/it.js index 5834ff25f0b..f882caa5002 100644 --- a/apps/files_external/l10n/it.js +++ b/apps/files_external/l10n/it.js @@ -26,7 +26,7 @@ OC.L10N.register( "Host" : "Host", "Username" : "Nome utente", "Password" : "Password", - "Root" : "Radice", + "Remote subfolder" : "Sottocartella remota", "Secure ftps://" : "Sicuro ftps://", "Client ID" : "ID client", "Client secret" : "Segreto del client", @@ -43,7 +43,6 @@ OC.L10N.register( "Username as share" : "Nome utente come condivisione", "URL" : "URL", "Secure https://" : "Sicuro https://", - "Remote subfolder" : "Sottocartella remota", "Access granted" : "Accesso consentito", "Error configuring Dropbox storage" : "Errore durante la configurazione dell'archivio Dropbox", "Grant access" : "Concedi l'accesso", @@ -54,11 +53,12 @@ OC.L10N.register( "(group)" : "(gruppo)", "Saved" : "Salvato", "<b>Note:</b> " : "<b>Nota:</b>", - " and " : "e", + "and" : "e", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Nota:</b> il supporto a cURL di PHP non è abilitato o installato. Impossibile montare %s. Chiedi al tuo amministratore di sistema di installarlo.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Nota:</b> il supporto a FTP in PHP non è abilitato o installato. Impossibile montare %s. Chiedi al tuo amministratore di sistema di installarlo.", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Nota:</b> \"%s\" non è installato. Impossibile montare %s. Chiedi al tuo amministratore di sistema di installarlo.", - "You don't have any external storages" : "Non è disponibile alcuna archiviazione esterna", + "No external storages configured" : "Nessuna archiviazione esterna configurata", + "You can configure external storages in the personal settings" : "Puoi configurare archiviazioni esterno nelle impostazioni personali", "Name" : "Nome", "Storage type" : "Tipo di archiviazione", "Scope" : "Ambito", diff --git a/apps/files_external/l10n/it.json b/apps/files_external/l10n/it.json index b780cae57a6..698dea290a0 100644 --- a/apps/files_external/l10n/it.json +++ b/apps/files_external/l10n/it.json @@ -24,7 +24,7 @@ "Host" : "Host", "Username" : "Nome utente", "Password" : "Password", - "Root" : "Radice", + "Remote subfolder" : "Sottocartella remota", "Secure ftps://" : "Sicuro ftps://", "Client ID" : "ID client", "Client secret" : "Segreto del client", @@ -41,7 +41,6 @@ "Username as share" : "Nome utente come condivisione", "URL" : "URL", "Secure https://" : "Sicuro https://", - "Remote subfolder" : "Sottocartella remota", "Access granted" : "Accesso consentito", "Error configuring Dropbox storage" : "Errore durante la configurazione dell'archivio Dropbox", "Grant access" : "Concedi l'accesso", @@ -52,11 +51,12 @@ "(group)" : "(gruppo)", "Saved" : "Salvato", "<b>Note:</b> " : "<b>Nota:</b>", - " and " : "e", + "and" : "e", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Nota:</b> il supporto a cURL di PHP non è abilitato o installato. Impossibile montare %s. Chiedi al tuo amministratore di sistema di installarlo.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Nota:</b> il supporto a FTP in PHP non è abilitato o installato. Impossibile montare %s. Chiedi al tuo amministratore di sistema di installarlo.", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Nota:</b> \"%s\" non è installato. Impossibile montare %s. Chiedi al tuo amministratore di sistema di installarlo.", - "You don't have any external storages" : "Non è disponibile alcuna archiviazione esterna", + "No external storages configured" : "Nessuna archiviazione esterna configurata", + "You can configure external storages in the personal settings" : "Puoi configurare archiviazioni esterno nelle impostazioni personali", "Name" : "Nome", "Storage type" : "Tipo di archiviazione", "Scope" : "Ambito", diff --git a/apps/files_external/l10n/ja.js b/apps/files_external/l10n/ja.js index d4ef6347664..0eac968ef62 100644 --- a/apps/files_external/l10n/ja.js +++ b/apps/files_external/l10n/ja.js @@ -26,24 +26,23 @@ OC.L10N.register( "Host" : "ホスト", "Username" : "ユーザー名", "Password" : "パスワード", - "Root" : "ルート", + "Remote subfolder" : "リモートサブフォルダー", "Secure ftps://" : "Secure ftps://", "Client ID" : "クライアントID", "Client secret" : "クライアント秘密キー", - "OpenStack Object Storage" : "OpenStack Object Storage", - "Region (optional for OpenStack Object Storage)" : "リージョン (OpenStack Object Storage用のオプション)", - "API Key (required for Rackspace Cloud Files)" : "APIキー (Rackspace Cloud Filesに必須)", - "Tenantname (required for OpenStack Object Storage)" : "テナント名 (OpenStack Object Storage用に必要)", - "Password (required for OpenStack Object Storage)" : "パスワード (OpenStack Object Storage用に必要)", - "Service Name (required for OpenStack Object Storage)" : "サービス名 (OpenStack Object Storage用に必要)", - "URL of identity endpoint (required for OpenStack Object Storage)" : "識別用エンドポイントURL (OpenStack Object Storage用に必要)", + "OpenStack Object Storage" : "OpenStack ObjectStorage", + "Region (optional for OpenStack Object Storage)" : "リージョン (OpenStack ObjectStorage用)", + "API Key (required for Rackspace Cloud Files)" : "APIキー (Rackspace CloudFiles用)", + "Tenantname (required for OpenStack Object Storage)" : "テナント名 (OpenStack ObjectStorage用)", + "Password (required for OpenStack Object Storage)" : "パスワード (OpenStack ObjectStorage用)", + "Service Name (required for OpenStack Object Storage)" : "サービス名 (OpenStack ObjectStorage用)", + "URL of identity endpoint (required for OpenStack Object Storage)" : "識別用エンドポイントURL (OpenStack ObjectStorage)", "Timeout of HTTP requests in seconds" : "HTTP接続タイムアウト秒数", "Share" : "共有", "SMB / CIFS using OC login" : "ownCloudログインで SMB/CIFSを使用", "Username as share" : "共有名", "URL" : "URL", "Secure https://" : "セキュア https://", - "Remote subfolder" : "リモートサブフォルダー", "Access granted" : "アクセスは許可されました", "Error configuring Dropbox storage" : "Dropboxストレージの設定エラー", "Grant access" : "アクセスを許可", @@ -54,11 +53,11 @@ OC.L10N.register( "(group)" : "(グループ)", "Saved" : "保存されました", "<b>Note:</b> " : "<b>注意:</b> ", - " and " : "と", + "and" : "と", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>注意:</b> PHPにcURLのエクステンションが入っていないか、有効ではありません。%s をマウントすることができません。このシステムの管理者にインストールをお願いしてください。", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>注意:</b> PHPにFTPのエクステンションが入っていないか、有効ではありません。%s をマウントすることができません。このシステムの管理者にインストールをお願いしてください。", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>注意:</b> \"%s\" がインストールされていません。%sをマウントできません。このシステムの管理者にインストールをお願いしてください。", - "You don't have any external storages" : "外部ストレージはありません。", + "You can configure external storages in the personal settings" : "個人設定で外部ストレージを設定することができます。", "Name" : "名前", "Storage type" : "ストレージ種別", "Scope" : "スコープ", diff --git a/apps/files_external/l10n/ja.json b/apps/files_external/l10n/ja.json index d630e19904d..6618cd90da3 100644 --- a/apps/files_external/l10n/ja.json +++ b/apps/files_external/l10n/ja.json @@ -24,24 +24,23 @@ "Host" : "ホスト", "Username" : "ユーザー名", "Password" : "パスワード", - "Root" : "ルート", + "Remote subfolder" : "リモートサブフォルダー", "Secure ftps://" : "Secure ftps://", "Client ID" : "クライアントID", "Client secret" : "クライアント秘密キー", - "OpenStack Object Storage" : "OpenStack Object Storage", - "Region (optional for OpenStack Object Storage)" : "リージョン (OpenStack Object Storage用のオプション)", - "API Key (required for Rackspace Cloud Files)" : "APIキー (Rackspace Cloud Filesに必須)", - "Tenantname (required for OpenStack Object Storage)" : "テナント名 (OpenStack Object Storage用に必要)", - "Password (required for OpenStack Object Storage)" : "パスワード (OpenStack Object Storage用に必要)", - "Service Name (required for OpenStack Object Storage)" : "サービス名 (OpenStack Object Storage用に必要)", - "URL of identity endpoint (required for OpenStack Object Storage)" : "識別用エンドポイントURL (OpenStack Object Storage用に必要)", + "OpenStack Object Storage" : "OpenStack ObjectStorage", + "Region (optional for OpenStack Object Storage)" : "リージョン (OpenStack ObjectStorage用)", + "API Key (required for Rackspace Cloud Files)" : "APIキー (Rackspace CloudFiles用)", + "Tenantname (required for OpenStack Object Storage)" : "テナント名 (OpenStack ObjectStorage用)", + "Password (required for OpenStack Object Storage)" : "パスワード (OpenStack ObjectStorage用)", + "Service Name (required for OpenStack Object Storage)" : "サービス名 (OpenStack ObjectStorage用)", + "URL of identity endpoint (required for OpenStack Object Storage)" : "識別用エンドポイントURL (OpenStack ObjectStorage)", "Timeout of HTTP requests in seconds" : "HTTP接続タイムアウト秒数", "Share" : "共有", "SMB / CIFS using OC login" : "ownCloudログインで SMB/CIFSを使用", "Username as share" : "共有名", "URL" : "URL", "Secure https://" : "セキュア https://", - "Remote subfolder" : "リモートサブフォルダー", "Access granted" : "アクセスは許可されました", "Error configuring Dropbox storage" : "Dropboxストレージの設定エラー", "Grant access" : "アクセスを許可", @@ -52,11 +51,11 @@ "(group)" : "(グループ)", "Saved" : "保存されました", "<b>Note:</b> " : "<b>注意:</b> ", - " and " : "と", + "and" : "と", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>注意:</b> PHPにcURLのエクステンションが入っていないか、有効ではありません。%s をマウントすることができません。このシステムの管理者にインストールをお願いしてください。", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>注意:</b> PHPにFTPのエクステンションが入っていないか、有効ではありません。%s をマウントすることができません。このシステムの管理者にインストールをお願いしてください。", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>注意:</b> \"%s\" がインストールされていません。%sをマウントできません。このシステムの管理者にインストールをお願いしてください。", - "You don't have any external storages" : "外部ストレージはありません。", + "You can configure external storages in the personal settings" : "個人設定で外部ストレージを設定することができます。", "Name" : "名前", "Storage type" : "ストレージ種別", "Scope" : "スコープ", diff --git a/apps/files_external/l10n/kn.js b/apps/files_external/l10n/kn.js new file mode 100644 index 00000000000..ad1987e2266 --- /dev/null +++ b/apps/files_external/l10n/kn.js @@ -0,0 +1,16 @@ +OC.L10N.register( + "files_external", + { + "Local" : "ಸ್ಥಳೀಯ", + "Port" : "ರೇವು", + "Host" : "ಅತಿಥೆಯ-ಗಣಕ", + "Username" : "ಬಳಕೆಯ ಹೆಸರು", + "Password" : "ಗುಪ್ತ ಪದ", + "Share" : "ಹಂಚಿಕೊಳ್ಳಿ", + "URL" : "ಜಾಲದ ಕೊಂಡಿ", + "Personal" : "ವೈಯಕ್ತಿಕ", + "Saved" : "ಉಳಿಸಿದ", + "Name" : "ಹೆಸರು", + "Delete" : "ಅಳಿಸಿ" +}, +"nplurals=1; plural=0;"); diff --git a/apps/files_external/l10n/kn.json b/apps/files_external/l10n/kn.json new file mode 100644 index 00000000000..74fc7e223bd --- /dev/null +++ b/apps/files_external/l10n/kn.json @@ -0,0 +1,14 @@ +{ "translations": { + "Local" : "ಸ್ಥಳೀಯ", + "Port" : "ರೇವು", + "Host" : "ಅತಿಥೆಯ-ಗಣಕ", + "Username" : "ಬಳಕೆಯ ಹೆಸರು", + "Password" : "ಗುಪ್ತ ಪದ", + "Share" : "ಹಂಚಿಕೊಳ್ಳಿ", + "URL" : "ಜಾಲದ ಕೊಂಡಿ", + "Personal" : "ವೈಯಕ್ತಿಕ", + "Saved" : "ಉಳಿಸಿದ", + "Name" : "ಹೆಸರು", + "Delete" : "ಅಳಿಸಿ" +},"pluralForm" :"nplurals=1; plural=0;" +}
\ No newline at end of file diff --git a/apps/files_external/l10n/lv.js b/apps/files_external/l10n/lv.js index 8f22ff9fd1b..8b3dae5e4fb 100644 --- a/apps/files_external/l10n/lv.js +++ b/apps/files_external/l10n/lv.js @@ -15,6 +15,7 @@ OC.L10N.register( "Grant access" : "Piešķirt pieeju", "Error configuring Google Drive storage" : "Kļūda, konfigurējot Google Drive krātuvi", "Personal" : "Personīgi", + "Saved" : "Saglabāts", "Name" : "Nosaukums", "External Storage" : "Ārējā krātuve", "Folder name" : "Mapes nosaukums", diff --git a/apps/files_external/l10n/lv.json b/apps/files_external/l10n/lv.json index f5637ac9b55..6ec5fad6f90 100644 --- a/apps/files_external/l10n/lv.json +++ b/apps/files_external/l10n/lv.json @@ -13,6 +13,7 @@ "Grant access" : "Piešķirt pieeju", "Error configuring Google Drive storage" : "Kļūda, konfigurējot Google Drive krātuvi", "Personal" : "Personīgi", + "Saved" : "Saglabāts", "Name" : "Nosaukums", "External Storage" : "Ārējā krātuve", "Folder name" : "Mapes nosaukums", diff --git a/apps/files_external/l10n/mn.js b/apps/files_external/l10n/mn.js new file mode 100644 index 00000000000..a83f8310862 --- /dev/null +++ b/apps/files_external/l10n/mn.js @@ -0,0 +1,8 @@ +OC.L10N.register( + "files_external", + { + "Username" : "Хэрэглэгчийн нэр", + "Password" : "Нууц үг", + "Share" : "Түгээх" +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/files_external/l10n/mn.json b/apps/files_external/l10n/mn.json new file mode 100644 index 00000000000..e28fa6e52ad --- /dev/null +++ b/apps/files_external/l10n/mn.json @@ -0,0 +1,6 @@ +{ "translations": { + "Username" : "Хэрэглэгчийн нэр", + "Password" : "Нууц үг", + "Share" : "Түгээх" +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/files_external/l10n/nb_NO.js b/apps/files_external/l10n/nb_NO.js index ebf113068a2..4bfdd78d0e7 100644 --- a/apps/files_external/l10n/nb_NO.js +++ b/apps/files_external/l10n/nb_NO.js @@ -26,7 +26,7 @@ OC.L10N.register( "Host" : "Tjener", "Username" : "Brukernavn", "Password" : "Passord", - "Root" : "Rot", + "Remote subfolder" : "Ekstern undermappe", "Secure ftps://" : "Sikker ftps://", "Client ID" : "Client ID", "Client secret" : "Client secret", @@ -43,7 +43,6 @@ OC.L10N.register( "Username as share" : "Brukernavn som share", "URL" : "URL", "Secure https://" : "Sikker https://", - "Remote subfolder" : "Ekstern undermappe", "Access granted" : "Tilgang innvilget", "Error configuring Dropbox storage" : "Feil ved konfigurering av Dropbox-lagring", "Grant access" : "Gi tilgang", @@ -54,11 +53,12 @@ OC.L10N.register( "(group)" : "(gruppe)", "Saved" : "Lagret", "<b>Note:</b> " : "<b>Merk:</b> ", - " and " : " og ", + "and" : "og", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Merk:</b> Støtte for cURL i PHP er ikke aktivert eller installert. Oppkobling av %s er ikke mulig. Be systemadministratoren om å installere det.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Merk:</b> FTP-støtte i PHP er ikke slått på eller installert. Kan ikke koble opp %s. Ta kontakt med systemadministratoren for å installere det.", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Merk:</b> \"%s\" er ikke installert. Oppkobling av %s er ikke mulig. Spør systemadministratoren om å installere det.", - "You don't have any external storages" : "Du har ingen eksterne lagre", + "No external storages configured" : "Ingen eksterne lagre er konfigurert", + "You can configure external storages in the personal settings" : "Du kan konfigurerer eksterne lagre i personlige innstillinger", "Name" : "Navn", "Storage type" : "Lagringstype", "Scope" : "Omfang", diff --git a/apps/files_external/l10n/nb_NO.json b/apps/files_external/l10n/nb_NO.json index b9b736fb13a..3e9c58b02c8 100644 --- a/apps/files_external/l10n/nb_NO.json +++ b/apps/files_external/l10n/nb_NO.json @@ -24,7 +24,7 @@ "Host" : "Tjener", "Username" : "Brukernavn", "Password" : "Passord", - "Root" : "Rot", + "Remote subfolder" : "Ekstern undermappe", "Secure ftps://" : "Sikker ftps://", "Client ID" : "Client ID", "Client secret" : "Client secret", @@ -41,7 +41,6 @@ "Username as share" : "Brukernavn som share", "URL" : "URL", "Secure https://" : "Sikker https://", - "Remote subfolder" : "Ekstern undermappe", "Access granted" : "Tilgang innvilget", "Error configuring Dropbox storage" : "Feil ved konfigurering av Dropbox-lagring", "Grant access" : "Gi tilgang", @@ -52,11 +51,12 @@ "(group)" : "(gruppe)", "Saved" : "Lagret", "<b>Note:</b> " : "<b>Merk:</b> ", - " and " : " og ", + "and" : "og", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Merk:</b> Støtte for cURL i PHP er ikke aktivert eller installert. Oppkobling av %s er ikke mulig. Be systemadministratoren om å installere det.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Merk:</b> FTP-støtte i PHP er ikke slått på eller installert. Kan ikke koble opp %s. Ta kontakt med systemadministratoren for å installere det.", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Merk:</b> \"%s\" er ikke installert. Oppkobling av %s er ikke mulig. Spør systemadministratoren om å installere det.", - "You don't have any external storages" : "Du har ingen eksterne lagre", + "No external storages configured" : "Ingen eksterne lagre er konfigurert", + "You can configure external storages in the personal settings" : "Du kan konfigurerer eksterne lagre i personlige innstillinger", "Name" : "Navn", "Storage type" : "Lagringstype", "Scope" : "Omfang", diff --git a/apps/files_external/l10n/nl.js b/apps/files_external/l10n/nl.js index 0dcbe8556a3..7e4b491433e 100644 --- a/apps/files_external/l10n/nl.js +++ b/apps/files_external/l10n/nl.js @@ -26,7 +26,7 @@ OC.L10N.register( "Host" : "Host", "Username" : "Gebruikersnaam", "Password" : "Wachtwoord", - "Root" : "Root", + "Remote subfolder" : "Externe submap", "Secure ftps://" : "Secure ftps://", "Client ID" : "Client ID", "Client secret" : "Client secret", @@ -43,7 +43,6 @@ OC.L10N.register( "Username as share" : "Gebruikersnaam als share", "URL" : "URL", "Secure https://" : "Secure https://", - "Remote subfolder" : "Externe submap", "Access granted" : "Toegang toegestaan", "Error configuring Dropbox storage" : "Fout tijdens het configureren van Dropbox opslag", "Grant access" : "Sta toegang toe", @@ -54,11 +53,12 @@ OC.L10N.register( "(group)" : "(groep)", "Saved" : "Bewaard", "<b>Note:</b> " : "<b>Let op:</b> ", - " and " : "en", + "and" : "en", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Let op:</b> Curl ondersteuning in PHP is niet geactiveerd of geïnstalleerd. Mounten van %s is niet mogelijk. Vraag uw systeembeheerder dit te installeren.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Let op:</b> FTP ondersteuning in PHP is niet geactiveerd of geïnstalleerd. Mounten van %s is niet mogelijk. Vraag uw beheerder dit te installeren.", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Let op:</b> \"%s\" is niet geïnstalleerd. Mounten van %s is niet mogelijk. Vraag uw beheerder om dit te installeren.", - "You don't have any external storages" : "U hebt geen externe opslag", + "No external storages configured" : "Geen externe opslag geconfigureerd", + "You can configure external storages in the personal settings" : "U kunt externe opslag configureren in persoonlijke instellingen", "Name" : "Naam", "Storage type" : "Opslagtype", "Scope" : "Scope", diff --git a/apps/files_external/l10n/nl.json b/apps/files_external/l10n/nl.json index 135aea89664..ff01cca6bd3 100644 --- a/apps/files_external/l10n/nl.json +++ b/apps/files_external/l10n/nl.json @@ -24,7 +24,7 @@ "Host" : "Host", "Username" : "Gebruikersnaam", "Password" : "Wachtwoord", - "Root" : "Root", + "Remote subfolder" : "Externe submap", "Secure ftps://" : "Secure ftps://", "Client ID" : "Client ID", "Client secret" : "Client secret", @@ -41,7 +41,6 @@ "Username as share" : "Gebruikersnaam als share", "URL" : "URL", "Secure https://" : "Secure https://", - "Remote subfolder" : "Externe submap", "Access granted" : "Toegang toegestaan", "Error configuring Dropbox storage" : "Fout tijdens het configureren van Dropbox opslag", "Grant access" : "Sta toegang toe", @@ -52,11 +51,12 @@ "(group)" : "(groep)", "Saved" : "Bewaard", "<b>Note:</b> " : "<b>Let op:</b> ", - " and " : "en", + "and" : "en", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Let op:</b> Curl ondersteuning in PHP is niet geactiveerd of geïnstalleerd. Mounten van %s is niet mogelijk. Vraag uw systeembeheerder dit te installeren.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Let op:</b> FTP ondersteuning in PHP is niet geactiveerd of geïnstalleerd. Mounten van %s is niet mogelijk. Vraag uw beheerder dit te installeren.", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Let op:</b> \"%s\" is niet geïnstalleerd. Mounten van %s is niet mogelijk. Vraag uw beheerder om dit te installeren.", - "You don't have any external storages" : "U hebt geen externe opslag", + "No external storages configured" : "Geen externe opslag geconfigureerd", + "You can configure external storages in the personal settings" : "U kunt externe opslag configureren in persoonlijke instellingen", "Name" : "Naam", "Storage type" : "Opslagtype", "Scope" : "Scope", diff --git a/apps/files_external/l10n/pl.js b/apps/files_external/l10n/pl.js index a20f61c4677..d1e330912cc 100644 --- a/apps/files_external/l10n/pl.js +++ b/apps/files_external/l10n/pl.js @@ -26,7 +26,7 @@ OC.L10N.register( "Host" : "Host", "Username" : "Nazwa użytkownika", "Password" : "Hasło", - "Root" : "Root", + "Remote subfolder" : "Zdalny podfolder", "Secure ftps://" : "Bezpieczny ftps://", "Client ID" : "ID klienta", "Client secret" : "Hasło klienta", @@ -43,7 +43,6 @@ OC.L10N.register( "Username as share" : "Użytkownik jako zasób", "URL" : "URL", "Secure https://" : "Bezpieczny https://", - "Remote subfolder" : "Zdalny podfolder", "Access granted" : "Dostęp do", "Error configuring Dropbox storage" : "Wystąpił błąd podczas konfigurowania zasobu Dropbox", "Grant access" : "Udziel dostępu", @@ -54,11 +53,11 @@ OC.L10N.register( "(group)" : "(grupa)", "Saved" : "Zapisano", "<b>Note:</b> " : "<b>Uwaga:</b> ", - " and " : "oraz", + "and" : "i", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Uwaga:</b> Wsparcie dla cURL w PHP nie zostało włączone lub zainstalowane. Zamontowanie %s nie jest możliwe. Proszę poproś Twojego administratora o zainstalowanie go.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Uwaga:</b> Wsparcie dla FTP w PHP nie zostało włączone lub zainstalowane. Zamontowanie %s nie jest możliwe. Proszę poproś Twojego administratora o zainstalowanie go.", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Uwaga:</b> \"%s\" nie jest zainstalowane. Zamontowanie %s nie jest możliwe. Proszę poproś Twojego administratora o zainstalowanie go.", - "You don't have any external storages" : "Nie masz żadnych zewnętrznych magazynów", + "You can configure external storages in the personal settings" : "Możesz skonfigurować zewnętrzne zasoby w ustawieniach personalnych", "Name" : "Nazwa", "Storage type" : "Typ magazynu", "Scope" : "Zakres", diff --git a/apps/files_external/l10n/pl.json b/apps/files_external/l10n/pl.json index c838595674d..41800919db8 100644 --- a/apps/files_external/l10n/pl.json +++ b/apps/files_external/l10n/pl.json @@ -24,7 +24,7 @@ "Host" : "Host", "Username" : "Nazwa użytkownika", "Password" : "Hasło", - "Root" : "Root", + "Remote subfolder" : "Zdalny podfolder", "Secure ftps://" : "Bezpieczny ftps://", "Client ID" : "ID klienta", "Client secret" : "Hasło klienta", @@ -41,7 +41,6 @@ "Username as share" : "Użytkownik jako zasób", "URL" : "URL", "Secure https://" : "Bezpieczny https://", - "Remote subfolder" : "Zdalny podfolder", "Access granted" : "Dostęp do", "Error configuring Dropbox storage" : "Wystąpił błąd podczas konfigurowania zasobu Dropbox", "Grant access" : "Udziel dostępu", @@ -52,11 +51,11 @@ "(group)" : "(grupa)", "Saved" : "Zapisano", "<b>Note:</b> " : "<b>Uwaga:</b> ", - " and " : "oraz", + "and" : "i", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Uwaga:</b> Wsparcie dla cURL w PHP nie zostało włączone lub zainstalowane. Zamontowanie %s nie jest możliwe. Proszę poproś Twojego administratora o zainstalowanie go.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Uwaga:</b> Wsparcie dla FTP w PHP nie zostało włączone lub zainstalowane. Zamontowanie %s nie jest możliwe. Proszę poproś Twojego administratora o zainstalowanie go.", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Uwaga:</b> \"%s\" nie jest zainstalowane. Zamontowanie %s nie jest możliwe. Proszę poproś Twojego administratora o zainstalowanie go.", - "You don't have any external storages" : "Nie masz żadnych zewnętrznych magazynów", + "You can configure external storages in the personal settings" : "Możesz skonfigurować zewnętrzne zasoby w ustawieniach personalnych", "Name" : "Nazwa", "Storage type" : "Typ magazynu", "Scope" : "Zakres", diff --git a/apps/files_external/l10n/pt_BR.js b/apps/files_external/l10n/pt_BR.js index e9ec582e182..30d3f90c99e 100644 --- a/apps/files_external/l10n/pt_BR.js +++ b/apps/files_external/l10n/pt_BR.js @@ -26,7 +26,7 @@ OC.L10N.register( "Host" : "Host", "Username" : "Nome de Usuário", "Password" : "Senha", - "Root" : "Raiz", + "Remote subfolder" : "Subpasta remota", "Secure ftps://" : "Seguro ftps://", "Client ID" : "ID do Cliente", "Client secret" : "Segredo do cliente", @@ -43,7 +43,6 @@ OC.L10N.register( "Username as share" : "Nome de usuário como compartilhado", "URL" : "URL", "Secure https://" : "https:// segura", - "Remote subfolder" : "Subpasta remota", "Access granted" : "Acesso concedido", "Error configuring Dropbox storage" : "Erro ao configurar armazenamento do Dropbox", "Grant access" : "Permitir acesso", @@ -54,11 +53,12 @@ OC.L10N.register( "(group)" : "(grupo)", "Saved" : "Salvo", "<b>Note:</b> " : "<b>Nota:</b>", - " and " : "e", + "and" : "e", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Nota:</b> O suporte cURL do PHP não está habilitado ou instalado. Montagem de %s não é possível. Por favor, solicite ao seu administrador do sistema para instalá-lo.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Nota:</b> O suporte FTP no PHP não está habilitado ou instalado. Montagem de %s não é possível. Por favor, solicite ao seu administrador do sistema para instalá-lo.", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Nota:</b> \"%s\" não está instalado. Montagem de %s não é possível. Por favor, solicite ao seu administrador do sistema para instalá-lo.", - "You don't have any external storages" : "Você não tem nenhuma armazenamento externa", + "No external storages configured" : "Nenhum armazendo externo foi configurado", + "You can configure external storages in the personal settings" : "Você pode configurar armazenamentos externos nas configurações pessoais", "Name" : "Nome", "Storage type" : "Tipo de armazenamento", "Scope" : "Escopo", diff --git a/apps/files_external/l10n/pt_BR.json b/apps/files_external/l10n/pt_BR.json index 9f0907b9d20..b76cda427f2 100644 --- a/apps/files_external/l10n/pt_BR.json +++ b/apps/files_external/l10n/pt_BR.json @@ -24,7 +24,7 @@ "Host" : "Host", "Username" : "Nome de Usuário", "Password" : "Senha", - "Root" : "Raiz", + "Remote subfolder" : "Subpasta remota", "Secure ftps://" : "Seguro ftps://", "Client ID" : "ID do Cliente", "Client secret" : "Segredo do cliente", @@ -41,7 +41,6 @@ "Username as share" : "Nome de usuário como compartilhado", "URL" : "URL", "Secure https://" : "https:// segura", - "Remote subfolder" : "Subpasta remota", "Access granted" : "Acesso concedido", "Error configuring Dropbox storage" : "Erro ao configurar armazenamento do Dropbox", "Grant access" : "Permitir acesso", @@ -52,11 +51,12 @@ "(group)" : "(grupo)", "Saved" : "Salvo", "<b>Note:</b> " : "<b>Nota:</b>", - " and " : "e", + "and" : "e", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Nota:</b> O suporte cURL do PHP não está habilitado ou instalado. Montagem de %s não é possível. Por favor, solicite ao seu administrador do sistema para instalá-lo.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Nota:</b> O suporte FTP no PHP não está habilitado ou instalado. Montagem de %s não é possível. Por favor, solicite ao seu administrador do sistema para instalá-lo.", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Nota:</b> \"%s\" não está instalado. Montagem de %s não é possível. Por favor, solicite ao seu administrador do sistema para instalá-lo.", - "You don't have any external storages" : "Você não tem nenhuma armazenamento externa", + "No external storages configured" : "Nenhum armazendo externo foi configurado", + "You can configure external storages in the personal settings" : "Você pode configurar armazenamentos externos nas configurações pessoais", "Name" : "Nome", "Storage type" : "Tipo de armazenamento", "Scope" : "Escopo", diff --git a/apps/files_external/l10n/pt_PT.js b/apps/files_external/l10n/pt_PT.js index 2d3f342e9e9..cc3c4419619 100644 --- a/apps/files_external/l10n/pt_PT.js +++ b/apps/files_external/l10n/pt_PT.js @@ -26,7 +26,7 @@ OC.L10N.register( "Host" : "Endereço", "Username" : "Nome de utilizador", "Password" : "Palavra-passe", - "Root" : "Raiz", + "Remote subfolder" : "Sub-pasta remota ", "Secure ftps://" : "ftps:// Seguro", "Client ID" : "ID Cliente", "Client secret" : "Segredo do cliente", @@ -43,7 +43,6 @@ OC.L10N.register( "Username as share" : "Utilizar nome de utilizador como partilha", "URL" : "URL", "Secure https://" : "https:// Seguro", - "Remote subfolder" : "Sub-pasta remota ", "Access granted" : "Acesso autorizado", "Error configuring Dropbox storage" : "Erro ao configurar o armazenamento do Dropbox", "Grant access" : "Conceder acesso", @@ -54,11 +53,12 @@ OC.L10N.register( "(group)" : "(grupo)", "Saved" : "Guardado", "<b>Note:</b> " : "<b>Aviso:</b> ", - " and " : "e", + "and" : "e", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Aviso:</b> O suporte cURL no PHP não está activo ou instalado. Não é possível montar %s. Peça ao seu administrador para instalar.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Aviso:</b> O suporte FTP no PHP não está activo ou instalado. Não é possível montar %s. Peça ao seu administrador para instalar.", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Aviso:</b> O cliente\"%s\" não está instalado. Não é possível montar \"%s\" . Peça ao seu administrador para instalar.", - "You don't have any external storages" : "Não possui quaisquer armazenamentos externos", + "No external storages configured" : "Nenhuns armazenamentos externos configurados", + "You can configure external storages in the personal settings" : "Pode configurar os armazenamentos externos nas definições pessoais", "Name" : "Nome", "Storage type" : "Tipo de Armazenamento", "Scope" : "Âmbito", diff --git a/apps/files_external/l10n/pt_PT.json b/apps/files_external/l10n/pt_PT.json index cee9e1b7f1a..e4ebe0236aa 100644 --- a/apps/files_external/l10n/pt_PT.json +++ b/apps/files_external/l10n/pt_PT.json @@ -24,7 +24,7 @@ "Host" : "Endereço", "Username" : "Nome de utilizador", "Password" : "Palavra-passe", - "Root" : "Raiz", + "Remote subfolder" : "Sub-pasta remota ", "Secure ftps://" : "ftps:// Seguro", "Client ID" : "ID Cliente", "Client secret" : "Segredo do cliente", @@ -41,7 +41,6 @@ "Username as share" : "Utilizar nome de utilizador como partilha", "URL" : "URL", "Secure https://" : "https:// Seguro", - "Remote subfolder" : "Sub-pasta remota ", "Access granted" : "Acesso autorizado", "Error configuring Dropbox storage" : "Erro ao configurar o armazenamento do Dropbox", "Grant access" : "Conceder acesso", @@ -52,11 +51,12 @@ "(group)" : "(grupo)", "Saved" : "Guardado", "<b>Note:</b> " : "<b>Aviso:</b> ", - " and " : "e", + "and" : "e", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Aviso:</b> O suporte cURL no PHP não está activo ou instalado. Não é possível montar %s. Peça ao seu administrador para instalar.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Aviso:</b> O suporte FTP no PHP não está activo ou instalado. Não é possível montar %s. Peça ao seu administrador para instalar.", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Aviso:</b> O cliente\"%s\" não está instalado. Não é possível montar \"%s\" . Peça ao seu administrador para instalar.", - "You don't have any external storages" : "Não possui quaisquer armazenamentos externos", + "No external storages configured" : "Nenhuns armazenamentos externos configurados", + "You can configure external storages in the personal settings" : "Pode configurar os armazenamentos externos nas definições pessoais", "Name" : "Nome", "Storage type" : "Tipo de Armazenamento", "Scope" : "Âmbito", diff --git a/apps/files_external/l10n/ro.js b/apps/files_external/l10n/ro.js index b98fd2557b6..bef9b29c81a 100644 --- a/apps/files_external/l10n/ro.js +++ b/apps/files_external/l10n/ro.js @@ -10,7 +10,6 @@ OC.L10N.register( "Host" : "Gazdă", "Username" : "Nume utilizator", "Password" : "Parolă", - "Root" : "Root", "Share" : "Partajează", "URL" : "URL", "Access granted" : "Acces permis", diff --git a/apps/files_external/l10n/ro.json b/apps/files_external/l10n/ro.json index a0e03679958..ee904b6712e 100644 --- a/apps/files_external/l10n/ro.json +++ b/apps/files_external/l10n/ro.json @@ -8,7 +8,6 @@ "Host" : "Gazdă", "Username" : "Nume utilizator", "Password" : "Parolă", - "Root" : "Root", "Share" : "Partajează", "URL" : "URL", "Access granted" : "Acces permis", diff --git a/apps/files_external/l10n/ru.js b/apps/files_external/l10n/ru.js index 35eec150d01..fe537001cc2 100644 --- a/apps/files_external/l10n/ru.js +++ b/apps/files_external/l10n/ru.js @@ -3,7 +3,7 @@ OC.L10N.register( { "Fetching request tokens failed. Verify that your Dropbox app key and secret are correct." : "Ошибка при получении токенов. Проверьте правильность вашего ключа приложения и секретного ключа.", "Fetching access tokens failed. Verify that your Dropbox app key and secret are correct." : "Ошибка при получении токена доступа. Проверьте правильность вашего ключа приложения и секретного ключа.", - "Please provide a valid Dropbox app key and secret." : "Пожалуйста, предоставьте действующий ключ Dropbox и пароль.", + "Please provide a valid Dropbox app key and secret." : "Укажите действительные ключ и пароль для Dropbox.", "Step 1 failed. Exception: %s" : "Шаг 1 неудачен. Исключение: %s", "Step 2 failed. Exception: %s" : "Шаг 2 неудачен. Исключение: %s", "External storage" : "Внешнее хранилище", @@ -26,7 +26,7 @@ OC.L10N.register( "Host" : "Сервер", "Username" : "Имя пользователя", "Password" : "Пароль", - "Root" : "Корневой каталог", + "Remote subfolder" : "Удаленный подкаталог", "Secure ftps://" : "Защищённый ftps://", "Client ID" : "Идентификатор клиента", "Client secret" : "Клиентский ключ ", @@ -38,12 +38,11 @@ OC.L10N.register( "Service Name (required for OpenStack Object Storage)" : "Имя Службы (обяз. для Хранилища объектов OpenStack)", "URL of identity endpoint (required for OpenStack Object Storage)" : "URL для удостоверения конечной точки (обяз. для Хранилища объектов OpenStack)", "Timeout of HTTP requests in seconds" : "Тайм-аут HTTP-запросов в секундах", - "Share" : "Открыть доступ", + "Share" : "Поделиться", "SMB / CIFS using OC login" : "SMB / CIFS с ипользованием логина OC", - "Username as share" : "Имя для открытого доступа", + "Username as share" : "Имя пользователя в качестве имени общего ресурса", "URL" : "Ссылка", "Secure https://" : "Безопасный https://", - "Remote subfolder" : "Удаленный подкаталог", "Access granted" : "Доступ предоставлен", "Error configuring Dropbox storage" : "Ошибка при настройке хранилища Dropbox", "Grant access" : "Предоставить доступ", @@ -54,21 +53,22 @@ OC.L10N.register( "(group)" : "(группа)", "Saved" : "Сохранено", "<b>Note:</b> " : "<b>Примечание:</b> ", - " and " : "и", + "and" : "и", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Примечание:</b> Поддержка cURL в PHP не включена или не установлена. Монтирование %s невозможно. Обратитесь к вашему системному администратору.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Примечание:</b> Поддержка FTP в PHP не включена или не установлена. Монтирование %s невозможно. Пожалуйста, обратитесь к системному администратору.", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Примечание:</b> \"%s\" не установлен. Монтирование %s невозможно. Пожалуйста, обратитесь к системному администратору.", - "You don't have any external storages" : "У вас нет внешних хранилищ", + "No external storages configured" : "Нет внешних носителей", + "You can configure external storages in the personal settings" : "Вы можете изменить параметры внешних носителей в личных настройках", "Name" : "Имя", "Storage type" : "Тип хранилища", "Scope" : "Область", "External Storage" : "Внешнее хранилище", - "Folder name" : "Имя папки", + "Folder name" : "Имя каталога", "Configuration" : "Конфигурация", "Available for" : "Доступно для", "Add storage" : "Добавить хранилище", "Delete" : "Удалить", "Enable User External Storage" : "Включить пользовательские внешние носители", - "Allow users to mount the following external storage" : "Разрешить пользователям монтировать следующее внешнее хранилище данных" + "Allow users to mount the following external storage" : "Разрешить пользователям монтировать следующие сервисы хранения данных" }, "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/apps/files_external/l10n/ru.json b/apps/files_external/l10n/ru.json index 85b9bf38e4c..9f70d469724 100644 --- a/apps/files_external/l10n/ru.json +++ b/apps/files_external/l10n/ru.json @@ -1,7 +1,7 @@ { "translations": { "Fetching request tokens failed. Verify that your Dropbox app key and secret are correct." : "Ошибка при получении токенов. Проверьте правильность вашего ключа приложения и секретного ключа.", "Fetching access tokens failed. Verify that your Dropbox app key and secret are correct." : "Ошибка при получении токена доступа. Проверьте правильность вашего ключа приложения и секретного ключа.", - "Please provide a valid Dropbox app key and secret." : "Пожалуйста, предоставьте действующий ключ Dropbox и пароль.", + "Please provide a valid Dropbox app key and secret." : "Укажите действительные ключ и пароль для Dropbox.", "Step 1 failed. Exception: %s" : "Шаг 1 неудачен. Исключение: %s", "Step 2 failed. Exception: %s" : "Шаг 2 неудачен. Исключение: %s", "External storage" : "Внешнее хранилище", @@ -24,7 +24,7 @@ "Host" : "Сервер", "Username" : "Имя пользователя", "Password" : "Пароль", - "Root" : "Корневой каталог", + "Remote subfolder" : "Удаленный подкаталог", "Secure ftps://" : "Защищённый ftps://", "Client ID" : "Идентификатор клиента", "Client secret" : "Клиентский ключ ", @@ -36,12 +36,11 @@ "Service Name (required for OpenStack Object Storage)" : "Имя Службы (обяз. для Хранилища объектов OpenStack)", "URL of identity endpoint (required for OpenStack Object Storage)" : "URL для удостоверения конечной точки (обяз. для Хранилища объектов OpenStack)", "Timeout of HTTP requests in seconds" : "Тайм-аут HTTP-запросов в секундах", - "Share" : "Открыть доступ", + "Share" : "Поделиться", "SMB / CIFS using OC login" : "SMB / CIFS с ипользованием логина OC", - "Username as share" : "Имя для открытого доступа", + "Username as share" : "Имя пользователя в качестве имени общего ресурса", "URL" : "Ссылка", "Secure https://" : "Безопасный https://", - "Remote subfolder" : "Удаленный подкаталог", "Access granted" : "Доступ предоставлен", "Error configuring Dropbox storage" : "Ошибка при настройке хранилища Dropbox", "Grant access" : "Предоставить доступ", @@ -52,21 +51,22 @@ "(group)" : "(группа)", "Saved" : "Сохранено", "<b>Note:</b> " : "<b>Примечание:</b> ", - " and " : "и", + "and" : "и", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Примечание:</b> Поддержка cURL в PHP не включена или не установлена. Монтирование %s невозможно. Обратитесь к вашему системному администратору.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Примечание:</b> Поддержка FTP в PHP не включена или не установлена. Монтирование %s невозможно. Пожалуйста, обратитесь к системному администратору.", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Примечание:</b> \"%s\" не установлен. Монтирование %s невозможно. Пожалуйста, обратитесь к системному администратору.", - "You don't have any external storages" : "У вас нет внешних хранилищ", + "No external storages configured" : "Нет внешних носителей", + "You can configure external storages in the personal settings" : "Вы можете изменить параметры внешних носителей в личных настройках", "Name" : "Имя", "Storage type" : "Тип хранилища", "Scope" : "Область", "External Storage" : "Внешнее хранилище", - "Folder name" : "Имя папки", + "Folder name" : "Имя каталога", "Configuration" : "Конфигурация", "Available for" : "Доступно для", "Add storage" : "Добавить хранилище", "Delete" : "Удалить", "Enable User External Storage" : "Включить пользовательские внешние носители", - "Allow users to mount the following external storage" : "Разрешить пользователям монтировать следующее внешнее хранилище данных" + "Allow users to mount the following external storage" : "Разрешить пользователям монтировать следующие сервисы хранения данных" },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" }
\ No newline at end of file diff --git a/apps/files_external/l10n/sk.php b/apps/files_external/l10n/sk.php deleted file mode 100644 index 9418c949228..00000000000 --- a/apps/files_external/l10n/sk.php +++ /dev/null @@ -1,8 +0,0 @@ -<?php -$TRANSLATIONS = array( -"Location" => "Poloha", -"Share" => "Zdieľať", -"Personal" => "Osobné", -"Delete" => "Odstrániť" -); -$PLURAL_FORMS = "nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"; diff --git a/apps/files_external/l10n/sk_SK.js b/apps/files_external/l10n/sk_SK.js index 636953c42ea..67de616dfc6 100644 --- a/apps/files_external/l10n/sk_SK.js +++ b/apps/files_external/l10n/sk_SK.js @@ -26,7 +26,7 @@ OC.L10N.register( "Host" : "Hostiteľ", "Username" : "Používateľské meno", "Password" : "Heslo", - "Root" : "Root", + "Remote subfolder" : "Vzdialený podpriečinok", "Secure ftps://" : "Zabezpečené ftps://", "Client ID" : "Client ID", "Client secret" : "Heslo klienta", @@ -43,7 +43,6 @@ OC.L10N.register( "Username as share" : "Používateľské meno ako zdieľaný priečinok", "URL" : "URL", "Secure https://" : "Zabezpečené https://", - "Remote subfolder" : "Vzdialený podpriečinok", "Access granted" : "Prístup povolený", "Error configuring Dropbox storage" : "Chyba pri konfigurácii úložiska Dropbox", "Grant access" : "Povoliť prístup", @@ -54,11 +53,9 @@ OC.L10N.register( "(group)" : "(skupina)", "Saved" : "Uložené", "<b>Note:</b> " : "<b>Poznámka:</b> ", - " and " : "a", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Poznámka:</b> cURL podpora v PHP nie je zapnutá alebo nainštalovaná. Pripojenie %s nie je možné. Požiadajte správcu systému, aby ju nainštaloval.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Poznámka:</b> FTP podpora v PHP nie je zapnutá alebo nainštalovaná. Pripojenie %s nie je možné. Požiadajte správcu systému, aby ju nainštaloval.", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Poznámka:</b> \"%s\" nie je nainštalovaná. Pripojenie %s nie je možné. Požiadajte správcu systému, aby ju nainštaloval.", - "You don't have any external storages" : "Nemáte žiadne externé úložisko", "Name" : "Názov", "Storage type" : "Typ úložiska", "Scope" : "Rozsah", diff --git a/apps/files_external/l10n/sk_SK.json b/apps/files_external/l10n/sk_SK.json index 5d2ca0a95a0..3ad132167df 100644 --- a/apps/files_external/l10n/sk_SK.json +++ b/apps/files_external/l10n/sk_SK.json @@ -24,7 +24,7 @@ "Host" : "Hostiteľ", "Username" : "Používateľské meno", "Password" : "Heslo", - "Root" : "Root", + "Remote subfolder" : "Vzdialený podpriečinok", "Secure ftps://" : "Zabezpečené ftps://", "Client ID" : "Client ID", "Client secret" : "Heslo klienta", @@ -41,7 +41,6 @@ "Username as share" : "Používateľské meno ako zdieľaný priečinok", "URL" : "URL", "Secure https://" : "Zabezpečené https://", - "Remote subfolder" : "Vzdialený podpriečinok", "Access granted" : "Prístup povolený", "Error configuring Dropbox storage" : "Chyba pri konfigurácii úložiska Dropbox", "Grant access" : "Povoliť prístup", @@ -52,11 +51,9 @@ "(group)" : "(skupina)", "Saved" : "Uložené", "<b>Note:</b> " : "<b>Poznámka:</b> ", - " and " : "a", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Poznámka:</b> cURL podpora v PHP nie je zapnutá alebo nainštalovaná. Pripojenie %s nie je možné. Požiadajte správcu systému, aby ju nainštaloval.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Poznámka:</b> FTP podpora v PHP nie je zapnutá alebo nainštalovaná. Pripojenie %s nie je možné. Požiadajte správcu systému, aby ju nainštaloval.", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Poznámka:</b> \"%s\" nie je nainštalovaná. Pripojenie %s nie je možné. Požiadajte správcu systému, aby ju nainštaloval.", - "You don't have any external storages" : "Nemáte žiadne externé úložisko", "Name" : "Názov", "Storage type" : "Typ úložiska", "Scope" : "Rozsah", diff --git a/apps/files_external/l10n/sl.js b/apps/files_external/l10n/sl.js index 690fd9ae322..a68849a12f6 100644 --- a/apps/files_external/l10n/sl.js +++ b/apps/files_external/l10n/sl.js @@ -26,7 +26,7 @@ OC.L10N.register( "Host" : "Gostitelj", "Username" : "Uporabniško ime", "Password" : "Geslo", - "Root" : "Koren", + "Remote subfolder" : "Oddaljena podrejena mapa", "Secure ftps://" : "Varni način ftps://", "Client ID" : "ID odjemalca", "Client secret" : "Skrivni ključ odjemalca", @@ -43,7 +43,6 @@ OC.L10N.register( "Username as share" : "Uporabniško ime za souporabo", "URL" : "Naslov URL", "Secure https://" : "Varni način https://", - "Remote subfolder" : "Oddaljena podrejena mapa", "Access granted" : "Dostop je odobren", "Error configuring Dropbox storage" : "Napaka nastavljanja shrambe Dropbox", "Grant access" : "Odobri dostop", @@ -54,11 +53,12 @@ OC.L10N.register( "(group)" : "(skupina)", "Saved" : "Shranjeno", "<b>Note:</b> " : "<b>Opomba:</b> ", - " and " : "in", + "and" : "in", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Opomba:</b> Podpora za naslove cURL v PHP ni omogočena, ali pa ni ustrezno nameščenih programov. Priklapljanje %s ni mogoče. Za pomoč pri namestitvi se obrnite na sistemskega skrbnika.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Opomba:</b> Podpora za protokol FTP v PHP ni omogočena, ali pa ni ustrezno nameščenih programov. Priklapljanje %s ni mogoče. Za pomoč pri namestitvi se obrnite na sistemskega skrbnika.", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Opomba:</b> Program \"%s\" ni nameščen. Priklapljanje %s ni mogoče. Za pomoč pri namestitvi se obrnite na sistemskega skrbnika.", - "You don't have any external storages" : "Ni navedenih zunanjih shramb", + "No external storages configured" : "Ni določene zunanje shrambe", + "You can configure external storages in the personal settings" : "Zunanjo shrambo je mogoče določiti med osebnimi nastavitvami", "Name" : "Ime", "Storage type" : "Vrsta shrambe", "Scope" : "Obseg", diff --git a/apps/files_external/l10n/sl.json b/apps/files_external/l10n/sl.json index c92e9a310d8..4ee4fedfc09 100644 --- a/apps/files_external/l10n/sl.json +++ b/apps/files_external/l10n/sl.json @@ -24,7 +24,7 @@ "Host" : "Gostitelj", "Username" : "Uporabniško ime", "Password" : "Geslo", - "Root" : "Koren", + "Remote subfolder" : "Oddaljena podrejena mapa", "Secure ftps://" : "Varni način ftps://", "Client ID" : "ID odjemalca", "Client secret" : "Skrivni ključ odjemalca", @@ -41,7 +41,6 @@ "Username as share" : "Uporabniško ime za souporabo", "URL" : "Naslov URL", "Secure https://" : "Varni način https://", - "Remote subfolder" : "Oddaljena podrejena mapa", "Access granted" : "Dostop je odobren", "Error configuring Dropbox storage" : "Napaka nastavljanja shrambe Dropbox", "Grant access" : "Odobri dostop", @@ -52,11 +51,12 @@ "(group)" : "(skupina)", "Saved" : "Shranjeno", "<b>Note:</b> " : "<b>Opomba:</b> ", - " and " : "in", + "and" : "in", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Opomba:</b> Podpora za naslove cURL v PHP ni omogočena, ali pa ni ustrezno nameščenih programov. Priklapljanje %s ni mogoče. Za pomoč pri namestitvi se obrnite na sistemskega skrbnika.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Opomba:</b> Podpora za protokol FTP v PHP ni omogočena, ali pa ni ustrezno nameščenih programov. Priklapljanje %s ni mogoče. Za pomoč pri namestitvi se obrnite na sistemskega skrbnika.", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Opomba:</b> Program \"%s\" ni nameščen. Priklapljanje %s ni mogoče. Za pomoč pri namestitvi se obrnite na sistemskega skrbnika.", - "You don't have any external storages" : "Ni navedenih zunanjih shramb", + "No external storages configured" : "Ni določene zunanje shrambe", + "You can configure external storages in the personal settings" : "Zunanjo shrambo je mogoče določiti med osebnimi nastavitvami", "Name" : "Ime", "Storage type" : "Vrsta shrambe", "Scope" : "Obseg", diff --git a/apps/files_external/l10n/sr@latin.js b/apps/files_external/l10n/sr@latin.js index 518d9e3957d..bf67124cf6a 100644 --- a/apps/files_external/l10n/sr@latin.js +++ b/apps/files_external/l10n/sr@latin.js @@ -1,13 +1,74 @@ OC.L10N.register( "files_external", { + "Fetching request tokens failed. Verify that your Dropbox app key and secret are correct." : "Dobavljanje detalja zahteva nije uspelo. Proverite da li su Vaš ključ aplikacije za Dropbox i tajna lozinka ispravni.", + "Fetching access tokens failed. Verify that your Dropbox app key and secret are correct." : "Dobavljanje detalja pristupa nije uspelo. Proverite da li su Vaš Dropbox ključ aplikacije i tajna lozinka ispravni.", + "Please provide a valid Dropbox app key and secret." : "Molimo unesite ispravan Dropbox ključ aplikacije i tajnu lozinku.", + "Step 1 failed. Exception: %s" : "Korak 1 nije uspeo. Izuzetak: %s", + "Step 2 failed. Exception: %s" : "Korak 2 nije uspeo. Izuzetak: %s", + "External storage" : "Spoljašnje skladište", + "Local" : "Lokalno", "Location" : "Lokacija", + "Amazon S3" : "Amazon S3", + "Key" : "Ključ", + "Secret" : "Tajna lozinka", + "Bucket" : "Korpa", + "Amazon S3 and compliant" : "Amazon S3 i kompatibilni", + "Access Key" : "Pristupni Ključ", + "Secret Key" : "Tajni Ključ", + "Hostname" : "Ime računara", + "Port" : "Port", "Region" : "Regija", + "Enable SSL" : "Uključi SSL", + "Enable Path Style" : "Omogući stil putanje", + "App key" : "Ključ Aplikacije", + "App secret" : "Tajna lozinka Aplikacije", + "Host" : "Računar", "Username" : "Korisničko ime", "Password" : "Lozinka", + "Remote subfolder" : "Udaljeni poddirektorijum", + "Secure ftps://" : "Sigurni ftps://", + "Client ID" : "Identifikator klijenta", + "Client secret" : "Tajna lozinka klijenta", + "OpenStack Object Storage" : "OpenStack skladište objekata", + "Region (optional for OpenStack Object Storage)" : "Region (opciono za OpenStack skladište objekata)", + "API Key (required for Rackspace Cloud Files)" : "API ključ (neophodno za Rackspace datoteke u oblaku)", + "Tenantname (required for OpenStack Object Storage)" : "Ime stanara (neophodno za OpenStack skladište objekata)", + "Password (required for OpenStack Object Storage)" : "Lozinka (neophodno za OpenStack skladište objekata)", + "Service Name (required for OpenStack Object Storage)" : "Ime Servisa (neophodno za OpenStack skladište objekata)", + "URL of identity endpoint (required for OpenStack Object Storage)" : "URL krajnje tačke identiteta (neophodno za OpenStack skladište objekata)", + "Timeout of HTTP requests in seconds" : "Ograničenje vremena veze HTTP zahteva u sekundama", "Share" : "Podeli", + "SMB / CIFS using OC login" : "SMB / CIFS koji koristi OC prijavljivanje", + "Username as share" : "Korisničko ime i deljeni direktorijum", + "URL" : "URL", + "Secure https://" : "Sigurni https://", + "Access granted" : "Pristup Dozvoljen", + "Error configuring Dropbox storage" : "Greška u podešavanju Dropbox skladišta", + "Grant access" : "Dozvoli pristup", + "Error configuring Google Drive storage" : "Greška u podešavanju Google Disk skladišta", "Personal" : "Lično", + "System" : "Sistemsko", + "All users. Type to select user or group." : "Svi korisnici. Kucajte da biste izabrali korisnika ili grupu.", + "(group)" : "(grupa)", + "Saved" : "Sačuvano", + "<b>Note:</b> " : "<b>Obratite pažnju:</b>", + "and" : "i", + "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Obratite pažnju</b> Podrška za cURL u PHP-u nije uključena ili instalirana. Montiranje %s nije moguće. Molimo Vas da se obratite Vašem sistem administratoru da je instalira.", + "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Obratite pažnju:</b> FTP podrška u PHP-u nije uključena ili instalirana. Montiranje %s nije moguće. Molimo Vas da tražite od Vašeg sistem administratora da je instalira.", + "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Obratite pažnju:</b> \"%s\" nije instaliran. Monitranje %s nije moguće. Molimo Vas da se obratite Vašem sistem administratoru da to instalira.", + "No external storages configured" : "Nema podešenih spoljašnjih skladišta", + "You can configure external storages in the personal settings" : "Možete da podešavate spoljašnja skladišta u ličnim podešavanjima", "Name" : "Ime", - "Delete" : "Obriši" + "Storage type" : "Tip skladišta", + "Scope" : "Opseg", + "External Storage" : "Spoljašnje skladište", + "Folder name" : "Ime fascikle", + "Configuration" : "Podešavanje", + "Available for" : "Dostupno za", + "Add storage" : "Dodaj skladište", + "Delete" : "Obriši", + "Enable User External Storage" : "Omogući korisničko spoljašnje skladište", + "Allow users to mount the following external storage" : "Omogući korisnicima da namontiraju sledeće spoljašnje skladište" }, "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/apps/files_external/l10n/sr@latin.json b/apps/files_external/l10n/sr@latin.json index 9dbfe640d85..057cdc2c6a7 100644 --- a/apps/files_external/l10n/sr@latin.json +++ b/apps/files_external/l10n/sr@latin.json @@ -1,11 +1,72 @@ { "translations": { + "Fetching request tokens failed. Verify that your Dropbox app key and secret are correct." : "Dobavljanje detalja zahteva nije uspelo. Proverite da li su Vaš ključ aplikacije za Dropbox i tajna lozinka ispravni.", + "Fetching access tokens failed. Verify that your Dropbox app key and secret are correct." : "Dobavljanje detalja pristupa nije uspelo. Proverite da li su Vaš Dropbox ključ aplikacije i tajna lozinka ispravni.", + "Please provide a valid Dropbox app key and secret." : "Molimo unesite ispravan Dropbox ključ aplikacije i tajnu lozinku.", + "Step 1 failed. Exception: %s" : "Korak 1 nije uspeo. Izuzetak: %s", + "Step 2 failed. Exception: %s" : "Korak 2 nije uspeo. Izuzetak: %s", + "External storage" : "Spoljašnje skladište", + "Local" : "Lokalno", "Location" : "Lokacija", + "Amazon S3" : "Amazon S3", + "Key" : "Ključ", + "Secret" : "Tajna lozinka", + "Bucket" : "Korpa", + "Amazon S3 and compliant" : "Amazon S3 i kompatibilni", + "Access Key" : "Pristupni Ključ", + "Secret Key" : "Tajni Ključ", + "Hostname" : "Ime računara", + "Port" : "Port", "Region" : "Regija", + "Enable SSL" : "Uključi SSL", + "Enable Path Style" : "Omogući stil putanje", + "App key" : "Ključ Aplikacije", + "App secret" : "Tajna lozinka Aplikacije", + "Host" : "Računar", "Username" : "Korisničko ime", "Password" : "Lozinka", + "Remote subfolder" : "Udaljeni poddirektorijum", + "Secure ftps://" : "Sigurni ftps://", + "Client ID" : "Identifikator klijenta", + "Client secret" : "Tajna lozinka klijenta", + "OpenStack Object Storage" : "OpenStack skladište objekata", + "Region (optional for OpenStack Object Storage)" : "Region (opciono za OpenStack skladište objekata)", + "API Key (required for Rackspace Cloud Files)" : "API ključ (neophodno za Rackspace datoteke u oblaku)", + "Tenantname (required for OpenStack Object Storage)" : "Ime stanara (neophodno za OpenStack skladište objekata)", + "Password (required for OpenStack Object Storage)" : "Lozinka (neophodno za OpenStack skladište objekata)", + "Service Name (required for OpenStack Object Storage)" : "Ime Servisa (neophodno za OpenStack skladište objekata)", + "URL of identity endpoint (required for OpenStack Object Storage)" : "URL krajnje tačke identiteta (neophodno za OpenStack skladište objekata)", + "Timeout of HTTP requests in seconds" : "Ograničenje vremena veze HTTP zahteva u sekundama", "Share" : "Podeli", + "SMB / CIFS using OC login" : "SMB / CIFS koji koristi OC prijavljivanje", + "Username as share" : "Korisničko ime i deljeni direktorijum", + "URL" : "URL", + "Secure https://" : "Sigurni https://", + "Access granted" : "Pristup Dozvoljen", + "Error configuring Dropbox storage" : "Greška u podešavanju Dropbox skladišta", + "Grant access" : "Dozvoli pristup", + "Error configuring Google Drive storage" : "Greška u podešavanju Google Disk skladišta", "Personal" : "Lično", + "System" : "Sistemsko", + "All users. Type to select user or group." : "Svi korisnici. Kucajte da biste izabrali korisnika ili grupu.", + "(group)" : "(grupa)", + "Saved" : "Sačuvano", + "<b>Note:</b> " : "<b>Obratite pažnju:</b>", + "and" : "i", + "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Obratite pažnju</b> Podrška za cURL u PHP-u nije uključena ili instalirana. Montiranje %s nije moguće. Molimo Vas da se obratite Vašem sistem administratoru da je instalira.", + "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Obratite pažnju:</b> FTP podrška u PHP-u nije uključena ili instalirana. Montiranje %s nije moguće. Molimo Vas da tražite od Vašeg sistem administratora da je instalira.", + "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Obratite pažnju:</b> \"%s\" nije instaliran. Monitranje %s nije moguće. Molimo Vas da se obratite Vašem sistem administratoru da to instalira.", + "No external storages configured" : "Nema podešenih spoljašnjih skladišta", + "You can configure external storages in the personal settings" : "Možete da podešavate spoljašnja skladišta u ličnim podešavanjima", "Name" : "Ime", - "Delete" : "Obriši" + "Storage type" : "Tip skladišta", + "Scope" : "Opseg", + "External Storage" : "Spoljašnje skladište", + "Folder name" : "Ime fascikle", + "Configuration" : "Podešavanje", + "Available for" : "Dostupno za", + "Add storage" : "Dodaj skladište", + "Delete" : "Obriši", + "Enable User External Storage" : "Omogući korisničko spoljašnje skladište", + "Allow users to mount the following external storage" : "Omogući korisnicima da namontiraju sledeće spoljašnje skladište" },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" }
\ No newline at end of file diff --git a/apps/files_external/l10n/sv.js b/apps/files_external/l10n/sv.js index cb12208c49a..d4049efcfa4 100644 --- a/apps/files_external/l10n/sv.js +++ b/apps/files_external/l10n/sv.js @@ -4,6 +4,8 @@ OC.L10N.register( "Fetching request tokens failed. Verify that your Dropbox app key and secret are correct." : "Misslyckades att hämta access tokens. Verifiera att din Dropbox app-nyckel och app-hemlighet är korrekt", "Fetching access tokens failed. Verify that your Dropbox app key and secret are correct." : "Misslyckades att hämta request tokens. Verifiera att din Dropbox app-nyckel och app-hemlighet är korrekt", "Please provide a valid Dropbox app key and secret." : "Ange en giltig Dropbox nyckel och hemlighet.", + "Step 1 failed. Exception: %s" : "Steg 1 flaerade. Undantag: %s", + "Step 2 failed. Exception: %s" : "Steg 2 falerade. Undantag: %s", "External storage" : "Extern lagring", "Local" : "Lokal", "Location" : "Plats", @@ -14,6 +16,7 @@ OC.L10N.register( "Amazon S3 and compliant" : "Amazon S3 och compliant", "Access Key" : "Accessnyckel", "Secret Key" : "Hemlig nyckel", + "Hostname" : "Värdnamn", "Port" : "Port", "Region" : "Län", "Enable SSL" : "Aktivera SSL", @@ -23,7 +26,7 @@ OC.L10N.register( "Host" : "Server", "Username" : "Användarnamn", "Password" : "Lösenord", - "Root" : "Root", + "Remote subfolder" : "Fjärrmapp", "Secure ftps://" : "Säker ftps://", "Client ID" : "Klient ID", "Client secret" : "klient secret", @@ -34,25 +37,28 @@ OC.L10N.register( "Password (required for OpenStack Object Storage)" : "Lösenord (krävs för OpenStack Object Storage)", "Service Name (required for OpenStack Object Storage)" : "Tjänstens namn (krävs för OpenStack Object Storage)", "URL of identity endpoint (required for OpenStack Object Storage)" : "URL för identitetens slutpunkt (krävs för OpenStack Object Storage)", + "Timeout of HTTP requests in seconds" : "Timeout för HTTP-anrop i sekunder", "Share" : "Dela", "SMB / CIFS using OC login" : "SMB / CIFS använder OC inloggning", "Username as share" : "Användarnamn till utdelning", "URL" : "URL", "Secure https://" : "Säker https://", - "Remote subfolder" : "Fjärrmapp", "Access granted" : "Åtkomst beviljad", "Error configuring Dropbox storage" : "Fel vid konfigurering av Dropbox", "Grant access" : "Bevilja åtkomst", "Error configuring Google Drive storage" : "Fel vid konfigurering av Google Drive", "Personal" : "Personligt", "System" : "System", + "All users. Type to select user or group." : "Alla användare. Skriv för att välja användare eller grupp.", + "(group)" : "(grupp)", "Saved" : "Sparad", "<b>Note:</b> " : "<b> OBS: </ b>", - " and " : "och", - "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b> OBS: </ b> cURL stöd i PHP inte är aktiverat eller installeras. Montering av %s är inte möjlig. Be din systemadministratör att installera det.", - "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b> OBS: </ b> Den FTP-stöd i PHP inte är aktiverat eller installeras. Montering av %s är inte möjlig. Be din systemadministratör att installera det.", + "and" : "och", + "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b> OBS: </ b> cURL-stöd i PHP inte är aktiverat eller installerat. Montering av %s är inte möjlig. Be din systemadministratör att installera det.", + "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b> OBS: </ b> FTP-stödet i PHP inte är aktiverat eller installerat. Montering av %s är inte möjlig. Be din systemadministratör att installera det.", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b> OBS: </ b> \"%s\" är inte installerat. Montering av %s är inte möjlig. Be din systemadministratör att installera det.", - "You don't have any external storages" : "Du har ingen extern extern lagring", + "No external storages configured" : "Inga externa lagringsplatser konfigurerade", + "You can configure external storages in the personal settings" : "Du kan konfigurera externa laringsplatser i personliga inställningar", "Name" : "Namn", "Storage type" : "Lagringstyp", "Scope" : "Scope", diff --git a/apps/files_external/l10n/sv.json b/apps/files_external/l10n/sv.json index 12b9f36fd5d..caf24335e9f 100644 --- a/apps/files_external/l10n/sv.json +++ b/apps/files_external/l10n/sv.json @@ -2,6 +2,8 @@ "Fetching request tokens failed. Verify that your Dropbox app key and secret are correct." : "Misslyckades att hämta access tokens. Verifiera att din Dropbox app-nyckel och app-hemlighet är korrekt", "Fetching access tokens failed. Verify that your Dropbox app key and secret are correct." : "Misslyckades att hämta request tokens. Verifiera att din Dropbox app-nyckel och app-hemlighet är korrekt", "Please provide a valid Dropbox app key and secret." : "Ange en giltig Dropbox nyckel och hemlighet.", + "Step 1 failed. Exception: %s" : "Steg 1 flaerade. Undantag: %s", + "Step 2 failed. Exception: %s" : "Steg 2 falerade. Undantag: %s", "External storage" : "Extern lagring", "Local" : "Lokal", "Location" : "Plats", @@ -12,6 +14,7 @@ "Amazon S3 and compliant" : "Amazon S3 och compliant", "Access Key" : "Accessnyckel", "Secret Key" : "Hemlig nyckel", + "Hostname" : "Värdnamn", "Port" : "Port", "Region" : "Län", "Enable SSL" : "Aktivera SSL", @@ -21,7 +24,7 @@ "Host" : "Server", "Username" : "Användarnamn", "Password" : "Lösenord", - "Root" : "Root", + "Remote subfolder" : "Fjärrmapp", "Secure ftps://" : "Säker ftps://", "Client ID" : "Klient ID", "Client secret" : "klient secret", @@ -32,25 +35,28 @@ "Password (required for OpenStack Object Storage)" : "Lösenord (krävs för OpenStack Object Storage)", "Service Name (required for OpenStack Object Storage)" : "Tjänstens namn (krävs för OpenStack Object Storage)", "URL of identity endpoint (required for OpenStack Object Storage)" : "URL för identitetens slutpunkt (krävs för OpenStack Object Storage)", + "Timeout of HTTP requests in seconds" : "Timeout för HTTP-anrop i sekunder", "Share" : "Dela", "SMB / CIFS using OC login" : "SMB / CIFS använder OC inloggning", "Username as share" : "Användarnamn till utdelning", "URL" : "URL", "Secure https://" : "Säker https://", - "Remote subfolder" : "Fjärrmapp", "Access granted" : "Åtkomst beviljad", "Error configuring Dropbox storage" : "Fel vid konfigurering av Dropbox", "Grant access" : "Bevilja åtkomst", "Error configuring Google Drive storage" : "Fel vid konfigurering av Google Drive", "Personal" : "Personligt", "System" : "System", + "All users. Type to select user or group." : "Alla användare. Skriv för att välja användare eller grupp.", + "(group)" : "(grupp)", "Saved" : "Sparad", "<b>Note:</b> " : "<b> OBS: </ b>", - " and " : "och", - "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b> OBS: </ b> cURL stöd i PHP inte är aktiverat eller installeras. Montering av %s är inte möjlig. Be din systemadministratör att installera det.", - "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b> OBS: </ b> Den FTP-stöd i PHP inte är aktiverat eller installeras. Montering av %s är inte möjlig. Be din systemadministratör att installera det.", + "and" : "och", + "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b> OBS: </ b> cURL-stöd i PHP inte är aktiverat eller installerat. Montering av %s är inte möjlig. Be din systemadministratör att installera det.", + "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b> OBS: </ b> FTP-stödet i PHP inte är aktiverat eller installerat. Montering av %s är inte möjlig. Be din systemadministratör att installera det.", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b> OBS: </ b> \"%s\" är inte installerat. Montering av %s är inte möjlig. Be din systemadministratör att installera det.", - "You don't have any external storages" : "Du har ingen extern extern lagring", + "No external storages configured" : "Inga externa lagringsplatser konfigurerade", + "You can configure external storages in the personal settings" : "Du kan konfigurera externa laringsplatser i personliga inställningar", "Name" : "Namn", "Storage type" : "Lagringstyp", "Scope" : "Scope", diff --git a/apps/files_external/l10n/tr.js b/apps/files_external/l10n/tr.js index cbe240b5818..4672fee457c 100644 --- a/apps/files_external/l10n/tr.js +++ b/apps/files_external/l10n/tr.js @@ -26,7 +26,7 @@ OC.L10N.register( "Host" : "Sunucu", "Username" : "Kullanıcı Adı", "Password" : "Parola", - "Root" : "Kök", + "Remote subfolder" : "Uzak alt klasör", "Secure ftps://" : "Güvenli ftps://", "Client ID" : "İstemci kimliği", "Client secret" : "İstemci parolası", @@ -43,7 +43,6 @@ OC.L10N.register( "Username as share" : "Paylaşım olarak kullanıcı adı", "URL" : "URL", "Secure https://" : "Güvenli https://", - "Remote subfolder" : "Uzak alt klasör", "Access granted" : "Giriş kabul edildi", "Error configuring Dropbox storage" : "Dropbox depo yapılandırma hatası", "Grant access" : "Erişimi sağla", @@ -54,11 +53,10 @@ OC.L10N.register( "(group)" : "(grup)", "Saved" : "Kaydedildi", "<b>Note:</b> " : "<b>Not:</b> ", - " and " : "ve", + "and" : "ve", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Not:</b> PHP'de cURL desteği etkin veya kurulu değil. %s bağlaması mümkün olmayacak. Lütfen kurulumu için sistem yöneticilerinizle iletişime geçin.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Not:</b> PHP'de FTP desteği etkin veya kurulu değil. %s bağlaması mümkün olmayacak. Lütfen kurulumu için sistem yöneticilerinizle iletişime geçin.", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Not:</b> \"%s\" kurulu değil. %s bağlaması mümkün olmayacak. Lütfen kurulumu için sistem yöneticilerinizle iletişime geçin.", - "You don't have any external storages" : "Hiç harici depolamanız yok", "Name" : "Ad", "Storage type" : "Depolama türü", "Scope" : "Kapsam", diff --git a/apps/files_external/l10n/tr.json b/apps/files_external/l10n/tr.json index 669608cca27..7a6143d69de 100644 --- a/apps/files_external/l10n/tr.json +++ b/apps/files_external/l10n/tr.json @@ -24,7 +24,7 @@ "Host" : "Sunucu", "Username" : "Kullanıcı Adı", "Password" : "Parola", - "Root" : "Kök", + "Remote subfolder" : "Uzak alt klasör", "Secure ftps://" : "Güvenli ftps://", "Client ID" : "İstemci kimliği", "Client secret" : "İstemci parolası", @@ -41,7 +41,6 @@ "Username as share" : "Paylaşım olarak kullanıcı adı", "URL" : "URL", "Secure https://" : "Güvenli https://", - "Remote subfolder" : "Uzak alt klasör", "Access granted" : "Giriş kabul edildi", "Error configuring Dropbox storage" : "Dropbox depo yapılandırma hatası", "Grant access" : "Erişimi sağla", @@ -52,11 +51,10 @@ "(group)" : "(grup)", "Saved" : "Kaydedildi", "<b>Note:</b> " : "<b>Not:</b> ", - " and " : "ve", + "and" : "ve", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Not:</b> PHP'de cURL desteği etkin veya kurulu değil. %s bağlaması mümkün olmayacak. Lütfen kurulumu için sistem yöneticilerinizle iletişime geçin.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Not:</b> PHP'de FTP desteği etkin veya kurulu değil. %s bağlaması mümkün olmayacak. Lütfen kurulumu için sistem yöneticilerinizle iletişime geçin.", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Not:</b> \"%s\" kurulu değil. %s bağlaması mümkün olmayacak. Lütfen kurulumu için sistem yöneticilerinizle iletişime geçin.", - "You don't have any external storages" : "Hiç harici depolamanız yok", "Name" : "Ad", "Storage type" : "Depolama türü", "Scope" : "Kapsam", diff --git a/apps/files_external/l10n/uk.js b/apps/files_external/l10n/uk.js index 7cf8533fd24..dc914f9340f 100644 --- a/apps/files_external/l10n/uk.js +++ b/apps/files_external/l10n/uk.js @@ -26,7 +26,7 @@ OC.L10N.register( "Host" : "Хост", "Username" : "Ім'я користувача", "Password" : "Пароль", - "Root" : "Батьківський каталог", + "Remote subfolder" : "Віддалений підкаталог", "Secure ftps://" : "Захищений ftps://", "Client ID" : "Ідентифікатор клієнта", "Client secret" : "Ключ клієнта", @@ -43,7 +43,6 @@ OC.L10N.register( "Username as share" : "Ім'я для відкритого доступу", "URL" : "URL", "Secure https://" : "Захищений https://", - "Remote subfolder" : "Віддалений підкаталог", "Access granted" : "Доступ дозволено", "Error configuring Dropbox storage" : "Помилка при налаштуванні сховища Dropbox", "Grant access" : "Дозволити доступ", @@ -54,11 +53,9 @@ OC.L10N.register( "(group)" : "(група)", "Saved" : "Збереженно", "<b>Note:</b> " : "<b>Примітка:</b>", - " and " : "та", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Примітка:</b> Підтримку cURL в PHP не ввімкнено чи не встановлена. Під'єднатися до %s неможливо. Зверніться до системного адміністратора.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Примітка:</b> Підтримку FTP в PHP не ввімкнено чи не встановлена. Під'єднатися до %s неможливо. Зверніться до системного адміністратора.", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Примітка:</b> \"%s\" не встановлено. Під'єднатися до %s неможливо. Зверніться до системного адміністратора.", - "You don't have any external storages" : "У вас немає зовнішніх сховищ", "Name" : "Ім'я", "Storage type" : "Тип сховища", "Scope" : "Область", diff --git a/apps/files_external/l10n/uk.json b/apps/files_external/l10n/uk.json index 8ebccaf5c1c..7c18abea055 100644 --- a/apps/files_external/l10n/uk.json +++ b/apps/files_external/l10n/uk.json @@ -24,7 +24,7 @@ "Host" : "Хост", "Username" : "Ім'я користувача", "Password" : "Пароль", - "Root" : "Батьківський каталог", + "Remote subfolder" : "Віддалений підкаталог", "Secure ftps://" : "Захищений ftps://", "Client ID" : "Ідентифікатор клієнта", "Client secret" : "Ключ клієнта", @@ -41,7 +41,6 @@ "Username as share" : "Ім'я для відкритого доступу", "URL" : "URL", "Secure https://" : "Захищений https://", - "Remote subfolder" : "Віддалений підкаталог", "Access granted" : "Доступ дозволено", "Error configuring Dropbox storage" : "Помилка при налаштуванні сховища Dropbox", "Grant access" : "Дозволити доступ", @@ -52,11 +51,9 @@ "(group)" : "(група)", "Saved" : "Збереженно", "<b>Note:</b> " : "<b>Примітка:</b>", - " and " : "та", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Примітка:</b> Підтримку cURL в PHP не ввімкнено чи не встановлена. Під'єднатися до %s неможливо. Зверніться до системного адміністратора.", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Примітка:</b> Підтримку FTP в PHP не ввімкнено чи не встановлена. Під'єднатися до %s неможливо. Зверніться до системного адміністратора.", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>Примітка:</b> \"%s\" не встановлено. Під'єднатися до %s неможливо. Зверніться до системного адміністратора.", - "You don't have any external storages" : "У вас немає зовнішніх сховищ", "Name" : "Ім'я", "Storage type" : "Тип сховища", "Scope" : "Область", diff --git a/apps/files_external/l10n/zh_CN.js b/apps/files_external/l10n/zh_CN.js index 8c71da68db7..1045c03423f 100644 --- a/apps/files_external/l10n/zh_CN.js +++ b/apps/files_external/l10n/zh_CN.js @@ -18,14 +18,13 @@ OC.L10N.register( "Host" : "主机", "Username" : "用户名", "Password" : "密码", - "Root" : "根路径", + "Remote subfolder" : "远程子文件夹", "Secure ftps://" : "安全 ftps://", "OpenStack Object Storage" : "OpenStack 对象存储", "Share" : "共享", "SMB / CIFS using OC login" : "SMB / CIFS 使用 OC 登录信息", "URL" : "URL", "Secure https://" : "安全 https://", - "Remote subfolder" : "远程子文件夹", "Access granted" : "权限已授予。", "Error configuring Dropbox storage" : "配置Dropbox存储时出错", "Grant access" : "授权", @@ -34,8 +33,6 @@ OC.L10N.register( "System" : "系统", "Saved" : "已保存", "<b>Note:</b> " : "<b>注意:</b>", - " and " : "和", - "You don't have any external storages" : "您没有外部存储", "Name" : "名称", "Storage type" : "存储类型", "Scope" : "适用范围", diff --git a/apps/files_external/l10n/zh_CN.json b/apps/files_external/l10n/zh_CN.json index ba2ca93be86..b6a826e4209 100644 --- a/apps/files_external/l10n/zh_CN.json +++ b/apps/files_external/l10n/zh_CN.json @@ -16,14 +16,13 @@ "Host" : "主机", "Username" : "用户名", "Password" : "密码", - "Root" : "根路径", + "Remote subfolder" : "远程子文件夹", "Secure ftps://" : "安全 ftps://", "OpenStack Object Storage" : "OpenStack 对象存储", "Share" : "共享", "SMB / CIFS using OC login" : "SMB / CIFS 使用 OC 登录信息", "URL" : "URL", "Secure https://" : "安全 https://", - "Remote subfolder" : "远程子文件夹", "Access granted" : "权限已授予。", "Error configuring Dropbox storage" : "配置Dropbox存储时出错", "Grant access" : "授权", @@ -32,8 +31,6 @@ "System" : "系统", "Saved" : "已保存", "<b>Note:</b> " : "<b>注意:</b>", - " and " : "和", - "You don't have any external storages" : "您没有外部存储", "Name" : "名称", "Storage type" : "存储类型", "Scope" : "适用范围", diff --git a/apps/files_external/l10n/zh_HK.js b/apps/files_external/l10n/zh_HK.js index d8446e4dac6..9ad4b8a7bce 100644 --- a/apps/files_external/l10n/zh_HK.js +++ b/apps/files_external/l10n/zh_HK.js @@ -2,6 +2,7 @@ OC.L10N.register( "files_external", { "Port" : "連接埠", + "Host" : "主機", "Username" : "用戶名稱", "Password" : "密碼", "Share" : "分享", diff --git a/apps/files_external/l10n/zh_HK.json b/apps/files_external/l10n/zh_HK.json index 46d6c0dabe7..955170d618f 100644 --- a/apps/files_external/l10n/zh_HK.json +++ b/apps/files_external/l10n/zh_HK.json @@ -1,5 +1,6 @@ { "translations": { "Port" : "連接埠", + "Host" : "主機", "Username" : "用戶名稱", "Password" : "密碼", "Share" : "分享", diff --git a/apps/files_external/l10n/zh_TW.js b/apps/files_external/l10n/zh_TW.js index a1f2d8a226d..22c213ad5cc 100644 --- a/apps/files_external/l10n/zh_TW.js +++ b/apps/files_external/l10n/zh_TW.js @@ -25,11 +25,9 @@ OC.L10N.register( "System" : "系統", "Saved" : "已儲存", "<b>Note:</b> " : "<b>警告:</b> ", - " and " : "與", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>警告:</b> PHP 並未啓用 Curl 的支援,因此無法掛載 %s 。請洽您的系統管理員將其安裝並啓用。", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>警告</b>:PHP 並未啓用 FTP 的支援,因此無法掛載 %s,請洽您的系統管理員將其安裝並啓用。", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>警告</b>並未安裝 \"%s\",因此無法掛載 %s。請洽您的系統管理員將其安裝並啓用。", - "You don't have any external storages" : "您沒有任何外部儲存", "Name" : "名稱", "External Storage" : "外部儲存", "Folder name" : "資料夾名稱", diff --git a/apps/files_external/l10n/zh_TW.json b/apps/files_external/l10n/zh_TW.json index 03a20a3215e..84d1abf182a 100644 --- a/apps/files_external/l10n/zh_TW.json +++ b/apps/files_external/l10n/zh_TW.json @@ -23,11 +23,9 @@ "System" : "系統", "Saved" : "已儲存", "<b>Note:</b> " : "<b>警告:</b> ", - " and " : "與", "<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>警告:</b> PHP 並未啓用 Curl 的支援,因此無法掛載 %s 。請洽您的系統管理員將其安裝並啓用。", "<b>Note:</b> The FTP support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>警告</b>:PHP 並未啓用 FTP 的支援,因此無法掛載 %s,請洽您的系統管理員將其安裝並啓用。", "<b>Note:</b> \"%s\" is not installed. Mounting of %s is not possible. Please ask your system administrator to install it." : "<b>警告</b>並未安裝 \"%s\",因此無法掛載 %s。請洽您的系統管理員將其安裝並啓用。", - "You don't have any external storages" : "您沒有任何外部儲存", "Name" : "名稱", "External Storage" : "外部儲存", "Folder name" : "資料夾名稱", diff --git a/apps/files_external/lib/amazons3.php b/apps/files_external/lib/amazons3.php index 53adb929e29..4d94e3561f8 100644 --- a/apps/files_external/lib/amazons3.php +++ b/apps/files_external/lib/amazons3.php @@ -267,10 +267,7 @@ class AmazonS3 extends \OC\Files\Storage\Common { $file = basename( isset($object['Key']) ? $object['Key'] : $object['Prefix'] ); - - if ($file != basename($path)) { - $files[] = $file; - } + $files[] = $file; } \OC\Files\Stream\Dir::register('amazons3' . $path, $files); diff --git a/apps/files_external/lib/api.php b/apps/files_external/lib/api.php index 81ebd4e886a..3b5e0e1759a 100644 --- a/apps/files_external/lib/api.php +++ b/apps/files_external/lib/api.php @@ -45,10 +45,10 @@ class Api { $isSystemMount = !$mountConfig['personal']; - $permissions = \OCP\PERMISSION_READ; + $permissions = \OCP\Constants::PERMISSION_READ; // personal mounts can be deleted if (!$isSystemMount) { - $permissions |= \OCP\PERMISSION_DELETE; + $permissions |= \OCP\Constants::PERMISSION_DELETE; } $entry = array( diff --git a/apps/files_external/lib/config.php b/apps/files_external/lib/config.php index fa44e446d96..823c0bcbfc1 100644 --- a/apps/files_external/lib/config.php +++ b/apps/files_external/lib/config.php @@ -1,25 +1,25 @@ <?php /** -* ownCloud -* -* @author Michael Gapczynski -* @copyright 2012 Michael Gapczynski mtgap@owncloud.com -* @copyright 2014 Vincent Petry <pvince81@owncloud.com> -* @copyright 2014 Robin McCorkell <rmccorkell@karoshi.org.uk> -* -* This library is free software; you can redistribute it and/or -* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE -* License as published by the Free Software Foundation; either -* version 3 of the License, or any later version. -* -* This library is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU AFFERO GENERAL PUBLIC LICENSE for more details. -* -* You should have received a copy of the GNU Affero General Public -* License along with this library. If not, see <http://www.gnu.org/licenses/>. -*/ + * ownCloud + * + * @author Michael Gapczynski + * @copyright 2012 Michael Gapczynski mtgap@owncloud.com + * @copyright 2014 Vincent Petry <pvince81@owncloud.com> + * @copyright 2014 Robin McCorkell <rmccorkell@karoshi.org.uk> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this library. If not, see <http://www.gnu.org/licenses/>. + */ /** * Class to configure mount.json globally and for users @@ -64,16 +64,17 @@ class OC_Mount_Config { } /** - * Get details on each of the external storage backends, used for the mount config UI - * If a custom UI is needed, add the key 'custom' and a javascript file with that name will be loaded - * If the configuration parameter should be secret, add a '*' to the beginning of the value - * If the configuration parameter is a boolean, add a '!' to the beginning of the value - * If the configuration parameter is optional, add a '&' to the beginning of the value - * If the configuration parameter is hidden, add a '#' to the beginning of the value - * @return array - */ + * Get details on each of the external storage backends, used for the mount config UI + * If a custom UI is needed, add the key 'custom' and a javascript file with that name will be loaded + * If the configuration parameter should be secret, add a '*' to the beginning of the value + * If the configuration parameter is a boolean, add a '!' to the beginning of the value + * If the configuration parameter is optional, add a '&' to the beginning of the value + * If the configuration parameter is hidden, add a '#' to the beginning of the value + * + * @return array + */ public static function getBackends() { - $sortFunc = function($a, $b) { + $sortFunc = function ($a, $b) { return strcasecmp($a['backend'], $b['backend']); }; @@ -100,27 +101,22 @@ class OC_Mount_Config { /** * Hook that mounts the given user's visible mount points + * * @param array $data */ public static function initMountPointsHook($data) { - $mountPoints = self::getAbsoluteMountPoints($data['user']); - $loader = \OC\Files\Filesystem::getLoader(); - $manager = \OC\Files\Filesystem::getMountManager(); - foreach ($mountPoints as $mountPoint => $options) { - if (isset($options['options']['objectstore'])) { - $objectClass = $options['options']['objectstore']['class']; - $options['options']['objectstore'] = new $objectClass($options['options']['objectstore']); - } - if (isset($options['personal']) && $options['personal']) { - $mount = new \OCA\Files_External\PersonalMount($options['class'], $mountPoint, $options['options'], $loader); - } else{ - $mount = new \OC\Files\Mount\Mount($options['class'], $mountPoint, $options['options'], $loader); - } - $manager->addMount($mount); - } - + self::addStorageIdToConfig(null); if ($data['user']) { + self::addStorageIdToConfig($data['user']); $user = \OC::$server->getUserManager()->get($data['user']); + if (!$user) { + \OC_Log::write( + 'files_external', + 'Cannot init external mount points for non-existant user "' . $data['user'] . '".', + \OC_Log::WARN + ); + return; + } $userView = new \OC\Files\View('/' . $user->getUID() . '/files'); $changePropagator = new \OC\Files\Cache\ChangePropagator($userView); $etagPropagator = new \OCA\Files_External\EtagPropagator($user, $changePropagator, \OC::$server->getConfig()); @@ -169,8 +165,9 @@ class OC_Mount_Config { } // Override if priority greater - if ( (!isset($mountPoints[$mountPoint])) - || ($options['priority'] >= $mountPoints[$mountPoint]['priority']) ) { + if ((!isset($mountPoints[$mountPoint])) + || ($options['priority'] >= $mountPoints[$mountPoint]['priority']) + ) { $options['priority_type'] = self::MOUNT_TYPE_GLOBAL; $options['backend'] = $backends[$options['class']]['backend']; $mountPoints[$mountPoint] = $options; @@ -192,8 +189,9 @@ class OC_Mount_Config { } // Override if priority greater - if ( (!isset($mountPoints[$mountPoint])) - || ($options['priority'] >= $mountPoints[$mountPoint]['priority']) ) { + if ((!isset($mountPoints[$mountPoint])) + || ($options['priority'] >= $mountPoints[$mountPoint]['priority']) + ) { $options['priority_type'] = self::MOUNT_TYPE_GLOBAL; $options['backend'] = $backends[$options['class']]['backend']; $mountPoints[$mountPoint] = $options; @@ -216,9 +214,10 @@ class OC_Mount_Config { } // Override if priority greater or if priority type different - if ( (!isset($mountPoints[$mountPoint])) + if ((!isset($mountPoints[$mountPoint])) || ($options['priority'] >= $mountPoints[$mountPoint]['priority']) - || ($mountPoints[$mountPoint]['priority_type'] !== self::MOUNT_TYPE_GROUP) ) { + || ($mountPoints[$mountPoint]['priority_type'] !== self::MOUNT_TYPE_GROUP) + ) { $options['priority_type'] = self::MOUNT_TYPE_GROUP; $options['backend'] = $backends[$options['class']]['backend']; $mountPoints[$mountPoint] = $options; @@ -243,9 +242,10 @@ class OC_Mount_Config { } // Override if priority greater or if priority type different - if ( (!isset($mountPoints[$mountPoint])) + if ((!isset($mountPoints[$mountPoint])) || ($options['priority'] >= $mountPoints[$mountPoint]['priority']) - || ($mountPoints[$mountPoint]['priority_type'] !== self::MOUNT_TYPE_USER) ) { + || ($mountPoints[$mountPoint]['priority_type'] !== self::MOUNT_TYPE_USER) + ) { $options['priority_type'] = self::MOUNT_TYPE_USER; $options['backend'] = $backends[$options['class']]['backend']; $mountPoints[$mountPoint] = $options; @@ -289,22 +289,23 @@ class OC_Mount_Config { /** - * Get details on each of the external storage backends, used for the mount config UI - * Some backends are not available as a personal backend, f.e. Local and such that have - * been disabled by the admin. - * - * If a custom UI is needed, add the key 'custom' and a javascript file with that name will be loaded - * If the configuration parameter should be secret, add a '*' to the beginning of the value - * If the configuration parameter is a boolean, add a '!' to the beginning of the value - * If the configuration parameter is optional, add a '&' to the beginning of the value - * If the configuration parameter is hidden, add a '#' to the beginning of the value - * @return array - */ + * Get details on each of the external storage backends, used for the mount config UI + * Some backends are not available as a personal backend, f.e. Local and such that have + * been disabled by the admin. + * + * If a custom UI is needed, add the key 'custom' and a javascript file with that name will be loaded + * If the configuration parameter should be secret, add a '*' to the beginning of the value + * If the configuration parameter is a boolean, add a '!' to the beginning of the value + * If the configuration parameter is optional, add a '&' to the beginning of the value + * If the configuration parameter is hidden, add a '#' to the beginning of the value + * + * @return array + */ public static function getPersonalBackends() { // Check whether the user has permissions to add personal storage backends // return an empty array if this is not the case - if(OCP\Config::getAppValue('files_external', 'allow_user_mounting', 'yes') !== 'yes') { + if (OCP\Config::getAppValue('files_external', 'allow_user_mounting', 'yes') !== 'yes') { return array(); } @@ -324,10 +325,11 @@ class OC_Mount_Config { } /** - * Get the system mount points - * The returned array is not in the same format as getUserMountPoints() - * @return array - */ + * Get the system mount points + * The returned array is not in the same format as getUserMountPoints() + * + * @return array + */ public static function getSystemMountPoints() { $mountPoints = self::readData(); $backends = self::getBackends(); @@ -337,7 +339,7 @@ class OC_Mount_Config { foreach ($mounts as $mountPoint => $mount) { // Update old classes to new namespace if (strpos($mount['class'], 'OC_Filestorage_') !== false) { - $mount['class'] = '\OC\Files\Storage\\'.substr($mount['class'], 15); + $mount['class'] = '\OC\Files\Storage\\' . substr($mount['class'], 15); } $mount['options'] = self::decryptPasswords($mount['options']); if (!isset($mount['priority'])) { @@ -372,7 +374,7 @@ class OC_Mount_Config { foreach ($mounts as $mountPoint => $mount) { // Update old classes to new namespace if (strpos($mount['class'], 'OC_Filestorage_') !== false) { - $mount['class'] = '\OC\Files\Storage\\'.substr($mount['class'], 15); + $mount['class'] = '\OC\Files\Storage\\' . substr($mount['class'], 15); } $mount['options'] = self::decryptPasswords($mount['options']); if (!isset($mount['priority'])) { @@ -405,10 +407,11 @@ class OC_Mount_Config { } /** - * Get the personal mount points of the current user - * The returned array is not in the same format as getUserMountPoints() - * @return array - */ + * Get the personal mount points of the current user + * The returned array is not in the same format as getUserMountPoints() + * + * @return array + */ public static function getPersonalMountPoints() { $mountPoints = self::readData(OCP\User::getUser()); $backEnds = self::getBackends(); @@ -418,7 +421,7 @@ class OC_Mount_Config { foreach ($mountPoints[self::MOUNT_TYPE_USER][$uid] as $mountPoint => $mount) { // Update old classes to new namespace if (strpos($mount['class'], 'OC_Filestorage_') !== false) { - $mount['class'] = '\OC\Files\Storage\\'.substr($mount['class'], 15); + $mount['class'] = '\OC\Files\Storage\\' . substr($mount['class'], 15); } $mount['options'] = self::decryptPasswords($mount['options']); $personal[] = array( @@ -436,6 +439,7 @@ class OC_Mount_Config { /** * Test connecting using the given backend configuration + * * @param string $class backend class name * @param array $options backend configuration options * @return bool true if the connection succeeded, false otherwise @@ -460,16 +464,17 @@ class OC_Mount_Config { } /** - * Add a mount point to the filesystem - * @param string $mountPoint Mount point - * @param string $class Backend class - * @param array $classOptions Backend parameters for the class - * @param string $mountType MOUNT_TYPE_GROUP | MOUNT_TYPE_USER - * @param string $applicable User or group to apply mount to - * @param bool $isPersonal Personal or system mount point i.e. is this being called from the personal or admin page - * @param int|null $priority Mount point priority, null for default - * @return boolean - */ + * Add a mount point to the filesystem + * + * @param string $mountPoint Mount point + * @param string $class Backend class + * @param array $classOptions Backend parameters for the class + * @param string $mountType MOUNT_TYPE_GROUP | MOUNT_TYPE_USER + * @param string $applicable User or group to apply mount to + * @param bool $isPersonal Personal or system mount point i.e. is this being called from the personal or admin page + * @param int|null $priority Mount point priority, null for default + * @return boolean + */ public static function addMountPoint($mountPoint, $class, $classOptions, @@ -496,22 +501,22 @@ class OC_Mount_Config { if ($applicable != OCP\User::getUser() || !isset($allowed_backends[$class])) { return false; } - $mountPoint = '/'.$applicable.'/files/'.ltrim($mountPoint, '/'); + $mountPoint = '/' . $applicable . '/files/' . ltrim($mountPoint, '/'); } else { - $mountPoint = '/$user/files/'.ltrim($mountPoint, '/'); + $mountPoint = '/$user/files/' . ltrim($mountPoint, '/'); } $mount = array($applicable => array( $mountPoint => array( 'class' => $class, 'options' => self::encryptPasswords($classOptions)) - ) + ) ); - if (! $isPersonal && !is_null($priority)) { + if (!$isPersonal && !is_null($priority)) { $mount[$applicable][$mountPoint]['priority'] = $priority; } - $mountPoints = self::readData($isPersonal ? OCP\User::getUser() : NULL); + $mountPoints = self::readData($isPersonal ? OCP\User::getUser() : null); // who else loves multi-dimensional array ? $isNew = !isset($mountPoints[$mountType]) || !isset($mountPoints[$mountType][$applicable]) || @@ -529,7 +534,7 @@ class OC_Mount_Config { } } - self::writeData($isPersonal ? OCP\User::getUser() : NULL, $mountPoints); + self::writeData($isPersonal ? OCP\User::getUser() : null, $mountPoints); $result = self::getBackendStatus($class, $classOptions, $isPersonal); if ($result && $isNew) { @@ -547,13 +552,13 @@ class OC_Mount_Config { } /** - * - * @param string $mountPoint Mount point - * @param string $mountType MOUNT_TYPE_GROUP | MOUNT_TYPE_USER - * @param string $applicable User or group to remove mount from - * @param bool $isPersonal Personal or system mount point - * @return bool - */ + * + * @param string $mountPoint Mount point + * @param string $mountType MOUNT_TYPE_GROUP | MOUNT_TYPE_USER + * @param string $applicable User or group to remove mount from + * @param bool $isPersonal Personal or system mount point + * @return bool + */ public static function removeMountPoint($mountPoint, $mountType, $applicable, $isPersonal = false) { // Verify that the mount point applies for the current user $relMountPoints = $mountPoint; @@ -561,12 +566,12 @@ class OC_Mount_Config { if ($applicable != OCP\User::getUser()) { return false; } - $mountPoint = '/'.$applicable.'/files/'.ltrim($mountPoint, '/'); + $mountPoint = '/' . $applicable . '/files/' . ltrim($mountPoint, '/'); } else { - $mountPoint = '/$user/files/'.ltrim($mountPoint, '/'); + $mountPoint = '/$user/files/' . ltrim($mountPoint, '/'); } $mountPoint = \OC\Files\Filesystem::normalizePath($mountPoint); - $mountPoints = self::readData($isPersonal ? OCP\User::getUser() : NULL); + $mountPoints = self::readData($isPersonal ? OCP\User::getUser() : null); // Remove mount point unset($mountPoints[$mountType][$applicable][$mountPoint]); // Unset parent arrays if empty @@ -576,7 +581,7 @@ class OC_Mount_Config { unset($mountPoints[$mountType]); } } - self::writeData($isPersonal ? OCP\User::getUser() : NULL, $mountPoints); + self::writeData($isPersonal ? OCP\User::getUser() : null, $mountPoints); \OC_Hook::emit( \OC\Files\Filesystem::CLASSNAME, \OC\Files\Filesystem::signal_delete_mount, @@ -612,17 +617,18 @@ class OC_Mount_Config { } /** - * Read the mount points in the config file into an array - * @param string|null $user If not null, personal for $user, otherwise system - * @return array - */ - private static function readData($user = NULL) { + * Read the mount points in the config file into an array + * + * @param string|null $user If not null, personal for $user, otherwise system + * @return array + */ + private static function readData($user = null) { $parser = new \OC\ArrayParser(); if (isset($user)) { - $phpFile = OC_User::getHome($user).'/mount.php'; - $jsonFile = OC_User::getHome($user).'/mount.json'; + $phpFile = OC_User::getHome($user) . '/mount.php'; + $jsonFile = OC_User::getHome($user) . '/mount.json'; } else { - $phpFile = OC::$SERVERROOT.'/config/mount.php'; + $phpFile = OC::$SERVERROOT . '/config/mount.php'; $datadir = \OC_Config::getValue('datadirectory', \OC::$SERVERROOT . '/data/'); $jsonFile = \OC_Config::getValue('mount_file', $datadir . '/mount.json'); } @@ -641,23 +647,28 @@ class OC_Mount_Config { } /** - * Write the mount points to the config file - * @param string|null $user If not null, personal for $user, otherwise system - * @param array $data Mount points - */ + * Write the mount points to the config file + * + * @param string|null $user If not null, personal for $user, otherwise system + * @param array $data Mount points + */ private static function writeData($user, $data) { if (isset($user)) { - $file = OC_User::getHome($user).'/mount.json'; + $file = OC_User::getHome($user) . '/mount.json'; } else { $datadir = \OC_Config::getValue('datadirectory', \OC::$SERVERROOT . '/data/'); $file = \OC_Config::getValue('mount_file', $datadir . '/mount.json'); } - $options = 0; - if (defined('JSON_PRETTY_PRINT')) { - // only for PHP >= 5.4 - $options = JSON_PRETTY_PRINT; + + foreach ($data as &$applicables) { + foreach ($applicables as &$mountPoints) { + foreach ($mountPoints as &$options) { + self::addStorageId($options); + } + } } - $content = json_encode($data, $options); + + $content = json_encode($data, JSON_PRETTY_PRINT); @file_put_contents($file, $content); @chmod($file, 0640); } @@ -691,7 +702,7 @@ class OC_Mount_Config { return ''; } - private static function addDependency(&$dependencies, $module, $backend, $message=null) { + private static function addDependency(&$dependencies, $module, $backend, $message = null) { if (!isset($dependencies[$module])) { $dependencies[$module] = array(); } @@ -721,7 +732,7 @@ class OC_Mount_Config { $backends = ''; for ($i = 0; $i < $dependencyGroupCount; $i++) { if ($i > 0 && $i === $dependencyGroupCount - 1) { - $backends .= $l->t(' and '); + $backends .= ' ' . $l->t('and') . ' '; } elseif ($i > 0) { $backends .= ', '; } @@ -735,6 +746,7 @@ class OC_Mount_Config { /** * Returns a dependency missing message + * * @param OC_L10N $l * @param string $module * @param string $backend @@ -753,6 +765,7 @@ class OC_Mount_Config { /** * Encrypt passwords in the given config options + * * @param array $options mount options * @return array updated options */ @@ -768,6 +781,7 @@ class OC_Mount_Config { /** * Decrypt passwords in the given config options + * * @param array $options mount options * @return array updated options */ @@ -782,6 +796,7 @@ class OC_Mount_Config { /** * Encrypt a single password + * * @param string $password plain text password * @return string encrypted password */ @@ -794,6 +809,7 @@ class OC_Mount_Config { /** * Decrypts a single password + * * @param string $encryptedPassword encrypted password * @return string plain text password */ @@ -808,6 +824,7 @@ class OC_Mount_Config { /** * Merges mount points + * * @param array $data Existing mount points * @param array $mountPoint New mount point * @param string $mountType @@ -821,7 +838,8 @@ class OC_Mount_Config { // Merge priorities if (isset($data[$mountType][$applicable][$mountPath]) && isset($data[$mountType][$applicable][$mountPath]['priority']) - && !isset($mountPoint[$applicable][$mountPath]['priority'])) { + && !isset($mountPoint[$applicable][$mountPath]['priority']) + ) { $mountPoint[$applicable][$mountPath]['priority'] = $data[$mountType][$applicable][$mountPath]['priority']; } @@ -844,7 +862,7 @@ class OC_Mount_Config { include('Crypt/AES.php'); } $cipher = new Crypt_AES(CRYPT_AES_MODE_CBC); - $cipher->setKey(\OCP\Config::getSystemValue('passwordsalt')); + $cipher->setKey(\OC::$server->getConfig()->getSystemValue('passwordsalt', null)); return $cipher; } @@ -863,4 +881,32 @@ class OC_Mount_Config { ); return hash('md5', $data); } + + private static function addStorageIdToConfig($user) { + $config = self::readData($user); + + $needUpdate = false; + foreach ($config as &$applicables) { + foreach ($applicables as &$mountPoints) { + foreach ($mountPoints as &$options) { + $needUpdate |= !isset($options['storage_id']); + } + } + } + + if ($needUpdate) { + self::writeData($user, $config); + } + } + + private static function addStorageId(&$options) { + if (isset($options['storage_id'])) { + return false; + } + $class = $options['class']; + /** @var \OC\Files\Storage\Storage $storage */ + $storage = new $class($options['options']); + $options['storage_id'] = $storage->getCache()->getNumericStorageId(); + return true; + } } diff --git a/apps/files_external/lib/config/configadapter.php b/apps/files_external/lib/config/configadapter.php new file mode 100644 index 00000000000..de484a44698 --- /dev/null +++ b/apps/files_external/lib/config/configadapter.php @@ -0,0 +1,45 @@ +<?php +/** + * Copyright (c) 2014 Robin Appelman <icewind@owncloud.com> + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace OCA\Files_External\Config; + +use OC\Files\Mount\MountPoint; +use OCP\Files\Storage\IStorageFactory; +use OCA\Files_External\PersonalMount; +use OCP\Files\Config\IMountProvider; +use OCP\IUser; + +/** + * Make the old files_external config work with the new public mount config api + */ +class ConfigAdapter implements IMountProvider { + /** + * Get all mountpoints applicable for the user + * + * @param \OCP\IUser $user + * @param \OCP\Files\Storage\IStorageFactory $loader + * @return \OCP\Files\Mount\IMountPoint[] + */ + public function getMountsForUser(IUser $user, IStorageFactory $loader) { + $mountPoints = \OC_Mount_Config::getAbsoluteMountPoints($user->getUID()); + $mounts = array(); + foreach ($mountPoints as $mountPoint => $options) { + if (isset($options['options']['objectstore'])) { + $objectClass = $options['options']['objectstore']['class']; + $options['options']['objectstore'] = new $objectClass($options['options']['objectstore']); + } + $mountOptions = isset($options['mountOptions']) ? $options['mountOptions'] : []; + if (isset($options['personal']) && $options['personal']) { + $mounts[] = new PersonalMount($options['class'], $mountPoint, $options['options'], $loader, $mountOptions); + } else { + $mounts[] = new MountPoint($options['class'], $mountPoint, $options['options'], $loader, $mountOptions); + } + } + return $mounts; + } +} diff --git a/apps/files_external/lib/google.php b/apps/files_external/lib/google.php index 62b0f182e98..bd9bdce2a67 100644 --- a/apps/files_external/lib/google.php +++ b/apps/files_external/lib/google.php @@ -23,11 +23,12 @@ namespace OC\Files\Storage; set_include_path(get_include_path().PATH_SEPARATOR. \OC_App::getAppPath('files_external').'/3rdparty/google-api-php-client/src'); -require_once 'Google_Client.php'; -require_once 'contrib/Google_DriveService.php'; +require_once 'Google/Client.php'; +require_once 'Google/Service/Drive.php'; class Google extends \OC\Files\Storage\Common { + private $client; private $id; private $service; private $driveFiles; @@ -46,14 +47,19 @@ class Google extends \OC\Files\Storage\Common { && isset($params['client_id']) && isset($params['client_secret']) && isset($params['token']) ) { - $client = new \Google_Client(); - $client->setClientId($params['client_id']); - $client->setClientSecret($params['client_secret']); - $client->setScopes(array('https://www.googleapis.com/auth/drive')); - $client->setUseObjects(true); - $client->setAccessToken($params['token']); + $this->client = new \Google_Client(); + $this->client->setClientId($params['client_id']); + $this->client->setClientSecret($params['client_secret']); + $this->client->setScopes(array('https://www.googleapis.com/auth/drive')); + $this->client->setAccessToken($params['token']); + // if curl isn't available we're likely to run into + // https://github.com/google/google-api-php-client/issues/59 + // - disable gzip to avoid it. + if (!function_exists('curl_version') || !function_exists('curl_exec')) { + $this->client->setClassConfig("Google_Http_Request", "disable_gzip", true); + } // note: API connection is lazy - $this->service = new \Google_DriveService($client); + $this->service = new \Google_Service_Drive($this->client); $token = json_decode($params['token'], true); $this->id = 'google::'.substr($params['client_id'], 0, 30).$token['created']; } else { @@ -66,9 +72,10 @@ class Google extends \OC\Files\Storage\Common { } /** - * Get the Google_DriveFile object for the specified path + * Get the Google_Service_Drive_DriveFile object for the specified path. + * Returns false on failure. * @param string $path - * @return string + * @return \Google_Service_Drive_DriveFile|false */ private function getDriveFile($path) { // Remove leading and trailing slashes @@ -115,7 +122,7 @@ class Google extends \OC\Files\Storage\Common { $pathWithoutExt = substr($path, 0, $pos); $file = $this->getDriveFile($pathWithoutExt); if ($file) { - // Switch cached Google_DriveFile to the correct index + // Switch cached Google_Service_Drive_DriveFile to the correct index unset($this->driveFiles[$pathWithoutExt]); $this->driveFiles[$path] = $file; $parentId = $file->getId(); @@ -133,9 +140,9 @@ class Google extends \OC\Files\Storage\Common { } /** - * Set the Google_DriveFile object in the cache + * Set the Google_Service_Drive_DriveFile object in the cache * @param string $path - * @param Google_DriveFile|false $file + * @param Google_Service_Drive_DriveFile|false $file */ private function setDriveFile($path, $file) { $path = trim($path, '/'); @@ -188,10 +195,10 @@ class Google extends \OC\Files\Storage\Common { if (!$this->is_dir($path)) { $parentFolder = $this->getDriveFile(dirname($path)); if ($parentFolder) { - $folder = new \Google_DriveFile(); + $folder = new \Google_Service_Drive_DriveFile(); $folder->setTitle(basename($path)); $folder->setMimeType(self::FOLDER); - $parent = new \Google_ParentReference(); + $parent = new \Google_Service_Drive_ParentReference(); $parent->setId($parentFolder->getId()); $folder->setParents(array($parent)); $result = $this->service->files->insert($folder); @@ -266,7 +273,7 @@ class Google extends \OC\Files\Storage\Common { $this->onDuplicateFileDetected($filepath); } } else { - // Cache the Google_DriveFile for future use + // Cache the Google_Service_Drive_DriveFile for future use $this->setDriveFile($filepath, $child); $files[] = $name; } @@ -356,17 +363,29 @@ class Google extends \OC\Files\Storage\Common { // Change file parent $parentFolder2 = $this->getDriveFile(dirname($path2)); if ($parentFolder2) { - $parent = new \Google_ParentReference(); + $parent = new \Google_Service_Drive_ParentReference(); $parent->setId($parentFolder2->getId()); $file->setParents(array($parent)); } else { return false; } } + // We need to get the object for the existing file with the same + // name (if there is one) before we do the patch. If oldfile + // exists and is a directory we have to delete it before we + // do the rename too. + $oldfile = $this->getDriveFile($path2); + if ($oldfile && $this->is_dir($path2)) { + $this->rmdir($path2); + $oldfile = false; + } $result = $this->service->files->patch($file->getId(), $file); if ($result) { $this->setDriveFile($path1, false); $this->setDriveFile($path2, $result); + if ($oldfile) { + $this->service->files->delete($oldfile->getId()); + } } return (bool)$result; } else { @@ -395,8 +414,8 @@ class Google extends \OC\Files\Storage\Common { $downloadUrl = $file->getDownloadUrl(); } if (isset($downloadUrl)) { - $request = new \Google_HttpRequest($downloadUrl, 'GET', null, null); - $httpRequest = \Google_Client::$io->authenticatedRequest($request); + $request = new \Google_Http_Request($downloadUrl, 'GET', null, null); + $httpRequest = $this->client->getAuth()->authenticatedRequest($request); if ($httpRequest->getResponseHttpCode() == 200) { $tmpFile = \OC_Helper::tmpFile($ext); $data = $httpRequest->getResponseBody(); @@ -440,16 +459,17 @@ class Google extends \OC\Files\Storage\Common { $params = array( 'data' => $data, 'mimeType' => $mimetype, + 'uploadType' => 'media' ); $result = false; if ($this->file_exists($path)) { $file = $this->getDriveFile($path); $result = $this->service->files->update($file->getId(), $file, $params); } else { - $file = new \Google_DriveFile(); + $file = new \Google_Service_Drive_DriveFile(); $file->setTitle(basename($path)); $file->setMimeType($mimetype); - $parent = new \Google_ParentReference(); + $parent = new \Google_Service_Drive_ParentReference(); $parent->setId($parentFolder->getId()); $file->setParents(array($parent)); $result = $this->service->files->insert($file, $params); @@ -496,7 +516,10 @@ class Google extends \OC\Files\Storage\Common { $result = false; if ($file) { if (isset($mtime)) { - $file->setModifiedDate($mtime); + // This is just RFC3339, but frustratingly, GDrive's API *requires* + // the fractions portion be present, while no handy PHP constant + // for RFC3339 or ISO8601 includes it. So we do it ourselves. + $file->setModifiedDate(date('Y-m-d\TH:i:s.uP', $mtime)); $result = $this->service->files->patch($file->getId(), $file, array( 'setModifiedDate' => true, )); @@ -506,9 +529,9 @@ class Google extends \OC\Files\Storage\Common { } else { $parentFolder = $this->getDriveFile(dirname($path)); if ($parentFolder) { - $file = new \Google_DriveFile(); + $file = new \Google_Service_Drive_DriveFile(); $file->setTitle(basename($path)); - $parent = new \Google_ParentReference(); + $parent = new \Google_Service_Drive_ParentReference(); $parent->setId($parentFolder->getId()); $file->setParents(array($parent)); $result = $this->service->files->insert($file); diff --git a/apps/files_external/lib/personalmount.php b/apps/files_external/lib/personalmount.php index 708128d644a..0c741179139 100644 --- a/apps/files_external/lib/personalmount.php +++ b/apps/files_external/lib/personalmount.php @@ -8,13 +8,13 @@ namespace OCA\Files_External; -use OC\Files\Mount\Mount; +use OC\Files\Mount\MountPoint; use OC\Files\Mount\MoveableMount; /** * Person mount points can be moved by the user */ -class PersonalMount extends Mount implements MoveableMount { +class PersonalMount extends MountPoint implements MoveableMount { /** * Move the mount point to $target * diff --git a/apps/files_external/lib/sftp.php b/apps/files_external/lib/sftp.php index f0a6f145422..f6c56669734 100644 --- a/apps/files_external/lib/sftp.php +++ b/apps/files_external/lib/sftp.php @@ -112,7 +112,7 @@ class SFTP extends \OC\Files\Storage\Common { try { $storage_view = \OCP\Files::getStorage('files_external'); if ($storage_view) { - return \OCP\Config::getSystemValue('datadirectory') . + return \OC::$server->getConfig()->getSystemValue('datadirectory') . $storage_view->getAbsolutePath('') . 'ssh_hostKeys'; } diff --git a/apps/files_external/lib/smb.php b/apps/files_external/lib/smb.php index 6e53c4a9931..3f0b0f45bfb 100644 --- a/apps/files_external/lib/smb.php +++ b/apps/files_external/lib/smb.php @@ -139,13 +139,8 @@ class SMB extends \OC\Files\Storage\StreamWrapper{ * check if smbclient is installed */ public static function checkDependencies() { - if (function_exists('shell_exec')) { - $output=shell_exec('command -v smbclient 2> /dev/null'); - if (!empty($output)) { - return true; - } - } - return array('smbclient'); + $smbClientExists = (bool) \OC_Helper::findBinaryPath('smbclient'); + return $smbClientExists ? true : array('smbclient'); } } diff --git a/apps/files_external/lib/smb_oc.php b/apps/files_external/lib/smb_oc.php index e6f3aaf4052..a7c93d97fd1 100644 --- a/apps/files_external/lib/smb_oc.php +++ b/apps/files_external/lib/smb_oc.php @@ -13,12 +13,16 @@ require_once __DIR__ . '/../3rdparty/smb4php/smb.php'; class SMB_OC extends \OC\Files\Storage\SMB { private $username_as_share; + /** + * @param array $params + * @throws \Exception + */ public function __construct($params) { if (isset($params['host']) && \OC::$server->getSession()->exists('smb-credentials')) { $host=$params['host']; $this->username_as_share = ($params['username_as_share'] === 'true'); - $params_auth = \OC::$server->getSession()->get('smb-credentials'); + $params_auth = json_decode(\OC::$server->getCrypto()->decrypt(\OC::$server->getSession()->get('smb-credentials')), true); $user = \OC::$server->getSession()->get('loginname'); $password = $params_auth['password']; @@ -44,14 +48,35 @@ class SMB_OC extends \OC\Files\Storage\SMB { } } - public static function login( $params ) { - \OC::$server->getSession()->set('smb-credentials', $params); + + /** + * Intercepts the user credentials on login and stores them + * encrypted inside the session if SMB_OC storage is enabled. + * @param array $params + */ + public static function login($params) { + $mountpoints = \OC_Mount_Config::getAbsoluteMountPoints($params['uid']); + $mountpointClasses = array(); + foreach($mountpoints as $mountpoint) { + $mountpointClasses[$mountpoint['class']] = true; + } + if(isset($mountpointClasses['\OC\Files\Storage\SMB_OC'])) { + \OC::$server->getSession()->set('smb-credentials', \OC::$server->getCrypto()->encrypt(json_encode($params))); + } } + /** + * @param string $path + * @return boolean + */ public function isSharable($path) { return false; } + /** + * @param bool $isPersonal + * @return bool + */ public function test($isPersonal = true) { if ($isPersonal) { if ($this->stat('')) { diff --git a/apps/files_external/templates/list.php b/apps/files_external/templates/list.php index 4e06bc7024c..c21a475deba 100644 --- a/apps/files_external/templates/list.php +++ b/apps/files_external/templates/list.php @@ -4,7 +4,11 @@ </div> <div id='notification'></div> -<div id="emptycontent" class="hidden"><?php p($l->t( 'You don\'t have any external storages' )); ?></div> +<div id="emptycontent" class="hidden"> + <div class="icon-external"></div> + <h2><?php p($l->t('No external storages configured')); ?></h2> + <p><?php p($l->t('You can configure external storages in the personal settings')); ?></p> +</div> <input type="hidden" name="dir" value="" id="dir"> diff --git a/apps/files_external/templates/settings.php b/apps/files_external/templates/settings.php index 072f856dfbd..79950f30385 100644 --- a/apps/files_external/templates/settings.php +++ b/apps/files_external/templates/settings.php @@ -76,7 +76,7 @@ <?php endif; ?> <?php endif; ?> <?php endforeach; ?> - <?php if (isset($_['backends'][$mount['class']]['custom']) && !in_array('files_external/js/'.$_['backends'][$mount['class']]['custom'], \OC_Util::$scripts)): ?> + <?php if (isset($_['backends'][$mount['class']]['custom'])): ?> <?php OCP\Util::addScript('files_external', $_['backends'][$mount['class']]['custom']); ?> <?php endif; ?> <?php endif; ?> diff --git a/apps/files_external/tests/amazons3migration.php b/apps/files_external/tests/amazons3migration.php index 629cf5cfa3c..145213f5293 100644 --- a/apps/files_external/tests/amazons3migration.php +++ b/apps/files_external/tests/amazons3migration.php @@ -23,15 +23,26 @@ namespace Test\Files\Storage; -class AmazonS3Migration extends \PHPUnit_Framework_TestCase { +class AmazonS3Migration extends \Test\TestCase { /** * @var \OC\Files\Storage\Storage instance */ protected $instance; - public function setUp () { - $uuid = uniqid(); + /** @var array */ + protected $params; + + /** @var string */ + protected $oldId; + + /** @var string */ + protected $newId; + + protected function setUp() { + parent::setUp(); + + $uuid = $this->getUniqueID(); $this->params['key'] = 'key'.$uuid; $this->params['secret'] = 'secret'.$uuid; @@ -41,9 +52,11 @@ class AmazonS3Migration extends \PHPUnit_Framework_TestCase { $this->newId = 'amazon::' . $this->params['bucket']; } - public function tearDown () { + protected function tearDown() { $this->deleteStorage($this->oldId); $this->deleteStorage($this->newId); + + parent::tearDown(); } public function testUpdateLegacyOnlyId () { diff --git a/apps/files_external/tests/amazons3.php b/apps/files_external/tests/backends/amazons3.php index 8eaece6dad9..fbb8744bd8d 100644 --- a/apps/files_external/tests/amazons3.php +++ b/apps/files_external/tests/backends/amazons3.php @@ -28,7 +28,9 @@ class AmazonS3 extends Storage { private $config; - public function setUp() { + protected function setUp() { + parent::setUp(); + $this->config = include('files_external/tests/config.php'); if ( ! is_array($this->config) or ! isset($this->config['amazons3']) or ! $this->config['amazons3']['run']) { $this->markTestSkipped('AmazonS3 backend not configured'); @@ -36,10 +38,12 @@ class AmazonS3 extends Storage { $this->instance = new \OC\Files\Storage\AmazonS3($this->config['amazons3']); } - public function tearDown() { + protected function tearDown() { if ($this->instance) { $this->instance->rmdir(''); } + + parent::tearDown(); } public function testStat() { diff --git a/apps/files_external/tests/dropbox.php b/apps/files_external/tests/backends/dropbox.php index 4b052282019..3f25d5a31e8 100644 --- a/apps/files_external/tests/dropbox.php +++ b/apps/files_external/tests/backends/dropbox.php @@ -11,8 +11,10 @@ namespace Test\Files\Storage; class Dropbox extends Storage { private $config; - public function setUp() { - $id = uniqid(); + protected function setUp() { + parent::setUp(); + + $id = $this->getUniqueID(); $this->config = include('files_external/tests/config.php'); if ( ! is_array($this->config) or ! isset($this->config['dropbox']) or ! $this->config['dropbox']['run']) { $this->markTestSkipped('Dropbox backend not configured'); @@ -21,6 +23,14 @@ class Dropbox extends Storage { $this->instance = new \OC\Files\Storage\Dropbox($this->config['dropbox']); } + protected function tearDown() { + if ($this->instance) { + $this->instance->unlink('/'); + } + + parent::tearDown(); + } + public function directoryProvider() { // doesn't support leading/trailing spaces return array(array('folder')); @@ -36,10 +46,4 @@ class Dropbox extends Storage { // false because not supported $this->assertFalse($this->instance->touch('foo')); } - - public function tearDown() { - if ($this->instance) { - $this->instance->unlink('/'); - } - } } diff --git a/apps/files_external/tests/ftp.php b/apps/files_external/tests/backends/ftp.php index 3037793120a..842b7f43fa8 100644 --- a/apps/files_external/tests/ftp.php +++ b/apps/files_external/tests/backends/ftp.php @@ -11,8 +11,10 @@ namespace Test\Files\Storage; class FTP extends Storage { private $config; - public function setUp() { - $id = uniqid(); + protected function setUp() { + parent::setUp(); + + $id = $this->getUniqueID(); $this->config = include('files_external/tests/config.php'); if ( ! is_array($this->config) or ! isset($this->config['ftp']) or ! $this->config['ftp']['run']) { $this->markTestSkipped('FTP backend not configured'); @@ -22,10 +24,12 @@ class FTP extends Storage { $this->instance->mkdir('/'); } - public function tearDown() { + protected function tearDown() { if ($this->instance) { \OCP\Files::rmdirr($this->instance->constructUrl('')); } + + parent::tearDown(); } public function testConstructUrl(){ diff --git a/apps/files_external/tests/google.php b/apps/files_external/tests/backends/google.php index d5495d49c5e..79023fac9e1 100644 --- a/apps/files_external/tests/google.php +++ b/apps/files_external/tests/backends/google.php @@ -28,6 +28,8 @@ class Google extends Storage { private $config; protected function setUp() { + parent::setUp(); + $this->config = include('files_external/tests/config.php'); if (!is_array($this->config) || !isset($this->config['google']) || !$this->config['google']['run'] @@ -41,5 +43,7 @@ class Google extends Storage { if ($this->instance) { $this->instance->rmdir('/'); } + + parent::tearDown(); } } diff --git a/apps/files_external/tests/owncloud.php b/apps/files_external/tests/backends/owncloud.php index 408a55864f2..ab9101cfe5f 100644 --- a/apps/files_external/tests/owncloud.php +++ b/apps/files_external/tests/backends/owncloud.php @@ -12,8 +12,10 @@ class OwnCloud extends Storage { private $config; - public function setUp() { - $id = uniqid(); + protected function setUp() { + parent::setUp(); + + $id = $this->getUniqueID(); $this->config = include('files_external/tests/config.php'); if ( ! is_array($this->config) or ! isset($this->config['owncloud']) or ! $this->config['owncloud']['run']) { $this->markTestSkipped('ownCloud backend not configured'); @@ -23,9 +25,11 @@ class OwnCloud extends Storage { $this->instance->mkdir('/'); } - public function tearDown() { + protected function tearDown() { if ($this->instance) { $this->instance->rmdir('/'); } + + parent::tearDown(); } } diff --git a/apps/files_external/tests/sftp.php b/apps/files_external/tests/backends/sftp.php index efea7f075ff..703b37d93f1 100644 --- a/apps/files_external/tests/sftp.php +++ b/apps/files_external/tests/backends/sftp.php @@ -25,8 +25,10 @@ namespace Test\Files\Storage; class SFTP extends Storage { private $config; - public function setUp() { - $id = uniqid(); + protected function setUp() { + parent::setUp(); + + $id = $this->getUniqueID(); $this->config = include('files_external/tests/config.php'); if ( ! is_array($this->config) or ! isset($this->config['sftp']) or ! $this->config['sftp']['run']) { $this->markTestSkipped('SFTP backend not configured'); @@ -36,9 +38,11 @@ class SFTP extends Storage { $this->instance->mkdir('/'); } - public function tearDown() { + protected function tearDown() { if ($this->instance) { $this->instance->rmdir('/'); } + + parent::tearDown(); } } diff --git a/apps/files_external/tests/smb.php b/apps/files_external/tests/backends/smb.php index 199e35af676..9e5ab2b331f 100644 --- a/apps/files_external/tests/smb.php +++ b/apps/files_external/tests/backends/smb.php @@ -12,8 +12,10 @@ class SMB extends Storage { private $config; - public function setUp() { - $id = uniqid(); + protected function setUp() { + parent::setUp(); + + $id = $this->getUniqueID(); $this->config = include('files_external/tests/config.php'); if (!is_array($this->config) or !isset($this->config['smb']) or !$this->config['smb']['run']) { $this->markTestSkipped('Samba backend not configured'); @@ -23,10 +25,12 @@ class SMB extends Storage { $this->instance->mkdir('/'); } - public function tearDown() { + protected function tearDown() { if ($this->instance) { \OCP\Files::rmdirr($this->instance->constructUrl('')); } + + parent::tearDown(); } public function directoryProvider() { diff --git a/apps/files_external/tests/swift.php b/apps/files_external/tests/backends/swift.php index 3918497ebfa..d2c884a8b4c 100644 --- a/apps/files_external/tests/swift.php +++ b/apps/files_external/tests/backends/swift.php @@ -26,7 +26,9 @@ class Swift extends Storage { private $config; - public function setUp() { + protected function setUp() { + parent::setUp(); + $this->config = include('files_external/tests/config.php'); if (!is_array($this->config) or !isset($this->config['swift']) or !$this->config['swift']['run']) { @@ -35,7 +37,7 @@ class Swift extends Storage { $this->instance = new \OC\Files\Storage\Swift($this->config['swift']); } - public function tearDown() { + protected function tearDown() { if ($this->instance) { $connection = $this->instance->getConnection(); $container = $connection->getContainer($this->config['swift']['bucket']); @@ -48,5 +50,7 @@ class Swift extends Storage { $container->delete(); } + + parent::tearDown(); } } diff --git a/apps/files_external/tests/backends/webdav.php b/apps/files_external/tests/backends/webdav.php new file mode 100644 index 00000000000..c390612810d --- /dev/null +++ b/apps/files_external/tests/backends/webdav.php @@ -0,0 +1,38 @@ +<?php +/** + * Copyright (c) 2012 Robin Appelman <icewind@owncloud.com> + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace Test\Files\Storage; + +class DAV extends Storage { + + private $config; + + protected function setUp() { + parent::setUp(); + + $id = $this->getUniqueID(); + $config = include('files_external/tests/config.webdav.php'); + if ( ! is_array($config) or !$config['run']) { + $this->markTestSkipped('WebDAV backend not configured'); + } + if (isset($config['wait'])) { + $this->waitDelay = $config['wait']; + } + $config['root'] .= '/' . $id; //make sure we have an new empty folder to work in + $this->instance = new \OC\Files\Storage\DAV($config); + $this->instance->mkdir('/'); + } + + protected function tearDown() { + if ($this->instance) { + $this->instance->rmdir('/'); + } + + parent::tearDown(); + } +} diff --git a/apps/files_external/tests/dynamicmountconfig.php b/apps/files_external/tests/dynamicmountconfig.php index 650299075e6..eef2a896b3a 100644 --- a/apps/files_external/tests/dynamicmountconfig.php +++ b/apps/files_external/tests/dynamicmountconfig.php @@ -36,7 +36,7 @@ class Test_Mount_Config_Dummy_Backend { /** * Class Test_Dynamic_Mount_Config */ -class Test_Dynamic_Mount_Config extends \PHPUnit_Framework_TestCase { +class Test_Dynamic_Mount_Config extends \Test\TestCase { private $backup; @@ -82,6 +82,7 @@ class Test_Dynamic_Mount_Config extends \PHPUnit_Framework_TestCase { } protected function setUp() { + parent::setUp(); $this->backup = OC_Mount_Config::setUp(); @@ -97,5 +98,6 @@ class Test_Dynamic_Mount_Config extends \PHPUnit_Framework_TestCase { protected function tearDown() { OC_Mount_Config::setUp($this->backup); + parent::tearDown(); } } diff --git a/apps/files_external/tests/env/start-webdav-ownCloud.sh b/apps/files_external/tests/env/start-webdav-ownCloud.sh new file mode 100755 index 00000000000..c7267cff341 --- /dev/null +++ b/apps/files_external/tests/env/start-webdav-ownCloud.sh @@ -0,0 +1,82 @@ +#!/bin/bash +# +# ownCloud +# +# This script start a docker container to test the files_external tests +# against. It will also change the files_external config to use the docker +# container as testing environment. This is reverted in the stop step. +# +# If the environment variable RUN_DOCKER_MYSQL is set the ownCloud will +# be set up using MySQL instead of SQLite. +# +# Set environment variable DEBUG to print config file +# +# @author Morris Jobke +# @copyright 2014 Morris Jobke <hey@morrisjobke.de> +# + +if ! command -v docker >/dev/null 2>&1; then + echo "No docker executable found - skipped docker setup" + exit 0; +fi + +echo "Docker executable found - setup docker" + +echo "Fetch recent morrisjobke/owncloud docker image" +docker pull morrisjobke/owncloud + +# retrieve current folder to place the config in the parent folder +thisFolder=`echo $0 | replace "env/start-webdav-ownCloud.sh" ""` + +if [ -n "$RUN_DOCKER_MYSQL" ]; then + echo "Fetch recent mysql docker image" + docker pull mysql + + echo "Setup MySQL ..." + # user/password will be read by ENV variables in owncloud container (they are generated by docker) + databaseContainer=`docker run -e MYSQL_ROOT_PASSWORD=mysupersecretpassword -d mysql` + containerName=`docker inspect $databaseContainer | grep Name | grep _ | cut -d \" -f 4 | cut -d / -f 2` + + parameter="--link $containerName:db" +fi + +container=`docker run -P $parameter -d -e ADMINLOGIN=test -e ADMINPWD=test morrisjobke/owncloud` + +# TODO find a way to determine the successful initialization inside the docker container +echo "Waiting 30 seconds for ownCloud initialization ... " +sleep 30 + +# get mapped port on host for internal port 80 - output is IP:PORT - we need to extract the port with 'cut' +port=`docker port $container 80 | cut -f 2 -d :` + + +cat > $thisFolder/config.webdav.php <<DELIM +<?php + +return array( + 'run'=>true, + 'host'=>'localhost:$port/owncloud/remote.php/webdav/', + 'user'=>'test', + 'password'=>'test', + 'root'=>'', + // wait delay in seconds after write operations + // (only in tests) + // set to higher value for lighttpd webdav + 'wait'=> 0 +); + +DELIM + +echo "ownCloud container: $container" + +# put container IDs into a file to drop them after the test run (keep in mind that multiple tests run in parallel on the same host) +echo $container >> $thisFolder/dockerContainerOwnCloud.$EXECUTOR_NUMBER.webdav + +if [ -n "$databaseContainer" ]; then + echo "Database container: $databaseContainer" + echo $databaseContainer >> $thisFolder/dockerContainerOwnCloud.$EXECUTOR_NUMBER.webdav +fi + +if [ -n "$DEBUG" ]; then + echo $thisFolder/config.webdav.php +fi diff --git a/apps/files_external/tests/env/stop-webdav-ownCloud.sh b/apps/files_external/tests/env/stop-webdav-ownCloud.sh new file mode 100755 index 00000000000..2f06eadcf7c --- /dev/null +++ b/apps/files_external/tests/env/stop-webdav-ownCloud.sh @@ -0,0 +1,41 @@ +#!/bin/bash +# +# ownCloud +# +# This script stops the docker container the files_external tests were run +# against. It will also revert the config changes done in start step. +# +# @author Morris Jobke +# @copyright 2014 Morris Jobke <hey@morrisjobke.de> +# + +if ! command -v docker >/dev/null 2>&1; then + echo "No docker executable found - skipped docker stop" + exit 0; +fi + +echo "Docker executable found - stop and remove docker containers" + +# retrieve current folder to remove the config from the parent folder +thisFolder=`echo $0 | replace "env/stop-webdav-ownCloud.sh" ""` + +echo "DEBUG" + +netstat -tlpen + +echo "CONFIG:" + +cat $thisFolder/config.webdav.php +cat $thisFolder/dockerContainerOwnCloud.$EXECUTOR_NUMBER.webdav + +# stopping and removing docker containers +for container in `cat $thisFolder/dockerContainerOwnCloud.$EXECUTOR_NUMBER.webdav`; do + echo "Stopping and removing docker container $container" + # kills running container and removes it + docker rm -f $container +done; + +# cleanup +rm $thisFolder/config.webdav.php +rm $thisFolder/dockerContainerOwnCloud.$EXECUTOR_NUMBER.webdav + diff --git a/apps/files_external/tests/etagpropagator.php b/apps/files_external/tests/etagpropagator.php index 7fa1863f962..84b687d18e4 100644 --- a/apps/files_external/tests/etagpropagator.php +++ b/apps/files_external/tests/etagpropagator.php @@ -11,9 +11,9 @@ namespace Tests\Files_External; use OC\Files\Filesystem; use OC\User\User; -class EtagPropagator extends \PHPUnit_Framework_TestCase { +class EtagPropagator extends \Test\TestCase { protected function getUser() { - return new User(uniqid(), null); + return new User($this->getUniqueID(), null); } /** diff --git a/apps/files_external/tests/js/mountsfilelistSpec.js b/apps/files_external/tests/js/mountsfilelistSpec.js index b599df77aac..a4e4fec1177 100644 --- a/apps/files_external/tests/js/mountsfilelistSpec.js +++ b/apps/files_external/tests/js/mountsfilelistSpec.js @@ -9,8 +9,7 @@ */ describe('OCA.External.FileList tests', function() { - var testFiles, alertStub, notificationStub, fileList, fileActions; - var oldFileListPrototype; + var testFiles, alertStub, notificationStub, fileList; beforeEach(function() { alertStub = sinon.stub(OC.dialogs, 'alert'); @@ -49,14 +48,11 @@ describe('OCA.External.FileList tests', function() { '<div id="emptycontent">Empty content message</div>' + '</div>' ); - fileActions = new OCA.Files.FileActions(); }); afterEach(function() { - OCA.Files.FileList.prototype = oldFileListPrototype; testFiles = undefined; fileList.destroy(); fileList = undefined; - fileActions = undefined; notificationStub.restore(); alertStub.restore(); @@ -148,7 +144,7 @@ describe('OCA.External.FileList tests', function() { '?dir=/mount%20points/smb%20mount' ); expect($tr.find('.nametext').text().trim()).toEqual('smb mount'); - expect($tr.find('.column-scope').text().trim()).toEqual('Personal'); + expect($tr.find('.column-scope > span').text().trim()).toEqual('Personal'); expect($tr.find('.column-backend').text().trim()).toEqual('SMB'); }); diff --git a/apps/files_external/tests/mountconfig.php b/apps/files_external/tests/mountconfig.php index c11e48b82f3..342f020d3a9 100644 --- a/apps/files_external/tests/mountconfig.php +++ b/apps/files_external/tests/mountconfig.php @@ -65,7 +65,7 @@ class Test_Mount_Config_Hook_Test { /** * Class Test_Mount_Config */ -class Test_Mount_Config extends \PHPUnit_Framework_TestCase { +class Test_Mount_Config extends \Test\TestCase { private $dataDir; private $userHome; @@ -79,7 +79,9 @@ class Test_Mount_Config extends \PHPUnit_Framework_TestCase { const TEST_GROUP2 = 'group2'; const TEST_GROUP2B = 'group2b'; - public function setUp() { + protected function setUp() { + parent::setUp(); + \OC_User::createUser(self::TEST_USER1, self::TEST_USER1); \OC_User::createUser(self::TEST_USER2, self::TEST_USER2); @@ -116,7 +118,7 @@ class Test_Mount_Config extends \PHPUnit_Framework_TestCase { Test_Mount_Config_Hook_Test::setupHooks(); } - public function tearDown() { + protected function tearDown() { Test_Mount_Config_Hook_Test::clear(); OC_Mount_Config::$skipTest = false; @@ -134,6 +136,8 @@ class Test_Mount_Config extends \PHPUnit_Framework_TestCase { 'user_mounting_backends', $this->oldAllowedBackends ); + + parent::tearDown(); } /** @@ -292,10 +296,6 @@ class Test_Mount_Config extends \PHPUnit_Framework_TestCase { * @dataProvider applicableConfigProvider */ public function testReadWriteGlobalConfig($mountType, $applicable, $expectApplicableArray) { - // TODO travis: samba share test doesn't work on travis - if (getenv('TRAVIS')) { - $this->markTestSkipped('samba share test doesn\'t work on travis'); - } $mountType = $mountType; $applicable = $applicable; @@ -336,10 +336,6 @@ class Test_Mount_Config extends \PHPUnit_Framework_TestCase { * Test reading and writing config */ public function testReadWritePersonalConfig() { - // TODO travis: samba share test doesn't work on travis - if (getenv('TRAVIS')) { - $this->markTestSkipped('samba share test doesn\'t work on travis'); - } $mountType = OC_Mount_Config::MOUNT_TYPE_USER; $applicable = self::TEST_USER1; @@ -475,10 +471,6 @@ class Test_Mount_Config extends \PHPUnit_Framework_TestCase { * Test password obfuscation */ public function testPasswordObfuscation() { - // TODO travis: samba share test doesn't work on travis - if (getenv('TRAVIS')) { - $this->markTestSkipped('samba share test doesn\'t work on travis'); - } $mountType = OC_Mount_Config::MOUNT_TYPE_USER; $applicable = self::TEST_USER1; @@ -520,10 +512,6 @@ class Test_Mount_Config extends \PHPUnit_Framework_TestCase { * Test read legacy passwords */ public function testReadLegacyPassword() { - // TODO travis: samba share test doesn't work on travis - if (getenv('TRAVIS')) { - $this->markTestSkipped('samba share test doesn\'t work on travis'); - } $mountType = OC_Mount_Config::MOUNT_TYPE_USER; $applicable = self::TEST_USER1; @@ -636,10 +624,6 @@ class Test_Mount_Config extends \PHPUnit_Framework_TestCase { * @param bool $expectVisible whether to expect the mount point to be visible for $testUser */ public function testMount($isPersonal, $mountType, $applicable, $testUser, $expectVisible) { - // TODO travis: samba share test doesn't work on travis - if (getenv('TRAVIS')) { - $this->markTestSkipped('samba share test doesn\'t work on travis'); - } $mountConfig = array( 'host' => 'someost', @@ -680,10 +664,6 @@ class Test_Mount_Config extends \PHPUnit_Framework_TestCase { * The config will be merged by getSystemMountPoints(). */ public function testConfigMerging() { - // TODO travis: samba share test doesn't work on travis - if (getenv('TRAVIS')) { - $this->markTestSkipped('samba share test doesn\'t work on travis'); - } $mountType = OC_Mount_Config::MOUNT_TYPE_USER; $isPersonal = false; @@ -755,10 +735,6 @@ class Test_Mount_Config extends \PHPUnit_Framework_TestCase { * have the same path, the config must NOT be merged. */ public function testRereadMountpointWithSamePath() { - // TODO travis: samba share test doesn't work on travis - if (getenv('TRAVIS')) { - $this->markTestSkipped('samba share test doesn\'t work on travis'); - } $mountType = OC_Mount_Config::MOUNT_TYPE_USER; $isPersonal = false; @@ -891,10 +867,6 @@ class Test_Mount_Config extends \PHPUnit_Framework_TestCase { * @param int $expected index of expected visible mount */ public function testPriority($mounts, $expected) { - // TODO travis: samba share test doesn't work on travis - if (getenv('TRAVIS')) { - $this->markTestSkipped('samba share test doesn\'t work on travis'); - } $mountConfig = array( 'host' => 'somehost', @@ -929,10 +901,6 @@ class Test_Mount_Config extends \PHPUnit_Framework_TestCase { * Test for persistence of priority when changing mount options */ public function testPriorityPersistence() { - // TODO travis: samba share test doesn't work on travis - if (getenv('TRAVIS')) { - $this->markTestSkipped('samba share test doesn\'t work on travis'); - } $class = '\OC\Files\Storage\SMB'; $priority = 123; @@ -982,10 +950,6 @@ class Test_Mount_Config extends \PHPUnit_Framework_TestCase { * Test for correct personal configuration loading in file sharing scenarios */ public function testMultiUserPersonalConfigLoading() { - // TODO travis: multi user config test doesn't work on travis - if (getenv('TRAVIS')) { - $this->markTestSkipped('multi user config test doesn\'t work on travis'); - } $mountConfig = array( 'host' => 'somehost', 'user' => 'someuser', diff --git a/apps/files_external/tests/owncloudfunctions.php b/apps/files_external/tests/owncloudfunctions.php index 57608fff0cf..8232f30a5e2 100644 --- a/apps/files_external/tests/owncloudfunctions.php +++ b/apps/files_external/tests/owncloudfunctions.php @@ -8,7 +8,7 @@ namespace Test\Files\Storage; -class OwnCloudFunctions extends \PHPUnit_Framework_TestCase { +class OwnCloudFunctions extends \Test\TestCase { function configUrlProvider() { return array( diff --git a/apps/files_external/tests/smbfunctions.php b/apps/files_external/tests/smbfunctions.php index 749906d0136..cf9f7cb20fe 100644 --- a/apps/files_external/tests/smbfunctions.php +++ b/apps/files_external/tests/smbfunctions.php @@ -8,10 +8,11 @@ namespace Test\Files\Storage; -class SMBFunctions extends \PHPUnit_Framework_TestCase { +class SMBFunctions extends \Test\TestCase { + + protected function setUp() { + parent::setUp(); - public function setUp() { - $id = uniqid(); // dummy config $this->config = array( 'run'=>false, @@ -25,9 +26,6 @@ class SMBFunctions extends \PHPUnit_Framework_TestCase { $this->instance = new \OC\Files\Storage\SMB($this->config); } - public function tearDown() { - } - public function testGetId() { $this->assertEquals('smb::test@smbhost//sharename//rootdir/', $this->instance->getId()); } diff --git a/apps/files_external/tests/webdav.php b/apps/files_external/tests/webdav.php deleted file mode 100644 index 74e905ccc89..00000000000 --- a/apps/files_external/tests/webdav.php +++ /dev/null @@ -1,34 +0,0 @@ -<?php -/** - * Copyright (c) 2012 Robin Appelman <icewind@owncloud.com> - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -namespace Test\Files\Storage; - -class DAV extends Storage { - - private $config; - - public function setUp() { - $id = uniqid(); - $this->config = include('files_external/tests/config.php'); - if ( ! is_array($this->config) or ! isset($this->config['webdav']) or ! $this->config['webdav']['run']) { - $this->markTestSkipped('WebDAV backend not configured'); - } - if (isset($this->config['webdav']['wait'])) { - $this->waitDelay = $this->config['webdav']['wait']; - } - $this->config['webdav']['root'] .= '/' . $id; //make sure we have an new empty folder to work in - $this->instance = new \OC\Files\Storage\DAV($this->config['webdav']); - $this->instance->mkdir('/'); - } - - public function tearDown() { - if ($this->instance) { - $this->instance->rmdir('/'); - } - } -} diff --git a/apps/files_sharing/ajax/external.php b/apps/files_sharing/ajax/external.php index 6d68b5f7f82..1a709eda07c 100644 --- a/apps/files_sharing/ajax/external.php +++ b/apps/files_sharing/ajax/external.php @@ -31,10 +31,11 @@ if(!\OCP\Util::isValidFileName($name)) { } $externalManager = new \OCA\Files_Sharing\External\Manager( - \OC::$server->getDatabaseConnection(), - \OC\Files\Filesystem::getMountManager(), - \OC\Files\Filesystem::getLoader(), - \OC::$server->getUserSession() + \OC::$server->getDatabaseConnection(), + \OC\Files\Filesystem::getMountManager(), + \OC\Files\Filesystem::getLoader(), + \OC::$server->getUserSession(), + \OC::$server->getHTTPHelper() ); $name = OCP\Files::buildNotExistingFileName('/', $name); @@ -44,7 +45,7 @@ if (substr($remote, 0, 5) === 'https' and !OC_Util::getUrlContent($remote)) { \OCP\JSON::error(array('data' => array('message' => $l->t("Invalid or untrusted SSL certificate")))); exit; } else { - $mount = $externalManager->addShare($remote, $token, $password, $name, $owner); + $mount = $externalManager->addShare($remote, $token, $password, $name, $owner, true); /** * @var \OCA\Files_Sharing\External\Storage $storage */ diff --git a/apps/files_sharing/ajax/list.php b/apps/files_sharing/ajax/list.php index 7e2e54a1bd9..073c86365be 100644 --- a/apps/files_sharing/ajax/list.php +++ b/apps/files_sharing/ajax/list.php @@ -65,7 +65,7 @@ $formattedFiles = array(); foreach ($files as $file) { $entry = \OCA\Files\Helper::formatFileInfo($file); unset($entry['directory']); // for now - $entry['permissions'] = \OCP\PERMISSION_READ; + $entry['permissions'] = \OCP\Constants::PERMISSION_READ; $formattedFiles[] = $entry; } @@ -78,7 +78,7 @@ $permissions = $linkItem['permissions']; // if globally disabled if (\OC::$server->getAppConfig()->getValue('core', 'shareapi_allow_public_upload', 'yes') === 'no') { // only allow reading - $permissions = \OCP\PERMISSION_READ; + $permissions = \OCP\Constants::PERMISSION_READ; } $data['permissions'] = $permissions; diff --git a/apps/files_sharing/ajax/shareinfo.php b/apps/files_sharing/ajax/shareinfo.php index e87b0779e8d..f196a67a9dd 100644 --- a/apps/files_sharing/ajax/shareinfo.php +++ b/apps/files_sharing/ajax/shareinfo.php @@ -31,7 +31,7 @@ $linkItem = $data['linkItem']; // Load the files $path = $data['realPath']; -$isWritable = $linkItem['permissions'] & (\OCP\PERMISSION_UPDATE | \OCP\PERMISSION_CREATE); +$isWritable = $linkItem['permissions'] & (\OCP\Constants::PERMISSION_UPDATE | \OCP\Constants::PERMISSION_CREATE); if (!$isWritable) { \OC\Files\Filesystem::addStorageWrapper('readonly', function ($mountPoint, $storage) { return new \OCA\Files_Sharing\ReadOnlyWrapper(array('storage' => $storage)); diff --git a/apps/files_sharing/ajax/testremote.php b/apps/files_sharing/ajax/testremote.php index 89581794698..08149bf7ecc 100644 --- a/apps/files_sharing/ajax/testremote.php +++ b/apps/files_sharing/ajax/testremote.php @@ -14,7 +14,8 @@ function testUrl($url) { try { $result = file_get_contents($url); $data = json_decode($result); - return is_object($data) and !empty($data->version); + // public link mount is only supported in ownCloud 7+ + return is_object($data) and !empty($data->version) and version_compare($data->version, '7.0.0', '>='); } catch (Exception $e) { return false; } diff --git a/apps/files_sharing/lib/api.php b/apps/files_sharing/api/local.php index 8556036f118..d9291c29f61 100644 --- a/apps/files_sharing/lib/api.php +++ b/apps/files_sharing/api/local.php @@ -1,6 +1,6 @@ <?php /** - * ownCloud + * ownCloud - OCS API for local shares * * @author Bjoern Schiessle * @copyright 2013 Bjoern Schiessle schiessle@owncloud.com @@ -20,9 +20,9 @@ * */ -namespace OCA\Files\Share; +namespace OCA\Files_Sharing\API; -class Api { +class Local { /** * get all shares diff --git a/apps/files_sharing/api/server2server.php b/apps/files_sharing/api/server2server.php new file mode 100644 index 00000000000..f78d64caa73 --- /dev/null +++ b/apps/files_sharing/api/server2server.php @@ -0,0 +1,241 @@ +<?php +/** + * ownCloud - OCS API for server-to-server shares + * + * @copyright (C) 2014 ownCloud, Inc. + * + * @author Bjoern Schiessle <schiessle@owncloud.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this library. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\Files_Sharing\API; + +class Server2Server { + + /** + * create a new share + * + * @param array $params + * @return \OC_OCS_Result + */ + public function createShare($params) { + + if (!$this->isS2SEnabled(true)) { + return new \OC_OCS_Result(null, 503, 'Server does not support server-to-server sharing'); + } + + $remote = isset($_POST['remote']) ? $_POST['remote'] : null; + $token = isset($_POST['token']) ? $_POST['token'] : null; + $name = isset($_POST['name']) ? $_POST['name'] : null; + $owner = isset($_POST['owner']) ? $_POST['owner'] : null; + $shareWith = isset($_POST['shareWith']) ? $_POST['shareWith'] : null; + $remoteId = isset($_POST['remoteId']) ? (int)$_POST['remoteId'] : null; + + if ($remote && $token && $name && $owner && $remoteId && $shareWith) { + + if(!\OCP\Util::isValidFileName($name)) { + return new \OC_OCS_Result(null, 400, 'The mountpoint name contains invalid characters.'); + } + + if (!\OCP\User::userExists($shareWith)) { + return new \OC_OCS_Result(null, 400, 'User does not exists'); + } + + \OC_Util::setupFS($shareWith); + + $externalManager = new \OCA\Files_Sharing\External\Manager( + \OC::$server->getDatabaseConnection(), + \OC\Files\Filesystem::getMountManager(), + \OC\Files\Filesystem::getLoader(), + \OC::$server->getUserSession(), + \OC::$server->getHTTPHelper()); + + $name = \OCP\Files::buildNotExistingFileName('/', $name); + + try { + $externalManager->addShare($remote, $token, '', $name, $owner, false, $shareWith, $remoteId); + + $user = $owner . '@' . $this->cleanupRemote($remote); + + \OC::$server->getActivityManager()->publishActivity( + 'files_sharing', \OCA\Files_Sharing\Activity::SUBJECT_REMOTE_SHARE_RECEIVED, array($user), '', array(), + '', '', $shareWith, \OCA\Files_Sharing\Activity::TYPE_REMOTE_SHARE, \OCA\Files_Sharing\Activity::PRIORITY_LOW); + + return new \OC_OCS_Result(); + } catch (\Exception $e) { + \OCP\Util::writeLog('files_sharing', 'server can not add remote share, ' . $e->getMessage(), \OCP\Util::ERROR); + return new \OC_OCS_Result(null, 500, 'internal server error, was not able to add share from ' . $remote); + } + } + + return new \OC_OCS_Result(null, 400, 'server can not add remote share, missing parameter'); + } + + /** + * accept server-to-server share + * + * @param array $params + * @return \OC_OCS_Result + */ + public function acceptShare($params) { + + if (!$this->isS2SEnabled()) { + return new \OC_OCS_Result(null, 503, 'Server does not support server-to-server sharing'); + } + + $id = $params['id']; + $token = isset($_POST['token']) ? $_POST['token'] : null; + $share = self::getShare($id, $token); + + if ($share) { + list($file, $link) = self::getFile($share['uid_owner'], $share['file_source']); + + \OC::$server->getActivityManager()->publishActivity( + 'files_sharing', \OCA\Files_Sharing\Activity::SUBJECT_REMOTE_SHARE_ACCEPTED, array($share['share_with'], basename($file)), '', array(), + $file, $link, $share['uid_owner'], \OCA\Files_Sharing\Activity::TYPE_REMOTE_SHARE, \OCA\Files_Sharing\Activity::PRIORITY_LOW); + } + + return new \OC_OCS_Result(); + } + + /** + * decline server-to-server share + * + * @param array $params + * @return \OC_OCS_Result + */ + public function declineShare($params) { + + if (!$this->isS2SEnabled()) { + return new \OC_OCS_Result(null, 503, 'Server does not support server-to-server sharing'); + } + + $id = $params['id']; + $token = isset($_POST['token']) ? $_POST['token'] : null; + + $share = $this->getShare($id, $token); + + if ($share) { + // userId must be set to the user who unshares + \OCP\Share::unshare($share['item_type'], $share['item_source'], $share['share_type'], null, $share['uid_owner']); + + list($file, $link) = $this->getFile($share['uid_owner'], $share['file_source']); + + \OC::$server->getActivityManager()->publishActivity( + 'files_sharing', \OCA\Files_Sharing\Activity::SUBJECT_REMOTE_SHARE_DECLINED, array($share['share_with'], basename($file)), '', array(), + $file, $link, $share['uid_owner'], \OCA\Files_Sharing\Activity::TYPE_REMOTE_SHARE, \OCA\Files_Sharing\Activity::PRIORITY_LOW); + } + + return new \OC_OCS_Result(); + } + + /** + * remove server-to-server share if it was unshared by the owner + * + * @param array $params + * @return \OC_OCS_Result + */ + public function unshare($params) { + + if (!$this->isS2SEnabled()) { + return new \OC_OCS_Result(null, 503, 'Server does not support server-to-server sharing'); + } + + $id = $params['id']; + $token = isset($_POST['token']) ? $_POST['token'] : null; + + $query = \OCP\DB::prepare('SELECT * FROM `*PREFIX*share_external` WHERE `remote_id` = ? AND `share_token` = ?'); + $query->execute(array($id, $token)); + $share = $query->fetchRow(); + + if ($token && $id && !empty($share)) { + + $remote = $this->cleanupRemote($share['remote']); + + $owner = $share['owner'] . '@' . $remote; + $mountpoint = $share['mountpoint']; + $user = $share['user']; + + $query = \OCP\DB::prepare('DELETE FROM `*PREFIX*share_external` WHERE `remote_id` = ? AND `share_token` = ?'); + $query->execute(array($id, $token)); + + \OC::$server->getActivityManager()->publishActivity( + 'files_sharing', \OCA\Files_Sharing\Activity::SUBJECT_REMOTE_SHARE_UNSHARED, array($owner, $mountpoint), '', array(), + '', '', $user, \OCA\Files_Sharing\Activity::TYPE_REMOTE_SHARE, \OCA\Files_Sharing\Activity::PRIORITY_MEDIUM); + } + + return new \OC_OCS_Result(); + } + + private function cleanupRemote($remote) { + $remote = substr($remote, strpos($remote, '://') + 3); + + return rtrim($remote, '/'); + } + + /** + * get share + * + * @param int $id + * @param string $token + * @return array + */ + private function getShare($id, $token) { + $query = \OCP\DB::prepare('SELECT * FROM `*PREFIX*share` WHERE `id` = ? AND `token` = ? AND `share_type` = ?'); + $query->execute(array($id, $token, \OCP\Share::SHARE_TYPE_REMOTE)); + $share = $query->fetchRow(); + + return $share; + } + + /** + * get file + * + * @param string $user + * @param int $fileSource + * @return array with internal path of the file and a absolute link to it + */ + private function getFile($user, $fileSource) { + \OC_Util::setupFS($user); + + $file = \OC\Files\Filesystem::getPath($fileSource); + $args = \OC\Files\Filesystem::is_dir($file) ? array('dir' => $file) : array('dir' => dirname($file), 'scrollto' => $file); + $link = \OCP\Util::linkToAbsolute('files', 'index.php', $args); + + return array($file, $link); + + } + + /** + * check if server-to-server sharing is enabled + * + * @param bool $incoming + * @return bool + */ + private function isS2SEnabled($incoming = false) { + + $result = \OCP\App::isEnabled('files_sharing'); + + if ($incoming) { + $result = $result && \OCA\Files_Sharing\Helper::isIncomingServer2serverShareEnabled(); + } else { + $result = $result && \OCA\Files_Sharing\Helper::isOutgoingServer2serverShareEnabled(); + } + + return $result; + } + +} diff --git a/apps/files_sharing/appinfo/app.php b/apps/files_sharing/appinfo/app.php index a01f8d98c7d..36d148dce96 100644 --- a/apps/files_sharing/appinfo/app.php +++ b/apps/files_sharing/appinfo/app.php @@ -8,7 +8,6 @@ OC::$CLASSPATH['OC\Files\Cache\Shared_Cache'] = 'files_sharing/lib/cache.php'; OC::$CLASSPATH['OC\Files\Cache\Shared_Permissions'] = 'files_sharing/lib/permissions.php'; OC::$CLASSPATH['OC\Files\Cache\Shared_Updater'] = 'files_sharing/lib/updater.php'; OC::$CLASSPATH['OC\Files\Cache\Shared_Watcher'] = 'files_sharing/lib/watcher.php'; -OC::$CLASSPATH['OCA\Files\Share\Api'] = 'files_sharing/lib/api.php'; OC::$CLASSPATH['OCA\Files\Share\Maintainer'] = 'files_sharing/lib/maintainer.php'; OC::$CLASSPATH['OCA\Files\Share\Proxy'] = 'files_sharing/lib/proxy.php'; @@ -28,6 +27,10 @@ OCP\Util::addScript('files_sharing', 'external'); OC_FileProxy::register(new OCA\Files\Share\Proxy()); +\OC::$server->getActivityManager()->registerExtension(function() { + return new \OCA\Files_Sharing\Activity(); +}); + $config = \OC::$server->getConfig(); if ($config->getAppValue('core', 'shareapi_enabled', 'yes') === 'yes') { @@ -52,14 +55,17 @@ if ($config->getAppValue('core', 'shareapi_enabled', 'yes') === 'yes') { "name" => $l->t('Shared with others') ) ); - \OCA\Files\App::getNavigationManager()->add( - array( - "id" => 'sharinglinks', - "appname" => 'files_sharing', - "script" => 'list.php', - "order" => 20, - "name" => $l->t('Shared by link') - ) - ); + // Check if sharing by link is enabled + if ($config->getAppValue('core', 'shareapi_allow_links', 'yes') === 'yes') { + \OCA\Files\App::getNavigationManager()->add( + array( + "id" => 'sharinglinks', + "appname" => 'files_sharing', + "script" => 'list.php', + "order" => 20, + "name" => $l->t('Shared by link') + ) + ); + } } } diff --git a/apps/files_sharing/appinfo/database.xml b/apps/files_sharing/appinfo/database.xml index 73d64c527b7..38718ab0773 100644 --- a/apps/files_sharing/appinfo/database.xml +++ b/apps/files_sharing/appinfo/database.xml @@ -23,6 +23,12 @@ <comments>Url of the remove owncloud instance</comments> </field> <field> + <name>remote_id</name> + <type>integer</type> + <notnull>true</notnull> + <length>4</length> + </field> + <field> <name>share_token</name> <type>text</type> <notnull>true</notnull> @@ -32,7 +38,7 @@ <field> <name>password</name> <type>text</type> - <notnull>true</notnull> + <notnull>false</notnull> <length>64</length> <comments>Optional password for the public share</comments> </field> @@ -71,6 +77,13 @@ <length>32</length> <comments>md5 hash of the mountpoint</comments> </field> + <field> + <name>accepted</name> + <type>integer</type> + <default>0</default> + <notnull>true</notnull> + <length>4</length> + </field> <index> <name>sh_external_user</name> <field> diff --git a/apps/files_sharing/appinfo/routes.php b/apps/files_sharing/appinfo/routes.php index d58a97e2956..dd9509575b7 100644 --- a/apps/files_sharing/appinfo/routes.php +++ b/apps/files_sharing/appinfo/routes.php @@ -1,4 +1,16 @@ <?php + +namespace OCA\Files_Sharing\AppInfo; + +use OCA\Files_Sharing\Application; + +$application = new Application(); +$application->registerRoutes($this, [ + 'resources' => [ + 'ExternalShares' => ['url' => '/api/externalShares'], + ] +]); + /** @var $this \OCP\Route\IRouter */ $this->create('core_ajax_public_preview', '/publicpreview')->action( function() { @@ -15,31 +27,32 @@ $this->create('sharing_external_add', '/external') ->actionInclude('files_sharing/ajax/external.php'); $this->create('sharing_external_test_remote', '/testremote') ->actionInclude('files_sharing/ajax/testremote.php'); + // OCS API //TODO: SET: mail notification, waiting for PR #4689 to be accepted -OC_API::register('get', +\OC_API::register('get', '/apps/files_sharing/api/v1/shares', - array('\OCA\Files\Share\Api', 'getAllShares'), + array('\OCA\Files_Sharing\API\Local', 'getAllShares'), 'files_sharing'); -OC_API::register('post', +\OC_API::register('post', '/apps/files_sharing/api/v1/shares', - array('\OCA\Files\Share\Api', 'createShare'), + array('\OCA\Files_Sharing\API\Local', 'createShare'), 'files_sharing'); -OC_API::register('get', +\OC_API::register('get', '/apps/files_sharing/api/v1/shares/{id}', - array('\OCA\Files\Share\Api', 'getShare'), + array('\OCA\Files_Sharing\API\Local', 'getShare'), 'files_sharing'); -OC_API::register('put', +\OC_API::register('put', '/apps/files_sharing/api/v1/shares/{id}', - array('\OCA\Files\Share\Api', 'updateShare'), + array('\OCA\Files_Sharing\API\Local', 'updateShare'), 'files_sharing'); -OC_API::register('delete', +\OC_API::register('delete', '/apps/files_sharing/api/v1/shares/{id}', - array('\OCA\Files\Share\Api', 'deleteShare'), + array('\OCA\Files_Sharing\API\Local', 'deleteShare'), 'files_sharing'); diff --git a/apps/files_sharing/appinfo/update.php b/apps/files_sharing/appinfo/update.php deleted file mode 100644 index e393b1575af..00000000000 --- a/apps/files_sharing/appinfo/update.php +++ /dev/null @@ -1,120 +0,0 @@ -<?php - -$installedVersion = OCP\Config::getAppValue('files_sharing', 'installed_version'); - -if (version_compare($installedVersion, '0.5', '<')) { - updateFilePermissions(); -} - -if (version_compare($installedVersion, '0.4', '<')) { - removeSharedFolder(); -} - -// clean up oc_share table from files which are no longer exists -if (version_compare($installedVersion, '0.3.5.6', '<')) { - \OC\Files\Cache\Shared_Updater::fixBrokenSharesOnAppUpdate(); -} - - -/** - * it is no longer possible to share single files with delete permissions. User - * should only be able to unshare single files but never to delete them. - */ -function updateFilePermissions($chunkSize = 99) { - $query = OCP\DB::prepare('SELECT * FROM `*PREFIX*share` WHERE `item_type` = ?'); - $result = $query->execute(array('file')); - - $updatedRows = array(); - - while ($row = $result->fetchRow()) { - if ($row['permissions'] & \OCP\PERMISSION_DELETE) { - $updatedRows[$row['id']] = (int)$row['permissions'] & ~\OCP\PERMISSION_DELETE; - } - } - - $connection = \OC_DB::getConnection(); - $chunkedPermissionList = array_chunk($updatedRows, $chunkSize, true); - - foreach ($chunkedPermissionList as $subList) { - $statement = "UPDATE `*PREFIX*share` SET `permissions` = CASE `id` "; - //update share table - $ids = implode(',', array_keys($subList)); - foreach ($subList as $id => $permission) { - $statement .= "WHEN " . $connection->quote($id, \PDO::PARAM_INT) . " THEN " . $permission . " "; - } - $statement .= ' END WHERE `id` IN (' . $ids . ')'; - - $query = OCP\DB::prepare($statement); - $query->execute(); - } - -} - -/** - * update script for the removal of the logical "Shared" folder, we create physical "Shared" folder and - * update the users file_target so that it doesn't make any difference for the user - * @note parameters are just for testing, please ignore them - */ -function removeSharedFolder($mkdirs = true, $chunkSize = 99) { - $query = OCP\DB::prepare('SELECT * FROM `*PREFIX*share`'); - $result = $query->execute(); - $view = new \OC\Files\View('/'); - $users = array(); - $shares = array(); - //we need to set up user backends - OC_User::useBackend(new OC_User_Database()); - OC_Group::useBackend(new OC_Group_Database()); - OC_App::loadApps(array('authentication')); - //we need to set up user backends, otherwise creating the shares will fail with "because user does not exist" - while ($row = $result->fetchRow()) { - //collect all user shares - if ((int)$row['share_type'] === 0 && ($row['item_type'] === 'file' || $row['item_type'] === 'folder')) { - $users[] = $row['share_with']; - $shares[$row['id']] = $row['file_target']; - } else if ((int)$row['share_type'] === 1 && ($row['item_type'] === 'file' || $row['item_type'] === 'folder')) { - //collect all group shares - $users = array_merge($users, \OC_group::usersInGroup($row['share_with'])); - $shares[$row['id']] = $row['file_target']; - } else if ((int)$row['share_type'] === 2) { - $shares[$row['id']] = $row['file_target']; - } - } - - $unique_users = array_unique($users); - - if (!empty($unique_users) && !empty($shares)) { - - // create folder Shared for each user - - if ($mkdirs) { - foreach ($unique_users as $user) { - \OC\Files\Filesystem::initMountPoints($user); - if (!$view->file_exists('/' . $user . '/files/Shared')) { - $view->mkdir('/' . $user . '/files/Shared'); - } - } - } - - $chunkedShareList = array_chunk($shares, $chunkSize, true); - $connection = \OC_DB::getConnection(); - - foreach ($chunkedShareList as $subList) { - - $statement = "UPDATE `*PREFIX*share` SET `file_target` = CASE `id` "; - //update share table - $ids = implode(',', array_keys($subList)); - foreach ($subList as $id => $target) { - $statement .= "WHEN " . $connection->quote($id, \PDO::PARAM_INT) . " THEN " . $connection->quote('/Shared' . $target, \PDO::PARAM_STR); - } - $statement .= ' END WHERE `id` IN (' . $ids . ')'; - - $query = OCP\DB::prepare($statement); - - $query->execute(array()); - } - - // set config to keep the Shared folder as the default location for new shares - \OCA\Files_Sharing\Helper::setShareFolder('/Shared'); - - } -} diff --git a/apps/files_sharing/appinfo/version b/apps/files_sharing/appinfo/version index be14282b7ff..7d8568351b4 100644 --- a/apps/files_sharing/appinfo/version +++ b/apps/files_sharing/appinfo/version @@ -1 +1 @@ -0.5.3 +0.5.4 diff --git a/apps/files_sharing/application.php b/apps/files_sharing/application.php new file mode 100644 index 00000000000..773831d99b1 --- /dev/null +++ b/apps/files_sharing/application.php @@ -0,0 +1,95 @@ +<?php +/** + * @author Lukas Reschke + * @copyright 2014 Lukas Reschke lukas@owncloud.com + * + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace OCA\Files_Sharing; + +use OC\AppFramework\Utility\SimpleContainer; +use OCA\Files_Sharing\Controllers\ExternalSharesController; +use OCA\Files_Sharing\Controllers\ShareController; +use OCA\Files_Sharing\Middleware\SharingCheckMiddleware; +use \OCP\AppFramework\App; + +/** + * @package OCA\Files_Sharing + */ +class Application extends App { + + + /** + * @param array $urlParams + */ + public function __construct(array $urlParams=array()){ + parent::__construct('files_sharing', $urlParams); + + $container = $this->getContainer(); + + /** + * Controllers + */ + $container->registerService('ShareController', function(SimpleContainer $c) { + return new ShareController( + $c->query('AppName'), + $c->query('Request'), + $c->query('UserSession'), + $c->query('ServerContainer')->getAppConfig(), + $c->query('ServerContainer')->getConfig(), + $c->query('URLGenerator'), + $c->query('ServerContainer')->getUserManager(), + $c->query('ServerContainer')->getLogger(), + $c->query('ServerContainer')->getActivityManager() + ); + }); + $container->registerService('ExternalSharesController', function(SimpleContainer $c) { + return new ExternalSharesController( + $c->query('AppName'), + $c->query('Request'), + $c->query('IsIncomingShareEnabled'), + $c->query('ExternalManager') + ); + }); + + /** + * Core class wrappers + */ + $container->registerService('UserSession', function(SimpleContainer $c) { + return $c->query('ServerContainer')->getUserSession(); + }); + $container->registerService('URLGenerator', function(SimpleContainer $c) { + return $c->query('ServerContainer')->getUrlGenerator(); + }); + $container->registerService('IsIncomingShareEnabled', function(SimpleContainer $c) { + return Helper::isIncomingServer2serverShareEnabled(); + }); + $container->registerService('ExternalManager', function(SimpleContainer $c) { + return new \OCA\Files_Sharing\External\Manager( + \OC::$server->getDatabaseConnection(), + \OC\Files\Filesystem::getMountManager(), + \OC\Files\Filesystem::getLoader(), + \OC::$server->getUserSession(), + \OC::$server->getHTTPHelper() + ); + }); + + /** + * Middleware + */ + $container->registerService('SharingCheckMiddleware', function(SimpleContainer $c){ + return new SharingCheckMiddleware( + $c->query('AppName'), + $c->query('ServerContainer')->getAppConfig(), + $c->getCoreApi() + ); + }); + + // Execute middlewares + $container->registerMiddleware('SharingCheckMiddleware'); + } + +} diff --git a/apps/files_sharing/js/app.js b/apps/files_sharing/js/app.js index 1a3bfac5b97..3168e930829 100644 --- a/apps/files_sharing/js/app.js +++ b/apps/files_sharing/js/app.js @@ -9,8 +9,14 @@ */ if (!OCA.Sharing) { + /** + * @namespace OCA.Sharing + */ OCA.Sharing = {}; } +/** + * @namespace + */ OCA.Sharing.App = { _inFileList: null, @@ -24,6 +30,7 @@ OCA.Sharing.App = { this._inFileList = new OCA.Sharing.FileList( $el, { + id: 'shares.self', scrollContainer: $('#app-content'), sharedWithUser: true, fileActions: this._createFileActions() @@ -32,7 +39,9 @@ OCA.Sharing.App = { this._extendFileList(this._inFileList); this._inFileList.appName = t('files_sharing', 'Shared with you'); - this._inFileList.$el.find('#emptycontent').text(t('files_sharing', 'No files have been shared with you yet.')); + this._inFileList.$el.find('#emptycontent').html('<div class="icon-share"></div>' + + '<h2>' + t('files_sharing', 'Nothing shared with you yet') + '</h2>' + + '<p>' + t('files_sharing', 'Files and folders others share with you will show up here') + '</p>'); return this._inFileList; }, @@ -43,6 +52,7 @@ OCA.Sharing.App = { this._outFileList = new OCA.Sharing.FileList( $el, { + id: 'shares.others', scrollContainer: $('#app-content'), sharedWithUser: false, fileActions: this._createFileActions() @@ -51,7 +61,9 @@ OCA.Sharing.App = { this._extendFileList(this._outFileList); this._outFileList.appName = t('files_sharing', 'Shared with others'); - this._outFileList.$el.find('#emptycontent').text(t('files_sharing', 'You haven\'t shared any files yet.')); + this._outFileList.$el.find('#emptycontent').html('<div class="icon-share"></div>' + + '<h2>' + t('files_sharing', 'Nothing shared yet') + '</h2>' + + '<p>' + t('files_sharing', 'Files and folders you share will show up here') + '</p>'); return this._outFileList; }, @@ -62,6 +74,7 @@ OCA.Sharing.App = { this._linkFileList = new OCA.Sharing.FileList( $el, { + id: 'shares.link', scrollContainer: $('#app-content'), linksOnly: true, fileActions: this._createFileActions() @@ -70,7 +83,9 @@ OCA.Sharing.App = { this._extendFileList(this._linkFileList); this._linkFileList.appName = t('files_sharing', 'Shared by link'); - this._linkFileList.$el.find('#emptycontent').text(t('files_sharing', 'You haven\'t shared any files by link yet.')); + this._linkFileList.$el.find('#emptycontent').html('<div class="icon-public"></div>' + + '<h2>' + t('files_sharing', 'No shared links') + '</h2>' + + '<p>' + t('files_sharing', 'Files and folders you share by link will show up here') + '</p>'); return this._linkFileList; }, diff --git a/apps/files_sharing/js/external.js b/apps/files_sharing/js/external.js index 6ede2584cd9..aeb4b2461f8 100644 --- a/apps/files_sharing/js/external.js +++ b/apps/files_sharing/js/external.js @@ -8,16 +8,6 @@ * */ (function () { - var addExternalShare = function (remote, token, owner, name, password) { - return $.post(OC.generateUrl('apps/files_sharing/external'), { - remote: remote, - token: token, - owner: owner, - name: name, - password: password - }); - }; - /** * Shows "add external share" dialog. * @@ -27,20 +17,12 @@ * @param {String} token authentication token * @param {bool} passwordProtected true if the share is password protected */ - OCA.Sharing.showAddExternalDialog = function (remote, token, owner, name, passwordProtected) { + OCA.Sharing.showAddExternalDialog = function (share, passwordProtected, callback) { + var remote = share.remote; + var owner = share.owner; + var name = share.name; var remoteClean = (remote.substr(0, 8) === 'https://') ? remote.substr(8) : remote.substr(7); - var callback = function (add, password) { - password = password || ''; - if (add) { - addExternalShare(remote, token, owner, name, password).then(function (result) { - if (result.status === 'error') { - OC.Notification.show(result.data.message); - } else { - FileList.reload(); - } - }); - } - }; + if (!passwordProtected) { OC.dialogs.confirm( t( @@ -49,7 +31,9 @@ {name: name, owner: owner, remote: remoteClean} ), t('files_sharing','Remote share'), - callback, + function (result) { + callback(result, share); + }, true ).then(this._adjustDialog); } else { @@ -60,7 +44,9 @@ {name: name, owner: owner, remote: remoteClean} ), t('files_sharing','Remote share'), - callback, + function (result) { + callback(result, share); + }, true, t('files_sharing','Remote share password'), true @@ -82,17 +68,66 @@ $(document).ready(function () { // FIXME: HACK: do not init when running unit tests, need a better way if (!window.TESTING && OCA.Files) {// only run in the files app var params = OC.Util.History.parseUrlQuery(); + + //manually add server-to-server share if (params.remote && params.token && params.owner && params.name) { + + var callbackAddShare = function(result, share) { + var password = share.password || ''; + if (result) { + //$.post(OC.generateUrl('/apps/files_sharing/api/externalShares'), {id: share.id}); + $.post(OC.generateUrl('apps/files_sharing/external'), { + remote: share.remote, + token: share.token, + owner: share.owner, + name: share.name, + password: password}, function(result) { + if (result.status === 'error') { + OC.Notification.show(result.data.message); + } else { + FileList.reload(); + } + }); + } + }; + // clear hash, it is unlikely that it contain any extra parameters location.hash = ''; params.passwordProtected = parseInt(params.protected, 10) === 1; OCA.Sharing.showAddExternalDialog( - params.remote, - params.token, - params.owner, - params.name, - params.passwordProtected + params, + params.passwordProtected, + callbackAddShare ); } + + // check for new server-to-server shares which need to be approved + $.get(OC.generateUrl('/apps/files_sharing/api/externalShares'), + {}, + function(shares) { + var index; + for (index = 0; index < shares.length; ++index) { + OCA.Sharing.showAddExternalDialog( + shares[index], + false, + function(result, share) { + if (result) { + // Accept + $.post(OC.generateUrl('/apps/files_sharing/api/externalShares'), {id: share.id}); + FileList.reload(); + } else { + // Delete + $.ajax({ + url: OC.generateUrl('/apps/files_sharing/api/externalShares/'+share.id), + type: 'DELETE' + }); + } + } + ); + } + + }); + } + }); diff --git a/apps/files_sharing/js/public.js b/apps/files_sharing/js/public.js index c4b5508692e..02ecf56fa09 100644 --- a/apps/files_sharing/js/public.js +++ b/apps/files_sharing/js/public.js @@ -16,9 +16,17 @@ if (!OCA.Sharing) { if (!OCA.Files) { OCA.Files = {}; } +/** + * @namespace + */ OCA.Sharing.PublicApp = { _initialized: false, + /** + * Initializes the public share app. + * + * @param $el container + */ initialize: function ($el) { var self = this; var fileActions; @@ -45,6 +53,7 @@ OCA.Sharing.PublicApp = { this.fileList = new OCA.Files.FileList( $el, { + id: 'files.public', scrollContainer: $(window), dragOptions: dragOptions, folderDropOptions: folderDropOptions, @@ -53,6 +62,9 @@ OCA.Sharing.PublicApp = { ); this.files = OCA.Files.Files; this.files.initialize(); + // TODO: move to PublicFileList.initialize() once + // the code was split into a separate class + OC.Plugins.attach('OCA.Sharing.PublicFileList', this.fileList); } var mimetype = $('#mimetype').val(); @@ -84,7 +96,7 @@ OCA.Sharing.PublicApp = { scalingup: 0 }; - var img = $('<img class="publicpreview">'); + var img = $('<img class="publicpreview" alt="">'); if (previewSupported === 'true' || mimetype.substr(0, mimetype.indexOf('/')) === 'image' && mimetype !== 'image/svg+xml') { img.attr('src', OC.filePath('files_sharing', 'ajax', 'publicpreview.php') + '?' + OC.buildQueryString(params)); img.appendTo('#imgframe'); @@ -101,14 +113,12 @@ OCA.Sharing.PublicApp = { filename = JSON.stringify(filename); } var path = dir || FileList.getCurrentDirectory(); + var token = $('#sharingToken').val(); var params = { - service: 'files', - t: $('#sharingToken').val(), path: path, - files: filename, - download: null + files: filename }; - return OC.filePath('', '', 'public.php') + '?' + OC.buildQueryString(params); + return OC.generateUrl('/s/'+token+'/download') + '?' + OC.buildQueryString(params); }; this.fileList.getAjaxUrl = function (action, params) { @@ -118,12 +128,11 @@ OCA.Sharing.PublicApp = { }; this.fileList.linkTo = function (dir) { + var token = $('#sharingToken').val(); var params = { - service: 'files', - t: $('#sharingToken').val(), dir: dir }; - return OC.filePath('', '', 'public.php') + '?' + OC.buildQueryString(params); + return OC.generateUrl('/s/'+token+'') + '?' + OC.buildQueryString(params); }; this.fileList.generatePreviewUrl = function (urlSpec) { @@ -185,8 +194,6 @@ OCA.Sharing.PublicApp = { _onDirectoryChanged: function (e) { OC.Util.History.pushState({ - service: 'files', - t: $('#sharingToken').val(), // arghhhh, why is this not called "dir" !? path: e.dir }); @@ -210,7 +217,7 @@ OCA.Sharing.PublicApp = { // this check needs to happen on the server due to the Content Security Policy directive $.get(OC.generateUrl('apps/files_sharing/testremote'), {remote: remote}).then(function (protocol) { if (protocol !== 'http' && protocol !== 'https') { - OC.dialogs.alert(t('files_sharing', 'No ownCloud installation found at {remote}', {remote: remote}), + OC.dialogs.alert(t('files_sharing', 'No ownCloud installation (7 or higher) found at {remote}', {remote: remote}), t('files_sharing', 'Invalid ownCloud url')); } else { OC.redirect(protocol + '://' + url); diff --git a/apps/files_sharing/js/share.js b/apps/files_sharing/js/share.js index eccd21c9248..bbd107e070e 100644 --- a/apps/files_sharing/js/share.js +++ b/apps/files_sharing/js/share.js @@ -12,34 +12,52 @@ if (!OCA.Sharing) { OCA.Sharing = {}; } + /** + * @namespace + */ OCA.Sharing.Util = { - initialize: function(fileActions) { - if (OCA.Files.FileList) { - var oldCreateRow = OCA.Files.FileList.prototype._createRow; - OCA.Files.FileList.prototype._createRow = function(fileData) { - var tr = oldCreateRow.apply(this, arguments); - var sharePermissions = fileData.permissions; - if (fileData.type === 'file') { - // files can't be shared with delete permissions - sharePermissions = sharePermissions & ~OC.PERMISSION_DELETE; - } - tr.attr('data-share-permissions', sharePermissions); - if (fileData.shareOwner) { - tr.attr('data-share-owner', fileData.shareOwner); - // user should always be able to rename a mount point - if (fileData.isShareMountPoint) { - tr.attr('data-permissions', fileData.permissions | OC.PERMISSION_UPDATE); - } - } - if (fileData.recipientsDisplayName) { - tr.attr('data-share-recipients', fileData.recipientsDisplayName); - } - return tr; - }; + /** + * Initialize the sharing plugin. + * + * Registers the "Share" file action and adds additional + * DOM attributes for the sharing file info. + * + * @param {OCA.Files.FileList} fileList file list to be extended + */ + attach: function(fileList) { + if (fileList.id === 'trashbin') { + return; } + var fileActions = fileList.fileActions; + var oldCreateRow = fileList._createRow; + fileList._createRow = function(fileData) { + var tr = oldCreateRow.apply(this, arguments); + var sharePermissions = fileData.permissions; + if (fileData.mountType && fileData.mountType === "external-root"){ + // for external storages we cant use the permissions of the mountpoint + // instead we show all permissions and only use the share permissions from the mountpoint to handle resharing + sharePermissions = sharePermissions | (OC.PERMISSION_ALL & ~OC.PERMISSION_SHARE); + } + if (fileData.type === 'file') { + // files can't be shared with delete permissions + sharePermissions = sharePermissions & ~OC.PERMISSION_DELETE; + } + tr.attr('data-share-permissions', sharePermissions); + if (fileData.shareOwner) { + tr.attr('data-share-owner', fileData.shareOwner); + // user should always be able to rename a mount point + if (fileData.isShareMountPoint) { + tr.attr('data-permissions', fileData.permissions | OC.PERMISSION_UPDATE); + } + } + if (fileData.recipientsDisplayName) { + tr.attr('data-share-recipients', fileData.recipientsDisplayName); + } + return tr; + }; // use delegate to catch the case with multiple file lists - $('#content').delegate('#fileList', 'fileActionsReady', function(ev){ + fileList.$el.on('fileActionsReady', function(ev){ var fileList = ev.fileList; var $files = ev.$files; @@ -160,9 +178,9 @@ * other ones will be shown as "+x" where "x" is the number of * remaining recipients. * - * @param recipients recipients array - * @param count optional total recipients count (in case the array was shortened) - * @return formatted recipients display text + * @param {Array.<String>} recipients recipients array + * @param {int} count optional total recipients count (in case the array was shortened) + * @return {String} formatted recipients display text */ formatRecipients: function(recipients, count) { var maxRecipients = 4; @@ -181,12 +199,5 @@ }; })(); -$(document).ready(function() { - // FIXME: HACK: do not init when running unit tests, need a better way - if (!window.TESTING) { - if (!_.isUndefined(OC.Share) && !_.isUndefined(OCA.Files)) { - OCA.Sharing.Util.initialize(OCA.Files.fileActions); - } - } -}); +OC.Plugins.register('OCA.Files.FileList', OCA.Sharing.Util); diff --git a/apps/files_sharing/js/sharedfilelist.js b/apps/files_sharing/js/sharedfilelist.js index b99611f9bf0..2c7d6c7d43a 100644 --- a/apps/files_sharing/js/sharedfilelist.js +++ b/apps/files_sharing/js/sharedfilelist.js @@ -10,15 +10,25 @@ (function() { /** - * Sharing file list + * @class OCA.Sharing.FileList + * @augments OCA.Files.FileList * + * @classdesc Sharing file list. * Contains both "shared with others" and "shared with you" modes. + * + * @param $el container element with existing markup for the #controls + * and a table + * @param [options] map of options, see other parameters + * @param {boolean} [options.sharedWithUser] true to return files shared with + * the current user, false to return files that the user shared with others. + * Defaults to false. + * @param {boolean} [options.linksOnly] true to return only link shares */ var FileList = function($el, options) { this.initialize($el, options); }; - - FileList.prototype = _.extend({}, OCA.Files.FileList.prototype, { + FileList.prototype = _.extend({}, OCA.Files.FileList.prototype, + /** @lends OCA.Sharing.FileList.prototype */ { appName: 'Shares', /** @@ -27,9 +37,12 @@ */ _sharedWithUser: false, _linksOnly: false, - _clientSideSort: true, + _allowSelection: false, + /** + * @private + */ initialize: function($el, options) { OCA.Files.FileList.prototype.initialize.apply(this, arguments); if (this.initialized) { @@ -43,6 +56,7 @@ if (options && options.linksOnly) { this._linksOnly = true; } + OC.Plugins.attach('OCA.Sharing.FileList', this); }, _renderRow: function() { @@ -91,7 +105,11 @@ }, getDirectoryPermissions: function() { - return OC.PERMISSION_READ | OC.PERMISSION_DELETE; + var perms = OC.PERMISSION_READ; + if (this._sharedWithUser) { + perms |= OC.PERMISSION_DELETE; + } + return perms; }, updateStorageStatistics: function() { @@ -138,8 +156,8 @@ /** * Converts the OCS API share response data to a file info * list - * @param OCS API share array - * @return array of file info maps + * @param {Array} data OCS API share array + * @return {Array.<OCA.Sharing.SharedFileInfo>} array of shared file info */ _makeFilesFromShares: function(data) { /* jshint camelcase: false */ @@ -191,7 +209,11 @@ } file.name = OC.basename(share.path); file.path = OC.dirname(share.path); - file.permissions = OC.PERMISSION_ALL; + if (this._sharedWithUser) { + file.permissions = OC.PERMISSION_ALL; + } else { + file.permissions = OC.PERMISSION_ALL - OC.PERMISSION_DELETE; + } if (file.path) { file.extraData = share.path; } @@ -259,5 +281,33 @@ } }); + /** + * Share info attributes. + * + * @typedef {Object} OCA.Sharing.ShareInfo + * + * @property {int} id share ID + * @property {int} type share type + * @property {String} target share target, either user name or group name + * @property {int} stime share timestamp in milliseconds + * @property {String} [targetDisplayName] display name of the recipient + * (only when shared with others) + * + */ + + /** + * Shared file info attributes. + * + * @typedef {OCA.Files.FileInfo} OCA.Sharing.SharedFileInfo + * + * @property {Array.<OCA.Sharing.ShareInfo>} shares array of shares for + * this file + * @property {int} mtime most recent share time (if multiple shares) + * @property {String} shareOwner name of the share owner + * @property {Array.<String>} recipients name of the first 4 recipients + * (this is mostly for display purposes) + * @property {String} recipientsDisplayName display name + */ + OCA.Sharing.FileList = FileList; })(); diff --git a/apps/files_sharing/l10n/ast.js b/apps/files_sharing/l10n/ast.js index 7273f0fec5b..5c935410b6f 100644 --- a/apps/files_sharing/l10n/ast.js +++ b/apps/files_sharing/l10n/ast.js @@ -8,15 +8,11 @@ OC.L10N.register( "Shared with you" : "Compartíos contigo", "Shared with others" : "Compartíos con otros", "Shared by link" : "Compartíos per enllaz", - "No files have been shared with you yet." : "Entá nun se compartieron ficheros contigo.", - "You haven't shared any files yet." : "Entá nun compartiesti dengún ficheru.", - "You haven't shared any files by link yet." : "Entá nun compartiesti nengún ficheru per enllaz.", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Quies amestar compartición remota {name} de {owner}@{remote}?", "Remote share" : "Compartición remota", "Remote share password" : "Contraseña de compartición remota", "Cancel" : "Encaboxar", "Add remote share" : "Amestar compartición remota", - "No ownCloud installation found at {remote}" : "Nun s'alcontró denguna instalación d'ownCloud en {remote}", "Invalid ownCloud url" : "Url ownCloud inválida", "Shared by" : "Compartíos por", "This share is password-protected" : "Esta compartición tien contraseña protexida", diff --git a/apps/files_sharing/l10n/ast.json b/apps/files_sharing/l10n/ast.json index fd9d2479cc7..d776a4fefba 100644 --- a/apps/files_sharing/l10n/ast.json +++ b/apps/files_sharing/l10n/ast.json @@ -6,15 +6,11 @@ "Shared with you" : "Compartíos contigo", "Shared with others" : "Compartíos con otros", "Shared by link" : "Compartíos per enllaz", - "No files have been shared with you yet." : "Entá nun se compartieron ficheros contigo.", - "You haven't shared any files yet." : "Entá nun compartiesti dengún ficheru.", - "You haven't shared any files by link yet." : "Entá nun compartiesti nengún ficheru per enllaz.", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Quies amestar compartición remota {name} de {owner}@{remote}?", "Remote share" : "Compartición remota", "Remote share password" : "Contraseña de compartición remota", "Cancel" : "Encaboxar", "Add remote share" : "Amestar compartición remota", - "No ownCloud installation found at {remote}" : "Nun s'alcontró denguna instalación d'ownCloud en {remote}", "Invalid ownCloud url" : "Url ownCloud inválida", "Shared by" : "Compartíos por", "This share is password-protected" : "Esta compartición tien contraseña protexida", diff --git a/apps/files_sharing/l10n/az.js b/apps/files_sharing/l10n/az.js index ac29161dbd7..223fbfdef59 100644 --- a/apps/files_sharing/l10n/az.js +++ b/apps/files_sharing/l10n/az.js @@ -6,8 +6,6 @@ OC.L10N.register( "Couldn't add remote share" : "Uzaqda olan yayımlanmanı əlavə etmək mümkün olmadı", "Shared with you" : "Sizinlə yayımlanan", "Shared with others" : "Hər kəsə yayımlanmış", - "You haven't shared any files yet." : "Siz hələki heç bir faylı yayımlamamısnız.", - "You haven't shared any files by link yet." : "Hələki siz bu link ilə heç bir faylı yayımlamamısıniz.", "Remote share" : "Uzaq yayımlanma", "Remote share password" : "Uzaq yayımlanma şifrəsi", "Cancel" : "Dayandır", diff --git a/apps/files_sharing/l10n/az.json b/apps/files_sharing/l10n/az.json index 1b08e3b4e7d..3bd23948fd6 100644 --- a/apps/files_sharing/l10n/az.json +++ b/apps/files_sharing/l10n/az.json @@ -4,8 +4,6 @@ "Couldn't add remote share" : "Uzaqda olan yayımlanmanı əlavə etmək mümkün olmadı", "Shared with you" : "Sizinlə yayımlanan", "Shared with others" : "Hər kəsə yayımlanmış", - "You haven't shared any files yet." : "Siz hələki heç bir faylı yayımlamamısnız.", - "You haven't shared any files by link yet." : "Hələki siz bu link ilə heç bir faylı yayımlamamısıniz.", "Remote share" : "Uzaq yayımlanma", "Remote share password" : "Uzaq yayımlanma şifrəsi", "Cancel" : "Dayandır", diff --git a/apps/files_sharing/l10n/bg_BG.js b/apps/files_sharing/l10n/bg_BG.js index 15a51e759d7..6da77164ddc 100644 --- a/apps/files_sharing/l10n/bg_BG.js +++ b/apps/files_sharing/l10n/bg_BG.js @@ -8,15 +8,11 @@ OC.L10N.register( "Shared with you" : "Споделено с теб", "Shared with others" : "Споделено с други", "Shared by link" : "Споделено с връзка", - "No files have been shared with you yet." : "Все още няма споделени с теб файлове.", - "You haven't shared any files yet." : "Все още не си споделил файлове.", - "You haven't shared any files by link yet." : "Все още не си споделил файлове с връзка.", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Желаеш ли да добавиш като прикачената папка {name} от {owner}@{remote}?", "Remote share" : "Прикачена Папка", "Remote share password" : "Парола за прикачена папка", "Cancel" : "Отказ", "Add remote share" : "Добави прикачена папка", - "No ownCloud installation found at {remote}" : "Не е открит инсталиран ownCloud на {remote}.", "Invalid ownCloud url" : "Невалиден ownCloud интернет адрес.", "Shared by" : "Споделено от", "This share is password-protected" : "Тази зона е защитена с парола.", @@ -33,6 +29,9 @@ OC.L10N.register( "Add to your ownCloud" : "Добави към своя ownCloud", "Download" : "Изтегли", "Download %s" : "Изтегли %s", - "Direct link" : "Директна връзка" + "Direct link" : "Директна връзка", + "Server-to-Server Sharing" : "Споделяне между Сървъри", + "Allow users on this server to send shares to other servers" : "Позволи на потребители от този сървър да споделят папки с други сървъри", + "Allow users on this server to receive shares from other servers" : "Позволи на потребители на този сървър да получават споделени папки от други сървъри" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files_sharing/l10n/bg_BG.json b/apps/files_sharing/l10n/bg_BG.json index 85b2bcecbe1..f151698099b 100644 --- a/apps/files_sharing/l10n/bg_BG.json +++ b/apps/files_sharing/l10n/bg_BG.json @@ -6,15 +6,11 @@ "Shared with you" : "Споделено с теб", "Shared with others" : "Споделено с други", "Shared by link" : "Споделено с връзка", - "No files have been shared with you yet." : "Все още няма споделени с теб файлове.", - "You haven't shared any files yet." : "Все още не си споделил файлове.", - "You haven't shared any files by link yet." : "Все още не си споделил файлове с връзка.", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Желаеш ли да добавиш като прикачената папка {name} от {owner}@{remote}?", "Remote share" : "Прикачена Папка", "Remote share password" : "Парола за прикачена папка", "Cancel" : "Отказ", "Add remote share" : "Добави прикачена папка", - "No ownCloud installation found at {remote}" : "Не е открит инсталиран ownCloud на {remote}.", "Invalid ownCloud url" : "Невалиден ownCloud интернет адрес.", "Shared by" : "Споделено от", "This share is password-protected" : "Тази зона е защитена с парола.", @@ -31,6 +27,9 @@ "Add to your ownCloud" : "Добави към своя ownCloud", "Download" : "Изтегли", "Download %s" : "Изтегли %s", - "Direct link" : "Директна връзка" + "Direct link" : "Директна връзка", + "Server-to-Server Sharing" : "Споделяне между Сървъри", + "Allow users on this server to send shares to other servers" : "Позволи на потребители от този сървър да споделят папки с други сървъри", + "Allow users on this server to receive shares from other servers" : "Позволи на потребители на този сървър да получават споделени папки от други сървъри" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files_sharing/l10n/bn_BD.js b/apps/files_sharing/l10n/bn_BD.js index 9f345965aee..f297d1f7b18 100644 --- a/apps/files_sharing/l10n/bn_BD.js +++ b/apps/files_sharing/l10n/bn_BD.js @@ -8,7 +8,6 @@ OC.L10N.register( "Shared by link" : "লিঙ্কের মাধ্যমে ভাগাভাগিকৃত", "Remote share" : "দুরবর্তী ভাগাভাগি", "Cancel" : "বাতিল", - "No ownCloud installation found at {remote}" : "{remote}এ কোন ওউনক্লাউড ইনস্টলেসন পাওয়া গেলনা", "Invalid ownCloud url" : "অবৈধ ওউনক্লাউড url", "Shared by" : "যাদের মাঝে ভাগাভাগি করা হয়েছে", "This share is password-protected" : "এই শেয়ারটি কূটশব্দদ্বারা সুরক্ষিত", diff --git a/apps/files_sharing/l10n/bn_BD.json b/apps/files_sharing/l10n/bn_BD.json index 0511dc3d939..cff7925505c 100644 --- a/apps/files_sharing/l10n/bn_BD.json +++ b/apps/files_sharing/l10n/bn_BD.json @@ -6,7 +6,6 @@ "Shared by link" : "লিঙ্কের মাধ্যমে ভাগাভাগিকৃত", "Remote share" : "দুরবর্তী ভাগাভাগি", "Cancel" : "বাতিল", - "No ownCloud installation found at {remote}" : "{remote}এ কোন ওউনক্লাউড ইনস্টলেসন পাওয়া গেলনা", "Invalid ownCloud url" : "অবৈধ ওউনক্লাউড url", "Shared by" : "যাদের মাঝে ভাগাভাগি করা হয়েছে", "This share is password-protected" : "এই শেয়ারটি কূটশব্দদ্বারা সুরক্ষিত", diff --git a/apps/files_sharing/l10n/bs.js b/apps/files_sharing/l10n/bs.js index 1be4f1f3fb8..9ff10d77a5b 100644 --- a/apps/files_sharing/l10n/bs.js +++ b/apps/files_sharing/l10n/bs.js @@ -1,7 +1,10 @@ OC.L10N.register( "files_sharing", { + "Cancel" : "Odustani", "Shared by" : "Dijeli", - "Name" : "Ime" + "Password" : "Lozinka", + "Name" : "Ime", + "Download" : "Preuzmite" }, "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/apps/files_sharing/l10n/bs.json b/apps/files_sharing/l10n/bs.json index 48fb8d2209a..c2bfb948e8e 100644 --- a/apps/files_sharing/l10n/bs.json +++ b/apps/files_sharing/l10n/bs.json @@ -1,5 +1,8 @@ { "translations": { + "Cancel" : "Odustani", "Shared by" : "Dijeli", - "Name" : "Ime" + "Password" : "Lozinka", + "Name" : "Ime", + "Download" : "Preuzmite" },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" }
\ No newline at end of file diff --git a/apps/files_sharing/l10n/ca.js b/apps/files_sharing/l10n/ca.js index 51153252cba..e65956d5f56 100644 --- a/apps/files_sharing/l10n/ca.js +++ b/apps/files_sharing/l10n/ca.js @@ -4,18 +4,14 @@ OC.L10N.register( "Server to server sharing is not enabled on this server" : "La compartició entre servidors no està activada en aquest servidor", "Invalid or untrusted SSL certificate" : "El certificat SSL és invàlid o no és fiable", "Couldn't add remote share" : "No s'ha pogut afegir una compartició remota", - "Shared with you" : "Compartit amb vós", - "Shared with others" : "Compartit amb altres", + "Shared with you" : "Us han compartit", + "Shared with others" : "Heu compartit", "Shared by link" : "Compartit amb enllaç", - "No files have been shared with you yet." : "Encara no hi ha fitxers compartits amb vós.", - "You haven't shared any files yet." : "Encara no heu compartit cap fitxer.", - "You haven't shared any files by link yet." : "Encara no heu compartit cap fitxer amb enllaç.", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Voleu afegir la compartició remota {nom} des de {owner}@{remote}?", "Remote share" : "Compartició remota", "Remote share password" : "Contrasenya de compartició remota", "Cancel" : "Cancel·la", "Add remote share" : "Afegeix compartició remota", - "No ownCloud installation found at {remote}" : "No s'ha trobat cap instal·lació ownCloud a {remote}", "Invalid ownCloud url" : "La url d'ownCloud no és vàlida", "Shared by" : "Compartit per", "This share is password-protected" : "Aquest compartit està protegit amb contrasenya", diff --git a/apps/files_sharing/l10n/ca.json b/apps/files_sharing/l10n/ca.json index 88d2fa70811..69e766582c8 100644 --- a/apps/files_sharing/l10n/ca.json +++ b/apps/files_sharing/l10n/ca.json @@ -2,18 +2,14 @@ "Server to server sharing is not enabled on this server" : "La compartició entre servidors no està activada en aquest servidor", "Invalid or untrusted SSL certificate" : "El certificat SSL és invàlid o no és fiable", "Couldn't add remote share" : "No s'ha pogut afegir una compartició remota", - "Shared with you" : "Compartit amb vós", - "Shared with others" : "Compartit amb altres", + "Shared with you" : "Us han compartit", + "Shared with others" : "Heu compartit", "Shared by link" : "Compartit amb enllaç", - "No files have been shared with you yet." : "Encara no hi ha fitxers compartits amb vós.", - "You haven't shared any files yet." : "Encara no heu compartit cap fitxer.", - "You haven't shared any files by link yet." : "Encara no heu compartit cap fitxer amb enllaç.", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Voleu afegir la compartició remota {nom} des de {owner}@{remote}?", "Remote share" : "Compartició remota", "Remote share password" : "Contrasenya de compartició remota", "Cancel" : "Cancel·la", "Add remote share" : "Afegeix compartició remota", - "No ownCloud installation found at {remote}" : "No s'ha trobat cap instal·lació ownCloud a {remote}", "Invalid ownCloud url" : "La url d'ownCloud no és vàlida", "Shared by" : "Compartit per", "This share is password-protected" : "Aquest compartit està protegit amb contrasenya", diff --git a/apps/files_sharing/l10n/cs_CZ.js b/apps/files_sharing/l10n/cs_CZ.js index 1d65d7032ee..ebe683ff89f 100644 --- a/apps/files_sharing/l10n/cs_CZ.js +++ b/apps/files_sharing/l10n/cs_CZ.js @@ -8,20 +8,32 @@ OC.L10N.register( "Shared with you" : "Sdíleno s vámi", "Shared with others" : "Sdíleno s ostatními", "Shared by link" : "Sdíleno pomocí odkazu", - "No files have been shared with you yet." : "Zatím s vámi nikdo žádné soubory nesdílel.", - "You haven't shared any files yet." : "Zatím jste nesdíleli žádné soubory.", - "You haven't shared any files by link yet." : "Zatím jste nesdíleli pomocí odkazu žádné soubory.", + "Nothing shared with you yet" : "Zatím s vámi nikdo nic nesdílel", + "Files and folders others share with you will show up here" : "Zde budou zobrazeny soubory a adresáře, které s vámi ostatní sdílí", + "Nothing shared yet" : "Zatím není nic sdíleno", + "Files and folders you share will show up here" : "Zde budou zobrazeny vámi sdílené soubory a adresáře", + "No shared links" : "Žádné sdílené odkazy", + "Files and folders you share by link will show up here" : "Zde budou zobrazeny soubory a adresáře, které sdílíte jako webové odkazy", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Chcete přidat vzdálené úložiště {name} uživatele {owner}@{remote}?", "Remote share" : "Vzdálené úložiště", "Remote share password" : "Heslo ke vzdálenému úložišti", "Cancel" : "Zrušit", "Add remote share" : "Přidat vzdálené úložiště", - "No ownCloud installation found at {remote}" : "Nebyla nalezena instalace ownCloud na {remote}", + "No ownCloud installation (7 or higher) found at {remote}" : "Nebyla nalezena instalace ownCloud (7 nebo vyšší) na {remote}", "Invalid ownCloud url" : "Neplatná ownCloud url", "Shared by" : "Sdílí", + "A file or folder was shared from <strong>another server</strong>" : "Soubor nebo složka byla nasdílena z <strong>jiného serveru</strong>", + "A public shared file or folder was <strong>downloaded</strong>" : "Byl <strong>stažen</strong> veřejně sdílený soubor nebo adresář", + "You received a new remote share from %s" : "Obdrželi jste nové vzdálené sdílení z %s", + "%1$s accepted remote share %2$s" : "%1$s přijal(a) vzdálené sdílení %2$s", + "%1$s declined remote share %2$s" : "%1$s odmítl(a) vzdálené sdílení %2$s", + "%1$s unshared %2$s from you" : "%1$s již více nesdílí %2$s", + "Public shared folder %1$s was downloaded" : "Byl stažen veřejně sdílený adresář %1$s ", + "Public shared file %1$s was downloaded" : "Byl stažen veřejně sdílený soubor %1$s ", "This share is password-protected" : "Toto sdílení je chráněno heslem", "The password is wrong. Try again." : "Heslo není správné. Zkuste to znovu.", "Password" : "Heslo", + "No entries found in this folder" : "V tomto adresáři nebylo nic nalezeno", "Name" : "Název", "Share time" : "Čas sdílení", "Sorry, this link doesn’t seem to work anymore." : "Je nám líto, ale tento odkaz již není funkční.", @@ -33,6 +45,9 @@ OC.L10N.register( "Add to your ownCloud" : "Přidat do svého ownCloudu", "Download" : "Stáhnout", "Download %s" : "Stáhnout %s", - "Direct link" : "Přímý odkaz" + "Direct link" : "Přímý odkaz", + "Server-to-Server Sharing" : "Sdílení mezi servery", + "Allow users on this server to send shares to other servers" : "Povolit uživatelům z tohoto serveru zasílat sdílení na jiné servery", + "Allow users on this server to receive shares from other servers" : "Povolit uživatelům z tohoto serveru přijímat sdílení z jiných serverů" }, "nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"); diff --git a/apps/files_sharing/l10n/cs_CZ.json b/apps/files_sharing/l10n/cs_CZ.json index a4d4bdf28e2..4b3d934132a 100644 --- a/apps/files_sharing/l10n/cs_CZ.json +++ b/apps/files_sharing/l10n/cs_CZ.json @@ -6,20 +6,32 @@ "Shared with you" : "Sdíleno s vámi", "Shared with others" : "Sdíleno s ostatními", "Shared by link" : "Sdíleno pomocí odkazu", - "No files have been shared with you yet." : "Zatím s vámi nikdo žádné soubory nesdílel.", - "You haven't shared any files yet." : "Zatím jste nesdíleli žádné soubory.", - "You haven't shared any files by link yet." : "Zatím jste nesdíleli pomocí odkazu žádné soubory.", + "Nothing shared with you yet" : "Zatím s vámi nikdo nic nesdílel", + "Files and folders others share with you will show up here" : "Zde budou zobrazeny soubory a adresáře, které s vámi ostatní sdílí", + "Nothing shared yet" : "Zatím není nic sdíleno", + "Files and folders you share will show up here" : "Zde budou zobrazeny vámi sdílené soubory a adresáře", + "No shared links" : "Žádné sdílené odkazy", + "Files and folders you share by link will show up here" : "Zde budou zobrazeny soubory a adresáře, které sdílíte jako webové odkazy", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Chcete přidat vzdálené úložiště {name} uživatele {owner}@{remote}?", "Remote share" : "Vzdálené úložiště", "Remote share password" : "Heslo ke vzdálenému úložišti", "Cancel" : "Zrušit", "Add remote share" : "Přidat vzdálené úložiště", - "No ownCloud installation found at {remote}" : "Nebyla nalezena instalace ownCloud na {remote}", + "No ownCloud installation (7 or higher) found at {remote}" : "Nebyla nalezena instalace ownCloud (7 nebo vyšší) na {remote}", "Invalid ownCloud url" : "Neplatná ownCloud url", "Shared by" : "Sdílí", + "A file or folder was shared from <strong>another server</strong>" : "Soubor nebo složka byla nasdílena z <strong>jiného serveru</strong>", + "A public shared file or folder was <strong>downloaded</strong>" : "Byl <strong>stažen</strong> veřejně sdílený soubor nebo adresář", + "You received a new remote share from %s" : "Obdrželi jste nové vzdálené sdílení z %s", + "%1$s accepted remote share %2$s" : "%1$s přijal(a) vzdálené sdílení %2$s", + "%1$s declined remote share %2$s" : "%1$s odmítl(a) vzdálené sdílení %2$s", + "%1$s unshared %2$s from you" : "%1$s již více nesdílí %2$s", + "Public shared folder %1$s was downloaded" : "Byl stažen veřejně sdílený adresář %1$s ", + "Public shared file %1$s was downloaded" : "Byl stažen veřejně sdílený soubor %1$s ", "This share is password-protected" : "Toto sdílení je chráněno heslem", "The password is wrong. Try again." : "Heslo není správné. Zkuste to znovu.", "Password" : "Heslo", + "No entries found in this folder" : "V tomto adresáři nebylo nic nalezeno", "Name" : "Název", "Share time" : "Čas sdílení", "Sorry, this link doesn’t seem to work anymore." : "Je nám líto, ale tento odkaz již není funkční.", @@ -31,6 +43,9 @@ "Add to your ownCloud" : "Přidat do svého ownCloudu", "Download" : "Stáhnout", "Download %s" : "Stáhnout %s", - "Direct link" : "Přímý odkaz" + "Direct link" : "Přímý odkaz", + "Server-to-Server Sharing" : "Sdílení mezi servery", + "Allow users on this server to send shares to other servers" : "Povolit uživatelům z tohoto serveru zasílat sdílení na jiné servery", + "Allow users on this server to receive shares from other servers" : "Povolit uživatelům z tohoto serveru přijímat sdílení z jiných serverů" },"pluralForm" :"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;" }
\ No newline at end of file diff --git a/apps/files_sharing/l10n/da.js b/apps/files_sharing/l10n/da.js index 961252e26c6..61eb8a6eb5a 100644 --- a/apps/files_sharing/l10n/da.js +++ b/apps/files_sharing/l10n/da.js @@ -8,17 +8,27 @@ OC.L10N.register( "Shared with you" : "Delt med dig", "Shared with others" : "Delt med andre", "Shared by link" : "Delt via link", - "No files have been shared with you yet." : "Endnu er ingen filer delt med dig.", - "You haven't shared any files yet." : "Du har ikke delt nogen filer endnu.", - "You haven't shared any files by link yet." : "Du har ikke delt nogen filer endnu.", + "Nothing shared with you yet" : "Der deles ikke noget med dig endnu", + "Files and folders others share with you will show up here" : "Filer og mapper som andre deler med dig, vil blive vist her", + "Nothing shared yet" : "Der deles endnu ikke noget", + "Files and folders you share will show up here" : "Filer og mapper som du deler, vil blive vist her", + "No shared links" : "Ingen delte link", + "Files and folders you share by link will show up here" : "Filer og mapper som du deler gennem link, vil blive vist her", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Vil du tilføje den eksterne deling {name} fra {owner}@{remote}?", "Remote share" : "Ekstern deling", "Remote share password" : "Adgangskode for ekstern deling", "Cancel" : "Annuller", "Add remote share" : "Tilføj ekstern deling", - "No ownCloud installation found at {remote}" : "Der blev ikke fundet en ownCloud-installation på {remote}", "Invalid ownCloud url" : "Ugyldig ownCloud-URL", "Shared by" : "Delt af", + "A file or folder was shared from <strong>another server</strong>" : "En fil eller mappe blev delt fra <strong>en anden server</strong>", + "A public shared file or folder was <strong>downloaded</strong>" : "En offentligt delt fil eller mappe blev <strong>downloadet</strong>", + "You received a new remote share from %s" : "Du modtog en ny ekstern deling fra %s", + "%1$s accepted remote share %2$s" : "%1$s accepterede den ekstern deling %2$s", + "%1$s declined remote share %2$s" : "%1$s afviste den eksterne deling %2$s", + "%1$s unshared %2$s from you" : "%1$s stoppede med at dele %2$s med dig", + "Public shared folder %1$s was downloaded" : "Den offentligt delte mappe %1$s blev downloadet", + "Public shared file %1$s was downloaded" : "Den offentligt delte fil %1$s blev downloadet", "This share is password-protected" : "Delingen er beskyttet af kodeord", "The password is wrong. Try again." : "Kodeordet er forkert. Prøv igen.", "Password" : "Kodeord", @@ -33,6 +43,9 @@ OC.L10N.register( "Add to your ownCloud" : "Tilføj til din ownCload", "Download" : "Download", "Download %s" : "Download %s", - "Direct link" : "Direkte link" + "Direct link" : "Direkte link", + "Server-to-Server Sharing" : "Deling via server-til-server", + "Allow users on this server to send shares to other servers" : "Tillad brugere på denne server, at sende delinger til andre servere", + "Allow users on this server to receive shares from other servers" : "Tillad brugere på denne server, at modtage delinger fra andre servere" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files_sharing/l10n/da.json b/apps/files_sharing/l10n/da.json index 19291cdd9bf..04f711b45a7 100644 --- a/apps/files_sharing/l10n/da.json +++ b/apps/files_sharing/l10n/da.json @@ -6,17 +6,27 @@ "Shared with you" : "Delt med dig", "Shared with others" : "Delt med andre", "Shared by link" : "Delt via link", - "No files have been shared with you yet." : "Endnu er ingen filer delt med dig.", - "You haven't shared any files yet." : "Du har ikke delt nogen filer endnu.", - "You haven't shared any files by link yet." : "Du har ikke delt nogen filer endnu.", + "Nothing shared with you yet" : "Der deles ikke noget med dig endnu", + "Files and folders others share with you will show up here" : "Filer og mapper som andre deler med dig, vil blive vist her", + "Nothing shared yet" : "Der deles endnu ikke noget", + "Files and folders you share will show up here" : "Filer og mapper som du deler, vil blive vist her", + "No shared links" : "Ingen delte link", + "Files and folders you share by link will show up here" : "Filer og mapper som du deler gennem link, vil blive vist her", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Vil du tilføje den eksterne deling {name} fra {owner}@{remote}?", "Remote share" : "Ekstern deling", "Remote share password" : "Adgangskode for ekstern deling", "Cancel" : "Annuller", "Add remote share" : "Tilføj ekstern deling", - "No ownCloud installation found at {remote}" : "Der blev ikke fundet en ownCloud-installation på {remote}", "Invalid ownCloud url" : "Ugyldig ownCloud-URL", "Shared by" : "Delt af", + "A file or folder was shared from <strong>another server</strong>" : "En fil eller mappe blev delt fra <strong>en anden server</strong>", + "A public shared file or folder was <strong>downloaded</strong>" : "En offentligt delt fil eller mappe blev <strong>downloadet</strong>", + "You received a new remote share from %s" : "Du modtog en ny ekstern deling fra %s", + "%1$s accepted remote share %2$s" : "%1$s accepterede den ekstern deling %2$s", + "%1$s declined remote share %2$s" : "%1$s afviste den eksterne deling %2$s", + "%1$s unshared %2$s from you" : "%1$s stoppede med at dele %2$s med dig", + "Public shared folder %1$s was downloaded" : "Den offentligt delte mappe %1$s blev downloadet", + "Public shared file %1$s was downloaded" : "Den offentligt delte fil %1$s blev downloadet", "This share is password-protected" : "Delingen er beskyttet af kodeord", "The password is wrong. Try again." : "Kodeordet er forkert. Prøv igen.", "Password" : "Kodeord", @@ -31,6 +41,9 @@ "Add to your ownCloud" : "Tilføj til din ownCload", "Download" : "Download", "Download %s" : "Download %s", - "Direct link" : "Direkte link" + "Direct link" : "Direkte link", + "Server-to-Server Sharing" : "Deling via server-til-server", + "Allow users on this server to send shares to other servers" : "Tillad brugere på denne server, at sende delinger til andre servere", + "Allow users on this server to receive shares from other servers" : "Tillad brugere på denne server, at modtage delinger fra andre servere" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files_sharing/l10n/de.js b/apps/files_sharing/l10n/de.js index 69635c8ca4c..88ccb754456 100644 --- a/apps/files_sharing/l10n/de.js +++ b/apps/files_sharing/l10n/de.js @@ -8,20 +8,32 @@ OC.L10N.register( "Shared with you" : "Mit Dir geteilt", "Shared with others" : "Von Dir geteilt", "Shared by link" : "Geteilt über einen Link", - "No files have been shared with you yet." : "Es wurden bis jetzt keine Dateien mit Dir geteilt.", - "You haven't shared any files yet." : "Du hast bis jetzt keine Dateien mit anderen geteilt.", - "You haven't shared any files by link yet." : "Du hast bis jetzt keine Dateien über einen Link mit anderen geteilt.", + "Nothing shared with you yet" : "Bis jetzt wurde nichts mit Dir geteilt", + "Files and folders others share with you will show up here" : "Mit Dir geteilte Dateien und Ordner anderer werden hier erscheinen", + "Nothing shared yet" : "Noch nichts geteilt", + "Files and folders you share will show up here" : "Von Dir geteilte Dateien und Ordner werden hier erscheinen", + "No shared links" : "Keine geteilten Links", + "Files and folders you share by link will show up here" : "Per Link freigegebene Dateien und Ordner werden hier erscheinen", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Möchtest Du die entfernte Freigabe {name} von {owner}@{remote} hinzufügen?", "Remote share" : "Entfernte Freigabe", "Remote share password" : "Passwort für die entfernte Freigabe", "Cancel" : "Abbrechen", "Add remote share" : "Entfernte Freigabe hinzufügen", - "No ownCloud installation found at {remote}" : "Keine OwnCloud-Installation auf {remote} gefunden", + "No ownCloud installation (7 or higher) found at {remote}" : "Keine OwnCloud-Installation (7 oder höher) auf {remote} gefunden", "Invalid ownCloud url" : "Ungültige OwnCloud-URL", "Shared by" : "Geteilt von ", + "A file or folder was shared from <strong>another server</strong>" : "Eine Datei oder ein Ordner wurde von <strong>einem anderen Server</strong> geteilt", + "A public shared file or folder was <strong>downloaded</strong>" : "Eine öffentlich geteilte Datei oder Ordner wurde <strong>heruntergeladen</strong>", + "You received a new remote share from %s" : "Du hast eine neue Remotefreigabe von %s erhalten", + "%1$s accepted remote share %2$s" : "%1$s hat die Remotefreigabe von %2$s akzeptiert", + "%1$s declined remote share %2$s" : "%1$s hat die Remotefreigabe von %2$s abgelehnt", + "%1$s unshared %2$s from you" : "%1$s hat die Freigabe von %2$s für Dich entfernt", + "Public shared folder %1$s was downloaded" : "Der öffentlich geteilte Ordner %1$s wurde heruntergeladen", + "Public shared file %1$s was downloaded" : "Die öffentlich geteilte Datei %1$s wurde heruntergeladen", "This share is password-protected" : "Diese Freigabe ist durch ein Passwort geschützt", "The password is wrong. Try again." : "Bitte überprüfe Dein Passwort und versuche es erneut.", "Password" : "Passwort", + "No entries found in this folder" : "Keine Einträge in diesem Ordner gefunden", "Name" : "Name", "Share time" : "Zeitpunkt der Freigabe", "Sorry, this link doesn’t seem to work anymore." : "Entschuldigung, dieser Link scheint nicht mehr zu funktionieren.", @@ -33,6 +45,9 @@ OC.L10N.register( "Add to your ownCloud" : "Zu Deiner ownCloud hinzufügen", "Download" : "Herunterladen", "Download %s" : "Download %s", - "Direct link" : "Direkter Link" + "Direct link" : "Direkter Link", + "Server-to-Server Sharing" : "Server-zu-Server Datenaustausch", + "Allow users on this server to send shares to other servers" : "Nutzern auf diesem Server das Senden von Freigaben an andere Server erlauben", + "Allow users on this server to receive shares from other servers" : "Nutzern auf diesem Server das Empfangen von Freigaben von anderen Servern erlauben" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files_sharing/l10n/de.json b/apps/files_sharing/l10n/de.json index f444c486956..11557269547 100644 --- a/apps/files_sharing/l10n/de.json +++ b/apps/files_sharing/l10n/de.json @@ -6,20 +6,32 @@ "Shared with you" : "Mit Dir geteilt", "Shared with others" : "Von Dir geteilt", "Shared by link" : "Geteilt über einen Link", - "No files have been shared with you yet." : "Es wurden bis jetzt keine Dateien mit Dir geteilt.", - "You haven't shared any files yet." : "Du hast bis jetzt keine Dateien mit anderen geteilt.", - "You haven't shared any files by link yet." : "Du hast bis jetzt keine Dateien über einen Link mit anderen geteilt.", + "Nothing shared with you yet" : "Bis jetzt wurde nichts mit Dir geteilt", + "Files and folders others share with you will show up here" : "Mit Dir geteilte Dateien und Ordner anderer werden hier erscheinen", + "Nothing shared yet" : "Noch nichts geteilt", + "Files and folders you share will show up here" : "Von Dir geteilte Dateien und Ordner werden hier erscheinen", + "No shared links" : "Keine geteilten Links", + "Files and folders you share by link will show up here" : "Per Link freigegebene Dateien und Ordner werden hier erscheinen", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Möchtest Du die entfernte Freigabe {name} von {owner}@{remote} hinzufügen?", "Remote share" : "Entfernte Freigabe", "Remote share password" : "Passwort für die entfernte Freigabe", "Cancel" : "Abbrechen", "Add remote share" : "Entfernte Freigabe hinzufügen", - "No ownCloud installation found at {remote}" : "Keine OwnCloud-Installation auf {remote} gefunden", + "No ownCloud installation (7 or higher) found at {remote}" : "Keine OwnCloud-Installation (7 oder höher) auf {remote} gefunden", "Invalid ownCloud url" : "Ungültige OwnCloud-URL", "Shared by" : "Geteilt von ", + "A file or folder was shared from <strong>another server</strong>" : "Eine Datei oder ein Ordner wurde von <strong>einem anderen Server</strong> geteilt", + "A public shared file or folder was <strong>downloaded</strong>" : "Eine öffentlich geteilte Datei oder Ordner wurde <strong>heruntergeladen</strong>", + "You received a new remote share from %s" : "Du hast eine neue Remotefreigabe von %s erhalten", + "%1$s accepted remote share %2$s" : "%1$s hat die Remotefreigabe von %2$s akzeptiert", + "%1$s declined remote share %2$s" : "%1$s hat die Remotefreigabe von %2$s abgelehnt", + "%1$s unshared %2$s from you" : "%1$s hat die Freigabe von %2$s für Dich entfernt", + "Public shared folder %1$s was downloaded" : "Der öffentlich geteilte Ordner %1$s wurde heruntergeladen", + "Public shared file %1$s was downloaded" : "Die öffentlich geteilte Datei %1$s wurde heruntergeladen", "This share is password-protected" : "Diese Freigabe ist durch ein Passwort geschützt", "The password is wrong. Try again." : "Bitte überprüfe Dein Passwort und versuche es erneut.", "Password" : "Passwort", + "No entries found in this folder" : "Keine Einträge in diesem Ordner gefunden", "Name" : "Name", "Share time" : "Zeitpunkt der Freigabe", "Sorry, this link doesn’t seem to work anymore." : "Entschuldigung, dieser Link scheint nicht mehr zu funktionieren.", @@ -31,6 +43,9 @@ "Add to your ownCloud" : "Zu Deiner ownCloud hinzufügen", "Download" : "Herunterladen", "Download %s" : "Download %s", - "Direct link" : "Direkter Link" + "Direct link" : "Direkter Link", + "Server-to-Server Sharing" : "Server-zu-Server Datenaustausch", + "Allow users on this server to send shares to other servers" : "Nutzern auf diesem Server das Senden von Freigaben an andere Server erlauben", + "Allow users on this server to receive shares from other servers" : "Nutzern auf diesem Server das Empfangen von Freigaben von anderen Servern erlauben" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files_sharing/l10n/de_DE.js b/apps/files_sharing/l10n/de_DE.js index 23ad9ffb91f..baf7b182c47 100644 --- a/apps/files_sharing/l10n/de_DE.js +++ b/apps/files_sharing/l10n/de_DE.js @@ -8,20 +8,32 @@ OC.L10N.register( "Shared with you" : "Mit Ihnen geteilt", "Shared with others" : "Von Ihnen geteilt", "Shared by link" : "Geteilt über einen Link", - "No files have been shared with you yet." : "Es wurden bis jetzt keine Dateien mit Ihnen geteilt.", - "You haven't shared any files yet." : "Sie haben bis jetzt keine Dateien mit anderen geteilt.", - "You haven't shared any files by link yet." : "Sie haben bis jetzt keine Dateien über einen Link mit anderen geteilt.", + "Nothing shared with you yet" : "Bis jetzt wurde nichts mit Ihnen geteilt", + "Files and folders others share with you will show up here" : "Mit Ihnen geteilte Dateien und Ordner anderer werden hier erscheinen", + "Nothing shared yet" : "Noch nichts geteilt", + "Files and folders you share will show up here" : "Dateien und Ordner, die Sie teilen, werden hier erscheinen", + "No shared links" : "Keine geteilten Links", + "Files and folders you share by link will show up here" : "Dateien und Ordner, die Sie per Link teilen, werden hier erscheinen", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Möchten Sie die entfernte Freigabe {name} von {owner}@{remote} hinzufügen?", "Remote share" : "Entfernte Freigabe", "Remote share password" : "Passwort für die entfernte Freigabe", "Cancel" : "Abbrechen", "Add remote share" : "Entfernte Freigabe hinzufügen", - "No ownCloud installation found at {remote}" : "Keine OwnCloud-Installation auf {remote} gefunden", + "No ownCloud installation (7 or higher) found at {remote}" : "Keine OwnCloud-Installation (7 oder höher) auf {remote} gefunden", "Invalid ownCloud url" : "Ungültige OwnCloud-Adresse", "Shared by" : "Geteilt von", + "A file or folder was shared from <strong>another server</strong>" : "Eine Datei oder Ordner wurde von <strong>einem anderen Server</strong> geteilt", + "A public shared file or folder was <strong>downloaded</strong>" : "Eine öffentlich geteilte Datei oder Ordner wurde <strong>heruntergeladen</strong>", + "You received a new remote share from %s" : "Sie haben eine neue Remotefreigabe von %s erhalten", + "%1$s accepted remote share %2$s" : "%1$s hat die Remotefreigabe von %2$s akzeptiert", + "%1$s declined remote share %2$s" : "%1$s hat die Remotefreigabe von %2$s abgelehnt", + "%1$s unshared %2$s from you" : "%1$s hat die Freigabe von %2$s für Sie entfernt", + "Public shared folder %1$s was downloaded" : "Der öffentlich geteilte Ordner %1$s wurde heruntergeladen", + "Public shared file %1$s was downloaded" : "Die öffentlich geteilte Datei %1$s wurde heruntergeladen", "This share is password-protected" : "Diese Freigabe ist durch ein Passwort geschützt", "The password is wrong. Try again." : "Das Passwort ist falsch. Bitte versuchen Sie es erneut.", "Password" : "Passwort", + "No entries found in this folder" : "Keine Einträge in diesem Ordner gefunden", "Name" : "Name", "Share time" : "Zeitpunkt der Freigabe", "Sorry, this link doesn’t seem to work anymore." : "Entschuldigung, dieser Link scheint nicht mehr zu funktionieren.", @@ -33,6 +45,9 @@ OC.L10N.register( "Add to your ownCloud" : "Zu Ihrer ownCloud hinzufügen", "Download" : "Herunterladen", "Download %s" : "Download %s", - "Direct link" : "Direkte Verlinkung" + "Direct link" : "Direkte Verlinkung", + "Server-to-Server Sharing" : "Server-zu-Server Datenaustausch", + "Allow users on this server to send shares to other servers" : "Nutzern auf diesem Server das Senden von Freigaben an andere Server erlauben", + "Allow users on this server to receive shares from other servers" : "Nutzern auf diesem Server das Empfangen von Freigaben von anderen Servern erlauben" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files_sharing/l10n/de_DE.json b/apps/files_sharing/l10n/de_DE.json index a693524d6c1..78859f87706 100644 --- a/apps/files_sharing/l10n/de_DE.json +++ b/apps/files_sharing/l10n/de_DE.json @@ -6,20 +6,32 @@ "Shared with you" : "Mit Ihnen geteilt", "Shared with others" : "Von Ihnen geteilt", "Shared by link" : "Geteilt über einen Link", - "No files have been shared with you yet." : "Es wurden bis jetzt keine Dateien mit Ihnen geteilt.", - "You haven't shared any files yet." : "Sie haben bis jetzt keine Dateien mit anderen geteilt.", - "You haven't shared any files by link yet." : "Sie haben bis jetzt keine Dateien über einen Link mit anderen geteilt.", + "Nothing shared with you yet" : "Bis jetzt wurde nichts mit Ihnen geteilt", + "Files and folders others share with you will show up here" : "Mit Ihnen geteilte Dateien und Ordner anderer werden hier erscheinen", + "Nothing shared yet" : "Noch nichts geteilt", + "Files and folders you share will show up here" : "Dateien und Ordner, die Sie teilen, werden hier erscheinen", + "No shared links" : "Keine geteilten Links", + "Files and folders you share by link will show up here" : "Dateien und Ordner, die Sie per Link teilen, werden hier erscheinen", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Möchten Sie die entfernte Freigabe {name} von {owner}@{remote} hinzufügen?", "Remote share" : "Entfernte Freigabe", "Remote share password" : "Passwort für die entfernte Freigabe", "Cancel" : "Abbrechen", "Add remote share" : "Entfernte Freigabe hinzufügen", - "No ownCloud installation found at {remote}" : "Keine OwnCloud-Installation auf {remote} gefunden", + "No ownCloud installation (7 or higher) found at {remote}" : "Keine OwnCloud-Installation (7 oder höher) auf {remote} gefunden", "Invalid ownCloud url" : "Ungültige OwnCloud-Adresse", "Shared by" : "Geteilt von", + "A file or folder was shared from <strong>another server</strong>" : "Eine Datei oder Ordner wurde von <strong>einem anderen Server</strong> geteilt", + "A public shared file or folder was <strong>downloaded</strong>" : "Eine öffentlich geteilte Datei oder Ordner wurde <strong>heruntergeladen</strong>", + "You received a new remote share from %s" : "Sie haben eine neue Remotefreigabe von %s erhalten", + "%1$s accepted remote share %2$s" : "%1$s hat die Remotefreigabe von %2$s akzeptiert", + "%1$s declined remote share %2$s" : "%1$s hat die Remotefreigabe von %2$s abgelehnt", + "%1$s unshared %2$s from you" : "%1$s hat die Freigabe von %2$s für Sie entfernt", + "Public shared folder %1$s was downloaded" : "Der öffentlich geteilte Ordner %1$s wurde heruntergeladen", + "Public shared file %1$s was downloaded" : "Die öffentlich geteilte Datei %1$s wurde heruntergeladen", "This share is password-protected" : "Diese Freigabe ist durch ein Passwort geschützt", "The password is wrong. Try again." : "Das Passwort ist falsch. Bitte versuchen Sie es erneut.", "Password" : "Passwort", + "No entries found in this folder" : "Keine Einträge in diesem Ordner gefunden", "Name" : "Name", "Share time" : "Zeitpunkt der Freigabe", "Sorry, this link doesn’t seem to work anymore." : "Entschuldigung, dieser Link scheint nicht mehr zu funktionieren.", @@ -31,6 +43,9 @@ "Add to your ownCloud" : "Zu Ihrer ownCloud hinzufügen", "Download" : "Herunterladen", "Download %s" : "Download %s", - "Direct link" : "Direkte Verlinkung" + "Direct link" : "Direkte Verlinkung", + "Server-to-Server Sharing" : "Server-zu-Server Datenaustausch", + "Allow users on this server to send shares to other servers" : "Nutzern auf diesem Server das Senden von Freigaben an andere Server erlauben", + "Allow users on this server to receive shares from other servers" : "Nutzern auf diesem Server das Empfangen von Freigaben von anderen Servern erlauben" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files_sharing/l10n/el.js b/apps/files_sharing/l10n/el.js index e80d74b376c..a11b1f7a00f 100644 --- a/apps/files_sharing/l10n/el.js +++ b/apps/files_sharing/l10n/el.js @@ -8,15 +8,13 @@ OC.L10N.register( "Shared with you" : "Διαμοιρασμένο με εσάς", "Shared with others" : "Διαμοιρασμένο με άλλους", "Shared by link" : "Διαμοιρασμένο μέσω συνδέσμου", - "No files have been shared with you yet." : "Κανένα αρχείο δεν έχει διαμοιραστεί ακόμα με εσάς.", - "You haven't shared any files yet." : "Δεν έχετε διαμοιραστεί κανένα αρχείο ακόμα.", - "You haven't shared any files by link yet." : "Δεν έχετε διαμοιραστεί κανένα αρχείο μέσω συνδέσμου ακόμα.", + "Nothing shared yet" : "Δεν έχει διαμοιραστεί τίποτα μέχρι στιγμής", + "No shared links" : "Κανένας διαμοιρασμένος σύνδεσμος", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Θέλετε να προσθέσουμε τον απομακρυσμένο κοινόχρηστο φάκελο {name} από {owner}@{remote}?", "Remote share" : "Απομακρυσμένος κοινόχρηστος φάκελος", "Remote share password" : "Κωδικός πρόσβασης απομακρυσμένου κοινόχρηστου φακέλου", "Cancel" : "Άκυρο", "Add remote share" : "Προσθήκη απομακρυσμένου κοινόχρηστου φακέλου", - "No ownCloud installation found at {remote}" : "Δεν βρέθηκε εγκατεστημένο ownCloud στο {remote}", "Invalid ownCloud url" : "Άκυρη url ownCloud ", "Shared by" : "Διαμοιράστηκε από", "This share is password-protected" : "Αυτός ο κοινόχρηστος φάκελος προστατεύεται με κωδικό", @@ -33,6 +31,8 @@ OC.L10N.register( "Add to your ownCloud" : "Προσθήκη στο ownCloud σου", "Download" : "Λήψη", "Download %s" : "Λήψη %s", - "Direct link" : "Άμεσος σύνδεσμος" + "Direct link" : "Άμεσος σύνδεσμος", + "Server-to-Server Sharing" : "Διαμοιρασμός διακομιστής προς διακομιστή", + "Allow users on this server to receive shares from other servers" : "Να επιτρέπεται στους χρίστες του διακομιστή να λαμβάνουν διαμοιρασμένα αρχεία από άλλους διακομιστές" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files_sharing/l10n/el.json b/apps/files_sharing/l10n/el.json index affe333420f..70b6d1d5ce7 100644 --- a/apps/files_sharing/l10n/el.json +++ b/apps/files_sharing/l10n/el.json @@ -6,15 +6,13 @@ "Shared with you" : "Διαμοιρασμένο με εσάς", "Shared with others" : "Διαμοιρασμένο με άλλους", "Shared by link" : "Διαμοιρασμένο μέσω συνδέσμου", - "No files have been shared with you yet." : "Κανένα αρχείο δεν έχει διαμοιραστεί ακόμα με εσάς.", - "You haven't shared any files yet." : "Δεν έχετε διαμοιραστεί κανένα αρχείο ακόμα.", - "You haven't shared any files by link yet." : "Δεν έχετε διαμοιραστεί κανένα αρχείο μέσω συνδέσμου ακόμα.", + "Nothing shared yet" : "Δεν έχει διαμοιραστεί τίποτα μέχρι στιγμής", + "No shared links" : "Κανένας διαμοιρασμένος σύνδεσμος", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Θέλετε να προσθέσουμε τον απομακρυσμένο κοινόχρηστο φάκελο {name} από {owner}@{remote}?", "Remote share" : "Απομακρυσμένος κοινόχρηστος φάκελος", "Remote share password" : "Κωδικός πρόσβασης απομακρυσμένου κοινόχρηστου φακέλου", "Cancel" : "Άκυρο", "Add remote share" : "Προσθήκη απομακρυσμένου κοινόχρηστου φακέλου", - "No ownCloud installation found at {remote}" : "Δεν βρέθηκε εγκατεστημένο ownCloud στο {remote}", "Invalid ownCloud url" : "Άκυρη url ownCloud ", "Shared by" : "Διαμοιράστηκε από", "This share is password-protected" : "Αυτός ο κοινόχρηστος φάκελος προστατεύεται με κωδικό", @@ -31,6 +29,8 @@ "Add to your ownCloud" : "Προσθήκη στο ownCloud σου", "Download" : "Λήψη", "Download %s" : "Λήψη %s", - "Direct link" : "Άμεσος σύνδεσμος" + "Direct link" : "Άμεσος σύνδεσμος", + "Server-to-Server Sharing" : "Διαμοιρασμός διακομιστής προς διακομιστή", + "Allow users on this server to receive shares from other servers" : "Να επιτρέπεται στους χρίστες του διακομιστή να λαμβάνουν διαμοιρασμένα αρχεία από άλλους διακομιστές" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files_sharing/l10n/en_GB.js b/apps/files_sharing/l10n/en_GB.js index 0a86e564210..78bf0940a54 100644 --- a/apps/files_sharing/l10n/en_GB.js +++ b/apps/files_sharing/l10n/en_GB.js @@ -8,20 +8,32 @@ OC.L10N.register( "Shared with you" : "Shared with you", "Shared with others" : "Shared with others", "Shared by link" : "Shared by link", - "No files have been shared with you yet." : "No files have been shared with you yet.", - "You haven't shared any files yet." : "You haven't shared any files yet.", - "You haven't shared any files by link yet." : "You haven't shared any files by link yet.", + "Nothing shared with you yet" : "Nothing shared with you yet", + "Files and folders others share with you will show up here" : "Files and folders others share with you will show up here", + "Nothing shared yet" : "Nothing shared yet", + "Files and folders you share will show up here" : "Files and folders you share will show up here", + "No shared links" : "No shared links", + "Files and folders you share by link will show up here" : "Files and folders you share by link will show up here", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Do you want to add the remote share {name} from {owner}@{remote}?", "Remote share" : "Remote share", "Remote share password" : "Remote share password", "Cancel" : "Cancel", "Add remote share" : "Add remote share", - "No ownCloud installation found at {remote}" : "No ownCloud installation found at {remote}", + "No ownCloud installation (7 or higher) found at {remote}" : "No ownCloud installation (7 or higher) found at {remote}", "Invalid ownCloud url" : "Invalid ownCloud URL", "Shared by" : "Shared by", + "A file or folder was shared from <strong>another server</strong>" : "A file or folder was shared from <strong>another server</strong>", + "A public shared file or folder was <strong>downloaded</strong>" : "A public shared file or folder was <strong>downloaded</strong>", + "You received a new remote share from %s" : "You received a new remote share from %s", + "%1$s accepted remote share %2$s" : "%1$s accepted remote share %2$s", + "%1$s declined remote share %2$s" : "%1$s declined remote share %2$s", + "%1$s unshared %2$s from you" : "%1$s unshared %2$s from you", + "Public shared folder %1$s was downloaded" : "Public shared folder %1$s was downloaded", + "Public shared file %1$s was downloaded" : "Public shared file %1$s was downloaded", "This share is password-protected" : "This share is password-protected", "The password is wrong. Try again." : "The password is wrong. Try again.", "Password" : "Password", + "No entries found in this folder" : "No entries found in this folder", "Name" : "Name", "Share time" : "Share time", "Sorry, this link doesn’t seem to work anymore." : "Sorry, this link doesn’t seem to work anymore.", @@ -33,6 +45,9 @@ OC.L10N.register( "Add to your ownCloud" : "Add to your ownCloud", "Download" : "Download", "Download %s" : "Download %s", - "Direct link" : "Direct link" + "Direct link" : "Direct link", + "Server-to-Server Sharing" : "Server-to-Server Sharing", + "Allow users on this server to send shares to other servers" : "Allow users on this server to send shares to other servers", + "Allow users on this server to receive shares from other servers" : "Allow users on this server to receive shares from other servers" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files_sharing/l10n/en_GB.json b/apps/files_sharing/l10n/en_GB.json index c5445a407af..25a52e1e13b 100644 --- a/apps/files_sharing/l10n/en_GB.json +++ b/apps/files_sharing/l10n/en_GB.json @@ -6,20 +6,32 @@ "Shared with you" : "Shared with you", "Shared with others" : "Shared with others", "Shared by link" : "Shared by link", - "No files have been shared with you yet." : "No files have been shared with you yet.", - "You haven't shared any files yet." : "You haven't shared any files yet.", - "You haven't shared any files by link yet." : "You haven't shared any files by link yet.", + "Nothing shared with you yet" : "Nothing shared with you yet", + "Files and folders others share with you will show up here" : "Files and folders others share with you will show up here", + "Nothing shared yet" : "Nothing shared yet", + "Files and folders you share will show up here" : "Files and folders you share will show up here", + "No shared links" : "No shared links", + "Files and folders you share by link will show up here" : "Files and folders you share by link will show up here", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Do you want to add the remote share {name} from {owner}@{remote}?", "Remote share" : "Remote share", "Remote share password" : "Remote share password", "Cancel" : "Cancel", "Add remote share" : "Add remote share", - "No ownCloud installation found at {remote}" : "No ownCloud installation found at {remote}", + "No ownCloud installation (7 or higher) found at {remote}" : "No ownCloud installation (7 or higher) found at {remote}", "Invalid ownCloud url" : "Invalid ownCloud URL", "Shared by" : "Shared by", + "A file or folder was shared from <strong>another server</strong>" : "A file or folder was shared from <strong>another server</strong>", + "A public shared file or folder was <strong>downloaded</strong>" : "A public shared file or folder was <strong>downloaded</strong>", + "You received a new remote share from %s" : "You received a new remote share from %s", + "%1$s accepted remote share %2$s" : "%1$s accepted remote share %2$s", + "%1$s declined remote share %2$s" : "%1$s declined remote share %2$s", + "%1$s unshared %2$s from you" : "%1$s unshared %2$s from you", + "Public shared folder %1$s was downloaded" : "Public shared folder %1$s was downloaded", + "Public shared file %1$s was downloaded" : "Public shared file %1$s was downloaded", "This share is password-protected" : "This share is password-protected", "The password is wrong. Try again." : "The password is wrong. Try again.", "Password" : "Password", + "No entries found in this folder" : "No entries found in this folder", "Name" : "Name", "Share time" : "Share time", "Sorry, this link doesn’t seem to work anymore." : "Sorry, this link doesn’t seem to work anymore.", @@ -31,6 +43,9 @@ "Add to your ownCloud" : "Add to your ownCloud", "Download" : "Download", "Download %s" : "Download %s", - "Direct link" : "Direct link" + "Direct link" : "Direct link", + "Server-to-Server Sharing" : "Server-to-Server Sharing", + "Allow users on this server to send shares to other servers" : "Allow users on this server to send shares to other servers", + "Allow users on this server to receive shares from other servers" : "Allow users on this server to receive shares from other servers" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files_sharing/l10n/eo.js b/apps/files_sharing/l10n/eo.js index 28e1c3acdbb..1053816107c 100644 --- a/apps/files_sharing/l10n/eo.js +++ b/apps/files_sharing/l10n/eo.js @@ -5,11 +5,7 @@ OC.L10N.register( "Shared with you" : "Kunhavata kun vi", "Shared with others" : "Kunhavata kun aliaj", "Shared by link" : "Kunhavata per ligilo", - "No files have been shared with you yet." : "Neniu dosiero kunhaviĝis kun vi ankoraŭ.", - "You haven't shared any files yet." : "Vi kunhavigis neniun dosieron ankoraŭ.", - "You haven't shared any files by link yet." : "Vi kunhavigis neniun dosieron per ligilo ankoraŭ.", "Cancel" : "Nuligi", - "No ownCloud installation found at {remote}" : "Ne troviĝis instalo de ownCloud ĉe {remote}", "Invalid ownCloud url" : "Nevalidas URL de ownCloud", "Shared by" : "Kunhavigita de", "This share is password-protected" : "Ĉi tiu kunhavigo estas protektata per pasvorto", diff --git a/apps/files_sharing/l10n/eo.json b/apps/files_sharing/l10n/eo.json index 00d0d7de2aa..bfe17bdb896 100644 --- a/apps/files_sharing/l10n/eo.json +++ b/apps/files_sharing/l10n/eo.json @@ -3,11 +3,7 @@ "Shared with you" : "Kunhavata kun vi", "Shared with others" : "Kunhavata kun aliaj", "Shared by link" : "Kunhavata per ligilo", - "No files have been shared with you yet." : "Neniu dosiero kunhaviĝis kun vi ankoraŭ.", - "You haven't shared any files yet." : "Vi kunhavigis neniun dosieron ankoraŭ.", - "You haven't shared any files by link yet." : "Vi kunhavigis neniun dosieron per ligilo ankoraŭ.", "Cancel" : "Nuligi", - "No ownCloud installation found at {remote}" : "Ne troviĝis instalo de ownCloud ĉe {remote}", "Invalid ownCloud url" : "Nevalidas URL de ownCloud", "Shared by" : "Kunhavigita de", "This share is password-protected" : "Ĉi tiu kunhavigo estas protektata per pasvorto", diff --git a/apps/files_sharing/l10n/es.js b/apps/files_sharing/l10n/es.js index 79e3b6c9811..694a4198a4b 100644 --- a/apps/files_sharing/l10n/es.js +++ b/apps/files_sharing/l10n/es.js @@ -8,20 +8,32 @@ OC.L10N.register( "Shared with you" : "Compartido contigo", "Shared with others" : "Compartido con otros", "Shared by link" : "Compartido por medio de enlaces", - "No files have been shared with you yet." : "Aún no han compartido contigo ningún archivo.", - "You haven't shared any files yet." : "Aún no has compartido ningún archivo.", - "You haven't shared any files by link yet." : "Usted todavía no ha compartido ningún archivo por medio de enlaces.", + "Nothing shared with you yet" : "Todavía no han compartido nada contigo", + "Files and folders others share with you will show up here" : "Aquí aparecerán archivos y carpetas que otros compartan contigo", + "Nothing shared yet" : "Aún no hay nada compartido", + "Files and folders you share will show up here" : "Aquí aparecerán archivos y carpetas que usted comparta con otros", + "No shared links" : "No hay enlaces compartidos", + "Files and folders you share by link will show up here" : "Aquí aparecerán archivos y carpetas que usted comparta mediante un enlace", "Do you want to add the remote share {name} from {owner}@{remote}?" : "¿Desea añadir el recurso compartido remoto {name} de {owner}@{remote}?", "Remote share" : "Recurso compartido remoto", "Remote share password" : "Contraseña del compartido remoto", "Cancel" : "Cancelar", "Add remote share" : "Añadir recurso compartido remoto", - "No ownCloud installation found at {remote}" : "No se encontró una instalación de ownCloud en {remote}", + "No ownCloud installation (7 or higher) found at {remote}" : "No se encontró una instalación de ownCloud (7 o mayor) en {remote}", "Invalid ownCloud url" : "URL de ownCloud inválido", "Shared by" : "Compartido por", + "A file or folder was shared from <strong>another server</strong>" : "Se ha compartido un archivo o carpeta desde <strong>otro servidor</strong>", + "A public shared file or folder was <strong>downloaded</strong>" : "Ha sido <strong>descargado</strong> un archivo (o carpeta) compartido públicamente", + "You received a new remote share from %s" : "Ha recibido un nuevo recurso compartido remoto de %s", + "%1$s accepted remote share %2$s" : "%1$s aceptó el recurso compartido remoto %2$s", + "%1$s declined remote share %2$s" : "%1$s ha rechazado el recurso compartido remoto %2$s", + "%1$s unshared %2$s from you" : "%1$s dejó de ser compartido %2$s por tí", + "Public shared folder %1$s was downloaded" : "Se descargó la carpeta pública compartida %1$s", + "Public shared file %1$s was downloaded" : "Se descargó el archivo público compartido %1$s", "This share is password-protected" : "Este elemento compartido esta protegido por contraseña", "The password is wrong. Try again." : "La contraseña introducida es errónea. Inténtelo de nuevo.", "Password" : "Contraseña", + "No entries found in this folder" : "No hay entradas en esta carpeta", "Name" : "Nombre", "Share time" : "Compartido hace", "Sorry, this link doesn’t seem to work anymore." : "Vaya, este enlace parece que no volverá a funcionar.", @@ -33,6 +45,9 @@ OC.L10N.register( "Add to your ownCloud" : "Agregue su propio ownCloud", "Download" : "Descargar", "Download %s" : "Descargar %s", - "Direct link" : "Enlace directo" + "Direct link" : "Enlace directo", + "Server-to-Server Sharing" : "Compartir Servidor-a-Servidor", + "Allow users on this server to send shares to other servers" : "Permitir a usuarios de este servidor compartir con usuarios de otros servidores", + "Allow users on this server to receive shares from other servers" : "Permitir a usuarios de este servidor recibir archivos de usuarios de otros servidores" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files_sharing/l10n/es.json b/apps/files_sharing/l10n/es.json index fd552789d63..ae5c7a87cb2 100644 --- a/apps/files_sharing/l10n/es.json +++ b/apps/files_sharing/l10n/es.json @@ -6,20 +6,32 @@ "Shared with you" : "Compartido contigo", "Shared with others" : "Compartido con otros", "Shared by link" : "Compartido por medio de enlaces", - "No files have been shared with you yet." : "Aún no han compartido contigo ningún archivo.", - "You haven't shared any files yet." : "Aún no has compartido ningún archivo.", - "You haven't shared any files by link yet." : "Usted todavía no ha compartido ningún archivo por medio de enlaces.", + "Nothing shared with you yet" : "Todavía no han compartido nada contigo", + "Files and folders others share with you will show up here" : "Aquí aparecerán archivos y carpetas que otros compartan contigo", + "Nothing shared yet" : "Aún no hay nada compartido", + "Files and folders you share will show up here" : "Aquí aparecerán archivos y carpetas que usted comparta con otros", + "No shared links" : "No hay enlaces compartidos", + "Files and folders you share by link will show up here" : "Aquí aparecerán archivos y carpetas que usted comparta mediante un enlace", "Do you want to add the remote share {name} from {owner}@{remote}?" : "¿Desea añadir el recurso compartido remoto {name} de {owner}@{remote}?", "Remote share" : "Recurso compartido remoto", "Remote share password" : "Contraseña del compartido remoto", "Cancel" : "Cancelar", "Add remote share" : "Añadir recurso compartido remoto", - "No ownCloud installation found at {remote}" : "No se encontró una instalación de ownCloud en {remote}", + "No ownCloud installation (7 or higher) found at {remote}" : "No se encontró una instalación de ownCloud (7 o mayor) en {remote}", "Invalid ownCloud url" : "URL de ownCloud inválido", "Shared by" : "Compartido por", + "A file or folder was shared from <strong>another server</strong>" : "Se ha compartido un archivo o carpeta desde <strong>otro servidor</strong>", + "A public shared file or folder was <strong>downloaded</strong>" : "Ha sido <strong>descargado</strong> un archivo (o carpeta) compartido públicamente", + "You received a new remote share from %s" : "Ha recibido un nuevo recurso compartido remoto de %s", + "%1$s accepted remote share %2$s" : "%1$s aceptó el recurso compartido remoto %2$s", + "%1$s declined remote share %2$s" : "%1$s ha rechazado el recurso compartido remoto %2$s", + "%1$s unshared %2$s from you" : "%1$s dejó de ser compartido %2$s por tí", + "Public shared folder %1$s was downloaded" : "Se descargó la carpeta pública compartida %1$s", + "Public shared file %1$s was downloaded" : "Se descargó el archivo público compartido %1$s", "This share is password-protected" : "Este elemento compartido esta protegido por contraseña", "The password is wrong. Try again." : "La contraseña introducida es errónea. Inténtelo de nuevo.", "Password" : "Contraseña", + "No entries found in this folder" : "No hay entradas en esta carpeta", "Name" : "Nombre", "Share time" : "Compartido hace", "Sorry, this link doesn’t seem to work anymore." : "Vaya, este enlace parece que no volverá a funcionar.", @@ -31,6 +43,9 @@ "Add to your ownCloud" : "Agregue su propio ownCloud", "Download" : "Descargar", "Download %s" : "Descargar %s", - "Direct link" : "Enlace directo" + "Direct link" : "Enlace directo", + "Server-to-Server Sharing" : "Compartir Servidor-a-Servidor", + "Allow users on this server to send shares to other servers" : "Permitir a usuarios de este servidor compartir con usuarios de otros servidores", + "Allow users on this server to receive shares from other servers" : "Permitir a usuarios de este servidor recibir archivos de usuarios de otros servidores" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files_sharing/l10n/et_EE.js b/apps/files_sharing/l10n/et_EE.js index 93ac6d01000..7200a5ca3c1 100644 --- a/apps/files_sharing/l10n/et_EE.js +++ b/apps/files_sharing/l10n/et_EE.js @@ -8,15 +8,11 @@ OC.L10N.register( "Shared with you" : "Sinuga jagatud", "Shared with others" : "Teistega jagatud", "Shared by link" : "Jagatud lingiga", - "No files have been shared with you yet." : "Sinuga pole veel ühtegi faili jagatud.", - "You haven't shared any files yet." : "Sa pole jaganud veel ühtegi faili.", - "You haven't shared any files by link yet." : "Sa pole lingiga jaganud veel ühtegi faili.", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Soovid lisata kaugjagamise {name} asukohast {owner}@{remote}?", "Remote share" : "Kaugjagamine", "Remote share password" : "Kaugjagamise parool", "Cancel" : "Loobu", "Add remote share" : "Lisa kaugjagamine", - "No ownCloud installation found at {remote}" : "Ei leitud ownCloud paigaldust asukohas {remote}", "Invalid ownCloud url" : "Vigane ownCloud url", "Shared by" : "Jagas", "This share is password-protected" : "See jagamine on parooliga kaitstud", @@ -33,6 +29,9 @@ OC.L10N.register( "Add to your ownCloud" : "Lisa oma ownCloudi", "Download" : "Lae alla", "Download %s" : "Laadi alla %s", - "Direct link" : "Otsene link" + "Direct link" : "Otsene link", + "Server-to-Server Sharing" : "Serverist-serverisse jagamine", + "Allow users on this server to send shares to other servers" : "Luba selle serveri kasutajatel saata faile teistesse serveritesse", + "Allow users on this server to receive shares from other servers" : "Luba selle serveri kasutajatel võtta vastu jagamisi teistest serveritest" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files_sharing/l10n/et_EE.json b/apps/files_sharing/l10n/et_EE.json index d5bf52aa59d..e35ea6427a7 100644 --- a/apps/files_sharing/l10n/et_EE.json +++ b/apps/files_sharing/l10n/et_EE.json @@ -6,15 +6,11 @@ "Shared with you" : "Sinuga jagatud", "Shared with others" : "Teistega jagatud", "Shared by link" : "Jagatud lingiga", - "No files have been shared with you yet." : "Sinuga pole veel ühtegi faili jagatud.", - "You haven't shared any files yet." : "Sa pole jaganud veel ühtegi faili.", - "You haven't shared any files by link yet." : "Sa pole lingiga jaganud veel ühtegi faili.", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Soovid lisata kaugjagamise {name} asukohast {owner}@{remote}?", "Remote share" : "Kaugjagamine", "Remote share password" : "Kaugjagamise parool", "Cancel" : "Loobu", "Add remote share" : "Lisa kaugjagamine", - "No ownCloud installation found at {remote}" : "Ei leitud ownCloud paigaldust asukohas {remote}", "Invalid ownCloud url" : "Vigane ownCloud url", "Shared by" : "Jagas", "This share is password-protected" : "See jagamine on parooliga kaitstud", @@ -31,6 +27,9 @@ "Add to your ownCloud" : "Lisa oma ownCloudi", "Download" : "Lae alla", "Download %s" : "Laadi alla %s", - "Direct link" : "Otsene link" + "Direct link" : "Otsene link", + "Server-to-Server Sharing" : "Serverist-serverisse jagamine", + "Allow users on this server to send shares to other servers" : "Luba selle serveri kasutajatel saata faile teistesse serveritesse", + "Allow users on this server to receive shares from other servers" : "Luba selle serveri kasutajatel võtta vastu jagamisi teistest serveritest" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files_sharing/l10n/eu.js b/apps/files_sharing/l10n/eu.js index 9e492649eee..ff254aa50c4 100644 --- a/apps/files_sharing/l10n/eu.js +++ b/apps/files_sharing/l10n/eu.js @@ -8,15 +8,11 @@ OC.L10N.register( "Shared with you" : "Zurekin elkarbanatuta", "Shared with others" : "Beste batzuekin elkarbanatuta", "Shared by link" : "Lotura bidez elkarbanatuta", - "No files have been shared with you yet." : "Ez da zurekin fitxategirik elkarbanatu oraindik.", - "You haven't shared any files yet." : "Ez duzu oraindik fitxategirik elkarbanatu.", - "You haven't shared any files by link yet." : "Ez duzu oraindik fitxategirik lotura bidez elkarbanatu.", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Nahi duzu gehitzea {name} urrutiko partekatzea honengandik {owner}@{remote}?", "Remote share" : "Urrutiko parte hartzea", "Remote share password" : "Urrutiko parte hartzeen pasahitza", "Cancel" : "Ezeztatu", "Add remote share" : "Gehitu urrutiko parte hartzea", - "No ownCloud installation found at {remote}" : "Ez da ownClouden instalaziorik aurkitu {remote}n", "Invalid ownCloud url" : "ownCloud url baliogabea", "Shared by" : "Honek elkarbanatuta", "This share is password-protected" : "Elkarbanatutako hau pasahitzarekin babestuta dago", diff --git a/apps/files_sharing/l10n/eu.json b/apps/files_sharing/l10n/eu.json index 0d04b0c2f9a..62955cafaf3 100644 --- a/apps/files_sharing/l10n/eu.json +++ b/apps/files_sharing/l10n/eu.json @@ -6,15 +6,11 @@ "Shared with you" : "Zurekin elkarbanatuta", "Shared with others" : "Beste batzuekin elkarbanatuta", "Shared by link" : "Lotura bidez elkarbanatuta", - "No files have been shared with you yet." : "Ez da zurekin fitxategirik elkarbanatu oraindik.", - "You haven't shared any files yet." : "Ez duzu oraindik fitxategirik elkarbanatu.", - "You haven't shared any files by link yet." : "Ez duzu oraindik fitxategirik lotura bidez elkarbanatu.", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Nahi duzu gehitzea {name} urrutiko partekatzea honengandik {owner}@{remote}?", "Remote share" : "Urrutiko parte hartzea", "Remote share password" : "Urrutiko parte hartzeen pasahitza", "Cancel" : "Ezeztatu", "Add remote share" : "Gehitu urrutiko parte hartzea", - "No ownCloud installation found at {remote}" : "Ez da ownClouden instalaziorik aurkitu {remote}n", "Invalid ownCloud url" : "ownCloud url baliogabea", "Shared by" : "Honek elkarbanatuta", "This share is password-protected" : "Elkarbanatutako hau pasahitzarekin babestuta dago", diff --git a/apps/files_sharing/l10n/fa.js b/apps/files_sharing/l10n/fa.js index 3c78846ed44..86dc4d5468d 100644 --- a/apps/files_sharing/l10n/fa.js +++ b/apps/files_sharing/l10n/fa.js @@ -7,15 +7,11 @@ OC.L10N.register( "Shared with you" : "موارد به اشتراک گذاشته شده با شما", "Shared with others" : "موارد به اشتراک گذاشته شده با دیگران", "Shared by link" : "اشتراک گذاشته شده از طریق پیوند", - "No files have been shared with you yet." : "هنوز هیچ فایلی با شما به اشتراک گذاشته نشده است.", - "You haven't shared any files yet." : "شما هنوز هیچ فایلی را به اشتراک نگذاشته اید.", - "You haven't shared any files by link yet." : "شما هنوز هیچ فایلی را از طریق پیوند با کسی به اشتراک نگذاشته اید.", "Do you want to add the remote share {name} from {owner}@{remote}?" : "آیا مایل به افزودن اشتراک از راه دور {name} از {owner}@{remote} هستید.", "Remote share" : "اشتراک از راه دور", "Remote share password" : "رمز عبور اشتراک از راه دور", "Cancel" : "منصرف شدن", "Add remote share" : "افزودن اشتراک از راه دور", - "No ownCloud installation found at {remote}" : "نمونه ای از ownCloud نصب شده در {remote} یافت نشد", "Invalid ownCloud url" : "آدرس نمونه ownCloud غیر معتبر است", "Shared by" : "اشتراک گذاشته شده به وسیله", "This share is password-protected" : "این اشتراک توسط رمز عبور محافظت می شود", diff --git a/apps/files_sharing/l10n/fa.json b/apps/files_sharing/l10n/fa.json index 8e5fd724927..921c9a4bb28 100644 --- a/apps/files_sharing/l10n/fa.json +++ b/apps/files_sharing/l10n/fa.json @@ -5,15 +5,11 @@ "Shared with you" : "موارد به اشتراک گذاشته شده با شما", "Shared with others" : "موارد به اشتراک گذاشته شده با دیگران", "Shared by link" : "اشتراک گذاشته شده از طریق پیوند", - "No files have been shared with you yet." : "هنوز هیچ فایلی با شما به اشتراک گذاشته نشده است.", - "You haven't shared any files yet." : "شما هنوز هیچ فایلی را به اشتراک نگذاشته اید.", - "You haven't shared any files by link yet." : "شما هنوز هیچ فایلی را از طریق پیوند با کسی به اشتراک نگذاشته اید.", "Do you want to add the remote share {name} from {owner}@{remote}?" : "آیا مایل به افزودن اشتراک از راه دور {name} از {owner}@{remote} هستید.", "Remote share" : "اشتراک از راه دور", "Remote share password" : "رمز عبور اشتراک از راه دور", "Cancel" : "منصرف شدن", "Add remote share" : "افزودن اشتراک از راه دور", - "No ownCloud installation found at {remote}" : "نمونه ای از ownCloud نصب شده در {remote} یافت نشد", "Invalid ownCloud url" : "آدرس نمونه ownCloud غیر معتبر است", "Shared by" : "اشتراک گذاشته شده به وسیله", "This share is password-protected" : "این اشتراک توسط رمز عبور محافظت می شود", diff --git a/apps/files_sharing/l10n/fi.js b/apps/files_sharing/l10n/fi.js new file mode 100644 index 00000000000..1f1bf5377b3 --- /dev/null +++ b/apps/files_sharing/l10n/fi.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "files_sharing", + { + "Cancel" : "Peruuta", + "Password" : "Salasana" +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/files_sharing/l10n/fi.json b/apps/files_sharing/l10n/fi.json new file mode 100644 index 00000000000..a80ddde0fed --- /dev/null +++ b/apps/files_sharing/l10n/fi.json @@ -0,0 +1,5 @@ +{ "translations": { + "Cancel" : "Peruuta", + "Password" : "Salasana" +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/files_sharing/l10n/fi_FI.js b/apps/files_sharing/l10n/fi_FI.js index c4713c2be3f..398a81dba7c 100644 --- a/apps/files_sharing/l10n/fi_FI.js +++ b/apps/files_sharing/l10n/fi_FI.js @@ -8,20 +8,32 @@ OC.L10N.register( "Shared with you" : "Jaettu kanssasi", "Shared with others" : "Jaettu muiden kanssa", "Shared by link" : "Jaettu linkin kautta", - "No files have been shared with you yet." : "Kukaan ei ole jakanut tiedostoja kanssasi vielä.", - "You haven't shared any files yet." : "Et ole jakanut yhtäkään tiedostoa vielä.", - "You haven't shared any files by link yet." : "Et ole vielä jakanut yhtäkään tiedostoa linkin kautta.", + "Nothing shared with you yet" : "Kanssasi ei ole vielä jaettu mitään", + "Files and folders others share with you will show up here" : "Kanssasi jaetut tiedostot ja kansiot näkyvät täällä", + "Nothing shared yet" : "Ei mitään jaettua", + "Files and folders you share will show up here" : "Jakamasi tiedostot ja kansiot näkyvät täällä", + "No shared links" : "Ei jaettuja linkkejä", + "Files and folders you share by link will show up here" : "Linkin kautta jakamasi tiedostot ja kansiot näkyvät täällä", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Haluatko lisätä etäjaon {name} kohteesta {owner}@{remote}?", "Remote share" : "Etäjako", "Remote share password" : "Etäjaon salasana", "Cancel" : "Peru", "Add remote share" : "Lisää etäjako", - "No ownCloud installation found at {remote}" : "ownCloud-asennusta ei löytynyt kohteesta {remote}", + "No ownCloud installation (7 or higher) found at {remote}" : "ownCloud-asennusta (versiota 7 tai uudempaa) ei löytynyt osoitteesta {remote}", "Invalid ownCloud url" : "Virheellinen ownCloud-osoite", "Shared by" : "Jakanut", + "A file or folder was shared from <strong>another server</strong>" : "Tiedosto tai kansio jaettiin <strong>toiselta palvelimelta</strong>", + "A public shared file or folder was <strong>downloaded</strong>" : "Julkisesti jaettu tiedosto tai kansio <strong>ladattiin</strong>", + "You received a new remote share from %s" : "Vastaanotit uuden etäjaon käyttäjältä %s", + "%1$s accepted remote share %2$s" : "%1$s hyväksyi etäjaon %2$s", + "%1$s declined remote share %2$s" : "%1$s kieltäytyi etäjaosta %2$s", + "%1$s unshared %2$s from you" : "%1$s lopetti kohteen %2$s jakamisen kanssasi", + "Public shared folder %1$s was downloaded" : "Julkisesti jaettu kansio %1$s ladattiin", + "Public shared file %1$s was downloaded" : "Julkisesti jaettu tiedosto %1$s ladattiin", "This share is password-protected" : "Tämä jako on suojattu salasanalla", "The password is wrong. Try again." : "Väärä salasana. Yritä uudelleen.", "Password" : "Salasana", + "No entries found in this folder" : "Ei kohteita tässä kansiossa", "Name" : "Nimi", "Share time" : "Jakamisen ajankohta", "Sorry, this link doesn’t seem to work anymore." : "Valitettavasti linkki ei vaikuta enää toimivan.", @@ -33,6 +45,9 @@ OC.L10N.register( "Add to your ownCloud" : "Lisää ownCloudiisi", "Download" : "Lataa", "Download %s" : "Lataa %s", - "Direct link" : "Suora linkki" + "Direct link" : "Suora linkki", + "Server-to-Server Sharing" : "Palvelimelta palvelimelle -jakaminen", + "Allow users on this server to send shares to other servers" : "Salli tämän palvelimen käyttäjien lähettää jakoja muille palvelimille", + "Allow users on this server to receive shares from other servers" : "Salli tämän palvelimen käyttäjien vastaanottaa jakoja muilta palvelimilta" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files_sharing/l10n/fi_FI.json b/apps/files_sharing/l10n/fi_FI.json index ec29c214b45..73d6cd4c9c4 100644 --- a/apps/files_sharing/l10n/fi_FI.json +++ b/apps/files_sharing/l10n/fi_FI.json @@ -6,20 +6,32 @@ "Shared with you" : "Jaettu kanssasi", "Shared with others" : "Jaettu muiden kanssa", "Shared by link" : "Jaettu linkin kautta", - "No files have been shared with you yet." : "Kukaan ei ole jakanut tiedostoja kanssasi vielä.", - "You haven't shared any files yet." : "Et ole jakanut yhtäkään tiedostoa vielä.", - "You haven't shared any files by link yet." : "Et ole vielä jakanut yhtäkään tiedostoa linkin kautta.", + "Nothing shared with you yet" : "Kanssasi ei ole vielä jaettu mitään", + "Files and folders others share with you will show up here" : "Kanssasi jaetut tiedostot ja kansiot näkyvät täällä", + "Nothing shared yet" : "Ei mitään jaettua", + "Files and folders you share will show up here" : "Jakamasi tiedostot ja kansiot näkyvät täällä", + "No shared links" : "Ei jaettuja linkkejä", + "Files and folders you share by link will show up here" : "Linkin kautta jakamasi tiedostot ja kansiot näkyvät täällä", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Haluatko lisätä etäjaon {name} kohteesta {owner}@{remote}?", "Remote share" : "Etäjako", "Remote share password" : "Etäjaon salasana", "Cancel" : "Peru", "Add remote share" : "Lisää etäjako", - "No ownCloud installation found at {remote}" : "ownCloud-asennusta ei löytynyt kohteesta {remote}", + "No ownCloud installation (7 or higher) found at {remote}" : "ownCloud-asennusta (versiota 7 tai uudempaa) ei löytynyt osoitteesta {remote}", "Invalid ownCloud url" : "Virheellinen ownCloud-osoite", "Shared by" : "Jakanut", + "A file or folder was shared from <strong>another server</strong>" : "Tiedosto tai kansio jaettiin <strong>toiselta palvelimelta</strong>", + "A public shared file or folder was <strong>downloaded</strong>" : "Julkisesti jaettu tiedosto tai kansio <strong>ladattiin</strong>", + "You received a new remote share from %s" : "Vastaanotit uuden etäjaon käyttäjältä %s", + "%1$s accepted remote share %2$s" : "%1$s hyväksyi etäjaon %2$s", + "%1$s declined remote share %2$s" : "%1$s kieltäytyi etäjaosta %2$s", + "%1$s unshared %2$s from you" : "%1$s lopetti kohteen %2$s jakamisen kanssasi", + "Public shared folder %1$s was downloaded" : "Julkisesti jaettu kansio %1$s ladattiin", + "Public shared file %1$s was downloaded" : "Julkisesti jaettu tiedosto %1$s ladattiin", "This share is password-protected" : "Tämä jako on suojattu salasanalla", "The password is wrong. Try again." : "Väärä salasana. Yritä uudelleen.", "Password" : "Salasana", + "No entries found in this folder" : "Ei kohteita tässä kansiossa", "Name" : "Nimi", "Share time" : "Jakamisen ajankohta", "Sorry, this link doesn’t seem to work anymore." : "Valitettavasti linkki ei vaikuta enää toimivan.", @@ -31,6 +43,9 @@ "Add to your ownCloud" : "Lisää ownCloudiisi", "Download" : "Lataa", "Download %s" : "Lataa %s", - "Direct link" : "Suora linkki" + "Direct link" : "Suora linkki", + "Server-to-Server Sharing" : "Palvelimelta palvelimelle -jakaminen", + "Allow users on this server to send shares to other servers" : "Salli tämän palvelimen käyttäjien lähettää jakoja muille palvelimille", + "Allow users on this server to receive shares from other servers" : "Salli tämän palvelimen käyttäjien vastaanottaa jakoja muilta palvelimilta" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files_sharing/l10n/fr.js b/apps/files_sharing/l10n/fr.js index 1db7a59f3d5..f82c5d154c2 100644 --- a/apps/files_sharing/l10n/fr.js +++ b/apps/files_sharing/l10n/fr.js @@ -3,22 +3,32 @@ OC.L10N.register( { "Server to server sharing is not enabled on this server" : "Le partage de serveur à serveur n'est pas activé sur ce serveur", "The mountpoint name contains invalid characters." : "Le nom du point de montage contient des caractères invalides.", - "Invalid or untrusted SSL certificate" : "Certificat SSL invalide ou non-fiable", - "Couldn't add remote share" : "Impossible d'ajouter un partage distant", + "Invalid or untrusted SSL certificate" : "Certificat SSL non valable ou non fiable", + "Couldn't add remote share" : "Impossible d'ajouter le partage distant", "Shared with you" : "Partagés avec vous", "Shared with others" : "Partagés avec d'autres", "Shared by link" : "Partagés par lien", - "No files have been shared with you yet." : "Aucun fichier n'est partagé avec vous pour l'instant.", - "You haven't shared any files yet." : "Vous ne partagez pas de fichier pour l'instant.", - "You haven't shared any files by link yet." : "Vous ne partagez pas de fichier par lien pour l'instant.", + "Nothing shared with you yet" : "Aucun fichier n'est partagé avec vous pour l'instant", + "Files and folders others share with you will show up here" : "Les fichiers et dossiers partagés avec vous apparaîtront ici", + "Nothing shared yet" : "Rien n'est partagé pour l'instant", + "Files and folders you share will show up here" : "Les fichiers et dossiers que vous partagerez apparaîtront ici", + "No shared links" : "Aucun lien partagé", + "Files and folders you share by link will show up here" : "Les fichiers et dossiers que vous partagerez par lien apparaîtront ici", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Voulez-vous ajouter le partage distant {name} de {owner}@{remote} ?", "Remote share" : "Partage distant", "Remote share password" : "Mot de passe du partage distant", "Cancel" : "Annuler", "Add remote share" : "Ajouter un partage distant", - "No ownCloud installation found at {remote}" : "Aucune installation ownCloud n'a été trouvée sur {remote}", "Invalid ownCloud url" : "URL ownCloud invalide", "Shared by" : "Partagé par", + "A file or folder was shared from <strong>another server</strong>" : "Un fichier ou un répertoire a été partagé depuis <strong>un autre serveur</strong>", + "A public shared file or folder was <strong>downloaded</strong>" : "Un fichier ou un répertoire partagé a été <strong>téléchargé</strong>", + "You received a new remote share from %s" : "Vous avez reçu un partage distant de %s", + "%1$s accepted remote share %2$s" : "%1$s a accepté le partage distant %2$s", + "%1$s declined remote share %2$s" : "%1$s a refusé le partage distant %2$s", + "%1$s unshared %2$s from you" : "%1$s a cessé de partager %2$s avec vous", + "Public shared folder %1$s was downloaded" : "Le dossier public %1$s a été téléchargé", + "Public shared file %1$s was downloaded" : "Le fichier public %1$s a été téléchargé", "This share is password-protected" : "Ce partage est protégé par un mot de passe", "The password is wrong. Try again." : "Le mot de passe est incorrect. Veuillez réessayer.", "Password" : "Mot de passe", @@ -33,6 +43,9 @@ OC.L10N.register( "Add to your ownCloud" : "Ajouter à votre ownCloud", "Download" : "Télécharger", "Download %s" : "Télécharger %s", - "Direct link" : "Lien direct" + "Direct link" : "Lien direct", + "Server-to-Server Sharing" : "Partage de serveur à serveur", + "Allow users on this server to send shares to other servers" : "Autoriser les utilisateurs de ce serveur à envoyer des partages vers d'autres serveurs", + "Allow users on this server to receive shares from other servers" : "Autoriser les utilisateurs de ce serveur à recevoir des partages d'autres serveurs" }, "nplurals=2; plural=(n > 1);"); diff --git a/apps/files_sharing/l10n/fr.json b/apps/files_sharing/l10n/fr.json index 6981cd74937..119d436ddec 100644 --- a/apps/files_sharing/l10n/fr.json +++ b/apps/files_sharing/l10n/fr.json @@ -1,22 +1,32 @@ { "translations": { "Server to server sharing is not enabled on this server" : "Le partage de serveur à serveur n'est pas activé sur ce serveur", "The mountpoint name contains invalid characters." : "Le nom du point de montage contient des caractères invalides.", - "Invalid or untrusted SSL certificate" : "Certificat SSL invalide ou non-fiable", - "Couldn't add remote share" : "Impossible d'ajouter un partage distant", + "Invalid or untrusted SSL certificate" : "Certificat SSL non valable ou non fiable", + "Couldn't add remote share" : "Impossible d'ajouter le partage distant", "Shared with you" : "Partagés avec vous", "Shared with others" : "Partagés avec d'autres", "Shared by link" : "Partagés par lien", - "No files have been shared with you yet." : "Aucun fichier n'est partagé avec vous pour l'instant.", - "You haven't shared any files yet." : "Vous ne partagez pas de fichier pour l'instant.", - "You haven't shared any files by link yet." : "Vous ne partagez pas de fichier par lien pour l'instant.", + "Nothing shared with you yet" : "Aucun fichier n'est partagé avec vous pour l'instant", + "Files and folders others share with you will show up here" : "Les fichiers et dossiers partagés avec vous apparaîtront ici", + "Nothing shared yet" : "Rien n'est partagé pour l'instant", + "Files and folders you share will show up here" : "Les fichiers et dossiers que vous partagerez apparaîtront ici", + "No shared links" : "Aucun lien partagé", + "Files and folders you share by link will show up here" : "Les fichiers et dossiers que vous partagerez par lien apparaîtront ici", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Voulez-vous ajouter le partage distant {name} de {owner}@{remote} ?", "Remote share" : "Partage distant", "Remote share password" : "Mot de passe du partage distant", "Cancel" : "Annuler", "Add remote share" : "Ajouter un partage distant", - "No ownCloud installation found at {remote}" : "Aucune installation ownCloud n'a été trouvée sur {remote}", "Invalid ownCloud url" : "URL ownCloud invalide", "Shared by" : "Partagé par", + "A file or folder was shared from <strong>another server</strong>" : "Un fichier ou un répertoire a été partagé depuis <strong>un autre serveur</strong>", + "A public shared file or folder was <strong>downloaded</strong>" : "Un fichier ou un répertoire partagé a été <strong>téléchargé</strong>", + "You received a new remote share from %s" : "Vous avez reçu un partage distant de %s", + "%1$s accepted remote share %2$s" : "%1$s a accepté le partage distant %2$s", + "%1$s declined remote share %2$s" : "%1$s a refusé le partage distant %2$s", + "%1$s unshared %2$s from you" : "%1$s a cessé de partager %2$s avec vous", + "Public shared folder %1$s was downloaded" : "Le dossier public %1$s a été téléchargé", + "Public shared file %1$s was downloaded" : "Le fichier public %1$s a été téléchargé", "This share is password-protected" : "Ce partage est protégé par un mot de passe", "The password is wrong. Try again." : "Le mot de passe est incorrect. Veuillez réessayer.", "Password" : "Mot de passe", @@ -31,6 +41,9 @@ "Add to your ownCloud" : "Ajouter à votre ownCloud", "Download" : "Télécharger", "Download %s" : "Télécharger %s", - "Direct link" : "Lien direct" + "Direct link" : "Lien direct", + "Server-to-Server Sharing" : "Partage de serveur à serveur", + "Allow users on this server to send shares to other servers" : "Autoriser les utilisateurs de ce serveur à envoyer des partages vers d'autres serveurs", + "Allow users on this server to receive shares from other servers" : "Autoriser les utilisateurs de ce serveur à recevoir des partages d'autres serveurs" },"pluralForm" :"nplurals=2; plural=(n > 1);" }
\ No newline at end of file diff --git a/apps/files_sharing/l10n/gl.js b/apps/files_sharing/l10n/gl.js index 45d20914ee8..642d2776135 100644 --- a/apps/files_sharing/l10n/gl.js +++ b/apps/files_sharing/l10n/gl.js @@ -2,25 +2,38 @@ OC.L10N.register( "files_sharing", { "Server to server sharing is not enabled on this server" : "Neste servidor non está activada a compartición de servidor a servidor", + "The mountpoint name contains invalid characters." : "O nome do punto de montaxe contén caracteres inválidos.", "Invalid or untrusted SSL certificate" : "Certificado SSL incorrecto ou non fiábel", "Couldn't add remote share" : "Non foi posíbel engadir a compartición remota", "Shared with you" : "Compartido con vostede", "Shared with others" : "Compartido con outros", "Shared by link" : "Compartido por ligazón", - "No files have been shared with you yet." : "Aínda non hai ficheiros compartidos con vostede.", - "You haven't shared any files yet." : "Aínda non compartiu ningún ficheiro.", - "You haven't shared any files by link yet." : "Aínda non compartiu ningún ficheiro por ligazón.", + "Nothing shared with you yet" : "Aínda non hai nada compartido con vostede.", + "Files and folders others share with you will show up here" : "Os ficheiros e cartafoles que outros compartan con vostede amosaranse aquí", + "Nothing shared yet" : "Aínda non hay nada compartido", + "Files and folders you share will show up here" : "Os ficheiros e cartafoles que comparta amosaranse aquí", + "No shared links" : "Non hai ligazóns compartidas", + "Files and folders you share by link will show up here" : "Os ficheiros e cartafoles que comparta por ligazón amosaranse aquí", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Quere engadir a compartición remota {name} desde {owner}@{remote}?", "Remote share" : "Compartición remota", "Remote share password" : "Contrasinal da compartición remota", "Cancel" : "Cancelar", "Add remote share" : "Engadir unha compartición remota", - "No ownCloud installation found at {remote}" : "Non se atopou unha instalación do ownCloud en {remote}", + "No ownCloud installation (7 or higher) found at {remote}" : "Non se atopa unha instalación de ownCloud (7 ou superior) en {remote}", "Invalid ownCloud url" : "URL incorrecta do ownCloud", "Shared by" : "Compartido por", + "A file or folder was shared from <strong>another server</strong>" : "Compartiuse un ficheiro ou cartafol desde <strong>outro servidor</strong>", + "A public shared file or folder was <strong>downloaded</strong>" : "Foi <strong>descargado</strong> un ficheiro ou cartafol público", + "You received a new remote share from %s" : "Recibiu unha compartición remota de %s", + "%1$s accepted remote share %2$s" : "%1$s comparticións remotas aceptadas %2$s", + "%1$s declined remote share %2$s" : "%1$s comparticións remotas declinadas %2$s", + "%1$s unshared %2$s from you" : "%1$s deixou de compartir %2$s con vostede", + "Public shared folder %1$s was downloaded" : "Foi descargado o cartafol público %1$s", + "Public shared file %1$s was downloaded" : "Foi descargado o ficheiro público %1$s", "This share is password-protected" : "Esta compartición está protexida con contrasinal", "The password is wrong. Try again." : "O contrasinal é incorrecto. Ténteo de novo.", "Password" : "Contrasinal", + "No entries found in this folder" : "Non se atoparon entradas neste cartafol", "Name" : "Nome", "Share time" : "Compartir o tempo", "Sorry, this link doesn’t seem to work anymore." : "Semella que esta ligazón non funciona.", @@ -32,6 +45,9 @@ OC.L10N.register( "Add to your ownCloud" : "Engadir ao seu ownCloud", "Download" : "Descargar", "Download %s" : "Descargar %s", - "Direct link" : "Ligazón directa" + "Direct link" : "Ligazón directa", + "Server-to-Server Sharing" : "Compartición Servidor-a-Servidor", + "Allow users on this server to send shares to other servers" : "Permitir aos ususarios de este servidor enviar comparticións a outros servidores", + "Allow users on this server to receive shares from other servers" : "Permitir aos usuarios de este servidor recibir comparticións de outros servidores" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files_sharing/l10n/gl.json b/apps/files_sharing/l10n/gl.json index 5ddd5b02155..6bbe011871b 100644 --- a/apps/files_sharing/l10n/gl.json +++ b/apps/files_sharing/l10n/gl.json @@ -1,24 +1,37 @@ { "translations": { "Server to server sharing is not enabled on this server" : "Neste servidor non está activada a compartición de servidor a servidor", + "The mountpoint name contains invalid characters." : "O nome do punto de montaxe contén caracteres inválidos.", "Invalid or untrusted SSL certificate" : "Certificado SSL incorrecto ou non fiábel", "Couldn't add remote share" : "Non foi posíbel engadir a compartición remota", "Shared with you" : "Compartido con vostede", "Shared with others" : "Compartido con outros", "Shared by link" : "Compartido por ligazón", - "No files have been shared with you yet." : "Aínda non hai ficheiros compartidos con vostede.", - "You haven't shared any files yet." : "Aínda non compartiu ningún ficheiro.", - "You haven't shared any files by link yet." : "Aínda non compartiu ningún ficheiro por ligazón.", + "Nothing shared with you yet" : "Aínda non hai nada compartido con vostede.", + "Files and folders others share with you will show up here" : "Os ficheiros e cartafoles que outros compartan con vostede amosaranse aquí", + "Nothing shared yet" : "Aínda non hay nada compartido", + "Files and folders you share will show up here" : "Os ficheiros e cartafoles que comparta amosaranse aquí", + "No shared links" : "Non hai ligazóns compartidas", + "Files and folders you share by link will show up here" : "Os ficheiros e cartafoles que comparta por ligazón amosaranse aquí", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Quere engadir a compartición remota {name} desde {owner}@{remote}?", "Remote share" : "Compartición remota", "Remote share password" : "Contrasinal da compartición remota", "Cancel" : "Cancelar", "Add remote share" : "Engadir unha compartición remota", - "No ownCloud installation found at {remote}" : "Non se atopou unha instalación do ownCloud en {remote}", + "No ownCloud installation (7 or higher) found at {remote}" : "Non se atopa unha instalación de ownCloud (7 ou superior) en {remote}", "Invalid ownCloud url" : "URL incorrecta do ownCloud", "Shared by" : "Compartido por", + "A file or folder was shared from <strong>another server</strong>" : "Compartiuse un ficheiro ou cartafol desde <strong>outro servidor</strong>", + "A public shared file or folder was <strong>downloaded</strong>" : "Foi <strong>descargado</strong> un ficheiro ou cartafol público", + "You received a new remote share from %s" : "Recibiu unha compartición remota de %s", + "%1$s accepted remote share %2$s" : "%1$s comparticións remotas aceptadas %2$s", + "%1$s declined remote share %2$s" : "%1$s comparticións remotas declinadas %2$s", + "%1$s unshared %2$s from you" : "%1$s deixou de compartir %2$s con vostede", + "Public shared folder %1$s was downloaded" : "Foi descargado o cartafol público %1$s", + "Public shared file %1$s was downloaded" : "Foi descargado o ficheiro público %1$s", "This share is password-protected" : "Esta compartición está protexida con contrasinal", "The password is wrong. Try again." : "O contrasinal é incorrecto. Ténteo de novo.", "Password" : "Contrasinal", + "No entries found in this folder" : "Non se atoparon entradas neste cartafol", "Name" : "Nome", "Share time" : "Compartir o tempo", "Sorry, this link doesn’t seem to work anymore." : "Semella que esta ligazón non funciona.", @@ -30,6 +43,9 @@ "Add to your ownCloud" : "Engadir ao seu ownCloud", "Download" : "Descargar", "Download %s" : "Descargar %s", - "Direct link" : "Ligazón directa" + "Direct link" : "Ligazón directa", + "Server-to-Server Sharing" : "Compartición Servidor-a-Servidor", + "Allow users on this server to send shares to other servers" : "Permitir aos ususarios de este servidor enviar comparticións a outros servidores", + "Allow users on this server to receive shares from other servers" : "Permitir aos usuarios de este servidor recibir comparticións de outros servidores" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files_sharing/l10n/hr.js b/apps/files_sharing/l10n/hr.js index 3c409ea159c..e0f17faaa59 100644 --- a/apps/files_sharing/l10n/hr.js +++ b/apps/files_sharing/l10n/hr.js @@ -7,15 +7,11 @@ OC.L10N.register( "Shared with you" : "Podijeljeno s vama", "Shared with others" : "Podijeljeno s ostalima", "Shared by link" : "POdijeljeno putem veze", - "No files have been shared with you yet." : "S vama dosad još nisu podijeljene nikakve datoteke.", - "You haven't shared any files yet." : "Vi dosad još niste podijelili nikakve datoteke.", - "You haven't shared any files by link yet." : "Vi dosad još niste putem veze podijelili nikakve datoteke.", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Želite li dodati udaljeni zajednički resurs {name} od {owner}@{remote}?", "Remote share" : "Udaljeni zajednički resurs (za raspodjelu)", "Remote share password" : "Lozinka za udaljeni zajednički resurs", "Cancel" : "Odustanite", "Add remote share" : "Dodajte udaljeni zajednički resurs", - "No ownCloud installation found at {remote}" : "Nijedna ownCloud instalacija nije nađena na {remote}", "Invalid ownCloud url" : "Neispravan ownCloud URL", "Shared by" : "Podijeljeno od strane", "This share is password-protected" : "Ovaj zajednički resurs je zaštićen lozinkom", diff --git a/apps/files_sharing/l10n/hr.json b/apps/files_sharing/l10n/hr.json index cb37f803501..bad140eb242 100644 --- a/apps/files_sharing/l10n/hr.json +++ b/apps/files_sharing/l10n/hr.json @@ -5,15 +5,11 @@ "Shared with you" : "Podijeljeno s vama", "Shared with others" : "Podijeljeno s ostalima", "Shared by link" : "POdijeljeno putem veze", - "No files have been shared with you yet." : "S vama dosad još nisu podijeljene nikakve datoteke.", - "You haven't shared any files yet." : "Vi dosad još niste podijelili nikakve datoteke.", - "You haven't shared any files by link yet." : "Vi dosad još niste putem veze podijelili nikakve datoteke.", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Želite li dodati udaljeni zajednički resurs {name} od {owner}@{remote}?", "Remote share" : "Udaljeni zajednički resurs (za raspodjelu)", "Remote share password" : "Lozinka za udaljeni zajednički resurs", "Cancel" : "Odustanite", "Add remote share" : "Dodajte udaljeni zajednički resurs", - "No ownCloud installation found at {remote}" : "Nijedna ownCloud instalacija nije nađena na {remote}", "Invalid ownCloud url" : "Neispravan ownCloud URL", "Shared by" : "Podijeljeno od strane", "This share is password-protected" : "Ovaj zajednički resurs je zaštićen lozinkom", diff --git a/apps/files_sharing/l10n/hu_HU.js b/apps/files_sharing/l10n/hu_HU.js index 9472f88a992..a48c6b71a05 100644 --- a/apps/files_sharing/l10n/hu_HU.js +++ b/apps/files_sharing/l10n/hu_HU.js @@ -8,15 +8,11 @@ OC.L10N.register( "Shared with you" : "Velem osztották meg", "Shared with others" : "Én osztottam meg másokkal", "Shared by link" : "Linkkel osztottam meg", - "No files have been shared with you yet." : "Még nem osztottak meg Önnel semmit.", - "You haven't shared any files yet." : "Még nem osztott meg másokkal semmit", - "You haven't shared any files by link yet." : "Még nem osztott meg link segítségével semmit.", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Használatba kívánja venni a {name} távoli megosztást, amit a {owner}@{remote} címről kapott?", "Remote share" : "Távoli megosztás", "Remote share password" : "Jelszó a távoli megosztáshoz", "Cancel" : "Mégsem", "Add remote share" : "Távoli megosztás létrehozása", - "No ownCloud installation found at {remote}" : "Nem található ownCloud telepítés ezen a címen {remote}", "Invalid ownCloud url" : "Érvénytelen ownCloud webcím", "Shared by" : "Megosztotta Önnel", "This share is password-protected" : "Ez egy jelszóval védett megosztás", diff --git a/apps/files_sharing/l10n/hu_HU.json b/apps/files_sharing/l10n/hu_HU.json index 735228feaac..d700541ad28 100644 --- a/apps/files_sharing/l10n/hu_HU.json +++ b/apps/files_sharing/l10n/hu_HU.json @@ -6,15 +6,11 @@ "Shared with you" : "Velem osztották meg", "Shared with others" : "Én osztottam meg másokkal", "Shared by link" : "Linkkel osztottam meg", - "No files have been shared with you yet." : "Még nem osztottak meg Önnel semmit.", - "You haven't shared any files yet." : "Még nem osztott meg másokkal semmit", - "You haven't shared any files by link yet." : "Még nem osztott meg link segítségével semmit.", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Használatba kívánja venni a {name} távoli megosztást, amit a {owner}@{remote} címről kapott?", "Remote share" : "Távoli megosztás", "Remote share password" : "Jelszó a távoli megosztáshoz", "Cancel" : "Mégsem", "Add remote share" : "Távoli megosztás létrehozása", - "No ownCloud installation found at {remote}" : "Nem található ownCloud telepítés ezen a címen {remote}", "Invalid ownCloud url" : "Érvénytelen ownCloud webcím", "Shared by" : "Megosztotta Önnel", "This share is password-protected" : "Ez egy jelszóval védett megosztás", diff --git a/apps/files_sharing/l10n/id.js b/apps/files_sharing/l10n/id.js index bc61073311b..633195cc99f 100644 --- a/apps/files_sharing/l10n/id.js +++ b/apps/files_sharing/l10n/id.js @@ -8,15 +8,11 @@ OC.L10N.register( "Shared with you" : "Dibagikan dengan Anda", "Shared with others" : "Dibagikan dengan lainnya", "Shared by link" : "Dibagikan dengan tautan", - "No files have been shared with you yet." : "Tidak ada berkas yang dibagikan kepada Anda.", - "You haven't shared any files yet." : "Anda belum berbagi berkas apapun.", - "You haven't shared any files by link yet." : "Anda belum berbagi berkas dengan tautan satupun.", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Apakah Anda ingin menambahkan berbagi remote {name} dari {owner}@{remote}?", "Remote share" : "Berbagi remote", "Remote share password" : "Sandi berbagi remote", "Cancel" : "Batal", "Add remote share" : "Tambah berbagi remote", - "No ownCloud installation found at {remote}" : "Tidak ada instalasi ownCloud yang ditemukan di {remote}", "Invalid ownCloud url" : "URL ownCloud tidak sah", "Shared by" : "Dibagikan oleh", "This share is password-protected" : "Berbagi ini dilindungi sandi", diff --git a/apps/files_sharing/l10n/id.json b/apps/files_sharing/l10n/id.json index a4b0a984969..51a45a575c6 100644 --- a/apps/files_sharing/l10n/id.json +++ b/apps/files_sharing/l10n/id.json @@ -6,15 +6,11 @@ "Shared with you" : "Dibagikan dengan Anda", "Shared with others" : "Dibagikan dengan lainnya", "Shared by link" : "Dibagikan dengan tautan", - "No files have been shared with you yet." : "Tidak ada berkas yang dibagikan kepada Anda.", - "You haven't shared any files yet." : "Anda belum berbagi berkas apapun.", - "You haven't shared any files by link yet." : "Anda belum berbagi berkas dengan tautan satupun.", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Apakah Anda ingin menambahkan berbagi remote {name} dari {owner}@{remote}?", "Remote share" : "Berbagi remote", "Remote share password" : "Sandi berbagi remote", "Cancel" : "Batal", "Add remote share" : "Tambah berbagi remote", - "No ownCloud installation found at {remote}" : "Tidak ada instalasi ownCloud yang ditemukan di {remote}", "Invalid ownCloud url" : "URL ownCloud tidak sah", "Shared by" : "Dibagikan oleh", "This share is password-protected" : "Berbagi ini dilindungi sandi", diff --git a/apps/files_sharing/l10n/it.js b/apps/files_sharing/l10n/it.js index 814e1a35f49..14ed429be85 100644 --- a/apps/files_sharing/l10n/it.js +++ b/apps/files_sharing/l10n/it.js @@ -8,20 +8,32 @@ OC.L10N.register( "Shared with you" : "Condiviso con te", "Shared with others" : "Condiviso con altri", "Shared by link" : "Condiviso tramite collegamento", - "No files have been shared with you yet." : "Non è stato ancora condiviso alcun file con te.", - "You haven't shared any files yet." : "Non hai ancora condiviso alcun file.", - "You haven't shared any files by link yet." : "Non hai ancora condiviso alcun file tramite collegamento.", + "Nothing shared with you yet" : "Non è stato condiviso ancora niente con te", + "Files and folders others share with you will show up here" : "I file e le cartelle che altri condividono con te saranno mostrati qui", + "Nothing shared yet" : "Ancora nessuna condivisione", + "Files and folders you share will show up here" : "I file e le cartelle che condividi saranno mostrati qui", + "No shared links" : "Nessun collegamento condiviso", + "Files and folders you share by link will show up here" : "I file e le cartelle che condividi tramite collegamento saranno mostrati qui", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Vuoi aggiungere la condivisione remota {name} da {owner}@{remote}?", "Remote share" : "Condivisione remota", "Remote share password" : "Password della condivisione remota", "Cancel" : "Annulla", "Add remote share" : "Aggiungi condivisione remota", - "No ownCloud installation found at {remote}" : "Nessuna installazione di ownCloud trovata su {remote}", + "No ownCloud installation (7 or higher) found at {remote}" : "Nessuna installazione di ownCloud (7 o superiore) trovata su {remote}", "Invalid ownCloud url" : "URL di ownCloud non valido", "Shared by" : "Condiviso da", + "A file or folder was shared from <strong>another server</strong>" : "Un file o una cartella è stato condiviso da <strong>un altro server</strong>", + "A public shared file or folder was <strong>downloaded</strong>" : "Un file condiviso pubblicamente o una cartella è stato <strong>scaricato</strong>", + "You received a new remote share from %s" : "Hai ricevuto una nuova condivisione remota da %s", + "%1$s accepted remote share %2$s" : "%1$s ha accettato la condivisione remota %2$s", + "%1$s declined remote share %2$s" : "%1$s ha rifiutato la condivisione remota %2$s", + "%1$s unshared %2$s from you" : "%1$s ha rimosso la condivisione %2$s da te", + "Public shared folder %1$s was downloaded" : "La cartella condivisa pubblicamente %1$s è stata scaricata", + "Public shared file %1$s was downloaded" : "Il file condiviso pubblicamente %1$s è stato scaricato", "This share is password-protected" : "Questa condivione è protetta da password", "The password is wrong. Try again." : "La password è errata. Prova ancora.", "Password" : "Password", + "No entries found in this folder" : "Nessuna voce trovata in questa cartella", "Name" : "Nome", "Share time" : "Tempo di condivisione", "Sorry, this link doesn’t seem to work anymore." : "Spiacenti, questo collegamento sembra non essere più attivo.", @@ -33,6 +45,9 @@ OC.L10N.register( "Add to your ownCloud" : "Aggiungi al tuo ownCloud", "Download" : "Scarica", "Download %s" : "Scarica %s", - "Direct link" : "Collegamento diretto" + "Direct link" : "Collegamento diretto", + "Server-to-Server Sharing" : "Condivisione server-a-server", + "Allow users on this server to send shares to other servers" : "Consenti agli utenti su questo server di inviare condivisioni ad altri server", + "Allow users on this server to receive shares from other servers" : "Consenti agli utenti su questo server di ricevere condivisioni da altri server" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files_sharing/l10n/it.json b/apps/files_sharing/l10n/it.json index 4b070fe12c0..f98994a0a4b 100644 --- a/apps/files_sharing/l10n/it.json +++ b/apps/files_sharing/l10n/it.json @@ -6,20 +6,32 @@ "Shared with you" : "Condiviso con te", "Shared with others" : "Condiviso con altri", "Shared by link" : "Condiviso tramite collegamento", - "No files have been shared with you yet." : "Non è stato ancora condiviso alcun file con te.", - "You haven't shared any files yet." : "Non hai ancora condiviso alcun file.", - "You haven't shared any files by link yet." : "Non hai ancora condiviso alcun file tramite collegamento.", + "Nothing shared with you yet" : "Non è stato condiviso ancora niente con te", + "Files and folders others share with you will show up here" : "I file e le cartelle che altri condividono con te saranno mostrati qui", + "Nothing shared yet" : "Ancora nessuna condivisione", + "Files and folders you share will show up here" : "I file e le cartelle che condividi saranno mostrati qui", + "No shared links" : "Nessun collegamento condiviso", + "Files and folders you share by link will show up here" : "I file e le cartelle che condividi tramite collegamento saranno mostrati qui", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Vuoi aggiungere la condivisione remota {name} da {owner}@{remote}?", "Remote share" : "Condivisione remota", "Remote share password" : "Password della condivisione remota", "Cancel" : "Annulla", "Add remote share" : "Aggiungi condivisione remota", - "No ownCloud installation found at {remote}" : "Nessuna installazione di ownCloud trovata su {remote}", + "No ownCloud installation (7 or higher) found at {remote}" : "Nessuna installazione di ownCloud (7 o superiore) trovata su {remote}", "Invalid ownCloud url" : "URL di ownCloud non valido", "Shared by" : "Condiviso da", + "A file or folder was shared from <strong>another server</strong>" : "Un file o una cartella è stato condiviso da <strong>un altro server</strong>", + "A public shared file or folder was <strong>downloaded</strong>" : "Un file condiviso pubblicamente o una cartella è stato <strong>scaricato</strong>", + "You received a new remote share from %s" : "Hai ricevuto una nuova condivisione remota da %s", + "%1$s accepted remote share %2$s" : "%1$s ha accettato la condivisione remota %2$s", + "%1$s declined remote share %2$s" : "%1$s ha rifiutato la condivisione remota %2$s", + "%1$s unshared %2$s from you" : "%1$s ha rimosso la condivisione %2$s da te", + "Public shared folder %1$s was downloaded" : "La cartella condivisa pubblicamente %1$s è stata scaricata", + "Public shared file %1$s was downloaded" : "Il file condiviso pubblicamente %1$s è stato scaricato", "This share is password-protected" : "Questa condivione è protetta da password", "The password is wrong. Try again." : "La password è errata. Prova ancora.", "Password" : "Password", + "No entries found in this folder" : "Nessuna voce trovata in questa cartella", "Name" : "Nome", "Share time" : "Tempo di condivisione", "Sorry, this link doesn’t seem to work anymore." : "Spiacenti, questo collegamento sembra non essere più attivo.", @@ -31,6 +43,9 @@ "Add to your ownCloud" : "Aggiungi al tuo ownCloud", "Download" : "Scarica", "Download %s" : "Scarica %s", - "Direct link" : "Collegamento diretto" + "Direct link" : "Collegamento diretto", + "Server-to-Server Sharing" : "Condivisione server-a-server", + "Allow users on this server to send shares to other servers" : "Consenti agli utenti su questo server di inviare condivisioni ad altri server", + "Allow users on this server to receive shares from other servers" : "Consenti agli utenti su questo server di ricevere condivisioni da altri server" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files_sharing/l10n/ja.js b/apps/files_sharing/l10n/ja.js index c21273c2d79..c7943c2a6d6 100644 --- a/apps/files_sharing/l10n/ja.js +++ b/apps/files_sharing/l10n/ja.js @@ -8,17 +8,21 @@ OC.L10N.register( "Shared with you" : "他ユーザーがあなたと共有中", "Shared with others" : "他ユーザーと共有中", "Shared by link" : "URLリンクで共有中", - "No files have been shared with you yet." : "他のユーザーがあなたと共有しているファイルはありません。", - "You haven't shared any files yet." : "他のユーザーと共有しているファイルはありません。", - "You haven't shared any files by link yet." : "URLリンクで共有しているファイルはありません。", + "Nothing shared with you yet" : "あなたと共有しているファイルはありません。", + "Files and folders others share with you will show up here" : "他の人から共有されたファイルやフォルダは、ここに表示されます。", + "Nothing shared yet" : "まだ何も共有されていません", + "Files and folders you share will show up here" : "共有したファイルやフォルダは、ここに表示されます。", + "No shared links" : "共有リンクはありません", + "Files and folders you share by link will show up here" : "リンクで共有したファイルやフォルダは、ここに表示されます。", "Do you want to add the remote share {name} from {owner}@{remote}?" : "{owner}@{remote} からリモート共有 {name} を追加してもよろしいですか?", "Remote share" : "リモート共有", "Remote share password" : "リモート共有のパスワード", "Cancel" : "キャンセル", "Add remote share" : "リモート共有を追加", - "No ownCloud installation found at {remote}" : "{remote} にはownCloudがインストールされていません", "Invalid ownCloud url" : "無効なownCloud URL です", "Shared by" : "共有者:", + "A file or folder was shared from <strong>another server</strong>" : "ファイルまたはフォルダーは <strong>他のサーバー</strong>から共有されました", + "You received a new remote share from %s" : "%sからリモート共有のリクエストは\n届きました。", "This share is password-protected" : "この共有はパスワードで保護されています", "The password is wrong. Try again." : "パスワードが間違っています。再試行してください。", "Password" : "パスワード", @@ -33,6 +37,9 @@ OC.L10N.register( "Add to your ownCloud" : "ownCloud に追加", "Download" : "ダウンロード", "Download %s" : "%s をダウンロード", - "Direct link" : "リンク" + "Direct link" : "リンク", + "Server-to-Server Sharing" : "サーバー間共有", + "Allow users on this server to send shares to other servers" : "ユーザーがこのサーバーから他のサーバーに共有することを許可する", + "Allow users on this server to receive shares from other servers" : "ユーザーが他のサーバーからこのサーバーに共有することを許可する" }, "nplurals=1; plural=0;"); diff --git a/apps/files_sharing/l10n/ja.json b/apps/files_sharing/l10n/ja.json index da34e81cf66..fb12f1fb9ec 100644 --- a/apps/files_sharing/l10n/ja.json +++ b/apps/files_sharing/l10n/ja.json @@ -6,17 +6,21 @@ "Shared with you" : "他ユーザーがあなたと共有中", "Shared with others" : "他ユーザーと共有中", "Shared by link" : "URLリンクで共有中", - "No files have been shared with you yet." : "他のユーザーがあなたと共有しているファイルはありません。", - "You haven't shared any files yet." : "他のユーザーと共有しているファイルはありません。", - "You haven't shared any files by link yet." : "URLリンクで共有しているファイルはありません。", + "Nothing shared with you yet" : "あなたと共有しているファイルはありません。", + "Files and folders others share with you will show up here" : "他の人から共有されたファイルやフォルダは、ここに表示されます。", + "Nothing shared yet" : "まだ何も共有されていません", + "Files and folders you share will show up here" : "共有したファイルやフォルダは、ここに表示されます。", + "No shared links" : "共有リンクはありません", + "Files and folders you share by link will show up here" : "リンクで共有したファイルやフォルダは、ここに表示されます。", "Do you want to add the remote share {name} from {owner}@{remote}?" : "{owner}@{remote} からリモート共有 {name} を追加してもよろしいですか?", "Remote share" : "リモート共有", "Remote share password" : "リモート共有のパスワード", "Cancel" : "キャンセル", "Add remote share" : "リモート共有を追加", - "No ownCloud installation found at {remote}" : "{remote} にはownCloudがインストールされていません", "Invalid ownCloud url" : "無効なownCloud URL です", "Shared by" : "共有者:", + "A file or folder was shared from <strong>another server</strong>" : "ファイルまたはフォルダーは <strong>他のサーバー</strong>から共有されました", + "You received a new remote share from %s" : "%sからリモート共有のリクエストは\n届きました。", "This share is password-protected" : "この共有はパスワードで保護されています", "The password is wrong. Try again." : "パスワードが間違っています。再試行してください。", "Password" : "パスワード", @@ -31,6 +35,9 @@ "Add to your ownCloud" : "ownCloud に追加", "Download" : "ダウンロード", "Download %s" : "%s をダウンロード", - "Direct link" : "リンク" + "Direct link" : "リンク", + "Server-to-Server Sharing" : "サーバー間共有", + "Allow users on this server to send shares to other servers" : "ユーザーがこのサーバーから他のサーバーに共有することを許可する", + "Allow users on this server to receive shares from other servers" : "ユーザーが他のサーバーからこのサーバーに共有することを許可する" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/files_sharing/l10n/kn.js b/apps/files_sharing/l10n/kn.js new file mode 100644 index 00000000000..61a3e58aa96 --- /dev/null +++ b/apps/files_sharing/l10n/kn.js @@ -0,0 +1,9 @@ +OC.L10N.register( + "files_sharing", + { + "Cancel" : "ರದ್ದು", + "Password" : "ಗುಪ್ತ ಪದ", + "Name" : "ಹೆಸರು", + "Download" : "ಪ್ರತಿಯನ್ನು ಸ್ಥಳೀಯವಾಗಿ ಉಳಿಸಿಕೊಳ್ಳಿ" +}, +"nplurals=1; plural=0;"); diff --git a/apps/files_sharing/l10n/kn.json b/apps/files_sharing/l10n/kn.json new file mode 100644 index 00000000000..1b16ed072cb --- /dev/null +++ b/apps/files_sharing/l10n/kn.json @@ -0,0 +1,7 @@ +{ "translations": { + "Cancel" : "ರದ್ದು", + "Password" : "ಗುಪ್ತ ಪದ", + "Name" : "ಹೆಸರು", + "Download" : "ಪ್ರತಿಯನ್ನು ಸ್ಥಳೀಯವಾಗಿ ಉಳಿಸಿಕೊಳ್ಳಿ" +},"pluralForm" :"nplurals=1; plural=0;" +}
\ No newline at end of file diff --git a/apps/files_sharing/l10n/mk.js b/apps/files_sharing/l10n/mk.js index 028c2f7ee0f..890980b2e73 100644 --- a/apps/files_sharing/l10n/mk.js +++ b/apps/files_sharing/l10n/mk.js @@ -4,9 +4,6 @@ OC.L10N.register( "Shared with you" : "Споделено со тебе", "Shared with others" : "Сподели со останатите", "Shared by link" : "Споделено со врска", - "No files have been shared with you yet." : "Ниту една датотека сеуште не била споделена со вас.", - "You haven't shared any files yet." : "Вие досега немате споделено ниту една датотека.", - "You haven't shared any files by link yet." : "Сеуште немате споделено датотека со врска.", "Cancel" : "Откажи", "Shared by" : "Споделено од", "This share is password-protected" : "Ова споделување е заштитено со лозинка", diff --git a/apps/files_sharing/l10n/mk.json b/apps/files_sharing/l10n/mk.json index 9e51f668eb0..3a1b748d4fc 100644 --- a/apps/files_sharing/l10n/mk.json +++ b/apps/files_sharing/l10n/mk.json @@ -2,9 +2,6 @@ "Shared with you" : "Споделено со тебе", "Shared with others" : "Сподели со останатите", "Shared by link" : "Споделено со врска", - "No files have been shared with you yet." : "Ниту една датотека сеуште не била споделена со вас.", - "You haven't shared any files yet." : "Вие досега немате споделено ниту една датотека.", - "You haven't shared any files by link yet." : "Сеуште немате споделено датотека со врска.", "Cancel" : "Откажи", "Shared by" : "Споделено од", "This share is password-protected" : "Ова споделување е заштитено со лозинка", diff --git a/apps/files_sharing/l10n/mn.js b/apps/files_sharing/l10n/mn.js new file mode 100644 index 00000000000..6769fc38ccd --- /dev/null +++ b/apps/files_sharing/l10n/mn.js @@ -0,0 +1,6 @@ +OC.L10N.register( + "files_sharing", + { + "Password" : "Нууц үг" +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/files_sharing/l10n/mn.json b/apps/files_sharing/l10n/mn.json new file mode 100644 index 00000000000..13788221f43 --- /dev/null +++ b/apps/files_sharing/l10n/mn.json @@ -0,0 +1,4 @@ +{ "translations": { + "Password" : "Нууц үг" +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/files_sharing/l10n/nb_NO.js b/apps/files_sharing/l10n/nb_NO.js index cd98a9c396d..d9b15d37460 100644 --- a/apps/files_sharing/l10n/nb_NO.js +++ b/apps/files_sharing/l10n/nb_NO.js @@ -8,17 +8,27 @@ OC.L10N.register( "Shared with you" : "Delt med deg", "Shared with others" : "Delt med andre", "Shared by link" : "Delt med lenke", - "No files have been shared with you yet." : "Ingen filer er delt med deg ennå.", - "You haven't shared any files yet." : "Du har ikke delt noen filer ennå.", - "You haven't shared any files by link yet." : "Du har ikke delt noen filer med lenke ennå.", + "Nothing shared with you yet" : "Ingenting er delt med deg ennå", + "Files and folders others share with you will show up here" : "Filer og mapper som andre deler med deg vil bli vist her", + "Nothing shared yet" : "Ingenting er delt ennå", + "Files and folders you share will show up here" : "Filer og mapper som du deler vil bli vist her", + "No shared links" : "Ingen delte lenker", + "Files and folders you share by link will show up here" : "Filer og mapper som du deler med lenke vil bli vist her", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Ønsker du å legge til ekstern deling {name} fra {owner}@{remote}?", "Remote share" : "Ekstern deling", "Remote share password" : "Passord for ekstern deling", "Cancel" : "Avbryt", "Add remote share" : "Legg til ekstern deling", - "No ownCloud installation found at {remote}" : "Ingen ownCloud-installasjon funnet på {remote}", "Invalid ownCloud url" : "Ugyldig ownCloud-url", "Shared by" : "Delt av", + "A file or folder was shared from <strong>another server</strong>" : "En fil eller mappe ble delt fra <strong>en annen server</strong>", + "A public shared file or folder was <strong>downloaded</strong>" : "En offentlig delt fil eller mappe ble <strong>lastet ned</strong>", + "You received a new remote share from %s" : "Du mottok en ny ekstern deling fra %s", + "%1$s accepted remote share %2$s" : "%1$s aksepterte ekstern deling %2$s", + "%1$s declined remote share %2$s" : "%1$s avviste ekstern deling %2$s", + "%1$s unshared %2$s from you" : "%1$s fjernet deling %2$s fra deg", + "Public shared folder %1$s was downloaded" : "Offentlig delt mappe %1$s ble lastet ned", + "Public shared file %1$s was downloaded" : "Offentlig delt fil %1$s ble lastet ned", "This share is password-protected" : "Denne delingen er passordbeskyttet", "The password is wrong. Try again." : "Passordet er feil. Prøv på nytt.", "Password" : "Passord", @@ -33,6 +43,9 @@ OC.L10N.register( "Add to your ownCloud" : "Legg til i din ownCloud", "Download" : "Last ned", "Download %s" : "Last ned %s", - "Direct link" : "Direkte lenke" + "Direct link" : "Direkte lenke", + "Server-to-Server Sharing" : "Server-til-server-deling", + "Allow users on this server to send shares to other servers" : "Tillat at brukere på denne serveren sender delinger til andre servere", + "Allow users on this server to receive shares from other servers" : "Tillat at brukere på denne serveren mottar delinger fra andre servere" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files_sharing/l10n/nb_NO.json b/apps/files_sharing/l10n/nb_NO.json index fe2df9e9307..ecc19f99f93 100644 --- a/apps/files_sharing/l10n/nb_NO.json +++ b/apps/files_sharing/l10n/nb_NO.json @@ -6,17 +6,27 @@ "Shared with you" : "Delt med deg", "Shared with others" : "Delt med andre", "Shared by link" : "Delt med lenke", - "No files have been shared with you yet." : "Ingen filer er delt med deg ennå.", - "You haven't shared any files yet." : "Du har ikke delt noen filer ennå.", - "You haven't shared any files by link yet." : "Du har ikke delt noen filer med lenke ennå.", + "Nothing shared with you yet" : "Ingenting er delt med deg ennå", + "Files and folders others share with you will show up here" : "Filer og mapper som andre deler med deg vil bli vist her", + "Nothing shared yet" : "Ingenting er delt ennå", + "Files and folders you share will show up here" : "Filer og mapper som du deler vil bli vist her", + "No shared links" : "Ingen delte lenker", + "Files and folders you share by link will show up here" : "Filer og mapper som du deler med lenke vil bli vist her", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Ønsker du å legge til ekstern deling {name} fra {owner}@{remote}?", "Remote share" : "Ekstern deling", "Remote share password" : "Passord for ekstern deling", "Cancel" : "Avbryt", "Add remote share" : "Legg til ekstern deling", - "No ownCloud installation found at {remote}" : "Ingen ownCloud-installasjon funnet på {remote}", "Invalid ownCloud url" : "Ugyldig ownCloud-url", "Shared by" : "Delt av", + "A file or folder was shared from <strong>another server</strong>" : "En fil eller mappe ble delt fra <strong>en annen server</strong>", + "A public shared file or folder was <strong>downloaded</strong>" : "En offentlig delt fil eller mappe ble <strong>lastet ned</strong>", + "You received a new remote share from %s" : "Du mottok en ny ekstern deling fra %s", + "%1$s accepted remote share %2$s" : "%1$s aksepterte ekstern deling %2$s", + "%1$s declined remote share %2$s" : "%1$s avviste ekstern deling %2$s", + "%1$s unshared %2$s from you" : "%1$s fjernet deling %2$s fra deg", + "Public shared folder %1$s was downloaded" : "Offentlig delt mappe %1$s ble lastet ned", + "Public shared file %1$s was downloaded" : "Offentlig delt fil %1$s ble lastet ned", "This share is password-protected" : "Denne delingen er passordbeskyttet", "The password is wrong. Try again." : "Passordet er feil. Prøv på nytt.", "Password" : "Passord", @@ -31,6 +41,9 @@ "Add to your ownCloud" : "Legg til i din ownCloud", "Download" : "Last ned", "Download %s" : "Last ned %s", - "Direct link" : "Direkte lenke" + "Direct link" : "Direkte lenke", + "Server-to-Server Sharing" : "Server-til-server-deling", + "Allow users on this server to send shares to other servers" : "Tillat at brukere på denne serveren sender delinger til andre servere", + "Allow users on this server to receive shares from other servers" : "Tillat at brukere på denne serveren mottar delinger fra andre servere" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files_sharing/l10n/nl.js b/apps/files_sharing/l10n/nl.js index 87ddec611a8..45ddda94630 100644 --- a/apps/files_sharing/l10n/nl.js +++ b/apps/files_sharing/l10n/nl.js @@ -8,20 +8,32 @@ OC.L10N.register( "Shared with you" : "Gedeeld met u", "Shared with others" : "Gedeeld door u", "Shared by link" : "Gedeeld via een link", - "No files have been shared with you yet." : "Er zijn nog geen bestanden met u gedeeld.", - "You haven't shared any files yet." : "U hebt nog geen bestanden gedeeld.", - "You haven't shared any files by link yet." : "U hebt nog geen bestanden via een link gedeeld.", + "Nothing shared with you yet" : "Nog niets met u gedeeld", + "Files and folders others share with you will show up here" : "Bestanden en mappen die anderen met u delen, worden hier getoond", + "Nothing shared yet" : "Nog niets gedeeld", + "Files and folders you share will show up here" : "Bestanden en mappen die u deelt, worden hier getoond", + "No shared links" : "Geen gedeelde links", + "Files and folders you share by link will show up here" : "Bestanden en mappen die u via links deelt, worden hier getoond", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Wilt u de externe share {name} van {owner}@{remote} toevoegen?", "Remote share" : "Externe share", "Remote share password" : "Wachtwoord externe share", "Cancel" : "Annuleren", "Add remote share" : "Toevoegen externe share", - "No ownCloud installation found at {remote}" : "Geen ownCloud installatie gevonden op {remote}", + "No ownCloud installation (7 or higher) found at {remote}" : "Geen recente ownCloud installatie (7 of hoger) gevonden op {remote}", "Invalid ownCloud url" : "Ongeldige ownCloud url", "Shared by" : "Gedeeld door", + "A file or folder was shared from <strong>another server</strong>" : "Een bestand of map werd gedeeld vanaf <strong>een andere server</strong>", + "A public shared file or folder was <strong>downloaded</strong>" : "Een openbaar gedeeld bestand of map werd <strong>gedownloaded</strong>", + "You received a new remote share from %s" : "U ontving een nieuwe externe share van %s", + "%1$s accepted remote share %2$s" : "%1$s accepteerde externe share %2$s", + "%1$s declined remote share %2$s" : "%1$s weigerde externe share %2$s", + "%1$s unshared %2$s from you" : "%1$s stopte met delen van %2$s met je", + "Public shared folder %1$s was downloaded" : "Openbaar gedeelde map %1$s werd gedownloaded", + "Public shared file %1$s was downloaded" : "Openbaar gedeeld bestand %1$s werd gedownloaded", "This share is password-protected" : "Deze share is met een wachtwoord beveiligd", "The password is wrong. Try again." : "Wachtwoord ongeldig. Probeer het nogmaals.", "Password" : "Wachtwoord", + "No entries found in this folder" : "Niets gevonden in deze map", "Name" : "Naam", "Share time" : "Deel tijd", "Sorry, this link doesn’t seem to work anymore." : "Sorry, deze link lijkt niet meer in gebruik te zijn.", @@ -33,6 +45,9 @@ OC.L10N.register( "Add to your ownCloud" : "Toevoegen aan uw ownCloud", "Download" : "Downloaden", "Download %s" : "Download %s", - "Direct link" : "Directe link" + "Direct link" : "Directe link", + "Server-to-Server Sharing" : "Server-naar-Server delen", + "Allow users on this server to send shares to other servers" : "Toestaan dat gebruikers op deze server shares sturen naar andere servers", + "Allow users on this server to receive shares from other servers" : "Toestaan dat gebruikers op deze server shares ontvangen van andere servers" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files_sharing/l10n/nl.json b/apps/files_sharing/l10n/nl.json index 2cdbf4eb953..363a5d1ab78 100644 --- a/apps/files_sharing/l10n/nl.json +++ b/apps/files_sharing/l10n/nl.json @@ -6,20 +6,32 @@ "Shared with you" : "Gedeeld met u", "Shared with others" : "Gedeeld door u", "Shared by link" : "Gedeeld via een link", - "No files have been shared with you yet." : "Er zijn nog geen bestanden met u gedeeld.", - "You haven't shared any files yet." : "U hebt nog geen bestanden gedeeld.", - "You haven't shared any files by link yet." : "U hebt nog geen bestanden via een link gedeeld.", + "Nothing shared with you yet" : "Nog niets met u gedeeld", + "Files and folders others share with you will show up here" : "Bestanden en mappen die anderen met u delen, worden hier getoond", + "Nothing shared yet" : "Nog niets gedeeld", + "Files and folders you share will show up here" : "Bestanden en mappen die u deelt, worden hier getoond", + "No shared links" : "Geen gedeelde links", + "Files and folders you share by link will show up here" : "Bestanden en mappen die u via links deelt, worden hier getoond", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Wilt u de externe share {name} van {owner}@{remote} toevoegen?", "Remote share" : "Externe share", "Remote share password" : "Wachtwoord externe share", "Cancel" : "Annuleren", "Add remote share" : "Toevoegen externe share", - "No ownCloud installation found at {remote}" : "Geen ownCloud installatie gevonden op {remote}", + "No ownCloud installation (7 or higher) found at {remote}" : "Geen recente ownCloud installatie (7 of hoger) gevonden op {remote}", "Invalid ownCloud url" : "Ongeldige ownCloud url", "Shared by" : "Gedeeld door", + "A file or folder was shared from <strong>another server</strong>" : "Een bestand of map werd gedeeld vanaf <strong>een andere server</strong>", + "A public shared file or folder was <strong>downloaded</strong>" : "Een openbaar gedeeld bestand of map werd <strong>gedownloaded</strong>", + "You received a new remote share from %s" : "U ontving een nieuwe externe share van %s", + "%1$s accepted remote share %2$s" : "%1$s accepteerde externe share %2$s", + "%1$s declined remote share %2$s" : "%1$s weigerde externe share %2$s", + "%1$s unshared %2$s from you" : "%1$s stopte met delen van %2$s met je", + "Public shared folder %1$s was downloaded" : "Openbaar gedeelde map %1$s werd gedownloaded", + "Public shared file %1$s was downloaded" : "Openbaar gedeeld bestand %1$s werd gedownloaded", "This share is password-protected" : "Deze share is met een wachtwoord beveiligd", "The password is wrong. Try again." : "Wachtwoord ongeldig. Probeer het nogmaals.", "Password" : "Wachtwoord", + "No entries found in this folder" : "Niets gevonden in deze map", "Name" : "Naam", "Share time" : "Deel tijd", "Sorry, this link doesn’t seem to work anymore." : "Sorry, deze link lijkt niet meer in gebruik te zijn.", @@ -31,6 +43,9 @@ "Add to your ownCloud" : "Toevoegen aan uw ownCloud", "Download" : "Downloaden", "Download %s" : "Download %s", - "Direct link" : "Directe link" + "Direct link" : "Directe link", + "Server-to-Server Sharing" : "Server-naar-Server delen", + "Allow users on this server to send shares to other servers" : "Toestaan dat gebruikers op deze server shares sturen naar andere servers", + "Allow users on this server to receive shares from other servers" : "Toestaan dat gebruikers op deze server shares ontvangen van andere servers" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files_sharing/l10n/pl.js b/apps/files_sharing/l10n/pl.js index 9fc08f64bbc..df728604f8e 100644 --- a/apps/files_sharing/l10n/pl.js +++ b/apps/files_sharing/l10n/pl.js @@ -8,15 +8,11 @@ OC.L10N.register( "Shared with you" : "Współdzielony z Tobą", "Shared with others" : "Współdzielony z innymi", "Shared by link" : "Współdzielony linkiem", - "No files have been shared with you yet." : "Nie ma jeszcze żadnych plików współdzielonych z Tobą", - "You haven't shared any files yet." : "Nie współdzielisz jeszcze żadnych plików.", - "You haven't shared any files by link yet." : "Nie współdzielisz jeszcze żadnych plików linkiem", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Czy chcesz dodać udział zdalny {name} od {owner}@{remote}?", "Remote share" : "Zdalny zasób", "Remote share password" : "Hasło do zdalnego zasobu", "Cancel" : "Anuluj", "Add remote share" : "Dodaj zdalny zasób", - "No ownCloud installation found at {remote}" : "Nie znaleziono instalacji ownCloud na {remote}", "Invalid ownCloud url" : "Błędny adres URL", "Shared by" : "Udostępniane przez", "This share is password-protected" : "Udział ten jest chroniony hasłem", diff --git a/apps/files_sharing/l10n/pl.json b/apps/files_sharing/l10n/pl.json index a6c06ef01fc..1f65cc3104f 100644 --- a/apps/files_sharing/l10n/pl.json +++ b/apps/files_sharing/l10n/pl.json @@ -6,15 +6,11 @@ "Shared with you" : "Współdzielony z Tobą", "Shared with others" : "Współdzielony z innymi", "Shared by link" : "Współdzielony linkiem", - "No files have been shared with you yet." : "Nie ma jeszcze żadnych plików współdzielonych z Tobą", - "You haven't shared any files yet." : "Nie współdzielisz jeszcze żadnych plików.", - "You haven't shared any files by link yet." : "Nie współdzielisz jeszcze żadnych plików linkiem", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Czy chcesz dodać udział zdalny {name} od {owner}@{remote}?", "Remote share" : "Zdalny zasób", "Remote share password" : "Hasło do zdalnego zasobu", "Cancel" : "Anuluj", "Add remote share" : "Dodaj zdalny zasób", - "No ownCloud installation found at {remote}" : "Nie znaleziono instalacji ownCloud na {remote}", "Invalid ownCloud url" : "Błędny adres URL", "Shared by" : "Udostępniane przez", "This share is password-protected" : "Udział ten jest chroniony hasłem", diff --git a/apps/files_sharing/l10n/pt_BR.js b/apps/files_sharing/l10n/pt_BR.js index cb961362f4d..7203e3c1ecd 100644 --- a/apps/files_sharing/l10n/pt_BR.js +++ b/apps/files_sharing/l10n/pt_BR.js @@ -8,20 +8,32 @@ OC.L10N.register( "Shared with you" : "Compartilhado com você", "Shared with others" : "Compartilhado com outros", "Shared by link" : "Compartilhado por link", - "No files have been shared with you yet." : "Nenhum arquivo ainda foi compartilhado com você.", - "You haven't shared any files yet." : "Você ainda não compartilhou nenhum arquivo.", - "You haven't shared any files by link yet." : "Você ainda não compartilhou nenhum arquivo por link.", + "Nothing shared with you yet" : "Nada compartilhado com você até agora", + "Files and folders others share with you will show up here" : "Arquivos e pastas que outros compartilham com você são mostrados aqui", + "Nothing shared yet" : "Nada compartilhado até agora", + "Files and folders you share will show up here" : "Arquivos e pastas que você compartilha são mostrados aqui", + "No shared links" : "Nenhum link compartilhado", + "Files and folders you share by link will show up here" : "Arquivos e pastas que você compartilha com link são mostrados aqui", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Você quer adicionar o compartilhamento remoto {name} de {owner}@{remote}?", "Remote share" : "Compartilhamento remoto", "Remote share password" : "Senha do compartilhamento remoto", "Cancel" : "Cancelar", "Add remote share" : "Adicionar compartilhamento remoto", - "No ownCloud installation found at {remote}" : "Nenhuma instalação ownCloud encontrada em {remote}", + "No ownCloud installation (7 or higher) found at {remote}" : "Nenhuma instalação ownCloud (7 ou superior) foi encontrada em {remote}", "Invalid ownCloud url" : "Url invalida para ownCloud", "Shared by" : "Compartilhado por", + "A file or folder was shared from <strong>another server</strong>" : "Um arquivo ou pasta foi compartilhada a partir de <strong>outro servidor</strong>", + "A public shared file or folder was <strong>downloaded</strong>" : "Um arquivo ou pasta compartilhada publicamente foi <strong>baixado</strong>", + "You received a new remote share from %s" : "Você recebeu um novo compartilhamento remoto de %s", + "%1$s accepted remote share %2$s" : "%1$s aceitou o compartilhamento remoto %2$s", + "%1$s declined remote share %2$s" : "%1$s declinou o compartilhamento remoto %2$s", + "%1$s unshared %2$s from you" : "%1$s não compartilhados %2$s de você", + "Public shared folder %1$s was downloaded" : "A pasta %1$s compartilhada publicamente foi baixada", + "Public shared file %1$s was downloaded" : "O arquivo %1$s compartilhado publicamente foi baixado", "This share is password-protected" : "Este compartilhamento esta protegido por senha", "The password is wrong. Try again." : "Senha incorreta. Tente novamente.", "Password" : "Senha", + "No entries found in this folder" : "Nenhuma entrada foi encontrada nesta pasta", "Name" : "Nome", "Share time" : "Tempo de compartilhamento", "Sorry, this link doesn’t seem to work anymore." : "Desculpe, este link parece não mais funcionar.", @@ -33,6 +45,9 @@ OC.L10N.register( "Add to your ownCloud" : "Adiconar ao seu ownCloud", "Download" : "Baixar", "Download %s" : "Baixar %s", - "Direct link" : "Link direto" + "Direct link" : "Link direto", + "Server-to-Server Sharing" : "Compartilhamento Servidor-a-servidor", + "Allow users on this server to send shares to other servers" : "Permitir que os usuários deste servidor enviem compartilhamentos para outros servidores", + "Allow users on this server to receive shares from other servers" : "Permitir que os usuários nesse servidor recebam compartilhamentos de outros servidores" }, "nplurals=2; plural=(n > 1);"); diff --git a/apps/files_sharing/l10n/pt_BR.json b/apps/files_sharing/l10n/pt_BR.json index 3ca7602a171..8314e75d9fc 100644 --- a/apps/files_sharing/l10n/pt_BR.json +++ b/apps/files_sharing/l10n/pt_BR.json @@ -6,20 +6,32 @@ "Shared with you" : "Compartilhado com você", "Shared with others" : "Compartilhado com outros", "Shared by link" : "Compartilhado por link", - "No files have been shared with you yet." : "Nenhum arquivo ainda foi compartilhado com você.", - "You haven't shared any files yet." : "Você ainda não compartilhou nenhum arquivo.", - "You haven't shared any files by link yet." : "Você ainda não compartilhou nenhum arquivo por link.", + "Nothing shared with you yet" : "Nada compartilhado com você até agora", + "Files and folders others share with you will show up here" : "Arquivos e pastas que outros compartilham com você são mostrados aqui", + "Nothing shared yet" : "Nada compartilhado até agora", + "Files and folders you share will show up here" : "Arquivos e pastas que você compartilha são mostrados aqui", + "No shared links" : "Nenhum link compartilhado", + "Files and folders you share by link will show up here" : "Arquivos e pastas que você compartilha com link são mostrados aqui", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Você quer adicionar o compartilhamento remoto {name} de {owner}@{remote}?", "Remote share" : "Compartilhamento remoto", "Remote share password" : "Senha do compartilhamento remoto", "Cancel" : "Cancelar", "Add remote share" : "Adicionar compartilhamento remoto", - "No ownCloud installation found at {remote}" : "Nenhuma instalação ownCloud encontrada em {remote}", + "No ownCloud installation (7 or higher) found at {remote}" : "Nenhuma instalação ownCloud (7 ou superior) foi encontrada em {remote}", "Invalid ownCloud url" : "Url invalida para ownCloud", "Shared by" : "Compartilhado por", + "A file or folder was shared from <strong>another server</strong>" : "Um arquivo ou pasta foi compartilhada a partir de <strong>outro servidor</strong>", + "A public shared file or folder was <strong>downloaded</strong>" : "Um arquivo ou pasta compartilhada publicamente foi <strong>baixado</strong>", + "You received a new remote share from %s" : "Você recebeu um novo compartilhamento remoto de %s", + "%1$s accepted remote share %2$s" : "%1$s aceitou o compartilhamento remoto %2$s", + "%1$s declined remote share %2$s" : "%1$s declinou o compartilhamento remoto %2$s", + "%1$s unshared %2$s from you" : "%1$s não compartilhados %2$s de você", + "Public shared folder %1$s was downloaded" : "A pasta %1$s compartilhada publicamente foi baixada", + "Public shared file %1$s was downloaded" : "O arquivo %1$s compartilhado publicamente foi baixado", "This share is password-protected" : "Este compartilhamento esta protegido por senha", "The password is wrong. Try again." : "Senha incorreta. Tente novamente.", "Password" : "Senha", + "No entries found in this folder" : "Nenhuma entrada foi encontrada nesta pasta", "Name" : "Nome", "Share time" : "Tempo de compartilhamento", "Sorry, this link doesn’t seem to work anymore." : "Desculpe, este link parece não mais funcionar.", @@ -31,6 +43,9 @@ "Add to your ownCloud" : "Adiconar ao seu ownCloud", "Download" : "Baixar", "Download %s" : "Baixar %s", - "Direct link" : "Link direto" + "Direct link" : "Link direto", + "Server-to-Server Sharing" : "Compartilhamento Servidor-a-servidor", + "Allow users on this server to send shares to other servers" : "Permitir que os usuários deste servidor enviem compartilhamentos para outros servidores", + "Allow users on this server to receive shares from other servers" : "Permitir que os usuários nesse servidor recebam compartilhamentos de outros servidores" },"pluralForm" :"nplurals=2; plural=(n > 1);" }
\ No newline at end of file diff --git a/apps/files_sharing/l10n/pt_PT.js b/apps/files_sharing/l10n/pt_PT.js index b85bd00014c..f0f6221ce30 100644 --- a/apps/files_sharing/l10n/pt_PT.js +++ b/apps/files_sharing/l10n/pt_PT.js @@ -1,23 +1,19 @@ OC.L10N.register( "files_sharing", { - "Server to server sharing is not enabled on this server" : "A partilha entre servidores não se encontra disponível", - "The mountpoint name contains invalid characters." : "O nome de mountpoint contém caracteres inválidos.", + "Server to server sharing is not enabled on this server" : "A partilha entre servidores não se encontra disponível neste servidor", + "The mountpoint name contains invalid characters." : "O nome do ponto de montagem contém carateres inválidos.", "Invalid or untrusted SSL certificate" : "Certificado SSL inválido ou não confiável", - "Couldn't add remote share" : "Ocorreu um erro ao adicionar a partilha remota", + "Couldn't add remote share" : "Não foi possível adicionar a partilha remota", "Shared with you" : "Partilhado consigo ", "Shared with others" : "Partilhado com outros", "Shared by link" : "Partilhado pela hiperligação", - "No files have been shared with you yet." : "Ainda não partilhados quaisquer ficheuiros consigo.", - "You haven't shared any files yet." : "Ainda não partilhou quaisquer ficheiros.", - "You haven't shared any files by link yet." : "Ainda não partilhou quaisquer ficheiros por hiperligação.", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Deseja adicionar a partilha remota {nome} de {proprietário}@{remoto}?", "Remote share" : "Partilha remota", - "Remote share password" : "Password da partilha remota", + "Remote share password" : "Senha da partilha remota", "Cancel" : "Cancelar", "Add remote share" : "Adicionar partilha remota", - "No ownCloud installation found at {remote}" : "Não foi encontrada uma instalação em {remote}", - "Invalid ownCloud url" : "Endereço errado", + "Invalid ownCloud url" : "Url ownCloud inválido", "Shared by" : "Partilhado por", "This share is password-protected" : "Esta partilha está protegida por senha", "The password is wrong. Try again." : "A senha está errada. Por favor, tente de novo.", @@ -30,9 +26,12 @@ OC.L10N.register( "the link expired" : "A hiperligação expirou", "sharing is disabled" : "a partilha está desativada", "For more info, please ask the person who sent this link." : "Para mais informação, por favor, pergunte à pessoa que lhe enviou esta hiperligação.", - "Add to your ownCloud" : "Adicionar á sua ownCloud", + "Add to your ownCloud" : "Adicionar à sua ownCloud", "Download" : "Transferir", "Download %s" : "Transferir %s", - "Direct link" : "Hiperligação direta" + "Direct link" : "Hiperligação direta", + "Server-to-Server Sharing" : "Servidor-para-Servidor de Partilha", + "Allow users on this server to send shares to other servers" : "Permitir utilizadores neste servidor para enviar as partilhas para outros servidores", + "Allow users on this server to receive shares from other servers" : "Permitir utilizadores neste servidor para receber as partilhas de outros servidores" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files_sharing/l10n/pt_PT.json b/apps/files_sharing/l10n/pt_PT.json index 228d59d2b9c..400c24b326c 100644 --- a/apps/files_sharing/l10n/pt_PT.json +++ b/apps/files_sharing/l10n/pt_PT.json @@ -1,21 +1,17 @@ { "translations": { - "Server to server sharing is not enabled on this server" : "A partilha entre servidores não se encontra disponível", - "The mountpoint name contains invalid characters." : "O nome de mountpoint contém caracteres inválidos.", + "Server to server sharing is not enabled on this server" : "A partilha entre servidores não se encontra disponível neste servidor", + "The mountpoint name contains invalid characters." : "O nome do ponto de montagem contém carateres inválidos.", "Invalid or untrusted SSL certificate" : "Certificado SSL inválido ou não confiável", - "Couldn't add remote share" : "Ocorreu um erro ao adicionar a partilha remota", + "Couldn't add remote share" : "Não foi possível adicionar a partilha remota", "Shared with you" : "Partilhado consigo ", "Shared with others" : "Partilhado com outros", "Shared by link" : "Partilhado pela hiperligação", - "No files have been shared with you yet." : "Ainda não partilhados quaisquer ficheuiros consigo.", - "You haven't shared any files yet." : "Ainda não partilhou quaisquer ficheiros.", - "You haven't shared any files by link yet." : "Ainda não partilhou quaisquer ficheiros por hiperligação.", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Deseja adicionar a partilha remota {nome} de {proprietário}@{remoto}?", "Remote share" : "Partilha remota", - "Remote share password" : "Password da partilha remota", + "Remote share password" : "Senha da partilha remota", "Cancel" : "Cancelar", "Add remote share" : "Adicionar partilha remota", - "No ownCloud installation found at {remote}" : "Não foi encontrada uma instalação em {remote}", - "Invalid ownCloud url" : "Endereço errado", + "Invalid ownCloud url" : "Url ownCloud inválido", "Shared by" : "Partilhado por", "This share is password-protected" : "Esta partilha está protegida por senha", "The password is wrong. Try again." : "A senha está errada. Por favor, tente de novo.", @@ -28,9 +24,12 @@ "the link expired" : "A hiperligação expirou", "sharing is disabled" : "a partilha está desativada", "For more info, please ask the person who sent this link." : "Para mais informação, por favor, pergunte à pessoa que lhe enviou esta hiperligação.", - "Add to your ownCloud" : "Adicionar á sua ownCloud", + "Add to your ownCloud" : "Adicionar à sua ownCloud", "Download" : "Transferir", "Download %s" : "Transferir %s", - "Direct link" : "Hiperligação direta" + "Direct link" : "Hiperligação direta", + "Server-to-Server Sharing" : "Servidor-para-Servidor de Partilha", + "Allow users on this server to send shares to other servers" : "Permitir utilizadores neste servidor para enviar as partilhas para outros servidores", + "Allow users on this server to receive shares from other servers" : "Permitir utilizadores neste servidor para receber as partilhas de outros servidores" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files_sharing/l10n/ro.js b/apps/files_sharing/l10n/ro.js index 48957ec9fbc..69a4d263545 100644 --- a/apps/files_sharing/l10n/ro.js +++ b/apps/files_sharing/l10n/ro.js @@ -4,8 +4,6 @@ OC.L10N.register( "Server to server sharing is not enabled on this server" : "Partajarea server-server nu este activată pe acest server", "Shared with you" : "Partajat cu tine", "Shared with others" : "Partajat cu alții", - "No files have been shared with you yet." : "Nu sunt încă fișiere partajate cu tine.", - "You haven't shared any files yet." : "Nu ai partajat încă nici un fișier.", "Cancel" : "Anulare", "Shared by" : "impartite in ", "This share is password-protected" : "Această partajare este protejată cu parolă", diff --git a/apps/files_sharing/l10n/ro.json b/apps/files_sharing/l10n/ro.json index c0ab9e366e2..73501a9acd0 100644 --- a/apps/files_sharing/l10n/ro.json +++ b/apps/files_sharing/l10n/ro.json @@ -2,8 +2,6 @@ "Server to server sharing is not enabled on this server" : "Partajarea server-server nu este activată pe acest server", "Shared with you" : "Partajat cu tine", "Shared with others" : "Partajat cu alții", - "No files have been shared with you yet." : "Nu sunt încă fișiere partajate cu tine.", - "You haven't shared any files yet." : "Nu ai partajat încă nici un fișier.", "Cancel" : "Anulare", "Shared by" : "impartite in ", "This share is password-protected" : "Această partajare este protejată cu parolă", diff --git a/apps/files_sharing/l10n/ru.js b/apps/files_sharing/l10n/ru.js index f6a24253590..0212726e204 100644 --- a/apps/files_sharing/l10n/ru.js +++ b/apps/files_sharing/l10n/ru.js @@ -1,38 +1,53 @@ OC.L10N.register( "files_sharing", { - "Server to server sharing is not enabled on this server" : "На данном сервере выключено межсерверное предоставление общих папок", + "Server to server sharing is not enabled on this server" : "На данном сервере выключено межсерверное предоставление общего доступа", "The mountpoint name contains invalid characters." : "Имя точки монтирования содержит недопустимые символы.", "Invalid or untrusted SSL certificate" : "Недействительный или недоверенный сертификат SSL", - "Couldn't add remote share" : "Невозможно добавить удалённую общую папку", - "Shared with you" : "Доступные для Вас", + "Couldn't add remote share" : "Невозможно добавить удалённый общий ресурс", + "Shared with you" : "Поделились с вами", "Shared with others" : "Доступные для других", "Shared by link" : "Доступные по ссылке", - "No files have been shared with you yet." : "Отсутствуют доступные для вас файлы.", - "You haven't shared any files yet." : "У вас нет общедоступных файлов", - "You haven't shared any files by link yet." : "Вы ещё не открыли доступ по ссылке ни к одному файлу.", + "Nothing shared with you yet" : "С вами пока ничем не поделились", + "Files and folders others share with you will show up here" : "Здесь появятся файлы и каталоги, которыми с вами поделятся", + "Nothing shared yet" : "Пока ничего не опубликовано", + "Files and folders you share will show up here" : "Здесь появятся файлы и каталоги, которыми вы поделитесь", + "No shared links" : "Нет общих ссылок", + "Files and folders you share by link will show up here" : "Здесь появятся файлы и каталоги, ссылкой на которые вы поделитесь", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Добавить удалённую общую папку {name} из {owner}@{remote}?", - "Remote share" : "Удалённая общая папка", - "Remote share password" : "Пароль для удалённой общей папки", + "Remote share" : "Удаленный общий ресурс", + "Remote share password" : "Пароль для удаленного общего ресурса", "Cancel" : "Отменить", - "Add remote share" : "Добавить удалённую общую папку", - "No ownCloud installation found at {remote}" : "Не найдено ownCloud на {remote}", + "Add remote share" : "Добавить удалённый общий ресурс", + "No ownCloud installation (7 or higher) found at {remote}" : "На удаленном ресурсе {remote} не установлен ownCloud версии 7 или выше", "Invalid ownCloud url" : "Неверный адрес ownCloud", - "Shared by" : "Опубликовано", - "This share is password-protected" : "Для доступа к информации необходимо ввести пароль", + "Shared by" : "Поделился", + "A file or folder was shared from <strong>another server</strong>" : "Файлом или каталогом поделились с <strong>удаленного сервера</strong>", + "A public shared file or folder was <strong>downloaded</strong>" : "Общий файл или каталог был <strong>скачан</strong>", + "You received a new remote share from %s" : "%s поделился с вами удаленным общим ресурсом", + "%1$s accepted remote share %2$s" : "%1$s принял удаленный общий ресурс %2$s", + "%1$s declined remote share %2$s" : "%1$s отклонил удаленный общий ресурс %2$s", + "%1$s unshared %2$s from you" : "%1$s закрыл для вас доступ к %2$s ", + "Public shared folder %1$s was downloaded" : "Общий каталог %1$s был скачан", + "Public shared file %1$s was downloaded" : "Общий файл %1$s, был скачан", + "This share is password-protected" : "Общий ресурс защищен паролем", "The password is wrong. Try again." : "Неверный пароль. Попробуйте еще раз.", "Password" : "Пароль", + "No entries found in this folder" : "Каталог пуст", "Name" : "Имя", "Share time" : "Дата публикации", "Sorry, this link doesn’t seem to work anymore." : "Эта ссылка устарела и более не действительна.", "Reasons might be:" : "Причиной может быть:", - "the item was removed" : "объект был удалён", + "the item was removed" : "элемент был удалён", "the link expired" : "срок действия ссылки истёк", "sharing is disabled" : "общий доступ отключён", - "For more info, please ask the person who sent this link." : "Для получения дополнительной информации, пожалуйста, свяжитесь с тем, кто отправил Вам эту ссылку.", + "For more info, please ask the person who sent this link." : "Для получения дополнительной информации, свяжитесь с тем, кто отправил вам эту ссылку.", "Add to your ownCloud" : "Добавить в свой ownCloud", "Download" : "Скачать", "Download %s" : "Скачать %s", - "Direct link" : "Прямая ссылка" + "Direct link" : "Прямая ссылка", + "Server-to-Server Sharing" : "Межсерверное предоставление доступа", + "Allow users on this server to send shares to other servers" : "Разрешить пользователям делиться с пользователями других серверов", + "Allow users on this server to receive shares from other servers" : "Разрешить пользователям использовать общие ресурсы с других серверов" }, "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/apps/files_sharing/l10n/ru.json b/apps/files_sharing/l10n/ru.json index 9eaf51586d4..d14ffa43101 100644 --- a/apps/files_sharing/l10n/ru.json +++ b/apps/files_sharing/l10n/ru.json @@ -1,36 +1,51 @@ { "translations": { - "Server to server sharing is not enabled on this server" : "На данном сервере выключено межсерверное предоставление общих папок", + "Server to server sharing is not enabled on this server" : "На данном сервере выключено межсерверное предоставление общего доступа", "The mountpoint name contains invalid characters." : "Имя точки монтирования содержит недопустимые символы.", "Invalid or untrusted SSL certificate" : "Недействительный или недоверенный сертификат SSL", - "Couldn't add remote share" : "Невозможно добавить удалённую общую папку", - "Shared with you" : "Доступные для Вас", + "Couldn't add remote share" : "Невозможно добавить удалённый общий ресурс", + "Shared with you" : "Поделились с вами", "Shared with others" : "Доступные для других", "Shared by link" : "Доступные по ссылке", - "No files have been shared with you yet." : "Отсутствуют доступные для вас файлы.", - "You haven't shared any files yet." : "У вас нет общедоступных файлов", - "You haven't shared any files by link yet." : "Вы ещё не открыли доступ по ссылке ни к одному файлу.", + "Nothing shared with you yet" : "С вами пока ничем не поделились", + "Files and folders others share with you will show up here" : "Здесь появятся файлы и каталоги, которыми с вами поделятся", + "Nothing shared yet" : "Пока ничего не опубликовано", + "Files and folders you share will show up here" : "Здесь появятся файлы и каталоги, которыми вы поделитесь", + "No shared links" : "Нет общих ссылок", + "Files and folders you share by link will show up here" : "Здесь появятся файлы и каталоги, ссылкой на которые вы поделитесь", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Добавить удалённую общую папку {name} из {owner}@{remote}?", - "Remote share" : "Удалённая общая папка", - "Remote share password" : "Пароль для удалённой общей папки", + "Remote share" : "Удаленный общий ресурс", + "Remote share password" : "Пароль для удаленного общего ресурса", "Cancel" : "Отменить", - "Add remote share" : "Добавить удалённую общую папку", - "No ownCloud installation found at {remote}" : "Не найдено ownCloud на {remote}", + "Add remote share" : "Добавить удалённый общий ресурс", + "No ownCloud installation (7 or higher) found at {remote}" : "На удаленном ресурсе {remote} не установлен ownCloud версии 7 или выше", "Invalid ownCloud url" : "Неверный адрес ownCloud", - "Shared by" : "Опубликовано", - "This share is password-protected" : "Для доступа к информации необходимо ввести пароль", + "Shared by" : "Поделился", + "A file or folder was shared from <strong>another server</strong>" : "Файлом или каталогом поделились с <strong>удаленного сервера</strong>", + "A public shared file or folder was <strong>downloaded</strong>" : "Общий файл или каталог был <strong>скачан</strong>", + "You received a new remote share from %s" : "%s поделился с вами удаленным общим ресурсом", + "%1$s accepted remote share %2$s" : "%1$s принял удаленный общий ресурс %2$s", + "%1$s declined remote share %2$s" : "%1$s отклонил удаленный общий ресурс %2$s", + "%1$s unshared %2$s from you" : "%1$s закрыл для вас доступ к %2$s ", + "Public shared folder %1$s was downloaded" : "Общий каталог %1$s был скачан", + "Public shared file %1$s was downloaded" : "Общий файл %1$s, был скачан", + "This share is password-protected" : "Общий ресурс защищен паролем", "The password is wrong. Try again." : "Неверный пароль. Попробуйте еще раз.", "Password" : "Пароль", + "No entries found in this folder" : "Каталог пуст", "Name" : "Имя", "Share time" : "Дата публикации", "Sorry, this link doesn’t seem to work anymore." : "Эта ссылка устарела и более не действительна.", "Reasons might be:" : "Причиной может быть:", - "the item was removed" : "объект был удалён", + "the item was removed" : "элемент был удалён", "the link expired" : "срок действия ссылки истёк", "sharing is disabled" : "общий доступ отключён", - "For more info, please ask the person who sent this link." : "Для получения дополнительной информации, пожалуйста, свяжитесь с тем, кто отправил Вам эту ссылку.", + "For more info, please ask the person who sent this link." : "Для получения дополнительной информации, свяжитесь с тем, кто отправил вам эту ссылку.", "Add to your ownCloud" : "Добавить в свой ownCloud", "Download" : "Скачать", "Download %s" : "Скачать %s", - "Direct link" : "Прямая ссылка" + "Direct link" : "Прямая ссылка", + "Server-to-Server Sharing" : "Межсерверное предоставление доступа", + "Allow users on this server to send shares to other servers" : "Разрешить пользователям делиться с пользователями других серверов", + "Allow users on this server to receive shares from other servers" : "Разрешить пользователям использовать общие ресурсы с других серверов" },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" }
\ No newline at end of file diff --git a/apps/files_sharing/l10n/sk.php b/apps/files_sharing/l10n/sk.php deleted file mode 100644 index bc251c7fd59..00000000000 --- a/apps/files_sharing/l10n/sk.php +++ /dev/null @@ -1,6 +0,0 @@ -<?php -$TRANSLATIONS = array( -"Cancel" => "Zrušiť", -"Download" => "Stiahnuť" -); -$PLURAL_FORMS = "nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"; diff --git a/apps/files_sharing/l10n/sk_SK.js b/apps/files_sharing/l10n/sk_SK.js index a68ce01a721..5467f33eba1 100644 --- a/apps/files_sharing/l10n/sk_SK.js +++ b/apps/files_sharing/l10n/sk_SK.js @@ -7,15 +7,11 @@ OC.L10N.register( "Shared with you" : "Zdieľané s vami", "Shared with others" : "Zdieľané s ostanými", "Shared by link" : "Zdieľané pomocou odkazu", - "No files have been shared with you yet." : "Zatiaľ s vami nikto žiadne súbory nezdieľal.", - "You haven't shared any files yet." : "Zatiaľ ste nezdieľali žiadne súbory.", - "You haven't shared any files by link yet." : "Zatiaľ ste pomocou odkazu nezdieľali žiaden súbor.", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Chcete pridať vzdialené úložisko {name} patriace používateľovi {owner}@{remote}?", "Remote share" : "Vzdialené úložisko", "Remote share password" : "Heslo k vzdialenému úložisku", "Cancel" : "Zrušiť", "Add remote share" : "Pridať vzdialené úložisko", - "No ownCloud installation found at {remote}" : "Žiadna ownCloud inštancia na {remote}", "Invalid ownCloud url" : "Chybná ownCloud url", "Shared by" : "Zdieľa", "This share is password-protected" : "Toto zdieľanie je chránené heslom", diff --git a/apps/files_sharing/l10n/sk_SK.json b/apps/files_sharing/l10n/sk_SK.json index 29470388f0f..811e9182db2 100644 --- a/apps/files_sharing/l10n/sk_SK.json +++ b/apps/files_sharing/l10n/sk_SK.json @@ -5,15 +5,11 @@ "Shared with you" : "Zdieľané s vami", "Shared with others" : "Zdieľané s ostanými", "Shared by link" : "Zdieľané pomocou odkazu", - "No files have been shared with you yet." : "Zatiaľ s vami nikto žiadne súbory nezdieľal.", - "You haven't shared any files yet." : "Zatiaľ ste nezdieľali žiadne súbory.", - "You haven't shared any files by link yet." : "Zatiaľ ste pomocou odkazu nezdieľali žiaden súbor.", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Chcete pridať vzdialené úložisko {name} patriace používateľovi {owner}@{remote}?", "Remote share" : "Vzdialené úložisko", "Remote share password" : "Heslo k vzdialenému úložisku", "Cancel" : "Zrušiť", "Add remote share" : "Pridať vzdialené úložisko", - "No ownCloud installation found at {remote}" : "Žiadna ownCloud inštancia na {remote}", "Invalid ownCloud url" : "Chybná ownCloud url", "Shared by" : "Zdieľa", "This share is password-protected" : "Toto zdieľanie je chránené heslom", diff --git a/apps/files_sharing/l10n/sl.js b/apps/files_sharing/l10n/sl.js index d685f6cc501..d13ecd5c14b 100644 --- a/apps/files_sharing/l10n/sl.js +++ b/apps/files_sharing/l10n/sl.js @@ -8,17 +8,28 @@ OC.L10N.register( "Shared with you" : "V souporabi z vami", "Shared with others" : "V souporabi z drugimi", "Shared by link" : "Souporaba s povezavo", - "No files have been shared with you yet." : "Ni datotek, ki bi jih drugi omogočili za souporabo z vami.", - "You haven't shared any files yet." : "Ni datotek, ki bi jih omogočili za souporabo.", - "You haven't shared any files by link yet." : "Ni datotek, ki bi jih omogočili za souporabo s povezavo.", + "Nothing shared with you yet" : "Datotek drugih uporabnikov še ni v souporabi", + "Files and folders others share with you will show up here" : "Datoteke in mape, katerih souporabo z vami dovolijo drugi, bodo izpisane na tem mestu", + "Nothing shared yet" : "Souporabe datotek še niste omogočili", + "Files and folders you share will show up here" : "Datoteke in mape, katerih souporabo z drugimi dovolite vi, bodo izpisane na tem mestu", + "No shared links" : "Ni povezav za souporabo", + "Files and folders you share by link will show up here" : "Datoteke in mape, katerih souporabo preko povezave z drugimi dovolite vi, bodo izpisane na tem mestu", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Ali želite dodati oddaljeno mesto souporabe {name} na {owner}@{remote}?", "Remote share" : "Oddaljeno mesto za souporabo", "Remote share password" : "Geslo za mesto za oddaljeno souporabo", "Cancel" : "Prekliči", "Add remote share" : "Dodaj oddaljeno mesto za souporabo", - "No ownCloud installation found at {remote}" : "Na mestu {remote} ni namestitve ownCloud", + "No ownCloud installation (7 or higher) found at {remote}" : "Na mestu {remote} ni nameščenega okolja ownCloud (različice 7 ali višje)", "Invalid ownCloud url" : "Naveden je neveljaven naslov URL strežnika ownCloud", "Shared by" : "V souporabi z", + "A file or folder was shared from <strong>another server</strong>" : "Souporaba datoteke ali mape <strong>z drugega strežnika</strong> je odobrena.", + "A public shared file or folder was <strong>downloaded</strong>" : "Mapa ali datoteka v souporabi je bila <strong>prejeta</strong>.", + "You received a new remote share from %s" : "Prejeli ste mapo za oddaljeno souporabo z %s", + "%1$s accepted remote share %2$s" : "Uporabnik %1$s je prejel oddaljeno souporabo %2$s", + "%1$s declined remote share %2$s" : "Uporabnik %1$s je zavrnil souporabo %2$s", + "%1$s unshared %2$s from you" : "Uporabnik %1$s je onemogoči souporabo %2$s z vami", + "Public shared folder %1$s was downloaded" : "Mapa v souporabi %1$s je bila prejeta", + "Public shared file %1$s was downloaded" : "Datoteka v souporabi %1$s je bila prejeta", "This share is password-protected" : "To mesto je zaščiteno z geslom.", "The password is wrong. Try again." : "Geslo je napačno. Poskusite znova.", "Password" : "Geslo", @@ -33,6 +44,9 @@ OC.L10N.register( "Add to your ownCloud" : "Dodaj v svoj oblak ownCloud", "Download" : "Prejmi", "Download %s" : "Prejmi %s", - "Direct link" : "Neposredna povezava" + "Direct link" : "Neposredna povezava", + "Server-to-Server Sharing" : "Souporaba strežnik-na-strežnik", + "Allow users on this server to send shares to other servers" : "Dovoli uporabnikom tega strežnika pošiljanje map za souporabo na druge strežnike.", + "Allow users on this server to receive shares from other servers" : "Dovoli uporabnikom tega strežnika sprejemanje map za souporabo z drugih strežnikov." }, "nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);"); diff --git a/apps/files_sharing/l10n/sl.json b/apps/files_sharing/l10n/sl.json index 0b45262f95f..124d8f3c9b8 100644 --- a/apps/files_sharing/l10n/sl.json +++ b/apps/files_sharing/l10n/sl.json @@ -6,17 +6,28 @@ "Shared with you" : "V souporabi z vami", "Shared with others" : "V souporabi z drugimi", "Shared by link" : "Souporaba s povezavo", - "No files have been shared with you yet." : "Ni datotek, ki bi jih drugi omogočili za souporabo z vami.", - "You haven't shared any files yet." : "Ni datotek, ki bi jih omogočili za souporabo.", - "You haven't shared any files by link yet." : "Ni datotek, ki bi jih omogočili za souporabo s povezavo.", + "Nothing shared with you yet" : "Datotek drugih uporabnikov še ni v souporabi", + "Files and folders others share with you will show up here" : "Datoteke in mape, katerih souporabo z vami dovolijo drugi, bodo izpisane na tem mestu", + "Nothing shared yet" : "Souporabe datotek še niste omogočili", + "Files and folders you share will show up here" : "Datoteke in mape, katerih souporabo z drugimi dovolite vi, bodo izpisane na tem mestu", + "No shared links" : "Ni povezav za souporabo", + "Files and folders you share by link will show up here" : "Datoteke in mape, katerih souporabo preko povezave z drugimi dovolite vi, bodo izpisane na tem mestu", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Ali želite dodati oddaljeno mesto souporabe {name} na {owner}@{remote}?", "Remote share" : "Oddaljeno mesto za souporabo", "Remote share password" : "Geslo za mesto za oddaljeno souporabo", "Cancel" : "Prekliči", "Add remote share" : "Dodaj oddaljeno mesto za souporabo", - "No ownCloud installation found at {remote}" : "Na mestu {remote} ni namestitve ownCloud", + "No ownCloud installation (7 or higher) found at {remote}" : "Na mestu {remote} ni nameščenega okolja ownCloud (različice 7 ali višje)", "Invalid ownCloud url" : "Naveden je neveljaven naslov URL strežnika ownCloud", "Shared by" : "V souporabi z", + "A file or folder was shared from <strong>another server</strong>" : "Souporaba datoteke ali mape <strong>z drugega strežnika</strong> je odobrena.", + "A public shared file or folder was <strong>downloaded</strong>" : "Mapa ali datoteka v souporabi je bila <strong>prejeta</strong>.", + "You received a new remote share from %s" : "Prejeli ste mapo za oddaljeno souporabo z %s", + "%1$s accepted remote share %2$s" : "Uporabnik %1$s je prejel oddaljeno souporabo %2$s", + "%1$s declined remote share %2$s" : "Uporabnik %1$s je zavrnil souporabo %2$s", + "%1$s unshared %2$s from you" : "Uporabnik %1$s je onemogoči souporabo %2$s z vami", + "Public shared folder %1$s was downloaded" : "Mapa v souporabi %1$s je bila prejeta", + "Public shared file %1$s was downloaded" : "Datoteka v souporabi %1$s je bila prejeta", "This share is password-protected" : "To mesto je zaščiteno z geslom.", "The password is wrong. Try again." : "Geslo je napačno. Poskusite znova.", "Password" : "Geslo", @@ -31,6 +42,9 @@ "Add to your ownCloud" : "Dodaj v svoj oblak ownCloud", "Download" : "Prejmi", "Download %s" : "Prejmi %s", - "Direct link" : "Neposredna povezava" + "Direct link" : "Neposredna povezava", + "Server-to-Server Sharing" : "Souporaba strežnik-na-strežnik", + "Allow users on this server to send shares to other servers" : "Dovoli uporabnikom tega strežnika pošiljanje map za souporabo na druge strežnike.", + "Allow users on this server to receive shares from other servers" : "Dovoli uporabnikom tega strežnika sprejemanje map za souporabo z drugih strežnikov." },"pluralForm" :"nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);" }
\ No newline at end of file diff --git a/apps/files_sharing/l10n/sv.js b/apps/files_sharing/l10n/sv.js index ba1ecda864f..bab77a7431e 100644 --- a/apps/files_sharing/l10n/sv.js +++ b/apps/files_sharing/l10n/sv.js @@ -2,17 +2,33 @@ OC.L10N.register( "files_sharing", { "Server to server sharing is not enabled on this server" : "Server-till-server-delning är inte aktiverat på denna server", + "The mountpoint name contains invalid characters." : "Monteringspunktens namn innehåller ogiltiga tecken.", + "Invalid or untrusted SSL certificate" : "Ogiltigt eller ej betrott SSL-certifikat", "Couldn't add remote share" : "Kunde inte lägga till fjärrutdelning", "Shared with you" : "Delat med dig", "Shared with others" : "Delat med andra", "Shared by link" : "Delad som länk", - "No files have been shared with you yet." : "Inga filer har ännu delats med dig.", - "You haven't shared any files yet." : "Du har inte delat några filer ännu.", - "You haven't shared any files by link yet." : "Du har inte delat några filer som länk ännu.", + "Nothing shared with you yet" : "Inget delat med dig ännu", + "Files and folders others share with you will show up here" : "Filer och mappar andra delar med dig kommer visas här", + "Nothing shared yet" : "Inget delat ännu", + "Files and folders you share will show up here" : "Filer och mappar du delar kommer visas här", + "No shared links" : "Inga delade länkar", + "Files and folders you share by link will show up here" : "Filer och mappar du delar som länkar kommer visas här", + "Do you want to add the remote share {name} from {owner}@{remote}?" : "Vill du lägga till fjärrdelning {name} från {owner}@{remote}?", + "Remote share" : "Fjärrdelning", + "Remote share password" : "Lösenord för fjärrdelning", "Cancel" : "Avbryt", - "No ownCloud installation found at {remote}" : "Ingen ownCloudinstallation funnen på {remote}", + "Add remote share" : "Lägg till fjärrdelning", "Invalid ownCloud url" : "Felaktig ownCloud url", "Shared by" : "Delad av", + "A file or folder was shared from <strong>another server</strong>" : "En fil eller mapp delades från <strong>en annan server</strong>", + "A public shared file or folder was <strong>downloaded</strong>" : "En publikt delad fil eller mapp blev <strong>nerladdad</strong>", + "You received a new remote share from %s" : "Du mottog en ny fjärrdelning från %s", + "%1$s accepted remote share %2$s" : "%1$s accepterade fjärrdelning %2$s", + "%1$s declined remote share %2$s" : "%1$s nekade fjärrdelning %2$s", + "%1$s unshared %2$s from you" : "%1$s tog bort delningen %2$s från dig", + "Public shared folder %1$s was downloaded" : "Publikt delad mapp %1$s blev nerladdad", + "Public shared file %1$s was downloaded" : "Publikt delad fil %1$s blev nerladdad", "This share is password-protected" : "Den här delningen är lösenordsskyddad", "The password is wrong. Try again." : "Lösenordet är fel. Försök igen.", "Password" : "Lösenord", @@ -27,6 +43,9 @@ OC.L10N.register( "Add to your ownCloud" : "Lägg till i din ownCloud", "Download" : "Ladda ner", "Download %s" : "Ladda ner %s", - "Direct link" : "Direkt länk" + "Direct link" : "Direkt länk", + "Server-to-Server Sharing" : "Server-till-Server delning", + "Allow users on this server to send shares to other servers" : "Tillåt användare på denna server att skicka utdelningar till andra servrar", + "Allow users on this server to receive shares from other servers" : "Tillåt användare på denna servern att ta emot utdelningar från andra servrar" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files_sharing/l10n/sv.json b/apps/files_sharing/l10n/sv.json index fecdfd2bed8..a7334a15685 100644 --- a/apps/files_sharing/l10n/sv.json +++ b/apps/files_sharing/l10n/sv.json @@ -1,16 +1,32 @@ { "translations": { "Server to server sharing is not enabled on this server" : "Server-till-server-delning är inte aktiverat på denna server", + "The mountpoint name contains invalid characters." : "Monteringspunktens namn innehåller ogiltiga tecken.", + "Invalid or untrusted SSL certificate" : "Ogiltigt eller ej betrott SSL-certifikat", "Couldn't add remote share" : "Kunde inte lägga till fjärrutdelning", "Shared with you" : "Delat med dig", "Shared with others" : "Delat med andra", "Shared by link" : "Delad som länk", - "No files have been shared with you yet." : "Inga filer har ännu delats med dig.", - "You haven't shared any files yet." : "Du har inte delat några filer ännu.", - "You haven't shared any files by link yet." : "Du har inte delat några filer som länk ännu.", + "Nothing shared with you yet" : "Inget delat med dig ännu", + "Files and folders others share with you will show up here" : "Filer och mappar andra delar med dig kommer visas här", + "Nothing shared yet" : "Inget delat ännu", + "Files and folders you share will show up here" : "Filer och mappar du delar kommer visas här", + "No shared links" : "Inga delade länkar", + "Files and folders you share by link will show up here" : "Filer och mappar du delar som länkar kommer visas här", + "Do you want to add the remote share {name} from {owner}@{remote}?" : "Vill du lägga till fjärrdelning {name} från {owner}@{remote}?", + "Remote share" : "Fjärrdelning", + "Remote share password" : "Lösenord för fjärrdelning", "Cancel" : "Avbryt", - "No ownCloud installation found at {remote}" : "Ingen ownCloudinstallation funnen på {remote}", + "Add remote share" : "Lägg till fjärrdelning", "Invalid ownCloud url" : "Felaktig ownCloud url", "Shared by" : "Delad av", + "A file or folder was shared from <strong>another server</strong>" : "En fil eller mapp delades från <strong>en annan server</strong>", + "A public shared file or folder was <strong>downloaded</strong>" : "En publikt delad fil eller mapp blev <strong>nerladdad</strong>", + "You received a new remote share from %s" : "Du mottog en ny fjärrdelning från %s", + "%1$s accepted remote share %2$s" : "%1$s accepterade fjärrdelning %2$s", + "%1$s declined remote share %2$s" : "%1$s nekade fjärrdelning %2$s", + "%1$s unshared %2$s from you" : "%1$s tog bort delningen %2$s från dig", + "Public shared folder %1$s was downloaded" : "Publikt delad mapp %1$s blev nerladdad", + "Public shared file %1$s was downloaded" : "Publikt delad fil %1$s blev nerladdad", "This share is password-protected" : "Den här delningen är lösenordsskyddad", "The password is wrong. Try again." : "Lösenordet är fel. Försök igen.", "Password" : "Lösenord", @@ -25,6 +41,9 @@ "Add to your ownCloud" : "Lägg till i din ownCloud", "Download" : "Ladda ner", "Download %s" : "Ladda ner %s", - "Direct link" : "Direkt länk" + "Direct link" : "Direkt länk", + "Server-to-Server Sharing" : "Server-till-Server delning", + "Allow users on this server to send shares to other servers" : "Tillåt användare på denna server att skicka utdelningar till andra servrar", + "Allow users on this server to receive shares from other servers" : "Tillåt användare på denna servern att ta emot utdelningar från andra servrar" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files_sharing/l10n/tr.js b/apps/files_sharing/l10n/tr.js index ae6217cab93..8f5b4391b70 100644 --- a/apps/files_sharing/l10n/tr.js +++ b/apps/files_sharing/l10n/tr.js @@ -8,15 +8,11 @@ OC.L10N.register( "Shared with you" : "Sizinle paylaşılmış", "Shared with others" : "Diğerleri ile paylaşılmış", "Shared by link" : "Bağlantı ile paylaşılmış", - "No files have been shared with you yet." : "Henüz sizinle paylaşılan bir dosya yok.", - "You haven't shared any files yet." : "Henüz hiçbir dosya paylaşmadınız.", - "You haven't shared any files by link yet." : "Bağlantı ile henüz hiçbir dosya paylaşmadınız.", "Do you want to add the remote share {name} from {owner}@{remote}?" : "{owner}@{remote} konumundan {name} uzak paylaşımını eklemek istiyor musunuz?", "Remote share" : "Uzak paylaşım", "Remote share password" : "Uzak paylaşım parolası", "Cancel" : "İptal", "Add remote share" : "Uzak paylaşım ekle", - "No ownCloud installation found at {remote}" : "{remote} üzerinde ownCloud kurulumu bulunamadı", "Invalid ownCloud url" : "Geçersiz ownCloud adresi", "Shared by" : "Paylaşan", "This share is password-protected" : "Bu paylaşım parola korumalı", @@ -33,6 +29,9 @@ OC.L10N.register( "Add to your ownCloud" : "ownCloud'ınıza Ekleyin", "Download" : "İndir", "Download %s" : "İndir: %s", - "Direct link" : "Doğrudan bağlantı" + "Direct link" : "Doğrudan bağlantı", + "Server-to-Server Sharing" : "Sunucu-Sunucu Paylaşımı", + "Allow users on this server to send shares to other servers" : "Bu sunucudaki kullanıcıların diğer sunuculara paylaşım göndermelerine izin ver", + "Allow users on this server to receive shares from other servers" : "Bu sunucudaki kullanıcıların diğer sunuculardan paylaşım almalarına izin ver" }, "nplurals=2; plural=(n > 1);"); diff --git a/apps/files_sharing/l10n/tr.json b/apps/files_sharing/l10n/tr.json index 90d206ac3ed..7072e84d8c9 100644 --- a/apps/files_sharing/l10n/tr.json +++ b/apps/files_sharing/l10n/tr.json @@ -6,15 +6,11 @@ "Shared with you" : "Sizinle paylaşılmış", "Shared with others" : "Diğerleri ile paylaşılmış", "Shared by link" : "Bağlantı ile paylaşılmış", - "No files have been shared with you yet." : "Henüz sizinle paylaşılan bir dosya yok.", - "You haven't shared any files yet." : "Henüz hiçbir dosya paylaşmadınız.", - "You haven't shared any files by link yet." : "Bağlantı ile henüz hiçbir dosya paylaşmadınız.", "Do you want to add the remote share {name} from {owner}@{remote}?" : "{owner}@{remote} konumundan {name} uzak paylaşımını eklemek istiyor musunuz?", "Remote share" : "Uzak paylaşım", "Remote share password" : "Uzak paylaşım parolası", "Cancel" : "İptal", "Add remote share" : "Uzak paylaşım ekle", - "No ownCloud installation found at {remote}" : "{remote} üzerinde ownCloud kurulumu bulunamadı", "Invalid ownCloud url" : "Geçersiz ownCloud adresi", "Shared by" : "Paylaşan", "This share is password-protected" : "Bu paylaşım parola korumalı", @@ -31,6 +27,9 @@ "Add to your ownCloud" : "ownCloud'ınıza Ekleyin", "Download" : "İndir", "Download %s" : "İndir: %s", - "Direct link" : "Doğrudan bağlantı" + "Direct link" : "Doğrudan bağlantı", + "Server-to-Server Sharing" : "Sunucu-Sunucu Paylaşımı", + "Allow users on this server to send shares to other servers" : "Bu sunucudaki kullanıcıların diğer sunuculara paylaşım göndermelerine izin ver", + "Allow users on this server to receive shares from other servers" : "Bu sunucudaki kullanıcıların diğer sunuculardan paylaşım almalarına izin ver" },"pluralForm" :"nplurals=2; plural=(n > 1);" }
\ No newline at end of file diff --git a/apps/files_sharing/l10n/uk.js b/apps/files_sharing/l10n/uk.js index a41afdceb71..47ae87389f0 100644 --- a/apps/files_sharing/l10n/uk.js +++ b/apps/files_sharing/l10n/uk.js @@ -8,15 +8,11 @@ OC.L10N.register( "Shared with you" : "Доступне для вас", "Shared with others" : "Доступне для інших", "Shared by link" : "Доступне за посиланням", - "No files have been shared with you yet." : "Доступні для вас файли відсутні.", - "You haven't shared any files yet." : "Ви не маєте загальнодоступних файлів.", - "You haven't shared any files by link yet." : "Ви ще не відкрили доступ за посиланням для жодного з файлів.", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Додати віддалену загальну теку {name} з {owner}@{remote}?", "Remote share" : "Віддалена загальна тека", "Remote share password" : "Пароль для віддаленої загальної теки", "Cancel" : "Відмінити", "Add remote share" : "Додати віддалену загальну теку", - "No ownCloud installation found at {remote}" : "Не знайдено ownCloud на {remote}", "Invalid ownCloud url" : "Невірний ownCloud URL", "Shared by" : "Опубліковано", "This share is password-protected" : "Цей ресурс обміну захищений паролем", @@ -33,6 +29,9 @@ OC.L10N.register( "Add to your ownCloud" : "Додати до вашого ownCloud", "Download" : "Завантажити", "Download %s" : "Завантажити %s", - "Direct link" : "Пряме посилання" + "Direct link" : "Пряме посилання", + "Server-to-Server Sharing" : "Публікація між серверами", + "Allow users on this server to send shares to other servers" : "Дозволити користувачам цього сервера публікувати на інших серверах", + "Allow users on this server to receive shares from other servers" : "Дозволити користувачам на цьому сервері отримувати публікації з інших серверів" }, "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/apps/files_sharing/l10n/uk.json b/apps/files_sharing/l10n/uk.json index a8d66aae2e9..1a0bd7c7b11 100644 --- a/apps/files_sharing/l10n/uk.json +++ b/apps/files_sharing/l10n/uk.json @@ -6,15 +6,11 @@ "Shared with you" : "Доступне для вас", "Shared with others" : "Доступне для інших", "Shared by link" : "Доступне за посиланням", - "No files have been shared with you yet." : "Доступні для вас файли відсутні.", - "You haven't shared any files yet." : "Ви не маєте загальнодоступних файлів.", - "You haven't shared any files by link yet." : "Ви ще не відкрили доступ за посиланням для жодного з файлів.", "Do you want to add the remote share {name} from {owner}@{remote}?" : "Додати віддалену загальну теку {name} з {owner}@{remote}?", "Remote share" : "Віддалена загальна тека", "Remote share password" : "Пароль для віддаленої загальної теки", "Cancel" : "Відмінити", "Add remote share" : "Додати віддалену загальну теку", - "No ownCloud installation found at {remote}" : "Не знайдено ownCloud на {remote}", "Invalid ownCloud url" : "Невірний ownCloud URL", "Shared by" : "Опубліковано", "This share is password-protected" : "Цей ресурс обміну захищений паролем", @@ -31,6 +27,9 @@ "Add to your ownCloud" : "Додати до вашого ownCloud", "Download" : "Завантажити", "Download %s" : "Завантажити %s", - "Direct link" : "Пряме посилання" + "Direct link" : "Пряме посилання", + "Server-to-Server Sharing" : "Публікація між серверами", + "Allow users on this server to send shares to other servers" : "Дозволити користувачам цього сервера публікувати на інших серверах", + "Allow users on this server to receive shares from other servers" : "Дозволити користувачам на цьому сервері отримувати публікації з інших серверів" },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" }
\ No newline at end of file diff --git a/apps/files_sharing/l10n/zh_CN.js b/apps/files_sharing/l10n/zh_CN.js index 66c400d0cf0..c97aa805ca7 100644 --- a/apps/files_sharing/l10n/zh_CN.js +++ b/apps/files_sharing/l10n/zh_CN.js @@ -6,15 +6,11 @@ OC.L10N.register( "Shared with you" : "分享给您的文件", "Shared with others" : "您分享的文件", "Shared by link" : "分享链接的文件", - "No files have been shared with you yet." : "目前没有文件向您分享。", - "You haven't shared any files yet." : "您还未分享过文件。", - "You haven't shared any files by link yet." : "您还没通过链接分享文件。", "Do you want to add the remote share {name} from {owner}@{remote}?" : "您要添加 {name} 来自 {owner}@{remote} 的远程分享吗?", "Remote share" : "远程分享", "Remote share password" : "远程分享密码", "Cancel" : "取消", "Add remote share" : "添加远程分享", - "No ownCloud installation found at {remote}" : "未能在 {remote} 找到 ownCloud 服务", "Invalid ownCloud url" : "无效的 ownCloud 网址", "Shared by" : "共享人", "This share is password-protected" : "这是一个密码保护的共享", diff --git a/apps/files_sharing/l10n/zh_CN.json b/apps/files_sharing/l10n/zh_CN.json index 9169b33998b..a06835a7f1f 100644 --- a/apps/files_sharing/l10n/zh_CN.json +++ b/apps/files_sharing/l10n/zh_CN.json @@ -4,15 +4,11 @@ "Shared with you" : "分享给您的文件", "Shared with others" : "您分享的文件", "Shared by link" : "分享链接的文件", - "No files have been shared with you yet." : "目前没有文件向您分享。", - "You haven't shared any files yet." : "您还未分享过文件。", - "You haven't shared any files by link yet." : "您还没通过链接分享文件。", "Do you want to add the remote share {name} from {owner}@{remote}?" : "您要添加 {name} 来自 {owner}@{remote} 的远程分享吗?", "Remote share" : "远程分享", "Remote share password" : "远程分享密码", "Cancel" : "取消", "Add remote share" : "添加远程分享", - "No ownCloud installation found at {remote}" : "未能在 {remote} 找到 ownCloud 服务", "Invalid ownCloud url" : "无效的 ownCloud 网址", "Shared by" : "共享人", "This share is password-protected" : "这是一个密码保护的共享", diff --git a/apps/files_sharing/l10n/zh_TW.js b/apps/files_sharing/l10n/zh_TW.js index 9512b0ab87e..d379da10ca9 100644 --- a/apps/files_sharing/l10n/zh_TW.js +++ b/apps/files_sharing/l10n/zh_TW.js @@ -6,15 +6,11 @@ OC.L10N.register( "Shared with you" : "與你分享", "Shared with others" : "與其他人分享", "Shared by link" : "由連結分享", - "No files have been shared with you yet." : "目前沒有任何與你分享的檔案", - "You haven't shared any files yet." : "你尚未分享任何檔案", - "You haven't shared any files by link yet." : "你尚未使用連結分享任何檔案", "Do you want to add the remote share {name} from {owner}@{remote}?" : "是否要加入來自 {owner}@{remote} 的遠端分享 {name} ?", "Remote share" : "遠端分享", "Remote share password" : "遠端分享密碼", "Cancel" : "取消", "Add remote share" : "加入遠端分享", - "No ownCloud installation found at {remote}" : "沒有在 {remote} 找到 ownCloud", "Invalid ownCloud url" : "無效的 ownCloud URL", "Shared by" : "由...分享", "This share is password-protected" : "這個分享有密碼保護", diff --git a/apps/files_sharing/l10n/zh_TW.json b/apps/files_sharing/l10n/zh_TW.json index 2065c00ff6d..a4fc1ae2ea2 100644 --- a/apps/files_sharing/l10n/zh_TW.json +++ b/apps/files_sharing/l10n/zh_TW.json @@ -4,15 +4,11 @@ "Shared with you" : "與你分享", "Shared with others" : "與其他人分享", "Shared by link" : "由連結分享", - "No files have been shared with you yet." : "目前沒有任何與你分享的檔案", - "You haven't shared any files yet." : "你尚未分享任何檔案", - "You haven't shared any files by link yet." : "你尚未使用連結分享任何檔案", "Do you want to add the remote share {name} from {owner}@{remote}?" : "是否要加入來自 {owner}@{remote} 的遠端分享 {name} ?", "Remote share" : "遠端分享", "Remote share password" : "遠端分享密碼", "Cancel" : "取消", "Add remote share" : "加入遠端分享", - "No ownCloud installation found at {remote}" : "沒有在 {remote} 找到 ownCloud", "Invalid ownCloud url" : "無效的 ownCloud URL", "Shared by" : "由...分享", "This share is password-protected" : "這個分享有密碼保護", diff --git a/apps/files_sharing/lib/activity.php b/apps/files_sharing/lib/activity.php new file mode 100644 index 00000000000..23f548474d3 --- /dev/null +++ b/apps/files_sharing/lib/activity.php @@ -0,0 +1,216 @@ +<?php +/** + * ownCloud - publish activities + * + * @copyright (c) 2014, ownCloud Inc. + * + * @author Bjoern Schiessle <schiessle@owncloud.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this library. If not, see <http://www.gnu.org/licenses/>. + */ + +namespace OCA\Files_Sharing; + +class Activity implements \OCP\Activity\IExtension { + + const TYPE_REMOTE_SHARE = 'remote_share'; + const TYPE_PUBLIC_LINKS = 'public_links'; + const SUBJECT_REMOTE_SHARE_RECEIVED = 'remote_share_received'; + const SUBJECT_REMOTE_SHARE_ACCEPTED = 'remote_share_accepted'; + const SUBJECT_REMOTE_SHARE_DECLINED = 'remote_share_declined'; + const SUBJECT_REMOTE_SHARE_UNSHARED = 'remote_share_unshared'; + const SUBJECT_PUBLIC_SHARED_FILE_DOWNLOADED = 'public_shared_file_downloaded'; + const SUBJECT_PUBLIC_SHARED_FOLDER_DOWNLOADED = 'public_shared_folder_downloaded'; + + /** + * The extension can return an array of additional notification types. + * If no additional types are to be added false is to be returned + * + * @param string $languageCode + * @return array|false + */ + public function getNotificationTypes($languageCode) { + $l = \OC::$server->getL10N('files_sharing', $languageCode); + return array( + self::TYPE_REMOTE_SHARE => $l->t('A file or folder was shared from <strong>another server</strong>'), + self::TYPE_PUBLIC_LINKS => $l->t('A public shared file or folder was <strong>downloaded</strong>'), + ); + } + + /** + * The extension can filter the types based on the filter if required. + * In case no filter is to be applied false is to be returned unchanged. + * + * @param array $types + * @param string $filter + * @return array|false + */ + public function filterNotificationTypes($types, $filter) { + return $types; + } + + /** + * For a given method additional types to be displayed in the settings can be returned. + * In case no additional types are to be added false is to be returned. + * + * @param string $method + * @return array|false + */ + public function getDefaultTypes($method) { + if ($method === 'stream') { + return array(self::TYPE_REMOTE_SHARE, self::TYPE_PUBLIC_LINKS); + } + + return false; + } + + /** + * The extension can translate a given message to the requested languages. + * If no translation is available false is to be returned. + * + * @param string $app + * @param string $text + * @param array $params + * @param boolean $stripPath + * @param boolean $highlightParams + * @param string $languageCode + * @return string|false + */ + public function translate($app, $text, $params, $stripPath, $highlightParams, $languageCode) { + + $l = \OC::$server->getL10N('files_sharing', $languageCode); + + if ($app === 'files_sharing') { + switch ($text) { + case self::SUBJECT_REMOTE_SHARE_RECEIVED: + return $l->t('You received a new remote share from %s', $params)->__toString(); + case self::SUBJECT_REMOTE_SHARE_ACCEPTED: + return $l->t('%1$s accepted remote share %2$s', $params)->__toString(); + case self::SUBJECT_REMOTE_SHARE_DECLINED: + return $l->t('%1$s declined remote share %2$s', $params)->__toString(); + case self::SUBJECT_REMOTE_SHARE_UNSHARED: + return $l->t('%1$s unshared %2$s from you', $params)->__toString(); + case self::SUBJECT_PUBLIC_SHARED_FOLDER_DOWNLOADED: + return $l->t('Public shared folder %1$s was downloaded', $params)->__toString(); + case self::SUBJECT_PUBLIC_SHARED_FILE_DOWNLOADED: + return $l->t('Public shared file %1$s was downloaded', $params)->__toString(); + } + } + + return false; + } + + /** + * The extension can define the type of parameters for translation + * + * Currently known types are: + * * file => will strip away the path of the file and add a tooltip with it + * * username => will add the avatar of the user + * + * @param string $app + * @param string $text + * @return array|false + */ + public function getSpecialParameterList($app, $text) { + if ($app === 'files_sharing') { + switch ($text) { + case self::SUBJECT_REMOTE_SHARE_RECEIVED: + return array( + 0 => '',// We can not use 'username' since the user is in a different ownCloud + ); + case self::SUBJECT_REMOTE_SHARE_ACCEPTED: + case self::SUBJECT_REMOTE_SHARE_DECLINED: + case self::SUBJECT_REMOTE_SHARE_UNSHARED: + return array( + 0 => '',// We can not use 'username' since the user is in a different ownCloud + 1 => 'file', + ); + case self::SUBJECT_PUBLIC_SHARED_FOLDER_DOWNLOADED: + case self::SUBJECT_PUBLIC_SHARED_FILE_DOWNLOADED: + return array( + 0 => 'file', + ); + } + } + + return false; + } + + /** + * A string naming the css class for the icon to be used can be returned. + * If no icon is known for the given type false is to be returned. + * + * @param string $type + * @return string|false + */ + public function getTypeIcon($type) { + switch ($type) { + case self::TYPE_REMOTE_SHARE: + return 'icon-share'; + case self::TYPE_PUBLIC_LINKS: + return 'icon-download'; + } + + return false; + } + + /** + * The extension can define the parameter grouping by returning the index as integer. + * In case no grouping is required false is to be returned. + * + * @param array $activity + * @return integer|false + */ + public function getGroupParameter($activity) { + return false; + } + + /** + * The extension can define additional navigation entries. The array returned has to contain two keys 'top' + * and 'apps' which hold arrays with the relevant entries. + * If no further entries are to be added false is no be returned. + * + * @return array|false + */ + public function getNavigation() { + return false; + } + + /** + * The extension can check if a customer filter (given by a query string like filter=abc) is valid or not. + * + * @param string $filterValue + * @return boolean + */ + public function isFilterValid($filterValue) { + return false; + } + + /** + * For a given filter the extension can specify the sql query conditions including parameters for that query. + * In case the extension does not know the filter false is to be returned. + * The query condition and the parameters are to be returned as array with two elements. + * E.g. return array('`app` = ? and `message` like ?', array('mail', 'ownCloud%')); + * + * @param string $filter + * @return array|false + */ + public function getQueryForFilter($filter) { + if ($filter === 'shares') { + return array('`app` = ? and `type` = ?', array('files_sharing', self::TYPE_REMOTE_SHARE)); + } + return false; + } + +} diff --git a/apps/files_sharing/lib/cache.php b/apps/files_sharing/lib/cache.php index 270ed704bbd..21f807f3533 100644 --- a/apps/files_sharing/lib/cache.php +++ b/apps/files_sharing/lib/cache.php @@ -89,16 +89,18 @@ class Shared_Cache extends Cache { $cache = $this->getSourceCache($file); if ($cache) { $data = $cache->get($this->files[$file]); - $data['displayname_owner'] = \OC_User::getDisplayName($this->storage->getSharedFrom()); - $data['path'] = $file; - if ($file === '') { - $data['is_share_mount_point'] = true; - } - $data['uid_owner'] = $this->storage->getOwner($file); - if (isset($data['permissions'])) { - $data['permissions'] &= $this->storage->getPermissions($file); - } else { - $data['permissions'] = $this->storage->getPermissions($file); + if ($data) { + $data['displayname_owner'] = \OC_User::getDisplayName($this->storage->getSharedFrom()); + $data['path'] = $file; + if ($file === '') { + $data['is_share_mount_point'] = true; + } + $data['uid_owner'] = $this->storage->getOwner($file); + if (isset($data['permissions'])) { + $data['permissions'] &= $this->storage->getPermissions($file); + } else { + $data['permissions'] = $this->storage->getPermissions($file); + } } return $data; } @@ -343,6 +345,56 @@ class Shared_Cache extends Cache { } /** + * Checks whether the given file has the given tag. + * + * @param \OCP\ITags $tagger + * @param array $fileData file data + * @param string $tag tag to check for + * @return boolean true if the given file has the expected tag, + * false otherwise + */ + private function hasTag($tagger, $fileData, $tag) { + $tags = $tagger->getTagsForObjects(array((int)$fileData['fileid'])); + return (!empty($tags) && in_array($tag, current($tags))); + } + + /** + * search for files by tag + * + * @param string|int $tag tag to search for + * @param string $userId owner of the tags + * @return array file data + */ + public function searchByTag($tag, $userId) { + // TODO: inject this + $tagger = \OC::$server->getTagManager()->load('files', null, null, $userId); + $result = array(); + $exploreDirs = array(''); + // check if root is tagged + $file = $this->get(''); + if ($this->hasTag($tagger, $file, $tag)) { + $result[] = $file; + } + // FIXME: this is so wrong and unefficient, need to replace with actual DB queries + while (count($exploreDirs) > 0) { + $dir = array_pop($exploreDirs); + $files = $this->getFolderContents($dir); + if (!$files) { + continue; + } + foreach ($files as $file) { + if ($this->hasTag($tagger, $file, $tag)) { + $result[] = $file; + } + if ($file['mimetype'] === 'httpd/unix-directory') { + $exploreDirs[] = ltrim($dir . '/' . $file['name'], '/'); + } + } + } + return $result; + } + + /** * get the size of a folder and set it in the cache * * @param string $path diff --git a/apps/files_sharing/lib/connector/publicauth.php b/apps/files_sharing/lib/connector/publicauth.php index c9d545180b3..a630d091fd4 100644 --- a/apps/files_sharing/lib/connector/publicauth.php +++ b/apps/files_sharing/lib/connector/publicauth.php @@ -48,13 +48,29 @@ class PublicAuth extends \Sabre\DAV\Auth\Backend\AbstractBasic { if (isset($linkItem['share_with'])) { if ($linkItem['share_type'] == \OCP\Share::SHARE_TYPE_LINK) { // Check Password - $forcePortable = (CRYPT_BLOWFISH != 1); - $hasher = new \PasswordHash(8, $forcePortable); - if (!$hasher->CheckPassword($password . $this->config->getSystemValue('passwordsalt', ''), $linkItem['share_with'])) { - return false; - } else { + $newHash = ''; + if(\OC::$server->getHasher()->verify($password, $linkItem['share_with'], $newHash)) { + /** + * FIXME: Migrate old hashes to new hash format + * Due to the fact that there is no reasonable functionality to update the password + * of an existing share no migration is yet performed there. + * The only possibility is to update the existing share which will result in a new + * share ID and is a major hack. + * + * In the future the migration should be performed once there is a proper method + * to update the share's password. (for example `$share->updatePassword($password)` + * + * @link https://github.com/owncloud/core/issues/10671 + */ + if(!empty($newHash)) { + + } return true; + } else { + return false; } + } elseif ($linkItem['share_type'] == \OCP\Share::SHARE_TYPE_REMOTE) { + return true; } else { return false; } diff --git a/apps/files_sharing/lib/controllers/externalsharescontroller.php b/apps/files_sharing/lib/controllers/externalsharescontroller.php new file mode 100644 index 00000000000..773ff8ce981 --- /dev/null +++ b/apps/files_sharing/lib/controllers/externalsharescontroller.php @@ -0,0 +1,86 @@ +<?php +/** + * @author Lukas Reschke <lukas@owncloud.com> + * @copyright 2014 Lukas Reschke + * + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace OCA\Files_Sharing\Controllers; + +use OC; +use OCP; +use OCP\AppFramework\Controller; +use OCP\IRequest; +use OCP\AppFramework\Http\JSONResponse; + +/** + * Class ExternalSharesController + * + * @package OCA\Files_Sharing\Controllers + */ +class ExternalSharesController extends Controller { + + /** @var bool */ + private $incomingShareEnabled; + /** @var \OCA\Files_Sharing\External\Manager */ + private $externalManager; + + /** + * @param string $appName + * @param IRequest $request + * @param \OCA\Files_Sharing\External\Manager $externalManager + */ + public function __construct($appName, + IRequest $request, + $incomingShareEnabled, + \OCA\Files_Sharing\External\Manager $externalManager) { + parent::__construct($appName, $request); + $this->incomingShareEnabled = $incomingShareEnabled; + $this->externalManager = $externalManager; + } + + /** + * @NoAdminRequired + * + * @return JSONResponse + */ + public function index() { + $shares = []; + if ($this->incomingShareEnabled) { + $shares = $this->externalManager->getOpenShares(); + } + return new JSONResponse($shares); + } + + /** + * @NoAdminRequired + * + * @param int $id + * @return JSONResponse + */ + public function create($id) { + if ($this->incomingShareEnabled) { + $this->externalManager->acceptShare($id); + } + + return new JSONResponse(); + } + + /** + * @NoAdminRequired + * + * @param $id + * @return JSONResponse + */ + public function destroy($id) { + if ($this->incomingShareEnabled) { + $this->externalManager->declineShare($id); + } + + return new JSONResponse(); + } + +} diff --git a/apps/files_sharing/lib/controllers/sharecontroller.php b/apps/files_sharing/lib/controllers/sharecontroller.php new file mode 100644 index 00000000000..69de717611c --- /dev/null +++ b/apps/files_sharing/lib/controllers/sharecontroller.php @@ -0,0 +1,282 @@ +<?php +/** + * @author Clark Tomlinson <clark@owncloud.com> + * @author Lukas Reschke <lukas@owncloud.com> + * @copyright 2014 Clark Tomlinson & Lukas Reschke + * + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace OCA\Files_Sharing\Controllers; + +use OC; +use OC\Files\Filesystem; +use OC_Files; +use OC_Util; +use OCP; +use OCP\Template; +use OCP\JSON; +use OCP\Share; +use OCP\AppFramework\Controller; +use OCP\IRequest; +use OCP\AppFramework\Http\TemplateResponse; +use OCP\AppFramework\Http\RedirectResponse; +use OC\URLGenerator; +use OC\AppConfig; +use OCP\ILogger; +use OCA\Files_Sharing\Helper; +use OCP\User; +use OCP\Util; +use OCA\Files_Sharing\Activity; + +/** + * Class ShareController + * + * @package OCA\Files_Sharing\Controllers + */ +class ShareController extends Controller { + + /** @var \OC\User\Session */ + protected $userSession; + /** @var \OC\AppConfig */ + protected $appConfig; + /** @var \OCP\IConfig */ + protected $config; + /** @var \OC\URLGenerator */ + protected $urlGenerator; + /** @var \OC\User\Manager */ + protected $userManager; + /** @var \OCP\ILogger */ + protected $logger; + /** @var OCP\Activity\IManager */ + protected $activityManager; + + /** + * @param string $appName + * @param IRequest $request + * @param OC\User\Session $userSession + * @param AppConfig $appConfig + * @param OCP\IConfig $config + * @param URLGenerator $urlGenerator + * @param OC\User\Manager $userManager + * @param ILogger $logger + * @param OCP\Activity\IManager $activityManager + */ + public function __construct($appName, + IRequest $request, + OC\User\Session $userSession, + AppConfig $appConfig, + OCP\IConfig $config, + URLGenerator $urlGenerator, + OC\User\Manager $userManager, + ILogger $logger, + OCP\Activity\IManager $activityManager) { + parent::__construct($appName, $request); + + $this->userSession = $userSession; + $this->appConfig = $appConfig; + $this->config = $config; + $this->urlGenerator = $urlGenerator; + $this->userManager = $userManager; + $this->logger = $logger; + $this->activityManager = $activityManager; + } + + /** + * @PublicPage + * @NoCSRFRequired + * + * @param string $token + * @return TemplateResponse|RedirectResponse + */ + public function showAuthenticate($token) { + $linkItem = Share::getShareByToken($token, false); + + if(Helper::authenticate($linkItem)) { + return new RedirectResponse($this->urlGenerator->linkToRoute('files_sharing.sharecontroller.showShare', array('token' => $token))); + } + + return new TemplateResponse($this->appName, 'authenticate', array(), 'guest'); + } + + /** + * @PublicPage + * @UseSession + * + * Authenticates against password-protected shares + * @param $token + * @param string $password + * @return RedirectResponse|TemplateResponse + */ + public function authenticate($token, $password = '') { + $linkItem = Share::getShareByToken($token, false); + if($linkItem === false) { + return new TemplateResponse('core', '404', array(), 'guest'); + } + + $authenticate = Helper::authenticate($linkItem, $password); + + if($authenticate === true) { + return new RedirectResponse($this->urlGenerator->linkToRoute('files_sharing.sharecontroller.showShare', array('token' => $token))); + } + + return new TemplateResponse($this->appName, 'authenticate', array('wrongpw' => true), 'guest'); + } + + /** + * @PublicPage + * @NoCSRFRequired + * + * @param string $token + * @param string $path + * @return TemplateResponse + */ + public function showShare($token, $path = '') { + \OC_User::setIncognitoMode(true); + + // Check whether share exists + $linkItem = Share::getShareByToken($token, false); + if($linkItem === false) { + return new TemplateResponse('core', '404', array(), 'guest'); + } + + $linkItem = OCP\Share::getShareByToken($token, false); + $shareOwner = $linkItem['uid_owner']; + $originalSharePath = null; + $rootLinkItem = OCP\Share::resolveReShare($linkItem); + if (isset($rootLinkItem['uid_owner'])) { + OCP\JSON::checkUserExists($rootLinkItem['uid_owner']); + OC_Util::tearDownFS(); + OC_Util::setupFS($rootLinkItem['uid_owner']); + $originalSharePath = Filesystem::getPath($linkItem['file_source']); + } + + // Share is password protected - check whether the user is permitted to access the share + if (isset($linkItem['share_with']) && !Helper::authenticate($linkItem)) { + return new RedirectResponse($this->urlGenerator->linkToRoute('files_sharing.sharecontroller.authenticate', + array('token' => $token))); + } + + if (Filesystem::isReadable($originalSharePath . $path)) { + $getPath = Filesystem::normalizePath($path); + $originalSharePath .= $path; + } + + $file = basename($originalSharePath); + + $shareTmpl = array(); + $shareTmpl['displayName'] = User::getDisplayName($shareOwner); + $shareTmpl['filename'] = $file; + $shareTmpl['directory_path'] = $linkItem['file_target']; + $shareTmpl['mimetype'] = Filesystem::getMimeType($originalSharePath); + $shareTmpl['dirToken'] = $linkItem['token']; + $shareTmpl['sharingToken'] = $token; + $shareTmpl['server2serversharing'] = Helper::isOutgoingServer2serverShareEnabled(); + $shareTmpl['protected'] = isset($linkItem['share_with']) ? 'true' : 'false'; + $shareTmpl['dir'] = ''; + $shareTmpl['fileSize'] = \OCP\Util::humanFileSize(\OC\Files\Filesystem::filesize($originalSharePath)); + + // Show file list + if (Filesystem::is_dir($originalSharePath)) { + $shareTmpl['dir'] = $getPath; + $files = array(); + $maxUploadFilesize = Util::maxUploadFilesize($originalSharePath); + $freeSpace = Util::freeSpace($originalSharePath); + $uploadLimit = Util::uploadLimit(); + $folder = new Template('files', 'list', ''); + $folder->assign('dir', $getPath); + $folder->assign('dirToken', $linkItem['token']); + $folder->assign('permissions', \OCP\Constants::PERMISSION_READ); + $folder->assign('isPublic', true); + $folder->assign('publicUploadEnabled', 'no'); + $folder->assign('files', $files); + $folder->assign('uploadMaxFilesize', $maxUploadFilesize); + $folder->assign('uploadMaxHumanFilesize', OCP\Util::humanFileSize($maxUploadFilesize)); + $folder->assign('freeSpace', $freeSpace); + $folder->assign('uploadLimit', $uploadLimit); // PHP upload limit + $folder->assign('usedSpacePercent', 0); + $folder->assign('trash', false); + $shareTmpl['folder'] = $folder->fetchPage(); + } + + $shareTmpl['downloadURL'] = $this->urlGenerator->linkToRouteAbsolute('files_sharing.sharecontroller.downloadShare', array('token' => $token)); + + return new TemplateResponse($this->appName, 'public', $shareTmpl, 'base'); + } + + /** + * @PublicPage + * @NoCSRFRequired + * + * @param string $token + * @param string $files + * @param string $path + * @return void|RedirectResponse + */ + public function downloadShare($token, $files = null, $path = '') { + \OC_User::setIncognitoMode(true); + + $linkItem = OCP\Share::getShareByToken($token, false); + + // Share is password protected - check whether the user is permitted to access the share + if (isset($linkItem['share_with'])) { + if(!Helper::authenticate($linkItem)) { + return new RedirectResponse($this->urlGenerator->linkToRoute('files_sharing.sharecontroller.authenticate', + array('token' => $token))); + } + } + + $originalSharePath = self::getPath($token); + + if (isset($originalSharePath) && Filesystem::isReadable($originalSharePath . $path)) { + $originalSharePath = Filesystem::normalizePath($originalSharePath . $path); + $type = \OC\Files\Filesystem::is_dir($originalSharePath) ? 'folder' : 'file'; + $args = $type === 'folder' ? array('dir' => $originalSharePath) : array('dir' => dirname($originalSharePath), 'scrollto' => basename($originalSharePath)); + $linkToFile = \OCP\Util::linkToAbsolute('files', 'index.php', $args); + $subject = $type === 'folder' ? Activity::SUBJECT_PUBLIC_SHARED_FOLDER_DOWNLOADED : Activity::SUBJECT_PUBLIC_SHARED_FILE_DOWNLOADED; + $this->activityManager->publishActivity( + 'files_sharing', $subject, array($originalSharePath), '', array(), $originalSharePath, + $linkToFile, $linkItem['uid_owner'], Activity::TYPE_PUBLIC_LINKS, Activity::PRIORITY_MEDIUM); + } + + if (!is_null($files)) { // download selected files + $files_list = json_decode($files); + // in case we get only a single file + if ($files_list === NULL) { + $files_list = array($files); + } + + // FIXME: The exit is required here because otherwise the AppFramework is trying to add headers as well + // after dispatching the request which results in a "Cannot modify header information" notice. + OC_Files::get($originalSharePath, $files_list, $_SERVER['REQUEST_METHOD'] == 'HEAD'); + exit(); + } else { + // FIXME: The exit is required here because otherwise the AppFramework is trying to add headers as well + // after dispatching the request which results in a "Cannot modify header information" notice. + OC_Files::get(dirname($originalSharePath), basename($originalSharePath), $_SERVER['REQUEST_METHOD'] == 'HEAD'); + exit(); + } + } + + /** + * @param $token + * @return null|string + */ + private function getPath($token) { + $linkItem = Share::getShareByToken($token, false); + $path = null; + if (is_array($linkItem) && isset($linkItem['uid_owner'])) { + // seems to be a valid share + $rootLinkItem = Share::resolveReShare($linkItem); + if (isset($rootLinkItem['uid_owner'])) { + JSON::checkUserExists($rootLinkItem['uid_owner']); + OC_Util::tearDownFS(); + OC_Util::setupFS($rootLinkItem['uid_owner']); + $path = Filesystem::getPath($linkItem['file_source']); + } + } + return $path; + } +} diff --git a/apps/files_sharing/lib/external/manager.php b/apps/files_sharing/lib/external/manager.php index 8176302a86a..665e47c0fe9 100644 --- a/apps/files_sharing/lib/external/manager.php +++ b/apps/files_sharing/lib/external/manager.php @@ -24,7 +24,7 @@ class Manager { private $mountManager; /** - * @var \OC\Files\Storage\Loader + * @var \OC\Files\Storage\StorageFactory */ private $storageLoader; @@ -34,31 +34,41 @@ class Manager { private $userSession; /** + * @var \OC\HTTPHelper + */ + private $httpHelper; + + /** * @param \OCP\IDBConnection $connection * @param \OC\Files\Mount\Manager $mountManager * @param \OC\User\Session $userSession - * @param \OC\Files\Storage\Loader $storageLoader + * @param \OC\Files\Storage\StorageFactory $storageLoader */ public function __construct(\OCP\IDBConnection $connection, \OC\Files\Mount\Manager $mountManager, - \OC\Files\Storage\Loader $storageLoader, \OC\User\Session $userSession) { + \OC\Files\Storage\StorageFactory $storageLoader, \OC\User\Session $userSession, \OC\HTTPHelper $httpHelper) { $this->connection = $connection; $this->mountManager = $mountManager; $this->userSession = $userSession; $this->storageLoader = $storageLoader; + $this->httpHelper = $httpHelper; } - public function addShare($remote, $token, $password, $name, $owner) { - $user = $this->userSession->getUser(); - if ($user) { - $query = $this->connection->prepare(' + public function addShare($remote, $token, $password, $name, $owner, $accepted=false, $user = null, $remoteId = -1) { + + $user = $user ? $user: $this->userSession->getUser()->getUID(); + $accepted = $accepted ? 1 : 0; + + $mountPoint = Filesystem::normalizePath('/' . $name); + + $query = $this->connection->prepare(' INSERT INTO `*PREFIX*share_external` - (`remote`, `share_token`, `password`, `name`, `owner`, `user`, `mountpoint`, `mountpoint_hash`) - VALUES (?, ?, ?, ?, ?, ?, ?, ?) + (`remote`, `share_token`, `password`, `name`, `owner`, `user`, `mountpoint`, `mountpoint_hash`, `accepted`, `remote_id`) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) '); - $mountPoint = Filesystem::normalizePath('/' . $name); - $hash = md5($mountPoint); - $query->execute(array($remote, $token, $password, $name, $owner, $user->getUID(), $mountPoint, $hash)); + $hash = md5($mountPoint); + $query->execute(array($remote, $token, $password, $name, $owner, $user, $mountPoint, $hash, $accepted, $remoteId)); + if ($accepted) { $options = array( 'remote' => $remote, 'token' => $token, @@ -81,9 +91,9 @@ class Manager { $query = $this->connection->prepare(' SELECT `remote`, `share_token`, `password`, `mountpoint`, `owner` FROM `*PREFIX*share_external` - WHERE `user` = ? + WHERE `user` = ? AND `accepted` = ? '); - $query->execute(array($user->getUID())); + $query->execute(array($user->getUID(), 1)); while ($row = $query->fetch()) { $row['manager'] = $this; @@ -93,12 +103,85 @@ class Manager { } } + /** + * get share + * + * @param int $id share id + * @return mixed share of false + */ + private function getShare($id) { + $getShare = $this->connection->prepare(' + SELECT `remote`, `share_token` + FROM `*PREFIX*share_external` + WHERE `id` = ? AND `user` = ?'); + $result = $getShare->execute(array($id, $this->userSession->getUser()->getUID())); + + return $result ? $getShare->fetch() : false; + } + + /** + * accept server-to-server share + * + * @param int $id + */ + public function acceptShare($id) { + + $share = $this->getShare($id); + + if ($share) { + $acceptShare = $this->connection->prepare(' + UPDATE `*PREFIX*share_external` + SET `accepted` = ? + WHERE `id` = ? AND `user` = ?'); + $acceptShare->execute(array(1, $id, $this->userSession->getUser()->getUID())); + $this->sendFeedbackToRemote($share['remote'], $share['share_token'], $id, 'accept'); + } + } + + /** + * decline server-to-server share + * + * @param int $id + */ + public function declineShare($id) { + + $share = $this->getShare($id); + + if ($share) { + $removeShare = $this->connection->prepare(' + DELETE FROM `*PREFIX*share_external` WHERE `id` = ? AND `user` = ?'); + $removeShare->execute(array($id, $this->userSession->getUser()->getUID())); + $this->sendFeedbackToRemote($share['remote'], $share['share_token'], $id, 'decline'); + } + } + + /** + * inform remote server whether server-to-server share was accepted/declined + * + * @param string $remote + * @param string $token + * @param int $id + * @param string $feedback + * @return boolean + */ + private function sendFeedbackToRemote($remote, $token, $id, $feedback) { + + $url = $remote . \OCP\Share::BASE_PATH_TO_SHARE_API . '/' . $id . '/' . $feedback . '?format=' . \OCP\Share::RESPONSE_FORMAT; + $fields = array('token' => $token); + + $result = $this->httpHelper->post($url, $fields); + $status = json_decode($result['result'], true); + + return ($result['success'] && $status['ocs']['meta']['statuscode'] === 100); + } + public static function setup() { $externalManager = new \OCA\Files_Sharing\External\Manager( - \OC::$server->getDatabaseConnection(), - \OC\Files\Filesystem::getMountManager(), - \OC\Files\Filesystem::getLoader(), - \OC::$server->getUserSession() + \OC::$server->getDatabaseConnection(), + \OC\Files\Filesystem::getMountManager(), + \OC\Files\Filesystem::getLoader(), + \OC::$server->getUserSession(), + \OC::$server->getHTTPHelper() ); $externalManager->setupMounts(); } @@ -157,6 +240,18 @@ class Manager { $user = $this->userSession->getUser(); $mountPoint = $this->stripPath($mountPoint); $hash = md5($mountPoint); + + $getShare = $this->connection->prepare(' + SELECT `remote`, `share_token`, `remote_id` + FROM `*PREFIX*share_external` + WHERE `mountpoint_hash` = ? AND `user` = ?'); + $result = $getShare->execute(array($hash, $user->getUID())); + + if ($result) { + $share = $getShare->fetch(); + $this->sendFeedbackToRemote($share['remote'], $share['share_token'], $share['remote_id'], 'decline'); + } + $query = $this->connection->prepare(' DELETE FROM `*PREFIX*share_external` WHERE `mountpoint_hash` = ? @@ -164,4 +259,17 @@ class Manager { '); return (bool)$query->execute(array($hash, $user->getUID())); } -} + + /** + * return a list of shares which are not yet accepted by the user + * + * @return array list of open server-to-server shares + */ + public function getOpenShares() { + $openShares = $this->connection->prepare('SELECT * FROM `*PREFIX*share_external` WHERE `accepted` = ? AND `user` = ?'); + $result = $openShares->execute(array(0, $this->userSession->getUser()->getUID())); + + return $result ? $openShares->fetchAll() : array(); + + } +}
\ No newline at end of file diff --git a/apps/files_sharing/lib/external/mount.php b/apps/files_sharing/lib/external/mount.php index e564dded69a..6fd9882cb2a 100644 --- a/apps/files_sharing/lib/external/mount.php +++ b/apps/files_sharing/lib/external/mount.php @@ -8,9 +8,10 @@ namespace OCA\Files_Sharing\External; +use OC\Files\Mount\MountPoint; use OC\Files\Mount\MoveableMount; -class Mount extends \OC\Files\Mount\Mount implements MoveableMount { +class Mount extends MountPoint implements MoveableMount { /** * @var \OCA\Files_Sharing\External\Manager @@ -22,7 +23,7 @@ class Mount extends \OC\Files\Mount\Mount implements MoveableMount { * @param string $mountpoint * @param array $options * @param \OCA\Files_Sharing\External\Manager $manager - * @param \OC\Files\Storage\Loader $loader + * @param \OC\Files\Storage\StorageFactory $loader */ public function __construct($storage, $mountpoint, $options, $manager, $loader = null) { parent::__construct($storage, $mountpoint, $options, $loader); diff --git a/apps/files_sharing/lib/external/storage.php b/apps/files_sharing/lib/external/storage.php index 3f1d631a35f..306a7b8db8a 100644 --- a/apps/files_sharing/lib/external/storage.php +++ b/apps/files_sharing/lib/external/storage.php @@ -167,6 +167,14 @@ class Storage extends DAV implements ISharedStorage { } } + public function file_exists($path) { + if ($path === '') { + return true; + } else { + return parent::file_exists($path); + } + } + /** * check if the configured remote is a valid ownCloud instance * diff --git a/apps/files_sharing/lib/helper.php b/apps/files_sharing/lib/helper.php index e7ca4fcccd4..001d0387fa4 100644 --- a/apps/files_sharing/lib/helper.php +++ b/apps/files_sharing/lib/helper.php @@ -2,9 +2,6 @@ namespace OCA\Files_Sharing; -use OC_Config; -use PasswordHash; - class Helper { public static function registerHooks() { @@ -66,7 +63,7 @@ class Helper { exit(); } - if (isset($linkItem['share_with'])) { + if (isset($linkItem['share_with']) && (int)$linkItem['share_type'] === \OCP\Share::SHARE_TYPE_LINK) { if (!self::authenticate($linkItem, $password)) { \OC_Response::setStatus(403); \OCP\JSON::error(array('success' => false)); @@ -95,18 +92,32 @@ class Helper { * * @return boolean true if authorized, false otherwise */ - public static function authenticate($linkItem, $password) { + public static function authenticate($linkItem, $password = null) { if ($password !== null) { if ($linkItem['share_type'] == \OCP\Share::SHARE_TYPE_LINK) { // Check Password - $forcePortable = (CRYPT_BLOWFISH != 1); - $hasher = new PasswordHash(8, $forcePortable); - if (!($hasher->CheckPassword($password.OC_Config::getValue('passwordsalt', ''), - $linkItem['share_with']))) { - return false; - } else { + $newHash = ''; + if(\OC::$server->getHasher()->verify($password, $linkItem['share_with'], $newHash)) { // Save item id in session for future requests \OC::$server->getSession()->set('public_link_authenticated', $linkItem['id']); + + /** + * FIXME: Migrate old hashes to new hash format + * Due to the fact that there is no reasonable functionality to update the password + * of an existing share no migration is yet performed there. + * The only possibility is to update the existing share which will result in a new + * share ID and is a major hack. + * + * In the future the migration should be performed once there is a proper method + * to update the share's password. (for example `$share->updatePassword($password)` + * + * @link https://github.com/owncloud/core/issues/10671 + */ + if(!empty($newHash)) { + + } + } else { + return false; } } else { \OCP\Util::writeLog('share', 'Unknown share type '.$linkItem['share_type'] @@ -243,7 +254,7 @@ class Helper { * @return string */ public static function getShareFolder() { - $shareFolder = \OCP\Config::getSystemValue('share_folder', '/'); + $shareFolder = \OC::$server->getConfig()->getSystemValue('share_folder', '/'); return \OC\Files\Filesystem::normalizePath($shareFolder); } @@ -254,7 +265,7 @@ class Helper { * @param string $shareFolder */ public static function setShareFolder($shareFolder) { - \OCP\Config::setSystemValue('share_folder', $shareFolder); + \OC::$server->getConfig()->setSystemValue('share_folder', $shareFolder); } } diff --git a/apps/files_sharing/lib/middleware/sharingcheckmiddleware.php b/apps/files_sharing/lib/middleware/sharingcheckmiddleware.php new file mode 100644 index 00000000000..af79cd9e94a --- /dev/null +++ b/apps/files_sharing/lib/middleware/sharingcheckmiddleware.php @@ -0,0 +1,84 @@ +<?php +/** + * @author Lukas Reschke + * @copyright 2014 Lukas Reschke lukas@owncloud.com + * + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace OCA\Files_Sharing\Middleware; + +use OCP\AppFramework\IApi; +use \OCP\AppFramework\Middleware; +use OCP\AppFramework\Http\TemplateResponse; +use OCP\IAppConfig; + +/** + * Checks whether the "sharing check" is enabled + * + * @package OCA\Files_Sharing\Middleware + */ +class SharingCheckMiddleware extends Middleware { + + /** @var string */ + protected $appName; + /** @var IAppConfig */ + protected $appConfig; + /** @var IApi */ + protected $api; + + /*** + * @param string $appName + * @param IAppConfig $appConfig + * @param IApi $api + */ + public function __construct($appName, + IAppConfig $appConfig, + IApi $api) { + $this->appName = $appName; + $this->appConfig = $appConfig; + $this->api = $api; + } + + /** + * Check if sharing is enabled before the controllers is executed + */ + public function beforeController($controller, $methodName) { + if(!$this->isSharingEnabled()) { + throw new \Exception('Sharing is disabled.'); + } + } + + /** + * Return 404 page in case of an exception + * @param \OCP\AppFramework\Controller $controller + * @param string $methodName + * @param \Exception $exception + * @return TemplateResponse + */ + public function afterException($controller, $methodName, \Exception $exception){ + return new TemplateResponse('core', '404', array(), 'guest'); + } + + /** + * Check whether sharing is enabled + * @return bool + */ + private function isSharingEnabled() { + // FIXME: This check is done here since the route is globally defined and not inside the files_sharing app + // Check whether the sharing application is enabled + if(!$this->api->isAppEnabled($this->appName)) { + return false; + } + + // Check whether public sharing is enabled + if($this->appConfig->getValue('core', 'shareapi_allow_links', 'yes') !== 'yes') { + return false; + } + + return true; + } + +} diff --git a/apps/files_sharing/lib/readonlycache.php b/apps/files_sharing/lib/readonlycache.php index f129ca49433..6dd3b9cf61d 100644 --- a/apps/files_sharing/lib/readonlycache.php +++ b/apps/files_sharing/lib/readonlycache.php @@ -13,14 +13,14 @@ use OC\Files\Cache\Cache; class ReadOnlyCache extends Cache { public function get($path) { $data = parent::get($path); - $data['permissions'] &= (\OCP\PERMISSION_READ | \OCP\PERMISSION_SHARE); + $data['permissions'] &= (\OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_SHARE); return $data; } public function getFolderContents($path) { $content = parent::getFolderContents($path); foreach ($content as &$data) { - $data['permissions'] &= (\OCP\PERMISSION_READ | \OCP\PERMISSION_SHARE); + $data['permissions'] &= (\OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_SHARE); } return $content; } diff --git a/apps/files_sharing/lib/readonlywrapper.php b/apps/files_sharing/lib/readonlywrapper.php index 45ed3fd68bb..58a5695aff8 100644 --- a/apps/files_sharing/lib/readonlywrapper.php +++ b/apps/files_sharing/lib/readonlywrapper.php @@ -24,7 +24,7 @@ class ReadOnlyWrapper extends Wrapper { } public function getPermissions($path) { - return $this->storage->getPermissions($path) & (\OCP\PERMISSION_READ | \OCP\PERMISSION_SHARE); + return $this->storage->getPermissions($path) & (\OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_SHARE); } public function rename($path1, $path2) { diff --git a/apps/files_sharing/lib/share/file.php b/apps/files_sharing/lib/share/file.php index a5b4e75bceb..1d7eb77f7cf 100644 --- a/apps/files_sharing/lib/share/file.php +++ b/apps/files_sharing/lib/share/file.php @@ -160,6 +160,20 @@ class OC_Share_Backend_File implements OCP\Share_Backend_File_Dependent { } /** + * check if server2server share is enabled + * + * @param int $shareType + * @return boolean + */ + public function isShareTypeAllowed($shareType) { + if ($shareType === \OCP\Share::SHARE_TYPE_REMOTE) { + return \OCA\Files_Sharing\Helper::isOutgoingServer2serverShareEnabled(); + } + + return true; + } + + /** * resolve reshares to return the correct source item * @param array $source * @return array source item @@ -199,7 +213,9 @@ class OC_Share_Backend_File implements OCP\Share_Backend_File_Dependent { if ($itemType === 'folder') { $source = \OCP\Share::getItemSharedWith('folder', $mountPoint, \OC_Share_Backend_File::FORMAT_SHARED_STORAGE); if ($source && $target !== '') { - $source['path'] = $source['path'].'/'.$target; + // note: in case of ext storage mount points the path might be empty + // which would cause a leading slash to appear + $source['path'] = ltrim($source['path'] . '/' . $target, '/'); } } else { $source = \OCP\Share::getItemSharedWith('file', $mountPoint, \OC_Share_Backend_File::FORMAT_SHARED_STORAGE); diff --git a/apps/files_sharing/lib/share/folder.php b/apps/files_sharing/lib/share/folder.php index 2671f5738b7..f86e9624432 100644 --- a/apps/files_sharing/lib/share/folder.php +++ b/apps/files_sharing/lib/share/folder.php @@ -26,13 +26,14 @@ class OC_Share_Backend_Folder extends OC_Share_Backend_File implements OCP\Share * * @param int $itemSource item source ID * @param string $shareWith with whom should the item be shared + * @param string $owner owner of the item * @return array with shares */ - public function getParents($itemSource, $shareWith = null) { + public function getParents($itemSource, $shareWith = null, $owner = null) { $result = array(); $parent = $this->getParentId($itemSource); while ($parent) { - $shares = \OCP\Share::getItemSharedWithUser('folder', $parent, $shareWith); + $shares = \OCP\Share::getItemSharedWithUser('folder', $parent, $shareWith, $owner); if ($shares) { foreach ($shares as $share) { $name = substr($share['path'], strrpos($share['path'], '/') + 1); diff --git a/apps/files_sharing/lib/sharedmount.php b/apps/files_sharing/lib/sharedmount.php index 4ad2d4e6b3e..d16dbf89ccf 100644 --- a/apps/files_sharing/lib/sharedmount.php +++ b/apps/files_sharing/lib/sharedmount.php @@ -8,13 +8,13 @@ namespace OCA\Files_Sharing; -use OC\Files\Mount\Mount; +use OC\Files\Mount\MountPoint; use OC\Files\Mount\MoveableMount; /** * Shared mount points can be moved by the user */ -class SharedMount extends Mount implements MoveableMount { +class SharedMount extends MountPoint implements MoveableMount { /** * @var \OC\Files\Storage\Shared $storage */ @@ -22,15 +22,15 @@ class SharedMount extends Mount implements MoveableMount { public function __construct($storage, $mountpoint, $arguments = null, $loader = null) { // first update the mount point before creating the parent - $newMountPoint = self::verifyMountPoint($arguments['share']); - $absMountPoint = '/' . \OCP\User::getUser() . '/files' . $newMountPoint; + $newMountPoint = $this->verifyMountPoint($arguments['share'], $arguments['user']); + $absMountPoint = '/' . $arguments['user'] . '/files' . $newMountPoint; parent::__construct($storage, $absMountPoint, $arguments, $loader); } /** * check if the parent folder exists otherwise move the mount point up */ - private static function verifyMountPoint(&$share) { + private function verifyMountPoint(&$share, $user) { $mountPoint = basename($share['file_target']); $parent = dirname($share['file_target']); @@ -42,7 +42,7 @@ class SharedMount extends Mount implements MoveableMount { $newMountPoint = \OCA\Files_Sharing\Helper::generateUniqueTarget( \OC\Files\Filesystem::normalizePath($parent . '/' . $mountPoint), array(), - new \OC\Files\View('/' . \OCP\User::getUser() . '/files') + new \OC\Files\View('/' . $user . '/files') ); if($newMountPoint !== $share['file_target']) { diff --git a/apps/files_sharing/lib/sharedstorage.php b/apps/files_sharing/lib/sharedstorage.php index 5ce15d9a012..1ac57053e25 100644 --- a/apps/files_sharing/lib/sharedstorage.php +++ b/apps/files_sharing/lib/sharedstorage.php @@ -67,7 +67,7 @@ class Shared extends \OC\Files\Storage\Common implements ISharedStorage { if ($source) { $source['path'] .= '.part'; // All partial files have delete permission - $source['permissions'] |= \OCP\PERMISSION_DELETE; + $source['permissions'] |= \OCP\Constants::PERMISSION_DELETE; } } else { $source = \OC_Share_Backend_File::getSource($target, $this->getMountPoint(), $this->getItemType()); @@ -109,11 +109,11 @@ class Shared extends \OC\Files\Storage\Common implements ISharedStorage { $permissions = $this->share['permissions']; // part files and the mount point always have delete permissions if ($target === '' || pathinfo($target, PATHINFO_EXTENSION) === 'part') { - $permissions |= \OCP\PERMISSION_DELETE; + $permissions |= \OCP\Constants::PERMISSION_DELETE; } if (\OC_Util::isSharingDisabledForUser()) { - $permissions &= ~\OCP\PERMISSION_SHARE; + $permissions &= ~\OCP\Constants::PERMISSION_SHARE; } return $permissions; @@ -197,7 +197,7 @@ class Shared extends \OC\Files\Storage\Common implements ISharedStorage { } public function isCreatable($path) { - return ($this->getPermissions($path) & \OCP\PERMISSION_CREATE); + return ($this->getPermissions($path) & \OCP\Constants::PERMISSION_CREATE); } public function isReadable($path) { @@ -205,18 +205,18 @@ class Shared extends \OC\Files\Storage\Common implements ISharedStorage { } public function isUpdatable($path) { - return ($this->getPermissions($path) & \OCP\PERMISSION_UPDATE); + return ($this->getPermissions($path) & \OCP\Constants::PERMISSION_UPDATE); } public function isDeletable($path) { - return ($this->getPermissions($path) & \OCP\PERMISSION_DELETE); + return ($this->getPermissions($path) & \OCP\Constants::PERMISSION_DELETE); } public function isSharable($path) { if (\OCP\Util::isSharingDisabledForUser()) { return false; } - return ($this->getPermissions($path) & \OCP\PERMISSION_SHARE); + return ($this->getPermissions($path) & \OCP\Constants::PERMISSION_SHARE); } public function file_exists($path) { @@ -397,7 +397,7 @@ class Shared extends \OC\Files\Storage\Common implements ISharedStorage { } public static function setup($options) { - $shares = \OCP\Share::getItemsSharedWith('file'); + $shares = \OCP\Share::getItemsSharedWithUser('file', $options['user']); $manager = Filesystem::getMountManager(); $loader = Filesystem::getLoader(); if (!\OCP\User::isLoggedIn() || \OCP\User::getUser() != $options['user'] @@ -411,7 +411,8 @@ class Shared extends \OC\Files\Storage\Common implements ISharedStorage { $options['user_dir'] . '/' . $share['file_target'], array( 'share' => $share, - ), + 'user' => $options['user'] + ), $loader ); $manager->addMount($mount); diff --git a/apps/files_sharing/lib/updater.php b/apps/files_sharing/lib/updater.php index a34140f5a35..9d8ae7cbb4f 100644 --- a/apps/files_sharing/lib/updater.php +++ b/apps/files_sharing/lib/updater.php @@ -161,7 +161,10 @@ class Shared_Updater { */ static public function postUnshareHook($params) { - if ($params['itemType'] === 'file' || $params['itemType'] === 'folder') { + // only update etags for file/folders shared to local users/groups + if (($params['itemType'] === 'file' || $params['itemType'] === 'folder') && + $params['shareType'] !== \OCP\Share::SHARE_TYPE_LINK && + $params['shareType'] !== \OCP\Share::SHARE_TYPE_REMOTE) { $deletedShares = isset($params['deletedShares']) ? $params['deletedShares'] : array(); @@ -212,7 +215,7 @@ class Shared_Updater { /** * rename mount point from the children if the parent was renamed - * + * * @param string $oldPath old path relative to data/user/files * @param string $newPath new path relative to data/user/files */ diff --git a/apps/files_sharing/public.php b/apps/files_sharing/public.php index 4320c105103..d9d14f67c33 100644 --- a/apps/files_sharing/public.php +++ b/apps/files_sharing/public.php @@ -1,205 +1,17 @@ <?php -// Load other apps for file previews -use OCA\Files_Sharing\Helper; - -OC_App::loadApps(); - -$appConfig = \OC::$server->getAppConfig(); - -if ($appConfig->getValue('core', 'shareapi_allow_links', 'yes') !== 'yes') { - header('HTTP/1.0 404 Not Found'); - $tmpl = new OCP\Template('', '404', 'guest'); - $tmpl->printPage(); - exit(); -} - -// Legacy sharing links via public.php have the token in $GET['t'] -if (isset($_GET['t'])) { - $token = $_GET['t']; -} - -if (isset($token)) { - $linkItem = OCP\Share::getShareByToken($token, false); - if (is_array($linkItem) && isset($linkItem['uid_owner'])) { - // seems to be a valid share - $type = $linkItem['item_type']; - $fileSource = $linkItem['file_source']; - $shareOwner = $linkItem['uid_owner']; - $path = null; - $rootLinkItem = OCP\Share::resolveReShare($linkItem); - if (isset($rootLinkItem['uid_owner'])) { - OCP\JSON::checkUserExists($rootLinkItem['uid_owner']); - OC_Util::tearDownFS(); - OC_Util::setupFS($rootLinkItem['uid_owner']); - $path = \OC\Files\Filesystem::getPath($linkItem['file_source']); - } - } -} -if (isset($path)) { - if (!isset($linkItem['item_type'])) { - OCP\Util::writeLog('share', 'No item type set for share id: ' . $linkItem['id'], \OCP\Util::ERROR); - header('HTTP/1.0 404 Not Found'); - $tmpl = new OCP\Template('', '404', 'guest'); - $tmpl->printPage(); - exit(); - } - if (isset($linkItem['share_with'])) { - // Authenticate share_with - $url = OCP\Util::linkToPublic('files') . '&t=' . $token; - if (isset($_GET['file'])) { - $url .= '&file=' . urlencode($_GET['file']); - } else { - if (isset($_GET['dir'])) { - $url .= '&dir=' . urlencode($_GET['dir']); - } - } - if (isset($_POST['password'])) { - $password = $_POST['password']; - if ($linkItem['share_type'] == OCP\Share::SHARE_TYPE_LINK) { - // Check Password - $forcePortable = (CRYPT_BLOWFISH != 1); - $hasher = new PasswordHash(8, $forcePortable); - if (!($hasher->CheckPassword($password.OC_Config::getValue('passwordsalt', ''), - $linkItem['share_with']))) { - OCP\Util::addStyle('files_sharing', 'authenticate'); - $tmpl = new OCP\Template('files_sharing', 'authenticate', 'guest'); - $tmpl->assign('URL', $url); - $tmpl->assign('wrongpw', true); - $tmpl->printPage(); - exit(); - } else { - // Save item id in session for future requests - \OC::$server->getSession()->set('public_link_authenticated', $linkItem['id']); - } - } else { - OCP\Util::writeLog('share', 'Unknown share type '.$linkItem['share_type'] - .' for share id '.$linkItem['id'], \OCP\Util::ERROR); - header('HTTP/1.0 404 Not Found'); - $tmpl = new OCP\Template('', '404', 'guest'); - $tmpl->printPage(); - exit(); - } - - } else { - // Check if item id is set in session - if ( ! \OC::$server->getSession()->exists('public_link_authenticated') - || \OC::$server->getSession()->get('public_link_authenticated') !== $linkItem['id'] - ) { - // Prompt for password - OCP\Util::addStyle('files_sharing', 'authenticate'); - $tmpl = new OCP\Template('files_sharing', 'authenticate', 'guest'); - $tmpl->assign('URL', $url); - $tmpl->printPage(); - exit(); - } - } - } - $basePath = $path; - $rootName = \OC_Util::basename($path); - if (isset($_GET['path']) && \OC\Files\Filesystem::isReadable($basePath . $_GET['path'])) { - $getPath = \OC\Files\Filesystem::normalizePath($_GET['path']); - $path .= $getPath; - } else { - $getPath = ''; - } - $dir = dirname($path); - $file = basename($path); - // Download the file - if (isset($_GET['download'])) { - if (!\OCP\App::isEnabled('files_encryption')) { - // encryption app requires the session to store the keys in - \OC::$server->getSession()->close(); - } - if (isset($_GET['files'])) { // download selected files - $files = $_GET['files']; - $files_list = json_decode($files); - // in case we get only a single file - if (!is_array($files_list)) { - $files_list = array($files); - } - OC_Files::get($path, $files_list, $_SERVER['REQUEST_METHOD'] == 'HEAD'); - } else { - OC_Files::get($dir, $file, $_SERVER['REQUEST_METHOD'] == 'HEAD'); - } - exit(); - } else { - OCP\Util::addScript('files', 'file-upload'); - OCP\Util::addStyle('files_sharing', 'public'); - OCP\Util::addStyle('files_sharing', 'mobile'); - OCP\Util::addScript('files_sharing', 'public'); - OCP\Util::addScript('files', 'fileactions'); - OCP\Util::addScript('files', 'jquery.iframe-transport'); - OCP\Util::addScript('files', 'jquery.fileupload'); - $maxUploadFilesize=OCP\Util::maxUploadFilesize($path); - $tmpl = new OCP\Template('files_sharing', 'public', 'base'); - $tmpl->assign('displayName', \OCP\User::getDisplayName($shareOwner)); - $tmpl->assign('filename', $file); - $tmpl->assign('directory_path', $linkItem['file_target']); - $tmpl->assign('mimetype', \OC\Files\Filesystem::getMimeType($path)); - $tmpl->assign('dirToken', $linkItem['token']); - $tmpl->assign('sharingToken', $token); - $tmpl->assign('server2serversharing', Helper::isOutgoingServer2serverShareEnabled()); - $tmpl->assign('protected', isset($linkItem['share_with']) ? 'true' : 'false'); - - $urlLinkIdentifiers= (isset($token)?'&t='.$token:'') - .(isset($_GET['dir'])?'&dir='.$_GET['dir']:'') - .(isset($_GET['file'])?'&file='.$_GET['file']:''); - // Show file list - if (\OC\Files\Filesystem::is_dir($path)) { - $tmpl->assign('dir', $getPath); - - OCP\Util::addStyle('files', 'files'); - OCP\Util::addStyle('files', 'upload'); - OCP\Util::addScript('files', 'filesummary'); - OCP\Util::addScript('files', 'breadcrumb'); - OCP\Util::addScript('files', 'files'); - OCP\Util::addScript('files', 'filelist'); - OCP\Util::addscript('files', 'keyboardshortcuts'); - $files = array(); - $rootLength = strlen($basePath) + 1; - $maxUploadFilesize=OCP\Util::maxUploadFilesize($path); - - $freeSpace=OCP\Util::freeSpace($path); - $uploadLimit=OCP\Util::uploadLimit(); - $folder = new OCP\Template('files', 'list', ''); - $folder->assign('dir', $getPath); - $folder->assign('dirToken', $linkItem['token']); - $folder->assign('permissions', OCP\PERMISSION_READ); - $folder->assign('isPublic', true); - $folder->assign('publicUploadEnabled', 'no'); - $folder->assign('files', $files); - $folder->assign('uploadMaxFilesize', $maxUploadFilesize); - $folder->assign('uploadMaxHumanFilesize', OCP\Util::humanFileSize($maxUploadFilesize)); - $folder->assign('freeSpace', $freeSpace); - $folder->assign('uploadLimit', $uploadLimit); // PHP upload limit - $folder->assign('usedSpacePercent', 0); - $folder->assign('trash', false); - $tmpl->assign('folder', $folder->fetchPage()); - $tmpl->assign('downloadURL', - OCP\Util::linkToPublic('files') . $urlLinkIdentifiers . '&download&path=' . urlencode($getPath)); - } else { - $tmpl->assign('dir', $dir); - - // Show file preview if viewer is available - if ($type == 'file') { - $tmpl->assign('downloadURL', OCP\Util::linkToPublic('files') . $urlLinkIdentifiers . '&download'); - } else { - $tmpl->assign('downloadURL', OCP\Util::linkToPublic('files') - .$urlLinkIdentifiers.'&download&path='.urlencode($getPath)); - } - } - $tmpl->printPage(); - } - exit(); -} else { - OCP\Util::writeLog('share', 'could not resolve linkItem', \OCP\Util::DEBUG); -} - -$errorTemplate = new OCP\Template('files_sharing', 'part.404', ''); -$errorContent = $errorTemplate->fetchPage(); - -header('HTTP/1.0 404 Not Found'); -OCP\Util::addStyle('files_sharing', '404'); -$tmpl = new OCP\Template('', '404', 'guest'); -$tmpl->assign('content', $errorContent); -$tmpl->printPage(); +/** + * @author Lukas Reschke + * @copyright 2014 Lukas Reschke lukas@owncloud.com + * + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +// This file is just used to redirect the legacy sharing URLs (< ownCloud 8) to the new ones + +$urlGenerator = new \OC\URLGenerator(\OC::$server->getConfig()); +$token = isset($_GET['t']) ? $_GET['t'] : ''; +$route = isset($_GET['download']) ? 'files_sharing.sharecontroller.downloadShare' : 'files_sharing.sharecontroller.showShare'; + +OC_Response::redirect($urlGenerator->linkToRoute($route, array('token' => $token))); diff --git a/apps/files_sharing/publicwebdav.php b/apps/files_sharing/publicwebdav.php index 03e43967a40..240891ffef6 100644 --- a/apps/files_sharing/publicwebdav.php +++ b/apps/files_sharing/publicwebdav.php @@ -41,7 +41,7 @@ $server->addPlugin(new OC_Connector_Sabre_ExceptionLoggerPlugin('webdav')); $server->subscribeEvent('beforeMethod', function () use ($server, $objectTree, $authBackend) { $share = $authBackend->getShare(); $owner = $share['uid_owner']; - $isWritable = $share['permissions'] & (\OCP\PERMISSION_UPDATE | \OCP\PERMISSION_CREATE); + $isWritable = $share['permissions'] & (\OCP\Constants::PERMISSION_UPDATE | \OCP\Constants::PERMISSION_CREATE); $fileId = $share['file_source']; if (!$isWritable) { @@ -54,7 +54,6 @@ $server->subscribeEvent('beforeMethod', function () use ($server, $objectTree, $ $ownerView = \OC\Files\Filesystem::getView(); $path = $ownerView->getPath($fileId); - $view = new \OC\Files\View($ownerView->getAbsolutePath($path)); $rootInfo = $view->getFileInfo(''); diff --git a/apps/files_sharing/templates/authenticate.php b/apps/files_sharing/templates/authenticate.php index 0c4ac6ca445..e3aa62b9ece 100644 --- a/apps/files_sharing/templates/authenticate.php +++ b/apps/files_sharing/templates/authenticate.php @@ -1,4 +1,9 @@ -<form action="<?php p($_['URL']); ?>" method="post"> +<?php + /** @var $_ array */ + /** @var $l OC_L10N */ + style('files_sharing', 'authenticate'); +?> +<form method="post"> <fieldset> <?php if (!isset($_['wrongpw'])): ?> <div class="warning-info"><?php p($l->t('This share is password-protected')); ?></div> @@ -8,6 +13,7 @@ <?php endif; ?> <p> <label for="password" class="infield"><?php p($l->t('Password')); ?></label> + <input type="hidden" name="requesttoken" value="<?php p($_['requesttoken']) ?>" /> <input type="password" name="password" id="password" placeholder="<?php p($l->t('Password')); ?>" value="" autocomplete="off" autocapitalize="off" autocorrect="off" diff --git a/apps/files_sharing/templates/list.php b/apps/files_sharing/templates/list.php index a1d95ebc1f1..55ad55a0a4f 100644 --- a/apps/files_sharing/templates/list.php +++ b/apps/files_sharing/templates/list.php @@ -8,6 +8,12 @@ <input type="hidden" name="dir" value="" id="dir"> +<div class="nofilterresults hidden"> + <div class="icon-search"></div> + <h2><?php p($l->t('No entries found in this folder')); ?></h2> + <p></p> +</div> + <table id="filestable"> <thead> <tr> diff --git a/apps/files_sharing/templates/public.php b/apps/files_sharing/templates/public.php index 46bf90b1b41..0384d9a60aa 100644 --- a/apps/files_sharing/templates/public.php +++ b/apps/files_sharing/templates/public.php @@ -1,8 +1,28 @@ -<?php /** @var $l OC_L10N */ ?> <?php +/** @var $l OC_L10N */ +/** @var $_ array */ + +OCP\Util::addScript('files', 'file-upload'); +OCP\Util::addStyle('files_sharing', 'public'); +OCP\Util::addStyle('files_sharing', 'mobile'); +OCP\Util::addScript('files_sharing', 'public'); +OCP\Util::addScript('files', 'fileactions'); +OCP\Util::addScript('files', 'jquery.iframe-transport'); +OCP\Util::addScript('files', 'jquery.fileupload'); + +// JS required for folders +OCP\Util::addStyle('files', 'files'); +OCP\Util::addStyle('files', 'upload'); +OCP\Util::addScript('files', 'filesummary'); +OCP\Util::addScript('files', 'breadcrumb'); +OCP\Util::addScript('files', 'files'); +OCP\Util::addScript('files', 'filelist'); +OCP\Util::addscript('files', 'keyboardshortcuts'); + $thumbSize=1024; $previewSupported = OC\Preview::isMimeSupported($_['mimetype']) ? 'true' : 'false'; ?> + <?php if ( \OC\Preview::isMimeSupported($_['mimetype'])): /* This enables preview images for links (e.g. on Facebook, Google+, ...)*/?> <link rel="image_src" href="<?php p(OCP\Util::linkToRoute( 'core_ajax_public_preview', array('x' => $thumbSize, 'y' => $thumbSize, 'file' => $_['directory_path'], 't' => $_['dirToken']))); ?>" /> <?php endif; ?> @@ -24,8 +44,12 @@ $previewSupported = OC\Preview::isMimeSupported($_['mimetype']) ? 'true' : 'fals <header><div id="header" class="<?php p((isset($_['folder']) ? 'share-folder' : 'share-file')) ?>"> <a href="<?php print_unescaped(link_to('', 'index.php')); ?>" - title="" id="owncloud"> - <div class="logo-wide svg"></div> + title="" id="owncloud"> + <div class="logo-wide svg"> + <h1 class="hidden-visually"> + <?php p($theme->getName()); ?> + </h1> + </div> </a> <div id="logo-claim" style="display:none;"><?php p($theme->getLogoClaim()); ?></div> <div class="header-right"> @@ -48,7 +72,7 @@ $previewSupported = OC\Preview::isMimeSupported($_['mimetype']) ? 'true' : 'fals </a> </span> </div> -</div></header> + </div></header> <div id="content"> <div id="preview"> <?php if (isset($_['folder'])): ?> @@ -67,7 +91,7 @@ $previewSupported = OC\Preview::isMimeSupported($_['mimetype']) ? 'true' : 'fals <div class="directDownload"> <a href="<?php p($_['downloadURL']); ?>" id="download" class="button"> <img class="svg" alt="" src="<?php print_unescaped(OCP\image_path("core", "actions/download.svg")); ?>"/> - <?php p($l->t('Download %s', array($_['filename'])))?> + <?php p($l->t('Download %s', array($_['filename'])))?> (<?php p($_['fileSize']) ?>) </a> </div> <div class="directLink"> diff --git a/apps/files_sharing/tests/api.php b/apps/files_sharing/tests/api.php index 88acbd8e775..278e7130199 100644 --- a/apps/files_sharing/tests/api.php +++ b/apps/files_sharing/tests/api.php @@ -32,9 +32,12 @@ class Test_Files_Sharing_Api extends TestCase { private static $tempStorage; - function setUp() { + protected function setUp() { parent::setUp(); + \OC::$server->getAppConfig()->setValue('core', 'shareapi_exclude_groups', 'no'); + \OC::$server->getAppConfig()->setValue('core', 'shareapi_expire_after_n_days', '7'); + $this->folder = self::TEST_FOLDER_NAME; $this->subfolder = '/subfolder_share_api_test'; $this->subsubfolder = '/subsubfolder_share_api_test'; @@ -50,7 +53,7 @@ class Test_Files_Sharing_Api extends TestCase { $this->view->file_put_contents($this->folder . $this->subfolder . $this->filename, $this->data); } - function tearDown() { + protected function tearDown() { if($this->view instanceof \OC\Files\View) { $this->view->unlink($this->filename); $this->view->deleteAll($this->folder); @@ -73,7 +76,7 @@ class Test_Files_Sharing_Api extends TestCase { $_POST['shareWith'] = \Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2; $_POST['shareType'] = \OCP\Share::SHARE_TYPE_USER; - $result = Share\Api::createShare(array()); + $result = \OCA\Files_Sharing\API\Local::createShare(array()); $this->assertTrue($result->succeeded()); $data = $result->getData(); @@ -90,7 +93,7 @@ class Test_Files_Sharing_Api extends TestCase { $_POST['path'] = $this->folder; $_POST['shareType'] = \OCP\Share::SHARE_TYPE_LINK; - $result = Share\Api::createShare(array()); + $result = \OCA\Files_Sharing\API\Local::createShare(array()); // check if API call was successful $this->assertTrue($result->succeeded()); @@ -126,7 +129,7 @@ class Test_Files_Sharing_Api extends TestCase { $_POST['shareType'] = \OCP\Share::SHARE_TYPE_LINK; - $result = Share\Api::createShare(array()); + $result = \OCA\Files_Sharing\API\Local::createShare(array()); $this->assertFalse($result->succeeded()); @@ -135,7 +138,7 @@ class Test_Files_Sharing_Api extends TestCase { $_POST['shareType'] = \OCP\Share::SHARE_TYPE_LINK; $_POST['password'] = ''; - $result = Share\Api::createShare(array()); + $result = \OCA\Files_Sharing\API\Local::createShare(array()); $this->assertFalse($result->succeeded()); // share with password should succeed @@ -143,7 +146,7 @@ class Test_Files_Sharing_Api extends TestCase { $_POST['shareType'] = \OCP\Share::SHARE_TYPE_LINK; $_POST['password'] = 'foo'; - $result = Share\Api::createShare(array()); + $result = \OCA\Files_Sharing\API\Local::createShare(array()); $this->assertTrue($result->succeeded()); $data = $result->getData(); @@ -154,7 +157,7 @@ class Test_Files_Sharing_Api extends TestCase { $params['_put'] = array(); $params['_put']['password'] = 'bar'; - $result = Share\Api::updateShare($params); + $result = \OCA\Files_Sharing\API\Local::updateShare($params); $this->assertTrue($result->succeeded()); // removing password should fail @@ -163,7 +166,7 @@ class Test_Files_Sharing_Api extends TestCase { $params['_put'] = array(); $params['_put']['password'] = ''; - $result = Share\Api::updateShare($params); + $result = \OCA\Files_Sharing\API\Local::updateShare($params); $this->assertFalse($result->succeeded()); // cleanup @@ -184,7 +187,7 @@ class Test_Files_Sharing_Api extends TestCase { $_POST['shareWith'] = \Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2; $_POST['shareType'] = \OCP\Share::SHARE_TYPE_USER; - $result = Share\Api::createShare(array()); + $result = \OCA\Files_Sharing\API\Local::createShare(array()); $this->assertTrue($result->succeeded()); $data = $result->getData(); @@ -210,7 +213,7 @@ class Test_Files_Sharing_Api extends TestCase { $_POST['shareWith'] = \Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2; $_POST['shareType'] = \OCP\Share::SHARE_TYPE_USER; - $result = Share\Api::createShare(array()); + $result = \OCA\Files_Sharing\API\Local::createShare(array()); $this->assertTrue($result->succeeded()); $data = $result->getData(); @@ -235,7 +238,7 @@ class Test_Files_Sharing_Api extends TestCase { $_POST['shareWith'] = \Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2; $_POST['shareType'] = \OCP\Share::SHARE_TYPE_USER; - $result = Share\Api::createShare(array()); + $result = \OCA\Files_Sharing\API\Local::createShare(array()); $this->assertFalse($result->succeeded()); @@ -256,7 +259,7 @@ class Test_Files_Sharing_Api extends TestCase { \OCP\Share::shareItem('file', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_USER, \Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2, 31); - $result = Share\Api::getAllShares(array()); + $result = \OCA\Files_Sharing\API\Local::getAllShares(array()); $this->assertTrue($result->succeeded()); @@ -283,7 +286,7 @@ class Test_Files_Sharing_Api extends TestCase { $_GET['path'] = $this->filename; - $result = Share\Api::getAllShares(array()); + $result = \OCA\Files_Sharing\API\Local::getAllShares(array()); $this->assertTrue($result->succeeded()); @@ -320,7 +323,7 @@ class Test_Files_Sharing_Api extends TestCase { $_GET['path'] = $this->filename; - $result = Share\Api::getAllShares(array()); + $result = \OCA\Files_Sharing\API\Local::getAllShares(array()); $this->assertTrue($result->succeeded()); @@ -330,7 +333,7 @@ class Test_Files_Sharing_Api extends TestCase { // now also ask for the reshares $_GET['reshares'] = 'true'; - $result = Share\Api::getAllShares(array()); + $result = \OCA\Files_Sharing\API\Local::getAllShares(array()); $this->assertTrue($result->succeeded()); @@ -375,7 +378,7 @@ class Test_Files_Sharing_Api extends TestCase { // call getShare() with share ID $params = array('id' => $share['id']); - $result = Share\Api::getShare($params); + $result = \OCA\Files_Sharing\API\Local::getShare($params); $this->assertTrue($result->succeeded()); @@ -410,7 +413,7 @@ class Test_Files_Sharing_Api extends TestCase { $_GET['path'] = $this->folder; $_GET['subfiles'] = 'true'; - $result = Share\Api::getAllShares(array()); + $result = \OCA\Files_Sharing\API\Local::getAllShares(array()); $this->assertTrue($result->succeeded()); @@ -467,7 +470,7 @@ class Test_Files_Sharing_Api extends TestCase { $_GET['path'] = $value['query']; $_GET['subfiles'] = 'true'; - $result = Share\Api::getAllShares(array()); + $result = \OCA\Files_Sharing\API\Local::getAllShares(array()); $this->assertTrue($result->succeeded()); @@ -518,7 +521,7 @@ class Test_Files_Sharing_Api extends TestCase { $_GET['path'] = '/'; $_GET['subfiles'] = 'true'; - $result = Share\Api::getAllShares(array()); + $result = \OCA\Files_Sharing\API\Local::getAllShares(array()); $this->assertTrue($result->succeeded()); @@ -580,7 +583,7 @@ class Test_Files_Sharing_Api extends TestCase { $_GET['path'] = '/'; $_GET['subfiles'] = 'true'; - $result = Share\Api::getAllShares(array()); + $result = \OCA\Files_Sharing\API\Local::getAllShares(array()); $this->assertTrue($result->succeeded()); @@ -649,7 +652,7 @@ class Test_Files_Sharing_Api extends TestCase { $expectedPath1 = $this->subfolder; $_GET['path'] = $expectedPath1; - $result1 = Share\Api::getAllShares(array()); + $result1 = \OCA\Files_Sharing\API\Local::getAllShares(array()); $this->assertTrue($result1->succeeded()); @@ -661,7 +664,7 @@ class Test_Files_Sharing_Api extends TestCase { $expectedPath2 = $this->folder . $this->subfolder; $_GET['path'] = $expectedPath2; - $result2 = Share\Api::getAllShares(array()); + $result2 = \OCA\Files_Sharing\API\Local::getAllShares(array()); $this->assertTrue($result2->succeeded()); @@ -731,7 +734,7 @@ class Test_Files_Sharing_Api extends TestCase { $_GET['path'] = '/'; $_GET['subfiles'] = 'true'; - $result = Share\Api::getAllShares(array()); + $result = \OCA\Files_Sharing\API\Local::getAllShares(array()); $this->assertTrue($result->succeeded()); @@ -768,7 +771,7 @@ class Test_Files_Sharing_Api extends TestCase { $params = array('id' => 0); - $result = Share\Api::getShare($params); + $result = \OCA\Files_Sharing\API\Local::getShare($params); $this->assertEquals(404, $result->getStatusCode()); $meta = $result->getMeta(); @@ -785,7 +788,7 @@ class Test_Files_Sharing_Api extends TestCase { $fileInfo = $this->view->getFileInfo($this->filename); $result = \OCP\Share::shareItem('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER, - \Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2, \OCP\PERMISSION_ALL); + \Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2, \OCP\Constants::PERMISSION_ALL); // share was successful? $this->assertTrue($result); @@ -819,7 +822,7 @@ class Test_Files_Sharing_Api extends TestCase { // check if share have expected permissions, single shared files never have // delete permissions - $this->assertEquals(\OCP\PERMISSION_ALL & ~\OCP\PERMISSION_DELETE, $userShare['permissions']); + $this->assertEquals(\OCP\Constants::PERMISSION_ALL & ~\OCP\Constants::PERMISSION_DELETE, $userShare['permissions']); // update permissions @@ -828,7 +831,7 @@ class Test_Files_Sharing_Api extends TestCase { $params['_put'] = array(); $params['_put']['permissions'] = 1; - $result = Share\Api::updateShare($params); + $result = \OCA\Files_Sharing\API\Local::updateShare($params); $meta = $result->getMeta(); $this->assertTrue($result->succeeded(), $meta['message']); @@ -856,7 +859,7 @@ class Test_Files_Sharing_Api extends TestCase { $params['_put'] = array(); $params['_put']['password'] = 'foo'; - $result = Share\Api::updateShare($params); + $result = \OCA\Files_Sharing\API\Local::updateShare($params); $this->assertTrue($result->succeeded()); @@ -916,7 +919,7 @@ class Test_Files_Sharing_Api extends TestCase { $params['_put'] = array(); $params['_put']['publicUpload'] = 'true'; - $result = Share\Api::updateShare($params); + $result = \OCA\Files_Sharing\API\Local::updateShare($params); $this->assertTrue($result->succeeded()); @@ -945,10 +948,11 @@ class Test_Files_Sharing_Api extends TestCase { function testUpdateShareExpireDate() { $fileInfo = $this->view->getFileInfo($this->folder); + $config = \OC::$server->getConfig(); // enforce expire date, by default 7 days after the file was shared - \OCP\Config::setAppValue('core', 'shareapi_default_expire_date', 'yes'); - \OCP\Config::setAppValue('core', 'shareapi_enforce_expire_date', 'yes'); + $config->setAppValue('core', 'shareapi_default_expire_date', 'yes'); + $config->setAppValue('core', 'shareapi_enforce_expire_date', 'yes'); $dateWithinRange = new \DateTime(); $dateWithinRange->add(new \DateInterval('P5D')); @@ -974,7 +978,7 @@ class Test_Files_Sharing_Api extends TestCase { $params['_put'] = array(); $params['_put']['expireDate'] = $dateWithinRange->format('Y-m-d'); - $result = Share\Api::updateShare($params); + $result = \OCA\Files_Sharing\API\Local::updateShare($params); $this->assertTrue($result->succeeded()); @@ -992,7 +996,7 @@ class Test_Files_Sharing_Api extends TestCase { $params['_put'] = array(); $params['_put']['expireDate'] = $dateOutOfRange->format('Y-m-d'); - $result = Share\Api::updateShare($params); + $result = \OCA\Files_Sharing\API\Local::updateShare($params); $this->assertFalse($result->succeeded()); @@ -1005,8 +1009,8 @@ class Test_Files_Sharing_Api extends TestCase { $this->assertEquals($dateWithinRange->format('Y-m-d') . ' 00:00:00', $updatedLinkShare['expiration']); // cleanup - \OCP\Config::setAppValue('core', 'shareapi_default_expire_date', 'no'); - \OCP\Config::setAppValue('core', 'shareapi_enforce_expire_date', 'no'); + $config->setAppValue('core', 'shareapi_default_expire_date', 'no'); + $config->setAppValue('core', 'shareapi_enforce_expire_date', 'no'); \OCP\Share::unshare('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_LINK, null); } @@ -1030,7 +1034,7 @@ class Test_Files_Sharing_Api extends TestCase { $this->assertEquals(2, count($items)); foreach ($items as $item) { - $result = Share\Api::deleteShare(array('id' => $item['id'])); + $result = \OCA\Files_Sharing\API\Local::deleteShare(array('id' => $item['id'])); $this->assertTrue($result->succeeded()); } @@ -1069,7 +1073,7 @@ class Test_Files_Sharing_Api extends TestCase { $this->assertEquals(1, count($items)); $item = reset($items); - $result3 = Share\Api::deleteShare(array('id' => $item['id'])); + $result3 = \OCA\Files_Sharing\API\Local::deleteShare(array('id' => $item['id'])); $this->assertTrue($result3->succeeded()); @@ -1225,7 +1229,7 @@ class Test_Files_Sharing_Api extends TestCase { $info = OC\Files\Filesystem::getFileInfo($this->filename); $this->assertTrue($info instanceof \OC\Files\FileInfo); - $result = \OCP\Share::shareItem('file', $info->getId(), \OCP\Share::SHARE_TYPE_LINK, null, \OCP\PERMISSION_READ); + $result = \OCP\Share::shareItem('file', $info->getId(), \OCP\Share::SHARE_TYPE_LINK, null, \OCP\Constants::PERMISSION_READ); $this->assertTrue(is_string($result)); $result = \OCP\Share::shareItem('file', $info->getId(), \OCP\Share::SHARE_TYPE_USER, \Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2, 31); diff --git a/apps/files_sharing/tests/backend.php b/apps/files_sharing/tests/backend.php index e113c940678..5cf2a22c792 100644 --- a/apps/files_sharing/tests/backend.php +++ b/apps/files_sharing/tests/backend.php @@ -34,7 +34,7 @@ class Test_Files_Sharing_Backend extends TestCase { public $subfolder; public $subsubfolder; - function setUp() { + protected function setUp() { parent::setUp(); $this->folder = self::TEST_FOLDER_NAME; @@ -53,7 +53,7 @@ class Test_Files_Sharing_Backend extends TestCase { $this->view->file_put_contents($this->folder . $this->subfolder . $this->subsubfolder . $this->filename, $this->data); } - function tearDown() { + protected function tearDown() { $this->view->unlink($this->filename); $this->view->deleteAll($this->folder); diff --git a/apps/files_sharing/tests/cache.php b/apps/files_sharing/tests/cache.php index 2c9790ce66d..f3f8f924b44 100644 --- a/apps/files_sharing/tests/cache.php +++ b/apps/files_sharing/tests/cache.php @@ -22,7 +22,6 @@ use OCA\Files_sharing\Tests\TestCase; * License along with this library. If not, see <http://www.gnu.org/licenses/>. * */ - class Test_Files_Sharing_Cache extends TestCase { /** @@ -30,7 +29,19 @@ class Test_Files_Sharing_Cache extends TestCase { */ public $user2View; - function setUp() { + /** @var \OC\Files\Cache\Cache */ + protected $ownerCache; + + /** @var \OC\Files\Cache\Cache */ + protected $sharedCache; + + /** @var \OC\Files\Storage\Storage */ + protected $ownerStorage; + + /** @var \OC\Files\Storage\Storage */ + protected $sharedStorage; + + protected function setUp() { parent::setUp(); \OC_User::setDisplayName(self::TEST_FILES_SHARING_API_USER1, 'User One'); @@ -54,7 +65,7 @@ class Test_Files_Sharing_Cache extends TestCase { $this->view->file_put_contents('container/shareddir/subdir/another too.txt', $textData); $this->view->file_put_contents('container/shareddir/subdir/not a text file.xml', '<xml></xml>'); - list($this->ownerStorage, $internalPath) = $this->view->resolvePath(''); + list($this->ownerStorage,) = $this->view->resolvePath(''); $this->ownerCache = $this->ownerStorage->getCache(); $this->ownerStorage->getScanner()->scan(''); @@ -72,11 +83,11 @@ class Test_Files_Sharing_Cache extends TestCase { // retrieve the shared storage $secondView = new \OC\Files\View('/' . self::TEST_FILES_SHARING_API_USER2); - list($this->sharedStorage, $internalPath) = $secondView->resolvePath('files/shareddir'); + list($this->sharedStorage,) = $secondView->resolvePath('files/shareddir'); $this->sharedCache = $this->sharedStorage->getCache(); } - function tearDown() { + protected function tearDown() { $this->sharedCache->clear(); self::loginHelper(self::TEST_FILES_SHARING_API_USER1); @@ -192,6 +203,96 @@ class Test_Files_Sharing_Cache extends TestCase { $this->verifyFiles($check, $results); } + /** + * Test searching by tag + */ + function testSearchByTag() { + $userId = \OC::$server->getUserSession()->getUser()->getUId(); + $id1 = $this->sharedCache->get('bar.txt')['fileid']; + $id2 = $this->sharedCache->get('subdir/another too.txt')['fileid']; + $id3 = $this->sharedCache->get('subdir/not a text file.xml')['fileid']; + $id4 = $this->sharedCache->get('subdir/another.txt')['fileid']; + $tagManager = \OC::$server->getTagManager()->load('files', null, null, $userId); + $tagManager->tagAs($id1, 'tag1'); + $tagManager->tagAs($id1, 'tag2'); + $tagManager->tagAs($id2, 'tag1'); + $tagManager->tagAs($id3, 'tag1'); + $tagManager->tagAs($id4, 'tag2'); + $results = $this->sharedStorage->getCache()->searchByTag('tag1', $userId); + $check = array( + array( + 'name' => 'bar.txt', + 'path' => 'bar.txt' + ), + array( + 'name' => 'another too.txt', + 'path' => 'subdir/another too.txt' + ), + array( + 'name' => 'not a text file.xml', + 'path' => 'subdir/not a text file.xml' + ), + ); + $this->verifyFiles($check, $results); + $tagManager->delete(array('tag1', 'tag2')); + } + + /** + * Test searching by tag for multiple sections of the tree + */ + function testSearchByTagTree() { + $userId = \OC::$server->getUserSession()->getUser()->getUId(); + $this->sharedStorage->mkdir('subdir/emptydir'); + $this->sharedStorage->mkdir('subdir/emptydir2'); + $this->ownerStorage->getScanner()->scan(''); + $allIds = array( + $this->sharedCache->get('')['fileid'], + $this->sharedCache->get('bar.txt')['fileid'], + $this->sharedCache->get('subdir/another too.txt')['fileid'], + $this->sharedCache->get('subdir/not a text file.xml')['fileid'], + $this->sharedCache->get('subdir/another.txt')['fileid'], + $this->sharedCache->get('subdir/emptydir')['fileid'], + $this->sharedCache->get('subdir/emptydir2')['fileid'], + ); + $tagManager = \OC::$server->getTagManager()->load('files', null, null, $userId); + foreach ($allIds as $id) { + $tagManager->tagAs($id, 'tag1'); + } + $results = $this->sharedStorage->getCache()->searchByTag('tag1', $userId); + $check = array( + array( + 'name' => 'shareddir', + 'path' => '' + ), + array( + 'name' => 'bar.txt', + 'path' => 'bar.txt' + ), + array( + 'name' => 'another.txt', + 'path' => 'subdir/another.txt' + ), + array( + 'name' => 'another too.txt', + 'path' => 'subdir/another too.txt' + ), + array( + 'name' => 'emptydir', + 'path' => 'subdir/emptydir' + ), + array( + 'name' => 'emptydir2', + 'path' => 'subdir/emptydir2' + ), + array( + 'name' => 'not a text file.xml', + 'path' => 'subdir/not a text file.xml' + ), + ); + $this->verifyFiles($check, $results); + $tagManager->delete(array('tag1')); + } + function testGetFolderContentsInRoot() { $results = $this->user2View->getDirectoryContent('/'); @@ -336,7 +437,7 @@ class Test_Files_Sharing_Cache extends TestCase { self::loginHelper(self::TEST_FILES_SHARING_API_USER1); \OC\Files\Filesystem::file_put_contents('test.txt', 'foo'); $info = \OC\Files\Filesystem::getFileInfo('test.txt'); - \OCP\Share::shareItem('file', $info->getId(), \OCP\Share::SHARE_TYPE_USER, self::TEST_FILES_SHARING_API_USER2, \OCP\PERMISSION_ALL); + \OCP\Share::shareItem('file', $info->getId(), \OCP\Share::SHARE_TYPE_USER, self::TEST_FILES_SHARING_API_USER2, \OCP\Constants::PERMISSION_ALL); \OC_Util::tearDownFS(); self::loginHelper(self::TEST_FILES_SHARING_API_USER2); @@ -354,10 +455,10 @@ class Test_Files_Sharing_Cache extends TestCase { self::loginHelper(self::TEST_FILES_SHARING_API_USER1); \OC\Files\Filesystem::mkdir('foo'); \OC\Files\Filesystem::mkdir('foo/bar'); - \OC\Files\Filesystem::touch('foo/bar/test.txt', 'bar'); + \OC\Files\Filesystem::touch('foo/bar/test.txt'); $folderInfo = \OC\Files\Filesystem::getFileInfo('foo'); $fileInfo = \OC\Files\Filesystem::getFileInfo('foo/bar/test.txt'); - \OCP\Share::shareItem('folder', $folderInfo->getId(), \OCP\Share::SHARE_TYPE_USER, self::TEST_FILES_SHARING_API_USER2, \OCP\PERMISSION_ALL); + \OCP\Share::shareItem('folder', $folderInfo->getId(), \OCP\Share::SHARE_TYPE_USER, self::TEST_FILES_SHARING_API_USER2, \OCP\Constants::PERMISSION_ALL); \OC_Util::tearDownFS(); self::loginHelper(self::TEST_FILES_SHARING_API_USER2); diff --git a/apps/files_sharing/tests/controller/sharecontroller.php b/apps/files_sharing/tests/controller/sharecontroller.php new file mode 100644 index 00000000000..f13e5b2e497 --- /dev/null +++ b/apps/files_sharing/tests/controller/sharecontroller.php @@ -0,0 +1,171 @@ +<?php +/** + * @author Lukas Reschke <lukas@owncloud.com> + * @copyright 2014 Lukas Reschke + * + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace OCA\Files_Sharing\Controllers; + +use OC\Files\Filesystem; +use OCA\Files_Sharing\Application; +use OCP\AppFramework\IAppContainer; +use OCP\Files; +use OCP\AppFramework\Http\RedirectResponse; +use OCP\AppFramework\Http\TemplateResponse; +use OCP\Security\ISecureRandom; +use OC\Files\View; +use OCP\Share; +use OC\URLGenerator; + +/** + * @package OCA\Files_Sharing\Controllers + */ +class ShareControllerTest extends \PHPUnit_Framework_TestCase { + + /** @var IAppContainer */ + private $container; + /** @var string */ + private $user; + /** @var string */ + private $token; + /** @var string */ + private $oldUser; + /** @var ShareController */ + private $shareController; + /** @var URLGenerator */ + private $urlGenerator; + + protected function setUp() { + $app = new Application(); + $this->container = $app->getContainer(); + $this->container['Config'] = $this->getMockBuilder('\OCP\IConfig') + ->disableOriginalConstructor()->getMock(); + $this->container['AppName'] = 'files_sharing'; + $this->container['UserSession'] = $this->getMockBuilder('\OC\User\Session') + ->disableOriginalConstructor()->getMock(); + $this->container['URLGenerator'] = $this->getMockBuilder('\OC\URLGenerator') + ->disableOriginalConstructor()->getMock(); + $this->urlGenerator = $this->container['URLGenerator']; + $this->shareController = $this->container['ShareController']; + + // Store current user + $this->oldUser = \OC_User::getUser(); + + // Create a dummy user + $this->user = \OC::$server->getSecureRandom()->getLowStrengthGenerator()->generate(12, ISecureRandom::CHAR_LOWER); + + \OC_User::createUser($this->user, $this->user); + \OC_Util::tearDownFS(); + \OC_User::setUserId(''); + Filesystem::tearDown(); + \OC_User::setUserId($this->user); + \OC_Util::setupFS($this->user); + + // Create a dummy shared file + $view = new View('/'. $this->user . '/files'); + $view->file_put_contents('file1.txt', 'I am such an awesome shared file!'); + $this->token = \OCP\Share::shareItem( + Filesystem::getFileInfo('file1.txt')->getType(), + Filesystem::getFileInfo('file1.txt')->getId(), + \OCP\Share::SHARE_TYPE_LINK, + 'IAmPasswordProtected!', + 1 + ); + } + + protected function tearDown() { + \OC_Util::tearDownFS(); + \OC_User::setUserId(''); + Filesystem::tearDown(); + \OC_User::deleteUser($this->user); + \OC_User::setIncognitoMode(false); + + \OC::$server->getSession()->set('public_link_authenticated', ''); + + // Set old user + \OC_User::setUserId($this->oldUser); + \OC_Util::setupFS($this->oldUser); + } + + public function testShowAuthenticate() { + $linkItem = \OCP\Share::getShareByToken($this->token, false); + + // Test without being authenticated + $response = $this->shareController->showAuthenticate($this->token); + $expectedResponse = new TemplateResponse($this->container['AppName'], 'authenticate', array(), 'guest'); + $this->assertEquals($expectedResponse, $response); + + // Test with being authenticated for another file + \OC::$server->getSession()->set('public_link_authenticated', $linkItem['id']-1); + $response = $this->shareController->showAuthenticate($this->token); + $expectedResponse = new TemplateResponse($this->container['AppName'], 'authenticate', array(), 'guest'); + $this->assertEquals($expectedResponse, $response); + + // Test with being authenticated for the correct file + \OC::$server->getSession()->set('public_link_authenticated', $linkItem['id']); + $response = $this->shareController->showAuthenticate($this->token); + $expectedResponse = new RedirectResponse($this->urlGenerator->linkToRoute('files_sharing.sharecontroller.showShare', array('token' => $this->token))); + $this->assertEquals($expectedResponse, $response); + } + + public function testAuthenticate() { + // Test without a not existing token + $response = $this->shareController->authenticate('ThisTokenShouldHopefullyNeverExistSoThatTheUnitTestWillAlwaysPass :)'); + $expectedResponse = new TemplateResponse('core', '404', array(), 'guest'); + $this->assertEquals($expectedResponse, $response); + + // Test with a valid password + $response = $this->shareController->authenticate($this->token, 'IAmPasswordProtected!'); + $expectedResponse = new RedirectResponse($this->urlGenerator->linkToRoute('files_sharing.sharecontroller.showShare', array('token' => $this->token))); + $this->assertEquals($expectedResponse, $response); + + // Test with a invalid password + $response = $this->shareController->authenticate($this->token, 'WrongPw!'); + $expectedResponse = new TemplateResponse($this->container['AppName'], 'authenticate', array('wrongpw' => true), 'guest'); + $this->assertEquals($expectedResponse, $response); + } + + public function testShowShare() { + // Test without a not existing token + $response = $this->shareController->showShare('ThisTokenShouldHopefullyNeverExistSoThatTheUnitTestWillAlwaysPass :)'); + $expectedResponse = new TemplateResponse('core', '404', array(), 'guest'); + $this->assertEquals($expectedResponse, $response); + + // Test with a password protected share and no authentication + $response = $this->shareController->showShare($this->token); + $expectedResponse = new RedirectResponse($this->urlGenerator->linkToRoute('files_sharing.sharecontroller.authenticate', array('token' => $this->token))); + $this->assertEquals($expectedResponse, $response); + + // Test with password protected share and authentication + $linkItem = Share::getShareByToken($this->token, false); + \OC::$server->getSession()->set('public_link_authenticated', $linkItem['id']); + $response = $this->shareController->showShare($this->token); + $sharedTmplParams = array( + 'displayName' => $this->user, + 'filename' => 'file1.txt', + 'directory_path' => '/file1.txt', + 'mimetype' => 'text/plain', + 'dirToken' => $this->token, + 'sharingToken' => $this->token, + 'server2serversharing' => true, + 'protected' => 'true', + 'dir' => '', + 'downloadURL' => null, + 'fileSize' => '33 B' + ); + $expectedResponse = new TemplateResponse($this->container['AppName'], 'public', $sharedTmplParams, 'base'); + $this->assertEquals($expectedResponse, $response); + } + + public function testDownloadShare() { + // Test with a password protected share and no authentication + $response = $this->shareController->downloadShare($this->token); + $expectedResponse = new RedirectResponse($this->urlGenerator->linkToRoute('files_sharing.sharecontroller.authenticate', + array('token' => $this->token))); + $this->assertEquals($expectedResponse, $response); + } +} diff --git a/apps/files_sharing/tests/externalstorage.php b/apps/files_sharing/tests/externalstorage.php index 0c741bb8199..cf82fcfc555 100644 --- a/apps/files_sharing/tests/externalstorage.php +++ b/apps/files_sharing/tests/externalstorage.php @@ -23,7 +23,7 @@ /** * Tests for the external Storage class for remote shares. */ -class Test_Files_Sharing_External_Storage extends \PHPUnit_Framework_TestCase { +class Test_Files_Sharing_External_Storage extends \Test\TestCase { function optionsProvider() { return array( diff --git a/apps/files_sharing/tests/helper.php b/apps/files_sharing/tests/helper.php index 1a27739ec34..a9245ddafe5 100644 --- a/apps/files_sharing/tests/helper.php +++ b/apps/files_sharing/tests/helper.php @@ -35,7 +35,7 @@ class Test_Files_Sharing_Helper extends TestCase { $this->assertSame('/Shared', \OCA\Files_Sharing\Helper::getShareFolder()); // cleanup - \OCP\Config::deleteSystemValue('share_folder'); + \OC::$server->getConfig()->deleteSystemValue('share_folder'); } diff --git a/apps/files_sharing/tests/js/shareSpec.js b/apps/files_sharing/tests/js/shareSpec.js index 2cf5dc47b63..e5b5de314d7 100644 --- a/apps/files_sharing/tests/js/shareSpec.js +++ b/apps/files_sharing/tests/js/shareSpec.js @@ -9,7 +9,6 @@ */ describe('OCA.Sharing.Util tests', function() { - var oldFileListPrototype; var fileList; var testFiles; @@ -24,10 +23,6 @@ describe('OCA.Sharing.Util tests', function() { } beforeEach(function() { - // back up prototype, as it will be extended by - // the sharing code - oldFileListPrototype = _.extend({}, OCA.Files.FileList.prototype); - var $content = $('<div id="content"></div>'); $('#testArea').append($content); // dummy file list @@ -41,12 +36,12 @@ describe('OCA.Sharing.Util tests', function() { $('#content').append($div); var fileActions = new OCA.Files.FileActions(); - OCA.Sharing.Util.initialize(fileActions); fileList = new OCA.Files.FileList( $div, { fileActions : fileActions } ); + OCA.Sharing.Util.attach(fileList); testFiles = [{ id: 1, @@ -67,7 +62,6 @@ describe('OCA.Sharing.Util tests', function() { }; }); afterEach(function() { - OCA.Files.FileList.prototype = oldFileListPrototype; delete OCA.Sharing.sharesLoaded; delete OC.Share.droppedDown; fileList.destroy(); @@ -105,7 +99,7 @@ describe('OCA.Sharing.Util tests', function() { $action = $tr.find('.action-share'); expect($action.hasClass('permanent')).toEqual(false); expect(OC.basename($action.find('img').attr('src'))).toEqual('share.svg'); - expect(OC.basename(getImageUrl($tr.find('.filename')))).toEqual('folder.svg'); + expect(OC.basename(getImageUrl($tr.find('.filename .thumbnail')))).toEqual('folder.svg'); expect($action.find('img').length).toEqual(1); }); it('shows simple share text with share icon', function() { @@ -125,7 +119,7 @@ describe('OCA.Sharing.Util tests', function() { expect($action.hasClass('permanent')).toEqual(true); expect($action.find('>span').text()).toEqual('Shared'); expect(OC.basename($action.find('img').attr('src'))).toEqual('share.svg'); - expect(OC.basename(getImageUrl($tr.find('.filename')))).toEqual('folder-shared.svg'); + expect(OC.basename(getImageUrl($tr.find('.filename .thumbnail')))).toEqual('folder-shared.svg'); expect($action.find('img').length).toEqual(1); }); it('shows simple share text with public icon when shared with link', function() { @@ -146,7 +140,7 @@ describe('OCA.Sharing.Util tests', function() { expect($action.hasClass('permanent')).toEqual(true); expect($action.find('>span').text()).toEqual('Shared'); expect(OC.basename($action.find('img').attr('src'))).toEqual('public.svg'); - expect(OC.basename(getImageUrl($tr.find('.filename')))).toEqual('folder-public.svg'); + expect(OC.basename(getImageUrl($tr.find('.filename .thumbnail')))).toEqual('folder-public.svg'); expect($action.find('img').length).toEqual(1); }); it('shows owner name when owner is available', function() { @@ -167,7 +161,7 @@ describe('OCA.Sharing.Util tests', function() { expect($action.hasClass('permanent')).toEqual(true); expect($action.find('>span').text()).toEqual('User One'); expect(OC.basename($action.find('img').attr('src'))).toEqual('share.svg'); - expect(OC.basename(getImageUrl($tr.find('.filename')))).toEqual('folder-shared.svg'); + expect(OC.basename(getImageUrl($tr.find('.filename .thumbnail')))).toEqual('folder-shared.svg'); }); it('shows recipients when recipients are available', function() { var $action, $tr; @@ -187,7 +181,7 @@ describe('OCA.Sharing.Util tests', function() { expect($action.hasClass('permanent')).toEqual(true); expect($action.find('>span').text()).toEqual('Shared with User One, User Two'); expect(OC.basename($action.find('img').attr('src'))).toEqual('share.svg'); - expect(OC.basename(getImageUrl($tr.find('.filename')))).toEqual('folder-shared.svg'); + expect(OC.basename(getImageUrl($tr.find('.filename .thumbnail')))).toEqual('folder-shared.svg'); expect($action.find('img').length).toEqual(1); }); it('shows static share text when file shared with user that has no share permission', function() { @@ -209,7 +203,7 @@ describe('OCA.Sharing.Util tests', function() { expect($action.hasClass('permanent')).toEqual(true); expect($action.find('>span').text().trim()).toEqual('User One'); expect(OC.basename($action.find('img').attr('src'))).toEqual('share.svg'); - expect(OC.basename(getImageUrl($tr.find('.filename')))).toEqual('folder-shared.svg'); + expect(OC.basename(getImageUrl($tr.find('.filename .thumbnail')))).toEqual('folder-shared.svg'); expect($action.find('img').length).toEqual(1); }); }); diff --git a/apps/files_sharing/tests/js/sharedfilelistSpec.js b/apps/files_sharing/tests/js/sharedfilelistSpec.js index 41c8a1f05d8..7fdc6345e38 100644 --- a/apps/files_sharing/tests/js/sharedfilelistSpec.js +++ b/apps/files_sharing/tests/js/sharedfilelistSpec.js @@ -9,8 +9,7 @@ */ describe('OCA.Sharing.FileList tests', function() { - var testFiles, alertStub, notificationStub, fileList, fileActions; - var oldFileListPrototype; + var testFiles, alertStub, notificationStub, fileList; beforeEach(function() { alertStub = sinon.stub(OC.dialogs, 'alert'); @@ -46,18 +45,11 @@ describe('OCA.Sharing.FileList tests', function() { '<div id="emptycontent">Empty content message</div>' + '</div>' ); - // back up prototype, as it will be extended by - // the sharing code - oldFileListPrototype = _.extend({}, OCA.Files.FileList.prototype); - fileActions = new OCA.Files.FileActions(); - OCA.Sharing.Util.initialize(fileActions); }); afterEach(function() { - OCA.Files.FileList.prototype = oldFileListPrototype; testFiles = undefined; fileList.destroy(); fileList = undefined; - fileActions = undefined; notificationStub.restore(); alertStub.restore(); @@ -72,6 +64,7 @@ describe('OCA.Sharing.FileList tests', function() { sharedWithUser: true } ); + OCA.Sharing.Util.attach(fileList); fileList.reload(); @@ -91,7 +84,7 @@ describe('OCA.Sharing.FileList tests', function() { file_source: 49, file_target: '/local path/local name.txt', path: 'files/something shared.txt', - permissions: 31, + permissions: OC.PERMISSION_ALL, stime: 11111, share_type: OC.Share.SHARE_TYPE_USER, share_with: 'user1', @@ -127,7 +120,8 @@ describe('OCA.Sharing.FileList tests', function() { expect($tr.attr('data-file')).toEqual('local name.txt'); expect($tr.attr('data-path')).toEqual('/local path'); expect($tr.attr('data-size')).not.toBeDefined(); - expect($tr.attr('data-permissions')).toEqual('31'); // read and delete + expect(parseInt($tr.attr('data-permissions'), 10)) + .toEqual(OC.PERMISSION_ALL); // read and delete expect($tr.attr('data-mime')).toEqual('text/plain'); expect($tr.attr('data-mtime')).toEqual('11111000'); expect($tr.attr('data-share-owner')).toEqual('User Two'); @@ -169,7 +163,8 @@ describe('OCA.Sharing.FileList tests', function() { expect($tr.attr('data-file')).toEqual('local name'); expect($tr.attr('data-path')).toEqual('/local path'); expect($tr.attr('data-size')).not.toBeDefined(); - expect($tr.attr('data-permissions')).toEqual('31'); // read and delete + expect(parseInt($tr.attr('data-permissions'), 10)) + .toEqual(OC.PERMISSION_ALL); // read and delete expect($tr.attr('data-mime')).toEqual('httpd/unix-directory'); expect($tr.attr('data-mtime')).toEqual('11111000'); expect($tr.attr('data-share-owner')).toEqual('User Two'); @@ -191,6 +186,7 @@ describe('OCA.Sharing.FileList tests', function() { sharedWithUser: false } ); + OCA.Sharing.Util.attach(fileList); fileList.reload(); @@ -244,7 +240,8 @@ describe('OCA.Sharing.FileList tests', function() { expect($tr.attr('data-file')).toEqual('local name.txt'); expect($tr.attr('data-path')).toEqual('/local path'); expect($tr.attr('data-size')).not.toBeDefined(); - expect($tr.attr('data-permissions')).toEqual('31'); // read and delete + expect(parseInt($tr.attr('data-permissions'), 10)) + .toEqual(OC.PERMISSION_ALL - OC.PERMISSION_DELETE); // read expect($tr.attr('data-mime')).toEqual('text/plain'); expect($tr.attr('data-mtime')).toEqual('11111000'); expect($tr.attr('data-share-owner')).not.toBeDefined(); @@ -285,7 +282,8 @@ describe('OCA.Sharing.FileList tests', function() { expect($tr.attr('data-file')).toEqual('local name'); expect($tr.attr('data-path')).toEqual('/local path'); expect($tr.attr('data-size')).not.toBeDefined(); - expect($tr.attr('data-permissions')).toEqual('31'); // read and delete + expect(parseInt($tr.attr('data-permissions'), 10)) + .toEqual(OC.PERMISSION_ALL - OC.PERMISSION_DELETE); // read expect($tr.attr('data-mime')).toEqual('httpd/unix-directory'); expect($tr.attr('data-mtime')).toEqual('11111000'); expect($tr.attr('data-share-owner')).not.toBeDefined(); @@ -336,7 +334,8 @@ describe('OCA.Sharing.FileList tests', function() { expect($tr.attr('data-file')).toEqual('local name.txt'); expect($tr.attr('data-path')).toEqual('/local path'); expect($tr.attr('data-size')).not.toBeDefined(); - expect($tr.attr('data-permissions')).toEqual('31'); // read and delete + expect(parseInt($tr.attr('data-permissions'), 10)) + .toEqual(OC.PERMISSION_ALL - OC.PERMISSION_DELETE); // read expect($tr.attr('data-mime')).toEqual('text/plain'); expect($tr.attr('data-mtime')).toEqual('11111000'); expect($tr.attr('data-share-owner')).not.toBeDefined(); @@ -404,7 +403,8 @@ describe('OCA.Sharing.FileList tests', function() { expect($tr.attr('data-file')).toEqual('local name.txt'); expect($tr.attr('data-path')).toEqual('/local path'); expect($tr.attr('data-size')).not.toBeDefined(); - expect($tr.attr('data-permissions')).toEqual('31'); // read and delete + expect(parseInt($tr.attr('data-permissions'), 10)) + .toEqual(OC.PERMISSION_ALL - OC.PERMISSION_DELETE); // read expect($tr.attr('data-mime')).toEqual('text/plain'); // always use the most recent stime expect($tr.attr('data-mtime')).toEqual('22222000'); @@ -427,9 +427,11 @@ describe('OCA.Sharing.FileList tests', function() { linksOnly: true } ); + OCA.Sharing.Util.attach(fileList); fileList.reload(); + /* jshint camelcase: false */ ocsResponse = { ocs: { meta: { @@ -496,7 +498,8 @@ describe('OCA.Sharing.FileList tests', function() { expect($tr.attr('data-file')).toEqual('local name.txt'); expect($tr.attr('data-path')).toEqual('/local path'); expect($tr.attr('data-size')).not.toBeDefined(); - expect($tr.attr('data-permissions')).toEqual('31'); // read and delete + expect(parseInt($tr.attr('data-permissions'), 10)) + .toEqual(OC.PERMISSION_ALL - OC.PERMISSION_DELETE); // read expect($tr.attr('data-mime')).toEqual('text/plain'); expect($tr.attr('data-mtime')).toEqual('11111000'); expect($tr.attr('data-share-recipients')).not.toBeDefined(); @@ -537,7 +540,8 @@ describe('OCA.Sharing.FileList tests', function() { expect($tr.attr('data-file')).toEqual('local name.txt'); expect($tr.attr('data-path')).toEqual('/local path'); expect($tr.attr('data-size')).not.toBeDefined(); - expect($tr.attr('data-permissions')).toEqual('31'); // read and delete + expect(parseInt($tr.attr('data-permissions'), 10)) + .toEqual(OC.PERMISSION_ALL - OC.PERMISSION_DELETE); // read expect($tr.attr('data-mime')).toEqual('text/plain'); expect($tr.attr('data-mtime')).toEqual('11111000'); expect($tr.attr('data-share-recipients')).not.toBeDefined(); @@ -551,4 +555,87 @@ describe('OCA.Sharing.FileList tests', function() { expect($tr.find('.nametext').text().trim()).toEqual('local name.txt'); }); }); + describe('setting share permissions for files', function () { + beforeEach(function () { + + var $content = $('<div id="content"></div>'); + $('#testArea').append($content); + // dummy file list + var $div = $( + '<div>' + + '<table id="filestable">' + + '<thead></thead>' + + '<tbody id="fileList"></tbody>' + + '</table>' + + '</div>'); + $('#content').append($div); + + fileList = new OCA.Files.FileList($div); + OCA.Sharing.Util.attach(fileList); + }); + + it('external storage root folder', function () { + var $tr; + OC.Share.statuses = {1: {link: false, path: '/subdir'}}; + fileList.setFiles([{ + id: 1, + type: 'dir', + name: 'One.txt', + path: '/subdir', + mimetype: 'text/plain', + size: 12, + permissions: OC.PERMISSION_READ, + etag: 'abc', + shareOwner: 'User One', + recipients: 'User Two', + mountType: 'external-root' + }]); + $tr = fileList.$el.find('tr:first'); + + expect(parseInt($tr.attr('data-share-permissions'), 10)).toEqual(OC.PERMISSION_ALL - OC.PERMISSION_SHARE); + }); + + it('external storage root folder reshare', function () { + var $tr; + OC.Share.statuses = {1: {link: false, path: '/subdir'}}; + fileList.setFiles([{ + id: 1, + type: 'dir', + name: 'One.txt', + path: '/subdir', + mimetype: 'text/plain', + size: 12, + permissions: OC.PERMISSION_READ + OC.PERMISSION_SHARE, + etag: 'abc', + shareOwner: 'User One', + recipients: 'User Two', + mountType: 'external-root' + }]); + $tr = fileList.$el.find('tr:first'); + + expect(parseInt($tr.attr('data-share-permissions'), 10)).toEqual(OC.PERMISSION_ALL); + }); + + it('external storage root folder file', function () { + var $tr; + OC.Share.statuses = {1: {link: false, path: '/subdir'}}; + fileList.setFiles([{ + id: 1, + type: 'file', + name: 'One.txt', + path: '/subdir', + mimetype: 'text/plain', + size: 12, + permissions: OC.PERMISSION_READ, + etag: 'abc', + shareOwner: 'User One', + recipients: 'User Two', + mountType: 'external-root' + }]); + $tr = fileList.$el.find('tr:first'); + + expect(parseInt($tr.attr('data-share-permissions'), 10)) + .toEqual(OC.PERMISSION_ALL - OC.PERMISSION_SHARE - OC.PERMISSION_DELETE); + }); + }); }); diff --git a/apps/files_sharing/tests/middleware/sharingcheckmiddleware.php b/apps/files_sharing/tests/middleware/sharingcheckmiddleware.php new file mode 100644 index 00000000000..90c9a7bba10 --- /dev/null +++ b/apps/files_sharing/tests/middleware/sharingcheckmiddleware.php @@ -0,0 +1,76 @@ +<?php +/** + * @author Lukas Reschke <lukas@owncloud.com> + * @copyright 2014 Lukas Reschke + * + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace OCA\Files_Sharing\Middleware; + + +/** + * @package OCA\Files_Sharing\Middleware\SharingCheckMiddleware + */ +class SharingCheckMiddlewareTest extends \PHPUnit_Framework_TestCase { + + /** @var \OCP\IAppConfig */ + private $appConfig; + /** @var \OCP\AppFramework\IApi */ + private $api; + /** @var SharingCheckMiddleware */ + private $sharingCheckMiddleware; + + protected function setUp() { + $this->appConfig = $this->getMockBuilder('\OCP\IAppConfig') + ->disableOriginalConstructor()->getMock(); + $this->api = $this->getMockBuilder('\OCP\AppFramework\IApi') + ->disableOriginalConstructor()->getMock(); + + $this->sharingCheckMiddleware = new SharingCheckMiddleware('files_sharing', $this->appConfig, $this->api); + } + + public function testIsSharingEnabledWithEverythingEnabled() { + $this->api + ->expects($this->once()) + ->method('isAppEnabled') + ->with('files_sharing') + ->will($this->returnValue(true)); + + $this->appConfig + ->expects($this->once()) + ->method('getValue') + ->with('core', 'shareapi_allow_links', 'yes') + ->will($this->returnValue('yes')); + + $this->assertTrue(\Test_Helper::invokePrivate($this->sharingCheckMiddleware, 'isSharingEnabled')); + } + + public function testIsSharingEnabledWithAppDisabled() { + $this->api + ->expects($this->once()) + ->method('isAppEnabled') + ->with('files_sharing') + ->will($this->returnValue(false)); + + $this->assertFalse(\Test_Helper::invokePrivate($this->sharingCheckMiddleware, 'isSharingEnabled')); + } + + public function testIsSharingEnabledWithSharingDisabled() { + $this->api + ->expects($this->once()) + ->method('isAppEnabled') + ->with('files_sharing') + ->will($this->returnValue(true)); + + $this->appConfig + ->expects($this->once()) + ->method('getValue') + ->with('core', 'shareapi_allow_links', 'yes') + ->will($this->returnValue('no')); + + $this->assertFalse(\Test_Helper::invokePrivate($this->sharingCheckMiddleware, 'isSharingEnabled')); + } +} diff --git a/apps/files_sharing/tests/permissions.php b/apps/files_sharing/tests/permissions.php index 639ebfb5936..f72d724c6fe 100644 --- a/apps/files_sharing/tests/permissions.php +++ b/apps/files_sharing/tests/permissions.php @@ -61,7 +61,7 @@ class Test_Files_Sharing_Permissions extends OCA\Files_sharing\Tests\TestCase { */ private $ownerCache; - function setUp() { + protected function setUp() { parent::setUp(); self::loginHelper(self::TEST_FILES_SHARING_API_USER1); @@ -99,7 +99,7 @@ class Test_Files_Sharing_Permissions extends OCA\Files_sharing\Tests\TestCase { $this->sharedCacheRestrictedShare = $this->sharedStorageRestrictedShare->getCache(); } - function tearDown() { + protected function tearDown() { $this->sharedCache->clear(); self::loginHelper(self::TEST_FILES_SHARING_API_USER1); diff --git a/apps/files_sharing/tests/proxy.php b/apps/files_sharing/tests/proxy.php index 68cd81f963a..31acf9b27de 100644 --- a/apps/files_sharing/tests/proxy.php +++ b/apps/files_sharing/tests/proxy.php @@ -32,7 +32,7 @@ class Test_Files_Sharing_Proxy extends OCA\Files_sharing\Tests\TestCase { private static $tempStorage; - function setUp() { + protected function setUp() { parent::setUp(); // load proxies @@ -53,7 +53,7 @@ class Test_Files_Sharing_Proxy extends OCA\Files_sharing\Tests\TestCase { $this->view->file_put_contents($this->folder . $this->subfolder . $this->filename, $this->data); } - function tearDown() { + protected function tearDown() { $this->view->deleteAll($this->folder); self::$tempStorage = null; diff --git a/apps/files_sharing/tests/server2server.php b/apps/files_sharing/tests/server2server.php new file mode 100644 index 00000000000..0400d357b82 --- /dev/null +++ b/apps/files_sharing/tests/server2server.php @@ -0,0 +1,135 @@ +<?php +/** + * ownCloud - test server-to-server OCS API + * + * @copyright (c) ownCloud, Inc. + * + * @author Bjoern Schiessle <schiessle@owncloud.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this library. If not, see <http://www.gnu.org/licenses/>. + * + */ + +use OCA\Files_Sharing\Tests\TestCase; + +/** + * Class Test_Files_Sharing_Api + */ +class Test_Files_Sharing_S2S_OCS_API extends TestCase { + + const TEST_FOLDER_NAME = '/folder_share_api_test'; + + private $s2s; + + protected function setUp() { + parent::setUp(); + + self::loginHelper(self::TEST_FILES_SHARING_API_USER1); + \OCP\Share::registerBackend('test', 'Test_Share_Backend'); + + $config = $this->getMockBuilder('\OCP\IConfig') + ->disableOriginalConstructor()->getMock(); + $certificateManager = $this->getMock('\OCP\ICertificateManager'); + $httpHelperMock = $this->getMockBuilder('\OC\HTTPHelper') + ->setConstructorArgs(array($config, $certificateManager)) + ->getMock(); + $httpHelperMock->expects($this->any())->method('post')->with($this->anything())->will($this->returnValue(true)); + + $this->registerHttpHelper($httpHelperMock); + + $this->s2s = new \OCA\Files_Sharing\API\Server2Server(); + } + + protected function tearDown() { + $query = \OCP\DB::prepare('DELETE FROM `*PREFIX*share_external`'); + $query->execute(); + + $this->restoreHttpHelper(); + + parent::tearDown(); + } + + /** + * Register an http helper mock for testing purposes. + * @param $httpHelper http helper mock + */ + private function registerHttpHelper($httpHelper) { + $this->oldHttpHelper = \OC::$server->query('HTTPHelper'); + \OC::$server->registerService('HTTPHelper', function ($c) use ($httpHelper) { + return $httpHelper; + }); + } + + /** + * Restore the original http helper + */ + private function restoreHttpHelper() { + $oldHttpHelper = $this->oldHttpHelper; + \OC::$server->registerService('HTTPHelper', function ($c) use ($oldHttpHelper) { + return $oldHttpHelper; + }); + } + + /** + * @medium + */ + function testCreateShare() { + // simulate a post request + $_POST['remote'] = 'localhost'; + $_POST['token'] = 'token'; + $_POST['name'] = 'name'; + $_POST['owner'] = 'owner'; + $_POST['shareWith'] = self::TEST_FILES_SHARING_API_USER2; + $_POST['remoteId'] = 1; + + $result = $this->s2s->createShare(null); + + $this->assertTrue($result->succeeded()); + + $query = \OCP\DB::prepare('SELECT * FROM `*PREFIX*share_external` WHERE `remote_id` = ?'); + $result = $query->execute(array('1')); + $data = $result->fetchRow(); + + $this->assertSame('localhost', $data['remote']); + $this->assertSame('token', $data['share_token']); + $this->assertSame('/name', $data['name']); + $this->assertSame('owner', $data['owner']); + $this->assertSame(self::TEST_FILES_SHARING_API_USER2, $data['user']); + $this->assertSame(1, (int)$data['remote_id']); + $this->assertSame(0, (int)$data['accepted']); + } + + + function testDeclineShare() { + $dummy = \OCP\DB::prepare(' + INSERT INTO `*PREFIX*share` + (`share_type`, `uid_owner`, `item_type`, `item_source`, `item_target`, `file_source`, `file_target`, `permissions`, `stime`, `token`, `share_with`) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + '); + $dummy->execute(array(\OCP\Share::SHARE_TYPE_REMOTE, self::TEST_FILES_SHARING_API_USER1, 'test', '1', '/1', '1', '/test.txt', '1', time(), 'token', 'foo@bar')); + + $verify = \OCP\DB::prepare('SELECT * FROM `*PREFIX*share`'); + $result = $verify->execute(); + $data = $result->fetchAll(); + $this->assertSame(1, count($data)); + + $_POST['token'] = 'token'; + $this->s2s->declineShare(array('id' => $data[0]['id'])); + + $verify = \OCP\DB::prepare('SELECT * FROM `*PREFIX*share`'); + $result = $verify->execute(); + $data = $result->fetchAll(); + $this->assertEmpty($data); + } +} diff --git a/apps/files_sharing/tests/share.php b/apps/files_sharing/tests/share.php index 2b5978f8e57..b8c8b70bd1f 100644 --- a/apps/files_sharing/tests/share.php +++ b/apps/files_sharing/tests/share.php @@ -31,7 +31,7 @@ class Test_Files_Sharing extends OCA\Files_sharing\Tests\TestCase { private static $tempStorage; - function setUp() { + protected function setUp() { parent::setUp(); $this->folder = self::TEST_FOLDER_NAME; @@ -49,7 +49,7 @@ class Test_Files_Sharing extends OCA\Files_sharing\Tests\TestCase { $this->view->file_put_contents($this->folder . $this->subfolder . $this->filename, $this->data); } - function tearDown() { + protected function tearDown() { $this->view->unlink($this->filename); $this->view->deleteAll($this->folder); @@ -105,12 +105,12 @@ class Test_Files_Sharing extends OCA\Files_sharing\Tests\TestCase { $fileinfo = $this->view->getFileInfo($this->filename); $result = \OCP\Share::shareItem('file', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_GROUP, - \Test_Files_Sharing::TEST_FILES_SHARING_API_GROUP1, \OCP\PERMISSION_READ); + \Test_Files_Sharing::TEST_FILES_SHARING_API_GROUP1, \OCP\Constants::PERMISSION_READ); $this->assertTrue($result); $result = \OCP\Share::shareItem('file', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_USER, - \Test_Files_Sharing::TEST_FILES_SHARING_API_USER2, \OCP\PERMISSION_UPDATE); + \Test_Files_Sharing::TEST_FILES_SHARING_API_USER2, \OCP\Constants::PERMISSION_UPDATE); $this->assertTrue($result); @@ -124,7 +124,7 @@ class Test_Files_Sharing extends OCA\Files_sharing\Tests\TestCase { $this->assertSame(1, count($result)); $share = reset($result); - $this->assertSame(\OCP\PERMISSION_READ | \OCP\PERMISSION_UPDATE, $share['permissions']); + $this->assertSame(\OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_UPDATE, $share['permissions']); \OC\Files\Filesystem::rename($this->filename, $this->filename . '-renamed'); @@ -136,7 +136,7 @@ class Test_Files_Sharing extends OCA\Files_sharing\Tests\TestCase { $this->assertSame(1, count($result)); $share = reset($result); - $this->assertSame(\OCP\PERMISSION_READ | \OCP\PERMISSION_UPDATE, $share['permissions']); + $this->assertSame(\OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_UPDATE, $share['permissions']); $this->assertSame($this->filename . '-renamed', $share['file_target']); self::loginHelper(self::TEST_FILES_SHARING_API_USER1); @@ -157,7 +157,7 @@ class Test_Files_Sharing extends OCA\Files_sharing\Tests\TestCase { $share = reset($result); // only the group share permissions should be available now - $this->assertSame(\OCP\PERMISSION_READ, $share['permissions']); + $this->assertSame(\OCP\Constants::PERMISSION_READ, $share['permissions']); $this->assertSame($this->filename . '-renamed', $share['file_target']); } @@ -172,8 +172,8 @@ class Test_Files_Sharing extends OCA\Files_sharing\Tests\TestCase { $fileinfo = $this->view->getFileInfo($this->filename); // share the file to group1 (user2 is a member of this group) and explicitely to user2 - \OCP\Share::shareItem('file', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_GROUP, self::TEST_FILES_SHARING_API_GROUP1, \OCP\PERMISSION_ALL); - \OCP\Share::shareItem('file', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_USER, self::TEST_FILES_SHARING_API_USER2, \OCP\PERMISSION_ALL); + \OCP\Share::shareItem('file', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_GROUP, self::TEST_FILES_SHARING_API_GROUP1, \OCP\Constants::PERMISSION_ALL); + \OCP\Share::shareItem('file', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_USER, self::TEST_FILES_SHARING_API_USER2, \OCP\Constants::PERMISSION_ALL); // user1 should have to shared files $shares = \OCP\Share::getItemsShared('file'); @@ -203,7 +203,7 @@ class Test_Files_Sharing extends OCA\Files_sharing\Tests\TestCase { $this->assertSame(1, count($shares)); // user1 shares a gain the file directly to user2 - \OCP\Share::shareItem('file', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_USER, self::TEST_FILES_SHARING_API_USER2, \OCP\PERMISSION_ALL); + \OCP\Share::shareItem('file', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_USER, self::TEST_FILES_SHARING_API_USER2, \OCP\Constants::PERMISSION_ALL); // user2 should see again welcome.txt and the shared file \Test_Files_Sharing::loginHelper(self::TEST_FILES_SHARING_API_USER2); @@ -243,7 +243,39 @@ class Test_Files_Sharing extends OCA\Files_sharing\Tests\TestCase { $this->assertTrue(\OC\Files\Filesystem::file_exists('/Shared/subfolder/' . $this->folder)); //cleanup - \OCP\Config::deleteSystemValue('share_folder'); + \OC::$server->getConfig()->deleteSystemValue('share_folder'); + } + + function testShareWithGroupUniqueName() { + $this->loginHelper(self::TEST_FILES_SHARING_API_USER1); + \OC\Files\Filesystem::file_put_contents('test.txt', 'test'); + + $fileInfo = \OC\Files\Filesystem::getFileInfo('test.txt'); + + $this->assertTrue( + \OCP\Share::shareItem('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_GROUP, self::TEST_FILES_SHARING_API_GROUP1, 23) + ); + + $this->loginHelper(self::TEST_FILES_SHARING_API_USER2); + + $items = \OCP\Share::getItemsSharedWith('file'); + $this->assertSame('/test.txt' ,$items[0]['file_target']); + $this->assertSame(23, $items[0]['permissions']); + + \OC\Files\Filesystem::rename('test.txt', 'new test.txt'); + + $items = \OCP\Share::getItemsSharedWith('file'); + $this->assertSame('/new test.txt' ,$items[0]['file_target']); + $this->assertSame(23, $items[0]['permissions']); + + $this->loginHelper(self::TEST_FILES_SHARING_API_USER1); + \OCP\Share::setPermissions('file', $items[0]['item_source'], $items[0]['share_type'], $items[0]['share_with'], 3); + + $this->loginHelper(self::TEST_FILES_SHARING_API_USER2); + $items = \OCP\Share::getItemsSharedWith('file'); + + $this->assertSame('/new test.txt' ,$items[0]['file_target']); + $this->assertSame(3, $items[0]['permissions']); } /** @@ -271,14 +303,14 @@ class Test_Files_Sharing extends OCA\Files_sharing\Tests\TestCase { } function DataProviderTestFileSharePermissions() { - $permission1 = \OCP\PERMISSION_ALL; - $permission3 = \OCP\PERMISSION_READ; - $permission4 = \OCP\PERMISSION_READ | \OCP\PERMISSION_UPDATE; - $permission5 = \OCP\PERMISSION_READ | \OCP\PERMISSION_DELETE; - $permission6 = \OCP\PERMISSION_READ | \OCP\PERMISSION_UPDATE | \OCP\PERMISSION_DELETE; + $permission1 = \OCP\Constants::PERMISSION_ALL; + $permission3 = \OCP\Constants::PERMISSION_READ; + $permission4 = \OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_UPDATE; + $permission5 = \OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_DELETE; + $permission6 = \OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_UPDATE | \OCP\Constants::PERMISSION_DELETE; return array( - array($permission1, \OCP\PERMISSION_ALL & ~\OCP\PERMISSION_DELETE), + array($permission1, \OCP\Constants::PERMISSION_ALL & ~\OCP\Constants::PERMISSION_DELETE), array($permission3, $permission3), array($permission4, $permission4), array($permission5, $permission3), diff --git a/apps/files_sharing/tests/sharedmount.php b/apps/files_sharing/tests/sharedmount.php index e991d381e14..dd66ca05d38 100644 --- a/apps/files_sharing/tests/sharedmount.php +++ b/apps/files_sharing/tests/sharedmount.php @@ -25,7 +25,7 @@ */ class Test_Files_Sharing_Mount extends OCA\Files_sharing\Tests\TestCase { - function setUp() { + protected function setUp() { parent::setUp(); $this->folder = '/folder_share_storage_test'; @@ -40,7 +40,7 @@ class Test_Files_Sharing_Mount extends OCA\Files_sharing\Tests\TestCase { $this->view->file_put_contents($this->folder . $this->filename, "file in subfolder"); } - function tearDown() { + protected function tearDown() { $this->view->unlink($this->folder); $this->view->unlink($this->filename); @@ -226,6 +226,10 @@ class Test_Files_Sharing_Mount extends OCA\Files_sharing\Tests\TestCase { } class DummyTestClassSharedMount extends \OCA\Files_Sharing\SharedMount { + public function __construct($storage, $mountpoint, $arguments = null, $loader = null){ + // noop + } + public function stripUserFilesPathDummy($path) { return $this->stripUserFilesPath($path); } diff --git a/apps/files_sharing/tests/sharedstorage.php b/apps/files_sharing/tests/sharedstorage.php index b106add1300..75373244508 100644 --- a/apps/files_sharing/tests/sharedstorage.php +++ b/apps/files_sharing/tests/sharedstorage.php @@ -27,7 +27,7 @@ use OCA\Files\Share; */ class Test_Files_Sharing_Storage extends OCA\Files_sharing\Tests\TestCase { - function setUp() { + protected function setUp() { parent::setUp(); $this->folder = '/folder_share_storage_test'; @@ -42,7 +42,7 @@ class Test_Files_Sharing_Storage extends OCA\Files_sharing\Tests\TestCase { $this->view->file_put_contents($this->folder . $this->filename, "file in subfolder"); } - function tearDown() { + protected function tearDown() { $this->view->unlink($this->folder); $this->view->unlink($this->filename); @@ -197,4 +197,30 @@ class Test_Files_Sharing_Storage extends OCA\Files_sharing\Tests\TestCase { $this->assertTrue($result); } + function testMountSharesOtherUser() { + $folderInfo = $this->view->getFileInfo($this->folder); + $fileInfo = $this->view->getFileInfo($this->filename); + $rootView = new \OC\Files\View(''); + self::loginHelper(self::TEST_FILES_SHARING_API_USER1); + + // share 2 different files with 2 different users + \OCP\Share::shareItem('folder', $folderInfo['fileid'], \OCP\Share::SHARE_TYPE_USER, + self::TEST_FILES_SHARING_API_USER2, 31); + \OCP\Share::shareItem('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER, + self::TEST_FILES_SHARING_API_USER3, 31); + + self::loginHelper(self::TEST_FILES_SHARING_API_USER2); + $this->assertTrue($rootView->file_exists('/' . self::TEST_FILES_SHARING_API_USER2 . '/files/' . $this->folder)); + OC_Hook::emit('OC_Filesystem', 'setup', array('user' => self::TEST_FILES_SHARING_API_USER3, 'user_dir' => \OC_User::getHome(self::TEST_FILES_SHARING_API_USER3))); + + $this->assertTrue($rootView->file_exists('/' . self::TEST_FILES_SHARING_API_USER3 . '/files/' . $this->filename)); + + // make sure we didn't double setup shares for user 2 or mounted the shares for user 3 in user's 2 home + $this->assertFalse($rootView->file_exists('/' . self::TEST_FILES_SHARING_API_USER2 . '/files/' . $this->folder .' (2)')); + $this->assertFalse($rootView->file_exists('/' . self::TEST_FILES_SHARING_API_USER2 . '/files/' . $this->filename)); + + //cleanup + self::loginHelper(self::TEST_FILES_SHARING_API_USER1); + $this->view->unlink($this->folder); + } } diff --git a/apps/files_sharing/tests/testcase.php b/apps/files_sharing/tests/testcase.php index a098feb550d..65fbfac7d1d 100644 --- a/apps/files_sharing/tests/testcase.php +++ b/apps/files_sharing/tests/testcase.php @@ -22,6 +22,7 @@ namespace OCA\Files_Sharing\Tests; +use OC\Files\Filesystem; use OCA\Files\Share; /** @@ -29,7 +30,7 @@ use OCA\Files\Share; * * Base class for sharing tests. */ -abstract class TestCase extends \PHPUnit_Framework_TestCase { +abstract class TestCase extends \Test\TestCase { const TEST_FILES_SHARING_API_USER1 = "test-share-user1"; const TEST_FILES_SHARING_API_USER2 = "test-share-user2"; @@ -48,6 +49,7 @@ abstract class TestCase extends \PHPUnit_Framework_TestCase { public $subfolder; public static function setUpBeforeClass() { + parent::setUpBeforeClass(); // remember files_encryption state self::$stateFilesEncryption = \OC_App::isEnabled('files_encryption'); @@ -65,17 +67,26 @@ abstract class TestCase extends \PHPUnit_Framework_TestCase { \OCP\Util::connectHook('OC_Filesystem', 'setup', '\OC\Files\Storage\Shared', 'setup'); // create users - self::loginHelper(self::TEST_FILES_SHARING_API_USER1, true); - self::loginHelper(self::TEST_FILES_SHARING_API_USER2, true); - self::loginHelper(self::TEST_FILES_SHARING_API_USER3, true); + $backend = new \OC_User_Dummy(); + \OC_User::useBackend($backend); + $backend->createUser(self::TEST_FILES_SHARING_API_USER1, self::TEST_FILES_SHARING_API_USER1); + $backend->createUser(self::TEST_FILES_SHARING_API_USER2, self::TEST_FILES_SHARING_API_USER2); + $backend->createUser(self::TEST_FILES_SHARING_API_USER3, self::TEST_FILES_SHARING_API_USER3); // create group - \OC_Group::createGroup(self::TEST_FILES_SHARING_API_GROUP1); - \OC_Group::addToGroup(self::TEST_FILES_SHARING_API_USER2, self::TEST_FILES_SHARING_API_GROUP1); + $groupBackend = new \OC_Group_Dummy(); + $groupBackend->createGroup(self::TEST_FILES_SHARING_API_GROUP1); + $groupBackend->createGroup('group'); + $groupBackend->addToGroup(self::TEST_FILES_SHARING_API_USER1, 'group'); + $groupBackend->addToGroup(self::TEST_FILES_SHARING_API_USER2, 'group'); + $groupBackend->addToGroup(self::TEST_FILES_SHARING_API_USER3, 'group'); + $groupBackend->addToGroup(self::TEST_FILES_SHARING_API_USER2, self::TEST_FILES_SHARING_API_GROUP1); + \OC_Group::useBackend($groupBackend); } - function setUp() { + protected function setUp() { + parent::setUp(); $this->assertFalse(\OC_App::isEnabled('files_encryption')); @@ -86,13 +97,14 @@ abstract class TestCase extends \PHPUnit_Framework_TestCase { $this->view = new \OC\Files\View('/' . self::TEST_FILES_SHARING_API_USER1 . '/files'); } - function tearDown() { + protected function tearDown() { $query = \OCP\DB::prepare('DELETE FROM `*PREFIX*share`'); $query->execute(); + + parent::tearDown(); } public static function tearDownAfterClass() { - // cleanup users \OC_User::deleteUser(self::TEST_FILES_SHARING_API_USER1); \OC_User::deleteUser(self::TEST_FILES_SHARING_API_USER2); @@ -107,6 +119,12 @@ abstract class TestCase extends \PHPUnit_Framework_TestCase { } else { \OC_App::disable('files_encryption'); } + + \OC_Util::tearDownFS(); + \OC_User::setUserId(''); + Filesystem::tearDown(); + + parent::tearDownAfterClass(); } /** diff --git a/apps/files_sharing/tests/update.php b/apps/files_sharing/tests/update.php deleted file mode 100644 index 583f607d9cb..00000000000 --- a/apps/files_sharing/tests/update.php +++ /dev/null @@ -1,252 +0,0 @@ -<?php -/** - * ownCloud - * - * @author Morris Jobke, Bjoern Schiessle - * @copyright 2014 Morris Jobke <morris.jobke@gmail.com> - * 2014 Bjoern Schiessle <schiessle@ownlcoud.com> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE - * License as published by the Free Software Foundation; either - * version 3 of the License, or any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU AFFERO GENERAL PUBLIC LICENSE for more details. - * - * You should have received a copy of the GNU Affero General Public - * License along with this library. If not, see <http://www.gnu.org/licenses/>. - * - */ - -require_once __DIR__ . '/../appinfo/update.php'; - -/** - * Class Test_Files_Sharing_Update - */ -class Test_Files_Sharing_Update_Routine extends OCA\Files_Sharing\Tests\TestCase { - - const TEST_FOLDER_NAME = '/folder_share_api_test'; - - function setUp() { - parent::setUp(); - - $this->folder = self::TEST_FOLDER_NAME; - - $this->filename = '/share-api-test.txt'; - - // save file with content - $this->view->file_put_contents($this->filename, $this->data); - $this->view->mkdir($this->folder); - $this->view->file_put_contents($this->folder . '/' . $this->filename, $this->data); - } - - function tearDown() { - $this->view->unlink($this->filename); - $this->view->deleteAll($this->folder); - - $removeShares = \OC_DB::prepare('DELETE FROM `*PREFIX*share`'); - $removeShares->execute(); - $removeItems = \OC_DB::prepare('DELETE FROM `*PREFIX*filecache`'); - $removeItems->execute(); - - parent::tearDown(); - } - - /** - * test update of file permission. The update should remove from all shared - * files the delete permission - */ - function testUpdateFilePermissions() { - - self::prepareDBUpdateFilePermissions(); - // run the update routine to update the share permission - updateFilePermissions(2); - - // verify results - $query = \OC_DB::prepare('SELECT * FROM `*PREFIX*share`'); - $result = $query->execute(array()); - - while ($row = $result->fetchRow()) { - if ($row['item_type'] === 'file') { - // for all files the delete permission should be removed - $this->assertSame(0, (int)$row['permissions'] & \OCP\PERMISSION_DELETE); - } else { - // for all other the permission shouldn't change - $this->assertSame(31, (int)$row['permissions'] & \OCP\PERMISSION_ALL); - } - } - - // cleanup - $this->cleanupSharedTable(); - } - - /** - * @medium - */ - function testRemoveBrokenFileShares() { - - $this->prepareFileCache(); - - // check if there are just 4 shares (see setUp - precondition: empty table) - $countAllShares = \OC_DB::prepare('SELECT COUNT(`id`) FROM `*PREFIX*share`'); - $result = $countAllShares->execute()->fetchOne(); - $this->assertEquals(4, $result); - - // check if there are just 3 file shares (see setUp - precondition: empty table) - $countFileShares = \OC_DB::prepare('SELECT COUNT(`id`) FROM `*PREFIX*share` WHERE `item_type` IN (\'file\', \'folder\')'); - $result = $countFileShares->execute()->fetchOne(); - $this->assertEquals(3, $result); - - // check if there are just 2 items (see setUp - precondition: empty table) - $countItems = \OC_DB::prepare('SELECT COUNT(`fileid`) FROM `*PREFIX*filecache`'); - $result = $countItems->execute()->fetchOne(); - $this->assertEquals(2, $result); - - // execute actual code which should be tested - \OC\Files\Cache\Shared_Updater::fixBrokenSharesOnAppUpdate(); - - // check if there are just 2 shares (one gets killed by the code as there is no filecache entry for this) - $result = $countFileShares->execute()->fetchOne(); - $this->assertEquals(2, $result); - - // check if the share of file '200' is removed as there is no entry for this in filecache table - $countFileShares = \OC_DB::prepare('SELECT COUNT(`id`) FROM `*PREFIX*share` WHERE `file_source` = 200'); - $result = $countFileShares->execute()->fetchOne(); - $this->assertEquals(0, $result); - - // check if there are just 2 items - $countItems = \OC_DB::prepare('SELECT COUNT(`fileid`) FROM `*PREFIX*filecache`'); - $result = $countItems->execute()->fetchOne(); - $this->assertEquals(2, $result); - - // the calendar share survived - $countOtherShares = \OC_DB::prepare('SELECT COUNT(`id`) FROM `*PREFIX*share` WHERE `item_source` = \'999\''); - $result = $countOtherShares->execute()->fetchOne(); - $this->assertEquals(1, $result); - } - - /** - * test update for the removal of the logical "Shared" folder. It should update - * the file_target for every share and create a physical "Shared" folder for each user - */ - function testRemoveSharedFolder() { - self::prepareDB(); - // run the update routine to remove the shared folder and replace it with a real folder - removeSharedFolder(false, 2); - - // verify results - $query = \OC_DB::prepare('SELECT * FROM `*PREFIX*share`'); - $result = $query->execute(array()); - - $newDBContent = $result->fetchAll(); - - foreach ($newDBContent as $row) { - if ((int)$row['share_type'] === \OCP\Share::SHARE_TYPE_USER) { - $this->assertSame('/Shared', substr($row['file_target'], 0, strlen('/Shared'))); - } else { - $this->assertSame('/ShouldNotChange', $row['file_target']); - } - } - - $shareFolder = \OCP\Config::getSystemValue('share_folder', '/'); - - $this->assertSame('/Shared', $shareFolder); - - // cleanup - $this->cleanupSharedTable(); - \OCP\Config::deleteSystemValue('share_folder'); - - } - - private function cleanupSharedTable() { - $query = \OC_DB::prepare('DELETE FROM `*PREFIX*share`'); - $query->execute(); - } - - /** - * prepare sharing table for testRemoveSharedFolder() - */ - private function prepareDB() { - $this->cleanupSharedTable(); - // add items except one - because this is the test case for the broken share table - $addItems = \OC_DB::prepare('INSERT INTO `*PREFIX*share` (`share_type`, `item_type`, ' . - '`share_with`, `uid_owner` , `file_target`) ' . - 'VALUES (?, ?, ?, ?, ?)'); - $items = array( - array(\OCP\Share::SHARE_TYPE_USER, 'file', 'user1', 'admin' , '/foo'), - array(\OCP\Share::SHARE_TYPE_USER, 'folder', 'user2', 'admin', '/foo2'), - array(\OCP\Share::SHARE_TYPE_USER, 'file', 'user3', 'admin', '/foo3'), - array(\OCP\Share::SHARE_TYPE_USER, 'folder', 'user4', 'admin', '/foo4'), - array(\OCP\Share::SHARE_TYPE_USER, 'folder', 'user4', 'admin', "/foo'4"), - array(\OCP\Share::SHARE_TYPE_LINK, 'file', 'user1', 'admin', '/ShouldNotChange'), - array(\OCP\Share::SHARE_TYPE_CONTACT, 'contact', 'admin', 'user1', '/ShouldNotChange'), - - ); - foreach($items as $item) { - // the number is used as path_hash - $addItems->execute($item); - } - } - - /** - * prepare sharing table for testUpdateFilePermissions() - */ - private function prepareDBUpdateFilePermissions() { - $this->cleanupSharedTable(); - // add items except one - because this is the test case for the broken share table - $addItems = \OC_DB::prepare('INSERT INTO `*PREFIX*share` (`share_type`, `item_type`, ' . - '`share_with`, `uid_owner` , `file_target`, `permissions`) ' . - 'VALUES (?, ?, ?, ?, ?, ?)'); - $items = array( - array(\OCP\Share::SHARE_TYPE_LINK, 'file', 'user1', 'admin', '/foo', \OCP\PERMISSION_ALL), - array(\OCP\Share::SHARE_TYPE_CONTACT, 'contact', 'admin', 'user1', '/foo', \OCP\PERMISSION_ALL), - array(\OCP\Share::SHARE_TYPE_USER, 'folder', 'user4', 'admin', '/foo', \OCP\PERMISSION_ALL), - array(\OCP\Share::SHARE_TYPE_USER, 'file', 'user3', 'admin', '/foo3', \OCP\PERMISSION_ALL), - array(\OCP\Share::SHARE_TYPE_USER, 'file', 'user1', 'admin' , '/foo', \OCP\PERMISSION_DELETE), - array(\OCP\Share::SHARE_TYPE_USER, 'file', 'user1', 'admin' , '/foo', \OCP\PERMISSION_READ & \OCP\PERMISSION_DELETE), - array(\OCP\Share::SHARE_TYPE_USER, 'file', 'user1', 'admin' , '/foo', \OCP\PERMISSION_SHARE & \OCP\PERMISSION_UPDATE), - array(\OCP\Share::SHARE_TYPE_USER, 'file', 'user1', 'admin' , '/foo', \OCP\PERMISSION_ALL), - array(\OCP\Share::SHARE_TYPE_USER, 'file', 'user1', 'admin' , '/foo', \OCP\PERMISSION_SHARE & \OCP\PERMISSION_READ & \OCP\PERMISSION_DELETE), - ); - foreach($items as $item) { - // the number is used as path_hash - $addItems->execute($item); - } - } - - /** - * prepare file cache for testRemoveBrokenShares() - */ - private function prepareFileCache() { - // some previous tests didn't clean up and therefore this has to be done here - // FIXME: DIRTY HACK - TODO: find tests, that don't clean up and fix it there - $this->tearDown(); - - // add items except one - because this is the test case for the broken share table - $addItems = \OC_DB::prepare('INSERT INTO `*PREFIX*filecache` (`storage`, `path_hash`, ' . - '`parent`, `mimetype`, `mimepart`, `size`, `mtime`, `storage_mtime`) ' . - 'VALUES (1, ?, 1, 1, 1, 1, 1, 1)'); - $items = array(1, 3); - $fileIds = array(); - foreach($items as $item) { - // the number is used as path_hash - $addItems->execute(array($item)); - $fileIds[] = \OC_DB::insertId('*PREFIX*filecache'); - } - - $addShares = \OC_DB::prepare('INSERT INTO `*PREFIX*share` (`file_source`, `item_type`, `uid_owner`) VALUES (?, \'file\', 1)'); - // the number is used as item_source - $addShares->execute(array($fileIds[0])); - $addShares->execute(array(200)); // id of "deleted" file - $addShares->execute(array($fileIds[1])); - - // add a few unrelated shares, calendar share that must be left untouched - $addShares = \OC_DB::prepare('INSERT INTO `*PREFIX*share` (`item_source`, `item_type`, `uid_owner`) VALUES (?, \'calendar\', 1)'); - // the number is used as item_source - $addShares->execute(array(999)); - } - -} diff --git a/apps/files_sharing/tests/updater.php b/apps/files_sharing/tests/updater.php index 07349c1334d..bc8deaf19b0 100644 --- a/apps/files_sharing/tests/updater.php +++ b/apps/files_sharing/tests/updater.php @@ -20,7 +20,6 @@ * */ -require_once __DIR__ . '/../appinfo/update.php'; /** * Class Test_Files_Sharing_Updater @@ -34,7 +33,7 @@ class Test_Files_Sharing_Updater extends OCA\Files_sharing\Tests\TestCase { \OCA\Files_Sharing\Helper::registerHooks(); } - function setUp() { + protected function setUp() { parent::setUp(); $this->folder = self::TEST_FOLDER_NAME; @@ -47,7 +46,7 @@ class Test_Files_Sharing_Updater extends OCA\Files_sharing\Tests\TestCase { $this->view->file_put_contents($this->folder . '/' . $this->filename, $this->data); } - function tearDown() { + protected function tearDown() { $this->view->unlink($this->filename); $this->view->deleteAll($this->folder); diff --git a/apps/files_sharing/tests/watcher.php b/apps/files_sharing/tests/watcher.php index 67f55394ae8..254b30c6470 100644 --- a/apps/files_sharing/tests/watcher.php +++ b/apps/files_sharing/tests/watcher.php @@ -42,7 +42,7 @@ class Test_Files_Sharing_Watcher extends OCA\Files_sharing\Tests\TestCase { */ private $sharedCache; - function setUp() { + protected function setUp() { parent::setUp(); self::loginHelper(self::TEST_FILES_SHARING_API_USER1); @@ -71,7 +71,7 @@ class Test_Files_Sharing_Watcher extends OCA\Files_sharing\Tests\TestCase { $this->sharedCache = $this->sharedStorage->getCache(); } - function tearDown() { + protected function tearDown() { $this->sharedCache->clear(); self::loginHelper(self::TEST_FILES_SHARING_API_USER1); diff --git a/apps/files_trashbin/appinfo/app.php b/apps/files_trashbin/appinfo/app.php index 7df52da6314..0e2cbaa529f 100644 --- a/apps/files_trashbin/appinfo/app.php +++ b/apps/files_trashbin/appinfo/app.php @@ -3,8 +3,6 @@ $l = \OC::$server->getL10N('files_trashbin'); OCP\Util::addTranslations('files_trashbin'); -OC::$CLASSPATH['OCA\Files_Trashbin\Exceptions\CopyRecursiveException'] = 'files_trashbin/lib/exceptions.php'; - // register hooks \OCA\Files_Trashbin\Trashbin::registerHooks(); diff --git a/apps/files_trashbin/appinfo/routes.php b/apps/files_trashbin/appinfo/routes.php index da268f4fdfd..56dbf382735 100644 --- a/apps/files_trashbin/appinfo/routes.php +++ b/apps/files_trashbin/appinfo/routes.php @@ -13,3 +13,7 @@ $this->create('files_trashbin_ajax_list', 'ajax/list.php') ->actionInclude('files_trashbin/ajax/list.php'); $this->create('files_trashbin_ajax_undelete', 'ajax/undelete.php') ->actionInclude('files_trashbin/ajax/undelete.php'); + + +// Register with the capabilities API +\OC_API::register('get', '/cloud/capabilities', array('OCA\Files_Trashbin\Capabilities', 'getCapabilities'), 'files_trashbin', \OC_API::USER_AUTH); diff --git a/apps/files_trashbin/js/app.js b/apps/files_trashbin/js/app.js index 376ee7b01ca..c5de08d5922 100644 --- a/apps/files_trashbin/js/app.js +++ b/apps/files_trashbin/js/app.js @@ -8,7 +8,13 @@ * */ +/** + * @namespace OCA.Trashbin + */ OCA.Trashbin = {}; +/** + * @namespace OCA.Trashbin.App + */ OCA.Trashbin.App = { _initialized: false, @@ -51,21 +57,35 @@ OCA.Trashbin.App = { ); }, t('files_trashbin', 'Restore')); - fileActions.register('all', 'Delete', OC.PERMISSION_READ, function() { - return OC.imagePath('core', 'actions/delete'); - }, function(filename, context) { - var fileList = context.fileList; - $('.tipsy').remove(); - var tr = fileList.findFileEl(filename); - var deleteAction = tr.children("td.date").children(".action.delete"); - deleteAction.removeClass('icon-delete').addClass('icon-loading-small'); - fileList.disableActions(); - $.post(OC.filePath('files_trashbin', 'ajax', 'delete.php'), { - files: JSON.stringify([filename]), - dir: fileList.getCurrentDirectory() - }, - _.bind(fileList._removeCallback, fileList) - ); + fileActions.registerAction({ + name: 'Delete', + displayName: '', + mime: 'all', + permissions: OC.PERMISSION_READ, + icon: function() { + return OC.imagePath('core', 'actions/delete'); + }, + render: function(actionSpec, isDefault, context) { + var $actionLink = fileActions._makeActionLink(actionSpec, context); + $actionLink.attr('original-title', t('files', 'Delete permanently')); + $actionLink.children('img').attr('alt', t('files', 'Delete permanently')); + context.$file.find('td:last').append($actionLink); + return $actionLink; + }, + actionHandler: function(filename, context) { + var fileList = context.fileList; + $('.tipsy').remove(); + var tr = fileList.findFileEl(filename); + var deleteAction = tr.children("td.date").children(".action.delete"); + deleteAction.removeClass('icon-delete').addClass('icon-loading-small'); + fileList.disableActions(); + $.post(OC.filePath('files_trashbin', 'ajax', 'delete.php'), { + files: JSON.stringify([filename]), + dir: fileList.getCurrentDirectory() + }, + _.bind(fileList._removeCallback, fileList) + ); + } }); return fileActions; } diff --git a/apps/files_trashbin/js/filelist.js b/apps/files_trashbin/js/filelist.js index b8688d89765..71b63721897 100644 --- a/apps/files_trashbin/js/filelist.js +++ b/apps/files_trashbin/js/filelist.js @@ -14,8 +14,8 @@ * Convert a file name in the format filename.d12345 to the real file name. * This will use basename. * The name will not be changed if it has no ".d12345" suffix. - * @param name file name - * @return converted file name + * @param {String} name file name + * @return {String} converted file name */ function getDeletedFileName(name) { name = OC.basename(name); @@ -26,13 +26,26 @@ return name; } + /** + * @class OCA.Trashbin.FileList + * @augments OCA.Files.FileList + * @classdesc List of deleted files + * + * @param $el container element with existing markup for the #controls + * and a table + * @param [options] map of options + */ var FileList = function($el, options) { this.initialize($el, options); }; - FileList.prototype = _.extend({}, OCA.Files.FileList.prototype, { + FileList.prototype = _.extend({}, OCA.Files.FileList.prototype, + /** @lends OCA.Trashbin.FileList.prototype */ { id: 'trashbin', appName: t('files_trashbin', 'Deleted files'), + /** + * @private + */ initialize: function() { var result = OCA.Files.FileList.prototype.initialize.apply(this, arguments); this.$el.find('.undelete').click('click', _.bind(this._onClickRestoreSelected, this)); @@ -51,6 +64,7 @@ return parts; }; + OC.Plugins.attach('OCA.Trashbin.FileList', this); return result; }, @@ -255,6 +269,10 @@ updateStorageStatistics: function() { // no op because the trashbin doesn't have // storage info like free space / used space + }, + + isSelectedDeletable: function() { + return true; } }); diff --git a/apps/files_trashbin/l10n/af_ZA.js b/apps/files_trashbin/l10n/af_ZA.js new file mode 100644 index 00000000000..bde70775250 --- /dev/null +++ b/apps/files_trashbin/l10n/af_ZA.js @@ -0,0 +1,6 @@ +OC.L10N.register( + "files_trashbin", + { + "Error" : "Fout" +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/files_trashbin/l10n/af_ZA.json b/apps/files_trashbin/l10n/af_ZA.json new file mode 100644 index 00000000000..0ed511058ba --- /dev/null +++ b/apps/files_trashbin/l10n/af_ZA.json @@ -0,0 +1,4 @@ +{ "translations": { + "Error" : "Fout" +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/files_trashbin/l10n/ar.js b/apps/files_trashbin/l10n/ar.js index 549cac51433..bd6a6ef89d9 100644 --- a/apps/files_trashbin/l10n/ar.js +++ b/apps/files_trashbin/l10n/ar.js @@ -5,9 +5,9 @@ OC.L10N.register( "Couldn't restore %s" : "تعذّر استرجاع %s ", "Deleted files" : "حذف الملفات", "Restore" : "استعيد", + "Delete permanently" : "حذف بشكل دائم", "Error" : "خطأ", "restored" : "تمت الاستعادة", - "Nothing in here. Your trash bin is empty!" : "لا يوجد شيء هنا. سلة المهملات خاليه.", "Name" : "اسم", "Deleted" : "تم الحذف", "Delete" : "إلغاء" diff --git a/apps/files_trashbin/l10n/ar.json b/apps/files_trashbin/l10n/ar.json index 2c34afb3781..4df828c0843 100644 --- a/apps/files_trashbin/l10n/ar.json +++ b/apps/files_trashbin/l10n/ar.json @@ -3,9 +3,9 @@ "Couldn't restore %s" : "تعذّر استرجاع %s ", "Deleted files" : "حذف الملفات", "Restore" : "استعيد", + "Delete permanently" : "حذف بشكل دائم", "Error" : "خطأ", "restored" : "تمت الاستعادة", - "Nothing in here. Your trash bin is empty!" : "لا يوجد شيء هنا. سلة المهملات خاليه.", "Name" : "اسم", "Deleted" : "تم الحذف", "Delete" : "إلغاء" diff --git a/apps/files_trashbin/l10n/ast.js b/apps/files_trashbin/l10n/ast.js index 647602bf46b..804814b5892 100644 --- a/apps/files_trashbin/l10n/ast.js +++ b/apps/files_trashbin/l10n/ast.js @@ -5,9 +5,9 @@ OC.L10N.register( "Couldn't restore %s" : "Nun pudo restaurase %s", "Deleted files" : "Ficheros desaniciaos", "Restore" : "Restaurar", + "Delete permanently" : "Desaniciar dafechu", "Error" : "Fallu", "restored" : "recuperóse", - "Nothing in here. Your trash bin is empty!" : "Nun hai un res equí. La papelera ta balera!", "Name" : "Nome", "Deleted" : "Desaniciáu", "Delete" : "Desaniciar" diff --git a/apps/files_trashbin/l10n/ast.json b/apps/files_trashbin/l10n/ast.json index 9530d37871e..47b21cdec4d 100644 --- a/apps/files_trashbin/l10n/ast.json +++ b/apps/files_trashbin/l10n/ast.json @@ -3,9 +3,9 @@ "Couldn't restore %s" : "Nun pudo restaurase %s", "Deleted files" : "Ficheros desaniciaos", "Restore" : "Restaurar", + "Delete permanently" : "Desaniciar dafechu", "Error" : "Fallu", "restored" : "recuperóse", - "Nothing in here. Your trash bin is empty!" : "Nun hai un res equí. La papelera ta balera!", "Name" : "Nome", "Deleted" : "Desaniciáu", "Delete" : "Desaniciar" diff --git a/apps/files_trashbin/l10n/az.js b/apps/files_trashbin/l10n/az.js index 515abea51c2..3a3f779a9f5 100644 --- a/apps/files_trashbin/l10n/az.js +++ b/apps/files_trashbin/l10n/az.js @@ -7,7 +7,6 @@ OC.L10N.register( "Restore" : "Geri qaytar", "Error" : "Səhv", "restored" : "geriqaytarılıb", - "Nothing in here. Your trash bin is empty!" : "Burda heçnə yoxdur. Sizin zibil qutusu boşdur!", "Name" : "Ad", "Deleted" : "Silinib", "Delete" : "Sil" diff --git a/apps/files_trashbin/l10n/az.json b/apps/files_trashbin/l10n/az.json index 4c7f63028e2..4400b23d39a 100644 --- a/apps/files_trashbin/l10n/az.json +++ b/apps/files_trashbin/l10n/az.json @@ -5,7 +5,6 @@ "Restore" : "Geri qaytar", "Error" : "Səhv", "restored" : "geriqaytarılıb", - "Nothing in here. Your trash bin is empty!" : "Burda heçnə yoxdur. Sizin zibil qutusu boşdur!", "Name" : "Ad", "Deleted" : "Silinib", "Delete" : "Sil" diff --git a/apps/files_trashbin/l10n/bg_BG.js b/apps/files_trashbin/l10n/bg_BG.js index f910190faf1..eae24b14a1b 100644 --- a/apps/files_trashbin/l10n/bg_BG.js +++ b/apps/files_trashbin/l10n/bg_BG.js @@ -5,9 +5,9 @@ OC.L10N.register( "Couldn't restore %s" : "Неуспешно възтановяване на %s.", "Deleted files" : "Изтрити файлове", "Restore" : "Възстановяви", + "Delete permanently" : "Изтрий завинаги", "Error" : "Грешка", "restored" : "възстановено", - "Nothing in here. Your trash bin is empty!" : "Няма нищо. Кошчето е празно!", "Name" : "Име", "Deleted" : "Изтрито", "Delete" : "Изтрий" diff --git a/apps/files_trashbin/l10n/bg_BG.json b/apps/files_trashbin/l10n/bg_BG.json index 1d8cb72dc2a..2e83d97304c 100644 --- a/apps/files_trashbin/l10n/bg_BG.json +++ b/apps/files_trashbin/l10n/bg_BG.json @@ -3,9 +3,9 @@ "Couldn't restore %s" : "Неуспешно възтановяване на %s.", "Deleted files" : "Изтрити файлове", "Restore" : "Възстановяви", + "Delete permanently" : "Изтрий завинаги", "Error" : "Грешка", "restored" : "възстановено", - "Nothing in here. Your trash bin is empty!" : "Няма нищо. Кошчето е празно!", "Name" : "Име", "Deleted" : "Изтрито", "Delete" : "Изтрий" diff --git a/apps/files_trashbin/l10n/bn_BD.js b/apps/files_trashbin/l10n/bn_BD.js index 632b387d3b6..6f6626b71cc 100644 --- a/apps/files_trashbin/l10n/bn_BD.js +++ b/apps/files_trashbin/l10n/bn_BD.js @@ -7,7 +7,6 @@ OC.L10N.register( "Restore" : "ফিরিয়ে দাও", "Error" : "সমস্যা", "restored" : "পূণঃসংরক্ষিত", - "Nothing in here. Your trash bin is empty!" : "এখানে কিছু নেই। আপনার ট্র্যাসবিন শুন্য", "Name" : "নাম", "Deleted" : "মুছে ফেলা", "Delete" : "মুছে" diff --git a/apps/files_trashbin/l10n/bn_BD.json b/apps/files_trashbin/l10n/bn_BD.json index 9d0575766a9..affc277fcda 100644 --- a/apps/files_trashbin/l10n/bn_BD.json +++ b/apps/files_trashbin/l10n/bn_BD.json @@ -5,7 +5,6 @@ "Restore" : "ফিরিয়ে দাও", "Error" : "সমস্যা", "restored" : "পূণঃসংরক্ষিত", - "Nothing in here. Your trash bin is empty!" : "এখানে কিছু নেই। আপনার ট্র্যাসবিন শুন্য", "Name" : "নাম", "Deleted" : "মুছে ফেলা", "Delete" : "মুছে" diff --git a/apps/files_trashbin/l10n/bn_IN.js b/apps/files_trashbin/l10n/bn_IN.js index eacbbbc76d6..5943177a923 100644 --- a/apps/files_trashbin/l10n/bn_IN.js +++ b/apps/files_trashbin/l10n/bn_IN.js @@ -5,9 +5,9 @@ OC.L10N.register( "Couldn't restore %s" : "%s পুনরুদ্ধার করা যায়নি", "Deleted files" : "ফাইলস মুছে ফেলা হয়েছে", "Restore" : "পুনরুদ্ধার", + "Delete permanently" : "স্থায়ীভাবে মুছে দিন", "Error" : "ভুল", "restored" : "পুনরুদ্ধার করা হয়েছে", - "Nothing in here. Your trash bin is empty!" : "কিছুই নেই এখানে।আপনার ট্র্যাশ বিন খালি!", "Name" : "নাম", "Deleted" : "মুছে ফেলা হয়েছে", "Delete" : "মুছে ফেলা" diff --git a/apps/files_trashbin/l10n/bn_IN.json b/apps/files_trashbin/l10n/bn_IN.json index 74a8ca13388..45a24ee7675 100644 --- a/apps/files_trashbin/l10n/bn_IN.json +++ b/apps/files_trashbin/l10n/bn_IN.json @@ -3,9 +3,9 @@ "Couldn't restore %s" : "%s পুনরুদ্ধার করা যায়নি", "Deleted files" : "ফাইলস মুছে ফেলা হয়েছে", "Restore" : "পুনরুদ্ধার", + "Delete permanently" : "স্থায়ীভাবে মুছে দিন", "Error" : "ভুল", "restored" : "পুনরুদ্ধার করা হয়েছে", - "Nothing in here. Your trash bin is empty!" : "কিছুই নেই এখানে।আপনার ট্র্যাশ বিন খালি!", "Name" : "নাম", "Deleted" : "মুছে ফেলা হয়েছে", "Delete" : "মুছে ফেলা" diff --git a/apps/files_trashbin/l10n/bs.js b/apps/files_trashbin/l10n/bs.js index 70b584f2951..0378a76f855 100644 --- a/apps/files_trashbin/l10n/bs.js +++ b/apps/files_trashbin/l10n/bs.js @@ -1,6 +1,10 @@ OC.L10N.register( "files_trashbin", { - "Name" : "Ime" + "Restore" : "Obnovi", + "Error" : "Greška", + "Select all" : "Označi sve", + "Name" : "Ime", + "Delete" : "Izbriši" }, "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/apps/files_trashbin/l10n/bs.json b/apps/files_trashbin/l10n/bs.json index b91bf025992..6f222ca37af 100644 --- a/apps/files_trashbin/l10n/bs.json +++ b/apps/files_trashbin/l10n/bs.json @@ -1,4 +1,8 @@ { "translations": { - "Name" : "Ime" + "Restore" : "Obnovi", + "Error" : "Greška", + "Select all" : "Označi sve", + "Name" : "Ime", + "Delete" : "Izbriši" },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" }
\ No newline at end of file diff --git a/apps/files_trashbin/l10n/ca.js b/apps/files_trashbin/l10n/ca.js index 7a31c5c2d9d..450358c851f 100644 --- a/apps/files_trashbin/l10n/ca.js +++ b/apps/files_trashbin/l10n/ca.js @@ -5,9 +5,9 @@ OC.L10N.register( "Couldn't restore %s" : "No s'ha pogut restaurar %s", "Deleted files" : "Fitxers esborrats", "Restore" : "Recupera", + "Delete permanently" : "Esborra permanentment", "Error" : "Error", "restored" : "restaurat", - "Nothing in here. Your trash bin is empty!" : "La paperera està buida!", "Name" : "Nom", "Deleted" : "Eliminat", "Delete" : "Esborra" diff --git a/apps/files_trashbin/l10n/ca.json b/apps/files_trashbin/l10n/ca.json index 586b14d0c57..eb11197b630 100644 --- a/apps/files_trashbin/l10n/ca.json +++ b/apps/files_trashbin/l10n/ca.json @@ -3,9 +3,9 @@ "Couldn't restore %s" : "No s'ha pogut restaurar %s", "Deleted files" : "Fitxers esborrats", "Restore" : "Recupera", + "Delete permanently" : "Esborra permanentment", "Error" : "Error", "restored" : "restaurat", - "Nothing in here. Your trash bin is empty!" : "La paperera està buida!", "Name" : "Nom", "Deleted" : "Eliminat", "Delete" : "Esborra" diff --git a/apps/files_trashbin/l10n/cs_CZ.js b/apps/files_trashbin/l10n/cs_CZ.js index 3f8ddfc2235..68aa7789d75 100644 --- a/apps/files_trashbin/l10n/cs_CZ.js +++ b/apps/files_trashbin/l10n/cs_CZ.js @@ -5,9 +5,13 @@ OC.L10N.register( "Couldn't restore %s" : "Nelze obnovit %s", "Deleted files" : "Odstraněné soubory", "Restore" : "Obnovit", + "Delete permanently" : "Trvale odstranit", "Error" : "Chyba", "restored" : "obnoveno", - "Nothing in here. Your trash bin is empty!" : "Žádný obsah. Váš koš je prázdný.", + "No deleted files" : "Žádné smazané soubory", + "You will be able to recover deleted files from here" : "Odtud budete moci obnovovat odstraněné soubory", + "No entries found in this folder" : "V tomto adresáři nebylo nic nalezeno", + "Select all" : "Vybrat vše", "Name" : "Název", "Deleted" : "Smazáno", "Delete" : "Smazat" diff --git a/apps/files_trashbin/l10n/cs_CZ.json b/apps/files_trashbin/l10n/cs_CZ.json index 628ab047ba8..1af12b47b66 100644 --- a/apps/files_trashbin/l10n/cs_CZ.json +++ b/apps/files_trashbin/l10n/cs_CZ.json @@ -3,9 +3,13 @@ "Couldn't restore %s" : "Nelze obnovit %s", "Deleted files" : "Odstraněné soubory", "Restore" : "Obnovit", + "Delete permanently" : "Trvale odstranit", "Error" : "Chyba", "restored" : "obnoveno", - "Nothing in here. Your trash bin is empty!" : "Žádný obsah. Váš koš je prázdný.", + "No deleted files" : "Žádné smazané soubory", + "You will be able to recover deleted files from here" : "Odtud budete moci obnovovat odstraněné soubory", + "No entries found in this folder" : "V tomto adresáři nebylo nic nalezeno", + "Select all" : "Vybrat vše", "Name" : "Název", "Deleted" : "Smazáno", "Delete" : "Smazat" diff --git a/apps/files_trashbin/l10n/cy_GB.js b/apps/files_trashbin/l10n/cy_GB.js index d5ccb0f7415..cd20621625f 100644 --- a/apps/files_trashbin/l10n/cy_GB.js +++ b/apps/files_trashbin/l10n/cy_GB.js @@ -5,8 +5,8 @@ OC.L10N.register( "Couldn't restore %s" : "Methwyd adfer %s", "Deleted files" : "Ffeiliau ddilewyd", "Restore" : "Adfer", + "Delete permanently" : "Dileu'n barhaol", "Error" : "Gwall", - "Nothing in here. Your trash bin is empty!" : "Does dim byd yma. Mae eich bin sbwriel yn wag!", "Name" : "Enw", "Deleted" : "Wedi dileu", "Delete" : "Dileu" diff --git a/apps/files_trashbin/l10n/cy_GB.json b/apps/files_trashbin/l10n/cy_GB.json index d82ea580325..0f21da0c56d 100644 --- a/apps/files_trashbin/l10n/cy_GB.json +++ b/apps/files_trashbin/l10n/cy_GB.json @@ -3,8 +3,8 @@ "Couldn't restore %s" : "Methwyd adfer %s", "Deleted files" : "Ffeiliau ddilewyd", "Restore" : "Adfer", + "Delete permanently" : "Dileu'n barhaol", "Error" : "Gwall", - "Nothing in here. Your trash bin is empty!" : "Does dim byd yma. Mae eich bin sbwriel yn wag!", "Name" : "Enw", "Deleted" : "Wedi dileu", "Delete" : "Dileu" diff --git a/apps/files_trashbin/l10n/da.js b/apps/files_trashbin/l10n/da.js index 2d24f3749f6..151ff2bb56a 100644 --- a/apps/files_trashbin/l10n/da.js +++ b/apps/files_trashbin/l10n/da.js @@ -5,9 +5,12 @@ OC.L10N.register( "Couldn't restore %s" : "Kunne ikke gendanne %s", "Deleted files" : "Slettede filer", "Restore" : "Gendan", + "Delete permanently" : "Slet permanent", "Error" : "Fejl", "restored" : "Gendannet", - "Nothing in here. Your trash bin is empty!" : "Intet at se her. Din papirkurv er tom!", + "No deleted files" : "Ingen slettede filer", + "You will be able to recover deleted files from here" : "Du vil kunne gendanne slettede filer herfra", + "Select all" : "Vælg alle", "Name" : "Navn", "Deleted" : "Slettet", "Delete" : "Slet" diff --git a/apps/files_trashbin/l10n/da.json b/apps/files_trashbin/l10n/da.json index 4fbed5049a9..d3d7d89bd91 100644 --- a/apps/files_trashbin/l10n/da.json +++ b/apps/files_trashbin/l10n/da.json @@ -3,9 +3,12 @@ "Couldn't restore %s" : "Kunne ikke gendanne %s", "Deleted files" : "Slettede filer", "Restore" : "Gendan", + "Delete permanently" : "Slet permanent", "Error" : "Fejl", "restored" : "Gendannet", - "Nothing in here. Your trash bin is empty!" : "Intet at se her. Din papirkurv er tom!", + "No deleted files" : "Ingen slettede filer", + "You will be able to recover deleted files from here" : "Du vil kunne gendanne slettede filer herfra", + "Select all" : "Vælg alle", "Name" : "Navn", "Deleted" : "Slettet", "Delete" : "Slet" diff --git a/apps/files_trashbin/l10n/de.js b/apps/files_trashbin/l10n/de.js index 85274258143..96addde03b2 100644 --- a/apps/files_trashbin/l10n/de.js +++ b/apps/files_trashbin/l10n/de.js @@ -5,9 +5,13 @@ OC.L10N.register( "Couldn't restore %s" : "Konnte %s nicht wiederherstellen", "Deleted files" : "Gelöschte Dateien", "Restore" : "Wiederherstellen", + "Delete permanently" : "Endgültig löschen", "Error" : "Fehler", "restored" : "Wiederhergestellt", - "Nothing in here. Your trash bin is empty!" : "Nichts zu löschen, der Papierkorb ist leer!", + "No deleted files" : "Keine gelöschten Dateien", + "You will be able to recover deleted files from here" : "Du kannst hier gelöschte Dateien wiederherstellen", + "No entries found in this folder" : "Keine Einträge in diesem Ordner gefunden", + "Select all" : "Alle auswählen", "Name" : "Name", "Deleted" : "gelöscht", "Delete" : "Löschen" diff --git a/apps/files_trashbin/l10n/de.json b/apps/files_trashbin/l10n/de.json index 16e3cb2ae79..d7b9b07b87e 100644 --- a/apps/files_trashbin/l10n/de.json +++ b/apps/files_trashbin/l10n/de.json @@ -3,9 +3,13 @@ "Couldn't restore %s" : "Konnte %s nicht wiederherstellen", "Deleted files" : "Gelöschte Dateien", "Restore" : "Wiederherstellen", + "Delete permanently" : "Endgültig löschen", "Error" : "Fehler", "restored" : "Wiederhergestellt", - "Nothing in here. Your trash bin is empty!" : "Nichts zu löschen, der Papierkorb ist leer!", + "No deleted files" : "Keine gelöschten Dateien", + "You will be able to recover deleted files from here" : "Du kannst hier gelöschte Dateien wiederherstellen", + "No entries found in this folder" : "Keine Einträge in diesem Ordner gefunden", + "Select all" : "Alle auswählen", "Name" : "Name", "Deleted" : "gelöscht", "Delete" : "Löschen" diff --git a/apps/files_trashbin/l10n/de_DE.js b/apps/files_trashbin/l10n/de_DE.js index 70a428d4c93..c25166efc80 100644 --- a/apps/files_trashbin/l10n/de_DE.js +++ b/apps/files_trashbin/l10n/de_DE.js @@ -5,9 +5,13 @@ OC.L10N.register( "Couldn't restore %s" : "Konnte %s nicht wiederherstellen", "Deleted files" : "Gelöschte Dateien", "Restore" : "Wiederherstellen", + "Delete permanently" : "Endgültig löschen", "Error" : "Fehler", "restored" : "Wiederhergestellt", - "Nothing in here. Your trash bin is empty!" : "Nichts zu löschen, Ihr Papierkorb ist leer!", + "No deleted files" : "Keine gelöschten Dateien", + "You will be able to recover deleted files from here" : "Sie können hier gelöschte Dateien wiederherstellen", + "No entries found in this folder" : "Keine Einträge in diesem Ordner gefunden", + "Select all" : "Alle auswählen", "Name" : "Name", "Deleted" : "Gelöscht", "Delete" : "Löschen" diff --git a/apps/files_trashbin/l10n/de_DE.json b/apps/files_trashbin/l10n/de_DE.json index 497b6c35d55..9f4a895fa16 100644 --- a/apps/files_trashbin/l10n/de_DE.json +++ b/apps/files_trashbin/l10n/de_DE.json @@ -3,9 +3,13 @@ "Couldn't restore %s" : "Konnte %s nicht wiederherstellen", "Deleted files" : "Gelöschte Dateien", "Restore" : "Wiederherstellen", + "Delete permanently" : "Endgültig löschen", "Error" : "Fehler", "restored" : "Wiederhergestellt", - "Nothing in here. Your trash bin is empty!" : "Nichts zu löschen, Ihr Papierkorb ist leer!", + "No deleted files" : "Keine gelöschten Dateien", + "You will be able to recover deleted files from here" : "Sie können hier gelöschte Dateien wiederherstellen", + "No entries found in this folder" : "Keine Einträge in diesem Ordner gefunden", + "Select all" : "Alle auswählen", "Name" : "Name", "Deleted" : "Gelöscht", "Delete" : "Löschen" diff --git a/apps/files_trashbin/l10n/el.js b/apps/files_trashbin/l10n/el.js index d9902dc8636..f41ab173604 100644 --- a/apps/files_trashbin/l10n/el.js +++ b/apps/files_trashbin/l10n/el.js @@ -5,9 +5,11 @@ OC.L10N.register( "Couldn't restore %s" : "Αδυναμία επαναφοράς %s", "Deleted files" : "Διεγραμμένα αρχεία", "Restore" : "Επαναφορά", + "Delete permanently" : "Μόνιμη διαγραφή", "Error" : "Σφάλμα", "restored" : "επαναφέρθηκαν", - "Nothing in here. Your trash bin is empty!" : "Δεν υπάρχει τίποτα εδώ. Ο κάδος σας είναι άδειος!", + "No deleted files" : "Κανένα διαγεγραμμένο αρχείο", + "Select all" : "Επιλογή όλων", "Name" : "Όνομα", "Deleted" : "Διαγραμμένα", "Delete" : "Διαγραφή" diff --git a/apps/files_trashbin/l10n/el.json b/apps/files_trashbin/l10n/el.json index 0004fd7242d..31fcde922b1 100644 --- a/apps/files_trashbin/l10n/el.json +++ b/apps/files_trashbin/l10n/el.json @@ -3,9 +3,11 @@ "Couldn't restore %s" : "Αδυναμία επαναφοράς %s", "Deleted files" : "Διεγραμμένα αρχεία", "Restore" : "Επαναφορά", + "Delete permanently" : "Μόνιμη διαγραφή", "Error" : "Σφάλμα", "restored" : "επαναφέρθηκαν", - "Nothing in here. Your trash bin is empty!" : "Δεν υπάρχει τίποτα εδώ. Ο κάδος σας είναι άδειος!", + "No deleted files" : "Κανένα διαγεγραμμένο αρχείο", + "Select all" : "Επιλογή όλων", "Name" : "Όνομα", "Deleted" : "Διαγραμμένα", "Delete" : "Διαγραφή" diff --git a/apps/files_trashbin/l10n/en_GB.js b/apps/files_trashbin/l10n/en_GB.js index 7bd7a49b301..e2ff4ac73fb 100644 --- a/apps/files_trashbin/l10n/en_GB.js +++ b/apps/files_trashbin/l10n/en_GB.js @@ -5,9 +5,13 @@ OC.L10N.register( "Couldn't restore %s" : "Couldn't restore %s", "Deleted files" : "Deleted files", "Restore" : "Restore", + "Delete permanently" : "Delete permanently", "Error" : "Error", "restored" : "restored", - "Nothing in here. Your trash bin is empty!" : "Nothing in here. Your recycle bin is empty!", + "No deleted files" : "No deleted files", + "You will be able to recover deleted files from here" : "You will be able to recover deleted files from here", + "No entries found in this folder" : "No entries found in this folder", + "Select all" : "Select all", "Name" : "Name", "Deleted" : "Deleted", "Delete" : "Delete" diff --git a/apps/files_trashbin/l10n/en_GB.json b/apps/files_trashbin/l10n/en_GB.json index 62603ea26ea..078bca97a49 100644 --- a/apps/files_trashbin/l10n/en_GB.json +++ b/apps/files_trashbin/l10n/en_GB.json @@ -3,9 +3,13 @@ "Couldn't restore %s" : "Couldn't restore %s", "Deleted files" : "Deleted files", "Restore" : "Restore", + "Delete permanently" : "Delete permanently", "Error" : "Error", "restored" : "restored", - "Nothing in here. Your trash bin is empty!" : "Nothing in here. Your recycle bin is empty!", + "No deleted files" : "No deleted files", + "You will be able to recover deleted files from here" : "You will be able to recover deleted files from here", + "No entries found in this folder" : "No entries found in this folder", + "Select all" : "Select all", "Name" : "Name", "Deleted" : "Deleted", "Delete" : "Delete" diff --git a/apps/files_trashbin/l10n/eo.js b/apps/files_trashbin/l10n/eo.js index ad4d45a98e0..e13281d20eb 100644 --- a/apps/files_trashbin/l10n/eo.js +++ b/apps/files_trashbin/l10n/eo.js @@ -5,9 +5,9 @@ OC.L10N.register( "Couldn't restore %s" : "Ne povis restaŭriĝi %s", "Deleted files" : "Forigitaj dosieroj", "Restore" : "Restaŭri", + "Delete permanently" : "Forigi por ĉiam", "Error" : "Eraro", "restored" : "restaŭrita", - "Nothing in here. Your trash bin is empty!" : "Nenio estas ĉi tie. Via rubujo malplenas!", "Name" : "Nomo", "Deleted" : "Forigita", "Delete" : "Forigi" diff --git a/apps/files_trashbin/l10n/eo.json b/apps/files_trashbin/l10n/eo.json index 3faebfb80d6..7c60e595444 100644 --- a/apps/files_trashbin/l10n/eo.json +++ b/apps/files_trashbin/l10n/eo.json @@ -3,9 +3,9 @@ "Couldn't restore %s" : "Ne povis restaŭriĝi %s", "Deleted files" : "Forigitaj dosieroj", "Restore" : "Restaŭri", + "Delete permanently" : "Forigi por ĉiam", "Error" : "Eraro", "restored" : "restaŭrita", - "Nothing in here. Your trash bin is empty!" : "Nenio estas ĉi tie. Via rubujo malplenas!", "Name" : "Nomo", "Deleted" : "Forigita", "Delete" : "Forigi" diff --git a/apps/files_trashbin/l10n/es.js b/apps/files_trashbin/l10n/es.js index 2df71c43b31..89fcf338118 100644 --- a/apps/files_trashbin/l10n/es.js +++ b/apps/files_trashbin/l10n/es.js @@ -5,9 +5,13 @@ OC.L10N.register( "Couldn't restore %s" : "No se puede restaurar %s", "Deleted files" : "Archivos eliminados", "Restore" : "Recuperar", + "Delete permanently" : "Eliminar permanentemente", "Error" : "Error", "restored" : "recuperado", - "Nothing in here. Your trash bin is empty!" : "No hay nada aquí. ¡Tu papelera esta vacía!", + "No deleted files" : "No hay archivos eliminados", + "You will be able to recover deleted files from here" : "Será posible recuperar archivos eliminados desde aquí", + "No entries found in this folder" : "No hay entradas en esta carpeta", + "Select all" : "Seleccionar todo", "Name" : "Nombre", "Deleted" : "Eliminado", "Delete" : "Eliminar" diff --git a/apps/files_trashbin/l10n/es.json b/apps/files_trashbin/l10n/es.json index b37ab9647c8..ff957bf7064 100644 --- a/apps/files_trashbin/l10n/es.json +++ b/apps/files_trashbin/l10n/es.json @@ -3,9 +3,13 @@ "Couldn't restore %s" : "No se puede restaurar %s", "Deleted files" : "Archivos eliminados", "Restore" : "Recuperar", + "Delete permanently" : "Eliminar permanentemente", "Error" : "Error", "restored" : "recuperado", - "Nothing in here. Your trash bin is empty!" : "No hay nada aquí. ¡Tu papelera esta vacía!", + "No deleted files" : "No hay archivos eliminados", + "You will be able to recover deleted files from here" : "Será posible recuperar archivos eliminados desde aquí", + "No entries found in this folder" : "No hay entradas en esta carpeta", + "Select all" : "Seleccionar todo", "Name" : "Nombre", "Deleted" : "Eliminado", "Delete" : "Eliminar" diff --git a/apps/files_trashbin/l10n/es_AR.js b/apps/files_trashbin/l10n/es_AR.js index e49dae4688a..b9566c17f1f 100644 --- a/apps/files_trashbin/l10n/es_AR.js +++ b/apps/files_trashbin/l10n/es_AR.js @@ -5,9 +5,9 @@ OC.L10N.register( "Couldn't restore %s" : "No se pudo restaurar %s", "Deleted files" : "Archivos borrados", "Restore" : "Recuperar", + "Delete permanently" : "Borrar permanentemente", "Error" : "Error", "restored" : "recuperado", - "Nothing in here. Your trash bin is empty!" : "No hay nada acá. ¡La papelera está vacía!", "Name" : "Nombre", "Deleted" : "Borrado", "Delete" : "Borrar" diff --git a/apps/files_trashbin/l10n/es_AR.json b/apps/files_trashbin/l10n/es_AR.json index 793a1e8b172..c3de7177ef6 100644 --- a/apps/files_trashbin/l10n/es_AR.json +++ b/apps/files_trashbin/l10n/es_AR.json @@ -3,9 +3,9 @@ "Couldn't restore %s" : "No se pudo restaurar %s", "Deleted files" : "Archivos borrados", "Restore" : "Recuperar", + "Delete permanently" : "Borrar permanentemente", "Error" : "Error", "restored" : "recuperado", - "Nothing in here. Your trash bin is empty!" : "No hay nada acá. ¡La papelera está vacía!", "Name" : "Nombre", "Deleted" : "Borrado", "Delete" : "Borrar" diff --git a/apps/files_trashbin/l10n/es_MX.js b/apps/files_trashbin/l10n/es_MX.js index 2df71c43b31..0a53f9cffdf 100644 --- a/apps/files_trashbin/l10n/es_MX.js +++ b/apps/files_trashbin/l10n/es_MX.js @@ -5,9 +5,9 @@ OC.L10N.register( "Couldn't restore %s" : "No se puede restaurar %s", "Deleted files" : "Archivos eliminados", "Restore" : "Recuperar", + "Delete permanently" : "Eliminar permanentemente", "Error" : "Error", "restored" : "recuperado", - "Nothing in here. Your trash bin is empty!" : "No hay nada aquí. ¡Tu papelera esta vacía!", "Name" : "Nombre", "Deleted" : "Eliminado", "Delete" : "Eliminar" diff --git a/apps/files_trashbin/l10n/es_MX.json b/apps/files_trashbin/l10n/es_MX.json index b37ab9647c8..56dce90e07d 100644 --- a/apps/files_trashbin/l10n/es_MX.json +++ b/apps/files_trashbin/l10n/es_MX.json @@ -3,9 +3,9 @@ "Couldn't restore %s" : "No se puede restaurar %s", "Deleted files" : "Archivos eliminados", "Restore" : "Recuperar", + "Delete permanently" : "Eliminar permanentemente", "Error" : "Error", "restored" : "recuperado", - "Nothing in here. Your trash bin is empty!" : "No hay nada aquí. ¡Tu papelera esta vacía!", "Name" : "Nombre", "Deleted" : "Eliminado", "Delete" : "Eliminar" diff --git a/apps/files_trashbin/l10n/et_EE.js b/apps/files_trashbin/l10n/et_EE.js index 3067589bd9b..58da11098a7 100644 --- a/apps/files_trashbin/l10n/et_EE.js +++ b/apps/files_trashbin/l10n/et_EE.js @@ -5,9 +5,9 @@ OC.L10N.register( "Couldn't restore %s" : "%s ei saa taastada", "Deleted files" : "Kustutatud failid", "Restore" : "Taasta", + "Delete permanently" : "Kustuta jäädavalt", "Error" : "Viga", "restored" : "taastatud", - "Nothing in here. Your trash bin is empty!" : "Siin pole midagi. Sinu prügikast on tühi!", "Name" : "Nimi", "Deleted" : "Kustutatud", "Delete" : "Kustuta" diff --git a/apps/files_trashbin/l10n/et_EE.json b/apps/files_trashbin/l10n/et_EE.json index 2e6d239f421..6f5a83792b7 100644 --- a/apps/files_trashbin/l10n/et_EE.json +++ b/apps/files_trashbin/l10n/et_EE.json @@ -3,9 +3,9 @@ "Couldn't restore %s" : "%s ei saa taastada", "Deleted files" : "Kustutatud failid", "Restore" : "Taasta", + "Delete permanently" : "Kustuta jäädavalt", "Error" : "Viga", "restored" : "taastatud", - "Nothing in here. Your trash bin is empty!" : "Siin pole midagi. Sinu prügikast on tühi!", "Name" : "Nimi", "Deleted" : "Kustutatud", "Delete" : "Kustuta" diff --git a/apps/files_trashbin/l10n/eu.js b/apps/files_trashbin/l10n/eu.js index 747175d830c..9371bddcd88 100644 --- a/apps/files_trashbin/l10n/eu.js +++ b/apps/files_trashbin/l10n/eu.js @@ -5,9 +5,9 @@ OC.L10N.register( "Couldn't restore %s" : "Ezin izan da %s berreskuratu", "Deleted files" : "Ezabatutako fitxategiak", "Restore" : "Berrezarri", + "Delete permanently" : "Ezabatu betirako", "Error" : "Errorea", "restored" : "Berrezarrita", - "Nothing in here. Your trash bin is empty!" : "Ez dago ezer ez. Zure zakarrontzia hutsik dago!", "Name" : "Izena", "Deleted" : "Ezabatuta", "Delete" : "Ezabatu" diff --git a/apps/files_trashbin/l10n/eu.json b/apps/files_trashbin/l10n/eu.json index f86ba4230ab..46378327f42 100644 --- a/apps/files_trashbin/l10n/eu.json +++ b/apps/files_trashbin/l10n/eu.json @@ -3,9 +3,9 @@ "Couldn't restore %s" : "Ezin izan da %s berreskuratu", "Deleted files" : "Ezabatutako fitxategiak", "Restore" : "Berrezarri", + "Delete permanently" : "Ezabatu betirako", "Error" : "Errorea", "restored" : "Berrezarrita", - "Nothing in here. Your trash bin is empty!" : "Ez dago ezer ez. Zure zakarrontzia hutsik dago!", "Name" : "Izena", "Deleted" : "Ezabatuta", "Delete" : "Ezabatu" diff --git a/apps/files_trashbin/l10n/fa.js b/apps/files_trashbin/l10n/fa.js index a87d9a5c113..8dc5f70fd68 100644 --- a/apps/files_trashbin/l10n/fa.js +++ b/apps/files_trashbin/l10n/fa.js @@ -5,9 +5,9 @@ OC.L10N.register( "Couldn't restore %s" : "%s را نمی توان بازگرداند", "Deleted files" : "فایل های حذف شده", "Restore" : "بازیابی", + "Delete permanently" : "حذف قطعی", "Error" : "خطا", "restored" : "بازیابی شد", - "Nothing in here. Your trash bin is empty!" : "هیچ چیزی اینجا نیست. سطل زباله ی شما خالی است.", "Name" : "نام", "Deleted" : "حذف شده", "Delete" : "حذف" diff --git a/apps/files_trashbin/l10n/fa.json b/apps/files_trashbin/l10n/fa.json index 94748c98899..befa84ab15e 100644 --- a/apps/files_trashbin/l10n/fa.json +++ b/apps/files_trashbin/l10n/fa.json @@ -3,9 +3,9 @@ "Couldn't restore %s" : "%s را نمی توان بازگرداند", "Deleted files" : "فایل های حذف شده", "Restore" : "بازیابی", + "Delete permanently" : "حذف قطعی", "Error" : "خطا", "restored" : "بازیابی شد", - "Nothing in here. Your trash bin is empty!" : "هیچ چیزی اینجا نیست. سطل زباله ی شما خالی است.", "Name" : "نام", "Deleted" : "حذف شده", "Delete" : "حذف" diff --git a/apps/files_trashbin/l10n/fi.js b/apps/files_trashbin/l10n/fi.js new file mode 100644 index 00000000000..e3b5a93ead8 --- /dev/null +++ b/apps/files_trashbin/l10n/fi.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "files_trashbin", + { + "Error" : "Virhe", + "Delete" : "Poista" +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/files_trashbin/l10n/fi.json b/apps/files_trashbin/l10n/fi.json new file mode 100644 index 00000000000..639a5749f28 --- /dev/null +++ b/apps/files_trashbin/l10n/fi.json @@ -0,0 +1,5 @@ +{ "translations": { + "Error" : "Virhe", + "Delete" : "Poista" +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/files_trashbin/l10n/fi_FI.js b/apps/files_trashbin/l10n/fi_FI.js index 1b69bf5c75f..be3fbad301f 100644 --- a/apps/files_trashbin/l10n/fi_FI.js +++ b/apps/files_trashbin/l10n/fi_FI.js @@ -5,9 +5,13 @@ OC.L10N.register( "Couldn't restore %s" : "Kohteen %s palautus epäonnistui", "Deleted files" : "Poistetut tiedostot", "Restore" : "Palauta", + "Delete permanently" : "Poista pysyvästi", "Error" : "Virhe", "restored" : "palautettu", - "Nothing in here. Your trash bin is empty!" : "Tyhjää täynnä! Roskakorissa ei ole mitään.", + "No deleted files" : "Ei poistettuja tiedostoja", + "You will be able to recover deleted files from here" : "Voit palauttaa poistettuja tiedostoja tätä kautta", + "No entries found in this folder" : "Ei kohteita tässä kansiossa", + "Select all" : "Valitse kaikki", "Name" : "Nimi", "Deleted" : "Poistettu", "Delete" : "Poista" diff --git a/apps/files_trashbin/l10n/fi_FI.json b/apps/files_trashbin/l10n/fi_FI.json index 25b3d71dced..3e22acdf2c9 100644 --- a/apps/files_trashbin/l10n/fi_FI.json +++ b/apps/files_trashbin/l10n/fi_FI.json @@ -3,9 +3,13 @@ "Couldn't restore %s" : "Kohteen %s palautus epäonnistui", "Deleted files" : "Poistetut tiedostot", "Restore" : "Palauta", + "Delete permanently" : "Poista pysyvästi", "Error" : "Virhe", "restored" : "palautettu", - "Nothing in here. Your trash bin is empty!" : "Tyhjää täynnä! Roskakorissa ei ole mitään.", + "No deleted files" : "Ei poistettuja tiedostoja", + "You will be able to recover deleted files from here" : "Voit palauttaa poistettuja tiedostoja tätä kautta", + "No entries found in this folder" : "Ei kohteita tässä kansiossa", + "Select all" : "Valitse kaikki", "Name" : "Nimi", "Deleted" : "Poistettu", "Delete" : "Poista" diff --git a/apps/files_trashbin/l10n/fr.js b/apps/files_trashbin/l10n/fr.js index ddcdc495de5..ccda19fb69c 100644 --- a/apps/files_trashbin/l10n/fr.js +++ b/apps/files_trashbin/l10n/fr.js @@ -5,9 +5,12 @@ OC.L10N.register( "Couldn't restore %s" : "Impossible de restaurer %s", "Deleted files" : "Fichiers supprimés", "Restore" : "Restaurer", + "Delete permanently" : "Supprimer de façon définitive", "Error" : "Erreur", "restored" : "restauré", - "Nothing in here. Your trash bin is empty!" : "Il n'y a rien ici. Votre corbeille est vide !", + "No deleted files" : "Aucun fichier supprimé", + "You will be able to recover deleted files from here" : "Vous pourrez restaurer vos fichiers supprimés ici", + "Select all" : "Tout sélectionner", "Name" : "Nom", "Deleted" : "Effacé", "Delete" : "Supprimer" diff --git a/apps/files_trashbin/l10n/fr.json b/apps/files_trashbin/l10n/fr.json index bc6cda70713..523e575a958 100644 --- a/apps/files_trashbin/l10n/fr.json +++ b/apps/files_trashbin/l10n/fr.json @@ -3,9 +3,12 @@ "Couldn't restore %s" : "Impossible de restaurer %s", "Deleted files" : "Fichiers supprimés", "Restore" : "Restaurer", + "Delete permanently" : "Supprimer de façon définitive", "Error" : "Erreur", "restored" : "restauré", - "Nothing in here. Your trash bin is empty!" : "Il n'y a rien ici. Votre corbeille est vide !", + "No deleted files" : "Aucun fichier supprimé", + "You will be able to recover deleted files from here" : "Vous pourrez restaurer vos fichiers supprimés ici", + "Select all" : "Tout sélectionner", "Name" : "Nom", "Deleted" : "Effacé", "Delete" : "Supprimer" diff --git a/apps/files_trashbin/l10n/gl.js b/apps/files_trashbin/l10n/gl.js index 701c1354dfd..a6ea37031a0 100644 --- a/apps/files_trashbin/l10n/gl.js +++ b/apps/files_trashbin/l10n/gl.js @@ -5,9 +5,13 @@ OC.L10N.register( "Couldn't restore %s" : "Non foi posíbel restaurar %s", "Deleted files" : "Ficheiros eliminados", "Restore" : "Restabelecer", + "Delete permanently" : "Eliminar permanentemente", "Error" : "Erro", "restored" : "restaurado", - "Nothing in here. Your trash bin is empty!" : "Aquí non hai nada. O cesto do lixo está baleiro!", + "No deleted files" : "Non hai ficheiros eliminados", + "You will be able to recover deleted files from here" : "Poderá recuperar ficheiros borrados de aquí", + "No entries found in this folder" : "Non se atoparon entradas neste cartafol", + "Select all" : "Seleccionar todo", "Name" : "Nome", "Deleted" : "Eliminado", "Delete" : "Eliminar" diff --git a/apps/files_trashbin/l10n/gl.json b/apps/files_trashbin/l10n/gl.json index 74ac40c4f32..da3aa55fa3f 100644 --- a/apps/files_trashbin/l10n/gl.json +++ b/apps/files_trashbin/l10n/gl.json @@ -3,9 +3,13 @@ "Couldn't restore %s" : "Non foi posíbel restaurar %s", "Deleted files" : "Ficheiros eliminados", "Restore" : "Restabelecer", + "Delete permanently" : "Eliminar permanentemente", "Error" : "Erro", "restored" : "restaurado", - "Nothing in here. Your trash bin is empty!" : "Aquí non hai nada. O cesto do lixo está baleiro!", + "No deleted files" : "Non hai ficheiros eliminados", + "You will be able to recover deleted files from here" : "Poderá recuperar ficheiros borrados de aquí", + "No entries found in this folder" : "Non se atoparon entradas neste cartafol", + "Select all" : "Seleccionar todo", "Name" : "Nome", "Deleted" : "Eliminado", "Delete" : "Eliminar" diff --git a/apps/files_trashbin/l10n/he.js b/apps/files_trashbin/l10n/he.js index ea5d131a9e4..95e5f391151 100644 --- a/apps/files_trashbin/l10n/he.js +++ b/apps/files_trashbin/l10n/he.js @@ -5,9 +5,9 @@ OC.L10N.register( "Couldn't restore %s" : "לא ניתן לשחזר את %s", "Deleted files" : "קבצים שנמחקו", "Restore" : "שחזור", + "Delete permanently" : "מחיקה לצמיתות", "Error" : "שגיאה", "restored" : "שוחזר", - "Nothing in here. Your trash bin is empty!" : "אין כאן שום דבר. סל המיחזור שלך ריק!", "Name" : "שם", "Deleted" : "נמחק", "Delete" : "מחיקה" diff --git a/apps/files_trashbin/l10n/he.json b/apps/files_trashbin/l10n/he.json index d0db85c41b9..68f38e819ff 100644 --- a/apps/files_trashbin/l10n/he.json +++ b/apps/files_trashbin/l10n/he.json @@ -3,9 +3,9 @@ "Couldn't restore %s" : "לא ניתן לשחזר את %s", "Deleted files" : "קבצים שנמחקו", "Restore" : "שחזור", + "Delete permanently" : "מחיקה לצמיתות", "Error" : "שגיאה", "restored" : "שוחזר", - "Nothing in here. Your trash bin is empty!" : "אין כאן שום דבר. סל המיחזור שלך ריק!", "Name" : "שם", "Deleted" : "נמחק", "Delete" : "מחיקה" diff --git a/apps/files_trashbin/l10n/hr.js b/apps/files_trashbin/l10n/hr.js index e05fde1c8a6..de4e0d6a403 100644 --- a/apps/files_trashbin/l10n/hr.js +++ b/apps/files_trashbin/l10n/hr.js @@ -5,9 +5,9 @@ OC.L10N.register( "Couldn't restore %s" : "Nije moguće obnoviti %s", "Deleted files" : "Izbrisane datoteke", "Restore" : "Obnovite", + "Delete permanently" : "Trajno izbrišite", "Error" : "Pogreška", "restored" : "Obnovljeno", - "Nothing in here. Your trash bin is empty!" : "Ovdje nema ničega. Vaša kantica je prazna!", "Name" : "Naziv", "Deleted" : "Izbrisano", "Delete" : "Izbrišite" diff --git a/apps/files_trashbin/l10n/hr.json b/apps/files_trashbin/l10n/hr.json index 7ce4749b133..3b1f0c0eaf9 100644 --- a/apps/files_trashbin/l10n/hr.json +++ b/apps/files_trashbin/l10n/hr.json @@ -3,9 +3,9 @@ "Couldn't restore %s" : "Nije moguće obnoviti %s", "Deleted files" : "Izbrisane datoteke", "Restore" : "Obnovite", + "Delete permanently" : "Trajno izbrišite", "Error" : "Pogreška", "restored" : "Obnovljeno", - "Nothing in here. Your trash bin is empty!" : "Ovdje nema ničega. Vaša kantica je prazna!", "Name" : "Naziv", "Deleted" : "Izbrisano", "Delete" : "Izbrišite" diff --git a/apps/files_trashbin/l10n/hu_HU.js b/apps/files_trashbin/l10n/hu_HU.js index cd057777275..86fbd169640 100644 --- a/apps/files_trashbin/l10n/hu_HU.js +++ b/apps/files_trashbin/l10n/hu_HU.js @@ -5,9 +5,10 @@ OC.L10N.register( "Couldn't restore %s" : "Nem sikerült %s visszaállítása", "Deleted files" : "Törölt fájlok", "Restore" : "Visszaállítás", + "Delete permanently" : "Végleges törlés", "Error" : "Hiba", "restored" : "visszaállítva", - "Nothing in here. Your trash bin is empty!" : "Itt nincs semmi. Az Ön szemetes mappája üres!", + "Select all" : "Összes kijelölése", "Name" : "Név", "Deleted" : "Törölve", "Delete" : "Törlés" diff --git a/apps/files_trashbin/l10n/hu_HU.json b/apps/files_trashbin/l10n/hu_HU.json index f989f402328..e445b3a4728 100644 --- a/apps/files_trashbin/l10n/hu_HU.json +++ b/apps/files_trashbin/l10n/hu_HU.json @@ -3,9 +3,10 @@ "Couldn't restore %s" : "Nem sikerült %s visszaállítása", "Deleted files" : "Törölt fájlok", "Restore" : "Visszaállítás", + "Delete permanently" : "Végleges törlés", "Error" : "Hiba", "restored" : "visszaállítva", - "Nothing in here. Your trash bin is empty!" : "Itt nincs semmi. Az Ön szemetes mappája üres!", + "Select all" : "Összes kijelölése", "Name" : "Név", "Deleted" : "Törölve", "Delete" : "Törlés" diff --git a/apps/files_trashbin/l10n/id.js b/apps/files_trashbin/l10n/id.js index 6e13e455591..52183a9cbef 100644 --- a/apps/files_trashbin/l10n/id.js +++ b/apps/files_trashbin/l10n/id.js @@ -5,8 +5,8 @@ OC.L10N.register( "Couldn't restore %s" : "Tidak dapat memulihkan %s", "Deleted files" : "Berkas yang dihapus", "Restore" : "Pulihkan", + "Delete permanently" : "Hapus secara permanen", "Error" : "Galat", - "Nothing in here. Your trash bin is empty!" : "Tempat sampah anda kosong!", "Name" : "Nama", "Deleted" : "Dihapus", "Delete" : "Hapus" diff --git a/apps/files_trashbin/l10n/id.json b/apps/files_trashbin/l10n/id.json index f29df5cd07e..55384503601 100644 --- a/apps/files_trashbin/l10n/id.json +++ b/apps/files_trashbin/l10n/id.json @@ -3,8 +3,8 @@ "Couldn't restore %s" : "Tidak dapat memulihkan %s", "Deleted files" : "Berkas yang dihapus", "Restore" : "Pulihkan", + "Delete permanently" : "Hapus secara permanen", "Error" : "Galat", - "Nothing in here. Your trash bin is empty!" : "Tempat sampah anda kosong!", "Name" : "Nama", "Deleted" : "Dihapus", "Delete" : "Hapus" diff --git a/apps/files_trashbin/l10n/it.js b/apps/files_trashbin/l10n/it.js index 5e57848c479..01840a9907c 100644 --- a/apps/files_trashbin/l10n/it.js +++ b/apps/files_trashbin/l10n/it.js @@ -5,9 +5,13 @@ OC.L10N.register( "Couldn't restore %s" : "Impossibile ripristinare %s", "Deleted files" : "File eliminati", "Restore" : "Ripristina", + "Delete permanently" : "Elimina definitivamente", "Error" : "Errore", "restored" : "ripristinati", - "Nothing in here. Your trash bin is empty!" : "Qui non c'è niente. Il tuo cestino è vuoto.", + "No deleted files" : "Nessun file eliminato", + "You will be able to recover deleted files from here" : "Potrai ripristinare i file eliminati da qui", + "No entries found in this folder" : "Nessuna voce trovata in questa cartella", + "Select all" : "Seleziona tutto", "Name" : "Nome", "Deleted" : "Eliminati", "Delete" : "Elimina" diff --git a/apps/files_trashbin/l10n/it.json b/apps/files_trashbin/l10n/it.json index 25efb47a65a..89ee8efad16 100644 --- a/apps/files_trashbin/l10n/it.json +++ b/apps/files_trashbin/l10n/it.json @@ -3,9 +3,13 @@ "Couldn't restore %s" : "Impossibile ripristinare %s", "Deleted files" : "File eliminati", "Restore" : "Ripristina", + "Delete permanently" : "Elimina definitivamente", "Error" : "Errore", "restored" : "ripristinati", - "Nothing in here. Your trash bin is empty!" : "Qui non c'è niente. Il tuo cestino è vuoto.", + "No deleted files" : "Nessun file eliminato", + "You will be able to recover deleted files from here" : "Potrai ripristinare i file eliminati da qui", + "No entries found in this folder" : "Nessuna voce trovata in questa cartella", + "Select all" : "Seleziona tutto", "Name" : "Nome", "Deleted" : "Eliminati", "Delete" : "Elimina" diff --git a/apps/files_trashbin/l10n/ja.js b/apps/files_trashbin/l10n/ja.js index dba8442c5d4..1ec56e8d2fa 100644 --- a/apps/files_trashbin/l10n/ja.js +++ b/apps/files_trashbin/l10n/ja.js @@ -5,9 +5,12 @@ OC.L10N.register( "Couldn't restore %s" : "%s を復元できませんでした", "Deleted files" : "ゴミ箱", "Restore" : "復元", + "Delete permanently" : "完全に削除する", "Error" : "エラー", "restored" : "復元済", - "Nothing in here. Your trash bin is empty!" : "ここには何もありません。ゴミ箱は空です!", + "No deleted files" : "削除されたファイルはありません", + "You will be able to recover deleted files from here" : "ここから削除されたファイルを元に戻すことができます。", + "Select all" : "すべて選択", "Name" : "名前", "Deleted" : "削除日時", "Delete" : "削除" diff --git a/apps/files_trashbin/l10n/ja.json b/apps/files_trashbin/l10n/ja.json index cd6f6c37e12..2da8c5af5ba 100644 --- a/apps/files_trashbin/l10n/ja.json +++ b/apps/files_trashbin/l10n/ja.json @@ -3,9 +3,12 @@ "Couldn't restore %s" : "%s を復元できませんでした", "Deleted files" : "ゴミ箱", "Restore" : "復元", + "Delete permanently" : "完全に削除する", "Error" : "エラー", "restored" : "復元済", - "Nothing in here. Your trash bin is empty!" : "ここには何もありません。ゴミ箱は空です!", + "No deleted files" : "削除されたファイルはありません", + "You will be able to recover deleted files from here" : "ここから削除されたファイルを元に戻すことができます。", + "Select all" : "すべて選択", "Name" : "名前", "Deleted" : "削除日時", "Delete" : "削除" diff --git a/apps/files_trashbin/l10n/ka_GE.js b/apps/files_trashbin/l10n/ka_GE.js index 49f9fd4b0b0..cd578d4117a 100644 --- a/apps/files_trashbin/l10n/ka_GE.js +++ b/apps/files_trashbin/l10n/ka_GE.js @@ -5,8 +5,8 @@ OC.L10N.register( "Couldn't restore %s" : "%s–ის აღდგენა ვერ მოხერხდა", "Deleted files" : "წაშლილი ფაილები", "Restore" : "აღდგენა", + "Delete permanently" : "სრულად წაშლა", "Error" : "შეცდომა", - "Nothing in here. Your trash bin is empty!" : "აქ არაფერი არ არის. სანაგვე ყუთი ცარიელია!", "Name" : "სახელი", "Deleted" : "წაშლილი", "Delete" : "წაშლა" diff --git a/apps/files_trashbin/l10n/ka_GE.json b/apps/files_trashbin/l10n/ka_GE.json index 98b165a02dd..11fc08b1255 100644 --- a/apps/files_trashbin/l10n/ka_GE.json +++ b/apps/files_trashbin/l10n/ka_GE.json @@ -3,8 +3,8 @@ "Couldn't restore %s" : "%s–ის აღდგენა ვერ მოხერხდა", "Deleted files" : "წაშლილი ფაილები", "Restore" : "აღდგენა", + "Delete permanently" : "სრულად წაშლა", "Error" : "შეცდომა", - "Nothing in here. Your trash bin is empty!" : "აქ არაფერი არ არის. სანაგვე ყუთი ცარიელია!", "Name" : "სახელი", "Deleted" : "წაშლილი", "Delete" : "წაშლა" diff --git a/apps/files_trashbin/l10n/km.js b/apps/files_trashbin/l10n/km.js index a5bac8c2bd6..fafbff1e665 100644 --- a/apps/files_trashbin/l10n/km.js +++ b/apps/files_trashbin/l10n/km.js @@ -5,9 +5,9 @@ OC.L10N.register( "Couldn't restore %s" : "មិនអាចស្ដារ %s ឡើងវិញបានទេ", "Deleted files" : "ឯកសារដែលបានលុប", "Restore" : "ស្ដារមកវិញ", + "Delete permanently" : "លុបជាអចិន្ត្រៃយ៍", "Error" : "កំហុស", "restored" : "បានស្ដារវិញ", - "Nothing in here. Your trash bin is empty!" : "គ្មានអ្វីនៅទីនេះទេ។ ធុងសំរាមរបស់អ្នកគឺទទេ!", "Name" : "ឈ្មោះ", "Deleted" : "បានលុប", "Delete" : "លុប" diff --git a/apps/files_trashbin/l10n/km.json b/apps/files_trashbin/l10n/km.json index bda740966e8..0b291a61eb2 100644 --- a/apps/files_trashbin/l10n/km.json +++ b/apps/files_trashbin/l10n/km.json @@ -3,9 +3,9 @@ "Couldn't restore %s" : "មិនអាចស្ដារ %s ឡើងវិញបានទេ", "Deleted files" : "ឯកសារដែលបានលុប", "Restore" : "ស្ដារមកវិញ", + "Delete permanently" : "លុបជាអចិន្ត្រៃយ៍", "Error" : "កំហុស", "restored" : "បានស្ដារវិញ", - "Nothing in here. Your trash bin is empty!" : "គ្មានអ្វីនៅទីនេះទេ។ ធុងសំរាមរបស់អ្នកគឺទទេ!", "Name" : "ឈ្មោះ", "Deleted" : "បានលុប", "Delete" : "លុប" diff --git a/apps/files_trashbin/l10n/kn.js b/apps/files_trashbin/l10n/kn.js new file mode 100644 index 00000000000..4e918b5f06f --- /dev/null +++ b/apps/files_trashbin/l10n/kn.js @@ -0,0 +1,10 @@ +OC.L10N.register( + "files_trashbin", + { + "Restore" : "ಮರುಸ್ಥಾಪಿಸು", + "Error" : "ತಪ್ಪಾಗಿದೆ", + "Select all" : "ಎಲ್ಲಾ ಆಯ್ಕೆ ಮಾಡಿ", + "Name" : "ಹೆಸರು", + "Delete" : "ಅಳಿಸಿ" +}, +"nplurals=1; plural=0;"); diff --git a/apps/files_trashbin/l10n/kn.json b/apps/files_trashbin/l10n/kn.json new file mode 100644 index 00000000000..174306ce04a --- /dev/null +++ b/apps/files_trashbin/l10n/kn.json @@ -0,0 +1,8 @@ +{ "translations": { + "Restore" : "ಮರುಸ್ಥಾಪಿಸು", + "Error" : "ತಪ್ಪಾಗಿದೆ", + "Select all" : "ಎಲ್ಲಾ ಆಯ್ಕೆ ಮಾಡಿ", + "Name" : "ಹೆಸರು", + "Delete" : "ಅಳಿಸಿ" +},"pluralForm" :"nplurals=1; plural=0;" +}
\ No newline at end of file diff --git a/apps/files_trashbin/l10n/ko.js b/apps/files_trashbin/l10n/ko.js index 6f3f68cc666..83c57f8914a 100644 --- a/apps/files_trashbin/l10n/ko.js +++ b/apps/files_trashbin/l10n/ko.js @@ -5,9 +5,9 @@ OC.L10N.register( "Couldn't restore %s" : "%s을(를) 복원할 수 없습니다", "Deleted files" : "삭제된 파일", "Restore" : "복원", + "Delete permanently" : "영구히 삭제", "Error" : "오류", "restored" : "복원됨", - "Nothing in here. Your trash bin is empty!" : "휴지통이 비어 있습니다!", "Name" : "이름", "Deleted" : "삭제됨", "Delete" : "삭제" diff --git a/apps/files_trashbin/l10n/ko.json b/apps/files_trashbin/l10n/ko.json index 834c798fb7f..d9820ba8ffe 100644 --- a/apps/files_trashbin/l10n/ko.json +++ b/apps/files_trashbin/l10n/ko.json @@ -3,9 +3,9 @@ "Couldn't restore %s" : "%s을(를) 복원할 수 없습니다", "Deleted files" : "삭제된 파일", "Restore" : "복원", + "Delete permanently" : "영구히 삭제", "Error" : "오류", "restored" : "복원됨", - "Nothing in here. Your trash bin is empty!" : "휴지통이 비어 있습니다!", "Name" : "이름", "Deleted" : "삭제됨", "Delete" : "삭제" diff --git a/apps/files_trashbin/l10n/lt_LT.js b/apps/files_trashbin/l10n/lt_LT.js index b7a43703e83..3c075536079 100644 --- a/apps/files_trashbin/l10n/lt_LT.js +++ b/apps/files_trashbin/l10n/lt_LT.js @@ -5,9 +5,12 @@ OC.L10N.register( "Couldn't restore %s" : "Nepavyko atkurti %s", "Deleted files" : "Ištrinti failai", "Restore" : "Atstatyti", + "Delete permanently" : "Ištrinti negrįžtamai", "Error" : "Klaida", "restored" : "atstatyta", - "Nothing in here. Your trash bin is empty!" : "Nieko nėra. Jūsų šiukšliadėžė tuščia!", + "No deleted files" : "Nėra ištrintų failų", + "You will be able to recover deleted files from here" : "Jūs galėsite atkurti ištrintus failus iš čia", + "Select all" : "Pažymėti viską", "Name" : "Pavadinimas", "Deleted" : "Ištrinti", "Delete" : "Ištrinti" diff --git a/apps/files_trashbin/l10n/lt_LT.json b/apps/files_trashbin/l10n/lt_LT.json index 7c572ddc20d..0be508aeb21 100644 --- a/apps/files_trashbin/l10n/lt_LT.json +++ b/apps/files_trashbin/l10n/lt_LT.json @@ -3,9 +3,12 @@ "Couldn't restore %s" : "Nepavyko atkurti %s", "Deleted files" : "Ištrinti failai", "Restore" : "Atstatyti", + "Delete permanently" : "Ištrinti negrįžtamai", "Error" : "Klaida", "restored" : "atstatyta", - "Nothing in here. Your trash bin is empty!" : "Nieko nėra. Jūsų šiukšliadėžė tuščia!", + "No deleted files" : "Nėra ištrintų failų", + "You will be able to recover deleted files from here" : "Jūs galėsite atkurti ištrintus failus iš čia", + "Select all" : "Pažymėti viską", "Name" : "Pavadinimas", "Deleted" : "Ištrinti", "Delete" : "Ištrinti" diff --git a/apps/files_trashbin/l10n/lv.js b/apps/files_trashbin/l10n/lv.js index 463be504d54..4e6fb3ea3a2 100644 --- a/apps/files_trashbin/l10n/lv.js +++ b/apps/files_trashbin/l10n/lv.js @@ -5,9 +5,10 @@ OC.L10N.register( "Couldn't restore %s" : "Nevarēja atjaunot %s", "Deleted files" : "Dzēstās datnes", "Restore" : "Atjaunot", + "Delete permanently" : "Dzēst pavisam", "Error" : "Kļūda", "restored" : "atjaunots", - "Nothing in here. Your trash bin is empty!" : "Šeit nekā nav. Jūsu miskaste ir tukša!", + "Select all" : "Atzīmēt visu", "Name" : "Nosaukums", "Deleted" : "Dzēsts", "Delete" : "Dzēst" diff --git a/apps/files_trashbin/l10n/lv.json b/apps/files_trashbin/l10n/lv.json index ad0e2aa9842..1c798fb7f59 100644 --- a/apps/files_trashbin/l10n/lv.json +++ b/apps/files_trashbin/l10n/lv.json @@ -3,9 +3,10 @@ "Couldn't restore %s" : "Nevarēja atjaunot %s", "Deleted files" : "Dzēstās datnes", "Restore" : "Atjaunot", + "Delete permanently" : "Dzēst pavisam", "Error" : "Kļūda", "restored" : "atjaunots", - "Nothing in here. Your trash bin is empty!" : "Šeit nekā nav. Jūsu miskaste ir tukša!", + "Select all" : "Atzīmēt visu", "Name" : "Nosaukums", "Deleted" : "Dzēsts", "Delete" : "Dzēst" diff --git a/apps/files_trashbin/l10n/mk.js b/apps/files_trashbin/l10n/mk.js index 6d74f64e37c..f5286eac043 100644 --- a/apps/files_trashbin/l10n/mk.js +++ b/apps/files_trashbin/l10n/mk.js @@ -5,9 +5,9 @@ OC.L10N.register( "Couldn't restore %s" : "Не можеше да се поврати %s", "Deleted files" : "Избришани датотеки", "Restore" : "Поврати", + "Delete permanently" : "Трајно избришани", "Error" : "Грешка", "restored" : "повратени", - "Nothing in here. Your trash bin is empty!" : "Тука нема ништо. Вашата корпа за отпадоци е празна!", "Name" : "Име", "Deleted" : "Избришан", "Delete" : "Избриши" diff --git a/apps/files_trashbin/l10n/mk.json b/apps/files_trashbin/l10n/mk.json index 45eef9bfd61..119a6c4f954 100644 --- a/apps/files_trashbin/l10n/mk.json +++ b/apps/files_trashbin/l10n/mk.json @@ -3,9 +3,9 @@ "Couldn't restore %s" : "Не можеше да се поврати %s", "Deleted files" : "Избришани датотеки", "Restore" : "Поврати", + "Delete permanently" : "Трајно избришани", "Error" : "Грешка", "restored" : "повратени", - "Nothing in here. Your trash bin is empty!" : "Тука нема ништо. Вашата корпа за отпадоци е празна!", "Name" : "Име", "Deleted" : "Избришан", "Delete" : "Избриши" diff --git a/apps/files_trashbin/l10n/ms_MY.js b/apps/files_trashbin/l10n/ms_MY.js index 6e7028832e6..1441ab03bf9 100644 --- a/apps/files_trashbin/l10n/ms_MY.js +++ b/apps/files_trashbin/l10n/ms_MY.js @@ -7,7 +7,6 @@ OC.L10N.register( "Restore" : "Pulihkan", "Error" : "Ralat", "restored" : "dipulihkan", - "Nothing in here. Your trash bin is empty!" : "Tiada apa disini. Tong sampah anda kosong!", "Name" : "Nama", "Deleted" : "Dipadam", "Delete" : "Padam" diff --git a/apps/files_trashbin/l10n/ms_MY.json b/apps/files_trashbin/l10n/ms_MY.json index 5bb1e815ffd..a2b674d23d5 100644 --- a/apps/files_trashbin/l10n/ms_MY.json +++ b/apps/files_trashbin/l10n/ms_MY.json @@ -5,7 +5,6 @@ "Restore" : "Pulihkan", "Error" : "Ralat", "restored" : "dipulihkan", - "Nothing in here. Your trash bin is empty!" : "Tiada apa disini. Tong sampah anda kosong!", "Name" : "Nama", "Deleted" : "Dipadam", "Delete" : "Padam" diff --git a/apps/files_trashbin/l10n/nb_NO.js b/apps/files_trashbin/l10n/nb_NO.js index b5c2821a305..2fcd4b93c9c 100644 --- a/apps/files_trashbin/l10n/nb_NO.js +++ b/apps/files_trashbin/l10n/nb_NO.js @@ -5,9 +5,12 @@ OC.L10N.register( "Couldn't restore %s" : "Kunne ikke gjenopprette %s", "Deleted files" : "Slettede filer", "Restore" : "Gjenopprett", + "Delete permanently" : "Slett permanent", "Error" : "Feil", "restored" : "gjenopprettet", - "Nothing in here. Your trash bin is empty!" : "Ingenting her. Søppelkassen din er tom!", + "No deleted files" : "Ingen slettede filer", + "You will be able to recover deleted files from here" : "Du vil kunne gjenopprette slettede filer herfra", + "Select all" : "Velg alle", "Name" : "Navn", "Deleted" : "Slettet", "Delete" : "Slett" diff --git a/apps/files_trashbin/l10n/nb_NO.json b/apps/files_trashbin/l10n/nb_NO.json index a671f461155..4fd9d677575 100644 --- a/apps/files_trashbin/l10n/nb_NO.json +++ b/apps/files_trashbin/l10n/nb_NO.json @@ -3,9 +3,12 @@ "Couldn't restore %s" : "Kunne ikke gjenopprette %s", "Deleted files" : "Slettede filer", "Restore" : "Gjenopprett", + "Delete permanently" : "Slett permanent", "Error" : "Feil", "restored" : "gjenopprettet", - "Nothing in here. Your trash bin is empty!" : "Ingenting her. Søppelkassen din er tom!", + "No deleted files" : "Ingen slettede filer", + "You will be able to recover deleted files from here" : "Du vil kunne gjenopprette slettede filer herfra", + "Select all" : "Velg alle", "Name" : "Navn", "Deleted" : "Slettet", "Delete" : "Slett" diff --git a/apps/files_trashbin/l10n/nl.js b/apps/files_trashbin/l10n/nl.js index 3bd48a07eff..4b9227b563f 100644 --- a/apps/files_trashbin/l10n/nl.js +++ b/apps/files_trashbin/l10n/nl.js @@ -5,9 +5,13 @@ OC.L10N.register( "Couldn't restore %s" : "Kon %s niet herstellen", "Deleted files" : "Verwijderde bestanden", "Restore" : "Herstellen", + "Delete permanently" : "Definitief verwijderen", "Error" : "Fout", "restored" : "hersteld", - "Nothing in here. Your trash bin is empty!" : "Niets te vinden. Uw prullenbak is leeg!", + "No deleted files" : "Geen verwijderde bestanden", + "You will be able to recover deleted files from here" : "U kunt verwijderde bestanden hier vandaan weer terugzetten", + "No entries found in this folder" : "Niets gevonden in deze map", + "Select all" : "Alles selecteren", "Name" : "Naam", "Deleted" : "Verwijderd", "Delete" : "Verwijder" diff --git a/apps/files_trashbin/l10n/nl.json b/apps/files_trashbin/l10n/nl.json index 5d4134ed1ce..7e78dde9baa 100644 --- a/apps/files_trashbin/l10n/nl.json +++ b/apps/files_trashbin/l10n/nl.json @@ -3,9 +3,13 @@ "Couldn't restore %s" : "Kon %s niet herstellen", "Deleted files" : "Verwijderde bestanden", "Restore" : "Herstellen", + "Delete permanently" : "Definitief verwijderen", "Error" : "Fout", "restored" : "hersteld", - "Nothing in here. Your trash bin is empty!" : "Niets te vinden. Uw prullenbak is leeg!", + "No deleted files" : "Geen verwijderde bestanden", + "You will be able to recover deleted files from here" : "U kunt verwijderde bestanden hier vandaan weer terugzetten", + "No entries found in this folder" : "Niets gevonden in deze map", + "Select all" : "Alles selecteren", "Name" : "Naam", "Deleted" : "Verwijderd", "Delete" : "Verwijder" diff --git a/apps/files_trashbin/l10n/nn_NO.js b/apps/files_trashbin/l10n/nn_NO.js index 2c42392757d..fc4a6a5cc37 100644 --- a/apps/files_trashbin/l10n/nn_NO.js +++ b/apps/files_trashbin/l10n/nn_NO.js @@ -5,9 +5,9 @@ OC.L10N.register( "Couldn't restore %s" : "Klarte ikkje gjenoppretta %s", "Deleted files" : "Sletta filer", "Restore" : "Gjenopprett", + "Delete permanently" : "Slett for godt", "Error" : "Feil", "restored" : "gjenoppretta", - "Nothing in here. Your trash bin is empty!" : "Ingenting her. Papirkorga di er tom!", "Name" : "Namn", "Deleted" : "Sletta", "Delete" : "Slett" diff --git a/apps/files_trashbin/l10n/nn_NO.json b/apps/files_trashbin/l10n/nn_NO.json index f5fe09fa06e..f8cf76ca3f4 100644 --- a/apps/files_trashbin/l10n/nn_NO.json +++ b/apps/files_trashbin/l10n/nn_NO.json @@ -3,9 +3,9 @@ "Couldn't restore %s" : "Klarte ikkje gjenoppretta %s", "Deleted files" : "Sletta filer", "Restore" : "Gjenopprett", + "Delete permanently" : "Slett for godt", "Error" : "Feil", "restored" : "gjenoppretta", - "Nothing in here. Your trash bin is empty!" : "Ingenting her. Papirkorga di er tom!", "Name" : "Namn", "Deleted" : "Sletta", "Delete" : "Slett" diff --git a/apps/files_trashbin/l10n/pl.js b/apps/files_trashbin/l10n/pl.js index 13053c3bae4..941e768e304 100644 --- a/apps/files_trashbin/l10n/pl.js +++ b/apps/files_trashbin/l10n/pl.js @@ -5,9 +5,9 @@ OC.L10N.register( "Couldn't restore %s" : "Nie można przywrócić %s", "Deleted files" : "Usunięte pliki", "Restore" : "Przywróć", + "Delete permanently" : "Trwale usuń", "Error" : "Błąd", "restored" : "przywrócony", - "Nothing in here. Your trash bin is empty!" : "Nic tu nie ma. Twój kosz jest pusty!", "Name" : "Nazwa", "Deleted" : "Usunięte", "Delete" : "Usuń" diff --git a/apps/files_trashbin/l10n/pl.json b/apps/files_trashbin/l10n/pl.json index edb0a2daafa..01308bd763f 100644 --- a/apps/files_trashbin/l10n/pl.json +++ b/apps/files_trashbin/l10n/pl.json @@ -3,9 +3,9 @@ "Couldn't restore %s" : "Nie można przywrócić %s", "Deleted files" : "Usunięte pliki", "Restore" : "Przywróć", + "Delete permanently" : "Trwale usuń", "Error" : "Błąd", "restored" : "przywrócony", - "Nothing in here. Your trash bin is empty!" : "Nic tu nie ma. Twój kosz jest pusty!", "Name" : "Nazwa", "Deleted" : "Usunięte", "Delete" : "Usuń" diff --git a/apps/files_trashbin/l10n/pt_BR.js b/apps/files_trashbin/l10n/pt_BR.js index f1b7e447381..737a522eea1 100644 --- a/apps/files_trashbin/l10n/pt_BR.js +++ b/apps/files_trashbin/l10n/pt_BR.js @@ -5,9 +5,13 @@ OC.L10N.register( "Couldn't restore %s" : "Não foi possível restaurar %s", "Deleted files" : "Arquivos apagados", "Restore" : "Restaurar", + "Delete permanently" : "Excluir permanentemente", "Error" : "Erro", "restored" : "restaurado", - "Nothing in here. Your trash bin is empty!" : "Nada aqui. Sua lixeira está vazia!", + "No deleted files" : "Aquivos não removidos", + "You will be able to recover deleted files from here" : "Você pode recuperar arquivos removidos daqui", + "No entries found in this folder" : "Nenhuma entrada foi encontrada nesta pasta", + "Select all" : "Selecionar tudo", "Name" : "Nome", "Deleted" : "Excluído", "Delete" : "Excluir" diff --git a/apps/files_trashbin/l10n/pt_BR.json b/apps/files_trashbin/l10n/pt_BR.json index 801f91f18bd..25ee0439d67 100644 --- a/apps/files_trashbin/l10n/pt_BR.json +++ b/apps/files_trashbin/l10n/pt_BR.json @@ -3,9 +3,13 @@ "Couldn't restore %s" : "Não foi possível restaurar %s", "Deleted files" : "Arquivos apagados", "Restore" : "Restaurar", + "Delete permanently" : "Excluir permanentemente", "Error" : "Erro", "restored" : "restaurado", - "Nothing in here. Your trash bin is empty!" : "Nada aqui. Sua lixeira está vazia!", + "No deleted files" : "Aquivos não removidos", + "You will be able to recover deleted files from here" : "Você pode recuperar arquivos removidos daqui", + "No entries found in this folder" : "Nenhuma entrada foi encontrada nesta pasta", + "Select all" : "Selecionar tudo", "Name" : "Nome", "Deleted" : "Excluído", "Delete" : "Excluir" diff --git a/apps/files_trashbin/l10n/pt_PT.js b/apps/files_trashbin/l10n/pt_PT.js index 5d22e3bca21..7427cebfca5 100644 --- a/apps/files_trashbin/l10n/pt_PT.js +++ b/apps/files_trashbin/l10n/pt_PT.js @@ -5,11 +5,13 @@ OC.L10N.register( "Couldn't restore %s" : "Não foi possível restaurar %s", "Deleted files" : "Ficheiros eliminados", "Restore" : "Restaurar", + "Delete permanently" : "Eliminar permanentemente", "Error" : "Erro", "restored" : "Restaurado", - "Nothing in here. Your trash bin is empty!" : "Não hà ficheiros. O lixo está vazio!", + "No deleted files" : "Sem ficheiros eliminados", + "Select all" : "Seleccionar todos", "Name" : "Nome", - "Deleted" : "Apagado", + "Deleted" : "Eliminado", "Delete" : "Eliminar" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/files_trashbin/l10n/pt_PT.json b/apps/files_trashbin/l10n/pt_PT.json index 4feb75abd9a..97fe7ac33aa 100644 --- a/apps/files_trashbin/l10n/pt_PT.json +++ b/apps/files_trashbin/l10n/pt_PT.json @@ -3,11 +3,13 @@ "Couldn't restore %s" : "Não foi possível restaurar %s", "Deleted files" : "Ficheiros eliminados", "Restore" : "Restaurar", + "Delete permanently" : "Eliminar permanentemente", "Error" : "Erro", "restored" : "Restaurado", - "Nothing in here. Your trash bin is empty!" : "Não hà ficheiros. O lixo está vazio!", + "No deleted files" : "Sem ficheiros eliminados", + "Select all" : "Seleccionar todos", "Name" : "Nome", - "Deleted" : "Apagado", + "Deleted" : "Eliminado", "Delete" : "Eliminar" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/files_trashbin/l10n/ro.js b/apps/files_trashbin/l10n/ro.js index c0ba5741695..0feb1e8e721 100644 --- a/apps/files_trashbin/l10n/ro.js +++ b/apps/files_trashbin/l10n/ro.js @@ -3,6 +3,7 @@ OC.L10N.register( { "Deleted files" : "Sterge fisierele", "Restore" : "Restabilire", + "Delete permanently" : "Șterge permanent", "Error" : "Eroare", "Name" : "Nume", "Delete" : "Șterge" diff --git a/apps/files_trashbin/l10n/ro.json b/apps/files_trashbin/l10n/ro.json index d0c02197e46..758dc748460 100644 --- a/apps/files_trashbin/l10n/ro.json +++ b/apps/files_trashbin/l10n/ro.json @@ -1,6 +1,7 @@ { "translations": { "Deleted files" : "Sterge fisierele", "Restore" : "Restabilire", + "Delete permanently" : "Șterge permanent", "Error" : "Eroare", "Name" : "Nume", "Delete" : "Șterge" diff --git a/apps/files_trashbin/l10n/ru.js b/apps/files_trashbin/l10n/ru.js index dbb2df1f704..39a47584221 100644 --- a/apps/files_trashbin/l10n/ru.js +++ b/apps/files_trashbin/l10n/ru.js @@ -1,13 +1,17 @@ OC.L10N.register( "files_trashbin", { - "Couldn't delete %s permanently" : "%s не может быть удалён навсегда", + "Couldn't delete %s permanently" : "%s не может быть удалён окончательно", "Couldn't restore %s" : "%s не может быть восстановлен", "Deleted files" : "Удалённые файлы", "Restore" : "Восстановить", + "Delete permanently" : "Удалить окончательно", "Error" : "Ошибка", "restored" : "восстановлен", - "Nothing in here. Your trash bin is empty!" : "Здесь ничего нет. Ваша корзина пуста!", + "No deleted files" : "Нет удалённых файлов", + "You will be able to recover deleted files from here" : "Здесь вы сможете восстановить удалённые файлы", + "No entries found in this folder" : "Каталог пуст", + "Select all" : "Выделить все", "Name" : "Имя", "Deleted" : "Удалён", "Delete" : "Удалить" diff --git a/apps/files_trashbin/l10n/ru.json b/apps/files_trashbin/l10n/ru.json index 3e67045967d..171c0aa2325 100644 --- a/apps/files_trashbin/l10n/ru.json +++ b/apps/files_trashbin/l10n/ru.json @@ -1,11 +1,15 @@ { "translations": { - "Couldn't delete %s permanently" : "%s не может быть удалён навсегда", + "Couldn't delete %s permanently" : "%s не может быть удалён окончательно", "Couldn't restore %s" : "%s не может быть восстановлен", "Deleted files" : "Удалённые файлы", "Restore" : "Восстановить", + "Delete permanently" : "Удалить окончательно", "Error" : "Ошибка", "restored" : "восстановлен", - "Nothing in here. Your trash bin is empty!" : "Здесь ничего нет. Ваша корзина пуста!", + "No deleted files" : "Нет удалённых файлов", + "You will be able to recover deleted files from here" : "Здесь вы сможете восстановить удалённые файлы", + "No entries found in this folder" : "Каталог пуст", + "Select all" : "Выделить все", "Name" : "Имя", "Deleted" : "Удалён", "Delete" : "Удалить" diff --git a/apps/files_trashbin/l10n/sk.php b/apps/files_trashbin/l10n/sk.php deleted file mode 100644 index 3129cf5c411..00000000000 --- a/apps/files_trashbin/l10n/sk.php +++ /dev/null @@ -1,5 +0,0 @@ -<?php -$TRANSLATIONS = array( -"Delete" => "Odstrániť" -); -$PLURAL_FORMS = "nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"; diff --git a/apps/files_trashbin/l10n/sk_SK.js b/apps/files_trashbin/l10n/sk_SK.js index 9069b4ea509..4cca753fc79 100644 --- a/apps/files_trashbin/l10n/sk_SK.js +++ b/apps/files_trashbin/l10n/sk_SK.js @@ -5,9 +5,9 @@ OC.L10N.register( "Couldn't restore %s" : "Nemožno obnoviť %s", "Deleted files" : "Zmazané súbory", "Restore" : "Obnoviť", + "Delete permanently" : "Zmazať trvalo", "Error" : "Chyba", "restored" : "obnovené", - "Nothing in here. Your trash bin is empty!" : "Žiadny obsah. Kôš je prázdny!", "Name" : "Názov", "Deleted" : "Zmazané", "Delete" : "Zmazať" diff --git a/apps/files_trashbin/l10n/sk_SK.json b/apps/files_trashbin/l10n/sk_SK.json index e3b95e1d591..a014537a968 100644 --- a/apps/files_trashbin/l10n/sk_SK.json +++ b/apps/files_trashbin/l10n/sk_SK.json @@ -3,9 +3,9 @@ "Couldn't restore %s" : "Nemožno obnoviť %s", "Deleted files" : "Zmazané súbory", "Restore" : "Obnoviť", + "Delete permanently" : "Zmazať trvalo", "Error" : "Chyba", "restored" : "obnovené", - "Nothing in here. Your trash bin is empty!" : "Žiadny obsah. Kôš je prázdny!", "Name" : "Názov", "Deleted" : "Zmazané", "Delete" : "Zmazať" diff --git a/apps/files_trashbin/l10n/sl.js b/apps/files_trashbin/l10n/sl.js index 60cecde1cb8..1e92dafb9d0 100644 --- a/apps/files_trashbin/l10n/sl.js +++ b/apps/files_trashbin/l10n/sl.js @@ -5,9 +5,12 @@ OC.L10N.register( "Couldn't restore %s" : "Ni mogoče obnoviti %s", "Deleted files" : "Izbrisane datoteke", "Restore" : "Obnovi", + "Delete permanently" : "Izbriši dokončno", "Error" : "Napaka", "restored" : "obnovljeno", - "Nothing in here. Your trash bin is empty!" : "Mapa smeti je prazna.", + "No deleted files" : "Ni izbrisanih datotek", + "You will be able to recover deleted files from here" : "Izbrisane datoteke je mogoče povrniti na tem mestu", + "Select all" : "izberi vse", "Name" : "Ime", "Deleted" : "Izbrisano", "Delete" : "Izbriši" diff --git a/apps/files_trashbin/l10n/sl.json b/apps/files_trashbin/l10n/sl.json index 0431bb30997..456c36793b3 100644 --- a/apps/files_trashbin/l10n/sl.json +++ b/apps/files_trashbin/l10n/sl.json @@ -3,9 +3,12 @@ "Couldn't restore %s" : "Ni mogoče obnoviti %s", "Deleted files" : "Izbrisane datoteke", "Restore" : "Obnovi", + "Delete permanently" : "Izbriši dokončno", "Error" : "Napaka", "restored" : "obnovljeno", - "Nothing in here. Your trash bin is empty!" : "Mapa smeti je prazna.", + "No deleted files" : "Ni izbrisanih datotek", + "You will be able to recover deleted files from here" : "Izbrisane datoteke je mogoče povrniti na tem mestu", + "Select all" : "izberi vse", "Name" : "Ime", "Deleted" : "Izbrisano", "Delete" : "Izbriši" diff --git a/apps/files_trashbin/l10n/sq.js b/apps/files_trashbin/l10n/sq.js index 6c4e2b4461f..be6182a94dd 100644 --- a/apps/files_trashbin/l10n/sq.js +++ b/apps/files_trashbin/l10n/sq.js @@ -5,9 +5,9 @@ OC.L10N.register( "Couldn't restore %s" : "Nuk munda ta rivendos %s", "Deleted files" : "Skedarë të fshirë ", "Restore" : "Rivendos", + "Delete permanently" : "Fshi përfundimisht", "Error" : "Veprim i gabuar", "restored" : "rivendosur", - "Nothing in here. Your trash bin is empty!" : "Këtu nuk ka asgjë. Koshi juaj është bosh!", "Name" : "Emri", "Deleted" : "Eliminuar", "Delete" : "Elimino" diff --git a/apps/files_trashbin/l10n/sq.json b/apps/files_trashbin/l10n/sq.json index fc766582d5f..735fd8c86b1 100644 --- a/apps/files_trashbin/l10n/sq.json +++ b/apps/files_trashbin/l10n/sq.json @@ -3,9 +3,9 @@ "Couldn't restore %s" : "Nuk munda ta rivendos %s", "Deleted files" : "Skedarë të fshirë ", "Restore" : "Rivendos", + "Delete permanently" : "Fshi përfundimisht", "Error" : "Veprim i gabuar", "restored" : "rivendosur", - "Nothing in here. Your trash bin is empty!" : "Këtu nuk ka asgjë. Koshi juaj është bosh!", "Name" : "Emri", "Deleted" : "Eliminuar", "Delete" : "Elimino" diff --git a/apps/files_trashbin/l10n/sr.js b/apps/files_trashbin/l10n/sr.js index fdaae6185ad..a3ba991eb1c 100644 --- a/apps/files_trashbin/l10n/sr.js +++ b/apps/files_trashbin/l10n/sr.js @@ -3,8 +3,8 @@ OC.L10N.register( { "Deleted files" : "Обрисане датотеке", "Restore" : "Врати", + "Delete permanently" : "Обриши за стално", "Error" : "Грешка", - "Nothing in here. Your trash bin is empty!" : "Овде нема ништа. Корпа за отпатке је празна.", "Name" : "Име", "Deleted" : "Обрисано", "Delete" : "Обриши" diff --git a/apps/files_trashbin/l10n/sr.json b/apps/files_trashbin/l10n/sr.json index d4d8c91bf17..ef05d8fe159 100644 --- a/apps/files_trashbin/l10n/sr.json +++ b/apps/files_trashbin/l10n/sr.json @@ -1,8 +1,8 @@ { "translations": { "Deleted files" : "Обрисане датотеке", "Restore" : "Врати", + "Delete permanently" : "Обриши за стално", "Error" : "Грешка", - "Nothing in here. Your trash bin is empty!" : "Овде нема ништа. Корпа за отпатке је празна.", "Name" : "Име", "Deleted" : "Обрисано", "Delete" : "Обриши" diff --git a/apps/files_trashbin/l10n/sv.js b/apps/files_trashbin/l10n/sv.js index eb7ad2dcd41..5a432945260 100644 --- a/apps/files_trashbin/l10n/sv.js +++ b/apps/files_trashbin/l10n/sv.js @@ -5,9 +5,12 @@ OC.L10N.register( "Couldn't restore %s" : "Kunde inte återställa %s", "Deleted files" : "Raderade filer", "Restore" : "Återskapa", + "Delete permanently" : "Radera permanent", "Error" : "Fel", "restored" : "återställd", - "Nothing in here. Your trash bin is empty!" : "Ingenting här. Din papperskorg är tom!", + "No deleted files" : "Inga borttagna filer", + "You will be able to recover deleted files from here" : "Du kommer kunna återfå raderade filer härifrån", + "Select all" : "Välj allt", "Name" : "Namn", "Deleted" : "Raderad", "Delete" : "Radera" diff --git a/apps/files_trashbin/l10n/sv.json b/apps/files_trashbin/l10n/sv.json index 114b5f7738b..f1fd0cdf5de 100644 --- a/apps/files_trashbin/l10n/sv.json +++ b/apps/files_trashbin/l10n/sv.json @@ -3,9 +3,12 @@ "Couldn't restore %s" : "Kunde inte återställa %s", "Deleted files" : "Raderade filer", "Restore" : "Återskapa", + "Delete permanently" : "Radera permanent", "Error" : "Fel", "restored" : "återställd", - "Nothing in here. Your trash bin is empty!" : "Ingenting här. Din papperskorg är tom!", + "No deleted files" : "Inga borttagna filer", + "You will be able to recover deleted files from here" : "Du kommer kunna återfå raderade filer härifrån", + "Select all" : "Välj allt", "Name" : "Namn", "Deleted" : "Raderad", "Delete" : "Radera" diff --git a/apps/files_trashbin/l10n/te.js b/apps/files_trashbin/l10n/te.js index 505aced8869..e851ec86421 100644 --- a/apps/files_trashbin/l10n/te.js +++ b/apps/files_trashbin/l10n/te.js @@ -1,6 +1,7 @@ OC.L10N.register( "files_trashbin", { + "Delete permanently" : "శాశ్వతంగా తొలగించు", "Error" : "పొరపాటు", "Name" : "పేరు", "Delete" : "తొలగించు" diff --git a/apps/files_trashbin/l10n/te.json b/apps/files_trashbin/l10n/te.json index 37f365e370d..4df06631a0c 100644 --- a/apps/files_trashbin/l10n/te.json +++ b/apps/files_trashbin/l10n/te.json @@ -1,4 +1,5 @@ { "translations": { + "Delete permanently" : "శాశ్వతంగా తొలగించు", "Error" : "పొరపాటు", "Name" : "పేరు", "Delete" : "తొలగించు" diff --git a/apps/files_trashbin/l10n/th_TH.js b/apps/files_trashbin/l10n/th_TH.js index 77ccd12dd44..c1c80b191bb 100644 --- a/apps/files_trashbin/l10n/th_TH.js +++ b/apps/files_trashbin/l10n/th_TH.js @@ -3,7 +3,6 @@ OC.L10N.register( { "Restore" : "คืนค่า", "Error" : "ข้อผิดพลาด", - "Nothing in here. Your trash bin is empty!" : "ไม่มีอะไรอยู่ในนี้ ถังขยะของคุณยังว่างอยู่", "Name" : "ชื่อ", "Deleted" : "ลบแล้ว", "Delete" : "ลบ" diff --git a/apps/files_trashbin/l10n/th_TH.json b/apps/files_trashbin/l10n/th_TH.json index 550ff568061..eb3c405beaf 100644 --- a/apps/files_trashbin/l10n/th_TH.json +++ b/apps/files_trashbin/l10n/th_TH.json @@ -1,7 +1,6 @@ { "translations": { "Restore" : "คืนค่า", "Error" : "ข้อผิดพลาด", - "Nothing in here. Your trash bin is empty!" : "ไม่มีอะไรอยู่ในนี้ ถังขยะของคุณยังว่างอยู่", "Name" : "ชื่อ", "Deleted" : "ลบแล้ว", "Delete" : "ลบ" diff --git a/apps/files_trashbin/l10n/tr.js b/apps/files_trashbin/l10n/tr.js index f8e8b4daff1..c71cee9b34a 100644 --- a/apps/files_trashbin/l10n/tr.js +++ b/apps/files_trashbin/l10n/tr.js @@ -5,9 +5,9 @@ OC.L10N.register( "Couldn't restore %s" : "%s geri yüklenemedi", "Deleted files" : "Silinmiş dosyalar", "Restore" : "Geri yükle", + "Delete permanently" : "Kalıcı olarak sil", "Error" : "Hata", "restored" : "geri yüklendi", - "Nothing in here. Your trash bin is empty!" : "Burada hiçbir şey yok. Çöp kutunuz tamamen boş!", "Name" : "İsim", "Deleted" : "Silinme", "Delete" : "Sil" diff --git a/apps/files_trashbin/l10n/tr.json b/apps/files_trashbin/l10n/tr.json index d000f31a743..f10180a0922 100644 --- a/apps/files_trashbin/l10n/tr.json +++ b/apps/files_trashbin/l10n/tr.json @@ -3,9 +3,9 @@ "Couldn't restore %s" : "%s geri yüklenemedi", "Deleted files" : "Silinmiş dosyalar", "Restore" : "Geri yükle", + "Delete permanently" : "Kalıcı olarak sil", "Error" : "Hata", "restored" : "geri yüklendi", - "Nothing in here. Your trash bin is empty!" : "Burada hiçbir şey yok. Çöp kutunuz tamamen boş!", "Name" : "İsim", "Deleted" : "Silinme", "Delete" : "Sil" diff --git a/apps/files_trashbin/l10n/ug.js b/apps/files_trashbin/l10n/ug.js index e67cbf85809..329a04416c2 100644 --- a/apps/files_trashbin/l10n/ug.js +++ b/apps/files_trashbin/l10n/ug.js @@ -2,8 +2,8 @@ OC.L10N.register( "files_trashbin", { "Deleted files" : "ئۆچۈرۈلگەن ھۆججەتلەر", + "Delete permanently" : "مەڭگۈلۈك ئۆچۈر", "Error" : "خاتالىق", - "Nothing in here. Your trash bin is empty!" : "بۇ جايدا ھېچنېمە يوق. Your trash bin is empty!", "Name" : "ئاتى", "Deleted" : "ئۆچۈرۈلدى", "Delete" : "ئۆچۈر" diff --git a/apps/files_trashbin/l10n/ug.json b/apps/files_trashbin/l10n/ug.json index 8ed6b5cdd80..60a915b2ee5 100644 --- a/apps/files_trashbin/l10n/ug.json +++ b/apps/files_trashbin/l10n/ug.json @@ -1,7 +1,7 @@ { "translations": { "Deleted files" : "ئۆچۈرۈلگەن ھۆججەتلەر", + "Delete permanently" : "مەڭگۈلۈك ئۆچۈر", "Error" : "خاتالىق", - "Nothing in here. Your trash bin is empty!" : "بۇ جايدا ھېچنېمە يوق. Your trash bin is empty!", "Name" : "ئاتى", "Deleted" : "ئۆچۈرۈلدى", "Delete" : "ئۆچۈر" diff --git a/apps/files_trashbin/l10n/uk.js b/apps/files_trashbin/l10n/uk.js index 0d778f21ad9..a3272ac313f 100644 --- a/apps/files_trashbin/l10n/uk.js +++ b/apps/files_trashbin/l10n/uk.js @@ -5,9 +5,9 @@ OC.L10N.register( "Couldn't restore %s" : "Неможливо відновити %s", "Deleted files" : "Видалені файли", "Restore" : "Відновити", + "Delete permanently" : "Видалити назавжди", "Error" : "Помилка", "restored" : "відновлено", - "Nothing in here. Your trash bin is empty!" : "Нічого немає. Ваший кошик для сміття пустий!", "Name" : "Ім'я", "Deleted" : "Видалено", "Delete" : "Видалити" diff --git a/apps/files_trashbin/l10n/uk.json b/apps/files_trashbin/l10n/uk.json index 77e9b53896c..a711236cd0a 100644 --- a/apps/files_trashbin/l10n/uk.json +++ b/apps/files_trashbin/l10n/uk.json @@ -3,9 +3,9 @@ "Couldn't restore %s" : "Неможливо відновити %s", "Deleted files" : "Видалені файли", "Restore" : "Відновити", + "Delete permanently" : "Видалити назавжди", "Error" : "Помилка", "restored" : "відновлено", - "Nothing in here. Your trash bin is empty!" : "Нічого немає. Ваший кошик для сміття пустий!", "Name" : "Ім'я", "Deleted" : "Видалено", "Delete" : "Видалити" diff --git a/apps/files_trashbin/l10n/ur.php b/apps/files_trashbin/l10n/ur.php deleted file mode 100644 index 1b41db1d679..00000000000 --- a/apps/files_trashbin/l10n/ur.php +++ /dev/null @@ -1,5 +0,0 @@ -<?php -$TRANSLATIONS = array( -"Error" => "خرابی" -); -$PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/apps/files_trashbin/l10n/ur_PK.js b/apps/files_trashbin/l10n/ur_PK.js index 4235475115c..2dbe75b304e 100644 --- a/apps/files_trashbin/l10n/ur_PK.js +++ b/apps/files_trashbin/l10n/ur_PK.js @@ -7,7 +7,6 @@ OC.L10N.register( "Restore" : "بحال", "Error" : "ایرر", "restored" : "بحال شدہ", - "Nothing in here. Your trash bin is empty!" : " یہاں کچھ بھی نہیں .آپکی ردی کی ٹوکری خالی ہے.", "Name" : "اسم", "Deleted" : "حذف شدہ ", "Delete" : "حذف کریں" diff --git a/apps/files_trashbin/l10n/ur_PK.json b/apps/files_trashbin/l10n/ur_PK.json index 609b83e75c3..d7ec3662998 100644 --- a/apps/files_trashbin/l10n/ur_PK.json +++ b/apps/files_trashbin/l10n/ur_PK.json @@ -5,7 +5,6 @@ "Restore" : "بحال", "Error" : "ایرر", "restored" : "بحال شدہ", - "Nothing in here. Your trash bin is empty!" : " یہاں کچھ بھی نہیں .آپکی ردی کی ٹوکری خالی ہے.", "Name" : "اسم", "Deleted" : "حذف شدہ ", "Delete" : "حذف کریں" diff --git a/apps/files_trashbin/l10n/vi.js b/apps/files_trashbin/l10n/vi.js index 113fae4c2da..29338f3327e 100644 --- a/apps/files_trashbin/l10n/vi.js +++ b/apps/files_trashbin/l10n/vi.js @@ -5,9 +5,9 @@ OC.L10N.register( "Couldn't restore %s" : "Không thể khôi phục %s", "Deleted files" : "File đã bị xóa", "Restore" : "Khôi phục", + "Delete permanently" : "Xóa vĩnh vễn", "Error" : "Lỗi", "restored" : "khôi phục", - "Nothing in here. Your trash bin is empty!" : "Không có gì ở đây. Thùng rác của bạn rỗng!", "Name" : "Tên", "Deleted" : "Đã xóa", "Delete" : "Xóa" diff --git a/apps/files_trashbin/l10n/vi.json b/apps/files_trashbin/l10n/vi.json index 7323889de6f..35739aa3c14 100644 --- a/apps/files_trashbin/l10n/vi.json +++ b/apps/files_trashbin/l10n/vi.json @@ -3,9 +3,9 @@ "Couldn't restore %s" : "Không thể khôi phục %s", "Deleted files" : "File đã bị xóa", "Restore" : "Khôi phục", + "Delete permanently" : "Xóa vĩnh vễn", "Error" : "Lỗi", "restored" : "khôi phục", - "Nothing in here. Your trash bin is empty!" : "Không có gì ở đây. Thùng rác của bạn rỗng!", "Name" : "Tên", "Deleted" : "Đã xóa", "Delete" : "Xóa" diff --git a/apps/files_trashbin/l10n/zh_CN.js b/apps/files_trashbin/l10n/zh_CN.js index 6c421ab55b9..8c9512b1d66 100644 --- a/apps/files_trashbin/l10n/zh_CN.js +++ b/apps/files_trashbin/l10n/zh_CN.js @@ -5,9 +5,10 @@ OC.L10N.register( "Couldn't restore %s" : "无法恢复%s", "Deleted files" : "已删除文件", "Restore" : "恢复", + "Delete permanently" : "永久删除", "Error" : "错误", "restored" : "已恢复", - "Nothing in here. Your trash bin is empty!" : "这里没有东西. 你的回收站是空的!", + "Select all" : "全部选择", "Name" : "名称", "Deleted" : "已删除", "Delete" : "删除" diff --git a/apps/files_trashbin/l10n/zh_CN.json b/apps/files_trashbin/l10n/zh_CN.json index 88665113d1b..895d235aadb 100644 --- a/apps/files_trashbin/l10n/zh_CN.json +++ b/apps/files_trashbin/l10n/zh_CN.json @@ -3,9 +3,10 @@ "Couldn't restore %s" : "无法恢复%s", "Deleted files" : "已删除文件", "Restore" : "恢复", + "Delete permanently" : "永久删除", "Error" : "错误", "restored" : "已恢复", - "Nothing in here. Your trash bin is empty!" : "这里没有东西. 你的回收站是空的!", + "Select all" : "全部选择", "Name" : "名称", "Deleted" : "已删除", "Delete" : "删除" diff --git a/apps/files_trashbin/l10n/zh_TW.js b/apps/files_trashbin/l10n/zh_TW.js index 9a0ff0bdb8f..974c38d09a6 100644 --- a/apps/files_trashbin/l10n/zh_TW.js +++ b/apps/files_trashbin/l10n/zh_TW.js @@ -5,9 +5,9 @@ OC.L10N.register( "Couldn't restore %s" : "無法還原 %s", "Deleted files" : "回收桶", "Restore" : "還原", + "Delete permanently" : "永久刪除", "Error" : "錯誤", "restored" : "已還原", - "Nothing in here. Your trash bin is empty!" : "您的回收桶是空的!", "Name" : "名稱", "Deleted" : "已刪除", "Delete" : "刪除" diff --git a/apps/files_trashbin/l10n/zh_TW.json b/apps/files_trashbin/l10n/zh_TW.json index 61d7daaf1f4..f944a8db39e 100644 --- a/apps/files_trashbin/l10n/zh_TW.json +++ b/apps/files_trashbin/l10n/zh_TW.json @@ -3,9 +3,9 @@ "Couldn't restore %s" : "無法還原 %s", "Deleted files" : "回收桶", "Restore" : "還原", + "Delete permanently" : "永久刪除", "Error" : "錯誤", "restored" : "已還原", - "Nothing in here. Your trash bin is empty!" : "您的回收桶是空的!", "Name" : "名稱", "Deleted" : "已刪除", "Delete" : "刪除" diff --git a/apps/files_trashbin/lib/capabilities.php b/apps/files_trashbin/lib/capabilities.php new file mode 100644 index 00000000000..3f137d22b6f --- /dev/null +++ b/apps/files_trashbin/lib/capabilities.php @@ -0,0 +1,32 @@ +<?php +/** + * Copyright (c) Lukas Reschke <lukas@owncloud.com> + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace OCA\Files_Trashbin; + + +/** + * Class Capabilities + * + * @package OCA\Files_Trashbin + */ +class Capabilities { + + /** + * @return \OC_OCS_Result + */ + public static function getCapabilities() { + return new \OC_OCS_Result(array( + 'capabilities' => array( + 'files' => array( + 'undelete' => true, + ), + ), + )); + } + +} diff --git a/apps/files_trashbin/lib/exceptions.php b/apps/files_trashbin/lib/exceptions/copyrecursiveexception.php index 23e50293b77..23e50293b77 100644 --- a/apps/files_trashbin/lib/exceptions.php +++ b/apps/files_trashbin/lib/exceptions/copyrecursiveexception.php diff --git a/apps/files_trashbin/lib/helper.php b/apps/files_trashbin/lib/helper.php index c2b81e3dbc8..d9e69b71aa0 100644 --- a/apps/files_trashbin/lib/helper.php +++ b/apps/files_trashbin/lib/helper.php @@ -31,8 +31,10 @@ class Helper return $result; } - list($storage, $internalPath) = $view->resolvePath($dir); + $mount = $view->getMount($dir); + $storage = $mount->getStorage(); $absoluteDir = $view->getAbsolutePath($dir); + $internalPath = $mount->getInternalPath($absoluteDir); if (is_resource($dirContent)) { $originalLocations = \OCA\Files_Trashbin\Trashbin::getLocations($user); @@ -65,7 +67,7 @@ class Helper if ($originalPath) { $i['extraData'] = $originalPath.'/'.$id; } - $result[] = new FileInfo($absoluteDir . '/' . $i['name'], $storage, $internalPath . '/' . $i['name'], $i); + $result[] = new FileInfo($absoluteDir . '/' . $i['name'], $storage, $internalPath . '/' . $i['name'], $i, $mount); } } closedir($dirContent); @@ -88,7 +90,7 @@ class Helper $entry = \OCA\Files\Helper::formatFileInfo($i); $entry['id'] = $id++; $entry['etag'] = $entry['mtime']; // add fake etag, it is only needed to identify the preview image - $entry['permissions'] = \OCP\PERMISSION_READ; + $entry['permissions'] = \OCP\Constants::PERMISSION_READ; if (\OCP\App::isEnabled('files_encryption')) { $entry['isPreviewAvailable'] = false; } diff --git a/apps/files_trashbin/lib/trashbin.php b/apps/files_trashbin/lib/trashbin.php index 52d24143902..26257bd3817 100644 --- a/apps/files_trashbin/lib/trashbin.php +++ b/apps/files_trashbin/lib/trashbin.php @@ -22,6 +22,8 @@ namespace OCA\Files_Trashbin; +use OC\Files\Filesystem; + class Trashbin { // how long do we keep files in the trash bin if no other value is defined in the config file (unit: days) @@ -92,11 +94,8 @@ class Trashbin { if (!$view->is_dir('files_trashbin/versions')) { $view->mkdir('files_trashbin/versions'); } - if (!$view->is_dir('files_trashbin/keyfiles')) { - $view->mkdir('files_trashbin/keyfiles'); - } - if (!$view->is_dir('files_trashbin/share-keys')) { - $view->mkdir('files_trashbin/share-keys'); + if (!$view->is_dir('files_trashbin/keys')) { + $view->mkdir('files_trashbin/keys'); } } @@ -139,7 +138,9 @@ class Trashbin { * @param string $file_path path to the deleted file/directory relative to the files root directory */ public static function move2trash($file_path) { - $user = \OCP\User::getUser(); + // get the user for which the filesystem is setup + $root = Filesystem::getRoot(); + list(, $user) = explode('/', $root); $size = 0; list($owner, $ownerPath) = self::getUidAndFilename($file_path); @@ -277,78 +278,23 @@ class Trashbin { return 0; } - $util = new \OCA\Encryption\Util(new \OC\Files\View('/'), $user); - - // disable proxy to prevent recursive calls - $proxyStatus = \OC_FileProxy::$enabled; - \OC_FileProxy::$enabled = false; - - if ($util->isSystemWideMountPoint($ownerPath)) { - $baseDir = '/files_encryption/'; - } else { - $baseDir = $owner . '/files_encryption/'; - } - - $keyfile = \OC\Files\Filesystem::normalizePath($baseDir . '/keyfiles/' . $ownerPath); + $util = new \OCA\Files_Encryption\Util($rootView, $user); - if ($rootView->is_dir($keyfile) || $rootView->file_exists($keyfile . '.key')) { - // move keyfiles - if ($rootView->is_dir($keyfile)) { - $size += self::calculateSize(new \OC\Files\View($keyfile)); - if ($owner !== $user) { - self::copy_recursive($keyfile, $owner . '/files_trashbin/keyfiles/' . basename($ownerPath) . '.d' . $timestamp, $rootView); - } - $rootView->rename($keyfile, $user . '/files_trashbin/keyfiles/' . $filename . '.d' . $timestamp); - } else { - $size += $rootView->filesize($keyfile . '.key'); - if ($owner !== $user) { - $rootView->copy($keyfile . '.key', $owner . '/files_trashbin/keyfiles/' . basename($ownerPath) . '.key.d' . $timestamp); - } - $rootView->rename($keyfile . '.key', $user . '/files_trashbin/keyfiles/' . $filename . '.key.d' . $timestamp); - } + $baseDir = '/files_encryption/'; + if (!$util->isSystemWideMountPoint($ownerPath)) { + $baseDir = $owner . $baseDir; } - // retain share keys - $sharekeys = \OC\Files\Filesystem::normalizePath($baseDir . '/share-keys/' . $ownerPath); + $keyfiles = \OC\Files\Filesystem::normalizePath($baseDir . '/keys/' . $ownerPath); - if ($rootView->is_dir($sharekeys)) { - $size += self::calculateSize(new \OC\Files\View($sharekeys)); + if ($rootView->is_dir($keyfiles)) { + $size += self::calculateSize(new \OC\Files\View($keyfiles)); if ($owner !== $user) { - self::copy_recursive($sharekeys, $owner . '/files_trashbin/share-keys/' . basename($ownerPath) . '.d' . $timestamp, $rootView); - } - $rootView->rename($sharekeys, $user . '/files_trashbin/share-keys/' . $filename . '.d' . $timestamp); - } else { - // handle share-keys - $matches = \OCA\Encryption\Helper::findShareKeys($ownerPath, $sharekeys, $rootView); - foreach ($matches as $src) { - // get source file parts - $pathinfo = pathinfo($src); - - // we only want to keep the users key so we can access the private key - $userShareKey = $filename . '.' . $user . '.shareKey'; - - // if we found the share-key for the owner, we need to move it to files_trashbin - if ($pathinfo['basename'] == $userShareKey) { - - // calculate size - $size += $rootView->filesize($sharekeys . '.' . $user . '.shareKey'); - - // move file - $rootView->rename($sharekeys . '.' . $user . '.shareKey', $user . '/files_trashbin/share-keys/' . $userShareKey . '.d' . $timestamp); - } elseif ($owner !== $user) { - $ownerShareKey = basename($ownerPath) . '.' . $owner . '.shareKey'; - if ($pathinfo['basename'] == $ownerShareKey) { - $rootView->rename($sharekeys . '.' . $owner . '.shareKey', $owner . '/files_trashbin/share-keys/' . $ownerShareKey . '.d' . $timestamp); - } - } else { - // don't keep other share-keys - unlink($src); - } + self::copy_recursive($keyfiles, $owner . '/files_trashbin/keys/' . basename($ownerPath) . '.d' . $timestamp, $rootView); } + $rootView->rename($keyfiles, $user . '/files_trashbin/keys/' . $filename . '.d' . $timestamp); } - // enable proxy - \OC_FileProxy::$enabled = $proxyStatus; } return $size; } @@ -492,7 +438,7 @@ class Trashbin { * @return bool */ private static function restoreEncryptionKeys(\OC\Files\View $view, $file, $filename, $uniqueFilename, $location, $timestamp) { - // Take care of encryption keys TODO! Get '.key' in file between file name and delete date (also for permanent delete!) + if (\OCP\App::isEnabled('files_encryption')) { $user = \OCP\User::getUser(); $rootView = new \OC\Files\View('/'); @@ -506,84 +452,31 @@ class Trashbin { return false; } - $util = new \OCA\Encryption\Util(new \OC\Files\View('/'), $user); + $util = new \OCA\Files_Encryption\Util($rootView, $user); - if ($util->isSystemWideMountPoint($ownerPath)) { - $baseDir = '/files_encryption/'; - } else { - $baseDir = $owner . '/files_encryption/'; + $baseDir = '/files_encryption/'; + if (!$util->isSystemWideMountPoint($ownerPath)) { + $baseDir = $owner . $baseDir; } - $path_parts = pathinfo($file); - $source_location = $path_parts['dirname']; + $source_location = dirname($file); - if ($view->is_dir('/files_trashbin/keyfiles/' . $file)) { + if ($view->is_dir('/files_trashbin/keys/' . $file)) { if ($source_location != '.') { - $keyfile = \OC\Files\Filesystem::normalizePath($user . '/files_trashbin/keyfiles/' . $source_location . '/' . $filename); - $sharekey = \OC\Files\Filesystem::normalizePath($user . '/files_trashbin/share-keys/' . $source_location . '/' . $filename); + $keyfile = \OC\Files\Filesystem::normalizePath($user . '/files_trashbin/keys/' . $source_location . '/' . $filename); } else { - $keyfile = \OC\Files\Filesystem::normalizePath($user . '/files_trashbin/keyfiles/' . $filename); - $sharekey = \OC\Files\Filesystem::normalizePath($user . '/files_trashbin/share-keys/' . $filename); + $keyfile = \OC\Files\Filesystem::normalizePath($user . '/files_trashbin/keys/' . $filename); } - } else { - $keyfile = \OC\Files\Filesystem::normalizePath($user . '/files_trashbin/keyfiles/' . $source_location . '/' . $filename . '.key'); } if ($timestamp) { $keyfile .= '.d' . $timestamp; } - // disable proxy to prevent recursive calls - $proxyStatus = \OC_FileProxy::$enabled; - \OC_FileProxy::$enabled = false; - - if ($rootView->file_exists($keyfile)) { - // handle directory - if ($rootView->is_dir($keyfile)) { - - // handle keyfiles - $rootView->rename($keyfile, $baseDir . '/keyfiles/' . $ownerPath); - - // handle share-keys - if ($timestamp) { - $sharekey .= '.d' . $timestamp; - } - $rootView->rename($sharekey, $baseDir . '/share-keys/' . $ownerPath); - } else { - // handle keyfiles - $rootView->rename($keyfile, $baseDir . '/keyfiles/' . $ownerPath . '.key'); - - // handle share-keys - $ownerShareKey = \OC\Files\Filesystem::normalizePath($user . '/files_trashbin/share-keys/' . $source_location . '/' . $filename . '.' . $user . '.shareKey'); - if ($timestamp) { - $ownerShareKey .= '.d' . $timestamp; - } - - // move only owners key - $rootView->rename($ownerShareKey, $baseDir . '/share-keys/' . $ownerPath . '.' . $user . '.shareKey'); - - // try to re-share if file is shared - $filesystemView = new \OC\Files\View('/'); - $session = new \OCA\Encryption\Session($filesystemView); - $util = new \OCA\Encryption\Util($filesystemView, $user); - - // fix the file size - $absolutePath = \OC\Files\Filesystem::normalizePath('/' . $owner . '/files/' . $ownerPath); - $util->fixFileSize($absolutePath); - - // get current sharing state - $sharingEnabled = \OCP\Share::isEnabled(); - - // get users sharing this file - $usersSharing = $util->getSharingUsersArray($sharingEnabled, $target); - - // Attempt to set shareKey - $util->setSharedFileKeyfiles($session, $usersSharing, $target); - } + if ($rootView->is_dir($keyfile)) { + $rootView->rename($keyfile, $baseDir . '/keys/' . $ownerPath); } - // enable proxy - \OC_FileProxy::$enabled = $proxyStatus; } } @@ -678,27 +571,15 @@ class Trashbin { if (\OCP\App::isEnabled('files_encryption')) { $user = \OCP\User::getUser(); - if ($view->is_dir('/files_trashbin/files/' . $file)) { - $keyfile = \OC\Files\Filesystem::normalizePath('files_trashbin/keyfiles/' . $filename); - $sharekeys = \OC\Files\Filesystem::normalizePath('files_trashbin/share-keys/' . $filename); - } else { - $keyfile = \OC\Files\Filesystem::normalizePath('files_trashbin/keyfiles/' . $filename . '.key'); - $sharekeys = \OC\Files\Filesystem::normalizePath('files_trashbin/share-keys/' . $filename . '.' . $user . '.shareKey'); - } + $keyfiles = \OC\Files\Filesystem::normalizePath('files_trashbin/keys/' . $filename); + if ($timestamp) { - $keyfile .= '.d' . $timestamp; - $sharekeys .= '.d' . $timestamp; + $keyfiles .= '.d' . $timestamp; } - if ($view->file_exists($keyfile)) { - if ($view->is_dir($keyfile)) { - $size += self::calculateSize(new \OC\Files\View('/' . $user . '/' . $keyfile)); - $size += self::calculateSize(new \OC\Files\View('/' . $user . '/' . $sharekeys)); - } else { - $size += $view->filesize($keyfile); - $size += $view->filesize($sharekeys); - } - $view->unlink($keyfile); - $view->unlink($sharekeys); + if ($view->is_dir($keyfiles)) { + $size += self::calculateSize(new \OC\Files\View('/' . $user . '/' . $keyfiles)); + $view->deleteAll($keyfiles); + } } return $size; @@ -744,11 +625,13 @@ class Trashbin { * @return int available free space for trash bin */ private static function calculateFreeSpace($trashbinSize, $user) { + $config = \OC::$server->getConfig(); + $softQuota = true; - $quota = \OC_Preferences::getValue($user, 'files', 'quota'); + $quota = $config->getUserValue($user, 'files', 'quota', null); $view = new \OC\Files\View('/' . $user); if ($quota === null || $quota === 'default') { - $quota = \OC::$server->getAppConfig()->getValue('files', 'default_quota'); + $quota = $config->getAppValue('files', 'default_quota', null); } if ($quota === null || $quota === 'none') { $quota = \OC\Files\Filesystem::free_space('/'); @@ -995,7 +878,7 @@ class Trashbin { * @return integer size of the folder */ private static function calculateSize($view) { - $root = \OCP\Config::getSystemValue('datadirectory') . $view->getAbsolutePath(''); + $root = \OC::$server->getConfig()->getSystemValue('datadirectory') . $view->getAbsolutePath(''); if (!file_exists($root)) { return 0; } diff --git a/apps/files_trashbin/templates/index.php b/apps/files_trashbin/templates/index.php index fc18e88c41e..0c0f955cf40 100644 --- a/apps/files_trashbin/templates/index.php +++ b/apps/files_trashbin/templates/index.php @@ -4,21 +4,33 @@ </div> <div id='notification'></div> -<div id="emptycontent" class="hidden"><?php p($l->t('Nothing in here. Your trash bin is empty!'))?></div> +<div id="emptycontent" class="hidden"> + <div class="icon-delete"></div> + <h2><?php p($l->t('No deleted files')); ?></h2> + <p><?php p($l->t('You will be able to recover deleted files from here')); ?></p> +</div> <input type="hidden" name="dir" value="" id="dir"> +<div class="nofilterresults hidden"> + <div class="icon-search"></div> + <h2><?php p($l->t('No entries found in this folder')); ?></h2> + <p></p> +</div> + <table id="filestable"> <thead> <tr> <th id='headerName' class="hidden column-name"> <div id="headerName-container"> <input type="checkbox" id="select_all_trash" class="select-all"/> - <label for="select_all_trash"></label> + <label for="select_all_trash"> + <span class="hidden-visually"><?php p($l->t('Select all'))?></span> + </label> <a class="name sort columntitle" data-sort="name"><span><?php p($l->t( 'Name' )); ?></span><span class="sort-indicator"></span></a> <span id="selectedActionsList" class='selectedActions'> <a href="" class="undelete"> - <img class="svg" alt="<?php p($l->t( 'Restore' )); ?>" + <img class="svg" alt="" src="<?php print_unescaped(OCP\image_path("core", "actions/history.svg")); ?>" /> <?php p($l->t('Restore'))?> </a> @@ -30,7 +42,7 @@ <span class="selectedActions"> <a href="" class="delete-selected"> <?php p($l->t('Delete'))?> - <img class="svg" alt="<?php p($l->t('Delete'))?>" + <img class="svg" alt="" src="<?php print_unescaped(OCP\image_path("core", "actions/delete.svg")); ?>" /> </a> </span> diff --git a/apps/files_trashbin/tests/trashbin.php b/apps/files_trashbin/tests/trashbin.php index 6fdb53f7271..f572e22623e 100644 --- a/apps/files_trashbin/tests/trashbin.php +++ b/apps/files_trashbin/tests/trashbin.php @@ -25,7 +25,7 @@ use OCA\Files_Trashbin; /** * Class Test_Encryption_Crypt */ -class Test_Trashbin extends \PHPUnit_Framework_TestCase { +class Test_Trashbin extends \Test\TestCase { const TEST_TRASHBIN_USER1 = "test-trashbin-user1"; const TEST_TRASHBIN_USER2 = "test-trashbin-user2"; @@ -43,6 +43,8 @@ class Test_Trashbin extends \PHPUnit_Framework_TestCase { private $rootView; public static function setUpBeforeClass() { + parent::setUpBeforeClass(); + // reset backend \OC_User::clearBackends(); \OC_User::useBackend('database'); @@ -85,18 +87,24 @@ class Test_Trashbin extends \PHPUnit_Framework_TestCase { \OC_Config::setValue('trashbin_auto_expire', self::$rememberAutoExpire); \OC_Hook::clear(); + + parent::tearDownAfterClass(); } - public function setUp() { + protected function setUp() { + parent::setUp(); + $this->trashRoot1 = '/' . self::TEST_TRASHBIN_USER1 . '/files_trashbin'; $this->trashRoot2 = '/' . self::TEST_TRASHBIN_USER2 . '/files_trashbin'; $this->rootView = new \OC\Files\View(); self::loginHelper(self::TEST_TRASHBIN_USER1); } - public function tearDown() { + protected function tearDown() { $this->rootView->deleteAll($this->trashRoot1); $this->rootView->deleteAll($this->trashRoot2); + + parent::tearDown(); } /** diff --git a/apps/files_versions/appinfo/api.php b/apps/files_versions/appinfo/api.php deleted file mode 100644 index 3c45ff52457..00000000000 --- a/apps/files_versions/appinfo/api.php +++ /dev/null @@ -1,34 +0,0 @@ -<?php -/** -* ownCloud -* -* @author Michael Gapczynski -* @copyright 2012 Michael Gapczynski mtgap@owncloud.com -* -* This library is free software; you can redistribute it and/or -* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE -* License as published by the Free Software Foundation; either -* version 3 of the License, or any later version. -* -* This library is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU AFFERO GENERAL PUBLIC LICENSE for more details. -* -* You should have received a copy of the GNU Affero General Public -* License along with this library. If not, see <http://www.gnu.org/licenses/>. -*/ - -return array( - 'list' => array('method' => 'GET', 'class' => 'Storage', 'function' => 'getVersions', - 'parameters' => array( - 'file' => array('required' => true, 'type' => 'string') - ) - ), - 'revert' => array('method' => 'POST', 'class' => 'Storage', 'function' => 'rollback', - 'parameters' => array( - 'file' => array('required' => true, 'type' => 'string'), - 'time' => array('required' => true, 'type' => 'int') - ) - ) -); diff --git a/apps/files_versions/appinfo/app.php b/apps/files_versions/appinfo/app.php index 78de1528f32..ae29bceb37c 100644 --- a/apps/files_versions/appinfo/app.php +++ b/apps/files_versions/appinfo/app.php @@ -1,10 +1,5 @@ <?php -//require_once 'files_versions/versions.php'; -OC::$CLASSPATH['OCA\Files_Versions\Storage'] = 'files_versions/lib/versions.php'; -OC::$CLASSPATH['OCA\Files_Versions\Hooks'] = 'files_versions/lib/hooks.php'; -OC::$CLASSPATH['OCA\Files_Versions\Capabilities'] = 'files_versions/lib/capabilities.php'; - OCP\Util::addTranslations('files_versions'); OCP\Util::addscript('files_versions', 'versions'); OCP\Util::addStyle('files_versions', 'versions'); diff --git a/apps/files_versions/appinfo/routes.php b/apps/files_versions/appinfo/routes.php index 057834213e4..83c7746d1e7 100644 --- a/apps/files_versions/appinfo/routes.php +++ b/apps/files_versions/appinfo/routes.php @@ -11,6 +11,8 @@ function() { require_once __DIR__ . '/../ajax/preview.php'; }); +$this->create('files_versions_download', 'download.php') + ->actionInclude('files_versions/download.php'); $this->create('files_versions_ajax_getVersions', 'ajax/getVersions.php') ->actionInclude('files_versions/ajax/getVersions.php'); $this->create('files_versions_ajax_rollbackVersion', 'ajax/rollbackVersion.php') diff --git a/apps/files_versions/download.php b/apps/files_versions/download.php index 2fe56d2e638..e5139450f5e 100644 --- a/apps/files_versions/download.php +++ b/apps/files_versions/download.php @@ -22,7 +22,7 @@ */ OCP\JSON::checkAppEnabled('files_versions'); -//OCP\JSON::callCheck(); +OCP\JSON::checkLoggedIn(); $file = $_GET['file']; $revision=(int)$_GET['revision']; diff --git a/apps/files_versions/js/versions.js b/apps/files_versions/js/versions.js index 64e0df76490..1a47c1749f9 100644 --- a/apps/files_versions/js/versions.js +++ b/apps/files_versions/js/versions.js @@ -11,6 +11,8 @@ /* global scanFiles, escapeHTML, formatDate */ $(document).ready(function(){ + // TODO: namespace all this as OCA.FileVersions + if ($('#isPublic').val()){ // no versions actions in public mode // beware of https://github.com/owncloud/core/issues/4545 diff --git a/apps/files_versions/l10n/bs.js b/apps/files_versions/l10n/bs.js new file mode 100644 index 00000000000..21e9851b64c --- /dev/null +++ b/apps/files_versions/l10n/bs.js @@ -0,0 +1,11 @@ +OC.L10N.register( + "files_versions", + { + "Could not revert: %s" : "Nije moguće vratiti: %s", + "Versions" : "Verzije", + "Failed to revert {file} to revision {timestamp}." : "Nije uspelo vraćanje {file} na reviziju {timestamp}.", + "More versions..." : "Više verzija...", + "No other versions available" : "Druge verzije su nedostupne", + "Restore" : "Obnovi" +}, +"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/apps/files_versions/l10n/bs.json b/apps/files_versions/l10n/bs.json new file mode 100644 index 00000000000..1bc885614ed --- /dev/null +++ b/apps/files_versions/l10n/bs.json @@ -0,0 +1,9 @@ +{ "translations": { + "Could not revert: %s" : "Nije moguće vratiti: %s", + "Versions" : "Verzije", + "Failed to revert {file} to revision {timestamp}." : "Nije uspelo vraćanje {file} na reviziju {timestamp}.", + "More versions..." : "Više verzija...", + "No other versions available" : "Druge verzije su nedostupne", + "Restore" : "Obnovi" +},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" +}
\ No newline at end of file diff --git a/apps/files_versions/l10n/kn.js b/apps/files_versions/l10n/kn.js new file mode 100644 index 00000000000..b394094989a --- /dev/null +++ b/apps/files_versions/l10n/kn.js @@ -0,0 +1,11 @@ +OC.L10N.register( + "files_versions", + { + "Could not revert: %s" : "ಹಿಂತಿರುಗಲಾಗಲಿಲ್ಲ: %s", + "Versions" : "ಆವೃತ್ತಿಗಳು", + "Failed to revert {file} to revision {timestamp}." : "{timestamp} ದ ಪರಿಷ್ಕರಣೆ ಇಂದ {file} ಕಡತವನ್ನು ಹಿಂದಿರುಗಿಸಲು ವಿಫಲವಾಗಿದೆ.", + "More versions..." : "ಇನ್ನಷ್ಟು ಆವೃತ್ತಿಗಳು ...", + "No other versions available" : "ಇನ್ನಿತರೆ ಯಾವುದೇ ಆವೃತ್ತಿಗಳು ಲಭ್ಯವಿಲ್ಲ", + "Restore" : "ಮರುಸ್ಥಾಪಿಸು" +}, +"nplurals=1; plural=0;"); diff --git a/apps/files_versions/l10n/kn.json b/apps/files_versions/l10n/kn.json new file mode 100644 index 00000000000..17b61dd6bac --- /dev/null +++ b/apps/files_versions/l10n/kn.json @@ -0,0 +1,9 @@ +{ "translations": { + "Could not revert: %s" : "ಹಿಂತಿರುಗಲಾಗಲಿಲ್ಲ: %s", + "Versions" : "ಆವೃತ್ತಿಗಳು", + "Failed to revert {file} to revision {timestamp}." : "{timestamp} ದ ಪರಿಷ್ಕರಣೆ ಇಂದ {file} ಕಡತವನ್ನು ಹಿಂದಿರುಗಿಸಲು ವಿಫಲವಾಗಿದೆ.", + "More versions..." : "ಇನ್ನಷ್ಟು ಆವೃತ್ತಿಗಳು ...", + "No other versions available" : "ಇನ್ನಿತರೆ ಯಾವುದೇ ಆವೃತ್ತಿಗಳು ಲಭ್ಯವಿಲ್ಲ", + "Restore" : "ಮರುಸ್ಥಾಪಿಸು" +},"pluralForm" :"nplurals=1; plural=0;" +}
\ No newline at end of file diff --git a/apps/files_versions/l10n/ru.js b/apps/files_versions/l10n/ru.js index 2dc12f9ff2a..74ad347804b 100644 --- a/apps/files_versions/l10n/ru.js +++ b/apps/files_versions/l10n/ru.js @@ -1,11 +1,11 @@ OC.L10N.register( "files_versions", { - "Could not revert: %s" : "Не может быть возвращён: %s", + "Could not revert: %s" : "Невозможно откатить: %s", "Versions" : "Версии", - "Failed to revert {file} to revision {timestamp}." : "Не удалось возвратить {file} к ревизии {timestamp}.", + "Failed to revert {file} to revision {timestamp}." : "Не удалось откатить {file} к ревизии {timestamp}.", "More versions..." : "Ещё версии...", "No other versions available" : "Других версий не доступно", - "Restore" : "Восстановить" + "Restore" : "Откатить" }, "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/apps/files_versions/l10n/ru.json b/apps/files_versions/l10n/ru.json index fe1906bf467..b21bd54331f 100644 --- a/apps/files_versions/l10n/ru.json +++ b/apps/files_versions/l10n/ru.json @@ -1,9 +1,9 @@ { "translations": { - "Could not revert: %s" : "Не может быть возвращён: %s", + "Could not revert: %s" : "Невозможно откатить: %s", "Versions" : "Версии", - "Failed to revert {file} to revision {timestamp}." : "Не удалось возвратить {file} к ревизии {timestamp}.", + "Failed to revert {file} to revision {timestamp}." : "Не удалось откатить {file} к ревизии {timestamp}.", "More versions..." : "Ещё версии...", "No other versions available" : "Других версий не доступно", - "Restore" : "Восстановить" + "Restore" : "Откатить" },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" }
\ No newline at end of file diff --git a/apps/files_versions/lib/versions.php b/apps/files_versions/lib/storage.php index 82e0ecc3e2f..3d30ada863a 100644 --- a/apps/files_versions/lib/versions.php +++ b/apps/files_versions/lib/storage.php @@ -479,15 +479,16 @@ class Storage { * Erase a file's versions which exceed the set quota */ private static function expire($filename, $versionsSize = null, $offset = 0) { - if(\OCP\Config::getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true') { + $config = \OC::$server->getConfig(); + if($config->getSystemValue('files_versions', Storage::DEFAULTENABLED)=='true') { list($uid, $filename) = self::getUidAndFilename($filename); $versionsFileview = new \OC\Files\View('/'.$uid.'/files_versions'); // get available disk space for user $softQuota = true; - $quota = \OC_Preferences::getValue($uid, 'files', 'quota'); + $quota = $config->getUserValue($uid, 'files', 'quota', null); if ( $quota === null || $quota === 'default') { - $quota = \OC::$server->getAppConfig()->getValue('files', 'default_quota'); + $quota = $config->getAppValue('files', 'default_quota', null); } if ( $quota === null || $quota === 'none' ) { $quota = \OC\Files\Filesystem::free_space('/'); diff --git a/apps/files_versions/tests/versions.php b/apps/files_versions/tests/versions.php index a3b8595a34b..cf0ffb320e2 100644 --- a/apps/files_versions/tests/versions.php +++ b/apps/files_versions/tests/versions.php @@ -21,13 +21,12 @@ */ require_once __DIR__ . '/../appinfo/app.php'; -require_once __DIR__ . '/../lib/versions.php'; /** * Class Test_Files_versions * this class provide basic files versions test */ -class Test_Files_Versioning extends \PHPUnit_Framework_TestCase { +class Test_Files_Versioning extends \Test\TestCase { const TEST_VERSIONS_USER = 'test-versions-user'; const TEST_VERSIONS_USER2 = 'test-versions-user2'; @@ -39,6 +38,7 @@ class Test_Files_Versioning extends \PHPUnit_Framework_TestCase { private $rootView; public static function setUpBeforeClass() { + parent::setUpBeforeClass(); // clear share hooks \OC_Hook::clear('OCP\\Share'); @@ -55,9 +55,13 @@ class Test_Files_Versioning extends \PHPUnit_Framework_TestCase { // cleanup test user \OC_User::deleteUser(self::TEST_VERSIONS_USER); \OC_User::deleteUser(self::TEST_VERSIONS_USER2); + + parent::tearDownAfterClass(); } - function setUp() { + protected function setUp() { + parent::setUp(); + self::loginHelper(self::TEST_VERSIONS_USER); $this->rootView = new \OC\Files\View(); if (!$this->rootView->file_exists(self::USERS_VERSIONS_ROOT)) { @@ -65,8 +69,10 @@ class Test_Files_Versioning extends \PHPUnit_Framework_TestCase { } } - function tearDown() { + protected function tearDown() { $this->rootView->deleteAll(self::USERS_VERSIONS_ROOT); + + parent::tearDown(); } /** @@ -74,7 +80,7 @@ class Test_Files_Versioning extends \PHPUnit_Framework_TestCase { * test expire logic * @dataProvider versionsProvider */ - function testGetExpireList($versions, $sizeOfAllDeletedFiles) { + public function testGetExpireList($versions, $sizeOfAllDeletedFiles) { // last interval end at 2592000 $startTime = 5000000; @@ -216,7 +222,7 @@ class Test_Files_Versioning extends \PHPUnit_Framework_TestCase { ); } - function testRename() { + public function testRename() { \OC\Files\Filesystem::file_put_contents("test.txt", "test file"); @@ -247,7 +253,7 @@ class Test_Files_Versioning extends \PHPUnit_Framework_TestCase { \OC\Files\Filesystem::unlink('test2.txt'); } - function testRenameInSharedFolder() { + public function testRenameInSharedFolder() { \OC\Files\Filesystem::mkdir('folder1'); \OC\Files\Filesystem::mkdir('folder1/folder2'); @@ -270,7 +276,7 @@ class Test_Files_Versioning extends \PHPUnit_Framework_TestCase { $this->rootView->file_put_contents($v1, 'version1'); $this->rootView->file_put_contents($v2, 'version2'); - \OCP\Share::shareItem('folder', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER, self::TEST_VERSIONS_USER2, OCP\PERMISSION_ALL); + \OCP\Share::shareItem('folder', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER, self::TEST_VERSIONS_USER2, \OCP\Constants::PERMISSION_ALL); self::loginHelper(self::TEST_VERSIONS_USER2); @@ -291,7 +297,7 @@ class Test_Files_Versioning extends \PHPUnit_Framework_TestCase { \OC\Files\Filesystem::unlink('/folder1/folder2/test.txt'); } - function testRenameSharedFile() { + public function testRenameSharedFile() { \OC\Files\Filesystem::file_put_contents("test.txt", "test file"); @@ -313,7 +319,7 @@ class Test_Files_Versioning extends \PHPUnit_Framework_TestCase { $this->rootView->file_put_contents($v1, 'version1'); $this->rootView->file_put_contents($v2, 'version2'); - \OCP\Share::shareItem('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER, self::TEST_VERSIONS_USER2, OCP\PERMISSION_ALL); + \OCP\Share::shareItem('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_USER, self::TEST_VERSIONS_USER2, \OCP\Constants::PERMISSION_ALL); self::loginHelper(self::TEST_VERSIONS_USER2); @@ -334,7 +340,7 @@ class Test_Files_Versioning extends \PHPUnit_Framework_TestCase { \OC\Files\Filesystem::unlink('/test.txt'); } - function testCopy() { + public function testCopy() { \OC\Files\Filesystem::file_put_contents("test.txt", "test file"); diff --git a/apps/provisioning_api/appinfo/app.php b/apps/provisioning_api/appinfo/app.php new file mode 100644 index 00000000000..671d668bfac --- /dev/null +++ b/apps/provisioning_api/appinfo/app.php @@ -0,0 +1,23 @@ +<?php + +/** + * ownCloud + * + * @copyright (C) 2014 ownCloud, Inc. + * + * @author Tom <tom@owncloud.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this library. If not, see <http://www.gnu.org/licenses/>. + * + */
\ No newline at end of file diff --git a/apps/provisioning_api/appinfo/info.xml b/apps/provisioning_api/appinfo/info.xml new file mode 100644 index 00000000000..3f1fa745cf5 --- /dev/null +++ b/apps/provisioning_api/appinfo/info.xml @@ -0,0 +1,22 @@ +<?xml version="1.0"?> +<info> + <id>provisioning_api</id> + <name>Provisioning API</name> + <description> + This application enables a set of APIs that external systems can use to create, edit, delete and query user + attributes, query, set and remove groups, set quota and query total storage used in ownCloud. Group admin users + can also query ownCloud and perform the same functions as an admin for groups they manage. The API also enables + an admin to query for active ownCloud applications, application info, and to enable or disable an app remotely. + Once the app is enabled, http requests can be used via a Basic Auth header to perform any of the functions + listed above. More information is available in the Provisioning API documentation, including example calls + and server responses. + </description> + <licence>AGPL</licence> + <author>Tom Needham</author> + <requiremin>8</requiremin> + <shipped>true</shipped> + <default_enable/> + <documentation> + <admin>admin-provisioning-api</admin> + </documentation> +</info> diff --git a/apps/provisioning_api/appinfo/routes.php b/apps/provisioning_api/appinfo/routes.php new file mode 100644 index 00000000000..7c626501d18 --- /dev/null +++ b/apps/provisioning_api/appinfo/routes.php @@ -0,0 +1,50 @@ +<?php + +/** + * ownCloud + * + * @copyright (C) 2014 ownCloud, Inc. + * + * @author Tom <tom@owncloud.com> + * @author Jörn Friedrich Dreyer <jfd@owncloud.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this library. If not, see <http://www.gnu.org/licenses/>. + * + */ + +// Users +OCP\API::register('get', '/cloud/users', array('OCA\Provisioning_API\Users', 'getUsers'), 'provisioning_api', OC_API::ADMIN_AUTH); +OCP\API::register('post', '/cloud/users', array('OCA\Provisioning_API\Users', 'addUser'), 'provisioning_api', OC_API::ADMIN_AUTH); +OCP\API::register('get', '/cloud/users/{userid}', array('OCA\Provisioning_API\Users', 'getUser'), 'provisioning_api', OC_API::USER_AUTH); +OCP\API::register('put', '/cloud/users/{userid}', array('OCA\Provisioning_API\Users', 'editUser'), 'provisioning_api', OC_API::USER_AUTH); +OCP\API::register('delete', '/cloud/users/{userid}', array('OCA\Provisioning_API\Users', 'deleteUser'), 'provisioning_api', OC_API::SUBADMIN_AUTH); +OCP\API::register('get', '/cloud/users/{userid}/groups', array('OCA\Provisioning_API\Users', 'getUsersGroups'), 'provisioning_api', OC_API::USER_AUTH); +OCP\API::register('post', '/cloud/users/{userid}/groups', array('OCA\Provisioning_API\Users', 'addToGroup'), 'provisioning_api', OC_API::SUBADMIN_AUTH); +OCP\API::register('delete', '/cloud/users/{userid}/groups', array('OCA\Provisioning_API\Users', 'removeFromGroup'), 'provisioning_api', OC_API::SUBADMIN_AUTH); +OCP\API::register('post', '/cloud/users/{userid}/subadmins', array('OCA\Provisioning_API\Users', 'addSubAdmin'), 'provisioning_api', OC_API::ADMIN_AUTH); +OCP\API::register('delete', '/cloud/users/{userid}/subadmins', array('OCA\Provisioning_API\Users', 'removeSubAdmin'), 'provisioning_api', OC_API::ADMIN_AUTH); +OCP\API::register('get', '/cloud/users/{userid}/subadmins', array('OCA\Provisioning_API\Users', 'getUserSubAdminGroups'), 'provisioning_api', OC_API::ADMIN_AUTH); + +// Groups +OCP\API::register('get', '/cloud/groups', array('OCA\Provisioning_API\Groups', 'getGroups'), 'provisioning_api', OC_API::SUBADMIN_AUTH); +OCP\API::register('post', '/cloud/groups', array('OCA\Provisioning_API\Groups', 'addGroup'), 'provisioning_api', OC_API::SUBADMIN_AUTH); +OCP\API::register('get', '/cloud/groups/{groupid}', array('OCA\Provisioning_API\Groups', 'getGroup'), 'provisioning_api', OC_API::SUBADMIN_AUTH); +OCP\API::register('delete', '/cloud/groups/{groupid}', array('OCA\Provisioning_API\Groups', 'deleteGroup'), 'provisioning_api', OC_API::ADMIN_AUTH); +OCP\API::register('get', '/cloud/groups/{groupid}/subadmins', array('OCA\Provisioning_API\Groups', 'getSubAdminsOfGroup'), 'provisioning_api', OC_API::ADMIN_AUTH); + +// Apps +OCP\API::register('get', '/cloud/apps', array('OCA\Provisioning_API\Apps', 'getApps'), 'provisioning_api', OC_API::ADMIN_AUTH); +OCP\API::register('get', '/cloud/apps/{appid}', array('OCA\Provisioning_API\Apps', 'getAppInfo'), 'provisioning_api', OC_API::ADMIN_AUTH); +OCP\API::register('post', '/cloud/apps/{appid}', array('OCA\Provisioning_API\Apps', 'enable'), 'provisioning_api', OC_API::ADMIN_AUTH); +OCP\API::register('delete', '/cloud/apps/{appid}', array('OCA\Provisioning_API\Apps', 'disable'), 'provisioning_api', OC_API::ADMIN_AUTH); diff --git a/apps/provisioning_api/appinfo/version b/apps/provisioning_api/appinfo/version new file mode 100644 index 00000000000..3b04cfb60da --- /dev/null +++ b/apps/provisioning_api/appinfo/version @@ -0,0 +1 @@ +0.2 diff --git a/apps/provisioning_api/lib/apps.php b/apps/provisioning_api/lib/apps.php new file mode 100644 index 00000000000..f44ccd86a13 --- /dev/null +++ b/apps/provisioning_api/lib/apps.php @@ -0,0 +1,81 @@ +<?php + +/** + * ownCloud + * + * @copyright (C) 2014 ownCloud, Inc. + * + * @author Tom <tom@owncloud.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this library. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\Provisioning_API; + +use \OC_OCS_Result; +use \OC_App; + +class Apps { + + public static function getApps($parameters){ + $apps = OC_App::listAllApps(); + $list = array(); + foreach($apps as $app) { + $list[] = $app['id']; + } + $filter = isset($_GET['filter']) ? $_GET['filter'] : false; + if($filter){ + switch($filter){ + case 'enabled': + return new OC_OCS_Result(array('apps' => \OC_App::getEnabledApps())); + break; + case 'disabled': + $enabled = OC_App::getEnabledApps(); + return new OC_OCS_Result(array('apps' => array_diff($list, $enabled))); + break; + default: + // Invalid filter variable + return new OC_OCS_Result(null, 101); + break; + } + + } else { + return new OC_OCS_Result(array('apps' => $list)); + } + } + + public static function getAppInfo($parameters){ + $app = $parameters['appid']; + $info = OC_App::getAppInfo($app); + if(!is_null($info)) { + return new OC_OCS_Result(OC_App::getAppInfo($app)); + } else { + return new OC_OCS_Result(null, \OC_API::RESPOND_NOT_FOUND, 'The request app was not found'); + } + } + + public static function enable($parameters){ + $app = $parameters['appid']; + OC_App::enable($app); + return new OC_OCS_Result(null, 100); + } + + public static function disable($parameters){ + $app = $parameters['appid']; + OC_App::disable($app); + return new OC_OCS_Result(null, 100); + } + +} diff --git a/apps/provisioning_api/lib/groups.php b/apps/provisioning_api/lib/groups.php new file mode 100644 index 00000000000..4440c5bf509 --- /dev/null +++ b/apps/provisioning_api/lib/groups.php @@ -0,0 +1,108 @@ +<?php + +/** + * ownCloud + * + * @copyright (C) 2014 ownCloud, Inc. + * + * @author Tom <tom@owncloud.com> + * @author Bart Visscher + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this library. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\Provisioning_API; + +use \OC_OCS_Result; +use \OC_Group; +use \OC_SubAdmin; + +class Groups{ + + /** + * returns a list of groups + */ + public static function getGroups($parameters){ + $search = !empty($_GET['search']) ? $_GET['search'] : ''; + $limit = !empty($_GET['limit']) ? $_GET['limit'] : null; + $offset = !empty($_GET['offset']) ? $_GET['offset'] : null; + return new OC_OCS_Result(array('groups' => OC_Group::getGroups($search, $limit, $offset))); + } + + /** + * returns an array of users in the group specified + */ + public static function getGroup($parameters){ + // Check the group exists + if(!OC_Group::groupExists($parameters['groupid'])){ + return new OC_OCS_Result(null, \OC_API::RESPOND_NOT_FOUND, 'The requested group could not be found'); + } + // Check subadmin has access to this group + if(\OC_User::isAdminUser(\OC_User::getUser()) + || in_array($parameters['groupid'], \OC_SubAdmin::getSubAdminsGroups(\OC_User::getUser()))){ + return new OC_OCS_Result(array('users' => OC_Group::usersInGroup($parameters['groupid']))); + } else { + return new OC_OCS_Result(null, \OC_API::RESPOND_UNAUTHORISED, 'User does not have access to specified group'); + } + } + + /** + * creates a new group + */ + public static function addGroup($parameters){ + // Validate name + $groupid = isset($_POST['groupid']) ? $_POST['groupid'] : ''; + if( preg_match( '/[^a-zA-Z0-9 _\.@\-]/', $groupid ) || empty($groupid)){ + \OC_Log::write('provisioning_api', 'Attempt made to create group using invalid characters.', \OC_Log::ERROR); + return new OC_OCS_Result(null, 101, 'Invalid group name'); + } + // Check if it exists + if(OC_Group::groupExists($groupid)){ + return new OC_OCS_Result(null, 102); + } + if(OC_Group::createGroup($groupid)){ + return new OC_OCS_Result(null, 100); + } else { + return new OC_OCS_Result(null, 103); + } + } + + public static function deleteGroup($parameters){ + // Check it exists + if(!OC_Group::groupExists($parameters['groupid'])){ + return new OC_OCS_Result(null, 101); + } else if($parameters['groupid'] == 'admin' || !OC_Group::deleteGroup($parameters['groupid'])){ + // Cannot delete admin group + return new OC_OCS_Result(null, 102); + } else { + return new OC_OCS_Result(null, 100); + } + } + + public static function getSubAdminsOfGroup($parameters) { + $group = $parameters['groupid']; + // Check group exists + if(!OC_Group::groupExists($group)) { + return new OC_OCS_Result(null, 101, 'Group does not exist'); + } + // Go + if(!$subadmins = OC_Subadmin::getGroupsSubAdmins($group)) { + return new OC_OCS_Result(null, 102, 'Unknown error occured'); + } else { + return new OC_OCS_Result($subadmins); + } + } + +} diff --git a/apps/provisioning_api/lib/users.php b/apps/provisioning_api/lib/users.php new file mode 100644 index 00000000000..4262dff7a6c --- /dev/null +++ b/apps/provisioning_api/lib/users.php @@ -0,0 +1,346 @@ +<?php + +/** + * ownCloud + * + * @copyright (C) 2014 ownCloud, Inc. + * + * @author Tom <tom@owncloud.com> + * @author Thomas Müller <deepdiver@owncloud.com> + * @author Bart Visscher + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this library. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\Provisioning_API; + +use \OC_OCS_Result; +use \OC_SubAdmin; +use \OC_User; +use \OC_Group; +use \OC_Helper; + +class Users { + + /** + * returns a list of users + */ + public static function getUsers(){ + $search = !empty($_GET['search']) ? $_GET['search'] : ''; + $limit = !empty($_GET['limit']) ? $_GET['limit'] : null; + $offset = !empty($_GET['offset']) ? $_GET['offset'] : null; + return new OC_OCS_Result(array('users' => OC_User::getUsers($search, $limit, $offset))); + } + + public static function addUser(){ + $userId = isset($_POST['userid']) ? $_POST['userid'] : null; + $password = isset($_POST['password']) ? $_POST['password'] : null; + if(OC_User::userExists($userId)) { + \OC_Log::write('ocs_api', 'Failed addUser attempt: User already exists.', \OC_Log::ERROR); + return new OC_OCS_Result(null, 102, 'User already exists'); + } else { + try { + OC_User::createUser($userId, $password); + \OC_Log::write('ocs_api', 'Successful addUser call with userid: '.$_POST['userid'], \OC_Log::INFO); + return new OC_OCS_Result(null, 100); + } catch (\Exception $e) { + \OC_Log::write('ocs_api', 'Failed addUser attempt with exception: '.$e->getMessage(), \OC_Log::ERROR); + return new OC_OCS_Result(null, 101, 'Bad request'); + } + } + } + + /** + * gets user info + */ + public static function getUser($parameters){ + $userId = $parameters['userid']; + // Admin? Or SubAdmin? + if(OC_User::isAdminUser(OC_User::getUser()) || OC_SubAdmin::isUserAccessible(OC_User::getUser(), $userId)) { + // Check they exist + if(!OC_User::userExists($userId)) { + return new OC_OCS_Result(null, \OC_API::RESPOND_NOT_FOUND, 'The requested user could not be found'); + } + // Show all + $return = array( + 'email', + 'enabled', + ); + if(OC_User::getUser() != $userId) { + $return[] = 'quota'; + } + } else { + // Check they are looking up themselves + if(OC_User::getUser() != $userId) { + return new OC_OCS_Result(null, \OC_API::RESPOND_UNAUTHORISED); + } + // Return some additional information compared to the core route + $return = array( + 'email', + 'displayname', + ); + } + + $config = \OC::$server->getConfig(); + + // Find the data + $data = array(); + \OC_Util::tearDownFS(); + \OC_Util::setupFS($userId); + $storage = OC_Helper::getStorageInfo('/'); + $data['quota'] = array( + 'free' => $storage['free'], + 'used' => $storage['used'], + 'total' => $storage['total'], + 'relative' => $storage['relative'], + ); + $data['enabled'] = $config->getUserValue($userId, 'core', 'enabled', 'true'); + $data['email'] = $config->getUserValue($userId, 'settings', 'email'); + $data['displayname'] = OC_User::getDisplayName($parameters['userid']); + + // Return the appropriate data + $responseData = array(); + foreach($return as $key) { + $responseData[$key] = $data[$key]; + } + + return new OC_OCS_Result($responseData); + } + + /** + * edit users + */ + public static function editUser($parameters){ + $userId = $parameters['userid']; + if($userId === OC_User::getUser()) { + // Editing self (display, email) + $permittedFields[] = 'display'; + $permittedFields[] = 'email'; + $permittedFields[] = 'password'; + // If admin they can edit their own quota + if(OC_User::isAdminUser(OC_User::getUser())) { + $permittedFields[] = 'quota'; + } + } else { + // Check if admin / subadmin + if(OC_SubAdmin::isUserAccessible(OC_User::getUser(), $userId) + || OC_User::isAdminUser(OC_User::getUser())) { + // They have permissions over the user + $permittedFields[] = 'display'; + $permittedFields[] = 'quota'; + $permittedFields[] = 'password'; + $permittedFields[] = 'email'; + } else { + // No rights + return new OC_OCS_Result(null, 997); + } + } + // Check if permitted to edit this field + if(!in_array($parameters['_put']['key'], $permittedFields)) { + return new OC_OCS_Result(null, 997); + } + // Process the edit + switch($parameters['_put']['key']){ + case 'display': + OC_User::setDisplayName($userId, $parameters['_put']['value']); + break; + case 'quota': + $quota = $parameters['_put']['value']; + if($quota !== 'none' and $quota !== 'default') { + $quota = OC_Helper::computerFileSize($quota); + if($quota == 0) { + $quota = 'default'; + }else if($quota == -1){ + $quota = 'none'; + } else { + $quota = OC_Helper::humanFileSize($quota); + } + } + \OC::$server->getConfig()->setUserValue($userId, 'files', 'quota', $quota); + break; + case 'password': + OC_User::setPassword($userId, $parameters['_put']['value']); + break; + case 'email': + if(filter_var($parameters['_put']['value'], FILTER_VALIDATE_EMAIL)) { + \OC::$server->getConfig()->setUserValue($userId, 'settings', 'email', $parameters['_put']['value']); + } else { + return new OC_OCS_Result(null, 102); + } + break; + default: + return new OC_OCS_Result(null, 103); + break; + } + return new OC_OCS_Result(null, 100); + } + + public static function deleteUser($parameters){ + if(!OC_User::userExists($parameters['userid']) + || $parameters['userid'] === OC_User::getUser()) { + return new OC_OCS_Result(null, 101); + } + // If not permitted + if(!OC_User::isAdminUser(OC_User::getUser()) && !OC_SubAdmin::isUserAccessible(OC_User::getUser(), $parameters['userid'])) { + return new OC_OCS_Result(null, 997); + } + // Go ahead with the delete + if(OC_User::deleteUser($parameters['userid'])) { + return new OC_OCS_Result(null, 100); + } else { + return new OC_OCS_Result(null, 101); + } + } + + public static function getUsersGroups($parameters){ + if($parameters['userid'] === OC_User::getUser() || OC_User::isAdminUser(OC_User::getUser())) { + // Self lookup or admin lookup + return new OC_OCS_Result(array('groups' => OC_Group::getUserGroups($parameters['userid']))); + } else { + // Looking up someone else + if(OC_SubAdmin::isUserAccessible(OC_User::getUser(), $parameters['userid'])) { + // Return the group that the method caller is subadmin of for the user in question + $groups = array_intersect(OC_SubAdmin::getSubAdminsGroups(OC_User::getUser()), OC_Group::getUserGroups($parameters['userid'])); + return new OC_OCS_Result(array('groups' => $groups)); + } else { + // Not permitted + return new OC_OCS_Result(null, 997); + } + } + + } + + public static function addToGroup($parameters){ + $group = !empty($_POST['groupid']) ? $_POST['groupid'] : null; + if(is_null($group)){ + return new OC_OCS_Result(null, 101); + } + // Check they're an admin + if(!OC_Group::inGroup(OC_User::getUser(), 'admin')){ + // This user doesn't have rights to add a user to this group + return new OC_OCS_Result(null, \OC_API::RESPOND_UNAUTHORISED); + } + // Check if the group exists + if(!OC_Group::groupExists($group)){ + return new OC_OCS_Result(null, 102); + } + // Check if the user exists + if(!OC_User::userExists($parameters['userid'])){ + return new OC_OCS_Result(null, 103); + } + // Add user to group + return OC_Group::addToGroup($parameters['userid'], $group) ? new OC_OCS_Result(null, 100) : new OC_OCS_Result(null, 105); + } + + public static function removeFromGroup($parameters){ + $group = !empty($parameters['_delete']['groupid']) ? $parameters['_delete']['groupid'] : null; + if(is_null($group)){ + return new OC_OCS_Result(null, 101); + } + // If they're not an admin, check they are a subadmin of the group in question + if(!OC_Group::inGroup(OC_User::getUser(), 'admin') && !OC_SubAdmin::isSubAdminofGroup(OC_User::getUser(), $group)){ + return new OC_OCS_Result(null, 104); + } + // Check they aren't removing themselves from 'admin' or their 'subadmin; group + if($parameters['userid'] === OC_User::getUser()){ + if(OC_Group::inGroup(OC_User::getUser(), 'admin')){ + if($group === 'admin'){ + return new OC_OCS_Result(null, 105, 'Cannot remove yourself from the admin group'); + } + } else { + // Not an admin, check they are not removing themself from their subadmin group + if(in_array($group, OC_SubAdmin::getSubAdminsGroups(OC_User::getUser()))){ + return new OC_OCS_Result(null, 105, 'Cannot remove yourself from this group as you are a SubAdmin'); + } + } + } + // Check if the group exists + if(!OC_Group::groupExists($group)){ + return new OC_OCS_Result(null, 102); + } + // Check if the user exists + if(!OC_User::userExists($parameters['userid'])){ + return new OC_OCS_Result(null, 103); + } + // Remove user from group + return OC_Group::removeFromGroup($parameters['userid'], $group) ? new OC_OCS_Result(null, 100) : new OC_OCS_Result(null, 105); + } + + /** + * Creates a subadmin + */ + public static function addSubAdmin($parameters) { + $group = $_POST['groupid']; + $user = $parameters['userid']; + // Check if the user exists + if(!OC_User::userExists($user)) { + return new OC_OCS_Result(null, 101, 'User does not exist'); + } + // Check if group exists + if(!OC_Group::groupExists($group)) { + return new OC_OCS_Result(null, 102, 'Group:'.$group.' does not exist'); + } + // Check if trying to make subadmin of admin group + if(strtolower($group) == 'admin') { + return new OC_OCS_Result(null, 103, 'Cannot create subadmins for admin group'); + } + // Go + if(OC_Subadmin::createSubAdmin($user, $group)) { + return new OC_OCS_Result(null, 100); + } else { + return new OC_OCS_Result(null, 103, 'Unknown error occured'); + } + + } + + /** + * Removes a subadmin from a group + */ + public static function removeSubAdmin($parameters) { + $group = $parameters['_delete']['groupid']; + $user = $parameters['userid']; + // Check if the user exists + if(!OC_User::userExists($user)) { + return new OC_OCS_Result(null, 101, 'User does not exist'); + } + // Check if they are a subadmin of this said group + if(!OC_SubAdmin::isSubAdminofGroup($user, $group)) { + return new OC_OCS_Result(null, 102, 'User is not a subadmin of this group'); + } + // Go + if(OC_Subadmin::deleteSubAdmin($user, $group)) { + return new OC_OCS_Result(null, 100); + } else { + return new OC_OCS_Result(null, 103, 'Unknown error occurred'); + } + } + + /** + * @Get the groups a user is a subadmin of + */ + public static function getUserSubAdminGroups($parameters) { + $user = $parameters['userid']; + // Check if the user exists + if(!OC_User::userExists($user)) { + return new OC_OCS_Result(null, 101, 'User does not exist'); + } + // Get the subadmin groups + if(!$groups = OC_SubAdmin::getSubAdminsGroups($user)) { + return new OC_OCS_Result(null, 102, 'Unknown error occurred'); + } else { + return new OC_OCS_Result($groups); + } + } +} diff --git a/apps/provisioning_api/tests/appstest.php b/apps/provisioning_api/tests/appstest.php new file mode 100644 index 00000000000..1d5642b6302 --- /dev/null +++ b/apps/provisioning_api/tests/appstest.php @@ -0,0 +1,84 @@ +<?php + +/** + * ownCloud + * + * @copyright (C) 2014 ownCloud, Inc. + * + * @author Tom <tom@owncloud.com> + * @author Thomas Müller <deepdiver@owncloud.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this library. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\Provisioning_API\Tests; + +class AppsTest extends TestCase { + public function testGetAppInfo() { + $result = \OCA\provisioning_API\Apps::getAppInfo(array('appid' => 'provisioning_api')); + $this->assertInstanceOf('OC_OCS_Result', $result); + $this->assertTrue($result->succeeded()); + + } + + public function testGetAppInfoOnBadAppID() { + + $result = \OCA\provisioning_API\Apps::getAppInfo(array('appid' => 'not_provisioning_api')); + $this->assertInstanceOf('OC_OCS_Result', $result); + $this->assertFalse($result->succeeded()); + $this->assertEquals(\OC_API::RESPOND_NOT_FOUND, $result->getStatusCode()); + + } + + public function testGetApps() { + + $user = $this->generateUsers(); + \OC_Group::addToGroup($user, 'admin'); + \OC_User::setUserId($user); + + $result = \OCA\provisioning_API\Apps::getApps(array()); + + $this->assertTrue($result->succeeded()); + $data = $result->getData(); + $this->assertEquals(count(\OC_App::listAllApps()), count($data['apps'])); + + } + + public function testGetAppsEnabled() { + + $_GET['filter'] = 'enabled'; + $result = \OCA\provisioning_API\Apps::getApps(array('filter' => 'enabled')); + $this->assertTrue($result->succeeded()); + $data = $result->getData(); + $this->assertEquals(count(\OC_App::getEnabledApps()), count($data['apps'])); + + } + + public function testGetAppsDisabled() { + + $_GET['filter'] = 'disabled'; + $result = \OCA\provisioning_API\Apps::getApps(array('filter' => 'disabled')); + $this->assertTrue($result->succeeded()); + $data = $result->getData(); + $apps = \OC_App::listAllApps(); + $list = array(); + foreach($apps as $app) { + $list[] = $app['id']; + } + $disabled = array_diff($list, \OC_App::getEnabledApps()); + $this->assertEquals(count($disabled), count($data['apps'])); + + } +} diff --git a/apps/provisioning_api/tests/groupstest.php b/apps/provisioning_api/tests/groupstest.php new file mode 100644 index 00000000000..a25ebfbacfe --- /dev/null +++ b/apps/provisioning_api/tests/groupstest.php @@ -0,0 +1,142 @@ +<?php + +/** + * ownCloud + * + * @copyright (C) 2014 ownCloud, Inc. + * + * @author Tom <tom@owncloud.com> + * @author Thomas Müller <deepdiver@owncloud.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this library. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\Provisioning_API\Tests; + +class GroupsTest extends TestCase { + public function testGetGroupAsUser() { + + $users = $this->generateUsers(2); + \OC_User::setUserId($users[0]); + + $group = $this->getUniqueID(); + \OC_Group::createGroup($group); + \OC_Group::addToGroup($users[1], $group); + + $result = \OCA\provisioning_api\Groups::getGroup(array( + 'groupid' => $group, + )); + + $this->assertInstanceOf('OC_OCS_Result', $result); + $this->assertFalse($result->succeeded()); + $this->assertEquals(\OC_API::RESPOND_UNAUTHORISED, $result->getStatusCode()); + + } + + public function testGetGroupAsSubadmin() { + + $users = $this->generateUsers(2); + \OC_User::setUserId($users[0]); + + $group = $this->getUniqueID(); + \OC_Group::createGroup($group); + \OC_Group::addToGroup($users[0], $group); + \OC_Group::addToGroup($users[1], $group); + + \OC_SubAdmin::createSubAdmin($users[0], $group); + + $result = \OCA\provisioning_api\Groups::getGroup(array( + 'groupid' => $group, + )); + + $this->assertInstanceOf('OC_OCS_Result', $result); + $this->assertTrue($result->succeeded()); + $this->assertEquals(array('users' => $users), $result->getData()); + + } + + public function testGetGroupAsIrrelevantSubadmin() { + + $users = $this->generateUsers(2); + \OC_User::setUserId($users[0]); + + $group = $this->getUniqueID(); + \OC_Group::createGroup($group); + $group2 = $this->getUniqueID(); + \OC_Group::createGroup($group2); + \OC_Group::addToGroup($users[1], $group); + \OC_Group::addToGroup($users[0], $group2); + + \OC_SubAdmin::createSubAdmin($users[0], $group2); + + $result = \OCA\provisioning_api\Groups::getGroup(array( + 'groupid' => $group, + )); + + $this->assertInstanceOf('OC_OCS_Result', $result); + $this->assertFalse($result->succeeded()); + $this->assertEquals(\OC_API::RESPOND_UNAUTHORISED, $result->getStatusCode()); + + } + + public function testGetGroupAsAdmin() { + + $users = $this->generateUsers(2); + \OC_User::setUserId($users[0]); + + $group = $this->getUniqueID(); + \OC_Group::createGroup($group); + + \OC_Group::addToGroup($users[1], $group); + \OC_Group::addToGroup($users[0], 'admin'); + + $result = \OCA\provisioning_api\Groups::getGroup(array( + 'groupid' => $group, + )); + + $this->assertInstanceOf('OC_OCS_Result', $result); + $this->assertTrue($result->succeeded()); + $this->assertEquals(array('users' => array($users[1])), $result->getData()); + + } + + public function testGetSubAdminsOfGroup() { + $user1 = $this->generateUsers(); + $user2 = $this->generateUsers(); + \OC_User::setUserId($user1); + \OC_Group::addToGroup($user1, 'admin'); + $group1 = $this->getUniqueID(); + \OC_Group::createGroup($group1); + \OC_SubAdmin::createSubAdmin($user2, $group1); + $result = \OCA\provisioning_api\Groups::getSubAdminsOfGroup(array( + 'groupid' => $group1, + )); + $this->assertInstanceOf('OC_OCS_Result', $result); + $this->assertTrue($result->succeeded()); + $data = $result->getData(); + $this->assertEquals($user2, reset($data)); + \OC_Group::deleteGroup($group1); + + $user1 = $this->generateUsers(); + \OC_User::setUserId($user1); + \OC_Group::addToGroup($user1, 'admin'); + $result = \OCA\provisioning_api\Groups::getSubAdminsOfGroup(array( + 'groupid' => $this->getUniqueID(), + )); + $this->assertInstanceOf('OC_OCS_Result', $result); + $this->assertFalse($result->succeeded()); + $this->assertEquals(101, $result->getStatusCode()); + } +} diff --git a/apps/provisioning_api/tests/testcase.php b/apps/provisioning_api/tests/testcase.php new file mode 100644 index 00000000000..d6e196bcdcf --- /dev/null +++ b/apps/provisioning_api/tests/testcase.php @@ -0,0 +1,61 @@ +<?php + +/** + * ownCloud + * + * @copyright (C) 2014 ownCloud, Inc. + * + * @author Tom <tom@owncloud.com> + * @author Thomas Müller <deepdiver@owncloud.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this library. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\Provisioning_API\Tests; + +abstract class TestCase extends \Test\TestCase { + protected $users = array(); + + protected function setUp() { + parent::setUp(); + \OC_Group::createGroup('admin'); + } + + /** + * Generates a temp user + * @param int $num number of users to generate + * @return array + */ + protected function generateUsers($num = 1) { + $users = array(); + for ($i = 0; $i < $num; $i++) { + $user = $this->getUniqueID(); + \OC_User::createUser($user, 'password'); + $this->users[] = $user; + $users[] = $user; + } + return count($users) == 1 ? reset($users) : $users; + } + + protected function tearDown() { + foreach($this->users as $user) { + \OC_User::deleteUser($user); + } + + \OC_Group::deleteGroup('admin'); + + parent::tearDown(); + } +} diff --git a/apps/provisioning_api/tests/userstest.php b/apps/provisioning_api/tests/userstest.php new file mode 100644 index 00000000000..917d06a8348 --- /dev/null +++ b/apps/provisioning_api/tests/userstest.php @@ -0,0 +1,770 @@ +<?php + +/** + * ownCloud + * + * @copyright (C) 2014 ownCloud, Inc. + * + * @author Tom <tom@owncloud.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this library. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\Provisioning_API\Tests; + +class UsersTest extends TestCase { + protected function resetParams() { + $_GET = null; + $_POST = null; + } + + // Test getting the list of users + public function testGetUsers() { + $result = \OCA\provisioning_API\Users::getUsers(array()); + $this->assertInstanceOf('OC_OCS_Result', $result); + $this->assertTrue($result->succeeded()); + $count = $result->getData(); + $count = count($count['users']); + $this->assertEquals(count(\OC_User::getUsers()), $count); + + $user = $this->generateUsers(); + $_GET['search'] = $user; + $result = \OCA\provisioning_API\Users::getUsers(array()); + $this->assertInstanceOf('OC_OCS_Result', $result); + $this->assertTrue($result->succeeded()); + $data = $result->getData(); + $this->assertEquals($user, reset($data['users'])); + + // Add several users + $this->generateUsers(10); + $this->resetParams(); + $_GET['limit'] = 2; + $result = \OCA\provisioning_API\Users::getUsers(array()); + $this->assertInstanceOf('OC_OCS_Result', $result); + $this->assertTrue($result->succeeded()); + $count = $result->getData(); + $count = count($count['users']); + $this->assertEquals(2, $count); + + $this->resetParams(); + $_GET['limit'] = 1; + $_GET['offset'] = 1; + $result = \OCA\provisioning_API\Users::getUsers(array()); + $this->assertInstanceOf('OC_OCS_Result', $result); + $this->assertTrue($result->succeeded()); + $data = $result->getData(); + $this->assertEquals(\OC_User::getUsers('', 1, 1), $data['users']); + } + + public function testAddUser() { + $this->resetParams(); + $_POST['userid'] = $this->getUniqueID(); + $_POST['password'] = 'password'; + $result = \OCA\provisioning_API\Users::addUser(array()); + $this->assertInstanceOf('OC_OCS_Result', $result); + $this->assertTrue($result->succeeded()); + $this->assertTrue(\OC_User::userExists($_POST['userid'])); + $this->assertEquals($_POST['userid'], \OC_User::checkPassword($_POST['userid'], $_POST['password'])); + $this->users[] = $_POST['userid']; + } + + public function testGetUserOnSelf() { + $user = $this->generateUsers(); + \OC_User::setUserId($user); + $params['userid'] = $user; + $result = \OCA\provisioning_API\Users::getUser($params); + $this->assertInstanceOf('OC_OCS_Result', $result); + $this->assertTrue($result->succeeded()); + $data = $result->getData(); + } + + public function testGetUserOnNonExistingUser() { + $user = $this->generateUsers(); + \OC_Group::addToGroup($user, 'admin'); + \OC_User::setUserId($user); + $params = array(); + $params['userid'] = $this->getUniqueID(); + while(\OC_User::userExists($params['userid'])) { + $params['userid'] = $this->getUniqueID(); + } + $result = \OCA\provisioning_API\Users::getUser($params); + $this->assertInstanceOf('OC_OCS_Result', $result); + $this->assertFalse($result->succeeded()); + $this->assertEquals(\OC_API::RESPOND_NOT_FOUND, $result->getStatusCode()); + + } + + public function testGetUserOnOtherUser() { + $users = $this->generateUsers(2); + $params['userid'] = $users[0]; + \OC_User::setUserId($users[1]); + $result = \OCA\provisioning_API\Users::getUser($params); + $this->assertInstanceOf('OC_OCS_Result', $result); + $this->assertFalse($result->succeeded()); + + // Now as as admin + $users = $this->generateUsers(2); + $params['userid'] = $users[0]; + \OC_Group::addToGroup($users[1], 'admin'); + \OC_User::setUserId($users[1]); + $result = \OCA\provisioning_API\Users::getUser($params); + $this->assertInstanceOf('OC_OCS_Result', $result); + $this->assertTrue($result->succeeded()); + $data = $result->getData(); + $this->assertEquals(\OC::$server->getConfig()->getUserValue($users[0], 'core', 'enabled', 'true'), $data['enabled']); + } + + public function testEditOwnDisplayName() { + + // Test editing own name + $user = $this->generateUsers(); + \OC_User::setUserId($user); + $result = \OCA\provisioning_API\Users::editUser( + array( + 'userid' => $user, + '_put' => array( + 'key' => 'display', + 'value' => 'newname', + ), + ) + ); + $this->assertInstanceOf('OC_OCS_Result', $result); + $this->assertTrue($result->succeeded()); + $this->assertEquals('newname', \OC_User::getDisplayName($user)); + + } + + public function testAdminEditDisplayNameOfUser() { + + // Test admin editing users name + $user = $this->generateUsers(); + \OC_Group::addToGroup($user, 'admin'); + \OC_User::setUserId($user); + $user2 = $this->generateUsers(); + $result = \OCA\provisioning_API\Users::editUser( + array( + 'userid' => $user2, + '_put' => array( + 'key' => 'display', + 'value' => 'newname', + ), + ) + ); + $this->assertInstanceOf('OC_OCS_Result', $result); + $this->assertTrue($result->succeeded()); + $this->assertEquals('newname', \OC_User::getDisplayName($user2)); + + } + + public function testUserEditOtherUserDisplayName() { + + // Test editing other users name + $user = $this->generateUsers(); + \OC_User::setUserId($user); + $user2 = $this->generateUsers(); + $result = \OCA\provisioning_API\Users::editUser( + array( + 'userid' => $user2, + '_put' => array( + 'key' => 'display', + 'value' => 'newname', + ), + ) + ); + $this->assertInstanceOf('OC_OCS_Result', $result); + $this->assertFalse($result->succeeded()); + + } + + public function testEditOwnQuota() { + $user = $this->generateUsers(); + \OC_User::setUserId($user); + $result = \OCA\provisioning_API\Users::editUser( + array( + 'userid' => $user, + '_put' => array( + 'key' => 'quota', + 'value' => '20G', + ), + ) + ); + $this->assertInstanceOf('OC_OCS_Result', $result); + $this->assertFalse($result->succeeded()); + } + + public function testAdminEditOwnQuota() { + $user = $this->generateUsers(); + \OC_Group::addToGroup($user, 'admin'); + \OC_User::setUserId($user); + $result = \OCA\provisioning_API\Users::editUser( + array( + 'userid' => $user, + '_put' => array( + 'key' => 'quota', + 'value' => '20G', + ), + ) + ); + $this->assertInstanceOf('OC_OCS_Result', $result); + $this->assertTrue($result->succeeded()); + } + + public function testAdminEditOtherUserQuota() { + $user = $this->generateUsers(); + \OC_Group::addToGroup($user, 'admin'); + \OC_User::setUserId($user); + $user2 = $this->generateUsers(); + $result = \OCA\provisioning_API\Users::editUser( + array( + 'userid' => $user2, + '_put' => array( + 'key' => 'quota', + 'value' => '20G', + ), + ) + ); + $this->assertInstanceOf('OC_OCS_Result', $result); + $this->assertTrue($result->succeeded()); + } + + public function testUserEditOtherUserQuota() { + $user = $this->generateUsers(); + \OC_User::setUserId($user); + $user2 = $this->generateUsers(); + $result = \OCA\provisioning_API\Users::editUser( + array( + 'userid' => $user2, + '_put' => array( + 'key' => 'quota', + 'value' => '20G', + ), + ) + ); + $this->assertInstanceOf('OC_OCS_Result', $result); + $this->assertFalse($result->succeeded()); + } + + public function testUserEditOwnEmail() { + $user = $this->generateUsers(); + $email = 'test@example.com'; + \OC_User::setUserId($user); + $result = \OCA\provisioning_API\Users::editUser( + array( + 'userid' => $user, + '_put' => array( + 'key' => 'email', + 'value' => $email, + ), + ) + ); + $this->assertInstanceOf('OC_OCS_Result', $result); + $this->assertTrue($result->succeeded()); + $this->assertEquals($email, \OC::$server->getConfig()->getUserValue($user, 'settings', 'email', null)); + } + + public function testUserEditOtherUserEmailAsUser() { + $users = $this->generateUsers(2); + $email = 'test@example.com'; + \OC_User::setUserId($users[0]); + $result = \OCA\provisioning_API\Users::editUser( + array( + 'userid' => $users[1], + '_put' => array( + 'key' => 'email', + 'value' => $email, + ), + ) + ); + $this->assertInstanceOf('OC_OCS_Result', $result); + $this->assertFalse($result->succeeded()); + } + + public function testUserEditOtherUserEmailAsAdmin() { + $users = $this->generateUsers(2); + $email = 'test@example.com'; + \OC_User::setUserId($users[0]); + \OC_Group::addToGroup($users[0], 'admin'); + $result = \OCA\provisioning_API\Users::editUser( + array( + 'userid' => $users[1], + '_put' => array( + 'key' => 'email', + 'value' => $email, + ), + ) + ); + $this->assertInstanceOf('OC_OCS_Result', $result); + $this->assertTrue($result->succeeded()); + $this->assertEquals($email, \OC::$server->getConfig()->getUserValue($users[1], 'settings', 'email', null)); + } + + public function testDeleteSelf() { + $user = $this->generateUsers(); + \OC_User::setUserId($user); + $result = \OCA\provisioning_API\Users::deleteUser(array( + 'userid' => $user, + )); + $this->assertInstanceOf('OC_OCS_Result', $result); + $this->assertFalse($result->succeeded()); + } + + public function testDeleteOtherAsUser() { + $user = $this->generateUsers(); + \OC_User::setUserId($user); + $user2 = $this->generateUsers(); + $result = \OCA\provisioning_API\Users::deleteUser(array( + 'userid' => $user2, + )); + $this->assertInstanceOf('OC_OCS_Result', $result); + $this->assertFalse($result->succeeded()); + } + + public function testDeleteOtherAsSubAdmin() { + $user = $this->generateUsers(); + \OC_User::setUserId($user); + $user2 = $this->generateUsers(); + $group = $this->getUniqueID(); + \OC_Group::createGroup($group); + \OC_Group::addToGroup($user, $group); + \OC_Group::addToGroup($user2, $group); + \OC_SubAdmin::createSubAdmin($user, $group); + $result = \OCA\provisioning_API\Users::deleteUser(array( + 'userid' => $user2, + )); + $this->assertInstanceOf('OC_OCS_Result', $result); + $this->assertTrue($result->succeeded()); + \OC_Group::deleteGroup($group); + } + + public function testDeleteOtherAsIrelevantSubAdmin() { + $user = $this->generateUsers(); + \OC_User::setUserId($user); + $user2 = $this->generateUsers(); + $group = $this->getUniqueID(); + $group2 = $this->getUniqueID(); + \OC_Group::createGroup($group); + \OC_Group::createGroup($group2); + \OC_Group::addToGroup($user, $group); + \OC_Group::addToGroup($user2, $group2); + \OC_SubAdmin::createSubAdmin($user, $group); + $result = \OCA\provisioning_API\Users::deleteUser(array( + 'userid' => $user2, + )); + $this->assertInstanceOf('OC_OCS_Result', $result); + $this->assertFalse($result->succeeded()); + \OC_Group::deleteGroup($group); + \OC_Group::deleteGroup($group2); + } + + public function testDeleteOtherAsAdmin() { + $user = $this->generateUsers(); + \OC_Group::addToGroup($user, 'admin'); + \OC_User::setUserId($user); + $user2 = $this->generateUsers(); + $result = \OCA\provisioning_API\Users::deleteUser(array( + 'userid' => $user2, + )); + $this->assertInstanceOf('OC_OCS_Result', $result); + $this->assertTrue($result->succeeded()); + } + + public function testDeleteSelfAsAdmin() { + $user = $this->generateUsers(); + \OC_Group::addToGroup($user, 'admin'); + \OC_User::setUserId($user); + $result = \OCA\provisioning_API\Users::deleteUser(array( + 'userid' => $user, + )); + $this->assertInstanceOf('OC_OCS_Result', $result); + $this->assertFalse($result->succeeded()); + } + + public function testGetUsersGroupsOnSelf() { + $user = $this->generateUsers(); + \OC_User::setUserId($user); + $group = $this->getUniqueID(); + \OC_Group::createGroup($group); + \OC_Group::addToGroup($user, $group); + $result = \OCA\provisioning_API\Users::getUsersGroups(array( + 'userid' => $user, + )); + $this->assertInstanceOf('OC_OCS_Result', $result); + $this->assertTrue($result->succeeded()); + $data = $result->getData(); + $this->assertEquals($group, reset($data['groups'])); + $this->assertEquals(1, count($data['groups'])); + \OC_Group::deleteGroup($group); + } + + public function testGetUsersGroupOnOther() { + $user1 = $this->generateUsers(); + $user2 = $this->generateUsers(); + \OC_User::setUserId($user1); + $group = $this->getUniqueID(); + \OC_Group::createGroup($group); + \OC_Group::addToGroup($user2, $group); + $result = \OCA\provisioning_API\Users::getUsersGroups(array( + 'userid' => $user2, + )); + $this->assertInstanceOf('OC_OCS_Result', $result); + $this->assertFalse($result->succeeded()); + \OC_Group::deleteGroup($group); + } + + public function testGetUsersGroupOnOtherAsAdmin() { + $user1 = $this->generateUsers(); + \OC_Group::addToGroup($user1, 'admin'); + $user2 = $this->generateUsers(); + \OC_User::setUserId($user1); + $group = $this->getUniqueID(); + \OC_Group::createGroup($group); + \OC_Group::addToGroup($user2, $group); + $result = \OCA\provisioning_API\Users::getUsersGroups(array( + 'userid' => $user2, + )); + $this->assertInstanceOf('OC_OCS_Result', $result); + $this->assertTrue($result->succeeded()); + $data = $result->getData(); + $this->assertEquals($group, reset($data['groups'])); + $this->assertEquals(1, count($data['groups'])); + \OC_Group::deleteGroup($group); + } + + public function testGetUsersGroupsOnOtherAsSubAdmin() { + $user1 = $this->generateUsers(); + $user2 = $this->generateUsers(); + \OC_User::setUserId($user1); + $group1 = $this->getUniqueID(); + $group2 = $this->getUniqueID(); + \OC_Group::createGroup($group1); + \OC_Group::createGroup($group2); + \OC_Group::addToGroup($user2, $group1); + \OC_Group::addToGroup($user2, $group2); + \OC_Group::addToGroup($user1, $group1); + \OC_SubAdmin::createSubAdmin($user1, $group1); + $result = \OCA\provisioning_API\Users::getUsersGroups(array( + 'userid' => $user2, + )); + $this->assertInstanceOf('OC_OCS_Result', $result); + $this->assertTrue($result->succeeded()); + $data = $result->getData(); + $this->assertEquals($group1, reset($data['groups'])); + $this->assertEquals(1, count($data['groups'])); + \OC_Group::deleteGroup($group1); + \OC_Group::deleteGroup($group2); + } + + public function testGetUsersGroupsOnOtherAsIrelevantSubAdmin() { + $user1 = $this->generateUsers(); + $user2 = $this->generateUsers(); + \OC_User::setUserId($user1); + $group1 = $this->getUniqueID(); + $group2 = $this->getUniqueID(); + \OC_Group::createGroup($group1); + \OC_Group::createGroup($group2); + \OC_Group::addToGroup($user2, $group2); + \OC_Group::addToGroup($user1, $group1); + \OC_SubAdmin::createSubAdmin($user1, $group1); + $result = \OCA\provisioning_API\Users::getUsersGroups(array( + 'userid' => $user2, + )); + $this->assertInstanceOf('OC_OCS_Result', $result); + $this->assertFalse($result->succeeded()); + \OC_Group::deleteGroup($group1); + \OC_Group::deleteGroup($group2); + } + + public function testAddToGroup() { + $user = $this->generateUsers(); + $group = $this->getUniqueID(); + \OC_Group::createGroup($group); + \OC_User::setUserId($user); + $_POST['groupid'] = $group; + $result = \OCA\provisioning_API\Users::addToGroup(array( + 'userid' => $user, + )); + $this->assertInstanceOf('OC_OCS_Result', $result); + $this->assertFalse($result->succeeded()); + $this->assertFalse(\OC_Group::inGroup($user, $group)); + \OC_Group::deleteGroup($group); + } + + public function testAddToGroupAsAdmin() { + $user = $this->generateUsers(); + \OC_Group::addToGroup($user, 'admin'); + $group = $this->getUniqueID(); + \OC_Group::createGroup($group); + $user2 = $this->generateUsers(); + \OC_User::setUserId($user); + $_POST['groupid'] = $group; + $result = \OCA\provisioning_API\Users::addToGroup(array( + 'userid' => $user2, + )); + $this->assertInstanceOf('OC_OCS_Result', $result); + $this->assertTrue($result->succeeded()); + $this->assertTrue(\OC_Group::inGroup($user2, $group)); + \OC_Group::deleteGroup($group); + } + + public function testAddToGroupAsSubAdmin() { + $user1 = $this->generateUsers(); + $user2 = $this->generateUsers(); + \OC_User::setUserId($user1); + $group1 = $this->getUniqueID(); + \OC_Group::createGroup($group1); + \OC_SubAdmin::createSubAdmin($user1, $group1); + $_POST['groupid'] = $group1; + $result = \OCA\provisioning_API\Users::addToGroup(array( + 'userid' => $user2, + )); + $this->assertInstanceOf('OC_OCS_Result', $result); + $this->assertFalse($result->succeeded()); + $this->assertFalse(\OC_Group::inGroup($user2, $group1)); + \OC_Group::deleteGroup($group1); + } + + public function testAddToGroupAsIrelevantSubAdmin() { + $user1 = $this->generateUsers(); + $user2 = $this->generateUsers(); + \OC_User::setUserId($user1); + $group1 = $this->getUniqueID(); + $group2 = $this->getUniqueID(); + \OC_Group::createGroup($group1); + \OC_Group::createGroup($group2); + \OC_SubAdmin::createSubAdmin($user1, $group1); + $_POST['groupid'] = $group2; + $result = \OCA\provisioning_API\Users::addToGroup(array( + 'userid' => $user2, + )); + $this->assertInstanceOf('OC_OCS_Result', $result); + $this->assertFalse($result->succeeded()); + $this->assertFalse(\OC_Group::inGroup($user2, $group2)); + \OC_Group::deleteGroup($group1); + \OC_Group::deleteGroup($group2); + } + + // test delete /cloud/users/{userid}/groups + public function testRemoveFromGroupAsSelf() { + $user1 = $this->generateUsers(); + \OC_User::setUserId($user1); + $group1 = $this->getUniqueID(); + \OC_Group::createGroup($group1); + \OC_Group::addToGroup($user1, $group1); + $result = \OCA\provisioning_api\Users::removeFromGroup(array( + 'userid' => $user1, + '_delete' => array( + 'groupid' => $group1, + ), + )); + $this->assertInstanceOf('OC_OCS_Result', $result); + $this->assertFalse($result->succeeded()); + $this->assertTrue(\OC_Group::inGroup($user1, $group1)); + \OC_Group::deleteGroup($group1); + } + + public function testRemoveFromGroupAsAdmin() { + $user1 = $this->generateUsers(); + $user2 = $this->generateUsers(); + \OC_User::setUserId($user1); + $group1 = $this->getUniqueID(); + \OC_Group::createGroup($group1); + \OC_Group::addToGroup($user2, $group1); + \OC_Group::addToGroup($user1, 'admin'); + $result = \OCA\provisioning_api\Users::removeFromGroup(array( + 'userid' => $user2, + '_delete' => array( + 'groupid' => $group1, + ), + )); + $this->assertInstanceOf('OC_OCS_Result', $result); + $this->assertTrue($result->succeeded()); + $this->assertFalse(\OC_Group::inGroup($user2, $group1)); + \OC_Group::deleteGroup($group1); + } + + public function testRemoveFromGroupAsSubAdmin() { + $user1 = $this->generateUsers(); + \OC_User::setUserId($user1); + $user2 = $this->generateUsers(); + $group1 = $this->getUniqueID(); + \OC_Group::createGroup($group1); + \OC_Group::addToGroup($user1, $group1); + \OC_Group::addToGroup($user2, $group1); + \OC_SubAdmin::createSubAdmin($user1, $group1); + $result = \OCA\provisioning_api\Users::removeFromGroup(array( + 'userid' => $user2, + '_delete' => array( + 'groupid' => $group1, + ), + )); + $this->assertInstanceOf('OC_OCS_Result', $result); + $this->assertTrue($result->succeeded()); + $this->assertFalse(\OC_Group::inGroup($user2, $group1)); + \OC_Group::deleteGroup($group1); + } + + public function testRemoveFromGroupAsIrelevantSubAdmin() { + $user1 = $this->generateUsers(); + \OC_User::setUserId($user1); + $user2 = $this->generateUsers(); + $group1 = $this->getUniqueID(); + $group2 = $this->getUniqueID(); + \OC_Group::createGroup($group1); + \OC_Group::createGroup($group2); + \OC_Group::addToGroup($user1, $group1); + \OC_Group::addToGroup($user2, $group2); + \OC_SubAdmin::createSubAdmin($user1, $group1); + $result = \OCA\provisioning_api\Users::removeFromGroup(array( + 'userid' => $user2, + '_delete' => array( + 'groupid' => $group2, + ), + )); + $this->assertInstanceOf('OC_OCS_Result', $result); + $this->assertFalse($result->succeeded()); + $this->assertTrue(\OC_Group::inGroup($user2, $group2)); + \OC_Group::deleteGroup($group1); + \OC_Group::deleteGroup($group2); + } + + public function testCreateSubAdmin() { + $user1 = $this->generateUsers(); + $user2 = $this->generateUsers(); + \OC_User::setUserId($user1); + \OC_Group::addToGroup($user1, 'admin'); + $group1 = $this->getUniqueID(); + \OC_Group::createGroup($group1); + $_POST['groupid'] = $group1; + $result = \OCA\provisioning_api\Users::addSubAdmin(array( + 'userid' => $user2, + )); + $this->assertInstanceOf('OC_OCS_Result', $result); + $this->assertTrue($result->succeeded()); + $this->assertTrue(\OC_SubAdmin::isSubAdminofGroup($user2, $group1)); + \OC_Group::deleteGroup($group1); + + $this->resetParams(); + + $user1 = $this->generateUsers(); + $user2 = $this->generateUsers(); + \OC_User::setUserId($user1); + \OC_Group::addToGroup($user1, 'admin'); + $_POST['groupid'] = 'admin'; + $result = \OCA\provisioning_api\Users::addSubAdmin(array( + 'userid' => $user2, + )); + $this->assertInstanceOf('OC_OCS_Result', $result); + $this->assertEquals(103, $result->getStatusCode()); + $this->assertFalse($result->succeeded()); + + $this->resetParams(); + + $user1 = $this->generateUsers(); + \OC_User::setUserId($user1); + \OC_Group::addToGroup($user1, 'admin'); + $group1 = $this->getUniqueID(); + \OC_Group::createGroup($group1); + $_POST['groupid'] = $group1; + $result = \OCA\provisioning_api\Users::addSubAdmin(array( + 'userid' => $this->getUniqueID(), + )); + $this->assertInstanceOf('OC_OCS_Result', $result); + $this->assertFalse($result->succeeded()); + $this->assertEquals(101, $result->getStatusCode()); + \OC_Group::deleteGroup($group1); + } + + public function testRemoveSubAdmin() { + $user1 = $this->generateUsers(); + $user2 = $this->generateUsers(); + \OC_User::setUserId($user1); + \OC_Group::addToGroup($user1, 'admin'); + $group1 = $this->getUniqueID(); + \OC_Group::createGroup($group1); + \OC_SubAdmin::createSubAdmin($user2, $group1); + $result = \OCA\provisioning_api\Users::removeSubAdmin(array( + 'userid' => $user2, + '_delete' => array( + 'groupid' => $group1, + ), + )); + $this->assertInstanceOf('OC_OCS_Result', $result); + $this->assertTrue($result->succeeded()); + $this->assertTrue(!\OC_SubAdmin::isSubAdminofGroup($user2, $group1)); + \OC_Group::deleteGroup($group1); + + $user1 = $this->generateUsers(); + \OC_User::setUserId($user1); + \OC_Group::addToGroup($user1, 'admin'); + $result = \OCA\provisioning_api\Users::removeSubAdmin(array( + 'userid' => $this->getUniqueID(), + '_delete' => array( + 'groupid' => $group1, + ), + )); + $this->assertInstanceOf('OC_OCS_Result', $result); + $this->assertEquals(101, $result->getStatusCode()); + $this->assertFalse($result->succeeded()); + + $this->resetParams(); + + $user1 = $this->generateUsers(); + $user2 = $this->generateUsers(); + \OC_User::setUserId($user1); + \OC_Group::addToGroup($user1, 'admin'); + $group1 = $this->getUniqueID(); + \OC_Group::createGroup($group1); + $_POST['groupid'] = $group1; + $result = \OCA\provisioning_api\Users::removeSubAdmin(array( + 'userid' => $user2, + '_delete' => array( + 'groupid' => $group1, + ), + )); + $this->assertInstanceOf('OC_OCS_Result', $result); + $this->assertFalse($result->succeeded()); + $this->assertEquals(102, $result->getStatusCode()); + \OC_Group::deleteGroup($group1); + } + + public function testGetSubAdminGroups() { + $user1 = $this->generateUsers(); + $user2 = $this->generateUsers(); + \OC_User::setUserId($user1); + \OC_Group::addToGroup($user1, 'admin'); + $group1 = $this->getUniqueID(); + \OC_Group::createGroup($group1); + \OC_SubAdmin::createSubAdmin($user2, $group1); + $result = \OCA\provisioning_api\Users::getUserSubAdminGroups(array( + 'userid' => $user2, + )); + $this->assertInstanceOf('OC_OCS_Result', $result); + $this->assertTrue($result->succeeded()); + $data = $result->getData(); + $this->assertEquals($group1, reset($data)); + \OC_Group::deleteGroup($group1); + + $user1 = $this->generateUsers(); + \OC_User::setUserId($user1); + \OC_Group::addToGroup($user1, 'admin'); + $group1 = $this->getUniqueID(); + $result = \OCA\provisioning_api\Users::getUserSubAdminGroups(array( + 'userid' => $this->getUniqueID(), + )); + $this->assertInstanceOf('OC_OCS_Result', $result); + $this->assertFalse($result->succeeded()); + $this->assertEquals(101, $result->getStatusCode()); + } +} diff --git a/apps/user_ldap/ajax/clearMappings.php b/apps/user_ldap/ajax/clearMappings.php index 4e713c59f96..e6f3d32e84f 100644 --- a/apps/user_ldap/ajax/clearMappings.php +++ b/apps/user_ldap/ajax/clearMappings.php @@ -21,15 +21,27 @@ * */ +use OCA\User_LDAP\Mapping\UserMapping; +use OCA\User_LDAP\Mapping\GroupMapping; + // Check user and app status OCP\JSON::checkAdminUser(); OCP\JSON::checkAppEnabled('user_ldap'); OCP\JSON::callCheck(); $subject = $_POST['ldap_clear_mapping']; -if(\OCA\user_ldap\lib\Helper::clearMapping($subject)) { +$mapping = null; +if($subject === 'user') { + $mapping = new UserMapping(\OC::$server->getDatabaseConnection()); +} else if($subject === 'group') { + $mapping = new GroupMapping(\OC::$server->getDatabaseConnection()); +} +try { + if(is_null($mapping) || !$mapping->clear()) { + $l = \OC::$server->getL10N('user_ldap'); + throw new \Exception($l->t('Failed to clear the mappings.')); + } OCP\JSON::success(); -} else { - $l = \OC::$server->getL10N('user_ldap'); - OCP\JSON::error(array('message' => $l->t('Failed to clear the mappings.'))); +} catch (\Exception $e) { + OCP\JSON::error(array('message' => $e->getMessage())); } diff --git a/apps/user_ldap/ajax/deleteConfiguration.php b/apps/user_ldap/ajax/deleteConfiguration.php index bca687c81ab..d409d891f61 100644 --- a/apps/user_ldap/ajax/deleteConfiguration.php +++ b/apps/user_ldap/ajax/deleteConfiguration.php @@ -27,7 +27,8 @@ OCP\JSON::checkAppEnabled('user_ldap'); OCP\JSON::callCheck(); $prefix = $_POST['ldap_serverconfig_chooser']; -if(\OCA\user_ldap\lib\Helper::deleteServerConfiguration($prefix)) { +$helper = new \OCA\user_ldap\lib\Helper(); +if($helper->deleteServerConfiguration($prefix)) { OCP\JSON::success(); } else { $l = \OC::$server->getL10N('user_ldap'); diff --git a/apps/user_ldap/ajax/getNewServerConfigPrefix.php b/apps/user_ldap/ajax/getNewServerConfigPrefix.php index 1c68b2e9a76..ce6c5ae76e8 100644 --- a/apps/user_ldap/ajax/getNewServerConfigPrefix.php +++ b/apps/user_ldap/ajax/getNewServerConfigPrefix.php @@ -26,7 +26,8 @@ OCP\JSON::checkAdminUser(); OCP\JSON::checkAppEnabled('user_ldap'); OCP\JSON::callCheck(); -$serverConnections = \OCA\user_ldap\lib\Helper::getServerConfigurationPrefixes(); +$helper = new \OCA\user_ldap\lib\Helper(); +$serverConnections = $helper->getServerConfigurationPrefixes(); sort($serverConnections); $lk = array_pop($serverConnections); $ln = intval(str_replace('s', '', $lk)); diff --git a/apps/user_ldap/ajax/wizard.php b/apps/user_ldap/ajax/wizard.php index ef1241b9147..48bfb56311c 100644 --- a/apps/user_ldap/ajax/wizard.php +++ b/apps/user_ldap/ajax/wizard.php @@ -52,7 +52,8 @@ $userManager = new \OCA\user_ldap\lib\user\Manager( new \OCA\user_ldap\lib\FilesystemHelper(), new \OCA\user_ldap\lib\LogWrapper(), \OC::$server->getAvatarManager(), - new \OCP\Image()); + new \OCP\Image(), + \OC::$server->getDatabaseConnection()); $access = new \OCA\user_ldap\lib\Access($con, $ldapWrapper, $userManager); @@ -62,6 +63,7 @@ switch($action) { case 'guessPortAndTLS': case 'guessBaseDN': case 'detectEmailAttribute': + case 'detectUserDisplayNameAttribute': case 'determineGroupMemberAssoc': case 'determineUserObjectClasses': case 'determineGroupObjectClasses': @@ -115,4 +117,3 @@ switch($action) { //TODO: return 4xx error break; } - diff --git a/apps/user_ldap/appinfo/app.php b/apps/user_ldap/appinfo/app.php index 8f9fbc5129b..911688a5c20 100644 --- a/apps/user_ldap/appinfo/app.php +++ b/apps/user_ldap/appinfo/app.php @@ -5,6 +5,7 @@ * * @author Dominik Schmidt * @copyright 2011 Dominik Schmidt dev@dominik-schmidt.de +* @copyright 2014 Arthur Schiwon <blizzz@owncloud.com> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE @@ -23,21 +24,30 @@ OCP\App::registerAdmin('user_ldap', 'settings'); -$configPrefixes = OCA\user_ldap\lib\Helper::getServerConfigurationPrefixes(true); +$helper = new \OCA\user_ldap\lib\Helper(); +$configPrefixes = $helper->getServerConfigurationPrefixes(true); $ldapWrapper = new OCA\user_ldap\lib\LDAP(); +$ocConfig = \OC::$server->getConfig(); if(count($configPrefixes) === 1) { - $ocConfig = \OC::$server->getConfig(); + $dbc = \OC::$server->getDatabaseConnection(); $userManager = new OCA\user_ldap\lib\user\Manager($ocConfig, new OCA\user_ldap\lib\FilesystemHelper(), new OCA\user_ldap\lib\LogWrapper(), \OC::$server->getAvatarManager(), - new \OCP\Image()); + new \OCP\Image(), + $dbc + ); $connector = new OCA\user_ldap\lib\Connection($ldapWrapper, $configPrefixes[0]); $ldapAccess = new OCA\user_ldap\lib\Access($connector, $ldapWrapper, $userManager); - $userBackend = new OCA\user_ldap\USER_LDAP($ldapAccess); + + $ldapAccess->setUserMapper(new OCA\User_LDAP\Mapping\UserMapping($dbc)); + $ldapAccess->setGroupMapper(new OCA\User_LDAP\Mapping\GroupMapping($dbc)); + $userBackend = new OCA\user_ldap\USER_LDAP($ldapAccess, $ocConfig); $groupBackend = new OCA\user_ldap\GROUP_LDAP($ldapAccess); } else if(count($configPrefixes) > 1) { - $userBackend = new OCA\user_ldap\User_Proxy($configPrefixes, $ldapWrapper); + $userBackend = new OCA\user_ldap\User_Proxy( + $configPrefixes, $ldapWrapper, $ocConfig + ); $groupBackend = new OCA\user_ldap\Group_Proxy($configPrefixes, $ldapWrapper); } @@ -47,16 +57,10 @@ if(count($configPrefixes) > 0) { OC_Group::useBackend($groupBackend); } -// add settings page to navigation -$entry = array( - 'id' => 'user_ldap_settings', - 'order'=>1, - 'href' => OCP\Util::linkTo( 'user_ldap', 'settings.php' ), - 'name' => 'LDAP' -); OCP\Util::addTranslations('user_ldap'); - OCP\Backgroundjob::registerJob('OCA\user_ldap\lib\Jobs'); +OCP\Backgroundjob::registerJob('\OCA\User_LDAP\Jobs\CleanUp'); + if(OCP\App::isEnabled('user_webdavauth')) { OCP\Util::writeLog('user_ldap', 'user_ldap and user_webdavauth are incompatible. You may experience unexpected behaviour', diff --git a/apps/user_ldap/appinfo/register_command.php b/apps/user_ldap/appinfo/register_command.php index f65b9773388..651e6a564e1 100644 --- a/apps/user_ldap/appinfo/register_command.php +++ b/apps/user_ldap/appinfo/register_command.php @@ -6,8 +6,34 @@ * See the COPYING-README file. */ +use OCA\user_ldap\lib\Helper; +use OCA\user_ldap\lib\LDAP; +use OCA\user_ldap\User_Proxy; +use OCA\User_LDAP\Mapping\UserMapping; +use OCA\User_LDAP\lib\User\DeletedUsersIndex; + +$dbConnection = \OC::$server->getDatabaseConnection(); +$userMapping = new UserMapping($dbConnection); +$helper = new Helper(); +$ocConfig = \OC::$server->getConfig(); +$uBackend = new User_Proxy( + $helper->getServerConfigurationPrefixes(true), + new LDAP(), + $ocConfig +); +$deletedUsersIndex = new DeletedUsersIndex( + $ocConfig, $dbConnection, $userMapping +); + $application->add(new OCA\user_ldap\Command\ShowConfig()); $application->add(new OCA\user_ldap\Command\SetConfig()); $application->add(new OCA\user_ldap\Command\TestConfig()); $application->add(new OCA\user_ldap\Command\CreateEmptyConfig()); $application->add(new OCA\user_ldap\Command\DeleteConfig()); +$application->add(new OCA\user_ldap\Command\Search($ocConfig)); +$application->add(new OCA\user_ldap\Command\ShowRemnants( + $deletedUsersIndex, \OC::$server->getDateTimeFormatter()) +); +$application->add(new OCA\user_ldap\Command\CheckUser( + $uBackend, $helper, $deletedUsersIndex, $userMapping) +); diff --git a/apps/user_ldap/appinfo/update.php b/apps/user_ldap/appinfo/update.php index 5fad23de4f6..b4121b19852 100644 --- a/apps/user_ldap/appinfo/update.php +++ b/apps/user_ldap/appinfo/update.php @@ -1,45 +1,48 @@ <?php +$configInstance = \OC::$server->getConfig(); + //detect if we can switch on naming guidelines. We won't do it on conflicts. //it's a bit spaghetti, but hey. -$state = OCP\Config::getSystemValue('ldapIgnoreNamingRules', 'unset'); +$state = $configInstance->getSystemValue('ldapIgnoreNamingRules', 'unset'); if($state === 'unset') { - OCP\Config::setSystemValue('ldapIgnoreNamingRules', false); + $configInstance->setSystemValue('ldapIgnoreNamingRules', false); } -$installedVersion = OCP\Config::getAppValue('user_ldap', 'installed_version'); +$installedVersion = $configInstance->getAppValue('user_ldap', 'installed_version'); $enableRawMode = version_compare($installedVersion, '0.4.1', '<'); -$configPrefixes = OCA\user_ldap\lib\Helper::getServerConfigurationPrefixes(true); +$helper = new \OCA\user_ldap\lib\Helper(); +$configPrefixes = $helper->getServerConfigurationPrefixes(true); $ldap = new OCA\user_ldap\lib\LDAP(); foreach($configPrefixes as $config) { $connection = new OCA\user_ldap\lib\Connection($ldap, $config); - $state = \OCP\Config::getAppValue( + $state = $configInstance->getAppValue( 'user_ldap', $config.'ldap_uuid_user_attribute', 'not existing'); if($state === 'non existing') { - $value = \OCP\Config::getAppValue( + $value = $configInstance->getAppValue( 'user_ldap', $config.'ldap_uuid_attribute', ''); - \OCP\Config::setAppValue( + $configInstance->setAppValue( 'user_ldap', $config.'ldap_uuid_user_attribute', $value); - \OCP\Config::setAppValue( + $configInstance->setAppValue( 'user_ldap', $config.'ldap_uuid_group_attribute', $value); } - $state = \OCP\Config::getAppValue( + $state = $configInstance->getAppValue( 'user_ldap', $config.'ldap_expert_uuid_user_attr', 'not existing'); if($state === 'non existing') { - $value = \OCP\Config::getAppValue( + $value = $configInstance->getAppValue( 'user_ldap', $config.'ldap_expert_uuid_attr', ''); - \OCP\Config::setAppValue( + $configInstance->setAppValue( 'user_ldap', $config.'ldap_expert_uuid_user_attr', $value); - \OCP\Config::setAppValue( + $configInstance->setAppValue( 'user_ldap', $config.'ldap_expert_uuid_group_attr', $value); } if($enableRawMode) { - \OCP\Config::setAppValue('user_ldap', $config.'ldap_user_filter_mode', 1); - \OCP\Config::setAppValue('user_ldap', $config.'ldap_login_filter_mode', 1); - \OCP\Config::setAppValue('user_ldap', $config.'ldap_group_filter_mode', 1); + $configInstance->setAppValue('user_ldap', $config.'ldap_user_filter_mode', 1); + $configInstance->setAppValue('user_ldap', $config.'ldap_login_filter_mode', 1); + $configInstance->setAppValue('user_ldap', $config.'ldap_group_filter_mode', 1); } } diff --git a/apps/user_ldap/appinfo/version b/apps/user_ldap/appinfo/version index 6f2743d65dc..0bfccb08040 100644 --- a/apps/user_ldap/appinfo/version +++ b/apps/user_ldap/appinfo/version @@ -1 +1 @@ -0.4.4 +0.4.5 diff --git a/apps/user_ldap/command/checkuser.php b/apps/user_ldap/command/checkuser.php new file mode 100644 index 00000000000..202855e4853 --- /dev/null +++ b/apps/user_ldap/command/checkuser.php @@ -0,0 +1,121 @@ +<?php +/** + * Copyright (c) 2014 Arthur Schiwon <blizzz@owncloud.com> + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace OCA\user_ldap\Command; + +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Input\InputArgument; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Input\InputOption; +use Symfony\Component\Console\Output\OutputInterface; + +use OCA\user_ldap\lib\user\User; +use OCA\User_LDAP\lib\User\DeletedUsersIndex; +use OCA\User_LDAP\Mapping\UserMapping; +use OCA\user_ldap\lib\Helper as LDAPHelper; +use OCA\user_ldap\User_Proxy; + +class CheckUser extends Command { + /** @var \OCA\user_ldap\User_Proxy */ + protected $backend; + + /** @var \OCA\User_LDAP\lib\Helper */ + protected $helper; + + /** @var \OCA\User_LDAP\lib\User\DeletedUsersIndex */ + protected $dui; + + /** @var \OCA\User_LDAP\Mapping\UserMapping */ + protected $mapping; + + /** + * @param OCA\user_ldap\User_Proxy $uBackend + * @param OCA\user_ldap\lib\Helper $helper + * @param OCA\User_LDAP\lib\User\DeletedUsersIndex $dui + * @param OCA\User_LDAP\Mapping\UserMapping $mapping + */ + public function __construct(User_Proxy $uBackend, LDAPHelper $helper, DeletedUsersIndex $dui, UserMapping $mapping) { + $this->backend = $uBackend; + $this->helper = $helper; + $this->dui = $dui; + $this->mapping = $mapping; + parent::__construct(); + } + + protected function configure() { + $this + ->setName('ldap:check-user') + ->setDescription('checks whether a user exists on LDAP.') + ->addArgument( + 'ocName', + InputArgument::REQUIRED, + 'the user name as used in ownCloud' + ) + ->addOption( + 'force', + null, + InputOption::VALUE_NONE, + 'ignores disabled LDAP configuration' + ) + ; + } + + protected function execute(InputInterface $input, OutputInterface $output) { + try { + $uid = $input->getArgument('ocName'); + $this->isAllowed($input->getOption('force')); + $this->confirmUserIsMapped($uid); + $exists = $this->backend->userExistsOnLDAP($uid); + if($exists === true) { + $output->writeln('The user is still available on LDAP.'); + return; + } + + $this->dui->markUser($uid); + $output->writeln('The user does not exists on LDAP anymore.'); + $output->writeln('Clean up the user\'s remnants by: ./occ user:delete "' + . $uid . '"'); + } catch (\Exception $e) { + $output->writeln('<error>' . $e->getMessage(). '</error>'); + } + } + + /** + * checks whether a user is actually mapped + * @param string $ocName the username as used in ownCloud + * @throws \Exception + * @return true + */ + protected function confirmUserIsMapped($ocName) { + $dn = $this->mapping->getDNByName($ocName); + if ($dn === false) { + throw new \Exception('The given user is not a recognized LDAP user.'); + } + + return true; + } + + /** + * checks whether the setup allows reliable checking of LDAP user existence + * @throws \Exception + * @return true + */ + protected function isAllowed($force) { + if($this->helper->haveDisabledConfigurations() && !$force) { + throw new \Exception('Cannot check user existence, because ' + . 'disabled LDAP configurations are present.'); + } + + // we don't check ldapUserCleanupInterval from config.php because this + // action is triggered manually, while the setting only controls the + // background job. + + return true; + } + +} diff --git a/apps/user_ldap/command/search.php b/apps/user_ldap/command/search.php new file mode 100644 index 00000000000..ba87982d167 --- /dev/null +++ b/apps/user_ldap/command/search.php @@ -0,0 +1,113 @@ +<?php +/** + * Copyright (c) 2014 Arthur Schiwon <blizzz@owncloud.com> + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace OCA\user_ldap\Command; + +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Input\InputArgument; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Input\InputOption; +use Symfony\Component\Console\Output\OutputInterface; + +use OCA\user_ldap\User_Proxy; +use OCA\user_ldap\Group_Proxy; +use OCA\user_ldap\lib\Helper; +use OCA\user_ldap\lib\LDAP; +use OCP\IConfig; + +class Search extends Command { + /** @var \OCP\IConfig */ + protected $ocConfig; + + /** + * @param \OCP\IConfig $ocConfig + */ + public function __construct(IConfig $ocConfig) { + $this->ocConfig = $ocConfig; + parent::__construct(); + } + + protected function configure() { + $this + ->setName('ldap:search') + ->setDescription('executes a user or group search') + ->addArgument( + 'search', + InputArgument::REQUIRED, + 'the search string (can be empty)' + ) + ->addOption( + 'group', + null, + InputOption::VALUE_NONE, + 'searches groups instead of users' + ) + ->addOption( + 'offset', + null, + InputOption::VALUE_REQUIRED, + 'The offset of the result set. Needs to be a multiple of limit. defaults to 0.', + 0 + ) + ->addOption( + 'limit', + null, + InputOption::VALUE_REQUIRED, + 'limit the results. 0 means no limit, defaults to 15', + 15 + ) + ; + } + + /** + * Tests whether the offset and limit options are valid + * @param int $offset + * @param int $limit + * @throws \InvalidArgumentException + */ + protected function validateOffsetAndLimit($offset, $limit) { + if($limit < 0) { + throw new \InvalidArgumentException('limit must be 0 or greater'); + } + if($offset < 0) { + throw new \InvalidArgumentException('offset must be 0 or greater'); + } + if($limit === 0 && $offset !== 0) { + throw new \InvalidArgumentException('offset must be 0 if limit is also set to 0'); + } + if($offset > 0 && ($offset % $limit !== 0)) { + throw new \InvalidArgumentException('offset must be a multiple of limit'); + } + } + + protected function execute(InputInterface $input, OutputInterface $output) { + $helper = new Helper(); + $configPrefixes = $helper->getServerConfigurationPrefixes(true); + $ldapWrapper = new LDAP(); + + $offset = intval($input->getOption('offset')); + $limit = intval($input->getOption('limit')); + $this->validateOffsetAndLimit($offset, $limit); + + if($input->getOption('group')) { + $proxy = new Group_Proxy($configPrefixes, $ldapWrapper); + $getMethod = 'getGroups'; + $printID = false; + } else { + $proxy = new User_Proxy($configPrefixes, $ldapWrapper, $this->ocConfig); + $getMethod = 'getDisplayNames'; + $printID = true; + } + + $result = $proxy->$getMethod($input->getArgument('search'), $limit, $offset); + foreach($result as $id => $name) { + $line = $name . ($printID ? ' ('.$id.')' : ''); + $output->writeln($line); + } + } +} diff --git a/apps/user_ldap/command/setconfig.php b/apps/user_ldap/command/setconfig.php index ab1c8d39ead..9128fcf04fc 100644 --- a/apps/user_ldap/command/setconfig.php +++ b/apps/user_ldap/command/setconfig.php @@ -41,7 +41,8 @@ class SetConfig extends Command { } protected function execute(InputInterface $input, OutputInterface $output) { - $availableConfigs = Helper::getServerConfigurationPrefixes(); + $helper = new Helper(); + $availableConfigs = $helper->getServerConfigurationPrefixes(); $configID = $input->getArgument('configID'); if(!in_array($configID, $availableConfigs)) { $output->writeln("Invalid configID"); diff --git a/apps/user_ldap/command/showconfig.php b/apps/user_ldap/command/showconfig.php index f51d641beec..ddbc45243ff 100644 --- a/apps/user_ldap/command/showconfig.php +++ b/apps/user_ldap/command/showconfig.php @@ -31,7 +31,8 @@ class ShowConfig extends Command { } protected function execute(InputInterface $input, OutputInterface $output) { - $availableConfigs = Helper::getServerConfigurationPrefixes(); + $helper = new Helper(); + $availableConfigs = $helper->getServerConfigurationPrefixes(); $configID = $input->getArgument('configID'); if(!is_null($configID)) { $configIDs[] = $configID; diff --git a/apps/user_ldap/command/showremnants.php b/apps/user_ldap/command/showremnants.php new file mode 100644 index 00000000000..5cfab34ef95 --- /dev/null +++ b/apps/user_ldap/command/showremnants.php @@ -0,0 +1,73 @@ +<?php +/** + * Copyright (c) 2014 Arthur Schiwon <blizzz@owncloud.com> + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace OCA\user_ldap\Command; + +use Symfony\Component\Console\Command\Command; +use Symfony\Component\Console\Input\InputInterface; +use Symfony\Component\Console\Output\OutputInterface; + +use OCA\user_ldap\lib\user\DeletedUsersIndex; +use OCP\IDateTimeFormatter; + +class ShowRemnants extends Command { + /** @var \OCA\User_LDAP\lib\User\DeletedUsersIndex */ + protected $dui; + + /** @var \OCP\IDateTimeFormatter */ + protected $dateFormatter; + + /** + * @param OCA\user_ldap\lib\user\DeletedUsersIndex $dui + * @param OCP\IDateTimeFormatter $dateFormatter + */ + public function __construct(DeletedUsersIndex $dui, IDateTimeFormatter $dateFormatter) { + $this->dui = $dui; + $this->dateFormatter = $dateFormatter; + parent::__construct(); + } + + protected function configure() { + $this + ->setName('ldap:show-remnants') + ->setDescription('shows which users are not available on LDAP anymore, but have remnants in ownCloud.') + ; + } + + /** + * executes the command, i.e. creeates and outputs a table of LDAP users marked as deleted + * + * {@inheritdoc} + */ + protected function execute(InputInterface $input, OutputInterface $output) { + /** @var \Symfony\Component\Console\Helper\Table $table */ + $table = $this->getHelperSet()->get('table'); + $table->setHeaders(array( + 'ownCloud name', 'Display Name', 'LDAP UID', 'LDAP DN', 'Last Login', + 'Dir', 'Sharer')); + $rows = array(); + $resultSet = $this->dui->getUsers(); + foreach($resultSet as $user) { + $hAS = $user->getHasActiveShares() ? 'Y' : 'N'; + $lastLogin = ($user->getLastLogin() > 0) ? + $this->dateFormatter->formatDate($user->getLastLogin()) : '-'; + $rows[] = array( + $user->getOCName(), + $user->getDisplayName(), + $user->getUid(), + $user->getDN(), + $lastLogin, + $user->getHomePath(), + $hAS + ); + } + + $table->setRows($rows); + $table->render($output); + } +} diff --git a/apps/user_ldap/command/testconfig.php b/apps/user_ldap/command/testconfig.php index 00b4acf2f66..a44e22415e9 100644 --- a/apps/user_ldap/command/testconfig.php +++ b/apps/user_ldap/command/testconfig.php @@ -31,7 +31,8 @@ class TestConfig extends Command { } protected function execute(InputInterface $input, OutputInterface $output) { - $availableConfigs = Helper::getServerConfigurationPrefixes(); + $helper = new Helper(); + $availableConfigs = $helper->getServerConfigurationPrefixes(); $configID = $input->getArgument('configID'); if(!in_array($configID, $availableConfigs)) { $output->writeln("Invalid configID"); diff --git a/apps/user_ldap/js/ldapFilter.js b/apps/user_ldap/js/ldapFilter.js index bb66c1df2ee..0f7d240adac 100644 --- a/apps/user_ldap/js/ldapFilter.js +++ b/apps/user_ldap/js/ldapFilter.js @@ -8,6 +8,7 @@ function LdapFilter(target, determineModeCallback) { this.determineModeCallback = determineModeCallback; this.foundFeatures = false; this.activated = false; + this.countPending = false; if( target === 'User' || target === 'Login' || @@ -25,9 +26,13 @@ LdapFilter.prototype.activate = function() { this.determineMode(); }; -LdapFilter.prototype.compose = function(callback) { +LdapFilter.prototype.compose = function(updateCount) { var action; + if(updateCount === true) { + this.countPending = updateCount; + } + if(this.locked) { this.lazyRunCompose = true; return false; @@ -54,22 +59,36 @@ LdapFilter.prototype.compose = function(callback) { LdapWizard.ajax(param, function(result) { - LdapWizard.applyChanges(result); - filter.updateCount(); - if(filter.target === 'Group') { - LdapWizard.detectGroupMemberAssoc(); - } - if(typeof callback !== 'undefined') { - callback(); - } + filter.afterComposeSuccess(result); }, function () { + filter.countPending = false; console.log('LDAP Wizard: could not compose filter. '+ 'Please check owncloud.log'); } ); }; +/** + * this function is triggered after attribute detectors have completed in + * LdapWizard + */ +LdapFilter.prototype.afterDetectorsRan = function() { + this.updateCount(); +}; + +/** + * this function is triggered after LDAP filters have been composed successfully + * @param {object} result returned by the ajax call + */ +LdapFilter.prototype.afterComposeSuccess = function(result) { + LdapWizard.applyChanges(result); + if(this.countPending) { + this.countPending = false; + this.updateCount(); + } +}; + LdapFilter.prototype.determineMode = function() { var param = 'action=get'+encodeURIComponent(this.target)+'FilterMode'+ '&ldap_serverconfig_chooser='+ @@ -145,10 +164,26 @@ LdapFilter.prototype.findFeatures = function() { } }; +/** + * this function is triggered before user and group counts are executed + * resolving the passed status variable will fire up counting + * @param {object} status an instance of $.Deferred + */ +LdapFilter.prototype.beforeUpdateCount = function() { + var status = $.Deferred(); + LdapWizard.runDetectors(this.target, function() { + status.resolve(); + }); + return status; +}; + LdapFilter.prototype.updateCount = function(doneCallback) { - if(this.target === 'User') { - LdapWizard.countUsers(doneCallback); - } else if (this.target === 'Group') { - LdapWizard.countGroups(doneCallback); - } + var filter = this; + $.when(this.beforeUpdateCount()).done(function() { + if(filter.target === 'User') { + LdapWizard.countUsers(doneCallback); + } else if (filter.target === 'Group') { + LdapWizard.countGroups(doneCallback); + } + }); }; diff --git a/apps/user_ldap/js/settings.js b/apps/user_ldap/js/settings.js index fa40aba73b4..6db210fe435 100644 --- a/apps/user_ldap/js/settings.js +++ b/apps/user_ldap/js/settings.js @@ -151,8 +151,10 @@ var LdapWizard = { ajaxRequests: {}, ajax: function(param, fnOnSuccess, fnOnError, reqID) { - if(reqID !== undefined) { + if(!_.isUndefined(reqID)) { if(LdapWizard.ajaxRequests.hasOwnProperty(reqID)) { + console.log('aborting ' + reqID); + console.log(param); LdapWizard.ajaxRequests[reqID].abort(); } } @@ -167,9 +169,10 @@ var LdapWizard = { } } ); - if(reqID !== undefined) { + if(!_.isUndefined(reqID)) { LdapWizard.ajaxRequests[reqID] = request; } + return request; }, applyChanges: function (result) { @@ -342,7 +345,7 @@ var LdapWizard = { }, _countThings: function(method, spinnerID, doneCallback) { - param = 'action='+method+ + var param = 'action='+method+ '&ldap_serverconfig_chooser='+ encodeURIComponent($('#ldap_serverconfig_chooser').val()); @@ -351,14 +354,14 @@ var LdapWizard = { function(result) { LdapWizard.applyChanges(result); LdapWizard.hideSpinner(spinnerID); - if(doneCallback !== undefined) { + if(!_.isUndefined(doneCallback)) { doneCallback(method); } }, function (result) { OC.Notification.show('Counting the entries failed with, ' + result.message); LdapWizard.hideSpinner(spinnerID); - if(doneCallback !== undefined) { + if(!_.isUndefined(doneCallback)) { doneCallback(method); } }, @@ -374,12 +377,54 @@ var LdapWizard = { LdapWizard._countThings('countUsers', '#ldap_user_count', doneCallback); }, + /** + * called after detectors have run + * @callback runDetectorsCallback + */ + + /** + * runs detectors to determine appropriate attributes, e.g. displayName + * @param {string} type either "User" or "Group" + * @param {runDetectorsCallback} triggered after all detectors have completed + */ + runDetectors: function(type, callback) { + if(type === 'Group') { + $.when(LdapWizard.detectGroupMemberAssoc()) + .then(callback, callback); + if( LdapWizard.admin.isExperienced + && !(LdapWizard.detectorsRunInXPMode & LdapWizard.groupDetectors)) { + LdapWizard.detectorsRunInXPMode += LdapWizard.groupDetectors; + } + } else if(type === 'User') { + var req1 = LdapWizard.detectUserDisplayNameAttribute(); + var req2 = LdapWizard.detectEmailAttribute(); + $.when(req1, req2) + .then(callback, callback); + if( LdapWizard.admin.isExperienced + && !(LdapWizard.detectorsRunInXPMode & LdapWizard.userDetectors)) { + LdapWizard.detectorsRunInXPMode += LdapWizard.userDetectors; + } + } + }, + + /** + * runs detector to find out a fitting user display name attribute + */ + detectUserDisplayNameAttribute: function() { + var param = 'action=detectUserDisplayNameAttribute' + + '&ldap_serverconfig_chooser='+ + encodeURIComponent($('#ldap_serverconfig_chooser').val()); + + //runs in the background, no callbacks necessary + return LdapWizard.ajax(param, LdapWizard.applyChanges, function(){}, 'detectUserDisplayNameAttribute'); + }, + detectEmailAttribute: function() { - param = 'action=detectEmailAttribute'+ + var param = 'action=detectEmailAttribute'+ '&ldap_serverconfig_chooser='+ encodeURIComponent($('#ldap_serverconfig_chooser').val()); //runs in the background, no callbacks necessary - LdapWizard.ajax(param, LdapWizard.applyChanges, function(){}, 'detectEmailAttribute'); + return LdapWizard.ajax(param, LdapWizard.applyChanges, function(){}, 'detectEmailAttribute'); }, detectGroupMemberAssoc: function() { @@ -387,7 +432,7 @@ var LdapWizard = { '&ldap_serverconfig_chooser='+ encodeURIComponent($('#ldap_serverconfig_chooser').val()); - LdapWizard.ajax(param, + return LdapWizard.ajax(param, function(result) { //pure background story }, @@ -409,7 +454,7 @@ var LdapWizard = { $('#ldap_loginfilter_attributes').find('option').remove(); for (var i in result.options['ldap_loginfilter_attributes']) { //FIXME: move HTML into template - attr = result.options['ldap_loginfilter_attributes'][i]; + var attr = result.options['ldap_loginfilter_attributes'][i]; $('#ldap_loginfilter_attributes').append( "<option value='"+attr+"'>"+attr+"</option>"); } @@ -566,8 +611,12 @@ var LdapWizard = { }, isConfigurationActiveControlLocked: true, + detectorsRunInXPMode: 0, + userDetectors: 1, + groupDetectors: 2, init: function() { + LdapWizard.detectorsRunInXPMode = 0; LdapWizard.instantiateFilters(); LdapWizard.admin.setExperienced($('#ldap_experienced_admin').is(':checked')); LdapWizard.basicStatusCheck(); @@ -620,8 +669,9 @@ var LdapWizard = { instantiateFilters: function() { delete LdapWizard.userFilter; LdapWizard.userFilter = new LdapFilter('User', function(mode) { - if(mode === LdapWizard.filterModeAssisted) { - LdapWizard.groupFilter.updateCount(); + if( !LdapWizard.admin.isExperienced() + || mode === LdapWizard.filterModeAssisted) { + LdapWizard.userFilter.updateCount(); } LdapWizard.userFilter.findFeatures(); }); @@ -630,7 +680,6 @@ var LdapWizard = { $('#ldap_user_count').text(''); LdapWizard.showSpinner('#rawUserFilterContainer .ldapGetEntryCount'); LdapWizard.userFilter.updateCount(LdapWizard.hideTestSpinner); - LdapWizard.detectEmailAttribute(); $('#ldap_user_count').removeClass('hidden'); }); @@ -641,7 +690,8 @@ var LdapWizard = { delete LdapWizard.groupFilter; LdapWizard.groupFilter = new LdapFilter('Group', function(mode) { - if(mode === LdapWizard.filterModeAssisted) { + if( !LdapWizard.admin.isExperienced() + || mode === LdapWizard.filterModeAssisted) { LdapWizard.groupFilter.updateCount(); } LdapWizard.groupFilter.findFeatures(); @@ -651,7 +701,6 @@ var LdapWizard = { $('#ldap_group_count').text(''); LdapWizard.showSpinner('#rawGroupFilterContainer .ldapGetEntryCount'); LdapWizard.groupFilter.updateCount(LdapWizard.hideTestSpinner); - LdapWizard.detectGroupMemberAssoc(); $('#ldap_group_count').removeClass('hidden'); }); }, @@ -668,7 +717,7 @@ var LdapWizard = { postInitUserFilter: function() { if(LdapWizard.userFilterObjectClassesHasRun && LdapWizard.userFilterAvailableGroupsHasRun) { - LdapWizard.userFilter.compose(LdapWizard.detectEmailAttribute); + LdapWizard.userFilter.compose(); } }, @@ -679,7 +728,7 @@ var LdapWizard = { //do not allow to switch tabs as long as a save process is active return false; } - newTabIndex = 0; + var newTabIndex = 0; if(ui.newTab[0].id === '#ldapWizard2') { LdapWizard.initUserFilter(); newTabIndex = 1; @@ -691,9 +740,23 @@ var LdapWizard = { newTabIndex = 3; } - curTabIndex = $('#ldapSettings').tabs('option', 'active'); + var curTabIndex = $('#ldapSettings').tabs('option', 'active'); if(curTabIndex >= 0 && curTabIndex <= 3) { LdapWizard.controlUpdate(newTabIndex); + //run detectors in XP mode, when "Test Filter" button has not been + //clicked in order to make sure that email, displayname, member- + //group association attributes are properly set. + if( curTabIndex === 1 + && LdapWizard.admin.isExperienced + && !(LdapWizard.detecorsRunInXPMode & LdapWizard.userDetectors) + ) { + LdapWizard.runDetectors('User', function(){}); + } else if( curTabIndex === 3 + && LdapWizard.admin.isExperienced + && !(LdapWizard.detecorsRunInXPMode & LdapWizard.groupDetectors) + ) { + LdapWizard.runDetectors('Group', function(){}); + } } }, @@ -711,15 +774,15 @@ var LdapWizard = { } } - if(triggerObj.id === 'ldap_userlist_filter' && !LdapWizard.admin.isExperienced()) { - LdapWizard.detectEmailAttribute(); - } else if(triggerObj.id === 'ldap_group_filter' && !LdapWizard.admin.isExperienced()) { - LdapWizard.detectGroupMemberAssoc(); - } - if(triggerObj.id === 'ldap_loginfilter_username' || triggerObj.id === 'ldap_loginfilter_email') { LdapWizard.loginFilter.compose(); + } else if (!LdapWizard.admin.isExperienced()) { + if(triggerObj.id === 'ldap_userlist_filter') { + LdapWizard.userFilter.updateCount(); + } else if (triggerObj.id === 'ldap_group_filter') { + LdapWizard.groupFilter.updateCount(); + } } if($('#ldapSettings').tabs('option', 'active') == 0) { @@ -749,7 +812,7 @@ var LdapWizard = { LdapWizard._save($('#'+originalObj)[0], $.trim(values)); if(originalObj === 'ldap_userfilter_objectclass' || originalObj === 'ldap_userfilter_groups') { - LdapWizard.userFilter.compose(LdapWizard.detectEmailAttribute); + LdapWizard.userFilter.compose(true); //when user filter is changed afterwards, login filter needs to //be adjusted, too if(!LdapWizard.loginFilter) { @@ -760,7 +823,7 @@ var LdapWizard = { LdapWizard.loginFilter.compose(); } else if(originalObj === 'ldap_groupfilter_objectclass' || originalObj === 'ldap_groupfilter_groups') { - LdapWizard.groupFilter.compose(); + LdapWizard.groupFilter.compose(true); } }, @@ -830,10 +893,10 @@ var LdapWizard = { LdapWizard._save({ id: modeKey }, LdapWizard.filterModeAssisted); if(isUser) { LdapWizard.blacklistRemove('ldap_userlist_filter'); - LdapWizard.userFilter.compose(LdapWizard.detectEmailAttribute); + LdapWizard.userFilter.compose(true); } else { LdapWizard.blacklistRemove('ldap_group_filter'); - LdapWizard.groupFilter.compose(); + LdapWizard.groupFilter.compose(true); } } }, diff --git a/apps/user_ldap/l10n/af_ZA.js b/apps/user_ldap/l10n/af_ZA.js index fc00b542daa..610359a094c 100644 --- a/apps/user_ldap/l10n/af_ZA.js +++ b/apps/user_ldap/l10n/af_ZA.js @@ -1,6 +1,7 @@ OC.L10N.register( "user_ldap", { + "Error" : "Fout", "_%s group found_::_%s groups found_" : ["",""], "_%s user found_::_%s users found_" : ["",""], "Help" : "Hulp", diff --git a/apps/user_ldap/l10n/af_ZA.json b/apps/user_ldap/l10n/af_ZA.json index ec83ea0849a..05463be095e 100644 --- a/apps/user_ldap/l10n/af_ZA.json +++ b/apps/user_ldap/l10n/af_ZA.json @@ -1,4 +1,5 @@ { "translations": { + "Error" : "Fout", "_%s group found_::_%s groups found_" : ["",""], "_%s user found_::_%s users found_" : ["",""], "Help" : "Hulp", diff --git a/apps/user_ldap/l10n/ar.js b/apps/user_ldap/l10n/ar.js index c28875d7cdd..6b5cdf33d48 100644 --- a/apps/user_ldap/l10n/ar.js +++ b/apps/user_ldap/l10n/ar.js @@ -33,6 +33,7 @@ OC.L10N.register( "Confirm Deletion" : "تأكيد الحذف", "_%s group found_::_%s groups found_" : ["لا توجد مجموعات: %s","تم إيجاد %s مجموعة واحدة","تم إيجاد %s مجموعتين","تم إيجاد %s مجموعات","تم إيجاد %s مجموعة","تم إيجاد %s مجموعة/مجموعات"], "_%s user found_::_%s users found_" : ["","","","","",""], + "Server" : "خادم", "Save" : "حفظ", "Help" : "المساعدة", "Host" : "المضيف", diff --git a/apps/user_ldap/l10n/ar.json b/apps/user_ldap/l10n/ar.json index b546eb3a5dc..4bf07f625d5 100644 --- a/apps/user_ldap/l10n/ar.json +++ b/apps/user_ldap/l10n/ar.json @@ -31,6 +31,7 @@ "Confirm Deletion" : "تأكيد الحذف", "_%s group found_::_%s groups found_" : ["لا توجد مجموعات: %s","تم إيجاد %s مجموعة واحدة","تم إيجاد %s مجموعتين","تم إيجاد %s مجموعات","تم إيجاد %s مجموعة","تم إيجاد %s مجموعة/مجموعات"], "_%s user found_::_%s users found_" : ["","","","","",""], + "Server" : "خادم", "Save" : "حفظ", "Help" : "المساعدة", "Host" : "المضيف", diff --git a/apps/user_ldap/l10n/bg_BG.js b/apps/user_ldap/l10n/bg_BG.js index e6f45803985..91e48905138 100644 --- a/apps/user_ldap/l10n/bg_BG.js +++ b/apps/user_ldap/l10n/bg_BG.js @@ -76,6 +76,7 @@ OC.L10N.register( "Saving" : "Записване", "Back" : "Назад", "Continue" : "Продължи", + "LDAP" : "LDAP", "Expert" : "Експерт", "Advanced" : "Допълнителни", "<b>Warning:</b> Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behavior. Please ask your system administrator to disable one of them." : "<b>Предупреждение:</b> Приложенията user_ldap и user_webdavauth са несъвместими. Може да изпитате неочквано поведение. Моля, поискайте системния администратор да изключи едното приложение.", diff --git a/apps/user_ldap/l10n/bg_BG.json b/apps/user_ldap/l10n/bg_BG.json index f29aff72266..19ee8da4b33 100644 --- a/apps/user_ldap/l10n/bg_BG.json +++ b/apps/user_ldap/l10n/bg_BG.json @@ -74,6 +74,7 @@ "Saving" : "Записване", "Back" : "Назад", "Continue" : "Продължи", + "LDAP" : "LDAP", "Expert" : "Експерт", "Advanced" : "Допълнителни", "<b>Warning:</b> Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behavior. Please ask your system administrator to disable one of them." : "<b>Предупреждение:</b> Приложенията user_ldap и user_webdavauth са несъвместими. Може да изпитате неочквано поведение. Моля, поискайте системния администратор да изключи едното приложение.", diff --git a/apps/user_ldap/l10n/bs.js b/apps/user_ldap/l10n/bs.js index feccd314874..6f1651beb74 100644 --- a/apps/user_ldap/l10n/bs.js +++ b/apps/user_ldap/l10n/bs.js @@ -1,8 +1,15 @@ OC.L10N.register( "user_ldap", { + "Deletion failed" : "Brisanje nije uspjelo", + "Error" : "Greška", "_%s group found_::_%s groups found_" : ["","",""], "_%s user found_::_%s users found_" : ["","",""], - "Save" : "Spasi" + "Save" : "Spasi", + "Help" : "Pomoć", + "Port" : "Priključak", + "Password" : "Lozinka", + "Continue" : "Nastavi", + "Advanced" : "Napredno" }, "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/apps/user_ldap/l10n/bs.json b/apps/user_ldap/l10n/bs.json index 42f5ec1bffc..b624292102c 100644 --- a/apps/user_ldap/l10n/bs.json +++ b/apps/user_ldap/l10n/bs.json @@ -1,6 +1,13 @@ { "translations": { + "Deletion failed" : "Brisanje nije uspjelo", + "Error" : "Greška", "_%s group found_::_%s groups found_" : ["","",""], "_%s user found_::_%s users found_" : ["","",""], - "Save" : "Spasi" + "Save" : "Spasi", + "Help" : "Pomoć", + "Port" : "Priključak", + "Password" : "Lozinka", + "Continue" : "Nastavi", + "Advanced" : "Napredno" },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/cs_CZ.js b/apps/user_ldap/l10n/cs_CZ.js index 793fd61c4b3..058f99d69ab 100644 --- a/apps/user_ldap/l10n/cs_CZ.js +++ b/apps/user_ldap/l10n/cs_CZ.js @@ -33,6 +33,7 @@ OC.L10N.register( "Confirm Deletion" : "Potvrdit smazání", "_%s group found_::_%s groups found_" : ["nalezena %s skupina","nalezeny %s skupiny","nalezeno %s skupin"], "_%s user found_::_%s users found_" : ["nalezen %s uživatel","nalezeni %s uživatelé","nalezeno %s uživatelů"], + "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "Nelze detekovat atribut pro zobrazení jména uživatele. Upřesněte ho prosím sami v rozšířeném nastavení LDAP.", "Could not find the desired feature" : "Nelze nalézt požadovanou vlastnost", "Invalid Host" : "Neplatný hostitel", "Server" : "Server", @@ -52,7 +53,7 @@ OC.L10N.register( "groups found" : "nalezené skupiny", "Users login with this attribute:" : "Uživatelé se přihlašují s tímto atributem:", "LDAP Username:" : "LDAP uživatelské jméno:", - "LDAP Email Address:" : "LDAP e-mailová adresa:", + "LDAP Email Address:" : "LDAP emailová adresa:", "Other Attributes:" : "Další atributy:", "Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" : "Určuje použitý filtr při pokusu o přihlášení. %%uid nahrazuje uživatelské jméno v činnosti přihlášení. Příklad: \"uid=%%uid\"", "1. Server" : "1. Server", @@ -69,7 +70,7 @@ OC.L10N.register( "One Base DN per line" : "Jedna základní DN na řádku", "You can specify Base DN for users and groups in the Advanced tab" : "V rozšířeném nastavení můžete určit základní DN pro uživatele a skupiny", "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Zabraňuje automatickým LDAP požadavkům. Výhodné pro objemná nastavení, ale vyžaduje znalosti o LDAP.", - "Manually enter LDAP filters (recommended for large directories)" : "Ručně vložit LDAP filtry (doporučené pro obsáhlé adresáře)", + "Manually enter LDAP filters (recommended for large directories)" : "Ručně vložit LDAP filtry (doporučeno pro obsáhlé adresáře)", "Limit %s access to users meeting these criteria:" : "Omezit přístup %s uživatelům splňujícím tyto podmínky:", "The filter specifies which LDAP users shall have access to the %s instance." : "Filtr určuje, kteří uživatelé LDAP mají mít přístup k instanci %s.", "users found" : "nalezení uživatelé", @@ -79,7 +80,7 @@ OC.L10N.register( "LDAP" : "LDAP", "Expert" : "Expertní", "Advanced" : "Pokročilé", - "<b>Warning:</b> Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behavior. Please ask your system administrator to disable one of them." : "<b>Varování:</b> Aplikace user_ldap a user_webdavauth jsou vzájemně nekompatibilní. Můžete zaznamenat neočekávané chování. Požádejte prosím vašeho systémového administrátora o zakázání jednoho z nich.", + "<b>Warning:</b> Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behavior. Please ask your system administrator to disable one of them." : "<b>Varování:</b> Aplikace user_ldap a user_webdavauth jsou vzájemně nekompatibilní. Můžete zaznamenat neočekávané chování. Požádejte prosím svého správce systému o zakázání jedné z nich.", "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Varování:</b> není nainstalován LDAP modul pro PHP, podpůrná vrstva nebude fungovat. Požádejte, prosím, správce systému, aby jej nainstaloval.", "Connection Settings" : "Nastavení spojení", "Configuration Active" : "Nastavení aktivní", @@ -115,7 +116,7 @@ OC.L10N.register( "Quota Field" : "Pole pro kvótu", "Quota Default" : "Výchozí kvóta", "in bytes" : "v bajtech", - "Email Field" : "Pole e-mailu", + "Email Field" : "Pole emailu", "User Home Folder Naming Rule" : "Pravidlo pojmenování domovské složky uživatele", "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Ponechte prázdné pro uživatelské jméno (výchozí). Jinak uveďte LDAP/AD parametr.", "Internal Username" : "Interní uživatelské jméno", diff --git a/apps/user_ldap/l10n/cs_CZ.json b/apps/user_ldap/l10n/cs_CZ.json index fb906cb7d9c..640d1cf44c4 100644 --- a/apps/user_ldap/l10n/cs_CZ.json +++ b/apps/user_ldap/l10n/cs_CZ.json @@ -31,6 +31,7 @@ "Confirm Deletion" : "Potvrdit smazání", "_%s group found_::_%s groups found_" : ["nalezena %s skupina","nalezeny %s skupiny","nalezeno %s skupin"], "_%s user found_::_%s users found_" : ["nalezen %s uživatel","nalezeni %s uživatelé","nalezeno %s uživatelů"], + "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "Nelze detekovat atribut pro zobrazení jména uživatele. Upřesněte ho prosím sami v rozšířeném nastavení LDAP.", "Could not find the desired feature" : "Nelze nalézt požadovanou vlastnost", "Invalid Host" : "Neplatný hostitel", "Server" : "Server", @@ -50,7 +51,7 @@ "groups found" : "nalezené skupiny", "Users login with this attribute:" : "Uživatelé se přihlašují s tímto atributem:", "LDAP Username:" : "LDAP uživatelské jméno:", - "LDAP Email Address:" : "LDAP e-mailová adresa:", + "LDAP Email Address:" : "LDAP emailová adresa:", "Other Attributes:" : "Další atributy:", "Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" : "Určuje použitý filtr při pokusu o přihlášení. %%uid nahrazuje uživatelské jméno v činnosti přihlášení. Příklad: \"uid=%%uid\"", "1. Server" : "1. Server", @@ -67,7 +68,7 @@ "One Base DN per line" : "Jedna základní DN na řádku", "You can specify Base DN for users and groups in the Advanced tab" : "V rozšířeném nastavení můžete určit základní DN pro uživatele a skupiny", "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Zabraňuje automatickým LDAP požadavkům. Výhodné pro objemná nastavení, ale vyžaduje znalosti o LDAP.", - "Manually enter LDAP filters (recommended for large directories)" : "Ručně vložit LDAP filtry (doporučené pro obsáhlé adresáře)", + "Manually enter LDAP filters (recommended for large directories)" : "Ručně vložit LDAP filtry (doporučeno pro obsáhlé adresáře)", "Limit %s access to users meeting these criteria:" : "Omezit přístup %s uživatelům splňujícím tyto podmínky:", "The filter specifies which LDAP users shall have access to the %s instance." : "Filtr určuje, kteří uživatelé LDAP mají mít přístup k instanci %s.", "users found" : "nalezení uživatelé", @@ -77,7 +78,7 @@ "LDAP" : "LDAP", "Expert" : "Expertní", "Advanced" : "Pokročilé", - "<b>Warning:</b> Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behavior. Please ask your system administrator to disable one of them." : "<b>Varování:</b> Aplikace user_ldap a user_webdavauth jsou vzájemně nekompatibilní. Můžete zaznamenat neočekávané chování. Požádejte prosím vašeho systémového administrátora o zakázání jednoho z nich.", + "<b>Warning:</b> Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behavior. Please ask your system administrator to disable one of them." : "<b>Varování:</b> Aplikace user_ldap a user_webdavauth jsou vzájemně nekompatibilní. Můžete zaznamenat neočekávané chování. Požádejte prosím svého správce systému o zakázání jedné z nich.", "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Varování:</b> není nainstalován LDAP modul pro PHP, podpůrná vrstva nebude fungovat. Požádejte, prosím, správce systému, aby jej nainstaloval.", "Connection Settings" : "Nastavení spojení", "Configuration Active" : "Nastavení aktivní", @@ -113,7 +114,7 @@ "Quota Field" : "Pole pro kvótu", "Quota Default" : "Výchozí kvóta", "in bytes" : "v bajtech", - "Email Field" : "Pole e-mailu", + "Email Field" : "Pole emailu", "User Home Folder Naming Rule" : "Pravidlo pojmenování domovské složky uživatele", "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Ponechte prázdné pro uživatelské jméno (výchozí). Jinak uveďte LDAP/AD parametr.", "Internal Username" : "Interní uživatelské jméno", diff --git a/apps/user_ldap/l10n/da.js b/apps/user_ldap/l10n/da.js index 91bce8c777e..fb6feccc4b6 100644 --- a/apps/user_ldap/l10n/da.js +++ b/apps/user_ldap/l10n/da.js @@ -33,6 +33,7 @@ OC.L10N.register( "Confirm Deletion" : "Bekræft Sletning", "_%s group found_::_%s groups found_" : ["Der blev fundet %s gruppe","Der blev fundet %s grupper"], "_%s user found_::_%s users found_" : ["Der blev fundet %s bruger","Der blev fundet %s brugere"], + "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "Kunne ikke registrere navneattributten for visning af bruger. Angiv den venligst selv i de avancerede ldap-indstillinger.", "Could not find the desired feature" : "Fandt ikke den ønskede funktion", "Invalid Host" : "Ugyldig vært", "Server" : "Server", diff --git a/apps/user_ldap/l10n/da.json b/apps/user_ldap/l10n/da.json index 97d0c0ca403..0332afc101d 100644 --- a/apps/user_ldap/l10n/da.json +++ b/apps/user_ldap/l10n/da.json @@ -31,6 +31,7 @@ "Confirm Deletion" : "Bekræft Sletning", "_%s group found_::_%s groups found_" : ["Der blev fundet %s gruppe","Der blev fundet %s grupper"], "_%s user found_::_%s users found_" : ["Der blev fundet %s bruger","Der blev fundet %s brugere"], + "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "Kunne ikke registrere navneattributten for visning af bruger. Angiv den venligst selv i de avancerede ldap-indstillinger.", "Could not find the desired feature" : "Fandt ikke den ønskede funktion", "Invalid Host" : "Ugyldig vært", "Server" : "Server", diff --git a/apps/user_ldap/l10n/de.js b/apps/user_ldap/l10n/de.js index 94f388b0df4..545fb9c194f 100644 --- a/apps/user_ldap/l10n/de.js +++ b/apps/user_ldap/l10n/de.js @@ -33,6 +33,7 @@ OC.L10N.register( "Confirm Deletion" : "Löschung bestätigen", "_%s group found_::_%s groups found_" : ["%s Gruppe gefunden","%s Gruppen gefunden"], "_%s user found_::_%s users found_" : ["%s Benutzer gefunden","%s Benutzer gefunden"], + "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "Das Benutzeranzeigename-Attribut konnte nicht gefunden werden. Bitte gib es selber in den erweiterten LDAP-Einstellungen an.", "Could not find the desired feature" : "Konnte die gewünschte Funktion nicht finden", "Invalid Host" : "Ungültiger Host", "Server" : "Server", diff --git a/apps/user_ldap/l10n/de.json b/apps/user_ldap/l10n/de.json index f3524664fc1..df0f777536a 100644 --- a/apps/user_ldap/l10n/de.json +++ b/apps/user_ldap/l10n/de.json @@ -31,6 +31,7 @@ "Confirm Deletion" : "Löschung bestätigen", "_%s group found_::_%s groups found_" : ["%s Gruppe gefunden","%s Gruppen gefunden"], "_%s user found_::_%s users found_" : ["%s Benutzer gefunden","%s Benutzer gefunden"], + "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "Das Benutzeranzeigename-Attribut konnte nicht gefunden werden. Bitte gib es selber in den erweiterten LDAP-Einstellungen an.", "Could not find the desired feature" : "Konnte die gewünschte Funktion nicht finden", "Invalid Host" : "Ungültiger Host", "Server" : "Server", diff --git a/apps/user_ldap/l10n/de_DE.js b/apps/user_ldap/l10n/de_DE.js index 3cefc2ec625..c89d7793a4a 100644 --- a/apps/user_ldap/l10n/de_DE.js +++ b/apps/user_ldap/l10n/de_DE.js @@ -33,6 +33,7 @@ OC.L10N.register( "Confirm Deletion" : "Löschung bestätigen", "_%s group found_::_%s groups found_" : ["%s Gruppe gefunden","%s Gruppen gefunden"], "_%s user found_::_%s users found_" : ["%s Benutzer gefunden","%s Benutzer gefunden"], + "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "Das Benutzeranzeigename-Attribut konnte nicht gefunden werden. Bitte geben Sie es selber in den erweiterten LDAP-Einstellungen an.", "Could not find the desired feature" : "Konnte die gewünschte Funktion nicht finden", "Invalid Host" : "Ungültiger Host", "Server" : "Server", diff --git a/apps/user_ldap/l10n/de_DE.json b/apps/user_ldap/l10n/de_DE.json index cf823ca29d4..7b047cbcd2f 100644 --- a/apps/user_ldap/l10n/de_DE.json +++ b/apps/user_ldap/l10n/de_DE.json @@ -31,6 +31,7 @@ "Confirm Deletion" : "Löschung bestätigen", "_%s group found_::_%s groups found_" : ["%s Gruppe gefunden","%s Gruppen gefunden"], "_%s user found_::_%s users found_" : ["%s Benutzer gefunden","%s Benutzer gefunden"], + "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "Das Benutzeranzeigename-Attribut konnte nicht gefunden werden. Bitte geben Sie es selber in den erweiterten LDAP-Einstellungen an.", "Could not find the desired feature" : "Konnte die gewünschte Funktion nicht finden", "Invalid Host" : "Ungültiger Host", "Server" : "Server", diff --git a/apps/user_ldap/l10n/el.js b/apps/user_ldap/l10n/el.js index 8018ea00766..098fc25fa6f 100644 --- a/apps/user_ldap/l10n/el.js +++ b/apps/user_ldap/l10n/el.js @@ -33,6 +33,7 @@ OC.L10N.register( "Confirm Deletion" : "Επιβεβαίωση Διαγραφής", "_%s group found_::_%s groups found_" : ["%s ομάδα βρέθηκε","%s ομάδες βρέθηκαν"], "_%s user found_::_%s users found_" : ["%s χρήστης βρέθηκε","%s χρήστες βρέθηκαν"], + "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "Δεν ήταν δυνατή η ανίχνευση της ιδιότητας του εμφανιζόμενου ονόματος χρήστη . Παρακαλείστε να το προσδιορίσετε στις προηγμένες ρυθμίσεις LDAP", "Could not find the desired feature" : "Αδυναμία εύρεσης επιθυμητου χαρακτηριστικού", "Invalid Host" : "Άκυρος εξυπηρετητής", "Server" : "Διακομιστής", @@ -76,6 +77,7 @@ OC.L10N.register( "Saving" : "Αποθήκευση", "Back" : "Επιστροφή", "Continue" : "Συνέχεια", + "LDAP" : "LDAP", "Expert" : "Ειδικός", "Advanced" : "Για προχωρημένους", "<b>Warning:</b> Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behavior. Please ask your system administrator to disable one of them." : "<b>Προσοχή:</b> Οι εφαρμογές user_ldap και user_webdavauth είναι ασύμβατες. Μπορεί να αντιμετωπίσετε απρόβλεπτη συμπεριφορά. Παρακαλώ ζητήστε από τον διαχειριστή συστήματος να απενεργοποιήσει μία από αυτές.", diff --git a/apps/user_ldap/l10n/el.json b/apps/user_ldap/l10n/el.json index bd8b6aa6170..44119559c08 100644 --- a/apps/user_ldap/l10n/el.json +++ b/apps/user_ldap/l10n/el.json @@ -31,6 +31,7 @@ "Confirm Deletion" : "Επιβεβαίωση Διαγραφής", "_%s group found_::_%s groups found_" : ["%s ομάδα βρέθηκε","%s ομάδες βρέθηκαν"], "_%s user found_::_%s users found_" : ["%s χρήστης βρέθηκε","%s χρήστες βρέθηκαν"], + "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "Δεν ήταν δυνατή η ανίχνευση της ιδιότητας του εμφανιζόμενου ονόματος χρήστη . Παρακαλείστε να το προσδιορίσετε στις προηγμένες ρυθμίσεις LDAP", "Could not find the desired feature" : "Αδυναμία εύρεσης επιθυμητου χαρακτηριστικού", "Invalid Host" : "Άκυρος εξυπηρετητής", "Server" : "Διακομιστής", @@ -74,6 +75,7 @@ "Saving" : "Αποθήκευση", "Back" : "Επιστροφή", "Continue" : "Συνέχεια", + "LDAP" : "LDAP", "Expert" : "Ειδικός", "Advanced" : "Για προχωρημένους", "<b>Warning:</b> Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behavior. Please ask your system administrator to disable one of them." : "<b>Προσοχή:</b> Οι εφαρμογές user_ldap και user_webdavauth είναι ασύμβατες. Μπορεί να αντιμετωπίσετε απρόβλεπτη συμπεριφορά. Παρακαλώ ζητήστε από τον διαχειριστή συστήματος να απενεργοποιήσει μία από αυτές.", diff --git a/apps/user_ldap/l10n/en_GB.js b/apps/user_ldap/l10n/en_GB.js index d87ce836807..9476b44dde0 100644 --- a/apps/user_ldap/l10n/en_GB.js +++ b/apps/user_ldap/l10n/en_GB.js @@ -33,6 +33,7 @@ OC.L10N.register( "Confirm Deletion" : "Confirm Deletion", "_%s group found_::_%s groups found_" : ["%s group found","%s groups found"], "_%s user found_::_%s users found_" : ["%s user found","%s users found"], + "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings.", "Could not find the desired feature" : "Could not find the desired feature", "Invalid Host" : "Invalid Host", "Server" : "Server", diff --git a/apps/user_ldap/l10n/en_GB.json b/apps/user_ldap/l10n/en_GB.json index 8fd6ed30d4f..fd6861a5184 100644 --- a/apps/user_ldap/l10n/en_GB.json +++ b/apps/user_ldap/l10n/en_GB.json @@ -31,6 +31,7 @@ "Confirm Deletion" : "Confirm Deletion", "_%s group found_::_%s groups found_" : ["%s group found","%s groups found"], "_%s user found_::_%s users found_" : ["%s user found","%s users found"], + "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings.", "Could not find the desired feature" : "Could not find the desired feature", "Invalid Host" : "Invalid Host", "Server" : "Server", diff --git a/apps/user_ldap/l10n/es.js b/apps/user_ldap/l10n/es.js index 172d32c9092..731213be81c 100644 --- a/apps/user_ldap/l10n/es.js +++ b/apps/user_ldap/l10n/es.js @@ -33,11 +33,12 @@ OC.L10N.register( "Confirm Deletion" : "Confirmar eliminación", "_%s group found_::_%s groups found_" : ["Grupo %s encontrado","Grupos %s encontrados"], "_%s user found_::_%s users found_" : ["Usuario %s encontrado","Usuarios %s encontrados"], + "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "No se pudo detectar el atributo de nombre de usuario pantalla. Por favor especifique lo mismo en ajustes avanzados ldap.", "Could not find the desired feature" : "No se puede encontrar la función deseada.", "Invalid Host" : "Host inválido", "Server" : "Servidor", "User Filter" : "Filtro de usuario", - "Login Filter" : "Filtro de Login", + "Login Filter" : "Filtro de login", "Group Filter" : "Filtro de grupo", "Save" : "Guardar", "Test Configuration" : "Configuración de prueba", @@ -58,7 +59,7 @@ OC.L10N.register( "1. Server" : "1. Servidor", "%s. Server:" : "%s. Servidor:", "Add Server Configuration" : "Agregar configuracion del servidor", - "Delete Configuration" : "Borrar Configuración", + "Delete Configuration" : "Borrar configuración", "Host" : "Servidor", "You can omit the protocol, except you require SSL. Then start with ldaps://" : "Puede omitir el protocolo, excepto si requiere SSL. En ese caso, empiece con ldaps://", "Port" : "Puerto", @@ -68,7 +69,7 @@ OC.L10N.register( "For anonymous access, leave DN and Password empty." : "Para acceso anónimo, deje DN y contraseña vacíos.", "One Base DN per line" : "Un DN Base por línea", "You can specify Base DN for users and groups in the Advanced tab" : "Puede especificar el DN base para usuarios y grupos en la pestaña Avanzado", - "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Evita peticiones automaticas al LDAP. Mejor para grandes configuraciones, pero requiere algun conocimiento de LDAP", + "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Evita peticiones automáticas al LDAP. Mejor para grandes configuraciones, pero requiere cierto conocimiento de LDAP.", "Manually enter LDAP filters (recommended for large directories)" : "Ingrese manualmente los filtros LDAP (Recomendado para grandes directorios)", "Limit %s access to users meeting these criteria:" : "Limitar el acceso a %s a los usuarios que cumplan estos criterios:", "The filter specifies which LDAP users shall have access to the %s instance." : "El filtro especifica que usuarios LDAP pueden tener acceso a %s.", @@ -108,7 +109,7 @@ OC.L10N.register( "Group Search Attributes" : "Atributos de busqueda de grupo", "Group-Member association" : "Asociación Grupo-Miembro", "Nested Groups" : "Grupos anidados", - "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Cuando se active, se permitirán grupos que contenga otros grupos (solo funciona si el atributo de miembro de grupo contiene DNs).", + "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Cuando se active, se permitirán grupos que contengan otros grupos (solo funciona si el atributo de miembro de grupo contiene DNs).", "Paging chunksize" : "Tamaño de los fragmentos de paginación", "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Tamaño de los fragmentos usado para búsquedas LDAP paginadas que pueden devolver resultados voluminosos, como enumeración de usuarios o de grupos. (Si se establece en 0, se deshabilitan las búsquedas LDAP paginadas en esas situaciones.)", "Special Attributes" : "Atributos especiales", diff --git a/apps/user_ldap/l10n/es.json b/apps/user_ldap/l10n/es.json index b0308c4cbaf..b5a07d210a4 100644 --- a/apps/user_ldap/l10n/es.json +++ b/apps/user_ldap/l10n/es.json @@ -31,11 +31,12 @@ "Confirm Deletion" : "Confirmar eliminación", "_%s group found_::_%s groups found_" : ["Grupo %s encontrado","Grupos %s encontrados"], "_%s user found_::_%s users found_" : ["Usuario %s encontrado","Usuarios %s encontrados"], + "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "No se pudo detectar el atributo de nombre de usuario pantalla. Por favor especifique lo mismo en ajustes avanzados ldap.", "Could not find the desired feature" : "No se puede encontrar la función deseada.", "Invalid Host" : "Host inválido", "Server" : "Servidor", "User Filter" : "Filtro de usuario", - "Login Filter" : "Filtro de Login", + "Login Filter" : "Filtro de login", "Group Filter" : "Filtro de grupo", "Save" : "Guardar", "Test Configuration" : "Configuración de prueba", @@ -56,7 +57,7 @@ "1. Server" : "1. Servidor", "%s. Server:" : "%s. Servidor:", "Add Server Configuration" : "Agregar configuracion del servidor", - "Delete Configuration" : "Borrar Configuración", + "Delete Configuration" : "Borrar configuración", "Host" : "Servidor", "You can omit the protocol, except you require SSL. Then start with ldaps://" : "Puede omitir el protocolo, excepto si requiere SSL. En ese caso, empiece con ldaps://", "Port" : "Puerto", @@ -66,7 +67,7 @@ "For anonymous access, leave DN and Password empty." : "Para acceso anónimo, deje DN y contraseña vacíos.", "One Base DN per line" : "Un DN Base por línea", "You can specify Base DN for users and groups in the Advanced tab" : "Puede especificar el DN base para usuarios y grupos en la pestaña Avanzado", - "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Evita peticiones automaticas al LDAP. Mejor para grandes configuraciones, pero requiere algun conocimiento de LDAP", + "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Evita peticiones automáticas al LDAP. Mejor para grandes configuraciones, pero requiere cierto conocimiento de LDAP.", "Manually enter LDAP filters (recommended for large directories)" : "Ingrese manualmente los filtros LDAP (Recomendado para grandes directorios)", "Limit %s access to users meeting these criteria:" : "Limitar el acceso a %s a los usuarios que cumplan estos criterios:", "The filter specifies which LDAP users shall have access to the %s instance." : "El filtro especifica que usuarios LDAP pueden tener acceso a %s.", @@ -106,7 +107,7 @@ "Group Search Attributes" : "Atributos de busqueda de grupo", "Group-Member association" : "Asociación Grupo-Miembro", "Nested Groups" : "Grupos anidados", - "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Cuando se active, se permitirán grupos que contenga otros grupos (solo funciona si el atributo de miembro de grupo contiene DNs).", + "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Cuando se active, se permitirán grupos que contengan otros grupos (solo funciona si el atributo de miembro de grupo contiene DNs).", "Paging chunksize" : "Tamaño de los fragmentos de paginación", "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Tamaño de los fragmentos usado para búsquedas LDAP paginadas que pueden devolver resultados voluminosos, como enumeración de usuarios o de grupos. (Si se establece en 0, se deshabilitan las búsquedas LDAP paginadas en esas situaciones.)", "Special Attributes" : "Atributos especiales", diff --git a/apps/user_ldap/l10n/fi.js b/apps/user_ldap/l10n/fi.js new file mode 100644 index 00000000000..909c5227514 --- /dev/null +++ b/apps/user_ldap/l10n/fi.js @@ -0,0 +1,13 @@ +OC.L10N.register( + "user_ldap", + { + "Error" : "Virhe", + "_%s group found_::_%s groups found_" : ["",""], + "_%s user found_::_%s users found_" : ["",""], + "Server" : "Palvelin", + "Save" : "Tallenna", + "Help" : "Apua", + "Password" : "Salasana", + "Back" : "Takaisin" +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_ldap/l10n/fi.json b/apps/user_ldap/l10n/fi.json new file mode 100644 index 00000000000..053bb453f7f --- /dev/null +++ b/apps/user_ldap/l10n/fi.json @@ -0,0 +1,11 @@ +{ "translations": { + "Error" : "Virhe", + "_%s group found_::_%s groups found_" : ["",""], + "_%s user found_::_%s users found_" : ["",""], + "Server" : "Palvelin", + "Save" : "Tallenna", + "Help" : "Apua", + "Password" : "Salasana", + "Back" : "Takaisin" +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/user_ldap/l10n/fr.js b/apps/user_ldap/l10n/fr.js index 74bc9533eb4..cd7ef4d0005 100644 --- a/apps/user_ldap/l10n/fr.js +++ b/apps/user_ldap/l10n/fr.js @@ -4,8 +4,8 @@ OC.L10N.register( "Failed to clear the mappings." : "Erreur lors de la suppression des associations.", "Failed to delete the server configuration" : "Échec de la suppression de la configuration du serveur", "The configuration is valid and the connection could be established!" : "La configuration est valide et la connexion peut être établie !", - "The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "La configuration est valide, mais le lien ne peut être établi. Veuillez vérifier les paramètres du serveur ainsi que vos identifiants de connexion.", - "The configuration is invalid. Please have a look at the logs for further details." : "La configuration est invalide. Veuillez consulter les logs pour plus de détails.", + "The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "La configuration est valable, mais le bind a échoué. Veuillez vérifier les paramètres du serveur ainsi que vos identifiants de connexion.", + "The configuration is invalid. Please have a look at the logs for further details." : "La configuration n'est pas valable. Veuillez consulter les logs pour plus de détails.", "No action specified" : "Aucune action spécifiée", "No configuration specified" : "Aucune configuration spécifiée", "No data specified" : "Aucune donnée spécifiée", @@ -33,6 +33,7 @@ OC.L10N.register( "Confirm Deletion" : "Confirmer la suppression", "_%s group found_::_%s groups found_" : ["%s groupe trouvé","%s groupes trouvés"], "_%s user found_::_%s users found_" : ["%s utilisateur trouvé","%s utilisateurs trouvés"], + "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "Impossible de détecter l'attribut contenant le nom d'affichage des utilisateurs. Veuillez l'indiquer vous-même dans les paramètres ldap avancés.", "Could not find the desired feature" : "Impossible de trouver la fonction souhaitée", "Invalid Host" : "Hôte invalide", "Server" : "Serveur", @@ -56,7 +57,7 @@ OC.L10N.register( "Other Attributes:" : "Autres attributs :", "Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" : "Définit le filtre à appliquer lors d'une tentative de connexion. %%uid remplace le nom d'utilisateur lors de la connexion. Exemple : \"uid=%%uid\"", "1. Server" : "1. Serveur", - "%s. Server:" : "%s. Serveur:", + "%s. Server:" : "%s. Serveur :", "Add Server Configuration" : "Ajouter une configuration du serveur", "Delete Configuration" : "Suppression de la configuration", "Host" : "Hôte", @@ -90,25 +91,25 @@ OC.L10N.register( "Disable Main Server" : "Désactiver le serveur principal", "Only connect to the replica server." : "Se connecter uniquement au serveur de replica.", "Case insensitive LDAP server (Windows)" : "Serveur LDAP insensible à la casse (Windows)", - "Turn off SSL certificate validation." : "Désactiver la validation du certificat SSL.", + "Turn off SSL certificate validation." : "Désactiver la validation des certificats SSL.", "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "Non recommandé, à utiliser à des fins de tests uniquement. Si la connexion ne fonctionne qu'avec cette option, importez le certificat SSL du serveur LDAP dans le serveur %s.", - "Cache Time-To-Live" : "Durée de vie du cache", + "Cache Time-To-Live" : "Durée de vie du cache (TTL)", "in seconds. A change empties the cache." : "en secondes. Tout changement vide le cache.", "Directory Settings" : "Paramètres du répertoire", "User Display Name Field" : "Champ \"nom d'affichage\" de l'utilisateur", - "The LDAP attribute to use to generate the user's display name." : "L'attribut LDAP utilisé pour générer le nom d'utilisateur affiché.", + "The LDAP attribute to use to generate the user's display name." : "L'attribut LDAP utilisé pour générer le nom d'affichage de l'utilisateur.", "Base User Tree" : "DN racine de l'arbre utilisateurs", "One User Base DN per line" : "Un DN racine utilisateur par ligne", "User Search Attributes" : "Recherche des attributs utilisateur", "Optional; one attribute per line" : "Optionnel, un attribut par ligne", "Group Display Name Field" : "Champ \"nom d'affichage\" du groupe", - "The LDAP attribute to use to generate the groups's display name." : "L'attribut LDAP utilisé pour générer le nom de groupe affiché.", + "The LDAP attribute to use to generate the groups's display name." : "L'attribut LDAP utilisé pour générer le nom d'affichage du groupe.", "Base Group Tree" : "DN racine de l'arbre groupes", "One Group Base DN per line" : "Un DN racine groupe par ligne", "Group Search Attributes" : "Recherche des attributs du groupe", "Group-Member association" : "Association groupe-membre", "Nested Groups" : "Groupes imbriqués", - "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Si activé, les groupes contenant d'autres groupes sont supportés (fonctionne uniquement si l'attribut membre du groupe contient des DNs).", + "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Si activé, les groupes contenant d'autres groupes sont pris en charge (fonctionne uniquement si l'attribut membre du groupe contient des DNs).", "Paging chunksize" : "Dimensionnement des paginations", "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "La taille d'une part (chunksize) est utilisée pour les recherches paginées de LDAP qui peuvent retourner des résultats par lots comme une énumération d'utilisateurs ou groupes. (Configurer à 0 pour désactiver les recherches paginées de LDAP.)", "Special Attributes" : "Attributs spéciaux", @@ -119,8 +120,8 @@ OC.L10N.register( "User Home Folder Naming Rule" : "Convention de nommage du répertoire utilisateur", "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Laisser vide ", "Internal Username" : "Nom d'utilisateur interne", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. To achieve a similar behavior as before ownCloud 5 enter the user display name attribute in the following field. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Par défaut le nom d'utilisateur interne sera créé à partir de l'attribut UUID. Ceci permet d'assurer que le nom d'utilisateur est unique et que les caractères ne nécessitent pas de conversion. Le nom d'utilisateur interne doit contenir uniquement les caractères suivants : [ a-zA-Z0-9_.@- ]. Les autres caractères sont remplacés par leur correspondance ASCII ou simplement omis. En cas de collision, un nombre est incrémenté/décrémenté. Le nom d'utilisateur interne est utilisé pour identifier l'utilisateur au sein du système. C'est aussi le nom par défaut du répertoire utilisateur dans ownCloud. C'est aussi le port d'URLs distants, par exemple pour tous les services *DAV. Le comportement par défaut peut être modifié à l'aide de ce paramètre. Pour obtenir un comportement similaire aux versions précédentes à ownCloud 5, saisir le nom d'utilisateur à afficher dans le champ suivant. Laissez à blanc pour le comportement par défaut. Les modifications prendront effet seulement pour les nouveaux (ajoutés) utilisateurs LDAP.", - "Internal Username Attribute:" : "Nom d'utilisateur interne:", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. To achieve a similar behavior as before ownCloud 5 enter the user display name attribute in the following field. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Par défaut le nom d'utilisateur interne sera créé à partir de l'attribut UUID. Ceci permet d'assurer que le nom d'utilisateur est unique et que les caractères ne nécessitent pas de conversion. Le nom d'utilisateur interne doit contenir uniquement les caractères suivants : [ a-zA-Z0-9_.@- ]. Les autres caractères sont remplacés par leur correspondance ASCII ou simplement omis. En cas de collision, un nombre est ajouté/incrémenté. Le nom d'utilisateur interne est utilisé pour identifier l'utilisateur au sein du système. C'est aussi le nom par défaut du répertoire utilisateur dans ownCloud. Il fait aussi partie de certains URL de services, par exemple pour tous les services *DAV. Le comportement par défaut peut être modifié à l'aide de ce paramètre. Pour obtenir un comportement similaire aux versions précédentes à ownCloud 5, saisir le nom d'utilisateur à afficher dans le champ suivant. Laissez à blanc pour le comportement par défaut. Les modifications prendront effet seulement pour les nouveaux (ajoutés) utilisateurs LDAP.", + "Internal Username Attribute:" : "Nom d'utilisateur interne :", "Override UUID detection" : "Surcharger la détection d'UUID", "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Par défaut, l'attribut UUID est automatiquement détecté. Cet attribut est utilisé pour identifier les utilisateurs et groupes de façon fiable. Un nom d'utilisateur interne basé sur l'UUID sera automatiquement créé, sauf s'il est spécifié autrement ci-dessus. Vous pouvez modifier ce comportement et définir l'attribut de votre choix. Vous devez alors vous assurer que l'attribut de votre choix peut être récupéré pour les utilisateurs ainsi que pour les groupes et qu'il soit unique. Laisser à blanc pour le comportement par défaut. Les modifications seront effectives uniquement pour les nouveaux (ajoutés) utilisateurs et groupes LDAP.", "UUID Attribute for Users:" : "Attribut UUID pour les utilisateurs :", diff --git a/apps/user_ldap/l10n/fr.json b/apps/user_ldap/l10n/fr.json index 777376eced0..c092fb0f02d 100644 --- a/apps/user_ldap/l10n/fr.json +++ b/apps/user_ldap/l10n/fr.json @@ -2,8 +2,8 @@ "Failed to clear the mappings." : "Erreur lors de la suppression des associations.", "Failed to delete the server configuration" : "Échec de la suppression de la configuration du serveur", "The configuration is valid and the connection could be established!" : "La configuration est valide et la connexion peut être établie !", - "The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "La configuration est valide, mais le lien ne peut être établi. Veuillez vérifier les paramètres du serveur ainsi que vos identifiants de connexion.", - "The configuration is invalid. Please have a look at the logs for further details." : "La configuration est invalide. Veuillez consulter les logs pour plus de détails.", + "The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "La configuration est valable, mais le bind a échoué. Veuillez vérifier les paramètres du serveur ainsi que vos identifiants de connexion.", + "The configuration is invalid. Please have a look at the logs for further details." : "La configuration n'est pas valable. Veuillez consulter les logs pour plus de détails.", "No action specified" : "Aucune action spécifiée", "No configuration specified" : "Aucune configuration spécifiée", "No data specified" : "Aucune donnée spécifiée", @@ -31,6 +31,7 @@ "Confirm Deletion" : "Confirmer la suppression", "_%s group found_::_%s groups found_" : ["%s groupe trouvé","%s groupes trouvés"], "_%s user found_::_%s users found_" : ["%s utilisateur trouvé","%s utilisateurs trouvés"], + "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "Impossible de détecter l'attribut contenant le nom d'affichage des utilisateurs. Veuillez l'indiquer vous-même dans les paramètres ldap avancés.", "Could not find the desired feature" : "Impossible de trouver la fonction souhaitée", "Invalid Host" : "Hôte invalide", "Server" : "Serveur", @@ -54,7 +55,7 @@ "Other Attributes:" : "Autres attributs :", "Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" : "Définit le filtre à appliquer lors d'une tentative de connexion. %%uid remplace le nom d'utilisateur lors de la connexion. Exemple : \"uid=%%uid\"", "1. Server" : "1. Serveur", - "%s. Server:" : "%s. Serveur:", + "%s. Server:" : "%s. Serveur :", "Add Server Configuration" : "Ajouter une configuration du serveur", "Delete Configuration" : "Suppression de la configuration", "Host" : "Hôte", @@ -88,25 +89,25 @@ "Disable Main Server" : "Désactiver le serveur principal", "Only connect to the replica server." : "Se connecter uniquement au serveur de replica.", "Case insensitive LDAP server (Windows)" : "Serveur LDAP insensible à la casse (Windows)", - "Turn off SSL certificate validation." : "Désactiver la validation du certificat SSL.", + "Turn off SSL certificate validation." : "Désactiver la validation des certificats SSL.", "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "Non recommandé, à utiliser à des fins de tests uniquement. Si la connexion ne fonctionne qu'avec cette option, importez le certificat SSL du serveur LDAP dans le serveur %s.", - "Cache Time-To-Live" : "Durée de vie du cache", + "Cache Time-To-Live" : "Durée de vie du cache (TTL)", "in seconds. A change empties the cache." : "en secondes. Tout changement vide le cache.", "Directory Settings" : "Paramètres du répertoire", "User Display Name Field" : "Champ \"nom d'affichage\" de l'utilisateur", - "The LDAP attribute to use to generate the user's display name." : "L'attribut LDAP utilisé pour générer le nom d'utilisateur affiché.", + "The LDAP attribute to use to generate the user's display name." : "L'attribut LDAP utilisé pour générer le nom d'affichage de l'utilisateur.", "Base User Tree" : "DN racine de l'arbre utilisateurs", "One User Base DN per line" : "Un DN racine utilisateur par ligne", "User Search Attributes" : "Recherche des attributs utilisateur", "Optional; one attribute per line" : "Optionnel, un attribut par ligne", "Group Display Name Field" : "Champ \"nom d'affichage\" du groupe", - "The LDAP attribute to use to generate the groups's display name." : "L'attribut LDAP utilisé pour générer le nom de groupe affiché.", + "The LDAP attribute to use to generate the groups's display name." : "L'attribut LDAP utilisé pour générer le nom d'affichage du groupe.", "Base Group Tree" : "DN racine de l'arbre groupes", "One Group Base DN per line" : "Un DN racine groupe par ligne", "Group Search Attributes" : "Recherche des attributs du groupe", "Group-Member association" : "Association groupe-membre", "Nested Groups" : "Groupes imbriqués", - "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Si activé, les groupes contenant d'autres groupes sont supportés (fonctionne uniquement si l'attribut membre du groupe contient des DNs).", + "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "Si activé, les groupes contenant d'autres groupes sont pris en charge (fonctionne uniquement si l'attribut membre du groupe contient des DNs).", "Paging chunksize" : "Dimensionnement des paginations", "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "La taille d'une part (chunksize) est utilisée pour les recherches paginées de LDAP qui peuvent retourner des résultats par lots comme une énumération d'utilisateurs ou groupes. (Configurer à 0 pour désactiver les recherches paginées de LDAP.)", "Special Attributes" : "Attributs spéciaux", @@ -117,8 +118,8 @@ "User Home Folder Naming Rule" : "Convention de nommage du répertoire utilisateur", "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Laisser vide ", "Internal Username" : "Nom d'utilisateur interne", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. To achieve a similar behavior as before ownCloud 5 enter the user display name attribute in the following field. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Par défaut le nom d'utilisateur interne sera créé à partir de l'attribut UUID. Ceci permet d'assurer que le nom d'utilisateur est unique et que les caractères ne nécessitent pas de conversion. Le nom d'utilisateur interne doit contenir uniquement les caractères suivants : [ a-zA-Z0-9_.@- ]. Les autres caractères sont remplacés par leur correspondance ASCII ou simplement omis. En cas de collision, un nombre est incrémenté/décrémenté. Le nom d'utilisateur interne est utilisé pour identifier l'utilisateur au sein du système. C'est aussi le nom par défaut du répertoire utilisateur dans ownCloud. C'est aussi le port d'URLs distants, par exemple pour tous les services *DAV. Le comportement par défaut peut être modifié à l'aide de ce paramètre. Pour obtenir un comportement similaire aux versions précédentes à ownCloud 5, saisir le nom d'utilisateur à afficher dans le champ suivant. Laissez à blanc pour le comportement par défaut. Les modifications prendront effet seulement pour les nouveaux (ajoutés) utilisateurs LDAP.", - "Internal Username Attribute:" : "Nom d'utilisateur interne:", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. To achieve a similar behavior as before ownCloud 5 enter the user display name attribute in the following field. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Par défaut le nom d'utilisateur interne sera créé à partir de l'attribut UUID. Ceci permet d'assurer que le nom d'utilisateur est unique et que les caractères ne nécessitent pas de conversion. Le nom d'utilisateur interne doit contenir uniquement les caractères suivants : [ a-zA-Z0-9_.@- ]. Les autres caractères sont remplacés par leur correspondance ASCII ou simplement omis. En cas de collision, un nombre est ajouté/incrémenté. Le nom d'utilisateur interne est utilisé pour identifier l'utilisateur au sein du système. C'est aussi le nom par défaut du répertoire utilisateur dans ownCloud. Il fait aussi partie de certains URL de services, par exemple pour tous les services *DAV. Le comportement par défaut peut être modifié à l'aide de ce paramètre. Pour obtenir un comportement similaire aux versions précédentes à ownCloud 5, saisir le nom d'utilisateur à afficher dans le champ suivant. Laissez à blanc pour le comportement par défaut. Les modifications prendront effet seulement pour les nouveaux (ajoutés) utilisateurs LDAP.", + "Internal Username Attribute:" : "Nom d'utilisateur interne :", "Override UUID detection" : "Surcharger la détection d'UUID", "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Par défaut, l'attribut UUID est automatiquement détecté. Cet attribut est utilisé pour identifier les utilisateurs et groupes de façon fiable. Un nom d'utilisateur interne basé sur l'UUID sera automatiquement créé, sauf s'il est spécifié autrement ci-dessus. Vous pouvez modifier ce comportement et définir l'attribut de votre choix. Vous devez alors vous assurer que l'attribut de votre choix peut être récupéré pour les utilisateurs ainsi que pour les groupes et qu'il soit unique. Laisser à blanc pour le comportement par défaut. Les modifications seront effectives uniquement pour les nouveaux (ajoutés) utilisateurs et groupes LDAP.", "UUID Attribute for Users:" : "Attribut UUID pour les utilisateurs :", diff --git a/apps/user_ldap/l10n/gl.js b/apps/user_ldap/l10n/gl.js index ef75c8df65c..a2359d41ebc 100644 --- a/apps/user_ldap/l10n/gl.js +++ b/apps/user_ldap/l10n/gl.js @@ -33,6 +33,7 @@ OC.L10N.register( "Confirm Deletion" : "Confirmar a eliminación", "_%s group found_::_%s groups found_" : ["Atopouse %s grupo","Atopáronse %s grupos"], "_%s user found_::_%s users found_" : ["Atopouse %s usuario","Atopáronse %s usuarios"], + "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "Non foi posíbel detectar o atributo nome de usuario que mostrar. Especifiqueo vostede mesmo nos axustes avanzados de LDAP.", "Could not find the desired feature" : "Non foi posíbel atopar a función desexada", "Invalid Host" : "Máquina incorrecta", "Server" : "Servidor", @@ -48,6 +49,7 @@ OC.L10N.register( "Edit raw filter instead" : "Editar, no seu canto, o filtro en bruto", "Raw LDAP filter" : "Filtro LDAP en bruto", "The filter specifies which LDAP groups shall have access to the %s instance." : "O filtro especifica que grupos LDAP teñen acceso á instancia %s.", + "Test Filter" : "Filtro de probas", "groups found" : "atopáronse grupos", "Users login with this attribute:" : "Os usuarios inician sesión con este atributo:", "LDAP Username:" : "Nome de usuario LDAP:", @@ -67,11 +69,15 @@ OC.L10N.register( "For anonymous access, leave DN and Password empty." : "Para o acceso anónimo deixe o DN e o contrasinal baleiros.", "One Base DN per line" : "Un DN base por liña", "You can specify Base DN for users and groups in the Advanced tab" : "Pode especificar a DN base para usuarios e grupos na lapela de «Avanzado»", + "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Evita as peticións LDAP automáticas. E o mellor para as configuracións máis grandes, mais require algúns coñecementos de LDAP.", + "Manually enter LDAP filters (recommended for large directories)" : "Introduza manualmente os filtros LDAP (recomendado para directorios grandes)", "Limit %s access to users meeting these criteria:" : "Limitar o acceso a %s para os usuarios que cumpren con estes criterios:", "The filter specifies which LDAP users shall have access to the %s instance." : "O filtro especifica que usuarios LDAP teñen acceso á instancia %s.", "users found" : "atopáronse usuarios", + "Saving" : "Gardando", "Back" : "Atrás", "Continue" : "Continuar", + "LDAP" : "LDAP", "Expert" : "Experto", "Advanced" : "Avanzado", "<b>Warning:</b> Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behavior. Please ask your system administrator to disable one of them." : "<b>Aviso:</b> As aplicacións user_ldap e user_webdavauth son incompatíbeis. Pode acontecer un comportamento estraño. Consulte co administrador do sistema para desactivar unha delas.", diff --git a/apps/user_ldap/l10n/gl.json b/apps/user_ldap/l10n/gl.json index 99b0807ef54..0f6d4e00cdf 100644 --- a/apps/user_ldap/l10n/gl.json +++ b/apps/user_ldap/l10n/gl.json @@ -31,6 +31,7 @@ "Confirm Deletion" : "Confirmar a eliminación", "_%s group found_::_%s groups found_" : ["Atopouse %s grupo","Atopáronse %s grupos"], "_%s user found_::_%s users found_" : ["Atopouse %s usuario","Atopáronse %s usuarios"], + "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "Non foi posíbel detectar o atributo nome de usuario que mostrar. Especifiqueo vostede mesmo nos axustes avanzados de LDAP.", "Could not find the desired feature" : "Non foi posíbel atopar a función desexada", "Invalid Host" : "Máquina incorrecta", "Server" : "Servidor", @@ -46,6 +47,7 @@ "Edit raw filter instead" : "Editar, no seu canto, o filtro en bruto", "Raw LDAP filter" : "Filtro LDAP en bruto", "The filter specifies which LDAP groups shall have access to the %s instance." : "O filtro especifica que grupos LDAP teñen acceso á instancia %s.", + "Test Filter" : "Filtro de probas", "groups found" : "atopáronse grupos", "Users login with this attribute:" : "Os usuarios inician sesión con este atributo:", "LDAP Username:" : "Nome de usuario LDAP:", @@ -65,11 +67,15 @@ "For anonymous access, leave DN and Password empty." : "Para o acceso anónimo deixe o DN e o contrasinal baleiros.", "One Base DN per line" : "Un DN base por liña", "You can specify Base DN for users and groups in the Advanced tab" : "Pode especificar a DN base para usuarios e grupos na lapela de «Avanzado»", + "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Evita as peticións LDAP automáticas. E o mellor para as configuracións máis grandes, mais require algúns coñecementos de LDAP.", + "Manually enter LDAP filters (recommended for large directories)" : "Introduza manualmente os filtros LDAP (recomendado para directorios grandes)", "Limit %s access to users meeting these criteria:" : "Limitar o acceso a %s para os usuarios que cumpren con estes criterios:", "The filter specifies which LDAP users shall have access to the %s instance." : "O filtro especifica que usuarios LDAP teñen acceso á instancia %s.", "users found" : "atopáronse usuarios", + "Saving" : "Gardando", "Back" : "Atrás", "Continue" : "Continuar", + "LDAP" : "LDAP", "Expert" : "Experto", "Advanced" : "Avanzado", "<b>Warning:</b> Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behavior. Please ask your system administrator to disable one of them." : "<b>Aviso:</b> As aplicacións user_ldap e user_webdavauth son incompatíbeis. Pode acontecer un comportamento estraño. Consulte co administrador do sistema para desactivar unha delas.", diff --git a/apps/user_ldap/l10n/hi_IN.php b/apps/user_ldap/l10n/hi_IN.php deleted file mode 100644 index 3a1e002311c..00000000000 --- a/apps/user_ldap/l10n/hi_IN.php +++ /dev/null @@ -1,6 +0,0 @@ -<?php -$TRANSLATIONS = array( -"_%s group found_::_%s groups found_" => array("",""), -"_%s user found_::_%s users found_" => array("","") -); -$PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/apps/user_ldap/l10n/id.js b/apps/user_ldap/l10n/id.js index cf5f37c5efb..26ca061c71a 100644 --- a/apps/user_ldap/l10n/id.js +++ b/apps/user_ldap/l10n/id.js @@ -72,6 +72,7 @@ OC.L10N.register( "Saving" : "Menyimpan", "Back" : "Kembali", "Continue" : "Lanjutkan", + "LDAP" : "LDAP", "Expert" : "Lanjutan", "Advanced" : "Lanjutan", "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Peringatan:</b> Modul LDAP PHP tidak terpasang, perangkat tidak akan bekerja. Silakan minta administrator sistem untuk memasangnya.", @@ -87,11 +88,13 @@ OC.L10N.register( "in seconds. A change empties the cache." : "dalam detik. perubahan mengosongkan cache", "Directory Settings" : "Pengaturan Direktori", "User Display Name Field" : "Bidang Tampilan Nama Pengguna", + "The LDAP attribute to use to generate the user's display name." : "Atribut LDAP digunakan untuk menghasilkan nama tampilan pengguna.", "Base User Tree" : "Pohon Pengguna Dasar", "One User Base DN per line" : "Satu Pengguna Base DN per baris", "User Search Attributes" : "Atribut Pencarian Pengguna", "Optional; one attribute per line" : "Pilihan; satu atribut per baris", "Group Display Name Field" : "Bidang Tampilan Nama Grup", + "The LDAP attribute to use to generate the groups's display name." : "Atribut LDAP digunakan untuk menghasilkan nama tampilan grup.", "Base Group Tree" : "Pohon Grup Dasar", "One Group Base DN per line" : "Satu Grup Base DN per baris", "Group Search Attributes" : "Atribut Pencarian Grup", @@ -102,6 +105,11 @@ OC.L10N.register( "in bytes" : "dalam bytes", "Email Field" : "Bidang Email", "User Home Folder Naming Rule" : "Aturan Penamaan Folder Home Pengguna", - "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Biarkan nama pengguna kosong (default). Atau tetapkan atribut LDAP/AD." + "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Biarkan nama pengguna kosong (default). Atau tetapkan atribut LDAP/AD.", + "Internal Username" : "Nama Pengguna Internal", + "Internal Username Attribute:" : "Atribut Nama Pengguna Internal:", + "Override UUID detection" : "Timpa deteksi UUID", + "UUID Attribute for Users:" : "Atribut UUID untuk Pengguna:", + "UUID Attribute for Groups:" : "Atribut UUID untuk Grup:" }, "nplurals=1; plural=0;"); diff --git a/apps/user_ldap/l10n/id.json b/apps/user_ldap/l10n/id.json index 2395e7f2a55..ad650fc0fb9 100644 --- a/apps/user_ldap/l10n/id.json +++ b/apps/user_ldap/l10n/id.json @@ -70,6 +70,7 @@ "Saving" : "Menyimpan", "Back" : "Kembali", "Continue" : "Lanjutkan", + "LDAP" : "LDAP", "Expert" : "Lanjutan", "Advanced" : "Lanjutan", "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Peringatan:</b> Modul LDAP PHP tidak terpasang, perangkat tidak akan bekerja. Silakan minta administrator sistem untuk memasangnya.", @@ -85,11 +86,13 @@ "in seconds. A change empties the cache." : "dalam detik. perubahan mengosongkan cache", "Directory Settings" : "Pengaturan Direktori", "User Display Name Field" : "Bidang Tampilan Nama Pengguna", + "The LDAP attribute to use to generate the user's display name." : "Atribut LDAP digunakan untuk menghasilkan nama tampilan pengguna.", "Base User Tree" : "Pohon Pengguna Dasar", "One User Base DN per line" : "Satu Pengguna Base DN per baris", "User Search Attributes" : "Atribut Pencarian Pengguna", "Optional; one attribute per line" : "Pilihan; satu atribut per baris", "Group Display Name Field" : "Bidang Tampilan Nama Grup", + "The LDAP attribute to use to generate the groups's display name." : "Atribut LDAP digunakan untuk menghasilkan nama tampilan grup.", "Base Group Tree" : "Pohon Grup Dasar", "One Group Base DN per line" : "Satu Grup Base DN per baris", "Group Search Attributes" : "Atribut Pencarian Grup", @@ -100,6 +103,11 @@ "in bytes" : "dalam bytes", "Email Field" : "Bidang Email", "User Home Folder Naming Rule" : "Aturan Penamaan Folder Home Pengguna", - "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Biarkan nama pengguna kosong (default). Atau tetapkan atribut LDAP/AD." + "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Biarkan nama pengguna kosong (default). Atau tetapkan atribut LDAP/AD.", + "Internal Username" : "Nama Pengguna Internal", + "Internal Username Attribute:" : "Atribut Nama Pengguna Internal:", + "Override UUID detection" : "Timpa deteksi UUID", + "UUID Attribute for Users:" : "Atribut UUID untuk Pengguna:", + "UUID Attribute for Groups:" : "Atribut UUID untuk Grup:" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/it.js b/apps/user_ldap/l10n/it.js index 92bab544984..30b9a39f0ea 100644 --- a/apps/user_ldap/l10n/it.js +++ b/apps/user_ldap/l10n/it.js @@ -33,6 +33,7 @@ OC.L10N.register( "Confirm Deletion" : "Conferma l'eliminazione", "_%s group found_::_%s groups found_" : ["%s gruppo trovato","%s gruppi trovati"], "_%s user found_::_%s users found_" : ["%s utente trovato","%s utenti trovati"], + "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "Impossibile rilevare l'attributo nome visualizzato dell'utente. Specificalo nelle impostazioni avanzate di ldap.", "Could not find the desired feature" : "Impossibile trovare la funzionalità desiderata", "Invalid Host" : "Host non valido", "Server" : "Server", @@ -63,7 +64,7 @@ OC.L10N.register( "You can omit the protocol, except you require SSL. Then start with ldaps://" : "È possibile omettere il protocollo, ad eccezione se è necessario SSL. Quindi inizia con ldaps://", "Port" : "Porta", "User DN" : "DN utente", - "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "Il DN per il client dell'utente con cui deve essere associato, ad esempio uid=agent,dc=example,dc=com. Per l'accesso anonimo, lasciare vuoti i campi DN e Password", + "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "Il DN per il client dell'utente con cui deve essere associato, ad esempio uid=agente,dc=esempio,dc=com. Per l'accesso anonimo, lasciare vuoti i campi DN e Password", "Password" : "Password", "For anonymous access, leave DN and Password empty." : "Per l'accesso anonimo, lasciare vuoti i campi DN e Password", "One Base DN per line" : "Un DN base per riga", diff --git a/apps/user_ldap/l10n/it.json b/apps/user_ldap/l10n/it.json index 31a694a4b1c..58b405730a4 100644 --- a/apps/user_ldap/l10n/it.json +++ b/apps/user_ldap/l10n/it.json @@ -31,6 +31,7 @@ "Confirm Deletion" : "Conferma l'eliminazione", "_%s group found_::_%s groups found_" : ["%s gruppo trovato","%s gruppi trovati"], "_%s user found_::_%s users found_" : ["%s utente trovato","%s utenti trovati"], + "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "Impossibile rilevare l'attributo nome visualizzato dell'utente. Specificalo nelle impostazioni avanzate di ldap.", "Could not find the desired feature" : "Impossibile trovare la funzionalità desiderata", "Invalid Host" : "Host non valido", "Server" : "Server", @@ -61,7 +62,7 @@ "You can omit the protocol, except you require SSL. Then start with ldaps://" : "È possibile omettere il protocollo, ad eccezione se è necessario SSL. Quindi inizia con ldaps://", "Port" : "Porta", "User DN" : "DN utente", - "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "Il DN per il client dell'utente con cui deve essere associato, ad esempio uid=agent,dc=example,dc=com. Per l'accesso anonimo, lasciare vuoti i campi DN e Password", + "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "Il DN per il client dell'utente con cui deve essere associato, ad esempio uid=agente,dc=esempio,dc=com. Per l'accesso anonimo, lasciare vuoti i campi DN e Password", "Password" : "Password", "For anonymous access, leave DN and Password empty." : "Per l'accesso anonimo, lasciare vuoti i campi DN e Password", "One Base DN per line" : "Un DN base per riga", diff --git a/apps/user_ldap/l10n/ja.js b/apps/user_ldap/l10n/ja.js index 6494fbb5142..b139c5b3fb4 100644 --- a/apps/user_ldap/l10n/ja.js +++ b/apps/user_ldap/l10n/ja.js @@ -33,6 +33,7 @@ OC.L10N.register( "Confirm Deletion" : "削除の確認", "_%s group found_::_%s groups found_" : ["%s グループが見つかりました"], "_%s user found_::_%s users found_" : ["%s ユーザーが見つかりました"], + "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "ユーザー表示名の属性を検出できませんでした。詳細設定で対応する属性を指定してください。", "Could not find the desired feature" : "望ましい機能は見つかりませんでした", "Invalid Host" : "無効なホスト", "Server" : "サーバー", diff --git a/apps/user_ldap/l10n/ja.json b/apps/user_ldap/l10n/ja.json index 2e714112f19..25ad7f73bd8 100644 --- a/apps/user_ldap/l10n/ja.json +++ b/apps/user_ldap/l10n/ja.json @@ -31,6 +31,7 @@ "Confirm Deletion" : "削除の確認", "_%s group found_::_%s groups found_" : ["%s グループが見つかりました"], "_%s user found_::_%s users found_" : ["%s ユーザーが見つかりました"], + "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "ユーザー表示名の属性を検出できませんでした。詳細設定で対応する属性を指定してください。", "Could not find the desired feature" : "望ましい機能は見つかりませんでした", "Invalid Host" : "無効なホスト", "Server" : "サーバー", diff --git a/apps/user_ldap/l10n/kn.js b/apps/user_ldap/l10n/kn.js index 5494dcae62e..28d1debe940 100644 --- a/apps/user_ldap/l10n/kn.js +++ b/apps/user_ldap/l10n/kn.js @@ -1,7 +1,14 @@ OC.L10N.register( "user_ldap", { + "Error" : "ತಪ್ಪಾಗಿದೆ", "_%s group found_::_%s groups found_" : [""], - "_%s user found_::_%s users found_" : [""] + "_%s user found_::_%s users found_" : [""], + "Save" : "ಉಳಿಸಿ", + "Help" : "ಸಹಾಯ", + "Host" : "ಅತಿಥೆಯ-ಗಣಕ", + "Port" : "ರೇವು", + "Password" : "ಗುಪ್ತ ಪದ", + "Continue" : "ಮುಂದುವರಿಸಿ" }, "nplurals=1; plural=0;"); diff --git a/apps/user_ldap/l10n/kn.json b/apps/user_ldap/l10n/kn.json index 75f0f056cc4..72700ee607f 100644 --- a/apps/user_ldap/l10n/kn.json +++ b/apps/user_ldap/l10n/kn.json @@ -1,5 +1,12 @@ { "translations": { + "Error" : "ತಪ್ಪಾಗಿದೆ", "_%s group found_::_%s groups found_" : [""], - "_%s user found_::_%s users found_" : [""] + "_%s user found_::_%s users found_" : [""], + "Save" : "ಉಳಿಸಿ", + "Help" : "ಸಹಾಯ", + "Host" : "ಅತಿಥೆಯ-ಗಣಕ", + "Port" : "ರೇವು", + "Password" : "ಗುಪ್ತ ಪದ", + "Continue" : "ಮುಂದುವರಿಸಿ" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/lo.js b/apps/user_ldap/l10n/lo.js new file mode 100644 index 00000000000..5494dcae62e --- /dev/null +++ b/apps/user_ldap/l10n/lo.js @@ -0,0 +1,7 @@ +OC.L10N.register( + "user_ldap", + { + "_%s group found_::_%s groups found_" : [""], + "_%s user found_::_%s users found_" : [""] +}, +"nplurals=1; plural=0;"); diff --git a/apps/user_ldap/l10n/lo.json b/apps/user_ldap/l10n/lo.json new file mode 100644 index 00000000000..75f0f056cc4 --- /dev/null +++ b/apps/user_ldap/l10n/lo.json @@ -0,0 +1,5 @@ +{ "translations": { + "_%s group found_::_%s groups found_" : [""], + "_%s user found_::_%s users found_" : [""] +},"pluralForm" :"nplurals=1; plural=0;" +}
\ No newline at end of file diff --git a/apps/user_ldap/l10n/mn.js b/apps/user_ldap/l10n/mn.js index 37042a4f412..e0a08885f93 100644 --- a/apps/user_ldap/l10n/mn.js +++ b/apps/user_ldap/l10n/mn.js @@ -2,6 +2,8 @@ OC.L10N.register( "user_ldap", { "_%s group found_::_%s groups found_" : ["",""], - "_%s user found_::_%s users found_" : ["",""] + "_%s user found_::_%s users found_" : ["",""], + "Save" : "Хадгалах", + "Password" : "Нууц үг" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/user_ldap/l10n/mn.json b/apps/user_ldap/l10n/mn.json index 521de7ba1a8..530b3bd9f58 100644 --- a/apps/user_ldap/l10n/mn.json +++ b/apps/user_ldap/l10n/mn.json @@ -1,5 +1,7 @@ { "translations": { "_%s group found_::_%s groups found_" : ["",""], - "_%s user found_::_%s users found_" : ["",""] + "_%s user found_::_%s users found_" : ["",""], + "Save" : "Хадгалах", + "Password" : "Нууц үг" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/nb_NO.js b/apps/user_ldap/l10n/nb_NO.js index 9074ee926d6..3d3839398a9 100644 --- a/apps/user_ldap/l10n/nb_NO.js +++ b/apps/user_ldap/l10n/nb_NO.js @@ -33,6 +33,7 @@ OC.L10N.register( "Confirm Deletion" : "Bekreft sletting", "_%s group found_::_%s groups found_" : ["%s gruppe funnet","%s grupper funnet"], "_%s user found_::_%s users found_" : ["%s bruker funnet","%s brukere funnet"], + "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "Kunne ikke påvise attributt for brukers visningsnavn. Du må selv spesifisere det i avanserte LDAP-innstillinger.", "Could not find the desired feature" : "Fant ikke den ønskede funksjonaliteten", "Invalid Host" : "Ugyldig tjener", "Server" : "Server", @@ -48,6 +49,7 @@ OC.L10N.register( "Edit raw filter instead" : "Rediger ubearbeidet filter i stedet", "Raw LDAP filter" : "Ubearbeidet LDAP-filter", "The filter specifies which LDAP groups shall have access to the %s instance." : "Filteret spesifiserer hvilke LDAP-grupper som skal ha tilgang til %s-instansen.", + "Test Filter" : "Test filter", "groups found" : "grupper funnet", "Users login with this attribute:" : "Brukere logger inn med denne attributten:", "LDAP Username:" : "LDAP-brukernavn:", @@ -67,11 +69,15 @@ OC.L10N.register( "For anonymous access, leave DN and Password empty." : "For anonym tilgang, la DN- og passord-feltet stå tomt.", "One Base DN per line" : "En hoved-DN pr. linje", "You can specify Base DN for users and groups in the Advanced tab" : "Du kan spesifisere hoved-DN for brukere og grupper under Avansert fanen", + "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Unngår automatiske LDAP-forespørsler. Bedre for store oppsett men krever litt LDAP-kunnskap.", + "Manually enter LDAP filters (recommended for large directories)" : "Legg inn LDAP-filtre manuelt (anbefalt for store kataloger)", "Limit %s access to users meeting these criteria:" : "Begrens %s-tilgang til brukere som tilfredsstiller disse kriteriene:", "The filter specifies which LDAP users shall have access to the %s instance." : "Filteret spesifiserer hvilke LDAP-brukere som skal ha tilgang til %s-instansen.", "users found" : "brukere funnet", + "Saving" : "Lagrer", "Back" : "Tilbake", "Continue" : "Fortsett", + "LDAP" : "LDAP", "Expert" : "Ekspert", "Advanced" : "Avansert", "<b>Warning:</b> Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behavior. Please ask your system administrator to disable one of them." : "<b>Advarsel:</b> Appene user_ldap og user_webdavauth er ikke kompatible med hverandre. Uventet oppførsel kan forekomme. Be systemadministratoren om å deaktivere en av dem.", diff --git a/apps/user_ldap/l10n/nb_NO.json b/apps/user_ldap/l10n/nb_NO.json index d89d8377dab..cb3c28f8531 100644 --- a/apps/user_ldap/l10n/nb_NO.json +++ b/apps/user_ldap/l10n/nb_NO.json @@ -31,6 +31,7 @@ "Confirm Deletion" : "Bekreft sletting", "_%s group found_::_%s groups found_" : ["%s gruppe funnet","%s grupper funnet"], "_%s user found_::_%s users found_" : ["%s bruker funnet","%s brukere funnet"], + "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "Kunne ikke påvise attributt for brukers visningsnavn. Du må selv spesifisere det i avanserte LDAP-innstillinger.", "Could not find the desired feature" : "Fant ikke den ønskede funksjonaliteten", "Invalid Host" : "Ugyldig tjener", "Server" : "Server", @@ -46,6 +47,7 @@ "Edit raw filter instead" : "Rediger ubearbeidet filter i stedet", "Raw LDAP filter" : "Ubearbeidet LDAP-filter", "The filter specifies which LDAP groups shall have access to the %s instance." : "Filteret spesifiserer hvilke LDAP-grupper som skal ha tilgang til %s-instansen.", + "Test Filter" : "Test filter", "groups found" : "grupper funnet", "Users login with this attribute:" : "Brukere logger inn med denne attributten:", "LDAP Username:" : "LDAP-brukernavn:", @@ -65,11 +67,15 @@ "For anonymous access, leave DN and Password empty." : "For anonym tilgang, la DN- og passord-feltet stå tomt.", "One Base DN per line" : "En hoved-DN pr. linje", "You can specify Base DN for users and groups in the Advanced tab" : "Du kan spesifisere hoved-DN for brukere og grupper under Avansert fanen", + "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Unngår automatiske LDAP-forespørsler. Bedre for store oppsett men krever litt LDAP-kunnskap.", + "Manually enter LDAP filters (recommended for large directories)" : "Legg inn LDAP-filtre manuelt (anbefalt for store kataloger)", "Limit %s access to users meeting these criteria:" : "Begrens %s-tilgang til brukere som tilfredsstiller disse kriteriene:", "The filter specifies which LDAP users shall have access to the %s instance." : "Filteret spesifiserer hvilke LDAP-brukere som skal ha tilgang til %s-instansen.", "users found" : "brukere funnet", + "Saving" : "Lagrer", "Back" : "Tilbake", "Continue" : "Fortsett", + "LDAP" : "LDAP", "Expert" : "Ekspert", "Advanced" : "Avansert", "<b>Warning:</b> Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behavior. Please ask your system administrator to disable one of them." : "<b>Advarsel:</b> Appene user_ldap og user_webdavauth er ikke kompatible med hverandre. Uventet oppførsel kan forekomme. Be systemadministratoren om å deaktivere en av dem.", diff --git a/apps/user_ldap/l10n/nl.js b/apps/user_ldap/l10n/nl.js index 77646a90a88..ae280e1a05e 100644 --- a/apps/user_ldap/l10n/nl.js +++ b/apps/user_ldap/l10n/nl.js @@ -33,6 +33,7 @@ OC.L10N.register( "Confirm Deletion" : "Bevestig verwijderen", "_%s group found_::_%s groups found_" : ["%s groep gevonden","%s groepen gevonden"], "_%s user found_::_%s users found_" : ["%s gebruiker gevonden","%s gebruikers gevonden"], + "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "Kon het weergavenaam attribuut van de gebruiker niet vinden. Geef het zelf op in de geavanceerde ldap instellingen.", "Could not find the desired feature" : "Kon de gewenste functie niet vinden", "Invalid Host" : "Ongeldige server", "Server" : "Server", @@ -95,7 +96,7 @@ OC.L10N.register( "Cache Time-To-Live" : "Cache time-to-live", "in seconds. A change empties the cache." : "in seconden. Een verandering maakt de cache leeg.", "Directory Settings" : "Mapinstellingen", - "User Display Name Field" : "Gebruikers Schermnaam Veld", + "User Display Name Field" : "Veld gebruikers weergavenaam", "The LDAP attribute to use to generate the user's display name." : "Het te gebruiken LDAP attribuut voor het genereren van de weergavenaam voor de gebruiker.", "Base User Tree" : "Basis Gebruikers Structuur", "One User Base DN per line" : "Een User Base DN per regel", @@ -103,7 +104,7 @@ OC.L10N.register( "Optional; one attribute per line" : "Optioneel; één attribuut per regel", "Group Display Name Field" : "Groep Schermnaam Veld", "The LDAP attribute to use to generate the groups's display name." : "Het te gebruiken LDAP attribuut voor het genereren van de weergavenaam voor de groepen.", - "Base Group Tree" : "Basis Groupen Structuur", + "Base Group Tree" : "Basis groepsstructuur", "One Group Base DN per line" : "Een Group Base DN per regel", "Group Search Attributes" : "Attributen voor groepszoekopdrachten", "Group-Member association" : "Groepslid associatie", diff --git a/apps/user_ldap/l10n/nl.json b/apps/user_ldap/l10n/nl.json index 6f0a9ec1c01..ed0ce08501a 100644 --- a/apps/user_ldap/l10n/nl.json +++ b/apps/user_ldap/l10n/nl.json @@ -31,6 +31,7 @@ "Confirm Deletion" : "Bevestig verwijderen", "_%s group found_::_%s groups found_" : ["%s groep gevonden","%s groepen gevonden"], "_%s user found_::_%s users found_" : ["%s gebruiker gevonden","%s gebruikers gevonden"], + "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "Kon het weergavenaam attribuut van de gebruiker niet vinden. Geef het zelf op in de geavanceerde ldap instellingen.", "Could not find the desired feature" : "Kon de gewenste functie niet vinden", "Invalid Host" : "Ongeldige server", "Server" : "Server", @@ -93,7 +94,7 @@ "Cache Time-To-Live" : "Cache time-to-live", "in seconds. A change empties the cache." : "in seconden. Een verandering maakt de cache leeg.", "Directory Settings" : "Mapinstellingen", - "User Display Name Field" : "Gebruikers Schermnaam Veld", + "User Display Name Field" : "Veld gebruikers weergavenaam", "The LDAP attribute to use to generate the user's display name." : "Het te gebruiken LDAP attribuut voor het genereren van de weergavenaam voor de gebruiker.", "Base User Tree" : "Basis Gebruikers Structuur", "One User Base DN per line" : "Een User Base DN per regel", @@ -101,7 +102,7 @@ "Optional; one attribute per line" : "Optioneel; één attribuut per regel", "Group Display Name Field" : "Groep Schermnaam Veld", "The LDAP attribute to use to generate the groups's display name." : "Het te gebruiken LDAP attribuut voor het genereren van de weergavenaam voor de groepen.", - "Base Group Tree" : "Basis Groupen Structuur", + "Base Group Tree" : "Basis groepsstructuur", "One Group Base DN per line" : "Een Group Base DN per regel", "Group Search Attributes" : "Attributen voor groepszoekopdrachten", "Group-Member association" : "Groepslid associatie", diff --git a/apps/user_ldap/l10n/pl.js b/apps/user_ldap/l10n/pl.js index 345d4986e4b..a00fa0f2306 100644 --- a/apps/user_ldap/l10n/pl.js +++ b/apps/user_ldap/l10n/pl.js @@ -33,6 +33,7 @@ OC.L10N.register( "Confirm Deletion" : "Potwierdź usunięcie", "_%s group found_::_%s groups found_" : ["%s znaleziona grupa","%s znalezionych grup","%s znalezionych grup"], "_%s user found_::_%s users found_" : ["%s znaleziony użytkownik","%s znalezionych użytkowników","%s znalezionych użytkowników"], + "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "Nie udało się wykryć atrybutu wyświetlanej nazwy użytkownika. Określ ją w zaawansowanych ustawieniach LDAP.", "Could not find the desired feature" : "Nie można znaleźć żądanej funkcji", "Invalid Host" : "Niepoprawny Host", "Server" : "Serwer", @@ -67,11 +68,15 @@ OC.L10N.register( "For anonymous access, leave DN and Password empty." : "Dla dostępu anonimowego pozostawić DN i hasło puste.", "One Base DN per line" : "Jedna baza DN na linię", "You can specify Base DN for users and groups in the Advanced tab" : "Bazę DN można określić dla użytkowników i grup w karcie Zaawansowane", + "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Zapobiega automatycznym zapytaniom LDAP. Lepsze dla większych instalacji, lecz wymaga pewnej wiedzy o LDAP.", + "Manually enter LDAP filters (recommended for large directories)" : "Ręcznie wprowadzaj filtry LDAP (zalecane dla dużych katalogów)", "Limit %s access to users meeting these criteria:" : "Limit %s dostępu do podłączania użytkowników z tymi ustawieniami:", "The filter specifies which LDAP users shall have access to the %s instance." : "Filtr określa, którzy użytkownicy LDAP powinni mieć dostęp do instancji %s.", "users found" : "użytkownicy znalezieni", + "Saving" : "Zapisuję", "Back" : "Wróć", "Continue" : "Kontynuuj ", + "LDAP" : "LDAP", "Expert" : "Ekspert", "Advanced" : "Zaawansowane", "<b>Warning:</b> Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behavior. Please ask your system administrator to disable one of them." : "<b>Ostrzeżenie:</b> Aplikacje user_ldap i user_webdavauth nie są kompatybilne. Mogą powodować nieoczekiwane zachowanie. Poproś administratora o wyłączenie jednej z nich.", diff --git a/apps/user_ldap/l10n/pl.json b/apps/user_ldap/l10n/pl.json index 49adb2abb51..178d47afbfe 100644 --- a/apps/user_ldap/l10n/pl.json +++ b/apps/user_ldap/l10n/pl.json @@ -31,6 +31,7 @@ "Confirm Deletion" : "Potwierdź usunięcie", "_%s group found_::_%s groups found_" : ["%s znaleziona grupa","%s znalezionych grup","%s znalezionych grup"], "_%s user found_::_%s users found_" : ["%s znaleziony użytkownik","%s znalezionych użytkowników","%s znalezionych użytkowników"], + "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "Nie udało się wykryć atrybutu wyświetlanej nazwy użytkownika. Określ ją w zaawansowanych ustawieniach LDAP.", "Could not find the desired feature" : "Nie można znaleźć żądanej funkcji", "Invalid Host" : "Niepoprawny Host", "Server" : "Serwer", @@ -65,11 +66,15 @@ "For anonymous access, leave DN and Password empty." : "Dla dostępu anonimowego pozostawić DN i hasło puste.", "One Base DN per line" : "Jedna baza DN na linię", "You can specify Base DN for users and groups in the Advanced tab" : "Bazę DN można określić dla użytkowników i grup w karcie Zaawansowane", + "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Zapobiega automatycznym zapytaniom LDAP. Lepsze dla większych instalacji, lecz wymaga pewnej wiedzy o LDAP.", + "Manually enter LDAP filters (recommended for large directories)" : "Ręcznie wprowadzaj filtry LDAP (zalecane dla dużych katalogów)", "Limit %s access to users meeting these criteria:" : "Limit %s dostępu do podłączania użytkowników z tymi ustawieniami:", "The filter specifies which LDAP users shall have access to the %s instance." : "Filtr określa, którzy użytkownicy LDAP powinni mieć dostęp do instancji %s.", "users found" : "użytkownicy znalezieni", + "Saving" : "Zapisuję", "Back" : "Wróć", "Continue" : "Kontynuuj ", + "LDAP" : "LDAP", "Expert" : "Ekspert", "Advanced" : "Zaawansowane", "<b>Warning:</b> Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behavior. Please ask your system administrator to disable one of them." : "<b>Ostrzeżenie:</b> Aplikacje user_ldap i user_webdavauth nie są kompatybilne. Mogą powodować nieoczekiwane zachowanie. Poproś administratora o wyłączenie jednej z nich.", diff --git a/apps/user_ldap/l10n/pt_BR.js b/apps/user_ldap/l10n/pt_BR.js index 32b7697df3e..a4a481524ba 100644 --- a/apps/user_ldap/l10n/pt_BR.js +++ b/apps/user_ldap/l10n/pt_BR.js @@ -33,6 +33,7 @@ OC.L10N.register( "Confirm Deletion" : "Confirmar Exclusão", "_%s group found_::_%s groups found_" : ["grupo% s encontrado","grupos% s encontrado"], "_%s user found_::_%s users found_" : ["usuário %s encontrado","usuários %s encontrados"], + "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "Não foi possível detectar o nome de exibição do atributo do usuário. Por favor, indique-o você mesmo em configurações avançadas do LDAP.", "Could not find the desired feature" : "Não foi possível encontrar a função desejada", "Invalid Host" : "Host Inválido", "Server" : "Servidor", diff --git a/apps/user_ldap/l10n/pt_BR.json b/apps/user_ldap/l10n/pt_BR.json index ea59ed7b4d8..4dd9088b727 100644 --- a/apps/user_ldap/l10n/pt_BR.json +++ b/apps/user_ldap/l10n/pt_BR.json @@ -31,6 +31,7 @@ "Confirm Deletion" : "Confirmar Exclusão", "_%s group found_::_%s groups found_" : ["grupo% s encontrado","grupos% s encontrado"], "_%s user found_::_%s users found_" : ["usuário %s encontrado","usuários %s encontrados"], + "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "Não foi possível detectar o nome de exibição do atributo do usuário. Por favor, indique-o você mesmo em configurações avançadas do LDAP.", "Could not find the desired feature" : "Não foi possível encontrar a função desejada", "Invalid Host" : "Host Inválido", "Server" : "Servidor", diff --git a/apps/user_ldap/l10n/ru.js b/apps/user_ldap/l10n/ru.js index e6a7b32d003..016ef747a2c 100644 --- a/apps/user_ldap/l10n/ru.js +++ b/apps/user_ldap/l10n/ru.js @@ -4,8 +4,8 @@ OC.L10N.register( "Failed to clear the mappings." : "Не удалось очистить соответствия.", "Failed to delete the server configuration" : "Не удалось удалить конфигурацию сервера", "The configuration is valid and the connection could be established!" : "Конфигурация правильная и подключение может быть установлено!", - "The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "Конфигурация верна, но операция подключения завершилась неудачно. Пожалуйста, проверьте настройки сервера и учетные данные.", - "The configuration is invalid. Please have a look at the logs for further details." : "Конфигурация недействительна. Пожалуйста, просмотрите логи для уточнения деталей.", + "The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "Конфигурация верна, но операция подключения завершилась неудачно. Проверьте настройки сервера и учетные данные.", + "The configuration is invalid. Please have a look at the logs for further details." : "Конфигурация недействительна. Проверьте журналы для уточнения деталей.", "No action specified" : "Действие не указано", "No configuration specified" : "Конфигурация не создана", "No data specified" : "Нет данных", @@ -33,6 +33,7 @@ OC.L10N.register( "Confirm Deletion" : "Подтверждение удаления", "_%s group found_::_%s groups found_" : ["%s группа найдена","%s группы найдены","%s групп найдено"], "_%s user found_::_%s users found_" : ["%s пользователь найден","%s пользователя найдено","%s пользователей найдено"], + "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "Не удалось автоматически определить атрибут содержащий отображаемое имя пользователя. Зайдите в расширенные настройки ldap и укажите его вручную.", "Could not find the desired feature" : "Не могу найти требуемой функциональности", "Invalid Host" : "Неверный сервер", "Server" : "Сервер", @@ -116,10 +117,10 @@ OC.L10N.register( "Quota Default" : "Квота по умолчанию", "in bytes" : "в байтах", "Email Field" : "Поле адреса электронной почты", - "User Home Folder Naming Rule" : "Правило именования домашней папки пользователя", + "User Home Folder Naming Rule" : "Правило именования домашнего каталога пользователя", "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Оставьте пустым для использования имени пользователя (по умолчанию). Иначе укажите атрибут LDAP/AD.", "Internal Username" : "Внутреннее имя пользователя", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. To achieve a similar behavior as before ownCloud 5 enter the user display name attribute in the following field. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "По умолчанию внутреннее имя пользователя будет создано из атрибута UUID. Таким образом имя пользователя становится уникальным и не требует конвертации символов. Внутреннее имя пользователя может состоять только из следующих символов: [ a-zA-Z0-9_.@- ]. Остальные символы замещаются соответствиями из таблицы ASCII или же просто пропускаются. При совпадении к имени будет добавлено или увеличено число. Внутреннее имя пользователя используется для внутренней идентификации пользователя. Также оно является именем по умолчанию для папки пользователя в ownCloud. Оно также является частью URL, к примеру, для всех сервисов *DAV. С помощью данной настройки можно изменить поведение по умолчанию. Чтобы достичь поведения, как было до ownCloud 5, введите атрибут отображаемого имени пользователя в этом поле. Оставьте его пустым для режима по умолчанию. Изменения будут иметь эффект только для новых подключенных (добавленных) пользователей LDAP.", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. To achieve a similar behavior as before ownCloud 5 enter the user display name attribute in the following field. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "По умолчанию внутреннее имя пользователя будет создано из атрибута UUID. Таким образом имя пользователя становится уникальным и не требует конвертации символов. Внутреннее имя пользователя может состоять только из следующих символов: [ a-zA-Z0-9_.@- ]. Остальные символы замещаются соответствиями из таблицы ASCII или же просто пропускаются. При совпадении к имени будет добавлено или увеличено число. Внутреннее имя пользователя используется для внутренней идентификации пользователя. Также оно является именем по умолчанию для каталога пользователя в ownCloud. Оно также является частью URL, к примеру, для всех сервисов *DAV. С помощью данной настройки можно изменить поведение по умолчанию. Чтобы достичь поведения, как было до ownCloud 5, введите атрибут отображаемого имени пользователя в этом поле. Оставьте его пустым для режима по умолчанию. Изменения будут иметь эффект только для новых подключенных (добавленных) пользователей LDAP.", "Internal Username Attribute:" : "Атрибут для внутреннего имени:", "Override UUID detection" : "Переопределить нахождение UUID", "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "По умолчанию ownCloud определяет атрибут UUID автоматически. Этот атрибут используется для того, чтобы достоверно идентифицировать пользователей и группы LDAP. Также на основании атрибута UUID создается внутреннее имя пользователя, если выше не указано иначе. Вы можете переопределить эту настройку и указать свой атрибут по выбору. Вы должны удостовериться, что выбранный вами атрибут может быть выбран для пользователей и групп, а также то, что он уникальный. Оставьте поле пустым для поведения по умолчанию. Изменения вступят в силу только для новых подключенных (добавленных) пользователей и групп LDAP.", diff --git a/apps/user_ldap/l10n/ru.json b/apps/user_ldap/l10n/ru.json index fe160aa035d..e20baa90401 100644 --- a/apps/user_ldap/l10n/ru.json +++ b/apps/user_ldap/l10n/ru.json @@ -2,8 +2,8 @@ "Failed to clear the mappings." : "Не удалось очистить соответствия.", "Failed to delete the server configuration" : "Не удалось удалить конфигурацию сервера", "The configuration is valid and the connection could be established!" : "Конфигурация правильная и подключение может быть установлено!", - "The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "Конфигурация верна, но операция подключения завершилась неудачно. Пожалуйста, проверьте настройки сервера и учетные данные.", - "The configuration is invalid. Please have a look at the logs for further details." : "Конфигурация недействительна. Пожалуйста, просмотрите логи для уточнения деталей.", + "The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "Конфигурация верна, но операция подключения завершилась неудачно. Проверьте настройки сервера и учетные данные.", + "The configuration is invalid. Please have a look at the logs for further details." : "Конфигурация недействительна. Проверьте журналы для уточнения деталей.", "No action specified" : "Действие не указано", "No configuration specified" : "Конфигурация не создана", "No data specified" : "Нет данных", @@ -31,6 +31,7 @@ "Confirm Deletion" : "Подтверждение удаления", "_%s group found_::_%s groups found_" : ["%s группа найдена","%s группы найдены","%s групп найдено"], "_%s user found_::_%s users found_" : ["%s пользователь найден","%s пользователя найдено","%s пользователей найдено"], + "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "Не удалось автоматически определить атрибут содержащий отображаемое имя пользователя. Зайдите в расширенные настройки ldap и укажите его вручную.", "Could not find the desired feature" : "Не могу найти требуемой функциональности", "Invalid Host" : "Неверный сервер", "Server" : "Сервер", @@ -114,10 +115,10 @@ "Quota Default" : "Квота по умолчанию", "in bytes" : "в байтах", "Email Field" : "Поле адреса электронной почты", - "User Home Folder Naming Rule" : "Правило именования домашней папки пользователя", + "User Home Folder Naming Rule" : "Правило именования домашнего каталога пользователя", "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Оставьте пустым для использования имени пользователя (по умолчанию). Иначе укажите атрибут LDAP/AD.", "Internal Username" : "Внутреннее имя пользователя", - "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. To achieve a similar behavior as before ownCloud 5 enter the user display name attribute in the following field. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "По умолчанию внутреннее имя пользователя будет создано из атрибута UUID. Таким образом имя пользователя становится уникальным и не требует конвертации символов. Внутреннее имя пользователя может состоять только из следующих символов: [ a-zA-Z0-9_.@- ]. Остальные символы замещаются соответствиями из таблицы ASCII или же просто пропускаются. При совпадении к имени будет добавлено или увеличено число. Внутреннее имя пользователя используется для внутренней идентификации пользователя. Также оно является именем по умолчанию для папки пользователя в ownCloud. Оно также является частью URL, к примеру, для всех сервисов *DAV. С помощью данной настройки можно изменить поведение по умолчанию. Чтобы достичь поведения, как было до ownCloud 5, введите атрибут отображаемого имени пользователя в этом поле. Оставьте его пустым для режима по умолчанию. Изменения будут иметь эффект только для новых подключенных (добавленных) пользователей LDAP.", + "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. To achieve a similar behavior as before ownCloud 5 enter the user display name attribute in the following field. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "По умолчанию внутреннее имя пользователя будет создано из атрибута UUID. Таким образом имя пользователя становится уникальным и не требует конвертации символов. Внутреннее имя пользователя может состоять только из следующих символов: [ a-zA-Z0-9_.@- ]. Остальные символы замещаются соответствиями из таблицы ASCII или же просто пропускаются. При совпадении к имени будет добавлено или увеличено число. Внутреннее имя пользователя используется для внутренней идентификации пользователя. Также оно является именем по умолчанию для каталога пользователя в ownCloud. Оно также является частью URL, к примеру, для всех сервисов *DAV. С помощью данной настройки можно изменить поведение по умолчанию. Чтобы достичь поведения, как было до ownCloud 5, введите атрибут отображаемого имени пользователя в этом поле. Оставьте его пустым для режима по умолчанию. Изменения будут иметь эффект только для новых подключенных (добавленных) пользователей LDAP.", "Internal Username Attribute:" : "Атрибут для внутреннего имени:", "Override UUID detection" : "Переопределить нахождение UUID", "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "По умолчанию ownCloud определяет атрибут UUID автоматически. Этот атрибут используется для того, чтобы достоверно идентифицировать пользователей и группы LDAP. Также на основании атрибута UUID создается внутреннее имя пользователя, если выше не указано иначе. Вы можете переопределить эту настройку и указать свой атрибут по выбору. Вы должны удостовериться, что выбранный вами атрибут может быть выбран для пользователей и групп, а также то, что он уникальный. Оставьте поле пустым для поведения по умолчанию. Изменения вступят в силу только для новых подключенных (добавленных) пользователей и групп LDAP.", diff --git a/apps/user_ldap/l10n/sk.php b/apps/user_ldap/l10n/sk.php deleted file mode 100644 index e258ffac223..00000000000 --- a/apps/user_ldap/l10n/sk.php +++ /dev/null @@ -1,8 +0,0 @@ -<?php -$TRANSLATIONS = array( -"_%s group found_::_%s groups found_" => array("","",""), -"_%s user found_::_%s users found_" => array("","",""), -"Save" => "Uložiť", -"Advanced" => "Pokročilé" -); -$PLURAL_FORMS = "nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"; diff --git a/apps/user_ldap/l10n/sl.js b/apps/user_ldap/l10n/sl.js index f7fd2772fe8..04ea48e11ec 100644 --- a/apps/user_ldap/l10n/sl.js +++ b/apps/user_ldap/l10n/sl.js @@ -33,6 +33,7 @@ OC.L10N.register( "Confirm Deletion" : "Potrdi brisanje", "_%s group found_::_%s groups found_" : ["%s najdena skupina","%s najdeni skupini","%s najdene skupine","%s najdenih skupin"], "_%s user found_::_%s users found_" : ["%s najden uporabnik","%s najdena uporabnika","%s najdeni uporabniki","%s najdenih uporabnikov"], + "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "Ni mogoče prebrati atributa prikaznega imena. Določiti ga je treba ročno med nastavitvami LDAP.", "Could not find the desired feature" : "Želene zmožnosti ni mogoče najti", "Invalid Host" : "Neveljaven gostitelj", "Server" : "Strežnik", @@ -76,6 +77,7 @@ OC.L10N.register( "Saving" : "Poteka shranjevanje ...", "Back" : "Nazaj", "Continue" : "Nadaljuj", + "LDAP" : "LDAP", "Expert" : "Napredno", "Advanced" : "Napredne možnosti", "<b>Warning:</b> Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behavior. Please ask your system administrator to disable one of them." : "<b>Opozorilo:</b> določili user_ldap in user_webdavauth sta neskladni, kar lahko vpliva na delovanje sistema. O napaki pošljite poročilo skrbniku sistema in opozorite, da je treba eno izmed možnosti onemogočiti.", diff --git a/apps/user_ldap/l10n/sl.json b/apps/user_ldap/l10n/sl.json index aa1c9444651..ef7bdd1ce32 100644 --- a/apps/user_ldap/l10n/sl.json +++ b/apps/user_ldap/l10n/sl.json @@ -31,6 +31,7 @@ "Confirm Deletion" : "Potrdi brisanje", "_%s group found_::_%s groups found_" : ["%s najdena skupina","%s najdeni skupini","%s najdene skupine","%s najdenih skupin"], "_%s user found_::_%s users found_" : ["%s najden uporabnik","%s najdena uporabnika","%s najdeni uporabniki","%s najdenih uporabnikov"], + "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "Ni mogoče prebrati atributa prikaznega imena. Določiti ga je treba ročno med nastavitvami LDAP.", "Could not find the desired feature" : "Želene zmožnosti ni mogoče najti", "Invalid Host" : "Neveljaven gostitelj", "Server" : "Strežnik", @@ -74,6 +75,7 @@ "Saving" : "Poteka shranjevanje ...", "Back" : "Nazaj", "Continue" : "Nadaljuj", + "LDAP" : "LDAP", "Expert" : "Napredno", "Advanced" : "Napredne možnosti", "<b>Warning:</b> Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behavior. Please ask your system administrator to disable one of them." : "<b>Opozorilo:</b> določili user_ldap in user_webdavauth sta neskladni, kar lahko vpliva na delovanje sistema. O napaki pošljite poročilo skrbniku sistema in opozorite, da je treba eno izmed možnosti onemogočiti.", diff --git a/apps/user_ldap/l10n/sq.js b/apps/user_ldap/l10n/sq.js index 056458c24b6..b436bef7bf2 100644 --- a/apps/user_ldap/l10n/sq.js +++ b/apps/user_ldap/l10n/sq.js @@ -32,6 +32,7 @@ OC.L10N.register( "For anonymous access, leave DN and Password empty." : "Për tu lidhur në mënyre anonime, lini bosh hapsirat e DN dhe fjalëkalim", "One Base DN per line" : "Një baze DN për rrjesht", "You can specify Base DN for users and groups in the Advanced tab" : "Ju mund të specifikoni Bazen DN për përdorues dhe grupe në butonin 'Të Përparuara'", + "Continue" : "Vazhdo", "Advanced" : "E përparuar", "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Njoftim:</b> moduli PHP LDAP nuk është instaluar, motori nuk do të funksionojë.Kontaktoni me administratorin e sistemit.", "Connection Settings" : "Të dhënat e lidhjes", diff --git a/apps/user_ldap/l10n/sq.json b/apps/user_ldap/l10n/sq.json index a3e87869355..5b81af7100d 100644 --- a/apps/user_ldap/l10n/sq.json +++ b/apps/user_ldap/l10n/sq.json @@ -30,6 +30,7 @@ "For anonymous access, leave DN and Password empty." : "Për tu lidhur në mënyre anonime, lini bosh hapsirat e DN dhe fjalëkalim", "One Base DN per line" : "Një baze DN për rrjesht", "You can specify Base DN for users and groups in the Advanced tab" : "Ju mund të specifikoni Bazen DN për përdorues dhe grupe në butonin 'Të Përparuara'", + "Continue" : "Vazhdo", "Advanced" : "E përparuar", "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Njoftim:</b> moduli PHP LDAP nuk është instaluar, motori nuk do të funksionojë.Kontaktoni me administratorin e sistemit.", "Connection Settings" : "Të dhënat e lidhjes", diff --git a/apps/user_ldap/l10n/sr@latin.js b/apps/user_ldap/l10n/sr@latin.js index aae5907b37e..38f5ade9f84 100644 --- a/apps/user_ldap/l10n/sr@latin.js +++ b/apps/user_ldap/l10n/sr@latin.js @@ -1,11 +1,14 @@ OC.L10N.register( "user_ldap", { + "Deletion failed" : "Brisanje neuspelo", "Error" : "Greška", "_%s group found_::_%s groups found_" : ["","",""], "_%s user found_::_%s users found_" : ["","",""], "Save" : "Snimi", "Help" : "Pomoć", + "Host" : "Računar", + "Port" : "Port", "Password" : "Lozinka", "Continue" : "Nastavi", "Advanced" : "Napredno" diff --git a/apps/user_ldap/l10n/sr@latin.json b/apps/user_ldap/l10n/sr@latin.json index 421de1a4e2e..b8371649c2b 100644 --- a/apps/user_ldap/l10n/sr@latin.json +++ b/apps/user_ldap/l10n/sr@latin.json @@ -1,9 +1,12 @@ { "translations": { + "Deletion failed" : "Brisanje neuspelo", "Error" : "Greška", "_%s group found_::_%s groups found_" : ["","",""], "_%s user found_::_%s users found_" : ["","",""], "Save" : "Snimi", "Help" : "Pomoć", + "Host" : "Računar", + "Port" : "Port", "Password" : "Lozinka", "Continue" : "Nastavi", "Advanced" : "Napredno" diff --git a/apps/user_ldap/l10n/sv.js b/apps/user_ldap/l10n/sv.js index 7d4ebe4962a..78fe328944a 100644 --- a/apps/user_ldap/l10n/sv.js +++ b/apps/user_ldap/l10n/sv.js @@ -25,7 +25,7 @@ OC.L10N.register( "Configuration incorrect" : "Felaktig konfiguration", "Configuration incomplete" : "Konfigurationen är ej komplett", "Select groups" : "Välj grupper", - "Select object classes" : "Välj Objekt-klasser", + "Select object classes" : "Välj objekt-klasser", "Select attributes" : "Välj attribut", "Connection test succeeded" : "Anslutningstestet lyckades", "Connection test failed" : "Anslutningstestet misslyckades", @@ -33,11 +33,12 @@ OC.L10N.register( "Confirm Deletion" : "Bekräfta radering", "_%s group found_::_%s groups found_" : ["%s grupp hittad","%s grupper hittade"], "_%s user found_::_%s users found_" : ["%s användare hittad","%s användare hittade"], + "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "Kunde inte upptäcka attributet användarvisningsnamn. Vänligen ange det själv i de avancerade LDAP-inställningarna.", "Could not find the desired feature" : "Det gick inte hitta den önskade funktionen", - "Invalid Host" : "Felaktig Host", + "Invalid Host" : "Felaktig värd", "Server" : "Server", - "User Filter" : "Användar filter", - "Login Filter" : "Login Filtrer", + "User Filter" : "Användarfilter", + "Login Filter" : "Inloggningsfilter", "Group Filter" : "Gruppfilter", "Save" : "Spara", "Test Configuration" : "Testa konfigurationen", @@ -48,33 +49,38 @@ OC.L10N.register( "Edit raw filter instead" : "Redigera rått filter istället", "Raw LDAP filter" : "Rått LDAP-filter", "The filter specifies which LDAP groups shall have access to the %s instance." : "Filtret specifierar vilka LDAD-grupper som ska ha åtkomst till %s instans", + "Test Filter" : "Testfilter", "groups found" : "grupper hittade", "Users login with this attribute:" : "Användare loggar in med detta attribut:", "LDAP Username:" : "LDAP användarnamn:", "LDAP Email Address:" : "LDAP e-postadress:", "Other Attributes:" : "Övriga attribut:", "Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" : "Definierar filter som tillämpas vid inloggning. %%uid ersätter användarnamn vid inloggningen. Exempel: \"uid=%%uid\"", - "1. Server" : "1.Server", + "1. Server" : "1. Server", "%s. Server:" : "%s. Server:", "Add Server Configuration" : "Lägg till serverinställning", - "Delete Configuration" : "Radera Konfiguration", + "Delete Configuration" : "Radera konfiguration", "Host" : "Server", "You can omit the protocol, except you require SSL. Then start with ldaps://" : "Du behöver inte ange protokoll förutom om du använder SSL. Starta då med ldaps://", "Port" : "Port", - "User DN" : "Användare DN", + "User DN" : "Användar-DN", "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "DN för användaren som skall användas, t.ex. uid=agent, dc=example, dc=com. För anonym åtkomst, lämna DN och lösenord tomt.", "Password" : "Lösenord", "For anonymous access, leave DN and Password empty." : "För anonym åtkomst, lämna DN och lösenord tomt.", - "One Base DN per line" : "Ett Start DN per rad", - "You can specify Base DN for users and groups in the Advanced tab" : "Du kan ange start DN för användare och grupper under fliken Avancerat", + "One Base DN per line" : "Ett start-DN per rad", + "You can specify Base DN for users and groups in the Advanced tab" : "Du kan ange start-DN för användare och grupper under fliken Avancerat", + "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Undviker automatiska LDAP-förfrågningar. Bättre för större installationer, men kräver en del LDAP-kunskap.", + "Manually enter LDAP filters (recommended for large directories)" : "Ange LDAP-filter manuellt (rekommenderat för stora kataloger)", "Limit %s access to users meeting these criteria:" : "Begränsa %s tillgång till användare som uppfyller dessa kriterier:", "The filter specifies which LDAP users shall have access to the %s instance." : "Filtret specifierar vilka LDAP-användare som skall ha åtkomst till %s instans", "users found" : "användare funna", + "Saving" : "Sparar", "Back" : "Tillbaka", "Continue" : "Fortsätt", + "LDAP" : "LDAP", "Expert" : "Expert", "Advanced" : "Avancerad", - "<b>Warning:</b> Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behavior. Please ask your system administrator to disable one of them." : "<b>Varning:</b> Apps user_ldap och user_webdavauth är inkompatibla. Oväntade problem kan uppstå. Be din systemadministratör att inaktivera en av dom.", + "<b>Warning:</b> Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behavior. Please ask your system administrator to disable one of them." : "<b>Varning:</b> Apps user_ldap och user_webdavauth är inkompatibla. Oväntade problem kan uppstå. Be din systemadministratör att inaktivera en av dem.", "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Varning:</b> PHP LDAP - modulen är inte installerad, serversidan kommer inte att fungera. Kontakta din systemadministratör för installation.", "Connection Settings" : "Uppkopplingsinställningar", "Configuration Active" : "Konfiguration aktiv", @@ -93,17 +99,17 @@ OC.L10N.register( "User Display Name Field" : "Attribut för användarnamn", "The LDAP attribute to use to generate the user's display name." : "LDAP-attributet som ska användas för att generera användarens visningsnamn.", "Base User Tree" : "Bas för användare i katalogtjänst", - "One User Base DN per line" : "En Användare start DN per rad", + "One User Base DN per line" : "En användarstart-DN per rad", "User Search Attributes" : "Användarsökningsattribut", "Optional; one attribute per line" : "Valfritt; ett attribut per rad", "Group Display Name Field" : "Attribut för gruppnamn", "The LDAP attribute to use to generate the groups's display name." : "LDAP-attributet som ska användas för att generera gruppens visningsnamn.", "Base Group Tree" : "Bas för grupper i katalogtjänst", - "One Group Base DN per line" : "En Grupp start DN per rad", + "One Group Base DN per line" : "En gruppstart-DN per rad", "Group Search Attributes" : "Gruppsökningsattribut", "Group-Member association" : "Attribut för gruppmedlemmar", "Nested Groups" : "Undergrupper", - "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "När den är påslagen, stöds grupper som innehåller grupper. (Fungerar endast om gruppmedlemmens attribut innehåller DNs.)", + "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "När den är påslagen, stöds grupper som innehåller grupper. (Fungerar endast om gruppmedlemmens attribut innehåller DN.)", "Paging chunksize" : "Paging klusterstorlek", "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Klusterstorlek som används för paged LDAP sökningar som kan komma att returnera skrymmande resultat som uppräknande av användare eller grupper. (Inställning av denna till 0 inaktiverar paged LDAP sökningar i de situationerna)", "Special Attributes" : "Specialattribut", @@ -112,17 +118,17 @@ OC.L10N.register( "in bytes" : "i bytes", "Email Field" : "E-postfält", "User Home Folder Naming Rule" : "Namnregel för hemkatalog", - "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Lämnas tomt för användarnamn (standard). Ange annars ett LDAP/AD-attribut.", - "Internal Username" : "Internt Användarnamn", + "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Lämnas tomt för användarnamn (standard). Ange annars ett LDAP-/AD-attribut.", + "Internal Username" : "Internt användarnamn", "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. To achieve a similar behavior as before ownCloud 5 enter the user display name attribute in the following field. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Som standard skapas det interna användarnamnet från UUID-attributet. Det säkerställer att användarnamnet är unikt och tecken inte behöver konverteras. Det interna användarnamnet har restriktionerna att endast följande tecken är tillåtna: [ a-zA-Z0-9_.@- ]. Andra tecken blir ersatta av deras motsvarighet i ASCII eller utelämnas helt. En siffra kommer att läggas till eller ökas på vid en kollision. Det interna användarnamnet används för att identifiera användaren internt. Det är även förvalt som användarens användarnamn i ownCloud. Det är även en port för fjärråtkomst, t.ex. för alla *DAV-tjänster. Med denna inställning kan det förvalda beteendet åsidosättas. För att uppnå ett liknande beteende som innan ownCloud 5, ange attributet för användarens visningsnamn i detta fält. Lämna det tomt för förvalt beteende. Ändringarna kommer endast att påverka nyligen mappade (tillagda) LDAP-användare", - "Internal Username Attribute:" : "Internt Användarnamn Attribut:", - "Override UUID detection" : "Åsidosätt UUID detektion", + "Internal Username Attribute:" : "Internt användarnamnsattribut:", + "Override UUID detection" : "Åsidosätt UUID-detektion", "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Som standard upptäcker ownCloud automatiskt UUID-attributet. Det UUID-attributet används för att utan tvivel identifiera LDAP-användare och grupper. Dessutom kommer interna användarnamn skapas baserat på detta UUID, om inte annat anges ovan. Du kan åsidosätta inställningen och passera ett attribut som du själv väljer. Du måste se till att attributet som du väljer kan hämtas för både användare och grupper och att det är unikt. Lämna det tomt för standard beteende. Förändringar kommer endast att påverka nyligen mappade (tillagda) LDAP-användare och grupper.", - "UUID Attribute for Users:" : "UUID Attribut för Användare:", - "UUID Attribute for Groups:" : "UUID Attribut för Grupper:", - "Username-LDAP User Mapping" : "Användarnamn-LDAP User Mapping", - "Usernames are used to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have a internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "ownCloud använder sig av användarnamn för att lagra och tilldela (meta) data. För att exakt kunna identifiera och känna igen användare, kommer varje LDAP-användare ha ett internt användarnamn. Detta kräver en mappning från ownCloud-användarnamn till LDAP-användare. Det skapade användarnamnet mappas till UUID för LDAP-användaren. Dessutom cachas DN samt minska LDAP-interaktionen, men den används inte för identifiering. Om DN förändras, kommer förändringarna hittas av ownCloud. Det interna ownCloud-namnet används överallt i ownCloud. Om du rensar/raderar mappningarna kommer att lämna referenser överallt i systemet. Men den är inte konfigurationskänslig, den påverkar alla LDAP-konfigurationer! Rensa/radera aldrig mappningarna i en produktionsmiljö. Utan gör detta endast på i testmiljö!", - "Clear Username-LDAP User Mapping" : "Rensa Användarnamn-LDAP User Mapping", - "Clear Groupname-LDAP Group Mapping" : "Rensa Gruppnamn-LDAP Group Mapping" + "UUID Attribute for Users:" : "UUID-attribut för användare:", + "UUID Attribute for Groups:" : "UUID-attribut för grupper:", + "Username-LDAP User Mapping" : "Användarnamn-LDAP användarmappning", + "Usernames are used to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have a internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "ownCloud använder sig av användarnamn för att lagra och tilldela (meta) data. För att exakt kunna identifiera och känna igen användare, kommer varje LDAP-användare ha ett internt användarnamn. Detta kräver en mappning från ownCloud-användarnamn till LDAP-användare. Det skapade användarnamnet mappas till UUID för LDAP-användaren. Dessutom cachas DN samt minskar LDAP-interaktionen, men den används inte för identifiering. Om DN förändras, kommer förändringarna hittas av ownCloud. Det interna ownCloud-namnet används överallt i ownCloud. Om du rensar/raderar mappningarna kommer att lämna referenser överallt i systemet. Men den är inte konfigurationskänslig, den påverkar alla LDAP-konfigurationer! Rensa/radera aldrig mappningarna i en produktionsmiljö, utan gör detta endast i testmiljö!", + "Clear Username-LDAP User Mapping" : "Rensa användarnamn-LDAP användarmappning", + "Clear Groupname-LDAP Group Mapping" : "Rensa gruppnamn-LDAP gruppmappning" }, "nplurals=2; plural=(n != 1);"); diff --git a/apps/user_ldap/l10n/sv.json b/apps/user_ldap/l10n/sv.json index 5f2949c2d00..41d6c1d7492 100644 --- a/apps/user_ldap/l10n/sv.json +++ b/apps/user_ldap/l10n/sv.json @@ -23,7 +23,7 @@ "Configuration incorrect" : "Felaktig konfiguration", "Configuration incomplete" : "Konfigurationen är ej komplett", "Select groups" : "Välj grupper", - "Select object classes" : "Välj Objekt-klasser", + "Select object classes" : "Välj objekt-klasser", "Select attributes" : "Välj attribut", "Connection test succeeded" : "Anslutningstestet lyckades", "Connection test failed" : "Anslutningstestet misslyckades", @@ -31,11 +31,12 @@ "Confirm Deletion" : "Bekräfta radering", "_%s group found_::_%s groups found_" : ["%s grupp hittad","%s grupper hittade"], "_%s user found_::_%s users found_" : ["%s användare hittad","%s användare hittade"], + "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "Kunde inte upptäcka attributet användarvisningsnamn. Vänligen ange det själv i de avancerade LDAP-inställningarna.", "Could not find the desired feature" : "Det gick inte hitta den önskade funktionen", - "Invalid Host" : "Felaktig Host", + "Invalid Host" : "Felaktig värd", "Server" : "Server", - "User Filter" : "Användar filter", - "Login Filter" : "Login Filtrer", + "User Filter" : "Användarfilter", + "Login Filter" : "Inloggningsfilter", "Group Filter" : "Gruppfilter", "Save" : "Spara", "Test Configuration" : "Testa konfigurationen", @@ -46,33 +47,38 @@ "Edit raw filter instead" : "Redigera rått filter istället", "Raw LDAP filter" : "Rått LDAP-filter", "The filter specifies which LDAP groups shall have access to the %s instance." : "Filtret specifierar vilka LDAD-grupper som ska ha åtkomst till %s instans", + "Test Filter" : "Testfilter", "groups found" : "grupper hittade", "Users login with this attribute:" : "Användare loggar in med detta attribut:", "LDAP Username:" : "LDAP användarnamn:", "LDAP Email Address:" : "LDAP e-postadress:", "Other Attributes:" : "Övriga attribut:", "Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" : "Definierar filter som tillämpas vid inloggning. %%uid ersätter användarnamn vid inloggningen. Exempel: \"uid=%%uid\"", - "1. Server" : "1.Server", + "1. Server" : "1. Server", "%s. Server:" : "%s. Server:", "Add Server Configuration" : "Lägg till serverinställning", - "Delete Configuration" : "Radera Konfiguration", + "Delete Configuration" : "Radera konfiguration", "Host" : "Server", "You can omit the protocol, except you require SSL. Then start with ldaps://" : "Du behöver inte ange protokoll förutom om du använder SSL. Starta då med ldaps://", "Port" : "Port", - "User DN" : "Användare DN", + "User DN" : "Användar-DN", "The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "DN för användaren som skall användas, t.ex. uid=agent, dc=example, dc=com. För anonym åtkomst, lämna DN och lösenord tomt.", "Password" : "Lösenord", "For anonymous access, leave DN and Password empty." : "För anonym åtkomst, lämna DN och lösenord tomt.", - "One Base DN per line" : "Ett Start DN per rad", - "You can specify Base DN for users and groups in the Advanced tab" : "Du kan ange start DN för användare och grupper under fliken Avancerat", + "One Base DN per line" : "Ett start-DN per rad", + "You can specify Base DN for users and groups in the Advanced tab" : "Du kan ange start-DN för användare och grupper under fliken Avancerat", + "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Undviker automatiska LDAP-förfrågningar. Bättre för större installationer, men kräver en del LDAP-kunskap.", + "Manually enter LDAP filters (recommended for large directories)" : "Ange LDAP-filter manuellt (rekommenderat för stora kataloger)", "Limit %s access to users meeting these criteria:" : "Begränsa %s tillgång till användare som uppfyller dessa kriterier:", "The filter specifies which LDAP users shall have access to the %s instance." : "Filtret specifierar vilka LDAP-användare som skall ha åtkomst till %s instans", "users found" : "användare funna", + "Saving" : "Sparar", "Back" : "Tillbaka", "Continue" : "Fortsätt", + "LDAP" : "LDAP", "Expert" : "Expert", "Advanced" : "Avancerad", - "<b>Warning:</b> Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behavior. Please ask your system administrator to disable one of them." : "<b>Varning:</b> Apps user_ldap och user_webdavauth är inkompatibla. Oväntade problem kan uppstå. Be din systemadministratör att inaktivera en av dom.", + "<b>Warning:</b> Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behavior. Please ask your system administrator to disable one of them." : "<b>Varning:</b> Apps user_ldap och user_webdavauth är inkompatibla. Oväntade problem kan uppstå. Be din systemadministratör att inaktivera en av dem.", "<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Varning:</b> PHP LDAP - modulen är inte installerad, serversidan kommer inte att fungera. Kontakta din systemadministratör för installation.", "Connection Settings" : "Uppkopplingsinställningar", "Configuration Active" : "Konfiguration aktiv", @@ -91,17 +97,17 @@ "User Display Name Field" : "Attribut för användarnamn", "The LDAP attribute to use to generate the user's display name." : "LDAP-attributet som ska användas för att generera användarens visningsnamn.", "Base User Tree" : "Bas för användare i katalogtjänst", - "One User Base DN per line" : "En Användare start DN per rad", + "One User Base DN per line" : "En användarstart-DN per rad", "User Search Attributes" : "Användarsökningsattribut", "Optional; one attribute per line" : "Valfritt; ett attribut per rad", "Group Display Name Field" : "Attribut för gruppnamn", "The LDAP attribute to use to generate the groups's display name." : "LDAP-attributet som ska användas för att generera gruppens visningsnamn.", "Base Group Tree" : "Bas för grupper i katalogtjänst", - "One Group Base DN per line" : "En Grupp start DN per rad", + "One Group Base DN per line" : "En gruppstart-DN per rad", "Group Search Attributes" : "Gruppsökningsattribut", "Group-Member association" : "Attribut för gruppmedlemmar", "Nested Groups" : "Undergrupper", - "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "När den är påslagen, stöds grupper som innehåller grupper. (Fungerar endast om gruppmedlemmens attribut innehåller DNs.)", + "When switched on, groups that contain groups are supported. (Only works if the group member attribute contains DNs.)" : "När den är påslagen, stöds grupper som innehåller grupper. (Fungerar endast om gruppmedlemmens attribut innehåller DN.)", "Paging chunksize" : "Paging klusterstorlek", "Chunksize used for paged LDAP searches that may return bulky results like user or group enumeration. (Setting it 0 disables paged LDAP searches in those situations.)" : "Klusterstorlek som används för paged LDAP sökningar som kan komma att returnera skrymmande resultat som uppräknande av användare eller grupper. (Inställning av denna till 0 inaktiverar paged LDAP sökningar i de situationerna)", "Special Attributes" : "Specialattribut", @@ -110,17 +116,17 @@ "in bytes" : "i bytes", "Email Field" : "E-postfält", "User Home Folder Naming Rule" : "Namnregel för hemkatalog", - "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Lämnas tomt för användarnamn (standard). Ange annars ett LDAP/AD-attribut.", - "Internal Username" : "Internt Användarnamn", + "Leave empty for user name (default). Otherwise, specify an LDAP/AD attribute." : "Lämnas tomt för användarnamn (standard). Ange annars ett LDAP-/AD-attribut.", + "Internal Username" : "Internt användarnamn", "By default the internal username will be created from the UUID attribute. It makes sure that the username is unique and characters do not need to be converted. The internal username has the restriction that only these characters are allowed: [ a-zA-Z0-9_.@- ]. Other characters are replaced with their ASCII correspondence or simply omitted. On collisions a number will be added/increased. The internal username is used to identify a user internally. It is also the default name for the user home folder. It is also a part of remote URLs, for instance for all *DAV services. With this setting, the default behavior can be overridden. To achieve a similar behavior as before ownCloud 5 enter the user display name attribute in the following field. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users." : "Som standard skapas det interna användarnamnet från UUID-attributet. Det säkerställer att användarnamnet är unikt och tecken inte behöver konverteras. Det interna användarnamnet har restriktionerna att endast följande tecken är tillåtna: [ a-zA-Z0-9_.@- ]. Andra tecken blir ersatta av deras motsvarighet i ASCII eller utelämnas helt. En siffra kommer att läggas till eller ökas på vid en kollision. Det interna användarnamnet används för att identifiera användaren internt. Det är även förvalt som användarens användarnamn i ownCloud. Det är även en port för fjärråtkomst, t.ex. för alla *DAV-tjänster. Med denna inställning kan det förvalda beteendet åsidosättas. För att uppnå ett liknande beteende som innan ownCloud 5, ange attributet för användarens visningsnamn i detta fält. Lämna det tomt för förvalt beteende. Ändringarna kommer endast att påverka nyligen mappade (tillagda) LDAP-användare", - "Internal Username Attribute:" : "Internt Användarnamn Attribut:", - "Override UUID detection" : "Åsidosätt UUID detektion", + "Internal Username Attribute:" : "Internt användarnamnsattribut:", + "Override UUID detection" : "Åsidosätt UUID-detektion", "By default, the UUID attribute is automatically detected. The UUID attribute is used to doubtlessly identify LDAP users and groups. Also, the internal username will be created based on the UUID, if not specified otherwise above. You can override the setting and pass an attribute of your choice. You must make sure that the attribute of your choice can be fetched for both users and groups and it is unique. Leave it empty for default behavior. Changes will have effect only on newly mapped (added) LDAP users and groups." : "Som standard upptäcker ownCloud automatiskt UUID-attributet. Det UUID-attributet används för att utan tvivel identifiera LDAP-användare och grupper. Dessutom kommer interna användarnamn skapas baserat på detta UUID, om inte annat anges ovan. Du kan åsidosätta inställningen och passera ett attribut som du själv väljer. Du måste se till att attributet som du väljer kan hämtas för både användare och grupper och att det är unikt. Lämna det tomt för standard beteende. Förändringar kommer endast att påverka nyligen mappade (tillagda) LDAP-användare och grupper.", - "UUID Attribute for Users:" : "UUID Attribut för Användare:", - "UUID Attribute for Groups:" : "UUID Attribut för Grupper:", - "Username-LDAP User Mapping" : "Användarnamn-LDAP User Mapping", - "Usernames are used to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have a internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "ownCloud använder sig av användarnamn för att lagra och tilldela (meta) data. För att exakt kunna identifiera och känna igen användare, kommer varje LDAP-användare ha ett internt användarnamn. Detta kräver en mappning från ownCloud-användarnamn till LDAP-användare. Det skapade användarnamnet mappas till UUID för LDAP-användaren. Dessutom cachas DN samt minska LDAP-interaktionen, men den används inte för identifiering. Om DN förändras, kommer förändringarna hittas av ownCloud. Det interna ownCloud-namnet används överallt i ownCloud. Om du rensar/raderar mappningarna kommer att lämna referenser överallt i systemet. Men den är inte konfigurationskänslig, den påverkar alla LDAP-konfigurationer! Rensa/radera aldrig mappningarna i en produktionsmiljö. Utan gör detta endast på i testmiljö!", - "Clear Username-LDAP User Mapping" : "Rensa Användarnamn-LDAP User Mapping", - "Clear Groupname-LDAP Group Mapping" : "Rensa Gruppnamn-LDAP Group Mapping" + "UUID Attribute for Users:" : "UUID-attribut för användare:", + "UUID Attribute for Groups:" : "UUID-attribut för grupper:", + "Username-LDAP User Mapping" : "Användarnamn-LDAP användarmappning", + "Usernames are used to store and assign (meta) data. In order to precisely identify and recognize users, each LDAP user will have a internal username. This requires a mapping from username to LDAP user. The created username is mapped to the UUID of the LDAP user. Additionally the DN is cached as well to reduce LDAP interaction, but it is not used for identification. If the DN changes, the changes will be found. The internal username is used all over. Clearing the mappings will have leftovers everywhere. Clearing the mappings is not configuration sensitive, it affects all LDAP configurations! Never clear the mappings in a production environment, only in a testing or experimental stage." : "ownCloud använder sig av användarnamn för att lagra och tilldela (meta) data. För att exakt kunna identifiera och känna igen användare, kommer varje LDAP-användare ha ett internt användarnamn. Detta kräver en mappning från ownCloud-användarnamn till LDAP-användare. Det skapade användarnamnet mappas till UUID för LDAP-användaren. Dessutom cachas DN samt minskar LDAP-interaktionen, men den används inte för identifiering. Om DN förändras, kommer förändringarna hittas av ownCloud. Det interna ownCloud-namnet används överallt i ownCloud. Om du rensar/raderar mappningarna kommer att lämna referenser överallt i systemet. Men den är inte konfigurationskänslig, den påverkar alla LDAP-konfigurationer! Rensa/radera aldrig mappningarna i en produktionsmiljö, utan gör detta endast i testmiljö!", + "Clear Username-LDAP User Mapping" : "Rensa användarnamn-LDAP användarmappning", + "Clear Groupname-LDAP Group Mapping" : "Rensa gruppnamn-LDAP gruppmappning" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/apps/user_ldap/l10n/tr.js b/apps/user_ldap/l10n/tr.js index 75f3678fdd9..a4c308e5354 100644 --- a/apps/user_ldap/l10n/tr.js +++ b/apps/user_ldap/l10n/tr.js @@ -33,6 +33,7 @@ OC.L10N.register( "Confirm Deletion" : "Silmeyi onayla", "_%s group found_::_%s groups found_" : ["%s grup bulundu","%s grup bulundu"], "_%s user found_::_%s users found_" : ["%s kullanıcı bulundu","%s kullanıcı bulundu"], + "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "Görüntülenecek kullanıcı adı özelliği algılanamadı. Lütfen gelişmiş ldap ayarlarına girerek kendiniz belirleyin.", "Could not find the desired feature" : "İstenen özellik bulunamadı", "Invalid Host" : "Geçersiz Makine", "Server" : "Sunucu", diff --git a/apps/user_ldap/l10n/tr.json b/apps/user_ldap/l10n/tr.json index 9b6f3a37ade..dbd4a9b7406 100644 --- a/apps/user_ldap/l10n/tr.json +++ b/apps/user_ldap/l10n/tr.json @@ -31,6 +31,7 @@ "Confirm Deletion" : "Silmeyi onayla", "_%s group found_::_%s groups found_" : ["%s grup bulundu","%s grup bulundu"], "_%s user found_::_%s users found_" : ["%s kullanıcı bulundu","%s kullanıcı bulundu"], + "Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "Görüntülenecek kullanıcı adı özelliği algılanamadı. Lütfen gelişmiş ldap ayarlarına girerek kendiniz belirleyin.", "Could not find the desired feature" : "İstenen özellik bulunamadı", "Invalid Host" : "Geçersiz Makine", "Server" : "Sunucu", diff --git a/apps/user_ldap/l10n/uk.js b/apps/user_ldap/l10n/uk.js index 538061db520..0b8e8946e0f 100644 --- a/apps/user_ldap/l10n/uk.js +++ b/apps/user_ldap/l10n/uk.js @@ -76,6 +76,7 @@ OC.L10N.register( "Saving" : "Збереження", "Back" : "Назад", "Continue" : "Продовжити", + "LDAP" : "LDAP", "Expert" : "Експерт", "Advanced" : "Додатково", "<b>Warning:</b> Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behavior. Please ask your system administrator to disable one of them." : "<b>Попередження:</b> Застосунки user_ldap та user_webdavauth не сумісні. Ви можете зіткнутися з несподіваною поведінкою. Будь ласка, зверніться до системного адміністратора, щоб відключити одну з них.", diff --git a/apps/user_ldap/l10n/uk.json b/apps/user_ldap/l10n/uk.json index f0b439ac979..9fb1ce119fb 100644 --- a/apps/user_ldap/l10n/uk.json +++ b/apps/user_ldap/l10n/uk.json @@ -74,6 +74,7 @@ "Saving" : "Збереження", "Back" : "Назад", "Continue" : "Продовжити", + "LDAP" : "LDAP", "Expert" : "Експерт", "Advanced" : "Додатково", "<b>Warning:</b> Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behavior. Please ask your system administrator to disable one of them." : "<b>Попередження:</b> Застосунки user_ldap та user_webdavauth не сумісні. Ви можете зіткнутися з несподіваною поведінкою. Будь ласка, зверніться до системного адміністратора, щоб відключити одну з них.", diff --git a/apps/user_ldap/l10n/ur.php b/apps/user_ldap/l10n/ur.php deleted file mode 100644 index c29e4dba209..00000000000 --- a/apps/user_ldap/l10n/ur.php +++ /dev/null @@ -1,7 +0,0 @@ -<?php -$TRANSLATIONS = array( -"Error" => "خرابی", -"_%s group found_::_%s groups found_" => array("",""), -"_%s user found_::_%s users found_" => array("","") -); -$PLURAL_FORMS = "nplurals=2; plural=(n != 1);"; diff --git a/apps/user_ldap/l10n/zh_HK.js b/apps/user_ldap/l10n/zh_HK.js index 27ecbc63e53..2bd0061ab7a 100644 --- a/apps/user_ldap/l10n/zh_HK.js +++ b/apps/user_ldap/l10n/zh_HK.js @@ -1,14 +1,26 @@ OC.L10N.register( "user_ldap", { + "Keep settings?" : "儲存設定?", + "{nthServer}. Server" : "{nthServer}. 伺服器", "Success" : "成功", "Error" : "錯誤", - "_%s group found_::_%s groups found_" : [""], - "_%s user found_::_%s users found_" : [""], + "Select groups" : "選擇群組", + "_%s group found_::_%s groups found_" : ["找到 %s 群組"], + "_%s user found_::_%s users found_" : ["找到 %s 用戶"], + "Server" : "伺服器", "Save" : "儲存", + "Test Configuration" : "測試配置", "Help" : "幫助", + "1. Server" : "1. 伺服器", + "%s. Server:" : "%s. 伺服器:", + "Host" : "主機", "Port" : "連接埠", "Password" : "密碼", + "Saving" : "儲存中", + "Back" : "返回", + "Continue" : "繼續", + "LDAP" : "LDAP", "Advanced" : "進階" }, "nplurals=1; plural=0;"); diff --git a/apps/user_ldap/l10n/zh_HK.json b/apps/user_ldap/l10n/zh_HK.json index d75229ec90e..5e350517a36 100644 --- a/apps/user_ldap/l10n/zh_HK.json +++ b/apps/user_ldap/l10n/zh_HK.json @@ -1,12 +1,24 @@ { "translations": { + "Keep settings?" : "儲存設定?", + "{nthServer}. Server" : "{nthServer}. 伺服器", "Success" : "成功", "Error" : "錯誤", - "_%s group found_::_%s groups found_" : [""], - "_%s user found_::_%s users found_" : [""], + "Select groups" : "選擇群組", + "_%s group found_::_%s groups found_" : ["找到 %s 群組"], + "_%s user found_::_%s users found_" : ["找到 %s 用戶"], + "Server" : "伺服器", "Save" : "儲存", + "Test Configuration" : "測試配置", "Help" : "幫助", + "1. Server" : "1. 伺服器", + "%s. Server:" : "%s. 伺服器:", + "Host" : "主機", "Port" : "連接埠", "Password" : "密碼", + "Saving" : "儲存中", + "Back" : "返回", + "Continue" : "繼續", + "LDAP" : "LDAP", "Advanced" : "進階" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/user_ldap/lib/access.php b/apps/user_ldap/lib/access.php index 12c6f8118d3..f3657176f70 100644 --- a/apps/user_ldap/lib/access.php +++ b/apps/user_ldap/lib/access.php @@ -23,6 +23,8 @@ namespace OCA\user_ldap\lib; +use OCA\User_LDAP\Mapping\AbstractMapping; + /** * Class Access * @package OCA\user_ldap\lib @@ -47,6 +49,16 @@ class Access extends LDAPUtility implements user\IUserTools { */ protected $lastCookie = ''; + /** + * @var AbstractMapping $userMapper + */ + protected $userMapper; + + /** + * @var AbstractMapping $userMapper + */ + protected $groupMapper; + public function __construct(Connection $connection, ILDAPWrapper $ldap, user\Manager $userManager) { parent::__construct($ldap); @@ -56,6 +68,46 @@ class Access extends LDAPUtility implements user\IUserTools { } /** + * sets the User Mapper + * @param AbstractMapping $mapper + */ + public function setUserMapper(AbstractMapping $mapper) { + $this->userMapper = $mapper; + } + + /** + * returns the User Mapper + * @throws \Exception + * @return AbstractMapping + */ + public function getUserMapper() { + if(is_null($this->userMapper)) { + throw new \Exception('UserMapper was not assigned to this Access instance.'); + } + return $this->userMapper; + } + + /** + * sets the Group Mapper + * @param AbstractMapping $mapper + */ + public function setGroupMapper(AbstractMapping $mapper) { + $this->groupMapper = $mapper; + } + + /** + * returns the Group Mapper + * @throws \Exception + * @return AbstractMapping + */ + public function getGroupMapper() { + if(is_null($this->groupMapper)) { + throw new \Exception('GroupMapper was not assigned to this Access instance.'); + } + return $this->groupMapper; + } + + /** * @return bool */ private function checkConnection() { @@ -236,31 +288,12 @@ class Access extends LDAPUtility implements user\IUserTools { } /** - * gives back the database table for the query - * @param bool $isUser - * @return string - */ - private function getMapTable($isUser) { - if($isUser) { - return '*PREFIX*ldap_user_mapping'; - } else { - return '*PREFIX*ldap_group_mapping'; - } - } - - /** * returns the LDAP DN for the given internal ownCloud name of the group * @param string $name the ownCloud name in question - * @return string with the LDAP DN on success, otherwise false + * @return string|false LDAP DN on success, otherwise false */ public function groupname2dn($name) { - $dn = $this->ocname2dn($name, false); - - if($dn) { - return $dn; - } - - return false; + return $this->groupMapper->getDNbyName($name); } /** @@ -269,50 +302,33 @@ class Access extends LDAPUtility implements user\IUserTools { * @return string with the LDAP DN on success, otherwise false */ public function username2dn($name) { - $dn = $this->ocname2dn($name, true); + $fdn = $this->userMapper->getDNbyName($name); + //Check whether the DN belongs to the Base, to avoid issues on multi- //server setups - if($dn && $this->isDNPartOfBase($dn, $this->connection->ldapBaseUsers)) { - return $dn; + if(is_string($fdn) && $this->isDNPartOfBase($fdn, $this->connection->ldapBaseUsers)) { + return $fdn; } return false; } /** - * returns the LDAP DN for the given internal ownCloud name - * @param string $name the ownCloud name in question - * @param boolean $isUser is it a user? otherwise group - * @return string with the LDAP DN on success, otherwise false - */ - private function ocname2dn($name, $isUser) { - $table = $this->getMapTable($isUser); - - $query = \OCP\DB::prepare(' - SELECT `ldap_dn` - FROM `'.$table.'` - WHERE `owncloud_name` = ? - '); - - $record = $query->execute(array($name))->fetchOne(); - return $record; - } - - /** + public function ocname2dn($name, $isUser) { * returns the internal ownCloud name for the given LDAP DN of the group, false on DN outside of search DN or failure - * @param string $dn the dn of the group object + * @param string $fdn the dn of the group object * @param string $ldapName optional, the display name of the object * @return string with the name to use in ownCloud, false on DN outside of search DN */ - public function dn2groupname($dn, $ldapName = null) { + public function dn2groupname($fdn, $ldapName = null) { //To avoid bypassing the base DN settings under certain circumstances //with the group support, check whether the provided DN matches one of //the given Bases - if(!$this->isDNPartOfBase($dn, $this->connection->ldapBaseGroups)) { + if(!$this->isDNPartOfBase($fdn, $this->connection->ldapBaseGroups)) { return false; } - return $this->dn2ocname($dn, $ldapName, false); + return $this->dn2ocname($fdn, $ldapName, false); } /** @@ -321,15 +337,15 @@ class Access extends LDAPUtility implements user\IUserTools { * @param string $ldapName optional, the display name of the object * @return string with with the name to use in ownCloud */ - public function dn2username($dn, $ldapName = null) { + public function dn2username($fdn, $ldapName = null) { //To avoid bypassing the base DN settings under certain circumstances //with the group support, check whether the provided DN matches one of //the given Bases - if(!$this->isDNPartOfBase($dn, $this->connection->ldapBaseUsers)) { + if(!$this->isDNPartOfBase($fdn, $this->connection->ldapBaseUsers)) { return false; } - return $this->dn2ocname($dn, $ldapName, true); + return $this->dn2ocname($fdn, $ldapName, true); } /** @@ -339,50 +355,39 @@ class Access extends LDAPUtility implements user\IUserTools { * @param bool $isUser optional, whether it is a user object (otherwise group assumed) * @return string with with the name to use in ownCloud */ - public function dn2ocname($dn, $ldapName = null, $isUser = true) { - $table = $this->getMapTable($isUser); + public function dn2ocname($fdn, $ldapName = null, $isUser = true) { if($isUser) { - $fncFindMappedName = 'findMappedUser'; + $mapper = $this->getUserMapper(); $nameAttribute = $this->connection->ldapUserDisplayName; } else { - $fncFindMappedName = 'findMappedGroup'; + $mapper = $this->getGroupMapper(); $nameAttribute = $this->connection->ldapGroupDisplayName; } //let's try to retrieve the ownCloud name from the mappings table - $ocName = $this->$fncFindMappedName($dn); - if($ocName) { + $ocName = $mapper->getNameByDN($fdn); + if(is_string($ocName)) { return $ocName; } //second try: get the UUID and check if it is known. Then, update the DN and return the name. - $uuid = $this->getUUID($dn, $isUser); - if($uuid) { - $query = \OCP\DB::prepare(' - SELECT `owncloud_name` - FROM `'.$table.'` - WHERE `directory_uuid` = ? - '); - $component = $query->execute(array($uuid))->fetchOne(); - if($component) { - $query = \OCP\DB::prepare(' - UPDATE `'.$table.'` - SET `ldap_dn` = ? - WHERE `directory_uuid` = ? - '); - $query->execute(array($dn, $uuid)); - return $component; + $uuid = $this->getUUID($fdn, $isUser); + if(is_string($uuid)) { + $ocName = $mapper->getNameByUUID($uuid); + if(is_string($ocName)) { + $mapper->setDNbyUUID($fdn, $uuid); + return $ocName; } } else { //If the UUID can't be detected something is foul. - \OCP\Util::writeLog('user_ldap', 'Cannot determine UUID for '.$dn.'. Skipping.', \OCP\Util::INFO); + \OCP\Util::writeLog('user_ldap', 'Cannot determine UUID for '.$fdn.'. Skipping.', \OCP\Util::INFO); return false; } if(is_null($ldapName)) { - $ldapName = $this->readAttribute($dn, $nameAttribute); + $ldapName = $this->readAttribute($fdn, $nameAttribute); if(!isset($ldapName[0]) && empty($ldapName[0])) { - \OCP\Util::writeLog('user_ldap', 'No or empty name for '.$dn.'.', \OCP\Util::INFO); + \OCP\Util::writeLog('user_ldap', 'No or empty name for '.$fdn.'.', \OCP\Util::INFO); return false; } $ldapName = $ldapName[0]; @@ -390,8 +395,8 @@ class Access extends LDAPUtility implements user\IUserTools { if($isUser) { $usernameAttribute = $this->connection->ldapExpertUsernameAttr; - if(!emptY($usernameAttribute)) { - $username = $this->readAttribute($dn, $usernameAttribute); + if(!empty($usernameAttribute)) { + $username = $this->readAttribute($fdn, $usernameAttribute); $username = $username[0]; } else { $username = $uuid; @@ -403,11 +408,13 @@ class Access extends LDAPUtility implements user\IUserTools { //a new user/group! Add it only if it doesn't conflict with other backend's users or existing groups //disabling Cache is required to avoid that the new user is cached as not-existing in fooExists check + //NOTE: mind, disabling cache affects only this instance! Using it + // outside of core user management will still cache the user as non-existing. $originalTTL = $this->connection->ldapCacheTTL; $this->connection->setConfiguration(array('ldapCacheTTL' => 0)); if(($isUser && !\OCP\User::userExists($intName)) || (!$isUser && !\OC_Group::groupExists($intName))) { - if($this->mapComponent($dn, $intName, $isUser)) { + if($mapper->map($fdn, $intName, $uuid)) { $this->connection->setConfiguration(array('ldapCacheTTL' => $originalTTL)); return $intName; } @@ -415,12 +422,12 @@ class Access extends LDAPUtility implements user\IUserTools { $this->connection->setConfiguration(array('ldapCacheTTL' => $originalTTL)); $altName = $this->createAltInternalOwnCloudName($intName, $isUser); - if($this->mapComponent($dn, $altName, $isUser)) { + if(is_string($altName) && $mapper->map($fdn, $altName, $uuid)) { return $altName; } //if everything else did not help.. - \OCP\Util::writeLog('user_ldap', 'Could not create unique name for '.$dn.'.', \OCP\Util::INFO); + \OCP\Util::writeLog('user_ldap', 'Could not create unique name for '.$fdn.'.', \OCP\Util::INFO); return false; } @@ -447,46 +454,6 @@ class Access extends LDAPUtility implements user\IUserTools { } /** - * @param string $dn - * @return bool|string - */ - private function findMappedUser($dn) { - static $query = null; - if(is_null($query)) { - $query = \OCP\DB::prepare(' - SELECT `owncloud_name` - FROM `'.$this->getMapTable(true).'` - WHERE `ldap_dn` = ?' - ); - } - $res = $query->execute(array($dn))->fetchOne(); - if($res) { - return $res; - } - return false; - } - - /** - * @param string $dn - * @return bool|string - */ - private function findMappedGroup($dn) { - static $query = null; - if(is_null($query)) { - $query = \OCP\DB::prepare(' - SELECT `owncloud_name` - FROM `'.$this->getMapTable(false).'` - WHERE `ldap_dn` = ?' - ); - } - $res = $query->execute(array($dn))->fetchOne(); - if($res) { - return $res; - } - return false; - } - - /** * @param array $ldapObjects * @param bool $isUsers * @return array @@ -507,6 +474,7 @@ class Access extends LDAPUtility implements user\IUserTools { if($isUsers) { //cache the user names so it does not need to be retrieved //again later (e.g. sharing dialogue). + $this->cacheUserExists($ocName); $this->cacheUserDisplayName($ocName, $nameByLDAP); } } @@ -516,6 +484,14 @@ class Access extends LDAPUtility implements user\IUserTools { } /** + * caches a user as existing + * @param string $ocName the internal ownCloud username + */ + public function cacheUserExists($ocName) { + $this->connection->writeToCache('userExists'.$ocName, true); + } + + /** * caches the user display name * @param string $ocName the internal ownCloud username * @param string $displayName the display name @@ -560,17 +536,7 @@ class Access extends LDAPUtility implements user\IUserTools { * "Developers" */ private function _createAltInternalOwnCloudNameForGroups($name) { - $query = \OCP\DB::prepare(' - SELECT `owncloud_name` - FROM `'.$this->getMapTable(false).'` - WHERE `owncloud_name` LIKE ? - '); - - $usedNames = array(); - $res = $query->execute(array($name.'_%')); - while($row = $res->fetchRow()) { - $usedNames[] = $row['owncloud_name']; - } + $usedNames = $this->groupMapper->getNamesBySearch($name.'_%'); if(!($usedNames) || count($usedNames) === 0) { $lastNo = 1; //will become name_2 } else { @@ -615,92 +581,6 @@ class Access extends LDAPUtility implements user\IUserTools { } /** - * retrieves all known groups from the mappings table - * @return array with the results - * - * retrieves all known groups from the mappings table - */ - private function mappedGroups() { - return $this->mappedComponents(false); - } - - /** - * retrieves all known users from the mappings table - * @return array with the results - * - * retrieves all known users from the mappings table - */ - private function mappedUsers() { - return $this->mappedComponents(true); - } - - /** - * @param boolean $isUsers - * @return array - */ - private function mappedComponents($isUsers) { - $table = $this->getMapTable($isUsers); - - $query = \OCP\DB::prepare(' - SELECT `ldap_dn`, `owncloud_name` - FROM `'. $table . '`' - ); - - return $query->execute()->fetchAll(); - } - - /** - * inserts a new user or group into the mappings table - * @param string $dn the record in question - * @param string $ocName the name to use in ownCloud - * @param bool $isUser is it a user or a group? - * @return bool true on success, false otherwise - * - * inserts a new user or group into the mappings table - */ - private function mapComponent($dn, $ocName, $isUser = true) { - $table = $this->getMapTable($isUser); - - $sqlAdjustment = ''; - $dbType = \OCP\Config::getSystemValue('dbtype'); - if($dbType === 'mysql' || $dbType == 'oci') { - $sqlAdjustment = 'FROM DUAL'; - } - - $insert = \OCP\DB::prepare(' - INSERT INTO `'.$table.'` (`ldap_dn`, `owncloud_name`, `directory_uuid`) - SELECT ?,?,? - '.$sqlAdjustment.' - WHERE NOT EXISTS ( - SELECT 1 - FROM `'.$table.'` - WHERE `ldap_dn` = ? - OR `owncloud_name` = ?) - '); - - //feed the DB - $insRows = $insert->execute(array($dn, $ocName, - $this->getUUID($dn, $isUser), $dn, - $ocName)); - - if(\OCP\DB::isError($insRows)) { - return false; - } - - if($insRows === 0) { - return false; - } - - if($isUser) { - //make sure that email address is retrieved prior to login, so user - //will be notified when something is shared with him - $this->userManager->get($ocName)->update(); - } - - return true; - } - - /** * @param string $filter * @param string|string[] $attr * @param int $limit @@ -813,7 +693,7 @@ class Access extends LDAPUtility implements user\IUserTools { } //check whether paged search should be attempted - $pagedSearchOK = $this->initPagedSearch($filter, $base, $attr, $limit, $offset); + $pagedSearchOK = $this->initPagedSearch($filter, $base, $attr, intval($limit), $offset); $linkResources = array_pad(array(), count($base), $cr); $sr = $this->ldap->search($linkResources, $base, $filter, $attr); @@ -887,8 +767,9 @@ class Access extends LDAPUtility implements user\IUserTools { private function count($filter, $base, $attr = null, $limit = null, $offset = null, $skipHandling = false) { \OCP\Util::writeLog('user_ldap', 'Count filter: '.print_r($filter, true), \OCP\Util::DEBUG); - if(is_null($limit) || $limit <= 0) { - $limit = intval($this->connection->ldapPagingSize); + $limitPerPage = intval($this->connection->ldapPagingSize); + if(!is_null($limit) && $limit < $limitPerPage && $limit > 0) { + $limitPerPage = $limit; } $counter = 0; @@ -898,19 +779,19 @@ class Access extends LDAPUtility implements user\IUserTools { do { $continue = false; $search = $this->executeSearch($filter, $base, $attr, - $limit, $offset); + $limitPerPage, $offset); if($search === false) { return $counter > 0 ? $counter : false; } list($sr, $pagedSearchOK) = $search; - $count = $this->countEntriesInSearchResults($sr, $limit, $continue); + $count = $this->countEntriesInSearchResults($sr, $limitPerPage, $continue); $counter += $count; - $this->processPagedSearchStatus($sr, $filter, $base, $count, $limit, + $this->processPagedSearchStatus($sr, $filter, $base, $count, $limitPerPage, $offset, $pagedSearchOK, $skipHandling); - $offset += $limit; - } while($continue); + $offset += $limitPerPage; + } while($continue && (is_null($limit) || $limit <= 0 || $limit > $counter)); return $counter; } @@ -928,7 +809,7 @@ class Access extends LDAPUtility implements user\IUserTools { foreach($searchResults as $res) { $count = intval($this->ldap->countEntries($cr, $res)); $counter += $count; - if($count === $limit) { + if($count > 0 && $count === $limit) { $hasHitLimit = true; } } @@ -1073,12 +954,18 @@ class Access extends LDAPUtility implements user\IUserTools { /** * escapes (user provided) parts for LDAP filter * @param string $input, the provided value + * @param bool $allowAsterisk wether in * at the beginning should be preserved * @return string the escaped string */ - public function escapeFilterPart($input) { + public function escapeFilterPart($input, $allowAsterisk = false) { + $asterisk = ''; + if($allowAsterisk && strlen($input) > 0 && $input[0] === '*') { + $asterisk = '*'; + $input = mb_substr($input, 1, null, 'UTF-8'); + } $search = array('*', '\\', '(', ')'); $replace = array('\\*', '\\\\', '\\(', '\\)'); - return str_replace($search, $replace, $input); + return $asterisk . str_replace($search, $replace, $input); } /** @@ -1141,6 +1028,33 @@ class Access extends LDAPUtility implements user\IUserTools { } /** + * creates a filter part for searches by splitting up the given search + * string into single words + * @param string $search the search term + * @param string[] $searchAttributes needs to have at least two attributes, + * otherwise it does not make sense :) + * @return string the final filter part to use in LDAP searches + * @throws \Exception + */ + private function getAdvancedFilterPartForSearch($search, $searchAttributes) { + if(!is_array($searchAttributes) || count($searchAttributes) < 2) { + throw new \Exception('searchAttributes must be an array with at least two string'); + } + $searchWords = explode(' ', trim($search)); + $wordFilters = array(); + foreach($searchWords as $word) { + $word .= '*'; + //every word needs to appear at least once + $wordMatchOneAttrFilters = array(); + foreach($searchAttributes as $attr) { + $wordMatchOneAttrFilters[] = $attr . '=' . $word; + } + $wordFilters[] = $this->combineFilterWithOr($wordMatchOneAttrFilters); + } + return $this->combineFilterWithAnd($wordFilters); + } + + /** * creates a filter part for searches * @param string $search the search term * @param string[]|null $searchAttributes @@ -1150,7 +1064,19 @@ class Access extends LDAPUtility implements user\IUserTools { */ private function getFilterPartForSearch($search, $searchAttributes, $fallbackAttribute) { $filter = array(); - $search = empty($search) ? '*' : '*'.$search.'*'; + $haveMultiSearchAttributes = (is_array($searchAttributes) && count($searchAttributes) > 0); + if($haveMultiSearchAttributes && strpos(trim($search), ' ') !== false) { + try { + return $this->getAdvancedFilterPartForSearch($search, $searchAttributes); + } catch(\Exception $e) { + \OCP\Util::writeLog( + 'user_ldap', + 'Creating advanced filter for search failed, falling back to simple method.', + \OCP\Util::INFO + ); + } + } + $search = empty($search) ? '*' : $search.'*'; if(!is_array($searchAttributes) || count($searchAttributes) === 0) { if(empty($fallbackAttribute)) { return ''; @@ -1168,6 +1094,19 @@ class Access extends LDAPUtility implements user\IUserTools { } /** + * returns the filter used for counting users + * @return string + */ + public function getFilterForUserCount() { + $filter = $this->combineFilterWithAnd(array( + $this->connection->ldapUserFilter, + $this->connection->ldapUserDisplayName . '=*' + )); + + return $filter; + } + + /** * @param string $name * @param string $password * @return bool @@ -1235,7 +1174,7 @@ class Access extends LDAPUtility implements user\IUserTools { /** * @param string $dn * @param bool $isUser - * @return array|bool|false + * @return string|bool */ public function getUUID($dn, $isUser = true) { if($isUser) { @@ -1457,7 +1396,7 @@ class Access extends LDAPUtility implements user\IUserTools { */ private function initPagedSearch($filter, $bases, $attr, $limit, $offset) { $pagedSearchOK = false; - if($this->connection->hasPagedResultSupport && !is_null($limit)) { + if($this->connection->hasPagedResultSupport && ($limit !== 0)) { $offset = intval($offset); //can be null \OCP\Util::writeLog('user_ldap', 'initializing paged search for Filter '.$filter.' base '.print_r($bases, true) @@ -1492,7 +1431,7 @@ class Access extends LDAPUtility implements user\IUserTools { if(!$pagedSearchOK) { return false; } - \OCP\Util::writeLog('user_ldap', 'Ready for a paged search', \OCP\Util::INFO); + \OCP\Util::writeLog('user_ldap', 'Ready for a paged search', \OCP\Util::DEBUG); } else { \OCP\Util::writeLog('user_ldap', 'No paged search for us, Cpt., Limit '.$limit.' Offset '.$offset, diff --git a/apps/user_ldap/lib/connection.php b/apps/user_ldap/lib/connection.php index 336ea7b3bbc..c9b4fded9f9 100644 --- a/apps/user_ldap/lib/connection.php +++ b/apps/user_ldap/lib/connection.php @@ -29,6 +29,7 @@ namespace OCA\user_ldap\lib; * @property string ldapUserFilter * @property string ldapUserDisplayName * @property boolean hasPagedResultSupport + * @property string[] ldapBaseUsers */ class Connection extends LDAPUtility { private $ldapConnectionRes = null; @@ -70,8 +71,9 @@ class Connection extends LDAPUtility { } $this->hasPagedResultSupport = $this->ldap->hasPagedResultSupport(); + $helper = new Helper(); $this->doNotValidate = !in_array($this->configPrefix, - Helper::getServerConfigurationPrefixes()); + $helper->getServerConfigurationPrefixes()); } public function __destruct() { @@ -505,7 +507,7 @@ class Connection extends LDAPUtility { if(putenv('LDAPTLS_REQCERT=never')) { \OCP\Util::writeLog('user_ldap', 'Turned off SSL certificate validation successfully.', - \OCP\Util::WARN); + \OCP\Util::DEBUG); } else { \OCP\Util::writeLog('user_ldap', 'Could not turn off SSL certificate validation.', diff --git a/apps/user_ldap/lib/helper.php b/apps/user_ldap/lib/helper.php index 282f4549e3b..7a96cfa36c4 100644 --- a/apps/user_ldap/lib/helper.php +++ b/apps/user_ldap/lib/helper.php @@ -45,7 +45,7 @@ class Helper { * except the default (first) server shall be connected to. * */ - static public function getServerConfigurationPrefixes($activeConfigurations = false) { + public function getServerConfigurationPrefixes($activeConfigurations = false) { $referenceConfigkey = 'ldap_configuration_active'; $sql = ' @@ -83,7 +83,7 @@ class Helper { * @return array an array with configprefix as keys * */ - static public function getServerConfigurationHosts() { + public function getServerConfigurationHosts() { $referenceConfigkey = 'ldap_host'; $query = ' @@ -110,7 +110,7 @@ class Helper { * @param string $prefix the configuration prefix of the config to delete * @return bool true on success, false otherwise */ - static public function deleteServerConfiguration($prefix) { + public function deleteServerConfiguration($prefix) { if(!in_array($prefix, self::getServerConfigurationPrefixes())) { return false; } @@ -142,30 +142,19 @@ class Helper { } /** - * Truncate's the given mapping table - * - * @param string $mapping either 'user' or 'group' - * @return bool true on success, false otherwise + * checks whether there is one or more disabled LDAP configurations + * @throws \Exception + * @return bool */ - static public function clearMapping($mapping) { - if($mapping === 'user') { - $table = '`*PREFIX*ldap_user_mapping`'; - } else if ($mapping === 'group') { - $table = '`*PREFIX*ldap_group_mapping`'; - } else { - return false; - } + public function haveDisabledConfigurations() { + $all = $this->getServerConfigurationPrefixes(false); + $active = $this->getServerConfigurationPrefixes(true); - $connection = \OC_DB::getConnection(); - $sql = $connection->getDatabasePlatform()->getTruncateTableSQL($table); - $query = \OCP\DB::prepare($sql); - $res = $query->execute(); - - if(\OCP\DB::isError($res)) { - return false; + if(!is_array($all) || !is_array($active)) { + throw new \Exception('Unexpected Return Value'); } - return true; + return count($all) !== count($active) || count($all) === 0; } /** @@ -173,7 +162,7 @@ class Helper { * @param string $url the URL * @return string|false domain as string on success, false otherwise */ - static public function getDomainFromURL($url) { + public function getDomainFromURL($url) { $uinfo = parse_url($url); if(!is_array($uinfo)) { return false; diff --git a/apps/user_ldap/lib/jobs.php b/apps/user_ldap/lib/jobs.php index 47e536f8f64..a887b65251c 100644 --- a/apps/user_ldap/lib/jobs.php +++ b/apps/user_ldap/lib/jobs.php @@ -23,6 +23,9 @@ namespace OCA\user_ldap\lib; +use OCA\User_LDAP\Mapping\GroupMapping; +use OCA\User_LDAP\Mapping\UserMapping; + class Jobs extends \OC\BackgroundJob\TimedJob { static private $groupsFromDB; @@ -156,18 +159,25 @@ class Jobs extends \OC\BackgroundJob\TimedJob { if(!is_null(self::$groupBE)) { return self::$groupBE; } - $configPrefixes = Helper::getServerConfigurationPrefixes(true); + $helper = new Helper(); + $configPrefixes = $helper->getServerConfigurationPrefixes(true); $ldapWrapper = new LDAP(); if(count($configPrefixes) === 1) { //avoid the proxy when there is only one LDAP server configured + $dbc = \OC::$server->getDatabaseConnection(); $userManager = new user\Manager( \OC::$server->getConfig(), new FilesystemHelper(), new LogWrapper(), \OC::$server->getAvatarManager(), - new \OCP\Image()); + new \OCP\Image(), + $dbc); $connector = new Connection($ldapWrapper, $configPrefixes[0]); $ldapAccess = new Access($connector, $ldapWrapper, $userManager); + $groupMapper = new GroupMapping($dbc); + $userMapper = new UserMapping($dbc); + $ldapAccess->setGroupMapper($groupMapper); + $ldapAccess->setUserMapper($userMapper); self::$groupBE = new \OCA\user_ldap\GROUP_LDAP($ldapAccess); } else { self::$groupBE = new \OCA\user_ldap\Group_Proxy($configPrefixes, $ldapWrapper); diff --git a/apps/user_ldap/lib/jobs/cleanup.php b/apps/user_ldap/lib/jobs/cleanup.php new file mode 100644 index 00000000000..caf31f89820 --- /dev/null +++ b/apps/user_ldap/lib/jobs/cleanup.php @@ -0,0 +1,217 @@ +<?php +/** + * Copyright (c) 2014 Arthur Schiwon <blizzz@owncloud.com> + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace OCA\User_LDAP\Jobs; + +use \OC\BackgroundJob\TimedJob; +use \OCA\user_ldap\User_LDAP; +use \OCA\user_ldap\User_Proxy; +use \OCA\user_ldap\lib\Helper; +use \OCA\user_ldap\lib\LDAP; +use \OCA\user_ldap\lib\user\DeletedUsersIndex; +use \OCA\User_LDAP\Mapping\UserMapping; + +/** + * Class CleanUp + * + * a Background job to clean up deleted users + * + * @package OCA\user_ldap\lib; + */ +class CleanUp extends TimedJob { + /** @var int $limit amount of users that should be checked per run */ + protected $limit = 50; + + /** @var int $defaultIntervalMin default interval in minutes */ + protected $defaultIntervalMin = 51; + + /** @var User_LDAP|User_Proxy $userBackend */ + protected $userBackend; + + /** @var \OCP\IConfig $ocConfig */ + protected $ocConfig; + + /** @var \OCP\IDBConnection $db */ + protected $db; + + /** @var Helper $ldapHelper */ + protected $ldapHelper; + + /** @var \OCA\User_LDAP\Mapping\UserMapping */ + protected $mapping; + + /** @var \OCA\User_LDAP\lib\User\DeletedUsersIndex */ + protected $dui; + + public function __construct() { + $minutes = \OC::$server->getConfig()->getSystemValue( + 'ldapUserCleanupInterval', strval($this->defaultIntervalMin)); + $this->setInterval(intval($minutes) * 60); + } + + /** + * assigns the instances passed to run() to the class properties + * @param array $arguments + */ + public function setArguments($arguments) { + //Dependency Injection is not possible, because the constructor will + //only get values that are serialized to JSON. I.e. whatever we would + //pass in app.php we do add here, except something else is passed e.g. + //in tests. + + if(isset($arguments['helper'])) { + $this->ldapHelper = $arguments['helper']; + } else { + $this->ldapHelper = new Helper(); + } + + if(isset($arguments['ocConfig'])) { + $this->ocConfig = $arguments['ocConfig']; + } else { + $this->ocConfig = \OC::$server->getConfig(); + } + + if(isset($arguments['userBackend'])) { + $this->userBackend = $arguments['userBackend']; + } else { + $this->userBackend = new User_Proxy( + $this->ldapHelper->getServerConfigurationPrefixes(true), + new LDAP(), + $this->ocConfig + ); + } + + if(isset($arguments['db'])) { + $this->db = $arguments['db']; + } else { + $this->db = \OC::$server->getDatabaseConnection(); + } + + if(isset($arguments['mapping'])) { + $this->mapping = $arguments['mapping']; + } else { + $this->mapping = new UserMapping($this->db); + } + + if(isset($arguments['deletedUsersIndex'])) { + $this->dui = $arguments['deletedUsersIndex']; + } else { + $this->dui = new DeletedUsersIndex( + $this->ocConfig, $this->db, $this->mapping); + } + } + + /** + * makes the background job do its work + * @param array $argument + */ + public function run($argument) { + $this->setArguments($argument); + + if(!$this->isCleanUpAllowed()) { + return; + } + $users = $this->mapping->getList($this->getOffset(), $this->limit); + if(!is_array($users)) { + //something wrong? Let's start from the beginning next time and + //abort + $this->setOffset(true); + return; + } + $resetOffset = $this->isOffsetResetNecessary(count($users)); + $this->checkUsers($users); + $this->setOffset($resetOffset); + } + + /** + * checks whether next run should start at 0 again + * @param int $resultCount + * @return bool + */ + public function isOffsetResetNecessary($resultCount) { + return ($resultCount < $this->limit) ? true : false; + } + + /** + * checks whether cleaning up LDAP users is allowed + * @return bool + */ + public function isCleanUpAllowed() { + try { + if($this->ldapHelper->haveDisabledConfigurations()) { + return false; + } + } catch (\Exception $e) { + return false; + } + + $enabled = $this->isCleanUpEnabled(); + + return $enabled; + } + + /** + * checks whether clean up is enabled by configuration + * @return bool + */ + private function isCleanUpEnabled() { + return (bool)$this->ocConfig->getSystemValue( + 'ldapUserCleanupInterval', strval($this->defaultIntervalMin)); + } + + /** + * checks users whether they are still existing + * @param array $users result from getMappedUsers() + */ + private function checkUsers(array $users) { + foreach($users as $user) { + $this->checkUser($user); + } + } + + /** + * checks whether a user is still existing in LDAP + * @param string[] $user + */ + private function checkUser(array $user) { + if($this->userBackend->userExistsOnLDAP($user['name'])) { + //still available, all good + + return; + } + + $this->dui->markUser($user['name']); + } + + /** + * gets the offset to fetch users from the mappings table + * @return int + */ + private function getOffset() { + return intval($this->ocConfig->getAppValue('user_ldap', 'cleanUpJobOffset', 0)); + } + + /** + * sets the new offset for the next run + * @param bool $reset whether the offset should be set to 0 + */ + public function setOffset($reset = false) { + $newOffset = $reset ? 0 : + $this->getOffset() + $this->limit; + $this->ocConfig->setAppValue('user_ldap', 'cleanUpJobOffset', $newOffset); + } + + /** + * returns the chunk size (limit in DB speak) + * @return int + */ + public function getChunkSize() { + return $this->limit; + } + +} diff --git a/apps/user_ldap/lib/mapping/abstractmapping.php b/apps/user_ldap/lib/mapping/abstractmapping.php new file mode 100644 index 00000000000..cb9db83f683 --- /dev/null +++ b/apps/user_ldap/lib/mapping/abstractmapping.php @@ -0,0 +1,222 @@ +<?php +/** +* Copyright (c) 2014 Arthur Schiwon <blizzz@owncloud.com> +* This file is licensed under the Affero General Public License version 3 or +* later. +* See the COPYING-README file. +*/ + +namespace OCA\User_LDAP\Mapping; + +/** +* Class AbstractMapping +* @package OCA\User_LDAP\Mapping +*/ +abstract class AbstractMapping { + /** + * @var \OCP\IDBConnection $dbc + */ + protected $dbc; + + /** + * returns the DB table name which holds the mappings + * @return string + */ + abstract protected function getTableName(); + + /** + * @param \OCP\IDBConnection $dbc + */ + public function __construct(\OCP\IDBConnection $dbc) { + $this->dbc = $dbc; + } + + /** + * checks whether a provided string represents an existing table col + * @param string $col + * @return bool + */ + public function isColNameValid($col) { + switch($col) { + case 'ldap_dn': + case 'owncloud_name': + case 'directory_uuid': + return true; + default: + return false; + } + } + + /** + * Gets the value of one column based on a provided value of another column + * @param string $fetchCol + * @param string $compareCol + * @param string $search + * @throws \Exception + * @return string|false + */ + protected function getXbyY($fetchCol, $compareCol, $search) { + if(!$this->isColNameValid($fetchCol)) { + //this is used internally only, but we don't want to risk + //having SQL injection at all. + throw new \Exception('Invalid Column Name'); + } + $query = $this->dbc->prepare(' + SELECT `' . $fetchCol . '` + FROM `'. $this->getTableName() .'` + WHERE `' . $compareCol . '` = ? + '); + + $res = $query->execute(array($search)); + if($res !== false) { + return $query->fetchColumn(); + } + + return false; + } + + /** + * Performs a DELETE or UPDATE query to the database. + * @param \Doctrine\DBAL\Driver\Statement $query + * @param array $parameters + * @return bool true if at least one row was modified, false otherwise + */ + protected function modify($query, $parameters) { + $result = $query->execute($parameters); + return ($result === true && $query->rowCount() > 0); + } + + /** + * Gets the LDAP DN based on the provided name. + * Replaces Access::ocname2dn + * @param string $name + * @return string|false + */ + public function getDNByName($name) { + return $this->getXbyY('ldap_dn', 'owncloud_name', $name); + } + + /** + * Updates the DN based on the given UUID + * @param string $fdn + * @param string $uuid + * @return bool + */ + public function setDNbyUUID($fdn, $uuid) { + $query = $this->dbc->prepare(' + UPDATE `' . $this->getTableName() . '` + SET `ldap_dn` = ? + WHERE `directory_uuid` = ? + '); + + return $this->modify($query, array($fdn, $uuid)); + } + + /** + * Gets the name based on the provided LDAP DN. + * @param string $fdn + * @return string|false + */ + public function getNameByDN($fdn) { + return $this->getXbyY('owncloud_name', 'ldap_dn', $fdn); + } + + /** + * Searches mapped names by the giving string in the name column + * @param string $search + * @return string[] + */ + public function getNamesBySearch($search) { + $query = $this->dbc->prepare(' + SELECT `owncloud_name` + FROM `'. $this->getTableName() .'` + WHERE `owncloud_name` LIKE ? + '); + + $res = $query->execute(array($search)); + $names = array(); + if($res !== false) { + while($row = $query->fetch()) { + $names[] = $row['owncloud_name']; + } + } + return $names; + } + + /** + * Gets the name based on the provided LDAP DN. + * @param string $uuid + * @return string|false + */ + public function getNameByUUID($uuid) { + return $this->getXbyY('owncloud_name', 'directory_uuid', $uuid); + } + + /** + * gets a piece of the mapping list + * @param int $offset + * @param int $limit + * @return array + */ + public function getList($offset = null, $limit = null) { + $query = $this->dbc->prepare(' + SELECT + `ldap_dn` AS `dn`, + `owncloud_name` AS `name`, + `directory_uuid` AS `uuid` + FROM `' . $this->getTableName() . '`', + $limit, + $offset + ); + + $query->execute(); + return $query->fetchAll(); + } + + /** + * attempts to map the given entry + * @param string $fdn fully distinguished name (from LDAP) + * @param string $name + * @param string $uuid a unique identifier as used in LDAP + * @return bool + */ + public function map($fdn, $name, $uuid) { + $row = array( + 'ldap_dn' => $fdn, + 'owncloud_name' => $name, + 'directory_uuid' => $uuid + ); + + try { + $result = $this->dbc->insertIfNotExist($this->getTableName(), $row); + // insertIfNotExist returns values as int + return (bool)$result; + } catch (\Exception $e) { + return false; + } + } + + /** + * removes a mapping based on the owncloud_name of the entry + * @param string $name + * @return bool + */ + public function unmap($name) { + $query = $this->dbc->prepare(' + DELETE FROM `'. $this->getTableName() .'` + WHERE `owncloud_name` = ?'); + + return $this->modify($query, array($name)); + } + + /** + * Truncate's the mapping table + * @return bool + */ + public function clear() { + $sql = $this->dbc + ->getDatabasePlatform() + ->getTruncateTableSQL('`' . $this->getTableName() . '`'); + return $this->dbc->prepare($sql)->execute(); + } +} diff --git a/apps/user_ldap/lib/mapping/groupmapping.php b/apps/user_ldap/lib/mapping/groupmapping.php new file mode 100644 index 00000000000..af8a4bb4623 --- /dev/null +++ b/apps/user_ldap/lib/mapping/groupmapping.php @@ -0,0 +1,25 @@ +<?php +/** +* Copyright (c) 2014 Arthur Schiwon <blizzz@owncloud.com> +* This file is licensed under the Affero General Public License version 3 or +* later. +* See the COPYING-README file. +*/ + +namespace OCA\User_LDAP\Mapping; + +/** +* Class UserMapping +* @package OCA\User_LDAP\Mapping +*/ +class GroupMapping extends AbstractMapping { + + /** + * returns the DB table name which holds the mappings + * @return string + */ + protected function getTableName() { + return '*PREFIX*ldap_group_mapping'; + } + +} diff --git a/apps/user_ldap/lib/mapping/usermapping.php b/apps/user_ldap/lib/mapping/usermapping.php new file mode 100644 index 00000000000..dd24f338b96 --- /dev/null +++ b/apps/user_ldap/lib/mapping/usermapping.php @@ -0,0 +1,25 @@ +<?php +/** +* Copyright (c) 2014 Arthur Schiwon <blizzz@owncloud.com> +* This file is licensed under the Affero General Public License version 3 or +* later. +* See the COPYING-README file. +*/ + +namespace OCA\User_LDAP\Mapping; + +/** +* Class UserMapping +* @package OCA\User_LDAP\Mapping +*/ +class UserMapping extends AbstractMapping { + + /** + * returns the DB table name which holds the mappings + * @return string + */ + protected function getTableName() { + return '*PREFIX*ldap_user_mapping'; + } + +} diff --git a/apps/user_ldap/lib/proxy.php b/apps/user_ldap/lib/proxy.php index 73a52a7ddd9..b4e6e33c1f4 100644 --- a/apps/user_ldap/lib/proxy.php +++ b/apps/user_ldap/lib/proxy.php @@ -24,6 +24,8 @@ namespace OCA\user_ldap\lib; use OCA\user_ldap\lib\Access; +use OCA\User_LDAP\Mapping\UserMapping; +use OCA\User_LDAP\Mapping\GroupMapping; abstract class Proxy { static private $accesses = array(); @@ -45,17 +47,25 @@ abstract class Proxy { static $fs; static $log; static $avatarM; + static $userMap; + static $groupMap; + static $db; if(is_null($fs)) { $ocConfig = \OC::$server->getConfig(); $fs = new FilesystemHelper(); $log = new LogWrapper(); $avatarM = \OC::$server->getAvatarManager(); + $db = \OC::$server->getDatabaseConnection(); + $userMap = new UserMapping($db); + $groupMap = new GroupMapping($db); } $userManager = - new user\Manager($ocConfig, $fs, $log, $avatarM, new \OCP\Image()); + new user\Manager($ocConfig, $fs, $log, $avatarM, new \OCP\Image(), $db); $connector = new Connection($this->ldap, $configPrefix); - self::$accesses[$configPrefix] = - new Access($connector, $this->ldap, $userManager); + $access = new Access($connector, $this->ldap, $userManager); + $access->setUserMapper($userMap); + $access->setGroupMapper($groupMap); + self::$accesses[$configPrefix] = $access; } /** diff --git a/apps/user_ldap/lib/user/deletedusersindex.php b/apps/user_ldap/lib/user/deletedusersindex.php new file mode 100644 index 00000000000..e17ed3384da --- /dev/null +++ b/apps/user_ldap/lib/user/deletedusersindex.php @@ -0,0 +1,114 @@ +<?php + +/** + * ownCloud – LDAP Helper + * + * @author Arthur Schiwon + * @copyright 2014 Arthur Schiwon <blizzz@owncloud.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this library. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\user_ldap\lib\user; + +use OCA\user_ldap\lib\user\OfflineUser; +use OCA\User_LDAP\Mapping\UserMapping; + +/** + * Class DeletedUsersIndex + * @package OCA\User_LDAP + */ +class DeletedUsersIndex { + /** + * @var \OCP\IConfig $config + */ + protected $config; + + /** + * @var \OCP\IDBConnection $db + */ + protected $db; + + /** + * @var \OCA\User_LDAP\Mapping\UserMapping $mapping + */ + protected $mapping; + + /** + * @var array $deletedUsers + */ + protected $deletedUsers; + + /** + * @param OCP\IConfig $config + * @param OCP\IDBConnection $db + * @param OCA\User_LDAP\Mapping\UserMapping $mapping + */ + public function __construct(\OCP\IConfig $config, \OCP\IDBConnection $db, UserMapping $mapping) { + $this->config = $config; + $this->db = $db; + $this->mapping = $mapping; + } + + /** + * reads LDAP users marked as deleted from the database + * @return OCA\user_ldap\lib\user\OfflineUser[] + */ + private function fetchDeletedUsers() { + $deletedUsers = $this->config->getUsersForUserValue( + 'user_ldap', 'isDeleted', '1'); + + $userObjects = array(); + foreach($deletedUsers as $user) { + $userObjects[] = new OfflineUser($user, $this->config, $this->db, $this->mapping); + } + $this->deletedUsers = $userObjects; + + return $this->deletedUsers; + } + + /** + * returns all LDAP users that are marked as deleted + * @return OCA\user_ldap\lib\user\OfflineUser[] + */ + public function getUsers() { + if(is_array($this->deletedUsers)) { + return $this->deletedUsers; + } + return $this->fetchDeletedUsers(); + } + + /** + * whether at least one user was detected as deleted + * @return bool + */ + public function hasUsers() { + if($this->deletedUsers === false) { + $this->fetchDeletedUsers(); + } + if(is_array($this->deletedUsers) && count($this->deletedUsers) > 0) { + return true; + } + return false; + } + + /** + * marks a user as deleted + * @param string ocName + */ + public function markUser($ocName) { + $this->config->setUserValue($ocName, 'user_ldap', 'isDeleted', '1'); + } +} diff --git a/apps/user_ldap/lib/user/iusertools.php b/apps/user_ldap/lib/user/iusertools.php index bbc678153de..fcb00d2f746 100644 --- a/apps/user_ldap/lib/user/iusertools.php +++ b/apps/user_ldap/lib/user/iusertools.php @@ -38,5 +38,4 @@ interface IUserTools { public function dn2username($dn, $ldapname = null); public function username2dn($name); - } diff --git a/apps/user_ldap/lib/user/manager.php b/apps/user_ldap/lib/user/manager.php index 0ed3d09c48f..ec50e031281 100644 --- a/apps/user_ldap/lib/user/manager.php +++ b/apps/user_ldap/lib/user/manager.php @@ -27,6 +27,7 @@ use OCA\user_ldap\lib\user\IUserTools; use OCA\user_ldap\lib\user\User; use OCA\user_ldap\lib\LogWrapper; use OCA\user_ldap\lib\FilesystemHelper; +use OCA\user_ldap\lib\user\OfflineUser; /** * Manager @@ -35,32 +36,31 @@ use OCA\user_ldap\lib\FilesystemHelper; * cache */ class Manager { - /** - * @var IUserTools - */ + /** @var IUserTools */ protected $access; - /** - * @var \OCP\IConfig - */ + + /** @var \OCP\IConfig */ protected $ocConfig; - /** - * @var FilesystemHelper - */ + + /** @var \OCP\IDBConnection */ + protected $db; + + /** @var FilesystemHelper */ protected $ocFilesystem; - /** - * @var LogWrapper - */ + + /** @var LogWrapper */ protected $ocLog; - /** - * @var \OCP\Image - */ + + /** @var \OCP\Image */ protected $image; - /** - * @param \OCP\IAvatarManager - */ + + /** @param \OCP\IAvatarManager */ protected $avatarManager; + /** - * @var string[][] + * array['byDN'] \OCA\user_ldap\lib\User[] + * ['byUid'] \OCA\user_ldap\lib\User[] + * @var array $users */ protected $users = array( 'byDN' => array(), @@ -68,29 +68,25 @@ class Manager { ); /** - * @brief Constructor - * @param \OCP\IConfig respectively an instance that provides the methods - * setUserValue and getUserValue as implemented in \OCP\Config - * @param \OCA\user_ldap\lib\FilesystemHelper object that gives access to - * necessary functions from the OC filesystem - * @param \OCA\user_ldap\lib\LogWrapper - * @param \OCP\IAvatarManager - * @param \OCP\Image an empty image instance + * @param \OCP\IConfig $ocConfig + * @param \OCA\user_ldap\lib\FilesystemHelper $ocFilesystem object that + * gives access to necessary functions from the OC filesystem + * @param \OCA\user_ldap\lib\LogWrapper $ocLog + * @param \OCP\IAvatarManager $avatarManager + * @param \OCP\Image $image an empty image instance + * @param \OCP\IDBConnection $db * @throws Exception when the methods mentioned above do not exist */ public function __construct(\OCP\IConfig $ocConfig, FilesystemHelper $ocFilesystem, LogWrapper $ocLog, - \OCP\IAvatarManager $avatarManager, \OCP\Image $image) { + \OCP\IAvatarManager $avatarManager, \OCP\Image $image, \OCP\IDBConnection $db) { - if(!method_exists($ocConfig, 'setUserValue') - || !method_exists($ocConfig, 'getUserValue')) { - throw new \Exception('Invalid ownCloud User Config object'); - } $this->ocConfig = $ocConfig; $this->ocFilesystem = $ocFilesystem; $this->ocLog = $ocLog; $this->avatarManager = $avatarManager; $this->image = $image; + $this->db = $db; } /** @@ -131,9 +127,45 @@ class Manager { } /** + * Checks whether the specified user is marked as deleted + * @param string $id the ownCloud user name + * @return bool + */ + public function isDeletedUser($id) { + $isDeleted = $this->ocConfig->getUserValue( + $id, 'user_ldap', 'isDeleted', 0); + return intval($isDeleted) === 1; + } + + /** + * creates and returns an instance of OfflineUser for the specified user + * @param string $id + * @return \OCA\user_ldap\lib\user\OfflineUser + */ + public function getDeletedUser($id) { + return new OfflineUser( + $id, + $this->ocConfig, + $this->db, + $this->access->getUserMapper()); + } + + protected function createInstancyByUserName($id) { + //most likely a uid. Check whether it is a deleted user + if($this->isDeletedUser($id)) { + return $this->getDeletedUser($id); + } + $dn = $this->access->username2dn($id); + if($dn !== false) { + return $this->createAndCache($dn, $id); + } + throw new \Exception('Could not create User instance'); + } + + /** * @brief returns a User object by it's DN or ownCloud username * @param string the DN or username of the user - * @return \OCA\user_ldap\lib\User | null + * @return \OCA\user_ldap\lib\user\User|\OCA\user_ldap\lib\user\OfflineUser|null */ public function get($id) { $this->checkAccess(); @@ -143,25 +175,19 @@ class Manager { return $this->users['byUid'][$id]; } - if(!$this->access->stringResemblesDN($id) ) { - //most likely a uid - $dn = $this->access->username2dn($id); - if($dn !== false) { - return $this->createAndCache($dn, $id); - } - } else { - //so it's a DN + if($this->access->stringResemblesDN($id) ) { $uid = $this->access->dn2username($id); if($uid !== false) { return $this->createAndCache($id, $uid); } } - //either funny uid or invalid. Assume funny to be on the safe side. - $dn = $this->access->username2dn($id); - if($dn !== false) { - return $this->createAndCache($dn, $id); + + try { + $user = $this->createInstancyByUserName($id); + return $user; + } catch (\Exception $e) { + return null; } - return null; } } diff --git a/apps/user_ldap/lib/user/offlineuser.php b/apps/user_ldap/lib/user/offlineuser.php new file mode 100644 index 00000000000..1833f4be968 --- /dev/null +++ b/apps/user_ldap/lib/user/offlineuser.php @@ -0,0 +1,223 @@ +<?php + +/** + * ownCloud – LDAP User + * + * @author Arthur Schiwon + * @copyright 2014 Arthur Schiwon blizzz@owncloud.com + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this library. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCA\user_ldap\lib\user; + +use OCA\User_LDAP\Mapping\UserMapping; + +class OfflineUser { + /** + * @var string $ocName + */ + protected $ocName; + /** + * @var string $dn + */ + protected $dn; + /** + * @var string $uid the UID as provided by LDAP + */ + protected $uid; + /** + * @var string $displayName + */ + protected $displayName; + /** + * @var string $homePath + */ + protected $homePath; + /** + * @var string $lastLogin the timestamp of the last login + */ + protected $lastLogin; + /** + * @var string $email + */ + protected $email; + /** + * @var bool $hasActiveShares + */ + protected $hasActiveShares; + /** + * @var \OCP\IConfig $config + */ + protected $config; + /** + * @var \OCP\IDBConnection $db + */ + protected $db; + /** + * @var \OCA\User_LDAP\Mapping\UserMapping + */ + protected $mapping; + + /** + * @param string $ocName + * @param OCP\IConfig $config + * @param OCP\IDBConnection $db + * @param OCA\User_LDAP\Mapping\UserMapping $mapping + */ + public function __construct($ocName, \OCP\IConfig $config, \OCP\IDBConnection $db, UserMapping $mapping) { + $this->ocName = $ocName; + $this->config = $config; + $this->db = $db; + $this->mapping = $mapping; + $this->fetchDetails(); + } + + /** + * exports the user details in an assoc array + * @return array + */ + public function export() { + $data = array(); + $data['ocName'] = $this->getOCName(); + $data['dn'] = $this->getDN(); + $data['uid'] = $this->getUID(); + $data['displayName'] = $this->getDisplayName(); + $data['homePath'] = $this->getHomePath(); + $data['lastLogin'] = $this->getLastLogin(); + $data['email'] = $this->getEmail(); + $data['hasActiveShares'] = $this->getHasActiveShares(); + + return $data; + } + + /** + * getter for ownCloud internal name + * @return string + */ + public function getOCName() { + return $this->ocName; + } + + /** + * getter for LDAP uid + * @return string + */ + public function getUID() { + return $this->uid; + } + + /** + * getter for LDAP DN + * @return string + */ + public function getDN() { + return $this->dn; + } + + /** + * getter for display name + * @return string + */ + public function getDisplayName() { + return $this->displayName; + } + + /** + * getter for email + * @return string + */ + public function getEmail() { + return $this->email; + } + + /** + * getter for home directory path + * @return string + */ + public function getHomePath() { + return $this->homePath; + } + + /** + * getter for the last login timestamp + * @return int + */ + public function getLastLogin() { + return intval($this->lastLogin); + } + + /** + * getter for having active shares + * @return bool + */ + public function getHasActiveShares() { + return $this->hasActiveShares; + } + + /** + * reads the user details + */ + protected function fetchDetails() { + $properties = array ( + 'displayName' => 'user_ldap', + 'uid' => 'user_ldap', + 'homePath' => 'user_ldap', + 'email' => 'settings', + 'lastLogin' => 'login' + ); + foreach($properties as $property => $app) { + $this->$property = $this->config->getUserValue($this->ocName, $app, $property, ''); + } + + $dn = $this->mapping->getDNByName($this->ocName); + $this->dn = ($dn !== false) ? $dn : ''; + + $this->determineShares(); + } + + + /** + * finds out whether the user has active shares. The result is stored in + * $this->hasActiveShares + */ + protected function determineShares() { + $query = $this->db->prepare(' + SELECT COUNT(`uid_owner`) + FROM `*PREFIX*share` + WHERE `uid_owner` = ? + ', 1); + $query->execute(array($this->ocName)); + $sResult = $query->fetchColumn(0); + if(intval($sResult) === 1) { + $this->hasActiveShares = true; + return; + } + + $query = $this->db->prepare(' + SELECT COUNT(`owner`) + FROM `*PREFIX*share_external` + WHERE `owner` = ? + ', 1); + $query->execute(array($this->ocName)); + $sResult = $query->fetchColumn(0); + if(intval($sResult) === 1) { + $this->hasActiveShares = true; + return; + } + + $this->hasActiveShares = false; + } +} diff --git a/apps/user_ldap/lib/user/user.php b/apps/user_ldap/lib/user/user.php index d4d2294307d..7f67ebca39b 100644 --- a/apps/user_ldap/lib/user/user.php +++ b/apps/user_ldap/lib/user/user.php @@ -92,7 +92,7 @@ class User { * @param string the LDAP DN * @param IUserTools $access an instance that implements IUserTools for * LDAP interaction - * @param \OCP\Config + * @param \OCP\IConfig * @param FilesystemHelper * @param \OCP\Image any empty instance * @param LogWrapper @@ -213,6 +213,31 @@ class User { } /** + * Stores a key-value pair in relation to this user + * @param string $key + * @param string $value + */ + private function store($key, $value) { + $this->config->setUserValue($this->uid, 'user_ldap', $key, $value); + } + + /** + * Stores the display name in the databae + * @param string $displayName + */ + public function storeDisplayName($displayName) { + $this->store('displayName', $displayName); + } + + /** + * Stores the LDAP Username in the Database + * @param string $userName + */ + public function storeLDAPUserName($userName) { + $this->store('uid', $userName); + } + + /** * @brief checks whether an update method specified by feature was run * already. If not, it will marked like this, because it is expected that * the method will be run, when false is returned. diff --git a/apps/user_ldap/lib/wizard.php b/apps/user_ldap/lib/wizard.php index 1d7701440e9..2e4507a2585 100644 --- a/apps/user_ldap/lib/wizard.php +++ b/apps/user_ldap/lib/wizard.php @@ -56,7 +56,7 @@ class Wizard extends LDAPUtility { Wizard::$l = \OC::$server->getL10N('user_ldap'); } $this->access = $access; - $this->result = new WizardResult; + $this->result = new WizardResult(); } public function __destruct() { @@ -120,7 +120,7 @@ class Wizard extends LDAPUtility { * @throws \Exception */ public function countUsers() { - $filter = $this->configuration->ldapUserFilter; + $filter = $this->access->getFilterForUserCount(); $usersTotal = $this->countEntries($filter, 'users'); $usersTotal = ($usersTotal !== false) ? $usersTotal : 0; @@ -132,9 +132,10 @@ class Wizard extends LDAPUtility { /** * counts users with a specified attribute * @param string $attr + * @param bool $existsCheck * @return int|bool */ - public function countUsersWithAttribute($attr) { + public function countUsersWithAttribute($attr, $existsCheck = false) { if(!$this->checkRequirements(array('ldapHost', 'ldapPort', 'ldapBase', @@ -148,7 +149,51 @@ class Wizard extends LDAPUtility { $attr . '=*' )); - return $this->access->countUsers($filter); + $limit = ($existsCheck === false) ? null : 1; + + return $this->access->countUsers($filter, array('dn'), $limit); + } + + /** + * detects the display name attribute. If a setting is already present that + * returns at least one hit, the detection will be canceled. + * @return WizardResult|bool + * @throws \Exception + */ + public function detectUserDisplayNameAttribute() { + if(!$this->checkRequirements(array('ldapHost', + 'ldapPort', + 'ldapBase', + 'ldapUserFilter', + ))) { + return false; + } + + $attr = $this->configuration->ldapUserDisplayName; + if($attr !== 'displayName' && !empty($attr)) { + // most likely not the default value with upper case N, + // verify it still produces a result + $count = intval($this->countUsersWithAttribute($attr, true)); + if($count > 0) { + //no change, but we sent it back to make sure the user interface + //is still correct, even if the ajax call was cancelled inbetween + $this->result->addChange('ldap_display_name', $attr); + return $this->result; + } + } + + // first attribute that has at least one result wins + $displayNameAttrs = array('displayname', 'cn'); + foreach ($displayNameAttrs as $attr) { + $count = intval($this->countUsersWithAttribute($attr, true)); + + if($count > 0) { + $this->applyFind('ldap_display_name', $attr); + return $this->result; + } + }; + + throw new \Exception(self::$l->t('Could not detect user display name attribute. Please specify it yourself in advanced ldap settings.')); } /** @@ -168,7 +213,7 @@ class Wizard extends LDAPUtility { $attr = $this->configuration->ldapEmailAttribute; if(!empty($attr)) { - $count = intval($this->countUsersWithAttribute($attr)); + $count = intval($this->countUsersWithAttribute($attr, true)); if($count > 0) { return false; } @@ -189,7 +234,7 @@ class Wizard extends LDAPUtility { } if($winner !== '') { - $this->result->addChange('ldap_email_attr', $winner); + $this->applyFind('ldap_email_attr', $winner); if($writeLog) { \OCP\Util::writeLog('user_ldap', 'The mail attribute has ' . 'automatically been reset, because the original value ' . @@ -614,7 +659,8 @@ class Wizard extends LDAPUtility { //this did not help :( //Let's see whether we can parse the Host URL and convert the domain to //a base DN - $domain = Helper::getDomainFromURL($this->configuration->ldapHost); + $helper = new Helper(); + $domain = $helper->getDomainFromURL($this->configuration->ldapHost); if(!$domain) { return false; } diff --git a/apps/user_ldap/settings.php b/apps/user_ldap/settings.php index ca61a53b196..a19ec0bda6f 100644 --- a/apps/user_ldap/settings.php +++ b/apps/user_ldap/settings.php @@ -28,16 +28,16 @@ OC_Util::checkAdminUser(); OCP\Util::addScript('user_ldap', 'ldapFilter'); OCP\Util::addScript('user_ldap', 'experiencedAdmin'); OCP\Util::addScript('user_ldap', 'settings'); -OCP\Util::addScript('core', 'jquery.multiselect'); +\OC_Util::addVendorScript('user_ldap', 'ui-multiselect/src/jquery.multiselect'); OCP\Util::addStyle('user_ldap', 'settings'); -OCP\Util::addStyle('core', 'jquery.multiselect'); -OCP\Util::addStyle('core', 'jquery-ui-1.10.0.custom'); +\OC_Util::addVendorStyle('user_ldap', 'ui-multiselect/jquery.multiselect'); // fill template $tmpl = new OCP\Template('user_ldap', 'settings'); -$prefixes = \OCA\user_ldap\lib\Helper::getServerConfigurationPrefixes(); -$hosts = \OCA\user_ldap\lib\Helper::getServerConfigurationHosts(); +$helper = new \OCA\user_ldap\lib\Helper(); +$prefixes = $helper->getServerConfigurationPrefixes(); +$hosts = $helper->getServerConfigurationHosts(); $wizardHtml = ''; $toc = array(); diff --git a/apps/user_ldap/tests/access.php b/apps/user_ldap/tests/access.php index 8ff39800808..5c502f288eb 100644 --- a/apps/user_ldap/tests/access.php +++ b/apps/user_ldap/tests/access.php @@ -26,7 +26,7 @@ use \OCA\user_ldap\lib\Access; use \OCA\user_ldap\lib\Connection; use \OCA\user_ldap\lib\ILDAPWrapper; -class Test_Access extends \PHPUnit_Framework_TestCase { +class Test_Access extends \Test\TestCase { private function getConnecterAndLdapMock() { static $conMethods; static $accMethods; @@ -47,7 +47,8 @@ class Test_Access extends \PHPUnit_Framework_TestCase { $this->getMock('\OCA\user_ldap\lib\FilesystemHelper'), $this->getMock('\OCA\user_ldap\lib\LogWrapper'), $this->getMock('\OCP\IAvatarManager'), - $this->getMock('\OCP\Image'))); + $this->getMock('\OCP\Image'), + $this->getMock('\OCP\IDBConnection'))); return array($lw, $connector, $um); } diff --git a/apps/user_ldap/tests/connection.php b/apps/user_ldap/tests/connection.php index f51b0c83017..e3f29cec982 100644 --- a/apps/user_ldap/tests/connection.php +++ b/apps/user_ldap/tests/connection.php @@ -22,7 +22,7 @@ namespace OCA\user_ldap\tests; -class Test_Connection extends \PHPUnit_Framework_TestCase { +class Test_Connection extends \Test\TestCase { public function testOriginalAgentUnchangedOnClone() { //background: upon login a bind is done with the user credentials diff --git a/apps/user_ldap/tests/group_ldap.php b/apps/user_ldap/tests/group_ldap.php index d1262e4f5b8..efd7f803f3b 100644 --- a/apps/user_ldap/tests/group_ldap.php +++ b/apps/user_ldap/tests/group_ldap.php @@ -22,14 +22,12 @@ namespace OCA\user_ldap\tests; -namespace OCA\user_ldap\tests; - use \OCA\user_ldap\GROUP_LDAP as GroupLDAP; use \OCA\user_ldap\lib\Access; use \OCA\user_ldap\lib\Connection; use \OCA\user_ldap\lib\ILDAPWrapper; -class Test_Group_Ldap extends \PHPUnit_Framework_TestCase { +class Test_Group_Ldap extends \Test\TestCase { private function getAccessMock() { static $conMethods; static $accMethods; @@ -47,7 +45,8 @@ class Test_Group_Ldap extends \PHPUnit_Framework_TestCase { $this->getMock('\OCA\user_ldap\lib\FilesystemHelper'), $this->getMock('\OCA\user_ldap\lib\LogWrapper'), $this->getMock('\OCP\IAvatarManager'), - $this->getMock('\OCP\Image') + $this->getMock('\OCP\Image'), + $this->getMock('\OCP\IDBConnection') ); $access = $this->getMock('\OCA\user_ldap\lib\Access', $accMethods, diff --git a/apps/user_ldap/tests/helper.php b/apps/user_ldap/tests/helper.php deleted file mode 100644 index 07c24d64499..00000000000 --- a/apps/user_ldap/tests/helper.php +++ /dev/null @@ -1,31 +0,0 @@ -<?php -/** -* ownCloud -* -* @author Thomas Müller -* @copyright 2014 Thomas Müller deepdiver@owncloud.com -* -*/ - -namespace OCA\user_ldap\tests; - -use OCA\user_ldap\lib\Helper; - -class Test_Helper extends \PHPUnit_Framework_TestCase { - - public function testTableTruncate() { - - $statement = \OCP\DB::prepare('INSERT INTO `*PREFIX*ldap_user_mapping` (`ldap_dn`, `owncloud_name`, `directory_uuid`) VALUES (?, ?, ?)'); - $statement->execute(array('db01', 'oc1', '000-0000-0000')); - $statement->execute(array('db02', 'oc2', '000-0000-0001')); - - $statement = \OCP\DB::prepare('SELECT count(*) FROM `*PREFIX*ldap_user_mapping`'); - $result = $statement->execute(); - $this->assertEquals(2, $result->fetchOne()); - - Helper::clearMapping('user'); - - $result = $statement->execute(); - $this->assertEquals(0, $result->fetchOne()); - } -} diff --git a/apps/user_ldap/tests/jobs/cleanup.php b/apps/user_ldap/tests/jobs/cleanup.php new file mode 100644 index 00000000000..78bda66c54f --- /dev/null +++ b/apps/user_ldap/tests/jobs/cleanup.php @@ -0,0 +1,135 @@ +<?php +/** + * Copyright (c) 2014 Arthur Schiwon <blizzz@owncloud.com> + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace OCA\user_ldap\tests; + +class Test_CleanUp extends \PHPUnit_Framework_TestCase { + public function getMocks() { + $mocks = array(); + $mocks['userBackend'] = + $this->getMockBuilder('\OCA\user_ldap\User_Proxy') + ->disableOriginalConstructor() + ->getMock(); + $mocks['deletedUsersIndex'] = + $this->getMockBuilder('\OCA\user_ldap\lib\user\deletedUsersIndex') + ->disableOriginalConstructor() + ->getMock(); + $mocks['ocConfig'] = $this->getMock('\OCP\IConfig'); + $mocks['db'] = $this->getMock('\OCP\IDBConnection'); + $mocks['helper'] = $this->getMock('\OCA\user_ldap\lib\Helper'); + + return $mocks; + } + + /** + * clean up job must not run when there are disabled configurations + */ + public function test_runNotAllowedByDisabledConfigurations() { + $args = $this->getMocks(); + $args['helper']->expects($this->once()) + ->method('haveDisabledConfigurations') + ->will($this->returnValue(true) ); + + $args['ocConfig']->expects($this->never()) + ->method('getSystemValue'); + + $bgJob = new \OCA\User_LDAP\Jobs\CleanUp(); + $bgJob->setArguments($args); + + $result = $bgJob->isCleanUpAllowed(); + $this->assertSame(false, $result); + } + + /** + * clean up job must not run when LDAP Helper is broken i.e. + * returning unexpected results + */ + public function test_runNotAllowedByBrokenHelper() { + $args = $this->getMocks(); + $args['helper']->expects($this->once()) + ->method('haveDisabledConfigurations') + ->will($this->throwException(new \Exception())); + + $args['ocConfig']->expects($this->never()) + ->method('getSystemValue'); + + $bgJob = new \OCA\User_LDAP\Jobs\CleanUp(); + $bgJob->setArguments($args); + + $result = $bgJob->isCleanUpAllowed(); + $this->assertSame(false, $result); + } + + /** + * clean up job must not run when it is not enabled + */ + public function test_runNotAllowedBySysConfig() { + $args = $this->getMocks(); + $args['helper']->expects($this->once()) + ->method('haveDisabledConfigurations') + ->will($this->returnValue(false)); + + $args['ocConfig']->expects($this->once()) + ->method('getSystemValue') + ->will($this->returnValue(false)); + + $bgJob = new \OCA\User_LDAP\Jobs\CleanUp(); + $bgJob->setArguments($args); + + $result = $bgJob->isCleanUpAllowed(); + $this->assertSame(false, $result); + } + + /** + * clean up job is allowed to run + */ + public function test_runIsAllowed() { + $args = $this->getMocks(); + $args['helper']->expects($this->once()) + ->method('haveDisabledConfigurations') + ->will($this->returnValue(false)); + + $args['ocConfig']->expects($this->once()) + ->method('getSystemValue') + ->will($this->returnValue(true)); + + $bgJob = new \OCA\User_LDAP\Jobs\CleanUp(); + $bgJob->setArguments($args); + + $result = $bgJob->isCleanUpAllowed(); + $this->assertSame(true, $result); + } + + /** + * check whether offset will be reset when it needs to + */ + public function test_OffsetResetIsNecessary() { + $args = $this->getMocks(); + + $bgJob = new \OCA\User_LDAP\Jobs\CleanUp(); + $bgJob->setArguments($args); + + $result = $bgJob->isOffsetResetNecessary($bgJob->getChunkSize() - 1); + $this->assertSame(true, $result); + } + + /** + * make sure offset is not reset when it is not due + */ + public function test_OffsetResetIsNotNecessary() { + $args = $this->getMocks(); + + $bgJob = new \OCA\User_LDAP\Jobs\CleanUp(); + $bgJob->setArguments($args); + + $result = $bgJob->isOffsetResetNecessary($bgJob->getChunkSize()); + $this->assertSame(false, $result); + } + +} + diff --git a/apps/user_ldap/tests/mapping/abstractmappingtest.php b/apps/user_ldap/tests/mapping/abstractmappingtest.php new file mode 100644 index 00000000000..cafa36a4edb --- /dev/null +++ b/apps/user_ldap/tests/mapping/abstractmappingtest.php @@ -0,0 +1,218 @@ +<?php +/** +* Copyright (c) 2014 Arthur Schiwon <blizzz@owncloud.com> +* This file is licensed under the Affero General Public License version 3 or +* later. +* See the COPYING-README file. +*/ + +namespace OCA\user_ldap\tests\mapping; + +abstract class AbstractMappingTest extends \Test\TestCase { + abstract public function getMapper(\OCP\IDBConnection $dbMock); + + /** + * kiss test on isColNameValid + */ + public function testIsColNameValid() { + $dbMock = $this->getMock('\OCP\IDBConnection'); + $mapper = $this->getMapper($dbMock); + + $this->assertTrue($mapper->isColNameValid('ldap_dn')); + $this->assertFalse($mapper->isColNameValid('foobar')); + } + + /** + * returns an array of test entries with dn, name and uuid as keys + * @return array + */ + protected function getTestData() { + $data = array( + array( + 'dn' => 'uid=foobar,dc=example,dc=org', + 'name' => 'Foobar', + 'uuid' => '1111-AAAA-1234-CDEF', + ), + array( + 'dn' => 'uid=barfoo,dc=example,dc=org', + 'name' => 'Barfoo', + 'uuid' => '2222-BBBB-1234-CDEF', + ), + array( + 'dn' => 'uid=barabara,dc=example,dc=org', + 'name' => 'BaraBara', + 'uuid' => '3333-CCCC-1234-CDEF', + ) + ); + + return $data; + } + + /** + * calls map() on the given mapper and asserts result for true + * @param \OCA\User_LDAP\Mapping\AbstractMapping $mapper + * @param array $data + */ + protected function mapEntries($mapper, $data) { + foreach($data as $entry) { + $done = $mapper->map($entry['dn'], $entry['name'], $entry['uuid']); + $this->assertTrue($done); + } + } + + /** + * initalizes environment for a test run and returns an array with + * test objects. Preparing environment means that all mappings are cleared + * first and then filled with test entries. + * @return array 0 = \OCA\User_LDAP\Mapping\AbstractMapping, 1 = array of + * users or groups + */ + private function initTest() { + $dbc = \OC::$server->getDatabaseConnection(); + $mapper = $this->getMapper($dbc); + $data = $this->getTestData(); + // make sure DB is pristine, then fill it with test entries + $mapper->clear(); + $this->mapEntries($mapper, $data); + + return array($mapper, $data); + } + + /** + * tests map() method with input that should result in not-mapping. + * Hint: successful mapping is tested inherently with mapEntries(). + */ + public function testMap() { + list($mapper, $data) = $this->initTest(); + + // test that mapping will not happen when it shall not + $paramKeys = array('', 'dn', 'name', 'uuid'); + foreach($paramKeys as $key) { + $failEntry = $data[0]; + if(!empty($key)) { + $failEntry[$key] = 'do-not-get-mapped'; + } + $isMapped = $mapper->map($failEntry['dn'], $failEntry['name'], $failEntry['uuid']); + $this->assertFalse($isMapped); + } + } + + /** + * tests unmap() for both successfuly and not successful removing of + * mapping entries + */ + public function testUnmap() { + list($mapper, $data) = $this->initTest(); + + foreach($data as $entry) { + $result = $mapper->unmap($entry['name']); + $this->assertTrue($result); + } + + $result = $mapper->unmap('notAnEntry'); + $this->assertFalse($result); + } + + /** + * tests getDNByName(), getNameByDN() and getNameByUUID() for successful + * and unsuccessful requests. + */ + public function testGetMethods() { + list($mapper, $data) = $this->initTest(); + + foreach($data as $entry) { + $fdn = $mapper->getDNByName($entry['name']); + $this->assertSame($fdn, $entry['dn']); + } + $fdn = $mapper->getDNByName('nosuchname'); + $this->assertFalse($fdn); + + foreach($data as $entry) { + $name = $mapper->getNameByDN($entry['dn']); + $this->assertSame($name, $entry['name']); + } + $name = $mapper->getNameByDN('nosuchdn'); + $this->assertFalse($name); + + foreach($data as $entry) { + $name = $mapper->getNameByUUID($entry['uuid']); + $this->assertSame($name, $entry['name']); + } + $name = $mapper->getNameByUUID('nosuchuuid'); + $this->assertFalse($name); + } + + /** + * tests getNamesBySearch() for successful and unsuccessful requests. + */ + public function testSearch() { + list($mapper,) = $this->initTest(); + + $names = $mapper->getNamesBySearch('%oo%'); + $this->assertTrue(is_array($names)); + $this->assertSame(2, count($names)); + $this->assertTrue(in_array('Foobar', $names)); + $this->assertTrue(in_array('Barfoo', $names)); + $names = $mapper->getNamesBySearch('nada'); + $this->assertTrue(is_array($names)); + $this->assertSame(0, count($names)); + } + + /** + * tests setDNbyUUID() for successful and unsuccessful update. + */ + public function testSetMethod() { + list($mapper, $data) = $this->initTest(); + + $newDN = 'uid=modified,dc=example,dc=org'; + $done = $mapper->setDNbyUUID($newDN, $data[0]['uuid']); + $this->assertTrue($done); + $fdn = $mapper->getDNByName($data[0]['name']); + $this->assertSame($fdn, $newDN); + + $newDN = 'uid=notme,dc=example,dc=org'; + $done = $mapper->setDNbyUUID($newDN, 'iamnothere'); + $this->assertFalse($done); + $name = $mapper->getNameByDN($newDN); + $this->assertFalse($name); + + } + + /** + * tests clear() for successful update. + */ + public function testClear() { + list($mapper, $data) = $this->initTest(); + + $done = $mapper->clear(); + $this->assertTrue($done); + foreach($data as $entry) { + $name = $mapper->getNameByUUID($entry['uuid']); + $this->assertFalse($name); + } + } + + /** + * tests getList() method + */ + public function testList() { + list($mapper, $data) = $this->initTest(); + + // get all entries without specifying offset or limit + $results = $mapper->getList(); + $this->assertSame(3, count($results)); + + // get all-1 entries by specifying offset, and an high limit + // specifying only offset without limit will not work by underlying lib + $results = $mapper->getList(1, 999); + $this->assertSame(count($data) - 1, count($results)); + + // get first 2 entries by limit, but not offset + $results = $mapper->getList(null, 2); + $this->assertSame(2, count($results)); + + // get 2nd entry by specifying both offset and limit + $results = $mapper->getList(1, 1); + $this->assertSame(1, count($results)); + } +} diff --git a/apps/user_ldap/tests/mapping/groupmapping.php b/apps/user_ldap/tests/mapping/groupmapping.php new file mode 100644 index 00000000000..11bb3f40e3a --- /dev/null +++ b/apps/user_ldap/tests/mapping/groupmapping.php @@ -0,0 +1,17 @@ +<?php +/** +* Copyright (c) 2014 Arthur Schiwon <blizzz@owncloud.com> +* This file is licensed under the Affero General Public License version 3 or +* later. +* See the COPYING-README file. +*/ + +namespace OCA\user_ldap\tests\mapping; + +use OCA\User_LDAP\Mapping\GroupMapping; + +class Test_GroupMapping extends AbstractMappingTest { + public function getMapper(\OCP\IDBConnection $dbMock) { + return new GroupMapping($dbMock); + } +} diff --git a/apps/user_ldap/tests/mapping/usermapping.php b/apps/user_ldap/tests/mapping/usermapping.php new file mode 100644 index 00000000000..2debcecf397 --- /dev/null +++ b/apps/user_ldap/tests/mapping/usermapping.php @@ -0,0 +1,17 @@ +<?php +/** +* Copyright (c) 2014 Arthur Schiwon <blizzz@owncloud.com> +* This file is licensed under the Affero General Public License version 3 or +* later. +* See the COPYING-README file. +*/ + +namespace OCA\user_ldap\tests\mapping; + +use OCA\User_LDAP\Mapping\UserMapping; + +class Test_UserMapping extends AbstractMappingTest { + public function getMapper(\OCP\IDBConnection $dbMock) { + return new UserMapping($dbMock); + } +} diff --git a/apps/user_ldap/tests/user/manager.php b/apps/user_ldap/tests/user/manager.php index 7d687867213..4ce504365b8 100644 --- a/apps/user_ldap/tests/user/manager.php +++ b/apps/user_ldap/tests/user/manager.php @@ -24,7 +24,7 @@ namespace OCA\user_ldap\tests; use OCA\user_ldap\lib\user\Manager; -class Test_User_Manager extends \PHPUnit_Framework_TestCase { +class Test_User_Manager extends \Test\TestCase { private function getTestInstances() { $access = $this->getMock('\OCA\user_ldap\lib\user\IUserTools'); @@ -33,12 +33,13 @@ class Test_User_Manager extends \PHPUnit_Framework_TestCase { $log = $this->getMock('\OCA\user_ldap\lib\LogWrapper'); $avaMgr = $this->getMock('\OCP\IAvatarManager'); $image = $this->getMock('\OCP\Image'); + $dbc = $this->getMock('\OCP\IDBConnection'); - return array($access, $config, $filesys, $image, $log, $avaMgr); + return array($access, $config, $filesys, $image, $log, $avaMgr, $dbc); } public function testGetByDNExisting() { - list($access, $config, $filesys, $image, $log, $avaMgr) = + list($access, $config, $filesys, $image, $log, $avaMgr, $dbc) = $this->getTestInstances(); $inputDN = 'cn=foo,dc=foobar,dc=bar'; @@ -57,7 +58,7 @@ class Test_User_Manager extends \PHPUnit_Framework_TestCase { $access->expects($this->never()) ->method('username2dn'); - $manager = new Manager($config, $filesys, $log, $avaMgr, $image); + $manager = new Manager($config, $filesys, $log, $avaMgr, $image, $dbc); $manager->setLdapAccess($access); $user = $manager->get($inputDN); @@ -65,7 +66,7 @@ class Test_User_Manager extends \PHPUnit_Framework_TestCase { } public function testGetByEDirectoryDN() { - list($access, $config, $filesys, $image, $log, $avaMgr) = + list($access, $config, $filesys, $image, $log, $avaMgr, $dbc) = $this->getTestInstances(); $inputDN = 'uid=foo,o=foobar,c=bar'; @@ -84,7 +85,7 @@ class Test_User_Manager extends \PHPUnit_Framework_TestCase { $access->expects($this->never()) ->method('username2dn'); - $manager = new Manager($config, $filesys, $log, $avaMgr, $image); + $manager = new Manager($config, $filesys, $log, $avaMgr, $image, $dbc); $manager->setLdapAccess($access); $user = $manager->get($inputDN); @@ -92,7 +93,7 @@ class Test_User_Manager extends \PHPUnit_Framework_TestCase { } public function testGetByExoticDN() { - list($access, $config, $filesys, $image, $log, $avaMgr) = + list($access, $config, $filesys, $image, $log, $avaMgr, $dbc) = $this->getTestInstances(); $inputDN = 'ab=cde,f=ghei,mno=pq'; @@ -111,7 +112,7 @@ class Test_User_Manager extends \PHPUnit_Framework_TestCase { $access->expects($this->never()) ->method('username2dn'); - $manager = new Manager($config, $filesys, $log, $avaMgr, $image); + $manager = new Manager($config, $filesys, $log, $avaMgr, $image, $dbc); $manager->setLdapAccess($access); $user = $manager->get($inputDN); @@ -119,7 +120,7 @@ class Test_User_Manager extends \PHPUnit_Framework_TestCase { } public function testGetByDNNotExisting() { - list($access, $config, $filesys, $image, $log, $avaMgr) = + list($access, $config, $filesys, $image, $log, $avaMgr, $dbc) = $this->getTestInstances(); $inputDN = 'cn=gone,dc=foobar,dc=bar'; @@ -139,7 +140,7 @@ class Test_User_Manager extends \PHPUnit_Framework_TestCase { ->with($this->equalTo($inputDN)) ->will($this->returnValue(false)); - $manager = new Manager($config, $filesys, $log, $avaMgr, $image); + $manager = new Manager($config, $filesys, $log, $avaMgr, $image, $dbc); $manager->setLdapAccess($access); $user = $manager->get($inputDN); @@ -147,7 +148,7 @@ class Test_User_Manager extends \PHPUnit_Framework_TestCase { } public function testGetByUidExisting() { - list($access, $config, $filesys, $image, $log, $avaMgr) = + list($access, $config, $filesys, $image, $log, $avaMgr, $dbc) = $this->getTestInstances(); $dn = 'cn=foo,dc=foobar,dc=bar'; @@ -166,7 +167,7 @@ class Test_User_Manager extends \PHPUnit_Framework_TestCase { ->with($this->equalTo($uid)) ->will($this->returnValue(false)); - $manager = new Manager($config, $filesys, $log, $avaMgr, $image); + $manager = new Manager($config, $filesys, $log, $avaMgr, $image, $dbc); $manager->setLdapAccess($access); $user = $manager->get($uid); @@ -174,7 +175,7 @@ class Test_User_Manager extends \PHPUnit_Framework_TestCase { } public function testGetByUidNotExisting() { - list($access, $config, $filesys, $image, $log, $avaMgr) = + list($access, $config, $filesys, $image, $log, $avaMgr, $dbc) = $this->getTestInstances(); $dn = 'cn=foo,dc=foobar,dc=bar'; @@ -183,12 +184,12 @@ class Test_User_Manager extends \PHPUnit_Framework_TestCase { $access->expects($this->never()) ->method('dn2username'); - $access->expects($this->exactly(2)) + $access->expects($this->exactly(1)) ->method('username2dn') ->with($this->equalTo($uid)) ->will($this->returnValue(false)); - $manager = new Manager($config, $filesys, $log, $avaMgr, $image); + $manager = new Manager($config, $filesys, $log, $avaMgr, $image, $dbc); $manager->setLdapAccess($access); $user = $manager->get($uid); diff --git a/apps/user_ldap/tests/user/user.php b/apps/user_ldap/tests/user/user.php index b66a9237266..5282a9f8b6e 100644 --- a/apps/user_ldap/tests/user/user.php +++ b/apps/user_ldap/tests/user/user.php @@ -24,7 +24,7 @@ namespace OCA\user_ldap\tests; use OCA\user_ldap\lib\user\User; -class Test_User_User extends \PHPUnit_Framework_TestCase { +class Test_User_User extends \Test\TestCase { private function getTestInstances() { $access = $this->getMock('\OCA\user_ldap\lib\user\IUserTools'); @@ -33,11 +33,12 @@ class Test_User_User extends \PHPUnit_Framework_TestCase { $log = $this->getMock('\OCA\user_ldap\lib\LogWrapper'); $avaMgr = $this->getMock('\OCP\IAvatarManager'); $image = $this->getMock('\OCP\Image'); + $dbc = $this->getMock('\OCP\IDBConnection'); - return array($access, $config, $filesys, $image, $log, $avaMgr); + return array($access, $config, $filesys, $image, $log, $avaMgr, $dbc); } - private function getAdvancedMocks($cfMock, $fsMock, $logMock, $avaMgr) { + private function getAdvancedMocks($cfMock, $fsMock, $logMock, $avaMgr, $dbc) { static $conMethods; static $accMethods; static $umMethods; @@ -52,7 +53,7 @@ class Test_User_User extends \PHPUnit_Framework_TestCase { $lw = $this->getMock('\OCA\user_ldap\lib\ILDAPWrapper'); $im = $this->getMock('\OCP\Image'); $um = $this->getMock('\OCA\user_ldap\lib\user\Manager', - $umMethods, array($cfMock, $fsMock, $logMock, $avaMgr, $im)); + $umMethods, array($cfMock, $fsMock, $logMock, $avaMgr, $im, $dbc)); $connector = $this->getMock('\OCA\user_ldap\lib\Connection', $conMethods, array($lw, null, null)); $access = $this->getMock('\OCA\user_ldap\lib\Access', @@ -76,11 +77,11 @@ class Test_User_User extends \PHPUnit_Framework_TestCase { } public function testUpdateEmailProvided() { - list($access, $config, $filesys, $image, $log, $avaMgr) = + list($access, $config, $filesys, $image, $log, $avaMgr, $dbc) = $this->getTestInstances(); list($access, $connection) = - $this->getAdvancedMocks($config, $filesys, $log, $avaMgr); + $this->getAdvancedMocks($config, $filesys, $log, $avaMgr, $dbc); $connection->expects($this->once()) ->method('__get') @@ -110,11 +111,11 @@ class Test_User_User extends \PHPUnit_Framework_TestCase { } public function testUpdateEmailNotProvided() { - list($access, $config, $filesys, $image, $log, $avaMgr) = + list($access, $config, $filesys, $image, $log, $avaMgr, $dbc) = $this->getTestInstances(); list($access, $connection) = - $this->getAdvancedMocks($config, $filesys, $log, $avaMgr); + $this->getAdvancedMocks($config, $filesys, $log, $avaMgr, $dbc); $connection->expects($this->once()) ->method('__get') @@ -140,11 +141,11 @@ class Test_User_User extends \PHPUnit_Framework_TestCase { } public function testUpdateEmailNotConfigured() { - list($access, $config, $filesys, $image, $log, $avaMgr) = + list($access, $config, $filesys, $image, $log, $avaMgr, $dbc) = $this->getTestInstances(); list($access, $connection) = - $this->getAdvancedMocks($config, $filesys, $log, $avaMgr); + $this->getAdvancedMocks($config, $filesys, $log, $avaMgr, $dbc); $connection->expects($this->once()) ->method('__get') @@ -167,11 +168,11 @@ class Test_User_User extends \PHPUnit_Framework_TestCase { } public function testUpdateQuotaAllProvided() { - list($access, $config, $filesys, $image, $log, $avaMgr) = + list($access, $config, $filesys, $image, $log, $avaMgr, $dbc) = $this->getTestInstances(); list($access, $connection) = - $this->getAdvancedMocks($config, $filesys, $log, $avaMgr); + $this->getAdvancedMocks($config, $filesys, $log, $avaMgr, $dbc); $connection->expects($this->at(0)) ->method('__get') @@ -210,11 +211,11 @@ class Test_User_User extends \PHPUnit_Framework_TestCase { } public function testUpdateQuotaDefaultProvided() { - list($access, $config, $filesys, $image, $log, $avaMgr) = + list($access, $config, $filesys, $image, $log, $avaMgr, $dbc) = $this->getTestInstances(); list($access, $connection) = - $this->getAdvancedMocks($config, $filesys, $log, $avaMgr); + $this->getAdvancedMocks($config, $filesys, $log, $avaMgr, $dbc); $connection->expects($this->at(0)) ->method('__get') @@ -253,11 +254,11 @@ class Test_User_User extends \PHPUnit_Framework_TestCase { } public function testUpdateQuotaIndividualProvided() { - list($access, $config, $filesys, $image, $log, $avaMgr) = + list($access, $config, $filesys, $image, $log, $avaMgr, $dbc) = $this->getTestInstances(); list($access, $connection) = - $this->getAdvancedMocks($config, $filesys, $log, $avaMgr); + $this->getAdvancedMocks($config, $filesys, $log, $avaMgr, $dbc); $connection->expects($this->at(0)) ->method('__get') @@ -296,11 +297,11 @@ class Test_User_User extends \PHPUnit_Framework_TestCase { } public function testUpdateQuotaNoneProvided() { - list($access, $config, $filesys, $image, $log, $avaMgr) = + list($access, $config, $filesys, $image, $log, $avaMgr, $dbc) = $this->getTestInstances(); list($access, $connection) = - $this->getAdvancedMocks($config, $filesys, $log, $avaMgr); + $this->getAdvancedMocks($config, $filesys, $log, $avaMgr, $dbc); $connection->expects($this->at(0)) ->method('__get') @@ -334,11 +335,11 @@ class Test_User_User extends \PHPUnit_Framework_TestCase { } public function testUpdateQuotaNoneConfigured() { - list($access, $config, $filesys, $image, $log, $avaMgr) = + list($access, $config, $filesys, $image, $log, $avaMgr, $dbc) = $this->getTestInstances(); list($access, $connection) = - $this->getAdvancedMocks($config, $filesys, $log, $avaMgr); + $this->getAdvancedMocks($config, $filesys, $log, $avaMgr, $dbc); $connection->expects($this->at(0)) ->method('__get') @@ -370,11 +371,11 @@ class Test_User_User extends \PHPUnit_Framework_TestCase { //the testUpdateAvatar series also implicitely tests getAvatarImage public function testUpdateAvatarJpegPhotoProvided() { - list($access, $config, $filesys, $image, $log, $avaMgr) = + list($access, $config, $filesys, $image, $log, $avaMgr, $dbc) = $this->getTestInstances(); list($access, $connection) = - $this->getAdvancedMocks($config, $filesys, $log, $avaMgr); + $this->getAdvancedMocks($config, $filesys, $log, $avaMgr, $dbc); $access->expects($this->once()) ->method('readAttribute') @@ -419,11 +420,11 @@ class Test_User_User extends \PHPUnit_Framework_TestCase { } public function testUpdateAvatarThumbnailPhotoProvided() { - list($access, $config, $filesys, $image, $log, $avaMgr) = + list($access, $config, $filesys, $image, $log, $avaMgr, $dbc) = $this->getTestInstances(); list($access, $connection) = - $this->getAdvancedMocks($config, $filesys, $log, $avaMgr); + $this->getAdvancedMocks($config, $filesys, $log, $avaMgr, $dbc); $access->expects($this->at(0)) ->method('readAttribute') @@ -477,11 +478,11 @@ class Test_User_User extends \PHPUnit_Framework_TestCase { } public function testUpdateAvatarNotProvided() { - list($access, $config, $filesys, $image, $log, $avaMgr) = + list($access, $config, $filesys, $image, $log, $avaMgr, $dbc) = $this->getTestInstances(); list($access, $connection) = - $this->getAdvancedMocks($config, $filesys, $log, $avaMgr); + $this->getAdvancedMocks($config, $filesys, $log, $avaMgr, $dbc); $access->expects($this->at(0)) ->method('readAttribute') @@ -523,11 +524,11 @@ class Test_User_User extends \PHPUnit_Framework_TestCase { } public function testUpdateBeforeFirstLogin() { - list($access, $config, $filesys, $image, $log, $avaMgr) = + list($access, $config, $filesys, $image, $log, $avaMgr, $dbc) = $this->getTestInstances(); list($access, $connection) = - $this->getAdvancedMocks($config, $filesys, $log, $avaMgr); + $this->getAdvancedMocks($config, $filesys, $log, $avaMgr, $dbc); $config->expects($this->at(0)) ->method('getUserValue') @@ -559,11 +560,11 @@ class Test_User_User extends \PHPUnit_Framework_TestCase { } public function testUpdateAfterFirstLogin() { - list($access, $config, $filesys, $image, $log, $avaMgr) = + list($access, $config, $filesys, $image, $log, $avaMgr, $dbc) = $this->getTestInstances(); list($access, $connection) = - $this->getAdvancedMocks($config, $filesys, $log, $avaMgr); + $this->getAdvancedMocks($config, $filesys, $log, $avaMgr, $dbc); $config->expects($this->at(0)) ->method('getUserValue') @@ -599,11 +600,11 @@ class Test_User_User extends \PHPUnit_Framework_TestCase { } public function testUpdateNoRefresh() { - list($access, $config, $filesys, $image, $log, $avaMgr) = + list($access, $config, $filesys, $image, $log, $avaMgr, $dbc) = $this->getTestInstances(); list($access, $connection) = - $this->getAdvancedMocks($config, $filesys, $log, $avaMgr); + $this->getAdvancedMocks($config, $filesys, $log, $avaMgr, $dbc); $config->expects($this->at(0)) ->method('getUserValue') diff --git a/apps/user_ldap/tests/user_ldap.php b/apps/user_ldap/tests/user_ldap.php index e51f6cb5bb9..3fa4f2bf0a1 100644 --- a/apps/user_ldap/tests/user_ldap.php +++ b/apps/user_ldap/tests/user_ldap.php @@ -27,11 +27,13 @@ use \OCA\user_ldap\lib\Access; use \OCA\user_ldap\lib\Connection; use \OCA\user_ldap\lib\ILDAPWrapper; -class Test_User_Ldap_Direct extends \PHPUnit_Framework_TestCase { +class Test_User_Ldap_Direct extends \Test\TestCase { protected $backend; protected $access; - public function setUp() { + protected function setUp() { + parent::setUp(); + \OC_User::clearBackends(); \OC_Group::clearBackends(); } @@ -60,7 +62,8 @@ class Test_User_Ldap_Direct extends \PHPUnit_Framework_TestCase { $this->getMock('\OCA\user_ldap\lib\FilesystemHelper'), $this->getMock('\OCA\user_ldap\lib\LogWrapper'), $this->getMock('\OCP\IAvatarManager'), - $this->getMock('\OCP\Image') + $this->getMock('\OCP\Image'), + $this->getMock('\OCP\IDBConnection') ); $access = $this->getMock('\OCA\user_ldap\lib\Access', @@ -98,9 +101,10 @@ class Test_User_Ldap_Direct extends \PHPUnit_Framework_TestCase { /** * Prepares the Access mock for checkPassword tests * @param \OCA\user_ldap\lib\Access $access mock + * @param bool noDisplayName * @return void */ - private function prepareAccessForCheckPassword(&$access) { + private function prepareAccessForCheckPassword(&$access, $noDisplayName = false) { $access->expects($this->once()) ->method('escapeFilterPart') ->will($this->returnCallback(function($uid) { @@ -120,15 +124,19 @@ class Test_User_Ldap_Direct extends \PHPUnit_Framework_TestCase { ->method('fetchListOfUsers') ->will($this->returnCallback(function($filter) { if($filter === 'roland') { - return array('dnOfRoland,dc=test'); + return array(array('dn' => 'dnOfRoland,dc=test')); } return array(); })); + $retVal = 'gunslinger'; + if($noDisplayName === true) { + $retVal = false; + } $access->expects($this->any()) ->method('dn2username') ->with($this->equalTo('dnOfRoland,dc=test')) - ->will($this->returnValue('gunslinger')); + ->will($this->returnValue($retVal)); $access->expects($this->any()) ->method('stringResemblesDN') @@ -149,7 +157,7 @@ class Test_User_Ldap_Direct extends \PHPUnit_Framework_TestCase { $access = $this->getAccessMock(); $this->prepareAccessForCheckPassword($access); - $backend = new UserLDAP($access); + $backend = new UserLDAP($access, $this->getMock('\OCP\IConfig')); \OC_User::useBackend($backend); $result = $backend->checkPassword('roland', 'dt19'); @@ -160,7 +168,7 @@ class Test_User_Ldap_Direct extends \PHPUnit_Framework_TestCase { $access = $this->getAccessMock(); $this->prepareAccessForCheckPassword($access); - $backend = new UserLDAP($access); + $backend = new UserLDAP($access, $this->getMock('\OCP\IConfig')); \OC_User::useBackend($backend); $result = $backend->checkPassword('roland', 'wrong'); @@ -171,17 +179,32 @@ class Test_User_Ldap_Direct extends \PHPUnit_Framework_TestCase { $access = $this->getAccessMock(); $this->prepareAccessForCheckPassword($access); - $backend = new UserLDAP($access); + $backend = new UserLDAP($access, $this->getMock('\OCP\IConfig')); \OC_User::useBackend($backend); $result = $backend->checkPassword('mallory', 'evil'); $this->assertFalse($result); } + public function testCheckPasswordNoDisplayName() { + $access = $this->getAccessMock(); + + $this->prepareAccessForCheckPassword($access, true); + $access->expects($this->once()) + ->method('username2dn') + ->will($this->returnValue(false)); + + $backend = new UserLDAP($access, $this->getMock('\OCP\IConfig')); + \OC_User::useBackend($backend); + + $result = $backend->checkPassword('roland', 'dt19'); + $this->assertFalse($result); + } + public function testCheckPasswordPublicAPI() { $access = $this->getAccessMock(); $this->prepareAccessForCheckPassword($access); - $backend = new UserLDAP($access); + $backend = new UserLDAP($access, $this->getMock('\OCP\IConfig')); \OC_User::useBackend($backend); $result = \OCP\User::checkPassword('roland', 'dt19'); @@ -191,7 +214,7 @@ class Test_User_Ldap_Direct extends \PHPUnit_Framework_TestCase { public function testCheckPasswordPublicAPIWrongPassword() { $access = $this->getAccessMock(); $this->prepareAccessForCheckPassword($access); - $backend = new UserLDAP($access); + $backend = new UserLDAP($access, $this->getMock('\OCP\IConfig')); \OC_User::useBackend($backend); $result = \OCP\User::checkPassword('roland', 'wrong'); @@ -201,13 +224,43 @@ class Test_User_Ldap_Direct extends \PHPUnit_Framework_TestCase { public function testCheckPasswordPublicAPIWrongUser() { $access = $this->getAccessMock(); $this->prepareAccessForCheckPassword($access); - $backend = new UserLDAP($access); + $backend = new UserLDAP($access, $this->getMock('\OCP\IConfig')); \OC_User::useBackend($backend); $result = \OCP\User::checkPassword('mallory', 'evil'); $this->assertFalse($result); } + public function testDeleteUserCancel() { + $access = $this->getAccessMock(); + $backend = new UserLDAP($access, $this->getMock('\OCP\IConfig')); + $result = $backend->deleteUser('notme'); + $this->assertFalse($result); + } + + public function testDeleteUserSuccess() { + $access = $this->getAccessMock(); + $mapping = $this->getMockBuilder('\OCA\User_LDAP\Mapping\UserMapping') + ->disableOriginalConstructor() + ->getMock(); + $mapping->expects($this->once()) + ->method('unmap') + ->will($this->returnValue(true)); + $access->expects($this->once()) + ->method('getUserMapper') + ->will($this->returnValue($mapping)); + + $config = $this->getMock('\OCP\IConfig'); + $config->expects($this->exactly(2)) + ->method('getUserValue') + ->will($this->returnValue(1)); + + $backend = new UserLDAP($access, $config); + + $result = $backend->deleteUser('jeremy'); + $this->assertTrue($result); + } + /** * Prepares the Access mock for getUsers tests * @param \OCA\user_ldap\lib\Access $access mock @@ -260,7 +313,7 @@ class Test_User_Ldap_Direct extends \PHPUnit_Framework_TestCase { public function testGetUsersNoParam() { $access = $this->getAccessMock(); $this->prepareAccessForGetUsers($access); - $backend = new UserLDAP($access); + $backend = new UserLDAP($access, $this->getMock('\OCP\IConfig')); $result = $backend->getUsers(); $this->assertEquals(3, count($result)); @@ -269,7 +322,7 @@ class Test_User_Ldap_Direct extends \PHPUnit_Framework_TestCase { public function testGetUsersLimitOffset() { $access = $this->getAccessMock(); $this->prepareAccessForGetUsers($access); - $backend = new UserLDAP($access); + $backend = new UserLDAP($access, $this->getMock('\OCP\IConfig')); $result = $backend->getUsers('', 1, 2); $this->assertEquals(1, count($result)); @@ -278,7 +331,7 @@ class Test_User_Ldap_Direct extends \PHPUnit_Framework_TestCase { public function testGetUsersLimitOffset2() { $access = $this->getAccessMock(); $this->prepareAccessForGetUsers($access); - $backend = new UserLDAP($access); + $backend = new UserLDAP($access, $this->getMock('\OCP\IConfig')); $result = $backend->getUsers('', 2, 1); $this->assertEquals(2, count($result)); @@ -287,7 +340,7 @@ class Test_User_Ldap_Direct extends \PHPUnit_Framework_TestCase { public function testGetUsersSearchWithResult() { $access = $this->getAccessMock(); $this->prepareAccessForGetUsers($access); - $backend = new UserLDAP($access); + $backend = new UserLDAP($access, $this->getMock('\OCP\IConfig')); $result = $backend->getUsers('yo'); $this->assertEquals(2, count($result)); @@ -296,7 +349,7 @@ class Test_User_Ldap_Direct extends \PHPUnit_Framework_TestCase { public function testGetUsersSearchEmptyResult() { $access = $this->getAccessMock(); $this->prepareAccessForGetUsers($access); - $backend = new UserLDAP($access); + $backend = new UserLDAP($access, $this->getMock('\OCP\IConfig')); $result = $backend->getUsers('nix'); $this->assertEquals(0, count($result)); @@ -305,7 +358,7 @@ class Test_User_Ldap_Direct extends \PHPUnit_Framework_TestCase { public function testGetUsersViaAPINoParam() { $access = $this->getAccessMock(); $this->prepareAccessForGetUsers($access); - $backend = new UserLDAP($access); + $backend = new UserLDAP($access, $this->getMock('\OCP\IConfig')); \OC_User::useBackend($backend); $result = \OCP\User::getUsers(); @@ -315,7 +368,7 @@ class Test_User_Ldap_Direct extends \PHPUnit_Framework_TestCase { public function testGetUsersViaAPILimitOffset() { $access = $this->getAccessMock(); $this->prepareAccessForGetUsers($access); - $backend = new UserLDAP($access); + $backend = new UserLDAP($access, $this->getMock('\OCP\IConfig')); \OC_User::useBackend($backend); $result = \OCP\User::getUsers('', 1, 2); @@ -325,7 +378,7 @@ class Test_User_Ldap_Direct extends \PHPUnit_Framework_TestCase { public function testGetUsersViaAPILimitOffset2() { $access = $this->getAccessMock(); $this->prepareAccessForGetUsers($access); - $backend = new UserLDAP($access); + $backend = new UserLDAP($access, $this->getMock('\OCP\IConfig')); \OC_User::useBackend($backend); $result = \OCP\User::getUsers('', 2, 1); @@ -335,7 +388,7 @@ class Test_User_Ldap_Direct extends \PHPUnit_Framework_TestCase { public function testGetUsersViaAPISearchWithResult() { $access = $this->getAccessMock(); $this->prepareAccessForGetUsers($access); - $backend = new UserLDAP($access); + $backend = new UserLDAP($access, $this->getMock('\OCP\IConfig')); \OC_User::useBackend($backend); $result = \OCP\User::getUsers('yo'); @@ -345,7 +398,7 @@ class Test_User_Ldap_Direct extends \PHPUnit_Framework_TestCase { public function testGetUsersViaAPISearchEmptyResult() { $access = $this->getAccessMock(); $this->prepareAccessForGetUsers($access); - $backend = new UserLDAP($access); + $backend = new UserLDAP($access, $this->getMock('\OCP\IConfig')); \OC_User::useBackend($backend); $result = \OCP\User::getUsers('nix'); @@ -354,7 +407,7 @@ class Test_User_Ldap_Direct extends \PHPUnit_Framework_TestCase { public function testUserExists() { $access = $this->getAccessMock(); - $backend = new UserLDAP($access); + $backend = new UserLDAP($access, $this->getMock('\OCP\IConfig')); $this->prepareMockForUserExists($access); $access->expects($this->any()) @@ -381,7 +434,7 @@ class Test_User_Ldap_Direct extends \PHPUnit_Framework_TestCase { public function testUserExistsPublicAPI() { $access = $this->getAccessMock(); - $backend = new UserLDAP($access); + $backend = new UserLDAP($access, $this->getMock('\OCP\IConfig')); $this->prepareMockForUserExists($access); \OC_User::useBackend($backend); @@ -409,7 +462,7 @@ class Test_User_Ldap_Direct extends \PHPUnit_Framework_TestCase { public function testDeleteUser() { $access = $this->getAccessMock(); - $backend = new UserLDAP($access); + $backend = new UserLDAP($access, $this->getMock('\OCP\IConfig')); //we do not support deleting users at all $result = $backend->deleteUser('gunslinger'); @@ -418,7 +471,8 @@ class Test_User_Ldap_Direct extends \PHPUnit_Framework_TestCase { public function testGetHome() { $access = $this->getAccessMock(); - $backend = new UserLDAP($access); + $config = $this->getMock('\OCP\IConfig'); + $backend = new UserLDAP($access, $config); $this->prepareMockForUserExists($access); $access->connection->expects($this->any()) @@ -451,14 +505,17 @@ class Test_User_Ldap_Direct extends \PHPUnit_Framework_TestCase { } })); + $datadir = '/my/data/dir'; + $config->expects($this->once()) + ->method('getSystemValue') + ->will($this->returnValue($datadir)); + //absolut path $result = $backend->getHome('gunslinger'); $this->assertEquals('/tmp/rolandshome/', $result); //datadir-relativ path $result = $backend->getHome('ladyofshadows'); - $datadir = \OCP\Config::getSystemValue('datadirectory', - \OC::$SERVERROOT.'/data'); $this->assertEquals($datadir.'/susannah/', $result); //no path at all – triggers OC default behaviour @@ -496,7 +553,7 @@ class Test_User_Ldap_Direct extends \PHPUnit_Framework_TestCase { public function testGetDisplayName() { $access = $this->getAccessMock(); $this->prepareAccessForGetDisplayName($access); - $backend = new UserLDAP($access); + $backend = new UserLDAP($access, $this->getMock('\OCP\IConfig')); $this->prepareMockForUserExists($access); //with displayName @@ -511,7 +568,7 @@ class Test_User_Ldap_Direct extends \PHPUnit_Framework_TestCase { public function testGetDisplayNamePublicAPI() { $access = $this->getAccessMock(); $this->prepareAccessForGetDisplayName($access); - $backend = new UserLDAP($access); + $backend = new UserLDAP($access, $this->getMock('\OCP\IConfig')); $this->prepareMockForUserExists($access); \OC_User::useBackend($backend); @@ -530,25 +587,11 @@ class Test_User_Ldap_Direct extends \PHPUnit_Framework_TestCase { public function testCountUsers() { $access = $this->getAccessMock(); - $access->connection->expects($this->once()) - ->method('__get') - ->will($this->returnCallback(function($name) { - if($name === 'ldapLoginFilter') { - return 'uid=%uid'; - } - return null; - })); - $access->expects($this->once()) ->method('countUsers') - ->will($this->returnCallback(function($filter, $a, $b, $c) { - if($filter !== 'uid=*') { - return false; - } - return 5; - })); + ->will($this->returnValue(5)); - $backend = new UserLDAP($access); + $backend = new UserLDAP($access, $this->getMock('\OCP\IConfig')); $result = $backend->countUsers(); $this->assertEquals(5, $result); @@ -557,25 +600,11 @@ class Test_User_Ldap_Direct extends \PHPUnit_Framework_TestCase { public function testCountUsersFailing() { $access = $this->getAccessMock(); - $access->connection->expects($this->once()) - ->method('__get') - ->will($this->returnCallback(function($name) { - if($name === 'ldapLoginFilter') { - return 'invalidFilter'; - } - return null; - })); - $access->expects($this->once()) ->method('countUsers') - ->will($this->returnCallback(function($filter, $a, $b, $c) { - if($filter !== 'uid=*') { - return false; - } - return 5; - })); + ->will($this->returnValue(false)); - $backend = new UserLDAP($access); + $backend = new UserLDAP($access, $this->getMock('\OCP\IConfig')); $result = $backend->countUsers(); $this->assertFalse($result); diff --git a/apps/user_ldap/tests/wizard.php b/apps/user_ldap/tests/wizard.php index 1f420f9ee8a..7284e466536 100644 --- a/apps/user_ldap/tests/wizard.php +++ b/apps/user_ldap/tests/wizard.php @@ -29,8 +29,9 @@ use \OCA\user_ldap\lib\Wizard; // use \OCA\user_ldap\lib\Configuration; // use \OCA\user_ldap\lib\ILDAPWrapper; -class Test_Wizard extends \PHPUnit_Framework_TestCase { - public function setUp() { +class Test_Wizard extends \Test\TestCase { + protected function setUp() { + parent::setUp(); //we need to make sure the consts are defined, otherwise tests will fail //on systems without php5_ldap $ldapConsts = array('LDAP_OPT_PROTOCOL_VERSION', diff --git a/apps/user_ldap/user_ldap.php b/apps/user_ldap/user_ldap.php index ae4dfec5118..051e760105b 100644 --- a/apps/user_ldap/user_ldap.php +++ b/apps/user_ldap/user_ldap.php @@ -26,8 +26,27 @@ namespace OCA\user_ldap; use OCA\user_ldap\lib\BackendUtility; +use OCA\user_ldap\lib\Access; +use OCA\user_ldap\lib\user\OfflineUser; +use OCA\User_LDAP\lib\User\User; +use OCP\IConfig; + +class USER_LDAP extends BackendUtility implements \OCP\IUserBackend, \OCP\UserInterface { + /** @var string[] $homesToKill */ + protected $homesToKill = array(); + + /** @var \OCP\IConfig */ + protected $ocConfig; + + /** + * @param \OCA\user_ldap\lib\Access $access + * @param \OCP\IConfig $ocConfig + */ + public function __construct(Access $access, IConfig $ocConfig) { + parent::__construct($access); + $this->ocConfig = $ocConfig; + } -class USER_LDAP extends BackendUtility implements \OCP\UserInterface { /** * checks whether the user is allowed to change his avatar in ownCloud * @param string $uid the ownCloud user name @@ -35,7 +54,7 @@ class USER_LDAP extends BackendUtility implements \OCP\UserInterface { */ public function canChangeAvatar($uid) { $user = $this->access->userManager->get($uid); - if(is_null($user)) { + if(!$user instanceof User) { return false; } if($user->getAvatarImage() === false) { @@ -49,7 +68,7 @@ class USER_LDAP extends BackendUtility implements \OCP\UserInterface { * Check if the password is correct * @param string $uid The username * @param string $password The password - * @return boolean + * @return false|string * * Check if the password is correct without logging in the user */ @@ -57,15 +76,23 @@ class USER_LDAP extends BackendUtility implements \OCP\UserInterface { $uid = $this->access->escapeFilterPart($uid); //find out dn of the user name + $attrs = array($this->access->connection->ldapUserDisplayName, 'dn', + 'uid', 'samaccountname'); $filter = \OCP\Util::mb_str_replace( '%uid', $uid, $this->access->connection->ldapLoginFilter, 'UTF-8'); - $ldap_users = $this->access->fetchListOfUsers($filter, 'dn'); - if(count($ldap_users) < 1) { + $users = $this->access->fetchListOfUsers($filter, $attrs); + if(count($users) < 1) { return false; } - $dn = $ldap_users[0]; - + $dn = $users[0]['dn']; $user = $this->access->userManager->get($dn); + if(!$user instanceof User) { + \OCP\Util::writeLog('user_ldap', + 'LDAP Login: Could not get user object for DN ' . $dn . + '. Maybe the LDAP entry has no set display name attribute?', + \OCP\Util::WARN); + return false; + } if($user->getUsername() !== false) { //are the credentials OK? if(!$this->access->areCredentialsValid($dn, $password)) { @@ -73,6 +100,15 @@ class USER_LDAP extends BackendUtility implements \OCP\UserInterface { } $user->markLogin(); + if(isset($users[0][$this->access->connection->ldapUserDisplayName])) { + $dpn = $users[0][$this->access->connection->ldapUserDisplayName]; + $user->storeDisplayName($dpn); + } + if(isset($users[0]['uid'])) { + $user->storeLDAPUserName($users[0]['uid']); + } else if(isset($users[0]['samaccountname'])) { + $user->storeLDAPUserName($users[0]['samaccountname']); + } return $user->getUsername(); } @@ -87,7 +123,7 @@ class USER_LDAP extends BackendUtility implements \OCP\UserInterface { * Get a list of all users. */ public function getUsers($search = '', $limit = 10, $offset = 0) { - $search = $this->access->escapeFilterPart($search); + $search = $this->access->escapeFilterPart($search, true); $cachekey = 'getUsers-'.$search.'-'.$limit.'-'.$offset; //check if users are cached, if so return @@ -122,6 +158,33 @@ class USER_LDAP extends BackendUtility implements \OCP\UserInterface { } /** + * checks whether a user is still available on LDAP + * @param string|\OCA\User_LDAP\lib\user\User $user either the ownCloud user + * name or an instance of that user + * @return bool + */ + public function userExistsOnLDAP($user) { + if(is_string($user)) { + $user = $this->access->userManager->get($user); + } + if(!$user instanceof User) { + return false; + } + + $dn = $user->getDN(); + //check if user really still exists by reading its entry + if(!is_array($this->access->readAttribute($dn, ''))) { + $lcr = $this->access->connection->getConnectionResource(); + if(is_null($lcr)) { + throw new \Exception('No LDAP Connection to server ' . $this->access->connection->ldapHost); + } + return false; + } + + return true; + } + + /** * check if a user exists * @param string $uid the username * @return boolean @@ -137,36 +200,55 @@ class USER_LDAP extends BackendUtility implements \OCP\UserInterface { $this->access->connection->ldapHost, \OCP\Util::DEBUG); $this->access->connection->writeToCache('userExists'.$uid, false); return false; + } else if($user instanceof OfflineUser) { + //express check for users marked as deleted. Returning true is + //necessary for cleanup + return true; } - $dn = $user->getDN(); - //check if user really still exists by reading its entry - if(!is_array($this->access->readAttribute($dn, ''))) { - \OCP\Util::writeLog('user_ldap', 'LDAP says no user '.$dn.' on '. - $this->access->connection->ldapHost, \OCP\Util::DEBUG); - $this->access->connection->writeToCache('userExists'.$uid, false); + + try { + $result = $this->userExistsOnLDAP($user); + $this->access->connection->writeToCache('userExists'.$uid, $result); + if($result === true) { + $user->update(); + } + return $result; + } catch (\Exception $e) { + \OCP\Util::writeLog('user_ldap', $e->getMessage(), \OCP\Util::WARN); return false; } - - $this->access->connection->writeToCache('userExists'.$uid, true); - $user->update(); - return true; } /** - * delete a user + * returns whether a user was deleted in LDAP + * * @param string $uid The username of the user to delete * @return bool - * - * Deletes a user */ public function deleteUser($uid) { - return false; + $marked = $this->ocConfig->getUserValue($uid, 'user_ldap', 'isDeleted', 0); + if(intval($marked) === 0) { + \OC::$server->getLogger()->notice( + 'User '.$uid . ' is not marked as deleted, not cleaning up.', + array('app' => 'user_ldap')); + return false; + } + \OC::$server->getLogger()->info('Cleaning up after user ' . $uid, + array('app' => 'user_ldap')); + + //Get Home Directory out of user preferences so we can return it later, + //necessary for removing directories as done by OC_User. + $home = $this->ocConfig->getUserValue($uid, 'user_ldap', 'homePath', ''); + $this->homesToKill[$uid] = $home; + $this->access->getUserMapper()->unmap($uid); + + return true; } /** * get the user's home directory * @param string $uid the username - * @return boolean + * @return string|bool */ public function getHome($uid) { // user Exists check required as it is not done in user proxy! @@ -174,6 +256,11 @@ class USER_LDAP extends BackendUtility implements \OCP\UserInterface { return false; } + if(isset($this->homesToKill[$uid]) && !empty($this->homesToKill[$uid])) { + //a deleted user who needs some clean up + return $this->homesToKill[$uid]; + } + $cacheKey = 'getHome'.$uid; if($this->access->connection->isCached($cacheKey)) { return $this->access->connection->getFromCache($cacheKey); @@ -193,16 +280,23 @@ class USER_LDAP extends BackendUtility implements \OCP\UserInterface { ) { $homedir = $path; } else { - $homedir = \OCP\Config::getSystemValue('datadirectory', + $homedir = $this->ocConfig->getSystemValue('datadirectory', \OC::$SERVERROOT.'/data' ) . '/' . $homedir[0]; } $this->access->connection->writeToCache($cacheKey, $homedir); + //we need it to store it in the DB as well in case a user gets + //deleted so we can clean up afterwards + $this->ocConfig->setUserValue( + $uid, 'user_ldap', 'homePath', $homedir + ); + //TODO: if home directory changes, the old one needs to be removed. return $homedir; } } //false will apply default behaviour as defined and done by OC_User $this->access->connection->writeToCache($cacheKey, false); + $this->ocConfig->setUserValue($uid, 'user_ldap', 'homePath', ''); return false; } @@ -284,9 +378,22 @@ class USER_LDAP extends BackendUtility implements \OCP\UserInterface { * @return int|bool */ public function countUsers() { - $filter = \OCP\Util::mb_str_replace( - '%uid', '*', $this->access->connection->ldapLoginFilter, 'UTF-8'); + $filter = $this->access->getFilterForUserCount(); + $cacheKey = 'countUsers-'.$filter; + if(!is_null($entries = $this->access->connection->getFromCache($cacheKey))) { + return $entries; + } $entries = $this->access->countUsers($filter); + $this->access->connection->writeToCache($cacheKey, $entries); return $entries; } + + /** + * Backend name to be shown in user management + * @return string the name of the backend to be shown + */ + public function getBackendName(){ + return 'LDAP'; + } + } diff --git a/apps/user_ldap/user_proxy.php b/apps/user_ldap/user_proxy.php index fa4d6939303..f5912fe1355 100644 --- a/apps/user_ldap/user_proxy.php +++ b/apps/user_ldap/user_proxy.php @@ -24,8 +24,11 @@ namespace OCA\user_ldap; use OCA\user_ldap\lib\ILDAPWrapper; +use OCA\User_LDAP\lib\User\User; +use \OCA\user_ldap\User_LDAP; +use OCP\IConfig; -class User_Proxy extends lib\Proxy implements \OCP\UserInterface { +class User_Proxy extends lib\Proxy implements \OCP\IUserBackend, \OCP\UserInterface { private $backends = array(); private $refBackend = null; @@ -33,11 +36,11 @@ class User_Proxy extends lib\Proxy implements \OCP\UserInterface { * Constructor * @param array $serverConfigPrefixes array containing the config Prefixes */ - public function __construct($serverConfigPrefixes, ILDAPWrapper $ldap) { + public function __construct(array $serverConfigPrefixes, ILDAPWrapper $ldap, IConfig $ocConfig) { parent::__construct($ldap); foreach($serverConfigPrefixes as $configPrefix) { $this->backends[$configPrefix] = - new \OCA\user_ldap\USER_LDAP($this->getAccess($configPrefix)); + new User_LDAP($this->getAccess($configPrefix), $ocConfig); if(is_null($this->refBackend)) { $this->refBackend = &$this->backends[$configPrefix]; } @@ -118,6 +121,14 @@ class User_Proxy extends lib\Proxy implements \OCP\UserInterface { } /** + * Backend name to be shown in user management + * @return string the name of the backend to be shown + */ + public function getBackendName() { + return $this->refBackend->getBackendName(); + } + + /** * Get a list of all users * @return string[] with all uids * @@ -145,6 +156,17 @@ class User_Proxy extends lib\Proxy implements \OCP\UserInterface { } /** + * check if a user exists on LDAP + * @param string|OCA\User_LDAP\lib\User\User $user either the ownCloud user + * name or an instance of that user + * @return boolean + */ + public function userExistsOnLDAP($user) { + $id = ($user instanceof User) ? $user->getUsername() : $user; + return $this->handleRequest($id, 'userExistsOnLDAP', array($user)); + } + + /** * Check if the password is correct * @param string $uid The username * @param string $password The password @@ -209,7 +231,7 @@ class User_Proxy extends lib\Proxy implements \OCP\UserInterface { * Deletes a user */ public function deleteUser($uid) { - return false; + return $this->handleRequest($uid, 'deleteUser', array($uid)); } /** diff --git a/apps/user_ldap/vendor/ui-multiselect/MIT-LICENSE b/apps/user_ldap/vendor/ui-multiselect/MIT-LICENSE new file mode 100644 index 00000000000..2dc8e79e3ad --- /dev/null +++ b/apps/user_ldap/vendor/ui-multiselect/MIT-LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2011 Eric Hynds + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/apps/user_ldap/vendor/ui-multiselect/jquery.multiselect.css b/apps/user_ldap/vendor/ui-multiselect/jquery.multiselect.css new file mode 100644 index 00000000000..9b81c3bdcfb --- /dev/null +++ b/apps/user_ldap/vendor/ui-multiselect/jquery.multiselect.css @@ -0,0 +1,23 @@ +.ui-multiselect { padding:2px 0 2px 4px; text-align:left; } +.ui-multiselect span.ui-icon { float:right; } +.ui-multiselect-single .ui-multiselect-checkboxes input { position:absolute !important; top: auto !important; left:-9999px; } +.ui-multiselect-single .ui-multiselect-checkboxes label { padding:5px !important; } + +.ui-multiselect-header { margin-bottom:3px; padding:3px 0 3px 4px; } +.ui-multiselect-header ul { font-size:14px; } +.ui-multiselect-header ul li { float:left; padding:0 10px 0 0; } +.ui-multiselect-header a { text-decoration:none; } +.ui-multiselect-header a:hover { text-decoration:underline; } +.ui-multiselect-header span.ui-icon { float:left;} +.ui-multiselect-header li.ui-multiselect-close { float:right; text-align:right; padding-right:0; } + +.ui-multiselect-menu { display:none; padding:3px; position:absolute; z-index:10000; text-align: left; } +.ui-multiselect-checkboxes { position:relative /* fixes bug in IE6/7 */; overflow-y:scroll; } +.ui-multiselect-checkboxes label { cursor:default; display:block; border:1px solid transparent; padding:3px 1px; } +.ui-multiselect-checkboxes label input { position:relative; top:1px; } +.ui-multiselect-checkboxes li { clear:both; font-size:14px; padding-right:3px; } +.ui-multiselect-checkboxes li.ui-multiselect-optgroup-label { text-align:center; font-weight:bold; border-bottom:1px solid; } +.ui-multiselect-checkboxes li.ui-multiselect-optgroup-label a { display:block; padding:3px; margin:1px 0; text-decoration:none; } + +/* remove label borders in IE6 because IE6 does not support transparency */ +* html .ui-multiselect-checkboxes label { border:none; } diff --git a/apps/user_ldap/vendor/ui-multiselect/src/jquery.multiselect.js b/apps/user_ldap/vendor/ui-multiselect/src/jquery.multiselect.js new file mode 100644 index 00000000000..16ae4264177 --- /dev/null +++ b/apps/user_ldap/vendor/ui-multiselect/src/jquery.multiselect.js @@ -0,0 +1,705 @@ +/* jshint forin:true, noarg:true, noempty:true, eqeqeq:true, boss:true, undef:true, curly:true, browser:true, jquery:true */ +/* + * jQuery MultiSelect UI Widget 1.13 + * Copyright (c) 2012 Eric Hynds + * + * http://www.erichynds.com/jquery/jquery-ui-multiselect-widget/ + * + * Depends: + * - jQuery 1.4.2+ + * - jQuery UI 1.8 widget factory + * + * Optional: + * - jQuery UI effects + * - jQuery UI position utility + * + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + * +*/ +(function($, undefined){ + +var multiselectID = 0; + +$.widget("ech.multiselect", { + + // default options + options: { + header: true, + height: 175, + minWidth: 225, + classes: '', + checkAllText: 'Check all', + uncheckAllText: 'Uncheck all', + noneSelectedText: 'Select options', + selectedText: '# selected', + selectedList: 0, + show: null, + hide: null, + autoOpen: false, + multiple: true, + position: {} + }, + + _create: function(){ + var el = this.element.hide(), + o = this.options; + + this.speed = $.fx.speeds._default; // default speed for effects + this._isOpen = false; // assume no + + var + button = (this.button = $('<button type="button"><span class="ui-icon ui-icon-triangle-2-n-s"></span></button>')) + .addClass('ui-multiselect ui-widget ui-state-default ui-corner-all') + .addClass( o.classes ) + .attr({ 'title':el.attr('title'), 'aria-haspopup':true, 'tabIndex':el.attr('tabIndex') }) + .insertAfter( el ), + + buttonlabel = (this.buttonlabel = $('<span />')) + .html( o.noneSelectedText ) + .appendTo( button ), + + menu = (this.menu = $('<div />')) + .addClass('ui-multiselect-menu ui-widget ui-widget-content ui-corner-all') + .addClass( o.classes ) + .appendTo( document.body ), + + header = (this.header = $('<div />')) + .addClass('ui-widget-header ui-corner-all ui-multiselect-header ui-helper-clearfix') + .appendTo( menu ), + + headerLinkContainer = (this.headerLinkContainer = $('<ul />')) + .addClass('ui-helper-reset') + .html(function(){ + if( o.header === true ){ + return '<li><a class="ui-multiselect-all" href="#"><span class="ui-icon ui-icon-check"></span><span>' + o.checkAllText + '</span></a></li><li><a class="ui-multiselect-none" href="#"><span class="ui-icon ui-icon-closethick"></span><span>' + o.uncheckAllText + '</span></a></li>'; + } else if(typeof o.header === "string"){ + return '<li>' + o.header + '</li>'; + } else { + return ''; + } + }) + .append('<li class="ui-multiselect-close"><a href="#" class="ui-multiselect-close"><span class="ui-icon ui-icon-circle-close"></span></a></li>') + .appendTo( header ), + + checkboxContainer = (this.checkboxContainer = $('<ul />')) + .addClass('ui-multiselect-checkboxes ui-helper-reset') + .appendTo( menu ); + + // perform event bindings + this._bindEvents(); + + // build menu + this.refresh( true ); + + // some addl. logic for single selects + if( !o.multiple ){ + menu.addClass('ui-multiselect-single'); + } + }, + + _init: function(){ + if( this.options.header === false ){ + this.header.hide(); + } + if( !this.options.multiple ){ + this.headerLinkContainer.find('.ui-multiselect-all, .ui-multiselect-none').hide(); + } + if( this.options.autoOpen ){ + this.open(); + } + if( this.element.is(':disabled') ){ + this.disable(); + } + }, + + refresh: function( init ){ + var el = this.element, + o = this.options, + menu = this.menu, + checkboxContainer = this.checkboxContainer, + optgroups = [], + html = "", + id = el.attr('id') || multiselectID++; // unique ID for the label & option tags + + // build items + el.find('option').each(function( i ){ + var $this = $(this), + parent = this.parentNode, + title = this.innerHTML, + description = this.title, + value = this.value, + inputID = 'ui-multiselect-' + (this.id || id + '-option-' + i), + isDisabled = this.disabled, + isSelected = this.selected, + labelClasses = [ 'ui-corner-all' ], + liClasses = (isDisabled ? 'ui-multiselect-disabled ' : ' ') + this.className, + optLabel; + + // is this an optgroup? + if( parent.tagName === 'OPTGROUP' ){ + optLabel = parent.getAttribute( 'label' ); + + // has this optgroup been added already? + if( $.inArray(optLabel, optgroups) === -1 ){ + html += '<li class="ui-multiselect-optgroup-label ' + parent.className + '"><a href="#">' + optLabel + '</a></li>'; + optgroups.push( optLabel ); + } + } + + if( isDisabled ){ + labelClasses.push( 'ui-state-disabled' ); + } + + // browsers automatically select the first option + // by default with single selects + if( isSelected && !o.multiple ){ + labelClasses.push( 'ui-state-active' ); + } + + html += '<li class="' + liClasses + '">'; + + // create the label + html += '<label for="' + inputID + '" title="' + description + '" class="' + labelClasses.join(' ') + '">'; + html += '<input id="' + inputID + '" name="multiselect_' + id + '" type="' + (o.multiple ? "checkbox" : "radio") + '" value="' + value + '" title="' + title + '"'; + + // pre-selected? + if( isSelected ){ + html += ' checked="checked"'; + html += ' aria-selected="true"'; + } + + // disabled? + if( isDisabled ){ + html += ' disabled="disabled"'; + html += ' aria-disabled="true"'; + } + + // add the title and close everything off + html += ' /><span>' + title + '</span></label></li>'; + }); + + // insert into the DOM + checkboxContainer.html( html ); + + // cache some moar useful elements + this.labels = menu.find('label'); + this.inputs = this.labels.children('input'); + + // set widths + this._setButtonWidth(); + this._setMenuWidth(); + + // remember default value + this.button[0].defaultValue = this.update(); + + // broadcast refresh event; useful for widgets + if( !init ){ + this._trigger('refresh'); + } + }, + + // updates the button text. call refresh() to rebuild + update: function(){ + var o = this.options, + $inputs = this.inputs, + $checked = $inputs.filter(':checked'), + numChecked = $checked.length, + value; + + if( numChecked === 0 ){ + value = o.noneSelectedText; + } else { + if($.isFunction( o.selectedText )){ + value = o.selectedText.call(this, numChecked, $inputs.length, $checked.get()); + } else if( /\d/.test(o.selectedList) && o.selectedList > 0 && numChecked <= o.selectedList){ + value = $checked.map(function(){ return $(this).next().html(); }).get().join(', '); + } else { + value = o.selectedText.replace('#', numChecked).replace('#', $inputs.length); + } + } + + this.buttonlabel.html( value ); + return value; + }, + + // binds events + _bindEvents: function(){ + var self = this, button = this.button; + + function clickHandler(){ + self[ self._isOpen ? 'close' : 'open' ](); + return false; + } + + // webkit doesn't like it when you click on the span :( + button + .find('span') + .bind('click.multiselect', clickHandler); + + // button events + button.bind({ + click: clickHandler, + keypress: function( e ){ + switch(e.which){ + case 27: // esc + case 38: // up + case 37: // left + self.close(); + break; + case 39: // right + case 40: // down + self.open(); + break; + } + }, + mouseenter: function(){ + if( !button.hasClass('ui-state-disabled') ){ + $(this).addClass('ui-state-hover'); + } + }, + mouseleave: function(){ + $(this).removeClass('ui-state-hover'); + }, + focus: function(){ + if( !button.hasClass('ui-state-disabled') ){ + $(this).addClass('ui-state-focus'); + } + }, + blur: function(){ + $(this).removeClass('ui-state-focus'); + } + }); + + // header links + this.header + .delegate('a', 'click.multiselect', function( e ){ + // close link + if( $(this).hasClass('ui-multiselect-close') ){ + self.close(); + + // check all / uncheck all + } else { + self[ $(this).hasClass('ui-multiselect-all') ? 'checkAll' : 'uncheckAll' ](); + } + + e.preventDefault(); + }); + + // optgroup label toggle support + this.menu + .delegate('li.ui-multiselect-optgroup-label a', 'click.multiselect', function( e ){ + e.preventDefault(); + + var $this = $(this), + $inputs = $this.parent().nextUntil('li.ui-multiselect-optgroup-label').find('input:visible:not(:disabled)'), + nodes = $inputs.get(), + label = $this.parent().text(); + + // trigger event and bail if the return is false + if( self._trigger('beforeoptgrouptoggle', e, { inputs:nodes, label:label }) === false ){ + return; + } + + // toggle inputs + self._toggleChecked( + $inputs.filter(':checked').length !== $inputs.length, + $inputs + ); + + self._trigger('optgrouptoggle', e, { + inputs: nodes, + label: label, + checked: nodes[0].checked + }); + }) + .delegate('label', 'mouseenter.multiselect', function(){ + if( !$(this).hasClass('ui-state-disabled') ){ + self.labels.removeClass('ui-state-hover'); + $(this).addClass('ui-state-hover').find('input').focus(); + } + }) + .delegate('label', 'keydown.multiselect', function( e ){ + e.preventDefault(); + + switch(e.which){ + case 9: // tab + case 27: // esc + self.close(); + break; + case 38: // up + case 40: // down + case 37: // left + case 39: // right + self._traverse(e.which, this); + break; + case 13: // enter + $(this).find('input')[0].click(); + break; + } + }) + .delegate('input[type="checkbox"], input[type="radio"]', 'click.multiselect', function( e ){ + var $this = $(this), + val = this.value, + checked = this.checked, + tags = self.element.find('option'); + + // bail if this input is disabled or the event is cancelled + if( this.disabled || self._trigger('click', e, { value: val, text: this.title, checked: checked }) === false ){ + e.preventDefault(); + return; + } + + // make sure the input has focus. otherwise, the esc key + // won't close the menu after clicking an item. + $this.focus(); + + // toggle aria state + $this.attr('aria-selected', checked); + + // change state on the original option tags + tags.each(function(){ + if( this.value === val ){ + this.selected = checked; + } else if( !self.options.multiple ){ + this.selected = false; + } + }); + + // some additional single select-specific logic + if( !self.options.multiple ){ + self.labels.removeClass('ui-state-active'); + $this.closest('label').toggleClass('ui-state-active', checked ); + + // close menu + self.close(); + } + + // fire change on the select box + self.element.trigger("change"); + + // setTimeout is to fix multiselect issue #14 and #47. caused by jQuery issue #3827 + // http://bugs.jquery.com/ticket/3827 + setTimeout($.proxy(self.update, self), 10); + }); + + // close each widget when clicking on any other element/anywhere else on the page + $(document).bind('mousedown.multiselect', function( e ){ + if(self._isOpen && !$.contains(self.menu[0], e.target) && !$.contains(self.button[0], e.target) && e.target !== self.button[0]){ + self.close(); + } + }); + + // deal with form resets. the problem here is that buttons aren't + // restored to their defaultValue prop on form reset, and the reset + // handler fires before the form is actually reset. delaying it a bit + // gives the form inputs time to clear. + $(this.element[0].form).bind('reset.multiselect', function(){ + setTimeout($.proxy(self.refresh, self), 10); + }); + }, + + // set button width + _setButtonWidth: function(){ + var width = this.element.outerWidth(), + o = this.options; + + if( /\d/.test(o.minWidth) && width < o.minWidth){ + width = o.minWidth; + } + + // set widths + this.button.width( width ); + }, + + // set menu width + _setMenuWidth: function(){ + var m = this.menu, + width = this.button.outerWidth()- + parseInt(m.css('padding-left'),10)- + parseInt(m.css('padding-right'),10)- + parseInt(m.css('border-right-width'),10)- + parseInt(m.css('border-left-width'),10); + + m.width( width || this.button.outerWidth() ); + }, + + // move up or down within the menu + _traverse: function( which, start ){ + var $start = $(start), + moveToLast = which === 38 || which === 37, + + // select the first li that isn't an optgroup label / disabled + $next = $start.parent()[moveToLast ? 'prevAll' : 'nextAll']('li:not(.ui-multiselect-disabled, .ui-multiselect-optgroup-label)')[ moveToLast ? 'last' : 'first'](); + + // if at the first/last element + if( !$next.length ){ + var $container = this.menu.find('ul').last(); + + // move to the first/last + this.menu.find('label')[ moveToLast ? 'last' : 'first' ]().trigger('mouseover'); + + // set scroll position + $container.scrollTop( moveToLast ? $container.height() : 0 ); + + } else { + $next.find('label').trigger('mouseover'); + } + }, + + // This is an internal function to toggle the checked property and + // other related attributes of a checkbox. + // + // The context of this function should be a checkbox; do not proxy it. + _toggleState: function( prop, flag ){ + return function(){ + if( !this.disabled ) { + this[ prop ] = flag; + } + + if( flag ){ + this.setAttribute('aria-selected', true); + } else { + this.removeAttribute('aria-selected'); + } + }; + }, + + _toggleChecked: function( flag, group ){ + var $inputs = (group && group.length) ? group : this.inputs, + self = this; + + // toggle state on inputs + $inputs.each(this._toggleState('checked', flag)); + + // give the first input focus + $inputs.eq(0).focus(); + + // update button text + this.update(); + + // gather an array of the values that actually changed + var values = $inputs.map(function(){ + return this.value; + }).get(); + + // toggle state on original option tags + this.element + .find('option') + .each(function(){ + if( !this.disabled && $.inArray(this.value, values) > -1 ){ + self._toggleState('selected', flag).call( this ); + } + }); + + // trigger the change event on the select + if( $inputs.length ) { + this.element.trigger("change"); + } + }, + + _toggleDisabled: function( flag ){ + this.button + .attr({ 'disabled':flag, 'aria-disabled':flag })[ flag ? 'addClass' : 'removeClass' ]('ui-state-disabled'); + + var inputs = this.menu.find('input'); + var key = "ech-multiselect-disabled"; + + if(flag) { + // remember which elements this widget disabled (not pre-disabled) + // elements, so that they can be restored if the widget is re-enabled. + inputs = inputs.filter(':enabled') + .data(key, true) + } else { + inputs = inputs.filter(function() { + return $.data(this, key) === true; + }).removeData(key); + } + + inputs + .attr({ 'disabled':flag, 'arial-disabled':flag }) + .parent()[ flag ? 'addClass' : 'removeClass' ]('ui-state-disabled'); + + this.element + .attr({ 'disabled':flag, 'aria-disabled':flag }); + }, + + // open the menu + open: function( e ){ + var self = this, + button = this.button, + menu = this.menu, + speed = this.speed, + o = this.options, + args = []; + + // bail if the multiselectopen event returns false, this widget is disabled, or is already open + if( this._trigger('beforeopen') === false || button.hasClass('ui-state-disabled') || this._isOpen ){ + return; + } + + var $container = menu.find('ul').last(), + effect = o.show, + pos = button.offset(); + + // figure out opening effects/speeds + if( $.isArray(o.show) ){ + effect = o.show[0]; + speed = o.show[1] || self.speed; + } + + // if there's an effect, assume jQuery UI is in use + // build the arguments to pass to show() + if( effect ) { + args = [ effect, speed ]; + } + + // set the scroll of the checkbox container + $container.scrollTop(0).height(o.height); + + // position and show menu + if( $.ui.position && !$.isEmptyObject(o.position) ){ + o.position.of = o.position.of || button; + + menu + .show() + .position( o.position ) + .hide(); + + // if position utility is not available... + } else { + menu.css({ + top: pos.top + button.outerHeight(), + left: pos.left + }); + } + + // show the menu, maybe with a speed/effect combo + $.fn.show.apply(menu, args); + + // select the first option + // triggering both mouseover and mouseover because 1.4.2+ has a bug where triggering mouseover + // will actually trigger mouseenter. the mouseenter trigger is there for when it's eventually fixed + this.labels.eq(0).trigger('mouseover').trigger('mouseenter').find('input').trigger('focus'); + + button.addClass('ui-state-active'); + this._isOpen = true; + this._trigger('open'); + }, + + // close the menu + close: function(){ + if(this._trigger('beforeclose') === false){ + return; + } + + var o = this.options, + effect = o.hide, + speed = this.speed, + args = []; + + // figure out opening effects/speeds + if( $.isArray(o.hide) ){ + effect = o.hide[0]; + speed = o.hide[1] || this.speed; + } + + if( effect ) { + args = [ effect, speed ]; + } + + $.fn.hide.apply(this.menu, args); + this.button.removeClass('ui-state-active').trigger('blur').trigger('mouseleave'); + this._isOpen = false; + this._trigger('close'); + }, + + enable: function(){ + this._toggleDisabled(false); + }, + + disable: function(){ + this._toggleDisabled(true); + }, + + checkAll: function( e ){ + this._toggleChecked(true); + this._trigger('checkAll'); + }, + + uncheckAll: function(){ + this._toggleChecked(false); + this._trigger('uncheckAll'); + }, + + getChecked: function(){ + return this.menu.find('input').filter(':checked'); + }, + + destroy: function(){ + // remove classes + data + $.Widget.prototype.destroy.call( this ); + + this.button.remove(); + this.menu.remove(); + this.element.show(); + + return this; + }, + + isOpen: function(){ + return this._isOpen; + }, + + widget: function(){ + return this.menu; + }, + + getButton: function(){ + return this.button; + }, + + // react to option changes after initialization + _setOption: function( key, value ){ + var menu = this.menu; + + switch(key){ + case 'header': + menu.find('div.ui-multiselect-header')[ value ? 'show' : 'hide' ](); + break; + case 'checkAllText': + menu.find('a.ui-multiselect-all span').eq(-1).text(value); + break; + case 'uncheckAllText': + menu.find('a.ui-multiselect-none span').eq(-1).text(value); + break; + case 'height': + menu.find('ul').last().height( parseInt(value,10) ); + break; + case 'minWidth': + this.options[ key ] = parseInt(value,10); + this._setButtonWidth(); + this._setMenuWidth(); + break; + case 'selectedText': + case 'selectedList': + case 'noneSelectedText': + this.options[key] = value; // these all needs to update immediately for the update() call + this.update(); + break; + case 'classes': + menu.add(this.button).removeClass(this.options.classes).addClass(value); + break; + case 'multiple': + menu.toggleClass('ui-multiselect-single', !value); + this.options.multiple = value; + this.element[0].multiple = value; + this.refresh(); + } + + $.Widget.prototype._setOption.apply( this, arguments ); + } +}); + +})(jQuery); diff --git a/apps/user_webdavauth/l10n/bs.js b/apps/user_webdavauth/l10n/bs.js index becf43aa7f4..5cdb03a07f1 100644 --- a/apps/user_webdavauth/l10n/bs.js +++ b/apps/user_webdavauth/l10n/bs.js @@ -1,6 +1,9 @@ OC.L10N.register( "user_webdavauth", { - "Save" : "Spasi" + "WebDAV Authentication" : "WebDAV autentifikacija", + "Address:" : "Adresa:", + "Save" : "Spasi", + "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Korisnikovi akreditivi biti će poslani na ovu adresu. Ovaj plugin proverava odgovor i tumači status HTTP kodova 401 i 403 kao nevažeće akreditive, i sve druge odgovore kao validne akreditive." }, "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/apps/user_webdavauth/l10n/bs.json b/apps/user_webdavauth/l10n/bs.json index 18aa0254d19..823be754a41 100644 --- a/apps/user_webdavauth/l10n/bs.json +++ b/apps/user_webdavauth/l10n/bs.json @@ -1,4 +1,7 @@ { "translations": { - "Save" : "Spasi" + "WebDAV Authentication" : "WebDAV autentifikacija", + "Address:" : "Adresa:", + "Save" : "Spasi", + "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Korisnikovi akreditivi biti će poslani na ovu adresu. Ovaj plugin proverava odgovor i tumači status HTTP kodova 401 i 403 kao nevažeće akreditive, i sve druge odgovore kao validne akreditive." },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" }
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/fi.js b/apps/user_webdavauth/l10n/fi.js new file mode 100644 index 00000000000..09bd8e55e7f --- /dev/null +++ b/apps/user_webdavauth/l10n/fi.js @@ -0,0 +1,6 @@ +OC.L10N.register( + "user_webdavauth", + { + "Save" : "Tallenna" +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_webdavauth/l10n/fi.json b/apps/user_webdavauth/l10n/fi.json new file mode 100644 index 00000000000..f4a8647859b --- /dev/null +++ b/apps/user_webdavauth/l10n/fi.json @@ -0,0 +1,4 @@ +{ "translations": { + "Save" : "Tallenna" +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/fr.js b/apps/user_webdavauth/l10n/fr.js index 5b36d5aa5b1..a53302d4a6d 100644 --- a/apps/user_webdavauth/l10n/fr.js +++ b/apps/user_webdavauth/l10n/fr.js @@ -4,6 +4,6 @@ OC.L10N.register( "WebDAV Authentication" : "Authentification WebDAV", "Address:" : "Adresse :", "Save" : "Sauvegarder", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Les informations de connexion de l'utilisateur seront envoyées à cette adresse. Ce module analyse le code de la réponse HTTP et considère les codes 401 et 403 comme une authentification invalide et tout autre valeur comme une authentification valide." + "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Les informations de connexion de l'utilisateur seront envoyées à cette adresse. Ce module analyse le code de la réponse HTTP et considère les codes 401 et 403 comme une authentification non valable et toute autre valeur comme une authentification valable." }, "nplurals=2; plural=(n > 1);"); diff --git a/apps/user_webdavauth/l10n/fr.json b/apps/user_webdavauth/l10n/fr.json index fe8c4b521ad..93d631c8ed6 100644 --- a/apps/user_webdavauth/l10n/fr.json +++ b/apps/user_webdavauth/l10n/fr.json @@ -2,6 +2,6 @@ "WebDAV Authentication" : "Authentification WebDAV", "Address:" : "Adresse :", "Save" : "Sauvegarder", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Les informations de connexion de l'utilisateur seront envoyées à cette adresse. Ce module analyse le code de la réponse HTTP et considère les codes 401 et 403 comme une authentification invalide et tout autre valeur comme une authentification valide." + "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Les informations de connexion de l'utilisateur seront envoyées à cette adresse. Ce module analyse le code de la réponse HTTP et considère les codes 401 et 403 comme une authentification non valable et toute autre valeur comme une authentification valable." },"pluralForm" :"nplurals=2; plural=(n > 1);" }
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/id.js b/apps/user_webdavauth/l10n/id.js index a7902dbf3b2..d71da240e27 100644 --- a/apps/user_webdavauth/l10n/id.js +++ b/apps/user_webdavauth/l10n/id.js @@ -2,7 +2,8 @@ OC.L10N.register( "user_webdavauth", { "WebDAV Authentication" : "Otentikasi WebDAV", + "Address:" : "Alamat:", "Save" : "Simpan", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Kredensial pengguna akan dikirim ke alamat ini. Pengaya ini memeriksa respon dan akan menafsirkan kode status HTTP 401 dan 403 sebagai kredensial yang tidak valid, dan semua tanggapan lain akan dianggap sebagai kredensial yang valid." + "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Kredensial pengguna akan dikirim ke alamat ini. Pengaya ini memeriksa respon dan akan mengartikan kode status HTTP 401 dan 403 sebagai kredensial yang tidak valid, dan semua tanggapan lain akan dianggap sebagai kredensial yang valid." }, "nplurals=1; plural=0;"); diff --git a/apps/user_webdavauth/l10n/id.json b/apps/user_webdavauth/l10n/id.json index 88638eb47c6..ba327c72dda 100644 --- a/apps/user_webdavauth/l10n/id.json +++ b/apps/user_webdavauth/l10n/id.json @@ -1,6 +1,7 @@ { "translations": { "WebDAV Authentication" : "Otentikasi WebDAV", + "Address:" : "Alamat:", "Save" : "Simpan", - "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Kredensial pengguna akan dikirim ke alamat ini. Pengaya ini memeriksa respon dan akan menafsirkan kode status HTTP 401 dan 403 sebagai kredensial yang tidak valid, dan semua tanggapan lain akan dianggap sebagai kredensial yang valid." + "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Kredensial pengguna akan dikirim ke alamat ini. Pengaya ini memeriksa respon dan akan mengartikan kode status HTTP 401 dan 403 sebagai kredensial yang tidak valid, dan semua tanggapan lain akan dianggap sebagai kredensial yang valid." },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/kn.js b/apps/user_webdavauth/l10n/kn.js new file mode 100644 index 00000000000..2c7f6526c06 --- /dev/null +++ b/apps/user_webdavauth/l10n/kn.js @@ -0,0 +1,6 @@ +OC.L10N.register( + "user_webdavauth", + { + "Save" : "ಉಳಿಸಿ" +}, +"nplurals=1; plural=0;"); diff --git a/apps/user_webdavauth/l10n/kn.json b/apps/user_webdavauth/l10n/kn.json new file mode 100644 index 00000000000..5699698e22c --- /dev/null +++ b/apps/user_webdavauth/l10n/kn.json @@ -0,0 +1,4 @@ +{ "translations": { + "Save" : "ಉಳಿಸಿ" +},"pluralForm" :"nplurals=1; plural=0;" +}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/mn.js b/apps/user_webdavauth/l10n/mn.js new file mode 100644 index 00000000000..ecbe9c6693c --- /dev/null +++ b/apps/user_webdavauth/l10n/mn.js @@ -0,0 +1,8 @@ +OC.L10N.register( + "user_webdavauth", + { + "WebDAV Authentication" : "WebDAV Нотолгоо", + "Address:" : "Хаяг:", + "Save" : "Хадгалах" +}, +"nplurals=2; plural=(n != 1);"); diff --git a/apps/user_webdavauth/l10n/mn.json b/apps/user_webdavauth/l10n/mn.json new file mode 100644 index 00000000000..ba322132591 --- /dev/null +++ b/apps/user_webdavauth/l10n/mn.json @@ -0,0 +1,6 @@ +{ "translations": { + "WebDAV Authentication" : "WebDAV Нотолгоо", + "Address:" : "Хаяг:", + "Save" : "Хадгалах" +},"pluralForm" :"nplurals=2; plural=(n != 1);" +}
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/sk.php b/apps/user_webdavauth/l10n/sk.php deleted file mode 100644 index 9efe9fe6549..00000000000 --- a/apps/user_webdavauth/l10n/sk.php +++ /dev/null @@ -1,5 +0,0 @@ -<?php -$TRANSLATIONS = array( -"Save" => "Uložiť" -); -$PLURAL_FORMS = "nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"; diff --git a/apps/user_webdavauth/l10n/sr@latin.js b/apps/user_webdavauth/l10n/sr@latin.js index c6b89e58319..cf03aa604dd 100644 --- a/apps/user_webdavauth/l10n/sr@latin.js +++ b/apps/user_webdavauth/l10n/sr@latin.js @@ -1,6 +1,9 @@ OC.L10N.register( "user_webdavauth", { - "Save" : "Snimi" + "WebDAV Authentication" : "WebDAV provera identiteta", + "Address:" : "Adresa:", + "Save" : "Snimi", + "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Korisnički podaci za proveru identiteta će biti poslati na ovu adresu. Ova komponenta proverava odgovor i protumačiće HTTP statusne kodove 401 i 403 kao neispravne podatke za proveru identiteta, a sve ostale odgovore kao ispravne." }, "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); diff --git a/apps/user_webdavauth/l10n/sr@latin.json b/apps/user_webdavauth/l10n/sr@latin.json index 5cca2be8eec..d54f467400e 100644 --- a/apps/user_webdavauth/l10n/sr@latin.json +++ b/apps/user_webdavauth/l10n/sr@latin.json @@ -1,4 +1,7 @@ { "translations": { - "Save" : "Snimi" + "WebDAV Authentication" : "WebDAV provera identiteta", + "Address:" : "Adresa:", + "Save" : "Snimi", + "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "Korisnički podaci za proveru identiteta će biti poslati na ovu adresu. Ova komponenta proverava odgovor i protumačiće HTTP statusne kodove 401 i 403 kao neispravne podatke za proveru identiteta, a sve ostale odgovore kao ispravne." },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" }
\ No newline at end of file diff --git a/apps/user_webdavauth/l10n/sv.js b/apps/user_webdavauth/l10n/sv.js index d80f3c22307..b16f60985ea 100644 --- a/apps/user_webdavauth/l10n/sv.js +++ b/apps/user_webdavauth/l10n/sv.js @@ -1,7 +1,7 @@ OC.L10N.register( "user_webdavauth", { - "WebDAV Authentication" : "WebDAV Autentisering", + "WebDAV Authentication" : "WebDAV-autentisering", "Address:" : "Adress:", "Save" : "Spara", "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "ownCloud kommer skicka användaruppgifterna till denna URL. Denna plugin kontrollerar svaret och tolkar HTTP-statuskoderna 401 och 403 som felaktiga uppgifter, och alla andra svar som giltiga uppgifter." diff --git a/apps/user_webdavauth/l10n/sv.json b/apps/user_webdavauth/l10n/sv.json index f11a1610ec3..fa09724c784 100644 --- a/apps/user_webdavauth/l10n/sv.json +++ b/apps/user_webdavauth/l10n/sv.json @@ -1,5 +1,5 @@ { "translations": { - "WebDAV Authentication" : "WebDAV Autentisering", + "WebDAV Authentication" : "WebDAV-autentisering", "Address:" : "Adress:", "Save" : "Spara", "The user credentials will be sent to this address. This plugin checks the response and will interpret the HTTP statuscodes 401 and 403 as invalid credentials, and all other responses as valid credentials." : "ownCloud kommer skicka användaruppgifterna till denna URL. Denna plugin kontrollerar svaret och tolkar HTTP-statuskoderna 401 och 403 som felaktiga uppgifter, och alla andra svar som giltiga uppgifter." diff --git a/apps/user_webdavauth/user_webdavauth.php b/apps/user_webdavauth/user_webdavauth.php index 86e5b916f3d..1154a7865be 100644 --- a/apps/user_webdavauth/user_webdavauth.php +++ b/apps/user_webdavauth/user_webdavauth.php @@ -21,7 +21,7 @@ * */ -class OC_USER_WEBDAVAUTH extends OC_User_Backend { +class OC_USER_WEBDAVAUTH extends OC_User_Backend implements \OCP\IUserBackend { protected $webdavauth_url; public function __construct() { @@ -86,4 +86,12 @@ class OC_USER_WEBDAVAUTH extends OC_User_Backend { return $returnArray; } + + /** + * Backend name to be shown in user management + * @return string the name of the backend to be shown + */ + public function getBackendName(){ + return 'WebDAV'; + } } |