summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorSandro Lutz <sandro.lutz@temparus.ch>2017-02-07 00:12:45 +0100
committerSandro Lutz <sandro.lutz@temparus.ch>2017-02-07 00:15:30 +0100
commitfa1d607bfa951711a2c358f889db56962c179153 (patch)
tree904b6bd3b7f9d2ed133f64da22b3fb9bbfbf1842 /lib
parentff3fa538e43bb38a5ff142b07216b9de79645c01 (diff)
parentb55f5af7eaab6f827989407fa7b8d51cbb877eab (diff)
downloadnextcloud-server-fa1d607bfa951711a2c358f889db56962c179153.tar.gz
nextcloud-server-fa1d607bfa951711a2c358f889db56962c179153.zip
Merge remote-tracking branch 'nextcloud/master'
Signed-off-by: Sandro Lutz <sandro.lutz@temparus.ch>
Diffstat (limited to 'lib')
-rw-r--r--lib/base.php59
-rw-r--r--lib/composer/autoload.php2
-rw-r--r--lib/composer/composer/ClassLoader.php36
-rw-r--r--lib/composer/composer/autoload_classmap.php52
-rw-r--r--lib/composer/composer/autoload_real.php2
-rw-r--r--lib/composer/composer/autoload_static.php52
-rw-r--r--lib/l10n/bg_BG.js177
-rw-r--r--lib/l10n/bg_BG.json175
-rw-r--r--lib/l10n/cs_CZ.js14
-rw-r--r--lib/l10n/cs_CZ.json14
-rw-r--r--lib/l10n/de.js10
-rw-r--r--lib/l10n/de.json10
-rw-r--r--lib/l10n/de_DE.js26
-rw-r--r--lib/l10n/de_DE.json26
-rw-r--r--lib/l10n/es.js10
-rw-r--r--lib/l10n/es.json10
-rw-r--r--lib/l10n/fr.js12
-rw-r--r--lib/l10n/fr.json12
-rw-r--r--lib/l10n/hu_HU.js10
-rw-r--r--lib/l10n/hu_HU.json10
-rw-r--r--lib/l10n/it.js10
-rw-r--r--lib/l10n/it.json10
-rw-r--r--lib/l10n/ja.js10
-rw-r--r--lib/l10n/ja.json10
-rw-r--r--lib/l10n/nb_NO.js16
-rw-r--r--lib/l10n/nb_NO.json16
-rw-r--r--lib/l10n/nl.js10
-rw-r--r--lib/l10n/nl.json10
-rw-r--r--lib/l10n/pl.js17
-rw-r--r--lib/l10n/pl.json17
-rw-r--r--lib/l10n/pt_BR.js10
-rw-r--r--lib/l10n/pt_BR.json10
-rw-r--r--lib/l10n/ru.js17
-rw-r--r--lib/l10n/ru.json17
-rw-r--r--lib/l10n/sk_SK.js215
-rw-r--r--lib/l10n/sk_SK.json213
-rw-r--r--lib/l10n/sq.js233
-rw-r--r--lib/l10n/sq.json231
-rw-r--r--lib/l10n/sv.js233
-rw-r--r--lib/l10n/sv.json231
-rw-r--r--lib/l10n/zh_CN.js233
-rw-r--r--lib/l10n/zh_CN.json231
-rw-r--r--lib/l10n/zh_TW.js4
-rw-r--r--lib/l10n/zh_TW.json4
-rw-r--r--lib/private/AllConfig.php13
-rw-r--r--lib/private/App/AppManager.php15
-rw-r--r--lib/private/App/AppStore/Fetcher/AppFetcher.php22
-rw-r--r--lib/private/App/AppStore/Fetcher/CategoryFetcher.php8
-rw-r--r--lib/private/App/AppStore/Fetcher/Fetcher.php56
-rw-r--r--lib/private/AppConfig.php59
-rw-r--r--lib/private/AppFramework/Db/Db.php314
-rw-r--r--lib/private/AppFramework/DependencyInjection/DIContainer.php29
-rw-r--r--lib/private/AppFramework/Middleware/Security/SecurityMiddleware.php14
-rw-r--r--lib/private/AppFramework/Utility/ControllerMethodReflector.php23
-rw-r--r--lib/private/Archive/TAR.php19
-rw-r--r--lib/private/Archive/ZIP.php18
-rw-r--r--lib/private/Authentication/LoginCredentials/Credentials.php72
-rw-r--r--lib/private/Authentication/LoginCredentials/Store.php120
-rw-r--r--lib/private/Authentication/TwoFactorAuth/Manager.php45
-rw-r--r--lib/private/Console/TimestampFormatter.php4
-rw-r--r--lib/private/DB/QueryBuilder/ExpressionBuilder/ExpressionBuilder.php38
-rw-r--r--lib/private/Encryption/Keys/Storage.php35
-rw-r--r--lib/private/Files/Cache/Cache.php7
-rw-r--r--lib/private/Files/Config/UserMountCache.php7
-rw-r--r--lib/private/Files/Mount/LocalHomeMountProvider.php3
-rw-r--r--lib/private/Files/Node/File.php56
-rw-r--r--lib/private/Files/Node/Folder.php55
-rw-r--r--lib/private/Files/Node/Node.php80
-rw-r--r--lib/private/Files/Notify/Change.php65
-rw-r--r--lib/private/Files/Notify/RenameChange.php52
-rw-r--r--lib/private/Files/ObjectStore/ObjectStoreStorage.php21
-rw-r--r--lib/private/Files/Storage/Common.php10
-rw-r--r--lib/private/Files/Storage/DAV.php123
-rw-r--r--lib/private/Files/Storage/Home.php11
-rw-r--r--lib/private/Files/Storage/Local.php13
-rw-r--r--lib/private/Files/Stream/Close.php119
-rw-r--r--lib/private/Files/Stream/Dir.php67
-rw-r--r--lib/private/Files/Stream/Quota.php94
-rw-r--r--lib/private/Files/Stream/StaticStream.php171
-rw-r--r--lib/private/Files/Type/Detection.php4
-rw-r--r--lib/private/Files/Utils/Scanner.php21
-rw-r--r--lib/private/Files/View.php27
-rw-r--r--lib/private/Group/Backend.php15
-rw-r--r--lib/private/Group/Database.php5
-rw-r--r--lib/private/Group/Group.php14
-rw-r--r--lib/private/Group/Manager.php16
-rw-r--r--lib/private/Http/Client/Client.php11
-rw-r--r--lib/private/IntegrityCheck/Checker.php58
-rw-r--r--lib/private/IntegrityCheck/Helpers/FileAccessHelper.php29
-rw-r--r--lib/private/Log.php28
-rw-r--r--lib/private/Log/File.php4
-rw-r--r--lib/private/Log/Rotate.php4
-rw-r--r--lib/private/Mail/Mailer.php2
-rw-r--r--lib/private/Memcache/APC.php136
-rw-r--r--lib/private/Memcache/Factory.php6
-rw-r--r--lib/private/Memcache/Memcached.php27
-rw-r--r--lib/private/NavigationManager.php107
-rw-r--r--lib/private/Preview.php1349
-rw-r--r--lib/private/PreviewManager.php24
-rw-r--r--lib/private/Repair.php6
-rw-r--r--lib/private/Repair/AvatarPermissions.php116
-rw-r--r--lib/private/Repair/Collation.php12
-rw-r--r--lib/private/Repair/MoveUpdaterStepFile.php2
-rw-r--r--lib/private/Repair/NC11/FixMountStorages.php78
-rw-r--r--lib/private/Repair/NC11/MoveAvatarsBackgroundJob.php (renamed from lib/private/Repair/NC11/MoveAvatarBackgroundJob.php)0
-rw-r--r--lib/private/Repair/RepairInvalidShares.php24
-rw-r--r--lib/private/Repair/RepairLegacyStorages.php257
-rw-r--r--lib/private/Security/Bruteforce/Throttler.php13
-rw-r--r--lib/private/Security/CSP/ContentSecurityPolicyNonceManager.php2
-rw-r--r--lib/private/Security/CertificateManager.php20
-rw-r--r--lib/private/Server.php62
-rw-r--r--lib/private/Settings/Admin/Encryption.php8
-rw-r--r--lib/private/Settings/Manager.php199
-rw-r--r--lib/private/Settings/Mapper.php163
-rw-r--r--lib/private/Settings/Section.php21
-rw-r--r--lib/private/Setup.php8
-rw-r--r--lib/private/Setup/MySQL.php4
-rw-r--r--lib/private/Setup/PostgreSQL.php16
-rw-r--r--lib/private/Setup/Sqlite.php2
-rw-r--r--lib/private/Share20/DefaultShareProvider.php3
-rw-r--r--lib/private/Share20/Manager.php9
-rw-r--r--lib/private/SubAdmin.php2
-rw-r--r--lib/private/SystemConfig.php1
-rw-r--r--lib/private/Template/CSSResourceLocator.php52
-rwxr-xr-x[-rw-r--r--]lib/private/Template/ResourceLocator.php4
-rw-r--r--lib/private/Template/SCSSCacher.php190
-rw-r--r--lib/private/TemplateLayout.php51
-rw-r--r--lib/private/Updater.php6
-rw-r--r--lib/private/User/Database.php6
-rw-r--r--lib/private/User/Session.php7
-rw-r--r--lib/private/User/User.php10
-rw-r--r--lib/private/legacy/app.php48
-rw-r--r--lib/private/legacy/files.php1
-rw-r--r--lib/private/legacy/helper.php34
-rw-r--r--lib/private/legacy/user.php11
-rw-r--r--lib/private/legacy/util.php25
-rw-r--r--lib/public/Activity/IManager.php1
-rw-r--r--lib/public/App/IAppManager.php9
-rw-r--r--lib/public/AppFramework/Db/Mapper.php16
-rw-r--r--lib/public/AppFramework/Http/Response.php4
-rw-r--r--lib/public/Authentication/Exceptions/CredentialsUnavailableException.php34
-rw-r--r--lib/public/Authentication/LoginCredentials/ICredentials.php58
-rw-r--r--lib/public/Authentication/LoginCredentials/IStore.php44
-rw-r--r--lib/public/Authentication/TwoFactorAuth/TwoFactorException.php38
-rw-r--r--lib/public/DB/QueryBuilder/IExpressionBuilder.php21
-rw-r--r--lib/public/Encryption/Keys/IStorage.php10
-rw-r--r--lib/public/Files/Cache/IScanner.php1
-rw-r--r--lib/public/Files/Notify/IChange.php56
-rw-r--r--lib/public/Files/Notify/INotifyHandler.php64
-rw-r--r--lib/public/Files/Notify/IRenameChange.php40
-rw-r--r--lib/public/Files/Storage/INotifyStorage.php13
-rw-r--r--lib/public/Files/Storage/IStorage.php4
-rw-r--r--lib/public/GroupInterface.php12
-rw-r--r--lib/public/IAppConfig.php9
-rw-r--r--lib/public/IDb.php54
-rw-r--r--lib/public/IGroup.php9
-rw-r--r--lib/public/IPreview.php2
-rw-r--r--lib/public/IServerContainer.php8
-rw-r--r--lib/public/RichObjectStrings/Definitions.php27
-rw-r--r--lib/public/Settings/IIconSection.php38
-rw-r--r--lib/public/Settings/ISection.php1
161 files changed, 4822 insertions, 3696 deletions
diff --git a/lib/base.php b/lib/base.php
index 7bd14de56b6..3ba0755eaab 100644
--- a/lib/base.php
+++ b/lib/base.php
@@ -281,6 +281,7 @@ class OC {
// render error page
$template = new OC_Template('', 'update.user', 'guest');
OC_Util::addScript('maintenance-check');
+ OC_Util::addStyle('guest');
$template->printPage();
die();
}
@@ -354,6 +355,8 @@ class OC {
header('Status: 503 Service Temporarily Unavailable');
header('Retry-After: 120');
+ OC_Util::addStyle('guest');
+
// render error page
$template = new OC_Template('', 'update.use-cli', 'guest');
$template->assign('productName', 'nextcloud'); // for now
@@ -373,9 +376,9 @@ class OC {
$oldTheme = $systemConfig->getValue('theme');
$systemConfig->setValue('theme', '');
- \OCP\Util::addScript('config'); // needed for web root
- \OCP\Util::addScript('update');
- \OCP\Util::addStyle('update');
+ OC_Util::addScript('config'); // needed for web root
+ OC_Util::addScript('update');
+ OC_Util::addStyle('guest');
/** @var \OC\App\AppManager $appManager */
$appManager = \OC::$server->getAppManager();
@@ -666,12 +669,6 @@ class OC {
OC\Log\ErrorHandler::register($debug);
}
- // register the stream wrappers
- stream_wrapper_register('fakedir', 'OC\Files\Stream\Dir');
- stream_wrapper_register('static', 'OC\Files\Stream\StaticStream');
- stream_wrapper_register('close', 'OC\Files\Stream\Close');
- stream_wrapper_register('quota', 'OC\Files\Stream\Quota');
-
\OC::$server->getEventLogger()->start('init_session', 'Initialize session');
OC_App::loadApps(array('session'));
if (!self::$CLI) {
@@ -711,6 +708,7 @@ class OC {
exit(1);
} else {
OC_Response::setStatus(OC_Response::STATUS_SERVICE_UNAVAILABLE);
+ OC_Util::addStyle('guest');
OC_Template::printGuestPage('', 'error', array('errors' => $errors));
exit;
}
@@ -750,9 +748,6 @@ class OC {
self::registerCacheHooks();
self::registerFilesystemHooks();
- if ($systemConfig->getValue('enable_previews', true)) {
- self::registerPreviewHooks();
- }
self::registerShareHooks();
self::registerLogRotate();
self::registerEncryptionWrapper();
@@ -791,23 +786,31 @@ class OC {
&& !\OC::$server->getTrustedDomainHelper()->isTrustedDomain($host)
&& self::$server->getConfig()->getSystemValue('installed', false)
) {
- header('HTTP/1.1 400 Bad Request');
- header('Status: 400 Bad Request');
+ // Allow access to CSS resources
+ $isScssRequest = false;
+ if(strpos($request->getPathInfo(), '/css/') === 0) {
+ $isScssRequest = true;
+ }
- \OC::$server->getLogger()->warning(
+ if (!$isScssRequest) {
+ header('HTTP/1.1 400 Bad Request');
+ header('Status: 400 Bad Request');
+
+ \OC::$server->getLogger()->warning(
'Trusted domain error. "{remoteAddress}" tried to access using "{host}" as host.',
[
'app' => 'core',
'remoteAddress' => $request->getRemoteAddress(),
'host' => $host,
]
- );
+ );
- $tmpl = new OCP\Template('core', 'untrustedDomain', 'guest');
- $tmpl->assign('domain', $host);
- $tmpl->printPage();
+ $tmpl = new OCP\Template('core', 'untrustedDomain', 'guest');
+ $tmpl->assign('domain', $host);
+ $tmpl->printPage();
- exit();
+ exit();
+ }
}
\OC::$server->getEventLogger()->end('boot');
}
@@ -881,7 +884,7 @@ class OC {
if ($systemConfig->getValue('installed', false) && $systemConfig->getValue('log_rotate_size', false) && !self::checkUpgrade(false)) {
//don't try to do this before we are properly setup
//use custom logfile path if defined, otherwise use default of nextcloud.log in data directory
- \OCP\BackgroundJob::registerJob('OC\Log\Rotate', $systemConfig->getValue('logfile', $systemConfig->getValue('datadirectory', OC::$SERVERROOT . '/data') . '/nextcloud.log'));
+ \OC::$server->getJobList()->add('OC\Log\Rotate');
}
}
@@ -895,20 +898,6 @@ class OC {
}
/**
- * register hooks for previews
- */
- public static function registerPreviewHooks() {
- OC_Hook::connect('OC_Filesystem', 'post_write', 'OC\Preview', 'post_write');
- OC_Hook::connect('OC_Filesystem', 'delete', 'OC\Preview', 'prepare_delete_files');
- OC_Hook::connect('\OCP\Versions', 'preDelete', 'OC\Preview', 'prepare_delete');
- OC_Hook::connect('\OCP\Trashbin', 'preDelete', 'OC\Preview', 'prepare_delete');
- OC_Hook::connect('OC_Filesystem', 'post_delete', 'OC\Preview', 'post_delete_files');
- OC_Hook::connect('\OCP\Versions', 'delete', 'OC\Preview', 'post_delete_versions');
- OC_Hook::connect('\OCP\Trashbin', 'delete', 'OC\Preview', 'post_delete');
- OC_Hook::connect('\OCP\Versions', 'rollback', 'OC\Preview', 'post_delete_versions');
- }
-
- /**
* register hooks for sharing
*/
public static function registerShareHooks() {
diff --git a/lib/composer/autoload.php b/lib/composer/autoload.php
index 610dbf34bca..6de0160c0b5 100644
--- a/lib/composer/autoload.php
+++ b/lib/composer/autoload.php
@@ -2,6 +2,6 @@
// autoload.php @generated by Composer
-require_once __DIR__ . '/composer' . '/autoload_real.php';
+require_once __DIR__ . '/composer/autoload_real.php';
return ComposerAutoloaderInit53792487c5a8370acc0b06b1a864ff4c::getLoader();
diff --git a/lib/composer/composer/ClassLoader.php b/lib/composer/composer/ClassLoader.php
index ac67d302a18..4626994fd4d 100644
--- a/lib/composer/composer/ClassLoader.php
+++ b/lib/composer/composer/ClassLoader.php
@@ -55,6 +55,7 @@ class ClassLoader
private $classMap = array();
private $classMapAuthoritative = false;
private $missingClasses = array();
+ private $apcuPrefix;
public function getPrefixes()
{
@@ -272,6 +273,26 @@ class ClassLoader
}
/**
+ * APCu prefix to use to cache found/not-found classes, if the extension is enabled.
+ *
+ * @param string|null $apcuPrefix
+ */
+ public function setApcuPrefix($apcuPrefix)
+ {
+ $this->apcuPrefix = function_exists('apcu_fetch') && ini_get('apc.enabled') ? $apcuPrefix : null;
+ }
+
+ /**
+ * The APCu prefix in use, or null if APCu caching is not enabled.
+ *
+ * @return string|null
+ */
+ public function getApcuPrefix()
+ {
+ return $this->apcuPrefix;
+ }
+
+ /**
* Registers this instance as an autoloader.
*
* @param bool $prepend Whether to prepend the autoloader or not
@@ -313,11 +334,6 @@ class ClassLoader
*/
public function findFile($class)
{
- // work around for PHP 5.3.0 - 5.3.2 https://bugs.php.net/50731
- if ('\\' == $class[0]) {
- $class = substr($class, 1);
- }
-
// class map lookup
if (isset($this->classMap[$class])) {
return $this->classMap[$class];
@@ -325,6 +341,12 @@ class ClassLoader
if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) {
return false;
}
+ if (null !== $this->apcuPrefix) {
+ $file = apcu_fetch($this->apcuPrefix.$class, $hit);
+ if ($hit) {
+ return $file;
+ }
+ }
$file = $this->findFileWithExtension($class, '.php');
@@ -333,6 +355,10 @@ class ClassLoader
$file = $this->findFileWithExtension($class, '.hh');
}
+ if (null !== $this->apcuPrefix) {
+ apcu_add($this->apcuPrefix.$class, $file);
+ }
+
if (false === $file) {
// Remember that this class does not exist.
$this->missingClasses[$class] = true;
diff --git a/lib/composer/composer/autoload_classmap.php b/lib/composer/composer/autoload_classmap.php
index dafa46bc996..4a345ed7a6d 100644
--- a/lib/composer/composer/autoload_classmap.php
+++ b/lib/composer/composer/autoload_classmap.php
@@ -9,8 +9,12 @@ return array(
'OCP\\API' => $baseDir . '/lib/public/API.php',
'OCP\\Activity\\IConsumer' => $baseDir . '/lib/public/Activity/IConsumer.php',
'OCP\\Activity\\IEvent' => $baseDir . '/lib/public/Activity/IEvent.php',
+ 'OCP\\Activity\\IEventMerger' => $baseDir . '/lib/public/Activity/IEventMerger.php',
'OCP\\Activity\\IExtension' => $baseDir . '/lib/public/Activity/IExtension.php',
+ 'OCP\\Activity\\IFilter' => $baseDir . '/lib/public/Activity/IFilter.php',
'OCP\\Activity\\IManager' => $baseDir . '/lib/public/Activity/IManager.php',
+ 'OCP\\Activity\\IProvider' => $baseDir . '/lib/public/Activity/IProvider.php',
+ 'OCP\\Activity\\ISetting' => $baseDir . '/lib/public/Activity/ISetting.php',
'OCP\\App' => $baseDir . '/lib/public/App.php',
'OCP\\AppFramework\\ApiController' => $baseDir . '/lib/public/AppFramework/ApiController.php',
'OCP\\AppFramework\\App' => $baseDir . '/lib/public/AppFramework/App.php',
@@ -47,10 +51,15 @@ return array(
'OCP\\AppFramework\\QueryException' => $baseDir . '/lib/public/AppFramework/QueryException.php',
'OCP\\AppFramework\\Utility\\IControllerMethodReflector' => $baseDir . '/lib/public/AppFramework/Utility/IControllerMethodReflector.php',
'OCP\\AppFramework\\Utility\\ITimeFactory' => $baseDir . '/lib/public/AppFramework/Utility/ITimeFactory.php',
+ 'OCP\\App\\AppPathNotFoundException' => $baseDir . '/lib/public/App/AppPathNotFoundException.php',
'OCP\\App\\IAppManager' => $baseDir . '/lib/public/App/IAppManager.php',
'OCP\\App\\ManagerEvent' => $baseDir . '/lib/public/App/ManagerEvent.php',
+ 'OCP\\Authentication\\Exceptions\\CredentialsUnavailableException' => $baseDir . '/lib/public/Authentication/Exceptions/CredentialsUnavailableException.php',
'OCP\\Authentication\\IApacheBackend' => $baseDir . '/lib/public/Authentication/IApacheBackend.php',
+ 'OCP\\Authentication\\LoginCredentials\\ICredentials' => $baseDir . '/lib/public/Authentication/LoginCredentials/ICredentials.php',
+ 'OCP\\Authentication\\LoginCredentials\\IStore' => $baseDir . '/lib/public/Authentication/LoginCredentials/IStore.php',
'OCP\\Authentication\\TwoFactorAuth\\IProvider' => $baseDir . '/lib/public/Authentication/TwoFactorAuth/IProvider.php',
+ 'OCP\\Authentication\\TwoFactorAuth\\TwoFactorException' => $baseDir . '/lib/public/Authentication/TwoFactorAuth/TwoFactorException.php',
'OCP\\AutoloadNotAllowedException' => $baseDir . '/lib/public/AutoloadNotAllowedException.php',
'OCP\\BackgroundJob' => $baseDir . '/lib/public/BackgroundJob.php',
'OCP\\BackgroundJob\\IJob' => $baseDir . '/lib/public/BackgroundJob/IJob.php',
@@ -102,6 +111,7 @@ return array(
'OCP\\Files\\Config\\IMountProvider' => $baseDir . '/lib/public/Files/Config/IMountProvider.php',
'OCP\\Files\\Config\\IMountProviderCollection' => $baseDir . '/lib/public/Files/Config/IMountProviderCollection.php',
'OCP\\Files\\Config\\IUserMountCache' => $baseDir . '/lib/public/Files/Config/IUserMountCache.php',
+ 'OCP\\Files\\EmptyFileNameException' => $baseDir . '/lib/public/Files/EmptyFileNameException.php',
'OCP\\Files\\EntityTooLargeException' => $baseDir . '/lib/public/Files/EntityTooLargeException.php',
'OCP\\Files\\File' => $baseDir . '/lib/public/Files/File.php',
'OCP\\Files\\FileInfo' => $baseDir . '/lib/public/Files/FileInfo.php',
@@ -115,6 +125,7 @@ return array(
'OCP\\Files\\IRootFolder' => $baseDir . '/lib/public/Files/IRootFolder.php',
'OCP\\Files\\InvalidCharacterInPathException' => $baseDir . '/lib/public/Files/InvalidCharacterInPathException.php',
'OCP\\Files\\InvalidContentException' => $baseDir . '/lib/public/Files/InvalidContentException.php',
+ 'OCP\\Files\\InvalidDirectoryException' => $baseDir . '/lib/public/Files/InvalidDirectoryException.php',
'OCP\\Files\\InvalidPathException' => $baseDir . '/lib/public/Files/InvalidPathException.php',
'OCP\\Files\\LockNotAcquiredException' => $baseDir . '/lib/public/Files/LockNotAcquiredException.php',
'OCP\\Files\\Mount\\IMountManager' => $baseDir . '/lib/public/Files/Mount/IMountManager.php',
@@ -123,6 +134,9 @@ return array(
'OCP\\Files\\NotEnoughSpaceException' => $baseDir . '/lib/public/Files/NotEnoughSpaceException.php',
'OCP\\Files\\NotFoundException' => $baseDir . '/lib/public/Files/NotFoundException.php',
'OCP\\Files\\NotPermittedException' => $baseDir . '/lib/public/Files/NotPermittedException.php',
+ 'OCP\\Files\\Notify\\IChange' => $baseDir . '/lib/public/Files/Notify/IChange.php',
+ 'OCP\\Files\\Notify\\INotifyHandler' => $baseDir . '/lib/public/Files/Notify/INotifyHandler.php',
+ 'OCP\\Files\\Notify\\IRenameChange' => $baseDir . '/lib/public/Files/Notify/IRenameChange.php',
'OCP\\Files\\ObjectStore\\IObjectStore' => $baseDir . '/lib/public/Files/ObjectStore/IObjectStore.php',
'OCP\\Files\\ReservedWordException' => $baseDir . '/lib/public/Files/ReservedWordException.php',
'OCP\\Files\\SimpleFS\\ISimpleFile' => $baseDir . '/lib/public/Files/SimpleFS/ISimpleFile.php',
@@ -157,7 +171,6 @@ return array(
'OCP\\IDBConnection' => $baseDir . '/lib/public/IDBConnection.php',
'OCP\\IDateTimeFormatter' => $baseDir . '/lib/public/IDateTimeFormatter.php',
'OCP\\IDateTimeZone' => $baseDir . '/lib/public/IDateTimeZone.php',
- 'OCP\\IDb' => $baseDir . '/lib/public/IDb.php',
'OCP\\IEventSource' => $baseDir . '/lib/public/IEventSource.php',
'OCP\\IGroup' => $baseDir . '/lib/public/IGroup.php',
'OCP\\IGroupManager' => $baseDir . '/lib/public/IGroupManager.php',
@@ -201,6 +214,7 @@ return array(
'OCP\\PreConditionNotMetException' => $baseDir . '/lib/public/PreConditionNotMetException.php',
'OCP\\Preview\\IProvider' => $baseDir . '/lib/public/Preview/IProvider.php',
'OCP\\Response' => $baseDir . '/lib/public/Response.php',
+ 'OCP\\RichObjectStrings\\Definitions' => $baseDir . '/lib/public/RichObjectStrings/Definitions.php',
'OCP\\RichObjectStrings\\IValidator' => $baseDir . '/lib/public/RichObjectStrings/IValidator.php',
'OCP\\RichObjectStrings\\InvalidObjectExeption' => $baseDir . '/lib/public/RichObjectStrings/InvalidObjectExeption.php',
'OCP\\Route\\IRoute' => $baseDir . '/lib/public/Route/IRoute.php',
@@ -217,6 +231,7 @@ return array(
'OCP\\Security\\ISecureRandom' => $baseDir . '/lib/public/Security/ISecureRandom.php',
'OCP\\Security\\StringUtils' => $baseDir . '/lib/public/Security/StringUtils.php',
'OCP\\Session\\Exceptions\\SessionNotAvailableException' => $baseDir . '/lib/public/Session/Exceptions/SessionNotAvailableException.php',
+ 'OCP\\Settings\\IIconSection' => $baseDir . '/lib/public/Settings/IIconSection.php',
'OCP\\Settings\\IManager' => $baseDir . '/lib/public/Settings/IManager.php',
'OCP\\Settings\\ISection' => $baseDir . '/lib/public/Settings/ISection.php',
'OCP\\Settings\\ISettings' => $baseDir . '/lib/public/Settings/ISettings.php',
@@ -247,13 +262,17 @@ return array(
'OCP\\WorkflowEngine\\ICheck' => $baseDir . '/lib/public/WorkflowEngine/ICheck.php',
'OCP\\WorkflowEngine\\IManager' => $baseDir . '/lib/public/WorkflowEngine/IManager.php',
'OCP\\WorkflowEngine\\IOperation' => $baseDir . '/lib/public/WorkflowEngine/IOperation.php',
+ 'OC\\Accounts\\AccountManager' => $baseDir . '/lib/private/Accounts/AccountManager.php',
+ 'OC\\Accounts\\Hooks' => $baseDir . '/lib/private/Accounts/Hooks.php',
'OC\\Activity\\Event' => $baseDir . '/lib/private/Activity/Event.php',
+ 'OC\\Activity\\EventMerger' => $baseDir . '/lib/private/Activity/EventMerger.php',
+ 'OC\\Activity\\LegacyFilter' => $baseDir . '/lib/private/Activity/LegacyFilter.php',
+ 'OC\\Activity\\LegacySetting' => $baseDir . '/lib/private/Activity/LegacySetting.php',
'OC\\Activity\\Manager' => $baseDir . '/lib/private/Activity/Manager.php',
'OC\\AllConfig' => $baseDir . '/lib/private/AllConfig.php',
'OC\\AppConfig' => $baseDir . '/lib/private/AppConfig.php',
'OC\\AppFramework\\App' => $baseDir . '/lib/private/AppFramework/App.php',
'OC\\AppFramework\\Core\\API' => $baseDir . '/lib/private/AppFramework/Core/API.php',
- 'OC\\AppFramework\\Db\\Db' => $baseDir . '/lib/private/AppFramework/Db/Db.php',
'OC\\AppFramework\\DependencyInjection\\DIContainer' => $baseDir . '/lib/private/AppFramework/DependencyInjection/DIContainer.php',
'OC\\AppFramework\\Http' => $baseDir . '/lib/private/AppFramework/Http.php',
'OC\\AppFramework\\Http\\Dispatcher' => $baseDir . '/lib/private/AppFramework/Http/Dispatcher.php',
@@ -308,6 +327,8 @@ return array(
'OC\\Authentication\\Exceptions\\PasswordlessTokenException' => $baseDir . '/lib/private/Authentication/Exceptions/PasswordlessTokenException.php',
'OC\\Authentication\\Exceptions\\TwoFactorAuthRequiredException' => $baseDir . '/lib/private/Authentication/Exceptions/TwoFactorAuthRequiredException.php',
'OC\\Authentication\\Exceptions\\UserAlreadyLoggedInException' => $baseDir . '/lib/private/Authentication/Exceptions/UserAlreadyLoggedInException.php',
+ 'OC\\Authentication\\LoginCredentials\\Credentials' => $baseDir . '/lib/private/Authentication/LoginCredentials/Credentials.php',
+ 'OC\\Authentication\\LoginCredentials\\Store' => $baseDir . '/lib/private/Authentication/LoginCredentials/Store.php',
'OC\\Authentication\\Token\\DefaultToken' => $baseDir . '/lib/private/Authentication/Token/DefaultToken.php',
'OC\\Authentication\\Token\\DefaultTokenCleanupJob' => $baseDir . '/lib/private/Authentication/Token/DefaultTokenCleanupJob.php',
'OC\\Authentication\\Token\\DefaultTokenMapper' => $baseDir . '/lib/private/Authentication/Token/DefaultTokenMapper.php',
@@ -409,6 +430,7 @@ return array(
'OC\\Core\\Command\\User\\ResetPassword' => $baseDir . '/core/Command/User/ResetPassword.php',
'OC\\Core\\Command\\User\\Setting' => $baseDir . '/core/Command/User/Setting.php',
'OC\\Core\\Controller\\AvatarController' => $baseDir . '/core/Controller/AvatarController.php',
+ 'OC\\Core\\Controller\\CssController' => $baseDir . '/core/Controller/CssController.php',
'OC\\Core\\Controller\\LoginController' => $baseDir . '/core/Controller/LoginController.php',
'OC\\Core\\Controller\\LostController' => $baseDir . '/core/Controller/LostController.php',
'OC\\Core\\Controller\\OCJSController' => $baseDir . '/core/Controller/OCJSController.php',
@@ -513,10 +535,15 @@ return array(
'OC\\Files\\Node\\NonExistingFile' => $baseDir . '/lib/private/Files/Node/NonExistingFile.php',
'OC\\Files\\Node\\NonExistingFolder' => $baseDir . '/lib/private/Files/Node/NonExistingFolder.php',
'OC\\Files\\Node\\Root' => $baseDir . '/lib/private/Files/Node/Root.php',
+ 'OC\\Files\\Notify\\Change' => $baseDir . '/lib/private/Files/Notify/Change.php',
+ 'OC\\Files\\Notify\\RenameChange' => $baseDir . '/lib/private/Files/Notify/RenameChange.php',
'OC\\Files\\ObjectStore\\HomeObjectStoreStorage' => $baseDir . '/lib/private/Files/ObjectStore/HomeObjectStoreStorage.php',
'OC\\Files\\ObjectStore\\Mapper' => $baseDir . '/lib/private/Files/ObjectStore/Mapper.php',
'OC\\Files\\ObjectStore\\NoopScanner' => $baseDir . '/lib/private/Files/ObjectStore/NoopScanner.php',
'OC\\Files\\ObjectStore\\ObjectStoreStorage' => $baseDir . '/lib/private/Files/ObjectStore/ObjectStoreStorage.php',
+ 'OC\\Files\\ObjectStore\\S3' => $baseDir . '/lib/private/Files/ObjectStore/S3.php',
+ 'OC\\Files\\ObjectStore\\S3ConnectionTrait' => $baseDir . '/lib/private/Files/ObjectStore/S3ConnectionTrait.php',
+ 'OC\\Files\\ObjectStore\\StorageObjectStore' => $baseDir . '/lib/private/Files/ObjectStore/StorageObjectStore.php',
'OC\\Files\\ObjectStore\\Swift' => $baseDir . '/lib/private/Files/ObjectStore/Swift.php',
'OC\\Files\\SimpleFS\\SimpleFile' => $baseDir . '/lib/private/Files/SimpleFS/SimpleFile.php',
'OC\\Files\\SimpleFS\\SimpleFolder' => $baseDir . '/lib/private/Files/SimpleFS/SimpleFolder.php',
@@ -539,11 +566,8 @@ return array(
'OC\\Files\\Storage\\Wrapper\\PermissionsMask' => $baseDir . '/lib/private/Files/Storage/Wrapper/PermissionsMask.php',
'OC\\Files\\Storage\\Wrapper\\Quota' => $baseDir . '/lib/private/Files/Storage/Wrapper/Quota.php',
'OC\\Files\\Storage\\Wrapper\\Wrapper' => $baseDir . '/lib/private/Files/Storage/Wrapper/Wrapper.php',
- 'OC\\Files\\Stream\\Close' => $baseDir . '/lib/private/Files/Stream/Close.php',
- 'OC\\Files\\Stream\\Dir' => $baseDir . '/lib/private/Files/Stream/Dir.php',
'OC\\Files\\Stream\\Encryption' => $baseDir . '/lib/private/Files/Stream/Encryption.php',
'OC\\Files\\Stream\\Quota' => $baseDir . '/lib/private/Files/Stream/Quota.php',
- 'OC\\Files\\Stream\\StaticStream' => $baseDir . '/lib/private/Files/Stream/StaticStream.php',
'OC\\Files\\Type\\Detection' => $baseDir . '/lib/private/Files/Type/Detection.php',
'OC\\Files\\Type\\Loader' => $baseDir . '/lib/private/Files/Type/Loader.php',
'OC\\Files\\Type\\TemplateManager' => $baseDir . '/lib/private/Files/Type/TemplateManager.php',
@@ -593,7 +617,6 @@ return array(
'OC\\Log\\Syslog' => $baseDir . '/lib/private/Log/Syslog.php',
'OC\\Mail\\Mailer' => $baseDir . '/lib/private/Mail/Mailer.php',
'OC\\Mail\\Message' => $baseDir . '/lib/private/Mail/Message.php',
- 'OC\\Memcache\\APC' => $baseDir . '/lib/private/Memcache/APC.php',
'OC\\Memcache\\APCu' => $baseDir . '/lib/private/Memcache/APCu.php',
'OC\\Memcache\\ArrayCache' => $baseDir . '/lib/private/Memcache/ArrayCache.php',
'OC\\Memcache\\CADTrait' => $baseDir . '/lib/private/Memcache/CADTrait.php',
@@ -615,11 +638,9 @@ return array(
'OC\\Notification\\Notification' => $baseDir . '/lib/private/Notification/Notification.php',
'OC\\OCS\\CoreCapabilities' => $baseDir . '/lib/private/OCS/CoreCapabilities.php',
'OC\\OCS\\Exception' => $baseDir . '/lib/private/OCS/Exception.php',
- 'OC\\OCS\\Person' => $baseDir . '/lib/private/OCS/Person.php',
'OC\\OCS\\PrivateData' => $baseDir . '/lib/private/OCS/PrivateData.php',
'OC\\OCS\\Provider' => $baseDir . '/lib/private/OCS/Provider.php',
'OC\\OCS\\Result' => $baseDir . '/lib/private/OCS/Result.php',
- 'OC\\Preview' => $baseDir . '/lib/private/Preview.php',
'OC\\PreviewManager' => $baseDir . '/lib/private/PreviewManager.php',
'OC\\PreviewNotAvailableException' => $baseDir . '/lib/private/PreviewNotAvailableException.php',
'OC\\Preview\\BMP' => $baseDir . '/lib/private/Preview/BMP.php',
@@ -655,7 +676,6 @@ return array(
'OC\\Repair' => $baseDir . '/lib/private/Repair.php',
'OC\\RepairException' => $baseDir . '/lib/private/RepairException.php',
'OC\\Repair\\AssetCache' => $baseDir . '/lib/private/Repair/AssetCache.php',
- 'OC\\Repair\\AvatarPermissions' => $baseDir . '/lib/private/Repair/AvatarPermissions.php',
'OC\\Repair\\CleanTags' => $baseDir . '/lib/private/Repair/CleanTags.php',
'OC\\Repair\\Collation' => $baseDir . '/lib/private/Repair/Collation.php',
'OC\\Repair\\DropOldJobs' => $baseDir . '/lib/private/Repair/DropOldJobs.php',
@@ -663,15 +683,17 @@ return array(
'OC\\Repair\\FillETags' => $baseDir . '/lib/private/Repair/FillETags.php',
'OC\\Repair\\InnoDB' => $baseDir . '/lib/private/Repair/InnoDB.php',
'OC\\Repair\\MoveUpdaterStepFile' => $baseDir . '/lib/private/Repair/MoveUpdaterStepFile.php',
+ 'OC\\Repair\\NC11\\CleanPreviews' => $baseDir . '/lib/private/Repair/NC11/CleanPreviews.php',
+ 'OC\\Repair\\NC11\\CleanPreviewsBackgroundJob' => $baseDir . '/lib/private/Repair/NC11/CleanPreviewsBackgroundJob.php',
+ 'OC\\Repair\\NC11\\FixMountStorages' => $baseDir . '/lib/private/Repair/NC11/FixMountStorages.php',
'OC\\Repair\\NC11\\MoveAvatars' => $baseDir . '/lib/private/Repair/NC11/MoveAvatars.php',
- 'OC\\Repair\\NC11\\MoveAvatarsBackgroundJob' => $baseDir . '/lib/private/Repair/NC11/MoveAvatarBackgroundJob.php',
+ 'OC\\Repair\\NC11\\MoveAvatarsBackgroundJob' => $baseDir . '/lib/private/Repair/NC11/MoveAvatarsBackgroundJob.php',
'OC\\Repair\\OldGroupMembershipShares' => $baseDir . '/lib/private/Repair/OldGroupMembershipShares.php',
'OC\\Repair\\Preview' => $baseDir . '/lib/private/Repair/Preview.php',
'OC\\Repair\\RemoveGetETagEntries' => $baseDir . '/lib/private/Repair/RemoveGetETagEntries.php',
'OC\\Repair\\RemoveOldShares' => $baseDir . '/lib/private/Repair/RemoveOldShares.php',
'OC\\Repair\\RemoveRootShares' => $baseDir . '/lib/private/Repair/RemoveRootShares.php',
'OC\\Repair\\RepairInvalidShares' => $baseDir . '/lib/private/Repair/RepairInvalidShares.php',
- 'OC\\Repair\\RepairLegacyStorages' => $baseDir . '/lib/private/Repair/RepairLegacyStorages.php',
'OC\\Repair\\RepairMimeTypes' => $baseDir . '/lib/private/Repair/RepairMimeTypes.php',
'OC\\Repair\\RepairUnmergedShares' => $baseDir . '/lib/private/Repair/RepairUnmergedShares.php',
'OC\\Repair\\SearchLuceneTables' => $baseDir . '/lib/private/Repair/SearchLuceneTables.php',
@@ -702,6 +724,9 @@ return array(
'OC\\Security\\CredentialsManager' => $baseDir . '/lib/private/Security/CredentialsManager.php',
'OC\\Security\\Crypto' => $baseDir . '/lib/private/Security/Crypto.php',
'OC\\Security\\Hasher' => $baseDir . '/lib/private/Security/Hasher.php',
+ 'OC\\Security\\IdentityProof\\Key' => $baseDir . '/lib/private/Security/IdentityProof/Key.php',
+ 'OC\\Security\\IdentityProof\\Manager' => $baseDir . '/lib/private/Security/IdentityProof/Manager.php',
+ 'OC\\Security\\IdentityProof\\Signer' => $baseDir . '/lib/private/Security/IdentityProof/Signer.php',
'OC\\Security\\SecureRandom' => $baseDir . '/lib/private/Security/SecureRandom.php',
'OC\\Security\\TrustedDomainHelper' => $baseDir . '/lib/private/Security/TrustedDomainHelper.php',
'OC\\Server' => $baseDir . '/lib/private/Server.php',
@@ -715,8 +740,8 @@ return array(
'OC\\Session\\Session' => $baseDir . '/lib/private/Session/Session.php',
'OC\\Settings\\Admin\\Additional' => $baseDir . '/lib/private/Settings/Admin/Additional.php',
'OC\\Settings\\Admin\\Encryption' => $baseDir . '/lib/private/Settings/Admin/Encryption.php',
- 'OC\\Settings\\Admin\\Logging' => $baseDir . '/lib/private/Settings/Admin/Logging.php',
'OC\\Settings\\Admin\\Server' => $baseDir . '/lib/private/Settings/Admin/Server.php',
+ 'OC\\Settings\\Admin\\ServerDevNotice' => $baseDir . '/lib/private/Settings/Admin/ServerDevNotice.php',
'OC\\Settings\\Admin\\Sharing' => $baseDir . '/lib/private/Settings/Admin/Sharing.php',
'OC\\Settings\\Admin\\TipsTricks' => $baseDir . '/lib/private/Settings/Admin/TipsTricks.php',
'OC\\Settings\\Application' => $baseDir . '/settings/Application.php',
@@ -730,9 +755,11 @@ return array(
'OC\\Settings\\Controller\\GroupsController' => $baseDir . '/settings/Controller/GroupsController.php',
'OC\\Settings\\Controller\\LogSettingsController' => $baseDir . '/settings/Controller/LogSettingsController.php',
'OC\\Settings\\Controller\\MailSettingsController' => $baseDir . '/settings/Controller/MailSettingsController.php',
+ 'OC\\Settings\\Controller\\PersonalController' => $baseDir . '/settings/Controller/PersonalController.php',
'OC\\Settings\\Controller\\SecuritySettingsController' => $baseDir . '/settings/Controller/SecuritySettingsController.php',
'OC\\Settings\\Controller\\UsersController' => $baseDir . '/settings/Controller/UsersController.php',
'OC\\Settings\\Manager' => $baseDir . '/lib/private/Settings/Manager.php',
+ 'OC\\Settings\\Mapper' => $baseDir . '/lib/private/Settings/Mapper.php',
'OC\\Settings\\Middleware\\SubadminMiddleware' => $baseDir . '/settings/Middleware/SubadminMiddleware.php',
'OC\\Settings\\RemoveOrphaned' => $baseDir . '/lib/private/Settings/RemoveOrphaned.php',
'OC\\Settings\\Section' => $baseDir . '/lib/private/Settings/Section.php',
@@ -774,6 +801,7 @@ return array(
'OC\\Template\\JSResourceLocator' => $baseDir . '/lib/private/Template/JSResourceLocator.php',
'OC\\Template\\ResourceLocator' => $baseDir . '/lib/private/Template/ResourceLocator.php',
'OC\\Template\\ResourceNotFoundException' => $baseDir . '/lib/private/Template/ResourceNotFoundException.php',
+ 'OC\\Template\\SCSSCacher' => $baseDir . '/lib/private/Template/SCSSCacher.php',
'OC\\Template\\TemplateFileLocator' => $baseDir . '/lib/private/Template/TemplateFileLocator.php',
'OC\\URLGenerator' => $baseDir . '/lib/private/URLGenerator.php',
'OC\\Updater' => $baseDir . '/lib/private/Updater.php',
diff --git a/lib/composer/composer/autoload_real.php b/lib/composer/composer/autoload_real.php
index 43d67606954..b9f89d16ad7 100644
--- a/lib/composer/composer/autoload_real.php
+++ b/lib/composer/composer/autoload_real.php
@@ -23,7 +23,7 @@ class ComposerAutoloaderInit53792487c5a8370acc0b06b1a864ff4c
self::$loader = $loader = new \Composer\Autoload\ClassLoader();
spl_autoload_unregister(array('ComposerAutoloaderInit53792487c5a8370acc0b06b1a864ff4c', 'loadClassLoader'));
- $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION');
+ $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
if ($useStaticLoader) {
require_once __DIR__ . '/autoload_static.php';
diff --git a/lib/composer/composer/autoload_static.php b/lib/composer/composer/autoload_static.php
index 5b8356785bc..f8d360fec4b 100644
--- a/lib/composer/composer/autoload_static.php
+++ b/lib/composer/composer/autoload_static.php
@@ -39,8 +39,12 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c
'OCP\\API' => __DIR__ . '/../../..' . '/lib/public/API.php',
'OCP\\Activity\\IConsumer' => __DIR__ . '/../../..' . '/lib/public/Activity/IConsumer.php',
'OCP\\Activity\\IEvent' => __DIR__ . '/../../..' . '/lib/public/Activity/IEvent.php',
+ 'OCP\\Activity\\IEventMerger' => __DIR__ . '/../../..' . '/lib/public/Activity/IEventMerger.php',
'OCP\\Activity\\IExtension' => __DIR__ . '/../../..' . '/lib/public/Activity/IExtension.php',
+ 'OCP\\Activity\\IFilter' => __DIR__ . '/../../..' . '/lib/public/Activity/IFilter.php',
'OCP\\Activity\\IManager' => __DIR__ . '/../../..' . '/lib/public/Activity/IManager.php',
+ 'OCP\\Activity\\IProvider' => __DIR__ . '/../../..' . '/lib/public/Activity/IProvider.php',
+ 'OCP\\Activity\\ISetting' => __DIR__ . '/../../..' . '/lib/public/Activity/ISetting.php',
'OCP\\App' => __DIR__ . '/../../..' . '/lib/public/App.php',
'OCP\\AppFramework\\ApiController' => __DIR__ . '/../../..' . '/lib/public/AppFramework/ApiController.php',
'OCP\\AppFramework\\App' => __DIR__ . '/../../..' . '/lib/public/AppFramework/App.php',
@@ -77,10 +81,15 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c
'OCP\\AppFramework\\QueryException' => __DIR__ . '/../../..' . '/lib/public/AppFramework/QueryException.php',
'OCP\\AppFramework\\Utility\\IControllerMethodReflector' => __DIR__ . '/../../..' . '/lib/public/AppFramework/Utility/IControllerMethodReflector.php',
'OCP\\AppFramework\\Utility\\ITimeFactory' => __DIR__ . '/../../..' . '/lib/public/AppFramework/Utility/ITimeFactory.php',
+ 'OCP\\App\\AppPathNotFoundException' => __DIR__ . '/../../..' . '/lib/public/App/AppPathNotFoundException.php',
'OCP\\App\\IAppManager' => __DIR__ . '/../../..' . '/lib/public/App/IAppManager.php',
'OCP\\App\\ManagerEvent' => __DIR__ . '/../../..' . '/lib/public/App/ManagerEvent.php',
+ 'OCP\\Authentication\\Exceptions\\CredentialsUnavailableException' => __DIR__ . '/../../..' . '/lib/public/Authentication/Exceptions/CredentialsUnavailableException.php',
'OCP\\Authentication\\IApacheBackend' => __DIR__ . '/../../..' . '/lib/public/Authentication/IApacheBackend.php',
+ 'OCP\\Authentication\\LoginCredentials\\ICredentials' => __DIR__ . '/../../..' . '/lib/public/Authentication/LoginCredentials/ICredentials.php',
+ 'OCP\\Authentication\\LoginCredentials\\IStore' => __DIR__ . '/../../..' . '/lib/public/Authentication/LoginCredentials/IStore.php',
'OCP\\Authentication\\TwoFactorAuth\\IProvider' => __DIR__ . '/../../..' . '/lib/public/Authentication/TwoFactorAuth/IProvider.php',
+ 'OCP\\Authentication\\TwoFactorAuth\\TwoFactorException' => __DIR__ . '/../../..' . '/lib/public/Authentication/TwoFactorAuth/TwoFactorException.php',
'OCP\\AutoloadNotAllowedException' => __DIR__ . '/../../..' . '/lib/public/AutoloadNotAllowedException.php',
'OCP\\BackgroundJob' => __DIR__ . '/../../..' . '/lib/public/BackgroundJob.php',
'OCP\\BackgroundJob\\IJob' => __DIR__ . '/../../..' . '/lib/public/BackgroundJob/IJob.php',
@@ -132,6 +141,7 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c
'OCP\\Files\\Config\\IMountProvider' => __DIR__ . '/../../..' . '/lib/public/Files/Config/IMountProvider.php',
'OCP\\Files\\Config\\IMountProviderCollection' => __DIR__ . '/../../..' . '/lib/public/Files/Config/IMountProviderCollection.php',
'OCP\\Files\\Config\\IUserMountCache' => __DIR__ . '/../../..' . '/lib/public/Files/Config/IUserMountCache.php',
+ 'OCP\\Files\\EmptyFileNameException' => __DIR__ . '/../../..' . '/lib/public/Files/EmptyFileNameException.php',
'OCP\\Files\\EntityTooLargeException' => __DIR__ . '/../../..' . '/lib/public/Files/EntityTooLargeException.php',
'OCP\\Files\\File' => __DIR__ . '/../../..' . '/lib/public/Files/File.php',
'OCP\\Files\\FileInfo' => __DIR__ . '/../../..' . '/lib/public/Files/FileInfo.php',
@@ -145,6 +155,7 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c
'OCP\\Files\\IRootFolder' => __DIR__ . '/../../..' . '/lib/public/Files/IRootFolder.php',
'OCP\\Files\\InvalidCharacterInPathException' => __DIR__ . '/../../..' . '/lib/public/Files/InvalidCharacterInPathException.php',
'OCP\\Files\\InvalidContentException' => __DIR__ . '/../../..' . '/lib/public/Files/InvalidContentException.php',
+ 'OCP\\Files\\InvalidDirectoryException' => __DIR__ . '/../../..' . '/lib/public/Files/InvalidDirectoryException.php',
'OCP\\Files\\InvalidPathException' => __DIR__ . '/../../..' . '/lib/public/Files/InvalidPathException.php',
'OCP\\Files\\LockNotAcquiredException' => __DIR__ . '/../../..' . '/lib/public/Files/LockNotAcquiredException.php',
'OCP\\Files\\Mount\\IMountManager' => __DIR__ . '/../../..' . '/lib/public/Files/Mount/IMountManager.php',
@@ -153,6 +164,9 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c
'OCP\\Files\\NotEnoughSpaceException' => __DIR__ . '/../../..' . '/lib/public/Files/NotEnoughSpaceException.php',
'OCP\\Files\\NotFoundException' => __DIR__ . '/../../..' . '/lib/public/Files/NotFoundException.php',
'OCP\\Files\\NotPermittedException' => __DIR__ . '/../../..' . '/lib/public/Files/NotPermittedException.php',
+ 'OCP\\Files\\Notify\\IChange' => __DIR__ . '/../../..' . '/lib/public/Files/Notify/IChange.php',
+ 'OCP\\Files\\Notify\\INotifyHandler' => __DIR__ . '/../../..' . '/lib/public/Files/Notify/INotifyHandler.php',
+ 'OCP\\Files\\Notify\\IRenameChange' => __DIR__ . '/../../..' . '/lib/public/Files/Notify/IRenameChange.php',
'OCP\\Files\\ObjectStore\\IObjectStore' => __DIR__ . '/../../..' . '/lib/public/Files/ObjectStore/IObjectStore.php',
'OCP\\Files\\ReservedWordException' => __DIR__ . '/../../..' . '/lib/public/Files/ReservedWordException.php',
'OCP\\Files\\SimpleFS\\ISimpleFile' => __DIR__ . '/../../..' . '/lib/public/Files/SimpleFS/ISimpleFile.php',
@@ -187,7 +201,6 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c
'OCP\\IDBConnection' => __DIR__ . '/../../..' . '/lib/public/IDBConnection.php',
'OCP\\IDateTimeFormatter' => __DIR__ . '/../../..' . '/lib/public/IDateTimeFormatter.php',
'OCP\\IDateTimeZone' => __DIR__ . '/../../..' . '/lib/public/IDateTimeZone.php',
- 'OCP\\IDb' => __DIR__ . '/../../..' . '/lib/public/IDb.php',
'OCP\\IEventSource' => __DIR__ . '/../../..' . '/lib/public/IEventSource.php',
'OCP\\IGroup' => __DIR__ . '/../../..' . '/lib/public/IGroup.php',
'OCP\\IGroupManager' => __DIR__ . '/../../..' . '/lib/public/IGroupManager.php',
@@ -231,6 +244,7 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c
'OCP\\PreConditionNotMetException' => __DIR__ . '/../../..' . '/lib/public/PreConditionNotMetException.php',
'OCP\\Preview\\IProvider' => __DIR__ . '/../../..' . '/lib/public/Preview/IProvider.php',
'OCP\\Response' => __DIR__ . '/../../..' . '/lib/public/Response.php',
+ 'OCP\\RichObjectStrings\\Definitions' => __DIR__ . '/../../..' . '/lib/public/RichObjectStrings/Definitions.php',
'OCP\\RichObjectStrings\\IValidator' => __DIR__ . '/../../..' . '/lib/public/RichObjectStrings/IValidator.php',
'OCP\\RichObjectStrings\\InvalidObjectExeption' => __DIR__ . '/../../..' . '/lib/public/RichObjectStrings/InvalidObjectExeption.php',
'OCP\\Route\\IRoute' => __DIR__ . '/../../..' . '/lib/public/Route/IRoute.php',
@@ -247,6 +261,7 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c
'OCP\\Security\\ISecureRandom' => __DIR__ . '/../../..' . '/lib/public/Security/ISecureRandom.php',
'OCP\\Security\\StringUtils' => __DIR__ . '/../../..' . '/lib/public/Security/StringUtils.php',
'OCP\\Session\\Exceptions\\SessionNotAvailableException' => __DIR__ . '/../../..' . '/lib/public/Session/Exceptions/SessionNotAvailableException.php',
+ 'OCP\\Settings\\IIconSection' => __DIR__ . '/../../..' . '/lib/public/Settings/IIconSection.php',
'OCP\\Settings\\IManager' => __DIR__ . '/../../..' . '/lib/public/Settings/IManager.php',
'OCP\\Settings\\ISection' => __DIR__ . '/../../..' . '/lib/public/Settings/ISection.php',
'OCP\\Settings\\ISettings' => __DIR__ . '/../../..' . '/lib/public/Settings/ISettings.php',
@@ -277,13 +292,17 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c
'OCP\\WorkflowEngine\\ICheck' => __DIR__ . '/../../..' . '/lib/public/WorkflowEngine/ICheck.php',
'OCP\\WorkflowEngine\\IManager' => __DIR__ . '/../../..' . '/lib/public/WorkflowEngine/IManager.php',
'OCP\\WorkflowEngine\\IOperation' => __DIR__ . '/../../..' . '/lib/public/WorkflowEngine/IOperation.php',
+ 'OC\\Accounts\\AccountManager' => __DIR__ . '/../../..' . '/lib/private/Accounts/AccountManager.php',
+ 'OC\\Accounts\\Hooks' => __DIR__ . '/../../..' . '/lib/private/Accounts/Hooks.php',
'OC\\Activity\\Event' => __DIR__ . '/../../..' . '/lib/private/Activity/Event.php',
+ 'OC\\Activity\\EventMerger' => __DIR__ . '/../../..' . '/lib/private/Activity/EventMerger.php',
+ 'OC\\Activity\\LegacyFilter' => __DIR__ . '/../../..' . '/lib/private/Activity/LegacyFilter.php',
+ 'OC\\Activity\\LegacySetting' => __DIR__ . '/../../..' . '/lib/private/Activity/LegacySetting.php',
'OC\\Activity\\Manager' => __DIR__ . '/../../..' . '/lib/private/Activity/Manager.php',
'OC\\AllConfig' => __DIR__ . '/../../..' . '/lib/private/AllConfig.php',
'OC\\AppConfig' => __DIR__ . '/../../..' . '/lib/private/AppConfig.php',
'OC\\AppFramework\\App' => __DIR__ . '/../../..' . '/lib/private/AppFramework/App.php',
'OC\\AppFramework\\Core\\API' => __DIR__ . '/../../..' . '/lib/private/AppFramework/Core/API.php',
- 'OC\\AppFramework\\Db\\Db' => __DIR__ . '/../../..' . '/lib/private/AppFramework/Db/Db.php',
'OC\\AppFramework\\DependencyInjection\\DIContainer' => __DIR__ . '/../../..' . '/lib/private/AppFramework/DependencyInjection/DIContainer.php',
'OC\\AppFramework\\Http' => __DIR__ . '/../../..' . '/lib/private/AppFramework/Http.php',
'OC\\AppFramework\\Http\\Dispatcher' => __DIR__ . '/../../..' . '/lib/private/AppFramework/Http/Dispatcher.php',
@@ -338,6 +357,8 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c
'OC\\Authentication\\Exceptions\\PasswordlessTokenException' => __DIR__ . '/../../..' . '/lib/private/Authentication/Exceptions/PasswordlessTokenException.php',
'OC\\Authentication\\Exceptions\\TwoFactorAuthRequiredException' => __DIR__ . '/../../..' . '/lib/private/Authentication/Exceptions/TwoFactorAuthRequiredException.php',
'OC\\Authentication\\Exceptions\\UserAlreadyLoggedInException' => __DIR__ . '/../../..' . '/lib/private/Authentication/Exceptions/UserAlreadyLoggedInException.php',
+ 'OC\\Authentication\\LoginCredentials\\Credentials' => __DIR__ . '/../../..' . '/lib/private/Authentication/LoginCredentials/Credentials.php',
+ 'OC\\Authentication\\LoginCredentials\\Store' => __DIR__ . '/../../..' . '/lib/private/Authentication/LoginCredentials/Store.php',
'OC\\Authentication\\Token\\DefaultToken' => __DIR__ . '/../../..' . '/lib/private/Authentication/Token/DefaultToken.php',
'OC\\Authentication\\Token\\DefaultTokenCleanupJob' => __DIR__ . '/../../..' . '/lib/private/Authentication/Token/DefaultTokenCleanupJob.php',
'OC\\Authentication\\Token\\DefaultTokenMapper' => __DIR__ . '/../../..' . '/lib/private/Authentication/Token/DefaultTokenMapper.php',
@@ -439,6 +460,7 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c
'OC\\Core\\Command\\User\\ResetPassword' => __DIR__ . '/../../..' . '/core/Command/User/ResetPassword.php',
'OC\\Core\\Command\\User\\Setting' => __DIR__ . '/../../..' . '/core/Command/User/Setting.php',
'OC\\Core\\Controller\\AvatarController' => __DIR__ . '/../../..' . '/core/Controller/AvatarController.php',
+ 'OC\\Core\\Controller\\CssController' => __DIR__ . '/../../..' . '/core/Controller/CssController.php',
'OC\\Core\\Controller\\LoginController' => __DIR__ . '/../../..' . '/core/Controller/LoginController.php',
'OC\\Core\\Controller\\LostController' => __DIR__ . '/../../..' . '/core/Controller/LostController.php',
'OC\\Core\\Controller\\OCJSController' => __DIR__ . '/../../..' . '/core/Controller/OCJSController.php',
@@ -543,10 +565,15 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c
'OC\\Files\\Node\\NonExistingFile' => __DIR__ . '/../../..' . '/lib/private/Files/Node/NonExistingFile.php',
'OC\\Files\\Node\\NonExistingFolder' => __DIR__ . '/../../..' . '/lib/private/Files/Node/NonExistingFolder.php',
'OC\\Files\\Node\\Root' => __DIR__ . '/../../..' . '/lib/private/Files/Node/Root.php',
+ 'OC\\Files\\Notify\\Change' => __DIR__ . '/../../..' . '/lib/private/Files/Notify/Change.php',
+ 'OC\\Files\\Notify\\RenameChange' => __DIR__ . '/../../..' . '/lib/private/Files/Notify/RenameChange.php',
'OC\\Files\\ObjectStore\\HomeObjectStoreStorage' => __DIR__ . '/../../..' . '/lib/private/Files/ObjectStore/HomeObjectStoreStorage.php',
'OC\\Files\\ObjectStore\\Mapper' => __DIR__ . '/../../..' . '/lib/private/Files/ObjectStore/Mapper.php',
'OC\\Files\\ObjectStore\\NoopScanner' => __DIR__ . '/../../..' . '/lib/private/Files/ObjectStore/NoopScanner.php',
'OC\\Files\\ObjectStore\\ObjectStoreStorage' => __DIR__ . '/../../..' . '/lib/private/Files/ObjectStore/ObjectStoreStorage.php',
+ 'OC\\Files\\ObjectStore\\S3' => __DIR__ . '/../../..' . '/lib/private/Files/ObjectStore/S3.php',
+ 'OC\\Files\\ObjectStore\\S3ConnectionTrait' => __DIR__ . '/../../..' . '/lib/private/Files/ObjectStore/S3ConnectionTrait.php',
+ 'OC\\Files\\ObjectStore\\StorageObjectStore' => __DIR__ . '/../../..' . '/lib/private/Files/ObjectStore/StorageObjectStore.php',
'OC\\Files\\ObjectStore\\Swift' => __DIR__ . '/../../..' . '/lib/private/Files/ObjectStore/Swift.php',
'OC\\Files\\SimpleFS\\SimpleFile' => __DIR__ . '/../../..' . '/lib/private/Files/SimpleFS/SimpleFile.php',
'OC\\Files\\SimpleFS\\SimpleFolder' => __DIR__ . '/../../..' . '/lib/private/Files/SimpleFS/SimpleFolder.php',
@@ -569,11 +596,8 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c
'OC\\Files\\Storage\\Wrapper\\PermissionsMask' => __DIR__ . '/../../..' . '/lib/private/Files/Storage/Wrapper/PermissionsMask.php',
'OC\\Files\\Storage\\Wrapper\\Quota' => __DIR__ . '/../../..' . '/lib/private/Files/Storage/Wrapper/Quota.php',
'OC\\Files\\Storage\\Wrapper\\Wrapper' => __DIR__ . '/../../..' . '/lib/private/Files/Storage/Wrapper/Wrapper.php',
- 'OC\\Files\\Stream\\Close' => __DIR__ . '/../../..' . '/lib/private/Files/Stream/Close.php',
- 'OC\\Files\\Stream\\Dir' => __DIR__ . '/../../..' . '/lib/private/Files/Stream/Dir.php',
'OC\\Files\\Stream\\Encryption' => __DIR__ . '/../../..' . '/lib/private/Files/Stream/Encryption.php',
'OC\\Files\\Stream\\Quota' => __DIR__ . '/../../..' . '/lib/private/Files/Stream/Quota.php',
- 'OC\\Files\\Stream\\StaticStream' => __DIR__ . '/../../..' . '/lib/private/Files/Stream/StaticStream.php',
'OC\\Files\\Type\\Detection' => __DIR__ . '/../../..' . '/lib/private/Files/Type/Detection.php',
'OC\\Files\\Type\\Loader' => __DIR__ . '/../../..' . '/lib/private/Files/Type/Loader.php',
'OC\\Files\\Type\\TemplateManager' => __DIR__ . '/../../..' . '/lib/private/Files/Type/TemplateManager.php',
@@ -623,7 +647,6 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c
'OC\\Log\\Syslog' => __DIR__ . '/../../..' . '/lib/private/Log/Syslog.php',
'OC\\Mail\\Mailer' => __DIR__ . '/../../..' . '/lib/private/Mail/Mailer.php',
'OC\\Mail\\Message' => __DIR__ . '/../../..' . '/lib/private/Mail/Message.php',
- 'OC\\Memcache\\APC' => __DIR__ . '/../../..' . '/lib/private/Memcache/APC.php',
'OC\\Memcache\\APCu' => __DIR__ . '/../../..' . '/lib/private/Memcache/APCu.php',
'OC\\Memcache\\ArrayCache' => __DIR__ . '/../../..' . '/lib/private/Memcache/ArrayCache.php',
'OC\\Memcache\\CADTrait' => __DIR__ . '/../../..' . '/lib/private/Memcache/CADTrait.php',
@@ -645,11 +668,9 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c
'OC\\Notification\\Notification' => __DIR__ . '/../../..' . '/lib/private/Notification/Notification.php',
'OC\\OCS\\CoreCapabilities' => __DIR__ . '/../../..' . '/lib/private/OCS/CoreCapabilities.php',
'OC\\OCS\\Exception' => __DIR__ . '/../../..' . '/lib/private/OCS/Exception.php',
- 'OC\\OCS\\Person' => __DIR__ . '/../../..' . '/lib/private/OCS/Person.php',
'OC\\OCS\\PrivateData' => __DIR__ . '/../../..' . '/lib/private/OCS/PrivateData.php',
'OC\\OCS\\Provider' => __DIR__ . '/../../..' . '/lib/private/OCS/Provider.php',
'OC\\OCS\\Result' => __DIR__ . '/../../..' . '/lib/private/OCS/Result.php',
- 'OC\\Preview' => __DIR__ . '/../../..' . '/lib/private/Preview.php',
'OC\\PreviewManager' => __DIR__ . '/../../..' . '/lib/private/PreviewManager.php',
'OC\\PreviewNotAvailableException' => __DIR__ . '/../../..' . '/lib/private/PreviewNotAvailableException.php',
'OC\\Preview\\BMP' => __DIR__ . '/../../..' . '/lib/private/Preview/BMP.php',
@@ -685,7 +706,6 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c
'OC\\Repair' => __DIR__ . '/../../..' . '/lib/private/Repair.php',
'OC\\RepairException' => __DIR__ . '/../../..' . '/lib/private/RepairException.php',
'OC\\Repair\\AssetCache' => __DIR__ . '/../../..' . '/lib/private/Repair/AssetCache.php',
- 'OC\\Repair\\AvatarPermissions' => __DIR__ . '/../../..' . '/lib/private/Repair/AvatarPermissions.php',
'OC\\Repair\\CleanTags' => __DIR__ . '/../../..' . '/lib/private/Repair/CleanTags.php',
'OC\\Repair\\Collation' => __DIR__ . '/../../..' . '/lib/private/Repair/Collation.php',
'OC\\Repair\\DropOldJobs' => __DIR__ . '/../../..' . '/lib/private/Repair/DropOldJobs.php',
@@ -693,15 +713,17 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c
'OC\\Repair\\FillETags' => __DIR__ . '/../../..' . '/lib/private/Repair/FillETags.php',
'OC\\Repair\\InnoDB' => __DIR__ . '/../../..' . '/lib/private/Repair/InnoDB.php',
'OC\\Repair\\MoveUpdaterStepFile' => __DIR__ . '/../../..' . '/lib/private/Repair/MoveUpdaterStepFile.php',
+ 'OC\\Repair\\NC11\\CleanPreviews' => __DIR__ . '/../../..' . '/lib/private/Repair/NC11/CleanPreviews.php',
+ 'OC\\Repair\\NC11\\CleanPreviewsBackgroundJob' => __DIR__ . '/../../..' . '/lib/private/Repair/NC11/CleanPreviewsBackgroundJob.php',
+ 'OC\\Repair\\NC11\\FixMountStorages' => __DIR__ . '/../../..' . '/lib/private/Repair/NC11/FixMountStorages.php',
'OC\\Repair\\NC11\\MoveAvatars' => __DIR__ . '/../../..' . '/lib/private/Repair/NC11/MoveAvatars.php',
- 'OC\\Repair\\NC11\\MoveAvatarsBackgroundJob' => __DIR__ . '/../../..' . '/lib/private/Repair/NC11/MoveAvatarBackgroundJob.php',
+ 'OC\\Repair\\NC11\\MoveAvatarsBackgroundJob' => __DIR__ . '/../../..' . '/lib/private/Repair/NC11/MoveAvatarsBackgroundJob.php',
'OC\\Repair\\OldGroupMembershipShares' => __DIR__ . '/../../..' . '/lib/private/Repair/OldGroupMembershipShares.php',
'OC\\Repair\\Preview' => __DIR__ . '/../../..' . '/lib/private/Repair/Preview.php',
'OC\\Repair\\RemoveGetETagEntries' => __DIR__ . '/../../..' . '/lib/private/Repair/RemoveGetETagEntries.php',
'OC\\Repair\\RemoveOldShares' => __DIR__ . '/../../..' . '/lib/private/Repair/RemoveOldShares.php',
'OC\\Repair\\RemoveRootShares' => __DIR__ . '/../../..' . '/lib/private/Repair/RemoveRootShares.php',
'OC\\Repair\\RepairInvalidShares' => __DIR__ . '/../../..' . '/lib/private/Repair/RepairInvalidShares.php',
- 'OC\\Repair\\RepairLegacyStorages' => __DIR__ . '/../../..' . '/lib/private/Repair/RepairLegacyStorages.php',
'OC\\Repair\\RepairMimeTypes' => __DIR__ . '/../../..' . '/lib/private/Repair/RepairMimeTypes.php',
'OC\\Repair\\RepairUnmergedShares' => __DIR__ . '/../../..' . '/lib/private/Repair/RepairUnmergedShares.php',
'OC\\Repair\\SearchLuceneTables' => __DIR__ . '/../../..' . '/lib/private/Repair/SearchLuceneTables.php',
@@ -732,6 +754,9 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c
'OC\\Security\\CredentialsManager' => __DIR__ . '/../../..' . '/lib/private/Security/CredentialsManager.php',
'OC\\Security\\Crypto' => __DIR__ . '/../../..' . '/lib/private/Security/Crypto.php',
'OC\\Security\\Hasher' => __DIR__ . '/../../..' . '/lib/private/Security/Hasher.php',
+ 'OC\\Security\\IdentityProof\\Key' => __DIR__ . '/../../..' . '/lib/private/Security/IdentityProof/Key.php',
+ 'OC\\Security\\IdentityProof\\Manager' => __DIR__ . '/../../..' . '/lib/private/Security/IdentityProof/Manager.php',
+ 'OC\\Security\\IdentityProof\\Signer' => __DIR__ . '/../../..' . '/lib/private/Security/IdentityProof/Signer.php',
'OC\\Security\\SecureRandom' => __DIR__ . '/../../..' . '/lib/private/Security/SecureRandom.php',
'OC\\Security\\TrustedDomainHelper' => __DIR__ . '/../../..' . '/lib/private/Security/TrustedDomainHelper.php',
'OC\\Server' => __DIR__ . '/../../..' . '/lib/private/Server.php',
@@ -745,8 +770,8 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c
'OC\\Session\\Session' => __DIR__ . '/../../..' . '/lib/private/Session/Session.php',
'OC\\Settings\\Admin\\Additional' => __DIR__ . '/../../..' . '/lib/private/Settings/Admin/Additional.php',
'OC\\Settings\\Admin\\Encryption' => __DIR__ . '/../../..' . '/lib/private/Settings/Admin/Encryption.php',
- 'OC\\Settings\\Admin\\Logging' => __DIR__ . '/../../..' . '/lib/private/Settings/Admin/Logging.php',
'OC\\Settings\\Admin\\Server' => __DIR__ . '/../../..' . '/lib/private/Settings/Admin/Server.php',
+ 'OC\\Settings\\Admin\\ServerDevNotice' => __DIR__ . '/../../..' . '/lib/private/Settings/Admin/ServerDevNotice.php',
'OC\\Settings\\Admin\\Sharing' => __DIR__ . '/../../..' . '/lib/private/Settings/Admin/Sharing.php',
'OC\\Settings\\Admin\\TipsTricks' => __DIR__ . '/../../..' . '/lib/private/Settings/Admin/TipsTricks.php',
'OC\\Settings\\Application' => __DIR__ . '/../../..' . '/settings/Application.php',
@@ -760,9 +785,11 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c
'OC\\Settings\\Controller\\GroupsController' => __DIR__ . '/../../..' . '/settings/Controller/GroupsController.php',
'OC\\Settings\\Controller\\LogSettingsController' => __DIR__ . '/../../..' . '/settings/Controller/LogSettingsController.php',
'OC\\Settings\\Controller\\MailSettingsController' => __DIR__ . '/../../..' . '/settings/Controller/MailSettingsController.php',
+ 'OC\\Settings\\Controller\\PersonalController' => __DIR__ . '/../../..' . '/settings/Controller/PersonalController.php',
'OC\\Settings\\Controller\\SecuritySettingsController' => __DIR__ . '/../../..' . '/settings/Controller/SecuritySettingsController.php',
'OC\\Settings\\Controller\\UsersController' => __DIR__ . '/../../..' . '/settings/Controller/UsersController.php',
'OC\\Settings\\Manager' => __DIR__ . '/../../..' . '/lib/private/Settings/Manager.php',
+ 'OC\\Settings\\Mapper' => __DIR__ . '/../../..' . '/lib/private/Settings/Mapper.php',
'OC\\Settings\\Middleware\\SubadminMiddleware' => __DIR__ . '/../../..' . '/settings/Middleware/SubadminMiddleware.php',
'OC\\Settings\\RemoveOrphaned' => __DIR__ . '/../../..' . '/lib/private/Settings/RemoveOrphaned.php',
'OC\\Settings\\Section' => __DIR__ . '/../../..' . '/lib/private/Settings/Section.php',
@@ -804,6 +831,7 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c
'OC\\Template\\JSResourceLocator' => __DIR__ . '/../../..' . '/lib/private/Template/JSResourceLocator.php',
'OC\\Template\\ResourceLocator' => __DIR__ . '/../../..' . '/lib/private/Template/ResourceLocator.php',
'OC\\Template\\ResourceNotFoundException' => __DIR__ . '/../../..' . '/lib/private/Template/ResourceNotFoundException.php',
+ 'OC\\Template\\SCSSCacher' => __DIR__ . '/../../..' . '/lib/private/Template/SCSSCacher.php',
'OC\\Template\\TemplateFileLocator' => __DIR__ . '/../../..' . '/lib/private/Template/TemplateFileLocator.php',
'OC\\URLGenerator' => __DIR__ . '/../../..' . '/lib/private/URLGenerator.php',
'OC\\Updater' => __DIR__ . '/../../..' . '/lib/private/Updater.php',
diff --git a/lib/l10n/bg_BG.js b/lib/l10n/bg_BG.js
new file mode 100644
index 00000000000..955d4e68742
--- /dev/null
+++ b/lib/l10n/bg_BG.js
@@ -0,0 +1,177 @@
+OC.L10N.register(
+ "lib",
+ {
+ "Cannot write into \"config\" directory!" : "Неуспешен опит за запис в \"config\" папката!",
+ "This can usually be fixed by giving the webserver write access to the config directory" : "Това може да бъде решено единствено като разрешиш на уеб сървъра да пише в config папката.",
+ "See %s" : "Вижте %s",
+ "This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Това обикновено може да бъде оправено като %s даде разрешение на уеб сървъра да записва в config папката %s.",
+ "Sample configuration detected" : "Открита е примерна конфигурация",
+ "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Усетено беше че примерната конфигурация е копирана. Това може да развли инсталацията ти и не се поддържа. Моля, прочети документацията преди да правиш промени на config.php",
+ "%1$s and %2$s" : "%1$s и %2$s",
+ "%1$s, %2$s and %3$s" : "%1$s, %2$s и %3$s",
+ "%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s и %4$s",
+ "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s и %5$s",
+ "PHP %s or higher is required." : "Изисква се PHP %s или по-нова.",
+ "PHP with a version lower than %s is required." : "Необходим е PHP с версия по-ниска от %s.",
+ "Following databases are supported: %s" : "Следните бази данни са поддържани: %s",
+ "The command line tool %s could not be found" : "Конзолната команда %s не може да бъде намерена",
+ "The library %s is not available." : "Библиотеката %s не е налична",
+ "Library %s with a version higher than %s is required - available version %s." : "Необходима е библиотеката %s с версия по-висока от %s - налична версия %s. ",
+ "Library %s with a version lower than %s is required - available version %s." : "Необходима е библиотеката %s с версия по-ниска от %s - налична версия %s. ",
+ "Following platforms are supported: %s" : "Поддържани са следните платформи: %s",
+ "Unknown filetype" : "Непознат тип файл",
+ "Invalid image" : "Невалидно изображение.",
+ "today" : "днес",
+ "yesterday" : "вчера",
+ "_%n day ago_::_%n days ago_" : ["преди %n ден","преди %n дни"],
+ "last month" : "миналия месец",
+ "_%n month ago_::_%n months ago_" : ["преди %n месец","преди %n месеца"],
+ "last year" : "миналата година",
+ "_%n year ago_::_%n years ago_" : ["преди %n година","преди %n години"],
+ "_%n hour ago_::_%n hours ago_" : ["преди %n час","преди %n часа"],
+ "_%n minute ago_::_%n minutes ago_" : ["преди %n минута","преди %n минути"],
+ "seconds ago" : "преди секунди",
+ "File name contains at least one invalid character" : "Името на файла съдържа поне един невалиден символ",
+ "File name is too long" : "Името на файла е твърде дълго",
+ "APCu" : "APCu",
+ "Redis" : "Redis",
+ "Server settings" : "Настройки на сървъра",
+ "Sharing" : "Споделяне",
+ "Additional settings" : "Допълнителни настройки",
+ "%s enter the database username and name." : "%s въведете потребителско име и име за базата данни",
+ "%s enter the database username." : "%s въведете потребител за базата данни.",
+ "%s enter the database name." : "%s въведи име на базата данни.",
+ "%s you may not use dots in the database name" : "%s, не може да ползваш точки в името на базата данни.",
+ "Oracle username and/or password not valid" : "Невалидно Oracle потребителско име и/или парола.",
+ "DB Error: \"%s\"" : "Грешка в базата данни: \"%s\".",
+ "Offending command was: \"%s\"" : "Проблемната команда беше: \"%s\".",
+ "You need to enter either an existing account or the administrator." : "Необходимо е да въведеш съществуващ профил или като администратор.",
+ "Offending command was: \"%s\", name: %s, password: %s" : "Проблемната команда беше: \"%s\", име: %s, парола: %s.",
+ "PostgreSQL username and/or password not valid" : "Невалидно PostgreSQL потребителско име и/или парола.",
+ "Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X не се подържа и %s няма да работи правилно на тази платформа. Използвайте го на свой собствен риск!",
+ "For the best results, please consider using a GNU/Linux server instead." : "За най-добри резултати, моля, помисли дали не бихте желали да използваште GNU/Linux сървър.",
+ "Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "Моля, премахтене настройката за open_basedir от вашия php.ini или преминете към 64-битово PHP.",
+ "Set an admin username." : "Задайте потребителско име за администратор.",
+ "Set an admin password." : "Задай парола за администратор.",
+ "Can't create or write into the data directory %s" : "Неуспешно създаване или записване в \"data\" папката %s",
+ "%s shared »%s« with you" : "%s сподели »%s« с теб",
+ "%s via %s" : "%s чрез %s",
+ "Sharing %s failed, because the backend does not allow shares from type %i" : "Неуспешно споделяне на %s , защото сървъра не позволява споделяне от тип $i.",
+ "Sharing %s failed, because the file does not exist" : "Неуспешно споделяне на %s, защото файлът не съществува.",
+ "You are not allowed to share %s" : "Не ти е разрешено да споделяш %s.",
+ "Sharing %s failed, because the user %s does not exist" : "Неуспешно споделяне на %s, защото потребител %s не съществува.",
+ "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Неуспешно споделяне на %s, защото %s не е член никоя от групите, в които е %s.",
+ "Sharing %s failed, because this item is already shared with %s" : "Неуспешно споделяне на %s, защото това съдържание е вече споделено с %s.",
+ "Sharing %s failed, because the group %s does not exist" : "Неупешно споделяне на %s, защото групата %s не съществува.",
+ "Sharing %s failed, because %s is not a member of the group %s" : "Неуспешно споделяне на %s, защото %s не е член на групата %s.",
+ "You need to provide a password to create a public link, only protected links are allowed" : "Трябва да зададеш парола, за да създадеш общодостъпен линк за споделяне, само защитени с пароли линкове са разрешени.",
+ "Sharing %s failed, because sharing with links is not allowed" : "Неуспешно споделяне на %s, защото споделянето посредством връзки не е разрешено.",
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Неуспешно споделяне на на %s, не може бъде намерено %s. Може би сървъра в момента е недостъпен.",
+ "Share type %s is not valid for %s" : "Споделянето на тип %s не валидно за %s.",
+ "Setting permissions for %s failed, because the permissions exceed permissions granted to %s" : "Неуспешна промяна на правата за достъп за %s, защото промените надвишават правата на достъп дадени на %s.",
+ "Setting permissions for %s failed, because the item was not found" : "Неуспешна промяна на правата за достъп за %s, защото съдържанието не е открито.",
+ "Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "Неуспешно задаване на дата на изтичане. Споделни папки или файлове не могат да изтичат по-късно от %s след като са били споделени",
+ "Cannot set expiration date. Expiration date is in the past" : "Неуспешно задаване на дата на изтичане. Датата на изтичане е в миналото",
+ "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Споделянето на сървърния %s трябва да поддържа OCP\\Share_Backend интерфейс.",
+ "Sharing backend %s not found" : "Споделянето на сървърния %s не е открито.",
+ "Sharing backend for %s not found" : "Споделянето на сървъра за %s не е открито.",
+ "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Неуспешно споделяне на %s, защото промените надвишават правата на достъп дадени на %s.",
+ "Sharing %s failed, because resharing is not allowed" : "Неуспешно споделяне на %s, защото повторно споделяне не е разрешено.",
+ "Sharing %s failed, because the sharing backend for %s could not find its source" : "Неуспешно споделяне на %s, защото не е открит първоизточникът на %s, за да бъде споделяне по сървъра.",
+ "Sharing %s failed, because the file could not be found in the file cache" : "Неуспешно споделяне на %s, защото файлът не може да бъде намерен в кеша.",
+ "Could not find category \"%s\"" : "Невъзможно откриване на категорията \"%s\".",
+ "Sunday" : "неделя",
+ "Monday" : "понеделник",
+ "Tuesday" : "вторник",
+ "Wednesday" : "сряда",
+ "Thursday" : "четвъртък",
+ "Friday" : "петък",
+ "Saturday" : "събота",
+ "Sun." : "нед",
+ "Mon." : "пон",
+ "Tue." : "вт",
+ "Wed." : "ср",
+ "Thu." : "чет",
+ "Fri." : "пет",
+ "Sat." : "съб",
+ "Su" : "нд",
+ "Mo" : "пн",
+ "We" : "ср",
+ "Th" : "чт",
+ "Fr" : "пт",
+ "Sa" : "сб",
+ "January" : "януари",
+ "February" : "февруару",
+ "March" : "март",
+ "April" : "април",
+ "May" : "май",
+ "June" : "юни",
+ "July" : "юли",
+ "August" : "август",
+ "September" : "септември",
+ "October" : "октомври",
+ "November" : "ноември",
+ "December" : "декември",
+ "Jan." : "яну",
+ "Feb." : "фев",
+ "Mar." : "мар",
+ "Apr." : "апр",
+ "May." : "май",
+ "Jun." : "юни",
+ "Jul." : "юли",
+ "Aug." : "авг",
+ "Sep." : "сеп",
+ "Oct." : "окт",
+ "Nov." : "ное",
+ "Dec." : "дек",
+ "Apps" : "Приложения",
+ "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "Потребителските имена може да съдържат следните знаци: \"a-z\", \"A-Z\", \"0-9\" и \"_.@-'\"",
+ "A valid username must be provided" : "Трябва да въведете валидно потребителско.",
+ "Username contains whitespace at the beginning or at the end" : "Потребителското име започва или завършва с интервал.",
+ "A valid password must be provided" : "Трябва да въведете валидна парола.",
+ "The username is already being used" : "Потребителското име е вече заето.",
+ "Help" : "Помощ",
+ "Personal" : "Лични",
+ "Users" : "Потребители",
+ "Admin" : "Админ",
+ "No app name specified" : "Не е зададено име на преложението",
+ "a safe home for all your data" : "безопасен дом за всички ваши данни",
+ "Can't read file" : "Файлът не може да бъде прочетен",
+ "Application is not enabled" : "Приложението не е включено",
+ "Authentication error" : "Проблем с идентификацията",
+ "Token expired. Please reload page." : "Изтекла сесия. Моля, презареди страницата.",
+ "Unknown user" : "Непознат потребител",
+ "No database drivers (sqlite, mysql, or postgresql) installed." : "Липсват инсталирани драйвери за бази данни(sqlite, mysql или postgresql).",
+ "Cannot write into \"config\" directory" : "Неуспешен опит за запис в \"config\" папката.",
+ "Cannot write into \"apps\" directory" : "Писането в папка приложения не е възможно",
+ "This can usually be fixed by %sgiving the webserver write access to the apps directory%s or disabling the appstore in the config file." : "Това обикновено може да бъде оправено като %s даде разрешение на уеб сървъра да записва в app папката %s или като изключи магазина за приложения в config файла.",
+ "Cannot create \"data\" directory (%s)" : "Неуспешен опит за създаване на \"data\" папката (%s).",
+ "Permissions can usually be fixed by %sgiving the webserver write access to the root directory%s." : "Правата за достъп обикновено могат да бъдат оправени когато %s даде права на уеб сървъра да пише в root папката %s.",
+ "Setting locale to %s failed" : "Неуспешно задаване на %s като настройка език-държава.",
+ "Please install one of these locales on your system and restart your webserver." : "Моля, инсталирай едно от следните език-държава на сървъра и рестартирай уеб сървъра.",
+ "Please ask your server administrator to install the module." : "Моля, помолете вашия администратор да инсталира модула.",
+ "PHP module %s not installed." : "PHP модулът %s не е инсталиран.",
+ "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Това може да се дължи на cache/accelerator като Zend OPache или eAccelerator.",
+ "PHP modules have been installed, but they are still listed as missing?" : "PHP модулите са инсталирани, но все още се обявяват като липсващи?",
+ "Please ask your server administrator to restart the web server." : "Моля, поискай от своя администратор да рестартира уеб сървъра.",
+ "PostgreSQL >= 9 required" : "Изисква се PostgreSQL >= 9",
+ "Please upgrade your database version" : "Моля, обнови базата данни.",
+ "Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Моля, променете правата за достъп на 0770, за да не може директорията да бъде видяна от други потребители.",
+ "Data directory (%s) is readable by other users" : "Data папката (%s) може да бъде разгледана от други потребители",
+ "Data directory (%s) is invalid" : "Data папката (%s) e невалидна",
+ "Please check that the data directory contains a file \".ocdata\" in its root." : "Моля, увери се, че data папката съдържа файл \".ocdata\" в себе си.",
+ "Could not obtain lock type %d on \"%s\"." : "Неуспешен опит за ексклузивен достъп от типa %d върху \"%s\".",
+ "App directory already exists" : "Папката на приложението вече съществува.",
+ "Can't create app folder. Please fix permissions. %s" : "Папката не може да бъде създадена. Моля, коригирайте правата. %s",
+ "No source specified when installing app" : "Не е посочен източник при инсталацията на приложението.",
+ "No href specified when installing app from http" : "Липсва съдържанието на връзката за инсталиране на приложението",
+ "No path specified when installing app from local file" : "Не е зададен пътя до локалния файл за инсталиране на приложението.",
+ "Archives of type %s are not supported" : "Архиви от тип %s не се подържат",
+ "Failed to open archive when installing app" : "Неуспешно отваряне на архив по време на инсталацията на приложението.",
+ "App does not provide an info.xml file" : "Приложенението не съдържа файла info.xml",
+ "App can't be installed because of not allowed code in the App" : "Приложението няма да бъде инсталирано, защото съдържа неразрешен код.",
+ "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "Приложението няма да бъде инсталирано, защото съдържа <shipped>true</shipped>, таг който не е разрешен за не shiped приложения.",
+ "Recommended" : "Препоръчано",
+ "Storage not available" : "Хранилището не е налично"
+},
+"nplurals=2; plural=(n != 1);");
diff --git a/lib/l10n/bg_BG.json b/lib/l10n/bg_BG.json
new file mode 100644
index 00000000000..1f2bcdf9d33
--- /dev/null
+++ b/lib/l10n/bg_BG.json
@@ -0,0 +1,175 @@
+{ "translations": {
+ "Cannot write into \"config\" directory!" : "Неуспешен опит за запис в \"config\" папката!",
+ "This can usually be fixed by giving the webserver write access to the config directory" : "Това може да бъде решено единствено като разрешиш на уеб сървъра да пише в config папката.",
+ "See %s" : "Вижте %s",
+ "This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Това обикновено може да бъде оправено като %s даде разрешение на уеб сървъра да записва в config папката %s.",
+ "Sample configuration detected" : "Открита е примерна конфигурация",
+ "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Усетено беше че примерната конфигурация е копирана. Това може да развли инсталацията ти и не се поддържа. Моля, прочети документацията преди да правиш промени на config.php",
+ "%1$s and %2$s" : "%1$s и %2$s",
+ "%1$s, %2$s and %3$s" : "%1$s, %2$s и %3$s",
+ "%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s и %4$s",
+ "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s и %5$s",
+ "PHP %s or higher is required." : "Изисква се PHP %s или по-нова.",
+ "PHP with a version lower than %s is required." : "Необходим е PHP с версия по-ниска от %s.",
+ "Following databases are supported: %s" : "Следните бази данни са поддържани: %s",
+ "The command line tool %s could not be found" : "Конзолната команда %s не може да бъде намерена",
+ "The library %s is not available." : "Библиотеката %s не е налична",
+ "Library %s with a version higher than %s is required - available version %s." : "Необходима е библиотеката %s с версия по-висока от %s - налична версия %s. ",
+ "Library %s with a version lower than %s is required - available version %s." : "Необходима е библиотеката %s с версия по-ниска от %s - налична версия %s. ",
+ "Following platforms are supported: %s" : "Поддържани са следните платформи: %s",
+ "Unknown filetype" : "Непознат тип файл",
+ "Invalid image" : "Невалидно изображение.",
+ "today" : "днес",
+ "yesterday" : "вчера",
+ "_%n day ago_::_%n days ago_" : ["преди %n ден","преди %n дни"],
+ "last month" : "миналия месец",
+ "_%n month ago_::_%n months ago_" : ["преди %n месец","преди %n месеца"],
+ "last year" : "миналата година",
+ "_%n year ago_::_%n years ago_" : ["преди %n година","преди %n години"],
+ "_%n hour ago_::_%n hours ago_" : ["преди %n час","преди %n часа"],
+ "_%n minute ago_::_%n minutes ago_" : ["преди %n минута","преди %n минути"],
+ "seconds ago" : "преди секунди",
+ "File name contains at least one invalid character" : "Името на файла съдържа поне един невалиден символ",
+ "File name is too long" : "Името на файла е твърде дълго",
+ "APCu" : "APCu",
+ "Redis" : "Redis",
+ "Server settings" : "Настройки на сървъра",
+ "Sharing" : "Споделяне",
+ "Additional settings" : "Допълнителни настройки",
+ "%s enter the database username and name." : "%s въведете потребителско име и име за базата данни",
+ "%s enter the database username." : "%s въведете потребител за базата данни.",
+ "%s enter the database name." : "%s въведи име на базата данни.",
+ "%s you may not use dots in the database name" : "%s, не може да ползваш точки в името на базата данни.",
+ "Oracle username and/or password not valid" : "Невалидно Oracle потребителско име и/или парола.",
+ "DB Error: \"%s\"" : "Грешка в базата данни: \"%s\".",
+ "Offending command was: \"%s\"" : "Проблемната команда беше: \"%s\".",
+ "You need to enter either an existing account or the administrator." : "Необходимо е да въведеш съществуващ профил или като администратор.",
+ "Offending command was: \"%s\", name: %s, password: %s" : "Проблемната команда беше: \"%s\", име: %s, парола: %s.",
+ "PostgreSQL username and/or password not valid" : "Невалидно PostgreSQL потребителско име и/или парола.",
+ "Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X не се подържа и %s няма да работи правилно на тази платформа. Използвайте го на свой собствен риск!",
+ "For the best results, please consider using a GNU/Linux server instead." : "За най-добри резултати, моля, помисли дали не бихте желали да използваште GNU/Linux сървър.",
+ "Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "Моля, премахтене настройката за open_basedir от вашия php.ini или преминете към 64-битово PHP.",
+ "Set an admin username." : "Задайте потребителско име за администратор.",
+ "Set an admin password." : "Задай парола за администратор.",
+ "Can't create or write into the data directory %s" : "Неуспешно създаване или записване в \"data\" папката %s",
+ "%s shared »%s« with you" : "%s сподели »%s« с теб",
+ "%s via %s" : "%s чрез %s",
+ "Sharing %s failed, because the backend does not allow shares from type %i" : "Неуспешно споделяне на %s , защото сървъра не позволява споделяне от тип $i.",
+ "Sharing %s failed, because the file does not exist" : "Неуспешно споделяне на %s, защото файлът не съществува.",
+ "You are not allowed to share %s" : "Не ти е разрешено да споделяш %s.",
+ "Sharing %s failed, because the user %s does not exist" : "Неуспешно споделяне на %s, защото потребител %s не съществува.",
+ "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Неуспешно споделяне на %s, защото %s не е член никоя от групите, в които е %s.",
+ "Sharing %s failed, because this item is already shared with %s" : "Неуспешно споделяне на %s, защото това съдържание е вече споделено с %s.",
+ "Sharing %s failed, because the group %s does not exist" : "Неупешно споделяне на %s, защото групата %s не съществува.",
+ "Sharing %s failed, because %s is not a member of the group %s" : "Неуспешно споделяне на %s, защото %s не е член на групата %s.",
+ "You need to provide a password to create a public link, only protected links are allowed" : "Трябва да зададеш парола, за да създадеш общодостъпен линк за споделяне, само защитени с пароли линкове са разрешени.",
+ "Sharing %s failed, because sharing with links is not allowed" : "Неуспешно споделяне на %s, защото споделянето посредством връзки не е разрешено.",
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Неуспешно споделяне на на %s, не може бъде намерено %s. Може би сървъра в момента е недостъпен.",
+ "Share type %s is not valid for %s" : "Споделянето на тип %s не валидно за %s.",
+ "Setting permissions for %s failed, because the permissions exceed permissions granted to %s" : "Неуспешна промяна на правата за достъп за %s, защото промените надвишават правата на достъп дадени на %s.",
+ "Setting permissions for %s failed, because the item was not found" : "Неуспешна промяна на правата за достъп за %s, защото съдържанието не е открито.",
+ "Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "Неуспешно задаване на дата на изтичане. Споделни папки или файлове не могат да изтичат по-късно от %s след като са били споделени",
+ "Cannot set expiration date. Expiration date is in the past" : "Неуспешно задаване на дата на изтичане. Датата на изтичане е в миналото",
+ "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Споделянето на сървърния %s трябва да поддържа OCP\\Share_Backend интерфейс.",
+ "Sharing backend %s not found" : "Споделянето на сървърния %s не е открито.",
+ "Sharing backend for %s not found" : "Споделянето на сървъра за %s не е открито.",
+ "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Неуспешно споделяне на %s, защото промените надвишават правата на достъп дадени на %s.",
+ "Sharing %s failed, because resharing is not allowed" : "Неуспешно споделяне на %s, защото повторно споделяне не е разрешено.",
+ "Sharing %s failed, because the sharing backend for %s could not find its source" : "Неуспешно споделяне на %s, защото не е открит първоизточникът на %s, за да бъде споделяне по сървъра.",
+ "Sharing %s failed, because the file could not be found in the file cache" : "Неуспешно споделяне на %s, защото файлът не може да бъде намерен в кеша.",
+ "Could not find category \"%s\"" : "Невъзможно откриване на категорията \"%s\".",
+ "Sunday" : "неделя",
+ "Monday" : "понеделник",
+ "Tuesday" : "вторник",
+ "Wednesday" : "сряда",
+ "Thursday" : "четвъртък",
+ "Friday" : "петък",
+ "Saturday" : "събота",
+ "Sun." : "нед",
+ "Mon." : "пон",
+ "Tue." : "вт",
+ "Wed." : "ср",
+ "Thu." : "чет",
+ "Fri." : "пет",
+ "Sat." : "съб",
+ "Su" : "нд",
+ "Mo" : "пн",
+ "We" : "ср",
+ "Th" : "чт",
+ "Fr" : "пт",
+ "Sa" : "сб",
+ "January" : "януари",
+ "February" : "февруару",
+ "March" : "март",
+ "April" : "април",
+ "May" : "май",
+ "June" : "юни",
+ "July" : "юли",
+ "August" : "август",
+ "September" : "септември",
+ "October" : "октомври",
+ "November" : "ноември",
+ "December" : "декември",
+ "Jan." : "яну",
+ "Feb." : "фев",
+ "Mar." : "мар",
+ "Apr." : "апр",
+ "May." : "май",
+ "Jun." : "юни",
+ "Jul." : "юли",
+ "Aug." : "авг",
+ "Sep." : "сеп",
+ "Oct." : "окт",
+ "Nov." : "ное",
+ "Dec." : "дек",
+ "Apps" : "Приложения",
+ "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "Потребителските имена може да съдържат следните знаци: \"a-z\", \"A-Z\", \"0-9\" и \"_.@-'\"",
+ "A valid username must be provided" : "Трябва да въведете валидно потребителско.",
+ "Username contains whitespace at the beginning or at the end" : "Потребителското име започва или завършва с интервал.",
+ "A valid password must be provided" : "Трябва да въведете валидна парола.",
+ "The username is already being used" : "Потребителското име е вече заето.",
+ "Help" : "Помощ",
+ "Personal" : "Лични",
+ "Users" : "Потребители",
+ "Admin" : "Админ",
+ "No app name specified" : "Не е зададено име на преложението",
+ "a safe home for all your data" : "безопасен дом за всички ваши данни",
+ "Can't read file" : "Файлът не може да бъде прочетен",
+ "Application is not enabled" : "Приложението не е включено",
+ "Authentication error" : "Проблем с идентификацията",
+ "Token expired. Please reload page." : "Изтекла сесия. Моля, презареди страницата.",
+ "Unknown user" : "Непознат потребител",
+ "No database drivers (sqlite, mysql, or postgresql) installed." : "Липсват инсталирани драйвери за бази данни(sqlite, mysql или postgresql).",
+ "Cannot write into \"config\" directory" : "Неуспешен опит за запис в \"config\" папката.",
+ "Cannot write into \"apps\" directory" : "Писането в папка приложения не е възможно",
+ "This can usually be fixed by %sgiving the webserver write access to the apps directory%s or disabling the appstore in the config file." : "Това обикновено може да бъде оправено като %s даде разрешение на уеб сървъра да записва в app папката %s или като изключи магазина за приложения в config файла.",
+ "Cannot create \"data\" directory (%s)" : "Неуспешен опит за създаване на \"data\" папката (%s).",
+ "Permissions can usually be fixed by %sgiving the webserver write access to the root directory%s." : "Правата за достъп обикновено могат да бъдат оправени когато %s даде права на уеб сървъра да пише в root папката %s.",
+ "Setting locale to %s failed" : "Неуспешно задаване на %s като настройка език-държава.",
+ "Please install one of these locales on your system and restart your webserver." : "Моля, инсталирай едно от следните език-държава на сървъра и рестартирай уеб сървъра.",
+ "Please ask your server administrator to install the module." : "Моля, помолете вашия администратор да инсталира модула.",
+ "PHP module %s not installed." : "PHP модулът %s не е инсталиран.",
+ "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Това може да се дължи на cache/accelerator като Zend OPache или eAccelerator.",
+ "PHP modules have been installed, but they are still listed as missing?" : "PHP модулите са инсталирани, но все още се обявяват като липсващи?",
+ "Please ask your server administrator to restart the web server." : "Моля, поискай от своя администратор да рестартира уеб сървъра.",
+ "PostgreSQL >= 9 required" : "Изисква се PostgreSQL >= 9",
+ "Please upgrade your database version" : "Моля, обнови базата данни.",
+ "Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Моля, променете правата за достъп на 0770, за да не може директорията да бъде видяна от други потребители.",
+ "Data directory (%s) is readable by other users" : "Data папката (%s) може да бъде разгледана от други потребители",
+ "Data directory (%s) is invalid" : "Data папката (%s) e невалидна",
+ "Please check that the data directory contains a file \".ocdata\" in its root." : "Моля, увери се, че data папката съдържа файл \".ocdata\" в себе си.",
+ "Could not obtain lock type %d on \"%s\"." : "Неуспешен опит за ексклузивен достъп от типa %d върху \"%s\".",
+ "App directory already exists" : "Папката на приложението вече съществува.",
+ "Can't create app folder. Please fix permissions. %s" : "Папката не може да бъде създадена. Моля, коригирайте правата. %s",
+ "No source specified when installing app" : "Не е посочен източник при инсталацията на приложението.",
+ "No href specified when installing app from http" : "Липсва съдържанието на връзката за инсталиране на приложението",
+ "No path specified when installing app from local file" : "Не е зададен пътя до локалния файл за инсталиране на приложението.",
+ "Archives of type %s are not supported" : "Архиви от тип %s не се подържат",
+ "Failed to open archive when installing app" : "Неуспешно отваряне на архив по време на инсталацията на приложението.",
+ "App does not provide an info.xml file" : "Приложенението не съдържа файла info.xml",
+ "App can't be installed because of not allowed code in the App" : "Приложението няма да бъде инсталирано, защото съдържа неразрешен код.",
+ "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "Приложението няма да бъде инсталирано, защото съдържа <shipped>true</shipped>, таг който не е разрешен за не shiped приложения.",
+ "Recommended" : "Препоръчано",
+ "Storage not available" : "Хранилището не е налично"
+},"pluralForm" :"nplurals=2; plural=(n != 1);"
+} \ No newline at end of file
diff --git a/lib/l10n/cs_CZ.js b/lib/l10n/cs_CZ.js
index 9d879da5219..ff0b5705cea 100644
--- a/lib/l10n/cs_CZ.js
+++ b/lib/l10n/cs_CZ.js
@@ -8,6 +8,10 @@ OC.L10N.register(
"The files of the app %$1s were not replaced correctly. Make sure it is a version compatible with the server." : "Soubory aplikace %$1s nebyly řádně nahrazeny. Ujistěte se, že je to verze kompatibilní se serverem.",
"Sample configuration detected" : "Byla detekována vzorová konfigurace",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Pravděpodobně byla zkopírována konfigurační nastavení ze vzorových souborů. Toto není podporováno a může poškodit vaši instalaci. Nahlédněte prosím do dokumentace před prováděním změn v souboru config.php",
+ "%1$s and %2$s" : "%1$s a %2$s",
+ "%1$s, %2$s and %3$s" : "%1$s, %2$s a %3$s",
+ "%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s a %4$s",
+ "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s a %5$s",
"PHP %s or higher is required." : "Je vyžadováno PHP %s nebo vyšší.",
"PHP with a version lower than %s is required." : "Je vyžadováno PHP ve verzi nižší než %s.",
"%sbit or higher PHP required." : "Je vyžadováno PHP %sbit nebo vyšší.",
@@ -224,14 +228,6 @@ OC.L10N.register(
"Recommended" : "Doporučené",
"Microsoft Windows Platform is not supported" : "Platforma Microsoft Windows není podporována",
"Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "Provozování Nextcloud Serveru na platformě Microsoft Windows není podporováno. Doporučujeme, abyste použili linuxový server ve virtuálním stroji, pokud nemáte možnost server migrovat.",
- "Storage not available" : "Úložiště není dostupné",
- "ownCloud %s or higher is required." : "Vyžadován ownCloud %s nebo vyšší.",
- "ownCloud %s or lower is required." : "Vyžadován ownCloud %s nebo nižší.",
- "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "Aplikaci \"%s\" nelze nainstalovat, protože není kompatibilní s touto verzí Nextcloud.",
- "App can't be installed because it is not compatible with this version of Nextcloud" : "Aplikaci nelze nainstalovat, protože není kompatibilní s touto verzí Nextcloud",
- "App can't be installed because the version in info.xml/version is not the same as the version reported from the app store" : "Aplikace nemůže být nainstalována, protože verze uvedená v info.xml/version nesouhlasí s verzí hlášenou z úložiště aplikací.",
- "Hint: You can speed up the upgrade by executing this SQL command manually: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;" : "Tip: Aktualizaci můžete urychlit manuálním spuštěním následujícího SQL příkazu: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;",
- "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on <a href=\"%s\">%s</a>. For migrating existing installations to Linux you can find some tips and a migration script in <a href=\"%s\">our documentation</a>." : "Provozování Nextcloud Serveru na platformě Microsoft Windows není podporováno. Doporučujeme, abyste použili linuxový server ve virtuálním stroji, pokud nemáte možnost migrovat server jako takový. Linuxové balíčky i jednoduše použitelné obrazy virtuálních strojů lze nalézt na <a href=\"%s\">%s</a>. Pro migraci stávajících instalací na Linux můžete nalézt tipy a migrační skript v <a href=\"%s\">naší dokumentaci</a>.",
- "This can usually be fixed by <a href=\"%s\" target=\"_blank\">giving the webserver write access to the root directory</a>." : "Toto může být obvykle opraveno <a href=\"%s\" target=\"_blank\">nastavením přístupových práv webového serveru pro zápis do kořenového adresáře</a>."
+ "Storage not available" : "Úložiště není dostupné"
},
"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;");
diff --git a/lib/l10n/cs_CZ.json b/lib/l10n/cs_CZ.json
index 97a1242aeef..ae66663d49c 100644
--- a/lib/l10n/cs_CZ.json
+++ b/lib/l10n/cs_CZ.json
@@ -6,6 +6,10 @@
"The files of the app %$1s were not replaced correctly. Make sure it is a version compatible with the server." : "Soubory aplikace %$1s nebyly řádně nahrazeny. Ujistěte se, že je to verze kompatibilní se serverem.",
"Sample configuration detected" : "Byla detekována vzorová konfigurace",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Pravděpodobně byla zkopírována konfigurační nastavení ze vzorových souborů. Toto není podporováno a může poškodit vaši instalaci. Nahlédněte prosím do dokumentace před prováděním změn v souboru config.php",
+ "%1$s and %2$s" : "%1$s a %2$s",
+ "%1$s, %2$s and %3$s" : "%1$s, %2$s a %3$s",
+ "%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s a %4$s",
+ "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s a %5$s",
"PHP %s or higher is required." : "Je vyžadováno PHP %s nebo vyšší.",
"PHP with a version lower than %s is required." : "Je vyžadováno PHP ve verzi nižší než %s.",
"%sbit or higher PHP required." : "Je vyžadováno PHP %sbit nebo vyšší.",
@@ -222,14 +226,6 @@
"Recommended" : "Doporučené",
"Microsoft Windows Platform is not supported" : "Platforma Microsoft Windows není podporována",
"Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "Provozování Nextcloud Serveru na platformě Microsoft Windows není podporováno. Doporučujeme, abyste použili linuxový server ve virtuálním stroji, pokud nemáte možnost server migrovat.",
- "Storage not available" : "Úložiště není dostupné",
- "ownCloud %s or higher is required." : "Vyžadován ownCloud %s nebo vyšší.",
- "ownCloud %s or lower is required." : "Vyžadován ownCloud %s nebo nižší.",
- "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "Aplikaci \"%s\" nelze nainstalovat, protože není kompatibilní s touto verzí Nextcloud.",
- "App can't be installed because it is not compatible with this version of Nextcloud" : "Aplikaci nelze nainstalovat, protože není kompatibilní s touto verzí Nextcloud",
- "App can't be installed because the version in info.xml/version is not the same as the version reported from the app store" : "Aplikace nemůže být nainstalována, protože verze uvedená v info.xml/version nesouhlasí s verzí hlášenou z úložiště aplikací.",
- "Hint: You can speed up the upgrade by executing this SQL command manually: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;" : "Tip: Aktualizaci můžete urychlit manuálním spuštěním následujícího SQL příkazu: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;",
- "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on <a href=\"%s\">%s</a>. For migrating existing installations to Linux you can find some tips and a migration script in <a href=\"%s\">our documentation</a>." : "Provozování Nextcloud Serveru na platformě Microsoft Windows není podporováno. Doporučujeme, abyste použili linuxový server ve virtuálním stroji, pokud nemáte možnost migrovat server jako takový. Linuxové balíčky i jednoduše použitelné obrazy virtuálních strojů lze nalézt na <a href=\"%s\">%s</a>. Pro migraci stávajících instalací na Linux můžete nalézt tipy a migrační skript v <a href=\"%s\">naší dokumentaci</a>.",
- "This can usually be fixed by <a href=\"%s\" target=\"_blank\">giving the webserver write access to the root directory</a>." : "Toto může být obvykle opraveno <a href=\"%s\" target=\"_blank\">nastavením přístupových práv webového serveru pro zápis do kořenového adresáře</a>."
+ "Storage not available" : "Úložiště není dostupné"
},"pluralForm" :"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"
} \ No newline at end of file
diff --git a/lib/l10n/de.js b/lib/l10n/de.js
index f5f30f70768..79a8ee25510 100644
--- a/lib/l10n/de.js
+++ b/lib/l10n/de.js
@@ -228,14 +228,6 @@ OC.L10N.register(
"Recommended" : "Empfohlen",
"Microsoft Windows Platform is not supported" : "Microsoft Windows-Plattform wird nicht unterstützt",
"Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "Der Betrieb eines Nextcloud-Servers unter Microsoft Windows ist nicht unterstützt. Bitte ziehein Betracht einen Linux-Server im Rahmen einer virtuellen Maschine aufzusetzen, wenn du keine Möglichkeit hast, den Server selbst zu migrieren.",
- "Storage not available" : "Speicher nicht verfügbar",
- "ownCloud %s or higher is required." : "ownCloud %s oder höher ist erforderlich.",
- "ownCloud %s or lower is required." : "ownCloud %s oder niedriger ist erforderlich.",
- "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "Die App \"%s\" kann nicht installiert werden, da sie mit dieser Version von Nextcloud nicht kompatibel ist.",
- "App can't be installed because it is not compatible with this version of Nextcloud" : "Die App kann nicht installiert werden, da sie mit dieser Version von Nextcloud nicht kompatibel ist",
- "App can't be installed because the version in info.xml/version is not the same as the version reported from the app store" : "App kann nicht installiert werden, da die in info.xml/version angegebene Version von der vom App-Store berichteten abweicht",
- "Hint: You can speed up the upgrade by executing this SQL command manually: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;" : "Tipp: Du kannst die Aktualisierung beschleunigen indem Du folgenden SQL-Befehl manuell ausführst: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;",
- "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on <a href=\"%s\">%s</a>. For migrating existing installations to Linux you can find some tips and a migration script in <a href=\"%s\">our documentation</a>." : "Der Betrieb eines Nextcloud-Servers unter Microsoft Windows ist nicht unterstützt. Bitte ziehe Betracht einen Linux-Server im Rahmen einer virtuellen Maschine aufzusetzen, wenn du keine Möglichkeit hast, den Server selbst zu migrieren. Finde Linux-Pakete sowie einfach bereitzustellende Images für virtuelle Maschinen unter <a href=\"%s\">%s</a>. Zur Migration existierender Installationen auf Linux findest du in unserer <a href=\"%s\">our Dokumentation</a> einige Tipps und Migrationsscripts.",
- "This can usually be fixed by <a href=\"%s\" target=\"_blank\">giving the webserver write access to the root directory</a>." : "Dies kann normalerweise repariert werden, indem dem Webserver <a href=\"%s\" target=\"_blank\">Schreibzugriff auf das Wurzelverzeichnis gegeben wird</a>."
+ "Storage not available" : "Speicher nicht verfügbar"
},
"nplurals=2; plural=(n != 1);");
diff --git a/lib/l10n/de.json b/lib/l10n/de.json
index f3bf892579e..180680c2b97 100644
--- a/lib/l10n/de.json
+++ b/lib/l10n/de.json
@@ -226,14 +226,6 @@
"Recommended" : "Empfohlen",
"Microsoft Windows Platform is not supported" : "Microsoft Windows-Plattform wird nicht unterstützt",
"Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "Der Betrieb eines Nextcloud-Servers unter Microsoft Windows ist nicht unterstützt. Bitte ziehein Betracht einen Linux-Server im Rahmen einer virtuellen Maschine aufzusetzen, wenn du keine Möglichkeit hast, den Server selbst zu migrieren.",
- "Storage not available" : "Speicher nicht verfügbar",
- "ownCloud %s or higher is required." : "ownCloud %s oder höher ist erforderlich.",
- "ownCloud %s or lower is required." : "ownCloud %s oder niedriger ist erforderlich.",
- "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "Die App \"%s\" kann nicht installiert werden, da sie mit dieser Version von Nextcloud nicht kompatibel ist.",
- "App can't be installed because it is not compatible with this version of Nextcloud" : "Die App kann nicht installiert werden, da sie mit dieser Version von Nextcloud nicht kompatibel ist",
- "App can't be installed because the version in info.xml/version is not the same as the version reported from the app store" : "App kann nicht installiert werden, da die in info.xml/version angegebene Version von der vom App-Store berichteten abweicht",
- "Hint: You can speed up the upgrade by executing this SQL command manually: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;" : "Tipp: Du kannst die Aktualisierung beschleunigen indem Du folgenden SQL-Befehl manuell ausführst: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;",
- "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on <a href=\"%s\">%s</a>. For migrating existing installations to Linux you can find some tips and a migration script in <a href=\"%s\">our documentation</a>." : "Der Betrieb eines Nextcloud-Servers unter Microsoft Windows ist nicht unterstützt. Bitte ziehe Betracht einen Linux-Server im Rahmen einer virtuellen Maschine aufzusetzen, wenn du keine Möglichkeit hast, den Server selbst zu migrieren. Finde Linux-Pakete sowie einfach bereitzustellende Images für virtuelle Maschinen unter <a href=\"%s\">%s</a>. Zur Migration existierender Installationen auf Linux findest du in unserer <a href=\"%s\">our Dokumentation</a> einige Tipps und Migrationsscripts.",
- "This can usually be fixed by <a href=\"%s\" target=\"_blank\">giving the webserver write access to the root directory</a>." : "Dies kann normalerweise repariert werden, indem dem Webserver <a href=\"%s\" target=\"_blank\">Schreibzugriff auf das Wurzelverzeichnis gegeben wird</a>."
+ "Storage not available" : "Speicher nicht verfügbar"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/lib/l10n/de_DE.js b/lib/l10n/de_DE.js
index db3c63c2a32..794e2648b2b 100644
--- a/lib/l10n/de_DE.js
+++ b/lib/l10n/de_DE.js
@@ -53,7 +53,7 @@ OC.L10N.register(
"%s enter the database username." : "%s geben Sie den Datenbank-Benutzernamen an.",
"%s enter the database name." : "%s geben Sie den Datenbank-Namen an.",
"%s you may not use dots in the database name" : "%s Der Datenbank-Name darf keine Punkte enthalten",
- "Oracle connection could not be established" : "Die Oracle-Verbindung konnte nicht aufgebaut werden.",
+ "Oracle connection could not be established" : "Die Oracle-Verbindung konnte nicht hergestellt werden.",
"Oracle username and/or password not valid" : "Oracle-Benutzername und/oder -Passwort ungültig",
"DB Error: \"%s\"" : "DB-Fehler: „%s“",
"Offending command was: \"%s\"" : "Fehlerhafter Befehl war: „%s“",
@@ -65,7 +65,7 @@ OC.L10N.register(
"It seems that this %s instance is running on a 32-bit PHP environment and the open_basedir has been configured in php.ini. This will lead to problems with files over 4 GB and is highly discouraged." : "Es scheint, dass diese %s-Instanz unter einer 32-Bit-PHP-Umgebung läuft und open_basedir in der Datei php.ini konfiguriert worden ist. Von einem solchen Betrieb wird dringend abgeraten, weil es dabei zu Problemen mit Dateien kommt, deren Größe 4 GB übersteigt.",
"Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "Bitte entfernen Sie die open_basedir-Einstellung in Ihrer php.ini oder wechseln Sie zu 64-Bit-PHP.",
"Set an admin username." : "Einen Administrator-Benutzernamen setzen.",
- "Set an admin password." : "Setze Administrator Passwort",
+ "Set an admin password." : "Ein Administrator-Passwort setzen.",
"Can't create or write into the data directory %s" : "Das Datenverzeichnis %s kann nicht erstellt oder es kann darin nicht geschrieben werden.",
"Invalid Federated Cloud ID" : "Ungültige Federated-Cloud-ID",
"%s shared »%s« with you" : "%s hat „%s“ mit Ihnen geteilt",
@@ -153,7 +153,7 @@ OC.L10N.register(
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "Nur die folgenden Zeichen sind im Benutzernamen erlaubt: „a-z“, „A-Z“, „0-9“, and „_.@-'“",
"A valid username must be provided" : "Es muss ein gültiger Benutzername angegeben werden",
"Username contains whitespace at the beginning or at the end" : "Benutzername enthält Leerzeichen am Anfang oder Ende",
- "A valid password must be provided" : "Es muss ein gültiges Passwort angegeben werden",
+ "A valid password must be provided" : "Es muss ein gültiges Passwort eingegeben werden",
"The username is already being used" : "Der Benutzername existiert bereits",
"Login canceled by app" : "Anmeldung durch die App abgebrochen",
"User disabled" : "Nutzer deaktiviert",
@@ -167,17 +167,17 @@ OC.L10N.register(
"App '%s' could not be installed!" : "'%s' - App konnte nicht installiert werden!",
"App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "Die App „%s“ kann nicht installiert werden, da die folgenden Abhängigkeiten nicht erfüllt sind: %s",
"a safe home for all your data" : "ein sicherer Ort für all Ihre Daten",
- "File is currently busy, please try again later" : "Die Datei ist zur Zeit in Benutzung, bitte versuchen Sie es später noch einmal",
+ "File is currently busy, please try again later" : "Die Datei ist in Benutzung, bitte versuchen Sie es später noch einmal",
"Can't read file" : "Datei kann nicht gelesen werden",
"Application is not enabled" : "Die Anwendung ist nicht aktiviert",
"Authentication error" : "Authentifizierungsfehler",
"Token expired. Please reload page." : "Token abgelaufen. Bitte laden Sie die Seite neu.",
"Unknown user" : "Unbekannter Benutzer",
"No database drivers (sqlite, mysql, or postgresql) installed." : "Keine Datenbanktreiber (SQLite, MYSQL oder PostgreSQL) installiert.",
- "Cannot write into \"config\" directory" : "Das Schreiben in das „config“-Verzeichnis ist nicht möglich",
- "Cannot write into \"apps\" directory" : "Das Schreiben in das „apps“-Verzeichnis ist nicht möglich",
+ "Cannot write into \"config\" directory" : "Schreiben in das „config“-Verzeichnis ist nicht möglich",
+ "Cannot write into \"apps\" directory" : "Schreiben in das „apps“-Verzeichnis ist nicht möglich",
"This can usually be fixed by %sgiving the webserver write access to the apps directory%s or disabling the appstore in the config file." : "Dies kann normalerweise behoben werden, %sindem dem Webserver Schreibzugriff auf das App-Verzeichnis gegeben wird%s oder der App Store in der Konfigurationsdatei deaktiviert wird.",
- "Cannot create \"data\" directory (%s)" : "Das Erstellen des „data“-Verzeichnisses ist nicht möglich (%s)",
+ "Cannot create \"data\" directory (%s)" : "Erstellen des „data“-Verzeichnisses ist nicht möglich (%s)",
"This can usually be fixed by <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">giving the webserver write access to the root directory</a>." : "Dies kann normalerweise repariert werden, indem dem Webserver <a href=\"%s\" target=\"_blank\">Schreibzugriff auf das Wurzelverzeichnis gegeben wird</a>.",
"Permissions can usually be fixed by %sgiving the webserver write access to the root directory%s." : "Berechtigungen können normalerweise repariert werden, indem dem Webserver %s Schreibzugriff auf das Wurzelverzeichnis %s gegeben wird.",
"Setting locale to %s failed" : "Das Setzen der Umgebungslokale auf %s fehlgeschlagen",
@@ -217,7 +217,7 @@ OC.L10N.register(
"No path specified when installing app from local file" : "Bei der Installation der Applikation aus einer lokalen Datei wurde kein Pfad angegeben",
"Archives of type %s are not supported" : "Archive des Typs %s werden nicht unterstützt.",
"Failed to open archive when installing app" : "Das Archiv konnte bei der Installation der Applikation nicht geöffnet werden",
- "App does not provide an info.xml file" : "Die Applikation enthält keine info.xml Datei",
+ "App does not provide an info.xml file" : "Die Anwendung enthält keine info.xml Datei",
"App cannot be installed because appinfo file cannot be read." : "Die Anwendung kann nicht installiert werden, weil die Anwendungsinfodatei nicht gelesen werden kann.",
"Signature could not get checked. Please contact the app developer and check your admin screen." : "Signatur konnte nicht überprüft werden. Bitte kontaktieren Sie den App Entwickler und überprüfen Sie Ihren Administrationsbereich.",
"App can't be installed because of not allowed code in the App" : "Die App kann nicht installiert werden, weil sie unerlaubten Code enthält",
@@ -228,14 +228,6 @@ OC.L10N.register(
"Recommended" : "Empfohlen",
"Microsoft Windows Platform is not supported" : "Microsoft Windows-Plattform wird nicht unterstützt",
"Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "Der Betrieb eines Nextcloud Servers unter Microsoft Windows ist nicht unterstützt. Bitte ziehen Sie in Betracht einen Linux Server im Rahmen einer virtuellen Maschine aufzusetzen, wenn Sie keine Möglichkeit haben, den Server selbst zu migrieren.",
- "Storage not available" : "Speicher nicht verfügbar",
- "ownCloud %s or higher is required." : "ownCloud %s oder neuer erforderlich",
- "ownCloud %s or lower is required." : "ownCloud %s oder älter erforderlich",
- "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "Die App \"%s\" kann nicht installiert werden, da sie mit dieser Version von Nextcloud nicht kompatibel ist.",
- "App can't be installed because it is not compatible with this version of Nextcloud" : "Die App kann nicht installiert werden, da sie mit dieser Version von Nextcloud nicht kompatibel ist",
- "App can't be installed because the version in info.xml/version is not the same as the version reported from the app store" : "App kann nicht installiert werden, da die in info.xml/version angegebene Version von der vom App-Store berichteten abweicht",
- "Hint: You can speed up the upgrade by executing this SQL command manually: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;" : "Tipp: Sie können die Aktualisierung beschleunigen indem Sie folgenden SQL-Befehl manuell ausführen: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;",
- "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on <a href=\"%s\">%s</a>. For migrating existing installations to Linux you can find some tips and a migration script in <a href=\"%s\">our documentation</a>." : "Der Betrieb eines Nextcloud-Servers unter Microsoft Windows ist nicht unterstützt. Bitte ziehen Sie Betracht einen Linux-Server im Rahmen einer virtuellen Maschine aufzusetzen, wenn Sie keine Möglichkeit haben, den Server selbst zu migrieren. Finden Sie Linux-Pakete sowie einfach bereitzustellende Images für virtuelle Maschinen unter <a href=\"%s\">%s</a>. Zur Migration existierender Installationen auf Linux finden Sie in unserer <a href=\"%s\">unserer Dokumentation</a> einige Tipps und Migrationsscripts.",
- "This can usually be fixed by <a href=\"%s\" target=\"_blank\">giving the webserver write access to the root directory</a>." : "Dies kann normalerweise repariert werden, indem dem Webserver <a href=\"%s\" target=\"_blank\" > Schreibzugriff auf das Wurzelverzeichnis gegeben wird</a>."
+ "Storage not available" : "Speicher nicht verfügbar"
},
"nplurals=2; plural=(n != 1);");
diff --git a/lib/l10n/de_DE.json b/lib/l10n/de_DE.json
index 1df6854ae9b..6228b9645ac 100644
--- a/lib/l10n/de_DE.json
+++ b/lib/l10n/de_DE.json
@@ -51,7 +51,7 @@
"%s enter the database username." : "%s geben Sie den Datenbank-Benutzernamen an.",
"%s enter the database name." : "%s geben Sie den Datenbank-Namen an.",
"%s you may not use dots in the database name" : "%s Der Datenbank-Name darf keine Punkte enthalten",
- "Oracle connection could not be established" : "Die Oracle-Verbindung konnte nicht aufgebaut werden.",
+ "Oracle connection could not be established" : "Die Oracle-Verbindung konnte nicht hergestellt werden.",
"Oracle username and/or password not valid" : "Oracle-Benutzername und/oder -Passwort ungültig",
"DB Error: \"%s\"" : "DB-Fehler: „%s“",
"Offending command was: \"%s\"" : "Fehlerhafter Befehl war: „%s“",
@@ -63,7 +63,7 @@
"It seems that this %s instance is running on a 32-bit PHP environment and the open_basedir has been configured in php.ini. This will lead to problems with files over 4 GB and is highly discouraged." : "Es scheint, dass diese %s-Instanz unter einer 32-Bit-PHP-Umgebung läuft und open_basedir in der Datei php.ini konfiguriert worden ist. Von einem solchen Betrieb wird dringend abgeraten, weil es dabei zu Problemen mit Dateien kommt, deren Größe 4 GB übersteigt.",
"Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "Bitte entfernen Sie die open_basedir-Einstellung in Ihrer php.ini oder wechseln Sie zu 64-Bit-PHP.",
"Set an admin username." : "Einen Administrator-Benutzernamen setzen.",
- "Set an admin password." : "Setze Administrator Passwort",
+ "Set an admin password." : "Ein Administrator-Passwort setzen.",
"Can't create or write into the data directory %s" : "Das Datenverzeichnis %s kann nicht erstellt oder es kann darin nicht geschrieben werden.",
"Invalid Federated Cloud ID" : "Ungültige Federated-Cloud-ID",
"%s shared »%s« with you" : "%s hat „%s“ mit Ihnen geteilt",
@@ -151,7 +151,7 @@
"Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "Nur die folgenden Zeichen sind im Benutzernamen erlaubt: „a-z“, „A-Z“, „0-9“, and „_.@-'“",
"A valid username must be provided" : "Es muss ein gültiger Benutzername angegeben werden",
"Username contains whitespace at the beginning or at the end" : "Benutzername enthält Leerzeichen am Anfang oder Ende",
- "A valid password must be provided" : "Es muss ein gültiges Passwort angegeben werden",
+ "A valid password must be provided" : "Es muss ein gültiges Passwort eingegeben werden",
"The username is already being used" : "Der Benutzername existiert bereits",
"Login canceled by app" : "Anmeldung durch die App abgebrochen",
"User disabled" : "Nutzer deaktiviert",
@@ -165,17 +165,17 @@
"App '%s' could not be installed!" : "'%s' - App konnte nicht installiert werden!",
"App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "Die App „%s“ kann nicht installiert werden, da die folgenden Abhängigkeiten nicht erfüllt sind: %s",
"a safe home for all your data" : "ein sicherer Ort für all Ihre Daten",
- "File is currently busy, please try again later" : "Die Datei ist zur Zeit in Benutzung, bitte versuchen Sie es später noch einmal",
+ "File is currently busy, please try again later" : "Die Datei ist in Benutzung, bitte versuchen Sie es später noch einmal",
"Can't read file" : "Datei kann nicht gelesen werden",
"Application is not enabled" : "Die Anwendung ist nicht aktiviert",
"Authentication error" : "Authentifizierungsfehler",
"Token expired. Please reload page." : "Token abgelaufen. Bitte laden Sie die Seite neu.",
"Unknown user" : "Unbekannter Benutzer",
"No database drivers (sqlite, mysql, or postgresql) installed." : "Keine Datenbanktreiber (SQLite, MYSQL oder PostgreSQL) installiert.",
- "Cannot write into \"config\" directory" : "Das Schreiben in das „config“-Verzeichnis ist nicht möglich",
- "Cannot write into \"apps\" directory" : "Das Schreiben in das „apps“-Verzeichnis ist nicht möglich",
+ "Cannot write into \"config\" directory" : "Schreiben in das „config“-Verzeichnis ist nicht möglich",
+ "Cannot write into \"apps\" directory" : "Schreiben in das „apps“-Verzeichnis ist nicht möglich",
"This can usually be fixed by %sgiving the webserver write access to the apps directory%s or disabling the appstore in the config file." : "Dies kann normalerweise behoben werden, %sindem dem Webserver Schreibzugriff auf das App-Verzeichnis gegeben wird%s oder der App Store in der Konfigurationsdatei deaktiviert wird.",
- "Cannot create \"data\" directory (%s)" : "Das Erstellen des „data“-Verzeichnisses ist nicht möglich (%s)",
+ "Cannot create \"data\" directory (%s)" : "Erstellen des „data“-Verzeichnisses ist nicht möglich (%s)",
"This can usually be fixed by <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">giving the webserver write access to the root directory</a>." : "Dies kann normalerweise repariert werden, indem dem Webserver <a href=\"%s\" target=\"_blank\">Schreibzugriff auf das Wurzelverzeichnis gegeben wird</a>.",
"Permissions can usually be fixed by %sgiving the webserver write access to the root directory%s." : "Berechtigungen können normalerweise repariert werden, indem dem Webserver %s Schreibzugriff auf das Wurzelverzeichnis %s gegeben wird.",
"Setting locale to %s failed" : "Das Setzen der Umgebungslokale auf %s fehlgeschlagen",
@@ -215,7 +215,7 @@
"No path specified when installing app from local file" : "Bei der Installation der Applikation aus einer lokalen Datei wurde kein Pfad angegeben",
"Archives of type %s are not supported" : "Archive des Typs %s werden nicht unterstützt.",
"Failed to open archive when installing app" : "Das Archiv konnte bei der Installation der Applikation nicht geöffnet werden",
- "App does not provide an info.xml file" : "Die Applikation enthält keine info.xml Datei",
+ "App does not provide an info.xml file" : "Die Anwendung enthält keine info.xml Datei",
"App cannot be installed because appinfo file cannot be read." : "Die Anwendung kann nicht installiert werden, weil die Anwendungsinfodatei nicht gelesen werden kann.",
"Signature could not get checked. Please contact the app developer and check your admin screen." : "Signatur konnte nicht überprüft werden. Bitte kontaktieren Sie den App Entwickler und überprüfen Sie Ihren Administrationsbereich.",
"App can't be installed because of not allowed code in the App" : "Die App kann nicht installiert werden, weil sie unerlaubten Code enthält",
@@ -226,14 +226,6 @@
"Recommended" : "Empfohlen",
"Microsoft Windows Platform is not supported" : "Microsoft Windows-Plattform wird nicht unterstützt",
"Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "Der Betrieb eines Nextcloud Servers unter Microsoft Windows ist nicht unterstützt. Bitte ziehen Sie in Betracht einen Linux Server im Rahmen einer virtuellen Maschine aufzusetzen, wenn Sie keine Möglichkeit haben, den Server selbst zu migrieren.",
- "Storage not available" : "Speicher nicht verfügbar",
- "ownCloud %s or higher is required." : "ownCloud %s oder neuer erforderlich",
- "ownCloud %s or lower is required." : "ownCloud %s oder älter erforderlich",
- "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "Die App \"%s\" kann nicht installiert werden, da sie mit dieser Version von Nextcloud nicht kompatibel ist.",
- "App can't be installed because it is not compatible with this version of Nextcloud" : "Die App kann nicht installiert werden, da sie mit dieser Version von Nextcloud nicht kompatibel ist",
- "App can't be installed because the version in info.xml/version is not the same as the version reported from the app store" : "App kann nicht installiert werden, da die in info.xml/version angegebene Version von der vom App-Store berichteten abweicht",
- "Hint: You can speed up the upgrade by executing this SQL command manually: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;" : "Tipp: Sie können die Aktualisierung beschleunigen indem Sie folgenden SQL-Befehl manuell ausführen: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;",
- "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on <a href=\"%s\">%s</a>. For migrating existing installations to Linux you can find some tips and a migration script in <a href=\"%s\">our documentation</a>." : "Der Betrieb eines Nextcloud-Servers unter Microsoft Windows ist nicht unterstützt. Bitte ziehen Sie Betracht einen Linux-Server im Rahmen einer virtuellen Maschine aufzusetzen, wenn Sie keine Möglichkeit haben, den Server selbst zu migrieren. Finden Sie Linux-Pakete sowie einfach bereitzustellende Images für virtuelle Maschinen unter <a href=\"%s\">%s</a>. Zur Migration existierender Installationen auf Linux finden Sie in unserer <a href=\"%s\">unserer Dokumentation</a> einige Tipps und Migrationsscripts.",
- "This can usually be fixed by <a href=\"%s\" target=\"_blank\">giving the webserver write access to the root directory</a>." : "Dies kann normalerweise repariert werden, indem dem Webserver <a href=\"%s\" target=\"_blank\" > Schreibzugriff auf das Wurzelverzeichnis gegeben wird</a>."
+ "Storage not available" : "Speicher nicht verfügbar"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/lib/l10n/es.js b/lib/l10n/es.js
index 6119a9cebb1..80756b58b5c 100644
--- a/lib/l10n/es.js
+++ b/lib/l10n/es.js
@@ -228,14 +228,6 @@ OC.L10N.register(
"Recommended" : "Recomendado",
"Microsoft Windows Platform is not supported" : "La plataforma Microsoft Windows no está soportada",
"Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "Ejecutar el servidor Nextcloud en la plataforma MIcrosoft Windows no está soportado. Sugerimos usar un servidor Linux en una máquina virtual si no existe la opción de migrar el propio servidor.",
- "Storage not available" : "Almacenamiento no disponible",
- "ownCloud %s or higher is required." : "Se necesita la versión %s o superior.",
- "ownCloud %s or lower is required." : "Se necesita la versión %s o inferior.",
- "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "La aplicación \"%s\" no se puede instalar porque no es compatible con esta versión de Nextcloud.",
- "App can't be installed because it is not compatible with this version of Nextcloud" : "La aplicación no se puede instalar porque no es compatible con esta versión de Nextcloud",
- "App can't be installed because the version in info.xml/version is not the same as the version reported from the app store" : "La App no se puede instalar debido a que la versión de info.xml no es la misma que la versión informada por la app store.",
- "Hint: You can speed up the upgrade by executing this SQL command manually: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;" : "Truco: Se puede acelerar la actualización ejecutando este comando SQL de forma manual: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;",
- "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on <a href=\"%s\">%s</a>. For migrating existing installations to Linux you can find some tips and a migration script in <a href=\"%s\">our documentation</a>." : "Ejecutar el servidor Nextcloud en la plataforma Microsoft Windows no está soportado. Sugerimos usar una servidor Linux en una máquina virtual si no existe la opción de migrar el propio servidor. Se encuentran paquetes, así como imágenes en de máquina virtual fáciles de desplegar en <a href=\"%s\">%s</a>. Para migrar instalaciones existentes a Linux se pueden encontrar algunas pistas y un script de migración en <a href=\"%s\">nuestra documentación</a>.",
- "This can usually be fixed by <a href=\"%s\" target=\"_blank\">giving the webserver write access to the root directory</a>." : "Esto normalmente puede arreglarse <a href=\"%s\" target=\"_blank\">dando al servidor web acceso de escritura al directorio raíz</a>."
+ "Storage not available" : "Almacenamiento no disponible"
},
"nplurals=2; plural=(n != 1);");
diff --git a/lib/l10n/es.json b/lib/l10n/es.json
index 0f9d83569b7..2ea8a94e8dd 100644
--- a/lib/l10n/es.json
+++ b/lib/l10n/es.json
@@ -226,14 +226,6 @@
"Recommended" : "Recomendado",
"Microsoft Windows Platform is not supported" : "La plataforma Microsoft Windows no está soportada",
"Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "Ejecutar el servidor Nextcloud en la plataforma MIcrosoft Windows no está soportado. Sugerimos usar un servidor Linux en una máquina virtual si no existe la opción de migrar el propio servidor.",
- "Storage not available" : "Almacenamiento no disponible",
- "ownCloud %s or higher is required." : "Se necesita la versión %s o superior.",
- "ownCloud %s or lower is required." : "Se necesita la versión %s o inferior.",
- "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "La aplicación \"%s\" no se puede instalar porque no es compatible con esta versión de Nextcloud.",
- "App can't be installed because it is not compatible with this version of Nextcloud" : "La aplicación no se puede instalar porque no es compatible con esta versión de Nextcloud",
- "App can't be installed because the version in info.xml/version is not the same as the version reported from the app store" : "La App no se puede instalar debido a que la versión de info.xml no es la misma que la versión informada por la app store.",
- "Hint: You can speed up the upgrade by executing this SQL command manually: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;" : "Truco: Se puede acelerar la actualización ejecutando este comando SQL de forma manual: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;",
- "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on <a href=\"%s\">%s</a>. For migrating existing installations to Linux you can find some tips and a migration script in <a href=\"%s\">our documentation</a>." : "Ejecutar el servidor Nextcloud en la plataforma Microsoft Windows no está soportado. Sugerimos usar una servidor Linux en una máquina virtual si no existe la opción de migrar el propio servidor. Se encuentran paquetes, así como imágenes en de máquina virtual fáciles de desplegar en <a href=\"%s\">%s</a>. Para migrar instalaciones existentes a Linux se pueden encontrar algunas pistas y un script de migración en <a href=\"%s\">nuestra documentación</a>.",
- "This can usually be fixed by <a href=\"%s\" target=\"_blank\">giving the webserver write access to the root directory</a>." : "Esto normalmente puede arreglarse <a href=\"%s\" target=\"_blank\">dando al servidor web acceso de escritura al directorio raíz</a>."
+ "Storage not available" : "Almacenamiento no disponible"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/lib/l10n/fr.js b/lib/l10n/fr.js
index c938c8e8ab7..96d77556deb 100644
--- a/lib/l10n/fr.js
+++ b/lib/l10n/fr.js
@@ -57,7 +57,7 @@ OC.L10N.register(
"Oracle username and/or password not valid" : "Nom d'utilisateur et/ou mot de passe de la base Oracle non valide(s)",
"DB Error: \"%s\"" : "Erreur de la base de données : \"%s\"",
"Offending command was: \"%s\"" : "La requête en cause est : \"%s\"",
- "You need to enter either an existing account or the administrator." : "Vous devez spécifier le nom d'un compte existant, ou celui de l'administrateur.",
+ "You need to enter either an existing account or the administrator." : "Vous devez indiquer un compte existant ou celui de l'administrateur.",
"Offending command was: \"%s\", name: %s, password: %s" : "La requête en cause est : \"%s\", nom : %s, mot de passe : %s",
"PostgreSQL username and/or password not valid" : "Nom d'utilisateur et/ou mot de passe de la base PostgreSQL non valide(s)",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X n'est pas pris en charge et %s ne fonctionnera pas correctement sur cette plate-forme. Son utilisation est à vos risques et périls !",
@@ -228,14 +228,6 @@ OC.L10N.register(
"Recommended" : "Recommandée",
"Microsoft Windows Platform is not supported" : "La plate-forme Microsoft Windows n'est pas prise en charge.",
"Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "L'exécution de Nextcloud Server sur une plateforme Microsoft Windows n'est pas supportée. Nous suggérons d'utilier un serveur Linux dans une machine virtuelle si vous n'avez pas la possibilité de migrer le serveur lui-même.",
- "Storage not available" : "Support de stockage non disponible",
- "ownCloud %s or higher is required." : "Nextcloud %s ou supérieur est requis.",
- "ownCloud %s or lower is required." : "Nextcloud %s ou inférieur est requis.",
- "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "L'application \"%s\" ne peut être installée car elle n'est pas compatible avec cette version de Nextcloud.",
- "App can't be installed because it is not compatible with this version of Nextcloud" : "L'application ne peut être installée car elle n'est pas compatible avec cette version de Nextcloud",
- "App can't be installed because the version in info.xml/version is not the same as the version reported from the app store" : "L'application ne peut être installée car la version dans info.xml/version n'est pas la même que la version signalée sur l'app store",
- "Hint: You can speed up the upgrade by executing this SQL command manually: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;" : "Aide : Vous pouvez accélérer la mise à jour en exécutant manuellement la commande SQL suivante : ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;",
- "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on <a href=\"%s\">%s</a>. For migrating existing installations to Linux you can find some tips and a migration script in <a href=\"%s\">our documentation</a>." : "Exécuter Nextcloud Server sur une plateforme Microsoft Windows n'est pas supporté. Nous vous suggérons d'utiliser un serveur Linux dans une machine virtuelle si vous n'avez pas l'option de migrer votre serveur. Trouver les paquets Linux aussi facilement que de déployer une image de machine virtuelle sur <a href=\"%s\">%s</a>. Pour migrer vos installations existantes sur Linux, vous pouvez trouver plein d'astuces et un script de migration sur <a href=\"%s\">notre documentation</a>.",
- "This can usually be fixed by <a href=\"%s\" target=\"_blank\">giving the webserver write access to the root directory</a>." : "Ce problème est généralement résolu en <a href=\"%s\" target=\"_blank\">donnant les accès en écriture dans le répertoire root</a>."
+ "Storage not available" : "Support de stockage non disponible"
},
"nplurals=2; plural=(n > 1);");
diff --git a/lib/l10n/fr.json b/lib/l10n/fr.json
index 09e0cfb9c46..a9b89108b70 100644
--- a/lib/l10n/fr.json
+++ b/lib/l10n/fr.json
@@ -55,7 +55,7 @@
"Oracle username and/or password not valid" : "Nom d'utilisateur et/ou mot de passe de la base Oracle non valide(s)",
"DB Error: \"%s\"" : "Erreur de la base de données : \"%s\"",
"Offending command was: \"%s\"" : "La requête en cause est : \"%s\"",
- "You need to enter either an existing account or the administrator." : "Vous devez spécifier le nom d'un compte existant, ou celui de l'administrateur.",
+ "You need to enter either an existing account or the administrator." : "Vous devez indiquer un compte existant ou celui de l'administrateur.",
"Offending command was: \"%s\", name: %s, password: %s" : "La requête en cause est : \"%s\", nom : %s, mot de passe : %s",
"PostgreSQL username and/or password not valid" : "Nom d'utilisateur et/ou mot de passe de la base PostgreSQL non valide(s)",
"Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X n'est pas pris en charge et %s ne fonctionnera pas correctement sur cette plate-forme. Son utilisation est à vos risques et périls !",
@@ -226,14 +226,6 @@
"Recommended" : "Recommandée",
"Microsoft Windows Platform is not supported" : "La plate-forme Microsoft Windows n'est pas prise en charge.",
"Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "L'exécution de Nextcloud Server sur une plateforme Microsoft Windows n'est pas supportée. Nous suggérons d'utilier un serveur Linux dans une machine virtuelle si vous n'avez pas la possibilité de migrer le serveur lui-même.",
- "Storage not available" : "Support de stockage non disponible",
- "ownCloud %s or higher is required." : "Nextcloud %s ou supérieur est requis.",
- "ownCloud %s or lower is required." : "Nextcloud %s ou inférieur est requis.",
- "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "L'application \"%s\" ne peut être installée car elle n'est pas compatible avec cette version de Nextcloud.",
- "App can't be installed because it is not compatible with this version of Nextcloud" : "L'application ne peut être installée car elle n'est pas compatible avec cette version de Nextcloud",
- "App can't be installed because the version in info.xml/version is not the same as the version reported from the app store" : "L'application ne peut être installée car la version dans info.xml/version n'est pas la même que la version signalée sur l'app store",
- "Hint: You can speed up the upgrade by executing this SQL command manually: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;" : "Aide : Vous pouvez accélérer la mise à jour en exécutant manuellement la commande SQL suivante : ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;",
- "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on <a href=\"%s\">%s</a>. For migrating existing installations to Linux you can find some tips and a migration script in <a href=\"%s\">our documentation</a>." : "Exécuter Nextcloud Server sur une plateforme Microsoft Windows n'est pas supporté. Nous vous suggérons d'utiliser un serveur Linux dans une machine virtuelle si vous n'avez pas l'option de migrer votre serveur. Trouver les paquets Linux aussi facilement que de déployer une image de machine virtuelle sur <a href=\"%s\">%s</a>. Pour migrer vos installations existantes sur Linux, vous pouvez trouver plein d'astuces et un script de migration sur <a href=\"%s\">notre documentation</a>.",
- "This can usually be fixed by <a href=\"%s\" target=\"_blank\">giving the webserver write access to the root directory</a>." : "Ce problème est généralement résolu en <a href=\"%s\" target=\"_blank\">donnant les accès en écriture dans le répertoire root</a>."
+ "Storage not available" : "Support de stockage non disponible"
},"pluralForm" :"nplurals=2; plural=(n > 1);"
} \ No newline at end of file
diff --git a/lib/l10n/hu_HU.js b/lib/l10n/hu_HU.js
index b38cc75a14b..1ca8068cf77 100644
--- a/lib/l10n/hu_HU.js
+++ b/lib/l10n/hu_HU.js
@@ -228,14 +228,6 @@ OC.L10N.register(
"Recommended" : "Ajánlott",
"Microsoft Windows Platform is not supported" : "Microsoft Windows platform nem támogatott",
"Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "A Nextcloud Server Microsoft Windows platformon való futtatása nem támogatott. Ha nincs más lehetőséged a szerver migrációjára, akkor javasoljuk, hogy Linux szervert használj virtuális gépben.",
- "Storage not available" : "A tároló elérhetetlen.",
- "ownCloud %s or higher is required." : "ownCloud %s vagy újabb szükséges.",
- "ownCloud %s or lower is required." : "ownCloud %s vagy régebbi szükséges.",
- "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "\"%s\" alkalmazás nem telepíthető, mert nem kompatibilis az Nextcloud ezen verziójával",
- "App can't be installed because it is not compatible with this version of Nextcloud" : "Az alkalmazás nem telepíthető, mert nem kompatibilis az Nextcloud ezen verziójával",
- "App can't be installed because the version in info.xml/version is not the same as the version reported from the app store" : "Az alkalmazás nem telepíthető, mert az info.xml/version részben tárolt verzió nem egyezik meg az alkalmazás boltban elérhető verzióval",
- "Hint: You can speed up the upgrade by executing this SQL command manually: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;" : "Tipp: A következő SQL parancs segítségével manuálisan felgyorsíthatod a frissítést: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;",
- "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on <a href=\"%s\">%s</a>. For migrating existing installations to Linux you can find some tips and a migration script in <a href=\"%s\">our documentation</a>." : "A Nextcloud Server Microsoft Windows platformon való futtatása nem támogatott. Ha nincs más lehetőséged a szerver migrációjára, akkor javasoljuk, hogy Linux szervert használj virtuális gépben. Linux csomagokat és könnyen üzembe helyezhető virtuális gép képfájlokat itt találhatsz: <a href=\"%s\">%s</a>. Létező telepítések Linux migrációjához tippeket és migrációs szkriptet a <a href=\"%s\">dokumentációban</a> találhatsz.",
- "This can usually be fixed by <a href=\"%s\" target=\"_blank\">giving the webserver write access to the root directory</a>." : "Ez általában úgy javítható, hogy <a href=\"%s\" target=\"_blank\">a webszervernek írási jogosultságot adsz a root könyvtárra</a>."
+ "Storage not available" : "A tároló elérhetetlen."
},
"nplurals=2; plural=(n != 1);");
diff --git a/lib/l10n/hu_HU.json b/lib/l10n/hu_HU.json
index 8ff08b4f6da..a3f22bc7d5b 100644
--- a/lib/l10n/hu_HU.json
+++ b/lib/l10n/hu_HU.json
@@ -226,14 +226,6 @@
"Recommended" : "Ajánlott",
"Microsoft Windows Platform is not supported" : "Microsoft Windows platform nem támogatott",
"Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "A Nextcloud Server Microsoft Windows platformon való futtatása nem támogatott. Ha nincs más lehetőséged a szerver migrációjára, akkor javasoljuk, hogy Linux szervert használj virtuális gépben.",
- "Storage not available" : "A tároló elérhetetlen.",
- "ownCloud %s or higher is required." : "ownCloud %s vagy újabb szükséges.",
- "ownCloud %s or lower is required." : "ownCloud %s vagy régebbi szükséges.",
- "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "\"%s\" alkalmazás nem telepíthető, mert nem kompatibilis az Nextcloud ezen verziójával",
- "App can't be installed because it is not compatible with this version of Nextcloud" : "Az alkalmazás nem telepíthető, mert nem kompatibilis az Nextcloud ezen verziójával",
- "App can't be installed because the version in info.xml/version is not the same as the version reported from the app store" : "Az alkalmazás nem telepíthető, mert az info.xml/version részben tárolt verzió nem egyezik meg az alkalmazás boltban elérhető verzióval",
- "Hint: You can speed up the upgrade by executing this SQL command manually: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;" : "Tipp: A következő SQL parancs segítségével manuálisan felgyorsíthatod a frissítést: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;",
- "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on <a href=\"%s\">%s</a>. For migrating existing installations to Linux you can find some tips and a migration script in <a href=\"%s\">our documentation</a>." : "A Nextcloud Server Microsoft Windows platformon való futtatása nem támogatott. Ha nincs más lehetőséged a szerver migrációjára, akkor javasoljuk, hogy Linux szervert használj virtuális gépben. Linux csomagokat és könnyen üzembe helyezhető virtuális gép képfájlokat itt találhatsz: <a href=\"%s\">%s</a>. Létező telepítések Linux migrációjához tippeket és migrációs szkriptet a <a href=\"%s\">dokumentációban</a> találhatsz.",
- "This can usually be fixed by <a href=\"%s\" target=\"_blank\">giving the webserver write access to the root directory</a>." : "Ez általában úgy javítható, hogy <a href=\"%s\" target=\"_blank\">a webszervernek írási jogosultságot adsz a root könyvtárra</a>."
+ "Storage not available" : "A tároló elérhetetlen."
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/lib/l10n/it.js b/lib/l10n/it.js
index c52328211f8..d061ef50683 100644
--- a/lib/l10n/it.js
+++ b/lib/l10n/it.js
@@ -228,14 +228,6 @@ OC.L10N.register(
"Recommended" : "Consigliata",
"Microsoft Windows Platform is not supported" : "La piattaforma Microsoft Windows non è supportata",
"Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "L'esecuzione del server Nextcloud sulla piattaforma Microsoft Windows. Ti consigliamo di utilizzare un server Linux in una macchina virtuale.",
- "Storage not available" : "Archiviazione non disponibile",
- "ownCloud %s or higher is required." : "È richiesta la versione %s o successiva di ownCloud.",
- "ownCloud %s or lower is required." : "È richiesta la versione %s o precedente di ownCloud.",
- "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "L'applicazione \"%s\" non può essere installata perché non è compatibile con questa versione di Nextcloud.",
- "App can't be installed because it is not compatible with this version of Nextcloud" : "L'applicazione non può essere installata perché non è compatibile con questa versione di Nextcloud",
- "App can't be installed because the version in info.xml/version is not the same as the version reported from the app store" : "L'applicazione non può essere installata poiché la versione nel file info.xml/version non è la stessa riportata dall'app store",
- "Hint: You can speed up the upgrade by executing this SQL command manually: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;" : "Suggerimento: puoi eseguire più velocemente l'aggiornamento eseguendo questa istruzione SQL: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;",
- "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on <a href=\"%s\">%s</a>. For migrating existing installations to Linux you can find some tips and a migration script in <a href=\"%s\">our documentation</a>." : "L'esecuzione del server Nextcloud sulla piattaforma Microsoft Windows non è supportato. Ti consigliamo di utilizzare un server Linux in una macchina virtuale se non hai la possibilità di migrare il server. Trovare i pacchetti per Linux è facile quanto attivare immagini di macchine virtuali su <a href=\"%s\">%s</a>. Per migrare installazioni esistenti su Linux, puoi trovare alcuni consigli e uno script di migrazione nella <a href=\"%s\">nostra documentazione</a>.",
- "This can usually be fixed by <a href=\"%s\" target=\"_blank\">giving the webserver write access to the root directory</a>." : "Ciò può essere normalmente corretto <a href=\"%s\" target=\"_blank\">fornendo al server web accesso in scrittura alla cartella radice</a>."
+ "Storage not available" : "Archiviazione non disponibile"
},
"nplurals=2; plural=(n != 1);");
diff --git a/lib/l10n/it.json b/lib/l10n/it.json
index 4d1455e8dab..2ed1ebfe337 100644
--- a/lib/l10n/it.json
+++ b/lib/l10n/it.json
@@ -226,14 +226,6 @@
"Recommended" : "Consigliata",
"Microsoft Windows Platform is not supported" : "La piattaforma Microsoft Windows non è supportata",
"Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "L'esecuzione del server Nextcloud sulla piattaforma Microsoft Windows. Ti consigliamo di utilizzare un server Linux in una macchina virtuale.",
- "Storage not available" : "Archiviazione non disponibile",
- "ownCloud %s or higher is required." : "È richiesta la versione %s o successiva di ownCloud.",
- "ownCloud %s or lower is required." : "È richiesta la versione %s o precedente di ownCloud.",
- "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "L'applicazione \"%s\" non può essere installata perché non è compatibile con questa versione di Nextcloud.",
- "App can't be installed because it is not compatible with this version of Nextcloud" : "L'applicazione non può essere installata perché non è compatibile con questa versione di Nextcloud",
- "App can't be installed because the version in info.xml/version is not the same as the version reported from the app store" : "L'applicazione non può essere installata poiché la versione nel file info.xml/version non è la stessa riportata dall'app store",
- "Hint: You can speed up the upgrade by executing this SQL command manually: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;" : "Suggerimento: puoi eseguire più velocemente l'aggiornamento eseguendo questa istruzione SQL: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;",
- "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on <a href=\"%s\">%s</a>. For migrating existing installations to Linux you can find some tips and a migration script in <a href=\"%s\">our documentation</a>." : "L'esecuzione del server Nextcloud sulla piattaforma Microsoft Windows non è supportato. Ti consigliamo di utilizzare un server Linux in una macchina virtuale se non hai la possibilità di migrare il server. Trovare i pacchetti per Linux è facile quanto attivare immagini di macchine virtuali su <a href=\"%s\">%s</a>. Per migrare installazioni esistenti su Linux, puoi trovare alcuni consigli e uno script di migrazione nella <a href=\"%s\">nostra documentazione</a>.",
- "This can usually be fixed by <a href=\"%s\" target=\"_blank\">giving the webserver write access to the root directory</a>." : "Ciò può essere normalmente corretto <a href=\"%s\" target=\"_blank\">fornendo al server web accesso in scrittura alla cartella radice</a>."
+ "Storage not available" : "Archiviazione non disponibile"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/lib/l10n/ja.js b/lib/l10n/ja.js
index bea58917a4c..5ce196ffbbb 100644
--- a/lib/l10n/ja.js
+++ b/lib/l10n/ja.js
@@ -228,14 +228,6 @@ OC.L10N.register(
"Recommended" : "おすすめ",
"Microsoft Windows Platform is not supported" : "Microsoft Windows プラットフォームはサポートしていません。",
"Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "マイクロソフト Windowsプラットフォーム上での Nextcloudの動作をサポートしていません。サーバー丸ごと移行する方式をとれない場合は仮想マシンで Linux を動かすことをお勧めします。",
- "Storage not available" : "ストレージが利用できません",
- "ownCloud %s or higher is required." : "ownCloud %s 以上が必要です",
- "ownCloud %s or lower is required." : "ownCloud %s 以下が必要です",
- "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "\"%s\" アプリはこのバージョンのNextcloudと互換性がないためインストールできません。",
- "App can't be installed because it is not compatible with this version of Nextcloud" : "このバージョンのNextcloudと互換性がないため、アプリケーションをインストールできません",
- "App can't be installed because the version in info.xml/version is not the same as the version reported from the app store" : "info.xml/version のバージョンがアプリストアのバージョンと合っていないため、アプリはインストールされません",
- "Hint: You can speed up the upgrade by executing this SQL command manually: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;" : "ヒント:次のSQLコマンドを手動で実行すると、アップグレードを高速化できます: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;",
- "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on <a href=\"%s\">%s</a>. For migrating existing installations to Linux you can find some tips and a migration script in <a href=\"%s\">our documentation</a>." : "Microsoft WindowsプラットフォームでのNextcloud Serverの実行はサポートされていません。サーバー自体を移行するオプションがない場合は、仮想マシンでLinuxサーバーを使用することをお勧めします。 <a href=\"%s\"> %s </a>でLinuxパッケージを見つけたり、簡単に仮想マシンイメージを展開したりできます。既存のインストールをLinuxに移行するには、<a href=\"%s\">こちらのドキュメント</a>にいくつかのヒントと移行スクリプトがあります。",
- "This can usually be fixed by <a href=\"%s\" target=\"_blank\">giving the webserver write access to the root directory</a>." : "多くの場合、<a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">Webサーバーのルートディレクトリに書き込み権限を与える</a>ことで解決できます。"
+ "Storage not available" : "ストレージが利用できません"
},
"nplurals=1; plural=0;");
diff --git a/lib/l10n/ja.json b/lib/l10n/ja.json
index c62bf1bae85..31d6ccd6b84 100644
--- a/lib/l10n/ja.json
+++ b/lib/l10n/ja.json
@@ -226,14 +226,6 @@
"Recommended" : "おすすめ",
"Microsoft Windows Platform is not supported" : "Microsoft Windows プラットフォームはサポートしていません。",
"Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "マイクロソフト Windowsプラットフォーム上での Nextcloudの動作をサポートしていません。サーバー丸ごと移行する方式をとれない場合は仮想マシンで Linux を動かすことをお勧めします。",
- "Storage not available" : "ストレージが利用できません",
- "ownCloud %s or higher is required." : "ownCloud %s 以上が必要です",
- "ownCloud %s or lower is required." : "ownCloud %s 以下が必要です",
- "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "\"%s\" アプリはこのバージョンのNextcloudと互換性がないためインストールできません。",
- "App can't be installed because it is not compatible with this version of Nextcloud" : "このバージョンのNextcloudと互換性がないため、アプリケーションをインストールできません",
- "App can't be installed because the version in info.xml/version is not the same as the version reported from the app store" : "info.xml/version のバージョンがアプリストアのバージョンと合っていないため、アプリはインストールされません",
- "Hint: You can speed up the upgrade by executing this SQL command manually: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;" : "ヒント:次のSQLコマンドを手動で実行すると、アップグレードを高速化できます: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;",
- "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on <a href=\"%s\">%s</a>. For migrating existing installations to Linux you can find some tips and a migration script in <a href=\"%s\">our documentation</a>." : "Microsoft WindowsプラットフォームでのNextcloud Serverの実行はサポートされていません。サーバー自体を移行するオプションがない場合は、仮想マシンでLinuxサーバーを使用することをお勧めします。 <a href=\"%s\"> %s </a>でLinuxパッケージを見つけたり、簡単に仮想マシンイメージを展開したりできます。既存のインストールをLinuxに移行するには、<a href=\"%s\">こちらのドキュメント</a>にいくつかのヒントと移行スクリプトがあります。",
- "This can usually be fixed by <a href=\"%s\" target=\"_blank\">giving the webserver write access to the root directory</a>." : "多くの場合、<a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">Webサーバーのルートディレクトリに書き込み権限を与える</a>ことで解決できます。"
+ "Storage not available" : "ストレージが利用できません"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/lib/l10n/nb_NO.js b/lib/l10n/nb_NO.js
index 934aa02a1e1..0fcaa03b246 100644
--- a/lib/l10n/nb_NO.js
+++ b/lib/l10n/nb_NO.js
@@ -5,8 +5,13 @@ OC.L10N.register(
"This can usually be fixed by giving the webserver write access to the config directory" : "Dette kan vanligvis ordnes ved å gi web-tjeneren skrivetilgang til config-mappen",
"See %s" : "Se %s",
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Dette kan vanligvis ordnes ved %så gi web-tjeneren skrivetilgang til config-mappen%s.",
+ "The files of the app %$1s were not replaced correctly. Make sure it is a version compatible with the server." : "Filene i appen %$1s ble ikke erstattet skikkelig. Sjekk at versjonen er kompatibel med tjeneren.",
"Sample configuration detected" : "Eksempelkonfigurasjon oppdaget",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Det ble oppdaget at eksempelkonfigurasjonen er blitt kopiert. Dette kan ødelegge installasjonen din og støttes ikke. Les dokumentasjonen før du gjør endringer i config.php",
+ "%1$s and %2$s" : "%1$s og %2$s",
+ "%1$s, %2$s and %3$s" : "%1$s, %2$s og %3$s",
+ "%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s og %4$s",
+ "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s og %5$s",
"PHP %s or higher is required." : "PHP %s eller nyere kreves.",
"PHP with a version lower than %s is required." : "PHP med en versjon lavere enn %s kreves.",
"%sbit or higher PHP required." : "%sbit eller høyere PHP kreves",
@@ -20,6 +25,7 @@ OC.L10N.register(
"Server version %s or lower is required." : "Tjenerversjon %s eller lavere kreves.",
"Unknown filetype" : "Ukjent filtype",
"Invalid image" : "Ugyldig bilde",
+ "Avatar image is not square" : "Avatarbilde er ikke firkantet",
"today" : "i dag",
"yesterday" : "i går",
"_%n day ago_::_%n days ago_" : ["%n dag siden","%n dager siden"],
@@ -222,14 +228,6 @@ OC.L10N.register(
"Recommended" : "Anbefalt",
"Microsoft Windows Platform is not supported" : "Microsoft Windows-plattform støttes ikke",
"Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "Kjøring av Nextcloud tjeneren på en Microsoft Windows plattform er ikke støttet. Vi foreslår at du bruker en Linux tjener i en virtuell maskin hvis du ikke har mulighet til å migrere tjeneren selv.",
- "Storage not available" : "Lagringsplass ikke tilgjengelig",
- "ownCloud %s or higher is required." : "Nextcloud %s eller høyere er påkrevd.",
- "ownCloud %s or lower is required." : "Nextcloud %s eller lavere er påkrevd.",
- "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "Appen \"%s\" kan ikke installeres da den ikke er kompatibel med denne versjonen av Nextcloud",
- "App can't be installed because it is not compatible with this version of Nextcloud" : "Appen kan ikke installeres da den ikke er kompatibel med denne versjonen av Nextcloud",
- "App can't be installed because the version in info.xml/version is not the same as the version reported from the app store" : "App kan ikke installeres fordi versjonen i info.xml/version ikke er den samme som versjonen som rapporteres fra app-butikken",
- "Hint: You can speed up the upgrade by executing this SQL command manually: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;" : "Hint: Du kan øke hastigheten på oppgraderingen ved å kjøre denne SQL kommandoen manuelt: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;",
- "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on <a href=\"%s\">%s</a>. For migrating existing installations to Linux you can find some tips and a migration script in <a href=\"%s\">our documentation</a>." : "Kjøring av Nextcloud tjeneren på en Microsoft Windows plattform er ikke støttet. Vi foreslår at du bruker en Linux tjener i en virtuell maskin hvis du ikke har mulighet til å migrere selve tjeneren. Finn Linuxpakker og virtuelle maskiner på <a href=\"%s\">%s</a>. For å migrere eksisterende installasjon til Linux kan du finne gode tips og migreringsskript i vår <a href=\"%s\">dokumentasjon</a>.",
- "This can usually be fixed by <a href=\"%s\" target=\"_blank\">giving the webserver write access to the root directory</a>." : "Dette fikses vanligvis ved å <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">gi webtjeneren skrivetilgang til rotmappen</a>."
+ "Storage not available" : "Lagringsplass ikke tilgjengelig"
},
"nplurals=2; plural=(n != 1);");
diff --git a/lib/l10n/nb_NO.json b/lib/l10n/nb_NO.json
index 13f38ee540a..5e745167303 100644
--- a/lib/l10n/nb_NO.json
+++ b/lib/l10n/nb_NO.json
@@ -3,8 +3,13 @@
"This can usually be fixed by giving the webserver write access to the config directory" : "Dette kan vanligvis ordnes ved å gi web-tjeneren skrivetilgang til config-mappen",
"See %s" : "Se %s",
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Dette kan vanligvis ordnes ved %så gi web-tjeneren skrivetilgang til config-mappen%s.",
+ "The files of the app %$1s were not replaced correctly. Make sure it is a version compatible with the server." : "Filene i appen %$1s ble ikke erstattet skikkelig. Sjekk at versjonen er kompatibel med tjeneren.",
"Sample configuration detected" : "Eksempelkonfigurasjon oppdaget",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Det ble oppdaget at eksempelkonfigurasjonen er blitt kopiert. Dette kan ødelegge installasjonen din og støttes ikke. Les dokumentasjonen før du gjør endringer i config.php",
+ "%1$s and %2$s" : "%1$s og %2$s",
+ "%1$s, %2$s and %3$s" : "%1$s, %2$s og %3$s",
+ "%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s og %4$s",
+ "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s og %5$s",
"PHP %s or higher is required." : "PHP %s eller nyere kreves.",
"PHP with a version lower than %s is required." : "PHP med en versjon lavere enn %s kreves.",
"%sbit or higher PHP required." : "%sbit eller høyere PHP kreves",
@@ -18,6 +23,7 @@
"Server version %s or lower is required." : "Tjenerversjon %s eller lavere kreves.",
"Unknown filetype" : "Ukjent filtype",
"Invalid image" : "Ugyldig bilde",
+ "Avatar image is not square" : "Avatarbilde er ikke firkantet",
"today" : "i dag",
"yesterday" : "i går",
"_%n day ago_::_%n days ago_" : ["%n dag siden","%n dager siden"],
@@ -220,14 +226,6 @@
"Recommended" : "Anbefalt",
"Microsoft Windows Platform is not supported" : "Microsoft Windows-plattform støttes ikke",
"Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "Kjøring av Nextcloud tjeneren på en Microsoft Windows plattform er ikke støttet. Vi foreslår at du bruker en Linux tjener i en virtuell maskin hvis du ikke har mulighet til å migrere tjeneren selv.",
- "Storage not available" : "Lagringsplass ikke tilgjengelig",
- "ownCloud %s or higher is required." : "Nextcloud %s eller høyere er påkrevd.",
- "ownCloud %s or lower is required." : "Nextcloud %s eller lavere er påkrevd.",
- "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "Appen \"%s\" kan ikke installeres da den ikke er kompatibel med denne versjonen av Nextcloud",
- "App can't be installed because it is not compatible with this version of Nextcloud" : "Appen kan ikke installeres da den ikke er kompatibel med denne versjonen av Nextcloud",
- "App can't be installed because the version in info.xml/version is not the same as the version reported from the app store" : "App kan ikke installeres fordi versjonen i info.xml/version ikke er den samme som versjonen som rapporteres fra app-butikken",
- "Hint: You can speed up the upgrade by executing this SQL command manually: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;" : "Hint: Du kan øke hastigheten på oppgraderingen ved å kjøre denne SQL kommandoen manuelt: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;",
- "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on <a href=\"%s\">%s</a>. For migrating existing installations to Linux you can find some tips and a migration script in <a href=\"%s\">our documentation</a>." : "Kjøring av Nextcloud tjeneren på en Microsoft Windows plattform er ikke støttet. Vi foreslår at du bruker en Linux tjener i en virtuell maskin hvis du ikke har mulighet til å migrere selve tjeneren. Finn Linuxpakker og virtuelle maskiner på <a href=\"%s\">%s</a>. For å migrere eksisterende installasjon til Linux kan du finne gode tips og migreringsskript i vår <a href=\"%s\">dokumentasjon</a>.",
- "This can usually be fixed by <a href=\"%s\" target=\"_blank\">giving the webserver write access to the root directory</a>." : "Dette fikses vanligvis ved å <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">gi webtjeneren skrivetilgang til rotmappen</a>."
+ "Storage not available" : "Lagringsplass ikke tilgjengelig"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/lib/l10n/nl.js b/lib/l10n/nl.js
index 6b1edec0eda..07569958fe6 100644
--- a/lib/l10n/nl.js
+++ b/lib/l10n/nl.js
@@ -228,14 +228,6 @@ OC.L10N.register(
"Recommended" : "Aanbevolen",
"Microsoft Windows Platform is not supported" : "Microsoft Windows Platform wordt niet ondersteund",
"Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "Het draaien van Nextcloud server op het Microsoft Windows platform wordt niet ondersteund. We adviseren je om een Linux server op een virtuele server te gebruiken als je geen mogelijkheid hebt om een server zelf te migreren.",
- "Storage not available" : "Opslag niet beschikbaar",
- "ownCloud %s or higher is required." : "ownCloud %s of hoger vereist.",
- "ownCloud %s or lower is required." : "ownCloud %s of lager vereist.",
- "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "App \"%s\" kan niet worden geïnstalleerd, omdat deze niet compatible is met deze versie van Nextcloud.",
- "App can't be installed because it is not compatible with this version of Nextcloud" : "App kan niet worden geïnstalleerd, omdat deze niet compatible is met deze versie van Nextcloud.",
- "App can't be installed because the version in info.xml/version is not the same as the version reported from the app store" : "De app kan niet worden geïnstalleerd, omdat de versie in info.xml/version niet dezelfde is als de versie zoals die in de app store staat vermeld",
- "Hint: You can speed up the upgrade by executing this SQL command manually: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;" : "Hint: Je kunt de upgrade versnellen door dit SQL commando handmatig uit te voeren: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;",
- "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on <a href=\"%s\">%s</a>. For migrating existing installations to Linux you can find some tips and a migration script in <a href=\"%s\">our documentation</a>." : "Het draaien van Nextcloud server op het Microsoft Windows platform wordt niet ondersteund. We adviseren je om een Linux server op een virtuele server te gebruiken als je geen mogelijkheid hebt om een server zelf te migreren. Je vind Linux packages en handig installeerbare virtual machine images op <a href=\"%s\">%s</a>. Voor het migreren van bestaande installaties naar Linux vind je tips en een migratiescript in <a href=\"%s\">onze documentatie</a>.",
- "This can usually be fixed by <a href=\"%s\" target=\"_blank\">giving the webserver write access to the root directory</a>." : "Dit kan hersteld worden door <a href=\"%s\" target=\"_blank\">de webserver schrijfrechten te geven op de hoofddirectory</a>."
+ "Storage not available" : "Opslag niet beschikbaar"
},
"nplurals=2; plural=(n != 1);");
diff --git a/lib/l10n/nl.json b/lib/l10n/nl.json
index 006aa5121c3..3478dcdfa98 100644
--- a/lib/l10n/nl.json
+++ b/lib/l10n/nl.json
@@ -226,14 +226,6 @@
"Recommended" : "Aanbevolen",
"Microsoft Windows Platform is not supported" : "Microsoft Windows Platform wordt niet ondersteund",
"Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "Het draaien van Nextcloud server op het Microsoft Windows platform wordt niet ondersteund. We adviseren je om een Linux server op een virtuele server te gebruiken als je geen mogelijkheid hebt om een server zelf te migreren.",
- "Storage not available" : "Opslag niet beschikbaar",
- "ownCloud %s or higher is required." : "ownCloud %s of hoger vereist.",
- "ownCloud %s or lower is required." : "ownCloud %s of lager vereist.",
- "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "App \"%s\" kan niet worden geïnstalleerd, omdat deze niet compatible is met deze versie van Nextcloud.",
- "App can't be installed because it is not compatible with this version of Nextcloud" : "App kan niet worden geïnstalleerd, omdat deze niet compatible is met deze versie van Nextcloud.",
- "App can't be installed because the version in info.xml/version is not the same as the version reported from the app store" : "De app kan niet worden geïnstalleerd, omdat de versie in info.xml/version niet dezelfde is als de versie zoals die in de app store staat vermeld",
- "Hint: You can speed up the upgrade by executing this SQL command manually: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;" : "Hint: Je kunt de upgrade versnellen door dit SQL commando handmatig uit te voeren: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;",
- "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on <a href=\"%s\">%s</a>. For migrating existing installations to Linux you can find some tips and a migration script in <a href=\"%s\">our documentation</a>." : "Het draaien van Nextcloud server op het Microsoft Windows platform wordt niet ondersteund. We adviseren je om een Linux server op een virtuele server te gebruiken als je geen mogelijkheid hebt om een server zelf te migreren. Je vind Linux packages en handig installeerbare virtual machine images op <a href=\"%s\">%s</a>. Voor het migreren van bestaande installaties naar Linux vind je tips en een migratiescript in <a href=\"%s\">onze documentatie</a>.",
- "This can usually be fixed by <a href=\"%s\" target=\"_blank\">giving the webserver write access to the root directory</a>." : "Dit kan hersteld worden door <a href=\"%s\" target=\"_blank\">de webserver schrijfrechten te geven op de hoofddirectory</a>."
+ "Storage not available" : "Opslag niet beschikbaar"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/lib/l10n/pl.js b/lib/l10n/pl.js
index c71ffa473b3..39ced184a0f 100644
--- a/lib/l10n/pl.js
+++ b/lib/l10n/pl.js
@@ -22,13 +22,13 @@ OC.L10N.register(
"Avatar image is not square" : "Obraz awataru nie jest kwadratowy",
"today" : "dziś",
"yesterday" : "wczoraj",
- "_%n day ago_::_%n days ago_" : ["%d dzień temu","%n dni temu","%n dni temu"],
+ "_%n day ago_::_%n days ago_" : ["%d dzień temu","%n dni temu","%n dni temu","%n dni temu"],
"last month" : "w zeszłym miesiącu",
- "_%n month ago_::_%n months ago_" : ["%n miesiąc temu","%n miesięcy temu","%n miesięcy temu"],
+ "_%n month ago_::_%n months ago_" : ["%n miesiąc temu","%n miesięcy temu","%n miesięcy temu","%n miesięcy temu"],
"last year" : "w zeszłym roku",
- "_%n year ago_::_%n years ago_" : ["%n rok temu","%n lata temu","%n lat temu"],
- "_%n hour ago_::_%n hours ago_" : ["%n godzinę temu","%n godzin temu","%n godzin temu"],
- "_%n minute ago_::_%n minutes ago_" : ["%n minute temu","%n minut temu","%n minut temu"],
+ "_%n year ago_::_%n years ago_" : ["%n rok temu","%n lata temu","%n lat temu","%n lat temu"],
+ "_%n hour ago_::_%n hours ago_" : ["%n godzinę temu","%n godzin temu","%n godzin temu","%n godzin temu"],
+ "_%n minute ago_::_%n minutes ago_" : ["%n minute temu","%n minut temu","%n minut temu","%n minut temu"],
"seconds ago" : "sekund temu",
"Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "Moduł z id: %s nie istnieje. Należy go włączyć w ustawieniach aplikacji lub skontaktować się z administratorem.",
"File name is a reserved word" : "Nazwa pliku jest zarezerwowana",
@@ -82,6 +82,7 @@ OC.L10N.register(
"Sharing %s failed, because resharing is not allowed" : "Współdzielenie %s nie powiodło się, ponieważ ponowne współdzielenie nie jest dozwolone",
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Współdzielenie %s nie powiodło się, ponieważ zaplecze współdzielenia dla %s nie mogło znaleźć jego źródła",
"Sharing %s failed, because the file could not be found in the file cache" : "Współdzielenie %s nie powiodło się, ponieważ plik nie może zostać odnaleziony w buforze plików",
+ "Cannot increase permissions of %s" : "Nie można zwiększyć uprawnienia %s",
"Expiration date is in the past" : "Data ważności jest przeszła",
"Could not find category \"%s\"" : "Nie można odnaleźć kategorii \"%s\"",
"Sunday" : "Niedziela",
@@ -184,10 +185,6 @@ OC.L10N.register(
"Logging" : "Logowanie",
"Recommended" : "Polecane",
"Microsoft Windows Platform is not supported" : "Platforma Microsoft Windows nie jest wspierana",
- "Storage not available" : "Pamięć nie dostępna",
- "ownCloud %s or higher is required." : "ownCloud %s lub wyższe jest wymagane.",
- "ownCloud %s or lower is required." : "ownCloud %s lub niższe jest wymagane.",
- "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "Aplikacja \"%s\" nie może być zainstalowana ponieważ nie jest kompatybilna z tą wersją Nextcloud.",
- "App can't be installed because it is not compatible with this version of Nextcloud" : "Aplikacja nie może być zainstalowana ponieważ nie jest kompatybilna z tą wersją Nextcloud."
+ "Storage not available" : "Pamięć nie dostępna"
},
"nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);");
diff --git a/lib/l10n/pl.json b/lib/l10n/pl.json
index 1a4160b95c4..22b595e87d4 100644
--- a/lib/l10n/pl.json
+++ b/lib/l10n/pl.json
@@ -20,13 +20,13 @@
"Avatar image is not square" : "Obraz awataru nie jest kwadratowy",
"today" : "dziś",
"yesterday" : "wczoraj",
- "_%n day ago_::_%n days ago_" : ["%d dzień temu","%n dni temu","%n dni temu"],
+ "_%n day ago_::_%n days ago_" : ["%d dzień temu","%n dni temu","%n dni temu","%n dni temu"],
"last month" : "w zeszłym miesiącu",
- "_%n month ago_::_%n months ago_" : ["%n miesiąc temu","%n miesięcy temu","%n miesięcy temu"],
+ "_%n month ago_::_%n months ago_" : ["%n miesiąc temu","%n miesięcy temu","%n miesięcy temu","%n miesięcy temu"],
"last year" : "w zeszłym roku",
- "_%n year ago_::_%n years ago_" : ["%n rok temu","%n lata temu","%n lat temu"],
- "_%n hour ago_::_%n hours ago_" : ["%n godzinę temu","%n godzin temu","%n godzin temu"],
- "_%n minute ago_::_%n minutes ago_" : ["%n minute temu","%n minut temu","%n minut temu"],
+ "_%n year ago_::_%n years ago_" : ["%n rok temu","%n lata temu","%n lat temu","%n lat temu"],
+ "_%n hour ago_::_%n hours ago_" : ["%n godzinę temu","%n godzin temu","%n godzin temu","%n godzin temu"],
+ "_%n minute ago_::_%n minutes ago_" : ["%n minute temu","%n minut temu","%n minut temu","%n minut temu"],
"seconds ago" : "sekund temu",
"Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "Moduł z id: %s nie istnieje. Należy go włączyć w ustawieniach aplikacji lub skontaktować się z administratorem.",
"File name is a reserved word" : "Nazwa pliku jest zarezerwowana",
@@ -80,6 +80,7 @@
"Sharing %s failed, because resharing is not allowed" : "Współdzielenie %s nie powiodło się, ponieważ ponowne współdzielenie nie jest dozwolone",
"Sharing %s failed, because the sharing backend for %s could not find its source" : "Współdzielenie %s nie powiodło się, ponieważ zaplecze współdzielenia dla %s nie mogło znaleźć jego źródła",
"Sharing %s failed, because the file could not be found in the file cache" : "Współdzielenie %s nie powiodło się, ponieważ plik nie może zostać odnaleziony w buforze plików",
+ "Cannot increase permissions of %s" : "Nie można zwiększyć uprawnienia %s",
"Expiration date is in the past" : "Data ważności jest przeszła",
"Could not find category \"%s\"" : "Nie można odnaleźć kategorii \"%s\"",
"Sunday" : "Niedziela",
@@ -182,10 +183,6 @@
"Logging" : "Logowanie",
"Recommended" : "Polecane",
"Microsoft Windows Platform is not supported" : "Platforma Microsoft Windows nie jest wspierana",
- "Storage not available" : "Pamięć nie dostępna",
- "ownCloud %s or higher is required." : "ownCloud %s lub wyższe jest wymagane.",
- "ownCloud %s or lower is required." : "ownCloud %s lub niższe jest wymagane.",
- "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "Aplikacja \"%s\" nie może być zainstalowana ponieważ nie jest kompatybilna z tą wersją Nextcloud.",
- "App can't be installed because it is not compatible with this version of Nextcloud" : "Aplikacja nie może być zainstalowana ponieważ nie jest kompatybilna z tą wersją Nextcloud."
+ "Storage not available" : "Pamięć nie dostępna"
},"pluralForm" :"nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"
} \ No newline at end of file
diff --git a/lib/l10n/pt_BR.js b/lib/l10n/pt_BR.js
index 23635f5d47e..5a55bd7a02b 100644
--- a/lib/l10n/pt_BR.js
+++ b/lib/l10n/pt_BR.js
@@ -228,14 +228,6 @@ OC.L10N.register(
"Recommended" : "Recomendado",
"Microsoft Windows Platform is not supported" : "Plataforma Microsoft Windows não é suportada",
"Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "O Servidor Nextcloud não possui suporte para execução na plataforma Microsoft Windows. Sugerimos que use um servidor Linux em uma máquina virtual, caso não seja possível migrar o servidor.",
- "Storage not available" : "Armazanamento não disponível",
- "ownCloud %s or higher is required." : "OwnCloud %s ou mais recente é necessário",
- "ownCloud %s or lower is required." : "ownCloud %s ou menor é necessário",
- "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "App '%s\" não pode ser instalado por não ser compatível com a versão",
- "App can't be installed because it is not compatible with this version of Nextcloud" : "App não pode ser instalado pois não é compatível com a versão",
- "App can't be installed because the version in info.xml/version is not the same as the version reported from the app store" : "App não pode ser instalado porque a versão em info.xml/version não é a mesma versão reportada na app store",
- "Hint: You can speed up the upgrade by executing this SQL command manually: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;" : "Dica: voce pode acelerar seu upgrade executando um comando SQL: ALTERTABLE %s ADD COLUMN checksun varchar(255) DEFAULT NULL AFTER permissions;",
- "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on <a href=\"%s\">%s</a>. For migrating existing installations to Linux you can find some tips and a migration script in <a href=\"%s\">our documentation</a>." : "Não é possível rodar nosso serviço em plataformas Microsoft, sugerimos um Linux em máquina virtual. É possível achar pacotes Linux e é bem fácil fazer dfeply das imagens virtuais em <a href=\"%s\"> %s</a>. Para migrar instalações existentes e achar algumas dicas de script acesse <a href=\"%s\">nossa documentação</a>",
- "This can usually be fixed by <a href=\"%s\" target=\"_blank\">giving the webserver write access to the root directory</a>." : "Isso pode ser corrigido usando <a href=\"%s\" target=\"_blank\"> fornecendo acesso de escrita ao webserver no diretório root</a>"
+ "Storage not available" : "Armazanamento não disponível"
},
"nplurals=2; plural=(n > 1);");
diff --git a/lib/l10n/pt_BR.json b/lib/l10n/pt_BR.json
index e51fc04a66f..2e9db1e93bc 100644
--- a/lib/l10n/pt_BR.json
+++ b/lib/l10n/pt_BR.json
@@ -226,14 +226,6 @@
"Recommended" : "Recomendado",
"Microsoft Windows Platform is not supported" : "Plataforma Microsoft Windows não é suportada",
"Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "O Servidor Nextcloud não possui suporte para execução na plataforma Microsoft Windows. Sugerimos que use um servidor Linux em uma máquina virtual, caso não seja possível migrar o servidor.",
- "Storage not available" : "Armazanamento não disponível",
- "ownCloud %s or higher is required." : "OwnCloud %s ou mais recente é necessário",
- "ownCloud %s or lower is required." : "ownCloud %s ou menor é necessário",
- "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "App '%s\" não pode ser instalado por não ser compatível com a versão",
- "App can't be installed because it is not compatible with this version of Nextcloud" : "App não pode ser instalado pois não é compatível com a versão",
- "App can't be installed because the version in info.xml/version is not the same as the version reported from the app store" : "App não pode ser instalado porque a versão em info.xml/version não é a mesma versão reportada na app store",
- "Hint: You can speed up the upgrade by executing this SQL command manually: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;" : "Dica: voce pode acelerar seu upgrade executando um comando SQL: ALTERTABLE %s ADD COLUMN checksun varchar(255) DEFAULT NULL AFTER permissions;",
- "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on <a href=\"%s\">%s</a>. For migrating existing installations to Linux you can find some tips and a migration script in <a href=\"%s\">our documentation</a>." : "Não é possível rodar nosso serviço em plataformas Microsoft, sugerimos um Linux em máquina virtual. É possível achar pacotes Linux e é bem fácil fazer dfeply das imagens virtuais em <a href=\"%s\"> %s</a>. Para migrar instalações existentes e achar algumas dicas de script acesse <a href=\"%s\">nossa documentação</a>",
- "This can usually be fixed by <a href=\"%s\" target=\"_blank\">giving the webserver write access to the root directory</a>." : "Isso pode ser corrigido usando <a href=\"%s\" target=\"_blank\"> fornecendo acesso de escrita ao webserver no diretório root</a>"
+ "Storage not available" : "Armazanamento não disponível"
},"pluralForm" :"nplurals=2; plural=(n > 1);"
} \ No newline at end of file
diff --git a/lib/l10n/ru.js b/lib/l10n/ru.js
index 3904d0f86d1..869ec6055f2 100644
--- a/lib/l10n/ru.js
+++ b/lib/l10n/ru.js
@@ -5,8 +5,13 @@ OC.L10N.register(
"This can usually be fixed by giving the webserver write access to the config directory" : "Обычно это можно исправить, предоставив веб-серверу права на запись в каталог конфигурации",
"See %s" : "Смотрите %s",
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Обычно это можно исправить %sпредоставив веб-серверу права на запись в каталоге конфигурации%s.",
+ "The files of the app %$1s were not replaced correctly. Make sure it is a version compatible with the server." : "Файлы приложения %$1s не заменены корректно. Проверьте что его версия совместима с версией сервера.",
"Sample configuration detected" : "Обнаружена конфигурация из примера",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Была обнаружена конфигурация из примера. Такая конфигурация не поддерживается и может повредить вашей системе. Прочтите документацию перед внесением изменений в файл config.php",
+ "%1$s and %2$s" : "%1$s и %2$s",
+ "%1$s, %2$s and %3$s" : "%1$s, %2$s и %3$s",
+ "%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s и %4$s",
+ "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s и %5$s",
"PHP %s or higher is required." : "Требуется PHP %s или выше",
"PHP with a version lower than %s is required." : "Требуется версия PHP ниже %s.",
"%sbit or higher PHP required." : "Требуется PHP с разрядностью %s бит или более.",
@@ -206,7 +211,7 @@ OC.L10N.register(
"4-byte characters are not supported in file names" : "4-х байтовые символы в имени файлов не допускаются",
"App directory already exists" : "Каталог приложения уже существует",
"Can't create app folder. Please fix permissions. %s" : "Не удалось создать каталог приложения. Исправьте права доступа. %s",
- "Archive does not contain a directory named %s" : "Архив не содержит папки с именем %s",
+ "Archive does not contain a directory named %s" : "Архив не содержит каталога с именем %s",
"No source specified when installing app" : "Не указан источник при установке приложения",
"No href specified when installing app from http" : "Не указан атрибут href при установке приложения через http",
"No path specified when installing app from local file" : "Не указан путь при установке приложения из локального файла",
@@ -223,14 +228,6 @@ OC.L10N.register(
"Recommended" : "Рекомендовано",
"Microsoft Windows Platform is not supported" : "Платформа Microsoft Windows не поддерживается",
"Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "Работа Nextcloud Server на платформе Microsoft Windows не поддерживается. Мы рекомендуем использовать Linux в качестве виртуальный машины, если у вас нет возможности перевести сам сервер.",
- "Storage not available" : "Хранилище недоступно",
- "ownCloud %s or higher is required." : "Требуется NextCloud версии %s или выше.",
- "ownCloud %s or lower is required." : "Требуется NextCloud версии %s или ниже.",
- "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "Приложение \"%s\" не может быть установлено, так как оно несовместимо с этой версией Nextcloud.",
- "App can't be installed because it is not compatible with this version of Nextcloud" : "Приложение не может быть установлено, так как оно несовместимо с этой версией Nextcloud.",
- "App can't be installed because the version in info.xml/version is not the same as the version reported from the app store" : "Приложение не может быть установлено, поскольку версия в файле info.xml/version не совпадает с версией, заявленной в магазине приложений",
- "Hint: You can speed up the upgrade by executing this SQL command manually: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;" : "Совет: вы можете ускорить процесс обновления, выполнив SQL-запрос самостоятельно: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;",
- "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on <a href=\"%s\">%s</a>. For migrating existing installations to Linux you can find some tips and a migration script in <a href=\"%s\">our documentation</a>." : "Nextcloud Server на платформе Microsoft Windows не поддерживается. Если у вас нет возможности установить на сервер Linux, рекомендуем воспользоваться виртуальной машиной. Соответствующие пакеты можно найти на странице <a href=\"%s\">%s</a>. Для переноса на Linux уже имеющейся установки некоторые советы и рекомендации есть в <a href=\"%s\">нашей документации</a>.",
- "This can usually be fixed by <a href=\"%s\" target=\"_blank\">giving the webserver write access to the root directory</a>." : "Как правило, это можно исправить, <a href=\"%s\" target=\"_blank\">предоставив веб-серверу права на запись в корневой каталог</a>."
+ "Storage not available" : "Хранилище недоступно"
},
"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);");
diff --git a/lib/l10n/ru.json b/lib/l10n/ru.json
index a64f3c29c98..92ea68f8ac7 100644
--- a/lib/l10n/ru.json
+++ b/lib/l10n/ru.json
@@ -3,8 +3,13 @@
"This can usually be fixed by giving the webserver write access to the config directory" : "Обычно это можно исправить, предоставив веб-серверу права на запись в каталог конфигурации",
"See %s" : "Смотрите %s",
"This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Обычно это можно исправить %sпредоставив веб-серверу права на запись в каталоге конфигурации%s.",
+ "The files of the app %$1s were not replaced correctly. Make sure it is a version compatible with the server." : "Файлы приложения %$1s не заменены корректно. Проверьте что его версия совместима с версией сервера.",
"Sample configuration detected" : "Обнаружена конфигурация из примера",
"It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Была обнаружена конфигурация из примера. Такая конфигурация не поддерживается и может повредить вашей системе. Прочтите документацию перед внесением изменений в файл config.php",
+ "%1$s and %2$s" : "%1$s и %2$s",
+ "%1$s, %2$s and %3$s" : "%1$s, %2$s и %3$s",
+ "%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s и %4$s",
+ "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s и %5$s",
"PHP %s or higher is required." : "Требуется PHP %s или выше",
"PHP with a version lower than %s is required." : "Требуется версия PHP ниже %s.",
"%sbit or higher PHP required." : "Требуется PHP с разрядностью %s бит или более.",
@@ -204,7 +209,7 @@
"4-byte characters are not supported in file names" : "4-х байтовые символы в имени файлов не допускаются",
"App directory already exists" : "Каталог приложения уже существует",
"Can't create app folder. Please fix permissions. %s" : "Не удалось создать каталог приложения. Исправьте права доступа. %s",
- "Archive does not contain a directory named %s" : "Архив не содержит папки с именем %s",
+ "Archive does not contain a directory named %s" : "Архив не содержит каталога с именем %s",
"No source specified when installing app" : "Не указан источник при установке приложения",
"No href specified when installing app from http" : "Не указан атрибут href при установке приложения через http",
"No path specified when installing app from local file" : "Не указан путь при установке приложения из локального файла",
@@ -221,14 +226,6 @@
"Recommended" : "Рекомендовано",
"Microsoft Windows Platform is not supported" : "Платформа Microsoft Windows не поддерживается",
"Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "Работа Nextcloud Server на платформе Microsoft Windows не поддерживается. Мы рекомендуем использовать Linux в качестве виртуальный машины, если у вас нет возможности перевести сам сервер.",
- "Storage not available" : "Хранилище недоступно",
- "ownCloud %s or higher is required." : "Требуется NextCloud версии %s или выше.",
- "ownCloud %s or lower is required." : "Требуется NextCloud версии %s или ниже.",
- "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "Приложение \"%s\" не может быть установлено, так как оно несовместимо с этой версией Nextcloud.",
- "App can't be installed because it is not compatible with this version of Nextcloud" : "Приложение не может быть установлено, так как оно несовместимо с этой версией Nextcloud.",
- "App can't be installed because the version in info.xml/version is not the same as the version reported from the app store" : "Приложение не может быть установлено, поскольку версия в файле info.xml/version не совпадает с версией, заявленной в магазине приложений",
- "Hint: You can speed up the upgrade by executing this SQL command manually: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;" : "Совет: вы можете ускорить процесс обновления, выполнив SQL-запрос самостоятельно: ALTER TABLE %s ADD COLUMN checksum varchar(255) DEFAULT NULL AFTER permissions;",
- "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself. Find Linux packages as well as easy to deploy virtual machine images on <a href=\"%s\">%s</a>. For migrating existing installations to Linux you can find some tips and a migration script in <a href=\"%s\">our documentation</a>." : "Nextcloud Server на платформе Microsoft Windows не поддерживается. Если у вас нет возможности установить на сервер Linux, рекомендуем воспользоваться виртуальной машиной. Соответствующие пакеты можно найти на странице <a href=\"%s\">%s</a>. Для переноса на Linux уже имеющейся установки некоторые советы и рекомендации есть в <a href=\"%s\">нашей документации</a>.",
- "This can usually be fixed by <a href=\"%s\" target=\"_blank\">giving the webserver write access to the root directory</a>." : "Как правило, это можно исправить, <a href=\"%s\" target=\"_blank\">предоставив веб-серверу права на запись в корневой каталог</a>."
+ "Storage not available" : "Хранилище недоступно"
},"pluralForm" :"nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);"
} \ No newline at end of file
diff --git a/lib/l10n/sk_SK.js b/lib/l10n/sk_SK.js
new file mode 100644
index 00000000000..0e4854cdef0
--- /dev/null
+++ b/lib/l10n/sk_SK.js
@@ -0,0 +1,215 @@
+OC.L10N.register(
+ "lib",
+ {
+ "Cannot write into \"config\" directory!" : "Nie je možné zapisovat do priečinka \"config\"!",
+ "This can usually be fixed by giving the webserver write access to the config directory" : "To je zvyčajne možné opraviť tým, že udelíte webovému serveru oprávnenie na zápis do priečinka s konfiguráciou.",
+ "See %s" : "Pozri %s",
+ "This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "To je zvyčajne možné opraviť tým, že %s udelíte webovému serveru oprávnenie na zápis k adresáru s konfiguráciou%s.",
+ "The files of the app %$1s were not replaced correctly. Make sure it is a version compatible with the server." : "Súbory aplikácie %$1s nebolo možné úspešne nahradiť. Uistite sa, že verzia je kompatibilná s verziou servera.",
+ "Sample configuration detected" : "Detekovaná bola vzorová konfigurácia",
+ "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Zistilo sa, že konfigurácia bola skopírovaná zo vzorových súborov. Takáto konfigurácia nie je podporovaná a môže poškodiť vašu inštaláciu. Prečítajte si dokumentáciu pred vykonaním zmien v config.php",
+ "PHP %s or higher is required." : "Požadovaná verzia PHP %s alebo vyššia.",
+ "PHP with a version lower than %s is required." : "PHP je vyžadované vo vyššej verzii ako %s.",
+ "Following databases are supported: %s" : "Podporované sú tieto databázy: %s",
+ "The command line tool %s could not be found" : "Nástroj príkazového riadka %s nebol nájdený",
+ "The library %s is not available." : "Knižnica %s je nedostupná.",
+ "Library %s with a version higher than %s is required - available version %s." : "Požadovaná je knižnica %s vo vyššej verzii ako %s - dostupná verzia %s.",
+ "Library %s with a version lower than %s is required - available version %s." : "Požadovaná je knižnica %s v nižšej verzii ako %s - dostupná verzia %s.",
+ "Following platforms are supported: %s" : "Podporované sú nasledovné systémy: %s",
+ "Server version %s or higher is required." : "Je vyžadovaná verzia servera %s alebo vyššia.",
+ "Server version %s or lower is required." : "Je vyžadovaná verzia servera %s alebo nižšia.",
+ "Unknown filetype" : "Neznámy typ súboru",
+ "Invalid image" : "Chybný obrázok",
+ "today" : "dnes",
+ "yesterday" : "včera",
+ "_%n day ago_::_%n days ago_" : ["včera","pred %n dňami","pred %n dňami"],
+ "last month" : "minulý mesiac",
+ "_%n month ago_::_%n months ago_" : ["pred %n mesiacom","pred %n mesiacmi","pred %n mesiacmi"],
+ "last year" : "minulý rok",
+ "_%n year ago_::_%n years ago_" : ["vlani","pred %n rokmi","pred %n rokmi"],
+ "_%n hour ago_::_%n hours ago_" : ["pred %n hodinou","pred %n hodinami","pred %n hodinami"],
+ "_%n minute ago_::_%n minutes ago_" : ["pred %n minútou","pred %n minútami","pred %n minútami"],
+ "seconds ago" : "pred sekundami",
+ "Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "Modul s ID: %s neexistuje. Povoľte ho prosím vo vašom nastavení aplikácií alebo konaktujte správcu.",
+ "File name is a reserved word" : "Názov súboru je rezervované slovo.",
+ "File name contains at least one invalid character" : "Názov súboru obsahuje nepovolené znaky.",
+ "File name is too long" : "Meno súboru je veľmi dlhé.",
+ "Dot files are not allowed" : "Názov súboru začínajúci bodkou nie je povolený.",
+ "Empty filename is not allowed" : "Prázdny názov súboru nie je povolený",
+ "APCu" : "APCu",
+ "Redis" : "Redis",
+ "Server settings" : "Nastavenia servera",
+ "Sharing" : "Sprístupnenie",
+ "Encryption" : "Šifrovanie",
+ "Additional settings" : "Ďalšie nastavenia",
+ "Tips & tricks" : "Tipy a triky",
+ "%s enter the database username." : "Zadajte používateľské meno %s databázy.",
+ "%s enter the database name." : "Zadajte názov databázy pre %s databázy.",
+ "%s you may not use dots in the database name" : "V názve databázy %s nemôžete používať bodky",
+ "Oracle connection could not be established" : "Nie je možné pripojiť sa k Oracle",
+ "Oracle username and/or password not valid" : "Používateľské meno a/alebo heslo pre Oracle databázu je neplatné",
+ "DB Error: \"%s\"" : "Chyba DB: \"%s\"",
+ "Offending command was: \"%s\"" : "Podozrivý príkaz bol: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Musíte zadať jestvujúci účet alebo administrátora.",
+ "Offending command was: \"%s\", name: %s, password: %s" : "Podozrivý príkaz bol: \"%s\", meno: %s, heslo: %s",
+ "PostgreSQL username and/or password not valid" : "Používateľské meno a/alebo heslo pre PostgreSQL databázu je neplatné",
+ "Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X nie je podporovaný a %s nebude správne fungovať na tejto platforme. Použite ho na vlastné riziko!",
+ "For the best results, please consider using a GNU/Linux server instead." : "Pre dosiahnutie najlepších výsledkov, prosím zvážte použitie GNU/Linux servera.",
+ "It seems that this %s instance is running on a 32-bit PHP environment and the open_basedir has been configured in php.ini. This will lead to problems with files over 4 GB and is highly discouraged." : "Zdá sa, že táto inštancia %s beží v 32-bitovom prostredí PHP a v php.ini bola nastavená voľba open_basedir. To bude zdrojom problémov so súbormi väčšími ako 4GB a dôrazne sa neodporúča.",
+ "Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "Prosím, odstráňte nastavenie open_basedir vo vašom php.ini alebo prejdite na 64-bit PHP.",
+ "Set an admin username." : "Zadajte používateľské meno administrátora.",
+ "Set an admin password." : "Zadajte heslo administrátora.",
+ "Can't create or write into the data directory %s" : "Nemožno vytvoriť alebo zapisovať do priečinka dát %s",
+ "Invalid Federated Cloud ID" : "Neplatné združené Cloud ID",
+ "%s shared »%s« with you" : "%s vám sprístupnil »%s«",
+ "%s via %s" : "%s cez %s",
+ "Sharing %s failed, because the backend does not allow shares from type %i" : "Sprístupnenie %s zlyhalo, backend nepodporuje typ sprístupnenia %i",
+ "Sharing %s failed, because the file does not exist" : "Nie je možné sprístupniť %s, súbor neexistuje",
+ "You are not allowed to share %s" : "Nemôžete sprístupniť %s",
+ "Sharing %s failed, because you can not share with yourself" : "Sprístupnenie %s zlyhalo, nieje možné sprístupniť obsah so sebou samým",
+ "Sharing %s failed, because the user %s does not exist" : "Sprístupnenie %s zlyhalo, používateľ %s neexistuje",
+ "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Sprístupnenie %s zlyhalo, používateľ %s nie je členom žiadnej skupiny spoločnej s používateľom %s",
+ "Sharing %s failed, because this item is already shared with %s" : "Sprístupnenie %s zlyhalo, pretože táto položka už je prístupná pre %s",
+ "Sharing %s failed, because this item is already shared with user %s" : "Sprístupnenie %s zlyhalo, táto položka už je používateľovi %s prístupná",
+ "Sharing %s failed, because the group %s does not exist" : "Sprístupnenie %s zlyhalo, skupina %s neexistuje",
+ "Sharing %s failed, because %s is not a member of the group %s" : "Sprístupnenie %s zlyhalo, %s nie je členom skupiny %s",
+ "You need to provide a password to create a public link, only protected links are allowed" : "Musíte zadať heslo ak chcete vytvoriť verejný odkaz, lebo iba odkazy chránené heslom sú povolené",
+ "Sharing %s failed, because sharing with links is not allowed" : "%s nie je možné sprístupniť, sprístupnenie prostredníctvom odkazu nie je povolené",
+ "Not allowed to create a federated share with the same user" : "Nie je možné vytvoriť združené sprístupnenie so sebou samým",
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Sprístupňovanie %s zlyhalo, nepodarilo sa nájsť %s, možno je server dočasne nedostupný.",
+ "Share type %s is not valid for %s" : "Typ sprístupnenia %s nie je možný pre %s",
+ "Setting permissions for %s failed, because the permissions exceed permissions granted to %s" : "Nastavenie povolení pre %s zlyhalo, pretože povolenia prekračujú povolenia udelené %s",
+ "Setting permissions for %s failed, because the item was not found" : "Nastavenie povolení pre %s zlyhalo, pretože položka sa nenašla",
+ "Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "Sprístupnenie nemôže byť ukončené skôr, ako po %s dňoch.",
+ "Cannot set expiration date. Expiration date is in the past" : "Nie je možné nastaviť dátum konca platnosti. Dátum konca platnosti je v minulosti.",
+ "Cannot clear expiration date. Shares are required to have an expiration date." : "Nemožno vymazať čas expirácie. Pri sprístupnení je čas exspirácie vyžadovaný.",
+ "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Backend pre sprístupnenie %s musí implementovať rozhranie OCP\\Share_Backend",
+ "Sharing backend %s not found" : "Backend sprístupnenia %s nebol nájdený",
+ "Sharing backend for %s not found" : "Backend sprístupnenia pre %s nebol nájdený",
+ "Sharing failed, because the user %s is the original sharer" : "Sprístupnenie zlyhalo, pretože používateľ %s je pôvodný spoločný používateľ",
+ "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Sprístupnenie %s zlyhalo, pretože povolenia prekračujú povolenia udelené %s",
+ "Sharing %s failed, because resharing is not allowed" : "Nie je možné sprístupniť %s ďalším osobám",
+ "Sharing %s failed, because the sharing backend for %s could not find its source" : "Sprístupnenie %s zlyhalo, backend nenašiel zdrojový %s",
+ "Sharing %s failed, because the file could not be found in the file cache" : "Sprístupnenie %s zlyhalo, pretože súbor sa nenachádza vo vyrovnávacej pamäti súborov",
+ "Expiration date is in the past" : "Dátum konca platnosti je v minulosti",
+ "Cannot set expiration date more than %s days in the future" : "Nie je možné nastaviť dátum konca platnosti viac ako %s dní v budúcnosti",
+ "Could not find category \"%s\"" : "Nemožno nájsť danú kategóriu \"%s\"",
+ "Sunday" : "Nedeľa",
+ "Monday" : "Pondelok",
+ "Tuesday" : "Utorok",
+ "Wednesday" : "Streda",
+ "Thursday" : "Štvrtok",
+ "Friday" : "Piatok",
+ "Saturday" : "Sobota",
+ "Sun." : "Ned.",
+ "Mon." : "Pon.",
+ "Tue." : "Uto.",
+ "Wed." : "Str.",
+ "Thu." : "Štv.",
+ "Fri." : "Pia.",
+ "Sat." : "Sob.",
+ "Su" : "Ne",
+ "Mo" : "Po",
+ "Tu" : "Ut",
+ "We" : "St",
+ "Th" : "Št",
+ "Fr" : "Pi",
+ "Sa" : "So",
+ "January" : "Január",
+ "February" : "Február",
+ "March" : "Marec",
+ "April" : "Apríl",
+ "May" : "Máj",
+ "June" : "Jún",
+ "July" : "Júl",
+ "August" : "August",
+ "September" : "September",
+ "October" : "Október",
+ "November" : "November",
+ "December" : "December",
+ "Jan." : "Jan.",
+ "Feb." : "Feb.",
+ "Mar." : "Mar.",
+ "Apr." : "Apr.",
+ "May." : "Máj.",
+ "Jun." : "Jún.",
+ "Jul." : "Júl.",
+ "Aug." : "Aug.",
+ "Sep." : "Sep.",
+ "Oct." : "Okt.",
+ "Nov." : "Nov.",
+ "Dec." : "Dec.",
+ "Apps" : "Aplikácie",
+ "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "V mene používateľa je možné použiť iba nasledovné znaky: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"",
+ "A valid username must be provided" : "Musíte zadať platné používateľské meno",
+ "Username contains whitespace at the beginning or at the end" : "Meno používateľa obsahuje na začiatku, alebo na konci medzeru",
+ "A valid password must be provided" : "Musíte zadať platné heslo",
+ "The username is already being used" : "Meno používateľa je už použité",
+ "Login canceled by app" : "Prihlásenie bolo zrušené aplikáciou",
+ "User disabled" : "Používateľ zakázaný",
+ "Help" : "Pomoc",
+ "Personal" : "Osobné",
+ "Users" : "Používatelia",
+ "Admin" : "Administrátor",
+ "App \"%s\" cannot be installed because appinfo file cannot be read." : "Aplikáciu \"%s\" nie je možné nainštalovať, lebo nebolo možné načítať súbor s informáciami o aplikácií.",
+ "App \"%s\" cannot be installed because it is not compatible with this version of the server." : "Aplikácia \"%s\" nie je kompatibilná s verziou servera, preto nemôže byť nainštalovaná.",
+ "No app name specified" : "Nešpecifikované meno aplikácie",
+ "App '%s' could not be installed!" : "Aplikáciu '%s' nebolo možné nainštalovať!",
+ "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "Aplikáciu \"%s\" nie je možné inštalovať, pretože nie sú splnené nasledovné závislosti: %s",
+ "a safe home for all your data" : "bezpečný domov pre všetky vaše dáta",
+ "File is currently busy, please try again later" : "Súbor sa práve používa, skúste prosím neskôr",
+ "Can't read file" : "Nemožno čítať súbor.",
+ "Application is not enabled" : "Aplikácia nie je zapnutá",
+ "Authentication error" : "Chyba autentifikácie",
+ "Token expired. Please reload page." : "Token vypršal. Obnovte, prosím, stránku.",
+ "Unknown user" : "Neznámy používateľ",
+ "No database drivers (sqlite, mysql, or postgresql) installed." : "Ovládače databázy (sqlite, mysql, alebo postgresql) nie sú nainštalované.",
+ "Cannot write into \"config\" directory" : "Nie je možné zapisovať do priečinka \"config\"",
+ "Cannot write into \"apps\" directory" : "Nie je možné zapisovať do priečinka \"apps\"",
+ "This can usually be fixed by %sgiving the webserver write access to the apps directory%s or disabling the appstore in the config file." : "Toto je zvyčajne možné opraviť tým, že %s udelíte webovému serveru oprávnenie na zápis do priečinka aplikácií %s alebo vypnete obchod s aplikáciami v konfiguračnom súbore.",
+ "Cannot create \"data\" directory (%s)" : "Nie je možné vytvoriť priečinok \"data\" (%s)",
+ "This can usually be fixed by <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">giving the webserver write access to the root directory</a>." : "To je zvyčajne možné opraviť tým <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">že udelíte webovému serveru oprávnenie na zápis do koreňového priečinka</a>.",
+ "Permissions can usually be fixed by %sgiving the webserver write access to the root directory%s." : "Oprávnenia je zvyčajne možné opraviť tým, že %sudelíte webovému serveru oprávnenie na zápis do koreňového priečinka%s.",
+ "Setting locale to %s failed" : "Nastavenie locale na %s zlyhalo",
+ "Please install one of these locales on your system and restart your webserver." : "Prosím, nainštalujte si aspoň jeden z týchto jazykov so svojho systému a reštartujte webserver.",
+ "Please ask your server administrator to install the module." : "Prosím, požiadajte administrátora vášho servera o inštaláciu modulu.",
+ "PHP module %s not installed." : "PHP modul %s nie je nainštalovaný.",
+ "PHP setting \"%s\" is not set to \"%s\"." : "Voľba PHP „%s“ nie je nastavená na „%s“.",
+ "Adjusting this setting in php.ini will make Nextcloud run again" : "Použitím týchto nastavení v php.ini dovolí Nextcloudu sa znova spustiť",
+ "mbstring.func_overload is set to \"%s\" instead of the expected value \"0\"" : "mbstring.func_overload je nastavený na \"%s\", namiesto predpokladanej hodnoty \"0\"",
+ "To fix this issue set <code>mbstring.func_overload</code> to <code>0</code> in your php.ini" : "Oprava problému spočíva v nastavení <code>mbstring.func_overload</code> na <code>0</code> vo vašom php.ini",
+ "libxml2 2.7.0 is at least required. Currently %s is installed." : "Vyžadovaná verzia libxml2 je 2.7.0 a vyššia. Momentálne je nainštalovaná verzia %s.",
+ "To fix this issue update your libxml2 version and restart your web server." : "Pre vyriešenie tohto problému aktualizujte prosím verziu libxml2 a reštartujte webový server.",
+ "PHP is apparently set up to strip inline doc blocks. This will make several core apps inaccessible." : "PHP je zjavne nastavené, aby odstraňovalo bloky vloženej dokumentácie. To zneprístupní niekoľko základných aplikácií.",
+ "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "To je pravdepodobne spôsobené cache/akcelerátorom ako napr. Zend OPcache alebo eAccelerator.",
+ "PHP modules have been installed, but they are still listed as missing?" : "PHP moduly boli nainštalované, ale stále sa tvária, že chýbajú?",
+ "Please ask your server administrator to restart the web server." : "Prosím, požiadajte administrátora vášho servera o reštartovanie webového servera.",
+ "PostgreSQL >= 9 required" : "Vyžadované PostgreSQL >= 9",
+ "Please upgrade your database version" : "Prosím, aktualizujte verziu svojej databázy",
+ "Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Prosím, zmeňte oprávnenia na 0770, aby tento priečinok nemohli ostatní používatelia otvoriť.",
+ "Data directory (%s) is readable by other users" : "Priečinok dát (%s) je prístupný na čítanie ostatným používateľom",
+ "Data directory (%s) must be an absolute path" : "Priečinok dát (%s) musí byť zadaný ako absolútna cesta",
+ "Check the value of \"datadirectory\" in your configuration" : "Skontrolujte hodnotu \"datadirectory\" vo vašej konfigurácii",
+ "Data directory (%s) is invalid" : "Priečinok dát (%s) je neplatný",
+ "Please check that the data directory contains a file \".ocdata\" in its root." : "Prosím, skontrolujte, či priečinok dát obsahuje súbor \".ocdata\".",
+ "Could not obtain lock type %d on \"%s\"." : "Nepodarilo sa získať zámok typu %d na „%s“.",
+ "4-byte characters are not supported in file names" : "V názve súbou nie sú podporované 4-bajtové znaky.",
+ "App directory already exists" : "Aplikačný priečinok už existuje",
+ "Can't create app folder. Please fix permissions. %s" : "Nemožno vytvoriť aplikačný priečinok. Prosím upravte povolenia. %s",
+ "Archive does not contain a directory named %s" : "Archív neobsahuje priečinok zvaný %s",
+ "No source specified when installing app" : "Nešpecifikovaný zdroj pri inštalácii aplikácie",
+ "No href specified when installing app from http" : "Nešpecifikovaný atribút \"href\" pri inštalácii aplikácie pomocou protokolu \"http\"",
+ "No path specified when installing app from local file" : "Nešpecifikovaná cesta pri inštalácii aplikácie z lokálneho súboru",
+ "Archives of type %s are not supported" : "Tento typ archívu %s nie je podporovaný",
+ "Failed to open archive when installing app" : "Zlyhanie pri otváraní archívu počas inštalácie aplikácie",
+ "App does not provide an info.xml file" : "Aplikácia neposkytuje súbor info.xml",
+ "App cannot be installed because appinfo file cannot be read." : "Aplikáciu nie je možné nainštalovať, lebo nebolo možné načítať súbor s informáciami o aplikácií.",
+ "Signature could not get checked. Please contact the app developer and check your admin screen." : "Nebolo možné skontrolovať podpis aplikácie. Kontaktujte prosím vývojára aplikácie a skontrolujte administrátorské nastavenia.",
+ "App can't be installed because of not allowed code in the App" : "Aplikácia nemôže byť nainštalovaná pre nepovolený kód v aplikácii",
+ "App can't be installed because it is not compatible with this version of the server" : "Aplikácia nie je kompatibilná s verziou servera, preto nemôže byť nainštalovaná",
+ "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "Aplikácia nemôže byť nainštalovaná pretože obsahuje značku<shipped>true</shipped>, ktorá nie je povolená pre nedodávané aplikácie",
+ "Recommended" : "Odporúčané",
+ "Microsoft Windows Platform is not supported" : "Microsoft Windows platforma nieje podporovaná",
+ "Storage not available" : "Úložisko nie je dostupné"
+},
+"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;");
diff --git a/lib/l10n/sk_SK.json b/lib/l10n/sk_SK.json
new file mode 100644
index 00000000000..ddd42d62b8e
--- /dev/null
+++ b/lib/l10n/sk_SK.json
@@ -0,0 +1,213 @@
+{ "translations": {
+ "Cannot write into \"config\" directory!" : "Nie je možné zapisovat do priečinka \"config\"!",
+ "This can usually be fixed by giving the webserver write access to the config directory" : "To je zvyčajne možné opraviť tým, že udelíte webovému serveru oprávnenie na zápis do priečinka s konfiguráciou.",
+ "See %s" : "Pozri %s",
+ "This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "To je zvyčajne možné opraviť tým, že %s udelíte webovému serveru oprávnenie na zápis k adresáru s konfiguráciou%s.",
+ "The files of the app %$1s were not replaced correctly. Make sure it is a version compatible with the server." : "Súbory aplikácie %$1s nebolo možné úspešne nahradiť. Uistite sa, že verzia je kompatibilná s verziou servera.",
+ "Sample configuration detected" : "Detekovaná bola vzorová konfigurácia",
+ "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Zistilo sa, že konfigurácia bola skopírovaná zo vzorových súborov. Takáto konfigurácia nie je podporovaná a môže poškodiť vašu inštaláciu. Prečítajte si dokumentáciu pred vykonaním zmien v config.php",
+ "PHP %s or higher is required." : "Požadovaná verzia PHP %s alebo vyššia.",
+ "PHP with a version lower than %s is required." : "PHP je vyžadované vo vyššej verzii ako %s.",
+ "Following databases are supported: %s" : "Podporované sú tieto databázy: %s",
+ "The command line tool %s could not be found" : "Nástroj príkazového riadka %s nebol nájdený",
+ "The library %s is not available." : "Knižnica %s je nedostupná.",
+ "Library %s with a version higher than %s is required - available version %s." : "Požadovaná je knižnica %s vo vyššej verzii ako %s - dostupná verzia %s.",
+ "Library %s with a version lower than %s is required - available version %s." : "Požadovaná je knižnica %s v nižšej verzii ako %s - dostupná verzia %s.",
+ "Following platforms are supported: %s" : "Podporované sú nasledovné systémy: %s",
+ "Server version %s or higher is required." : "Je vyžadovaná verzia servera %s alebo vyššia.",
+ "Server version %s or lower is required." : "Je vyžadovaná verzia servera %s alebo nižšia.",
+ "Unknown filetype" : "Neznámy typ súboru",
+ "Invalid image" : "Chybný obrázok",
+ "today" : "dnes",
+ "yesterday" : "včera",
+ "_%n day ago_::_%n days ago_" : ["včera","pred %n dňami","pred %n dňami"],
+ "last month" : "minulý mesiac",
+ "_%n month ago_::_%n months ago_" : ["pred %n mesiacom","pred %n mesiacmi","pred %n mesiacmi"],
+ "last year" : "minulý rok",
+ "_%n year ago_::_%n years ago_" : ["vlani","pred %n rokmi","pred %n rokmi"],
+ "_%n hour ago_::_%n hours ago_" : ["pred %n hodinou","pred %n hodinami","pred %n hodinami"],
+ "_%n minute ago_::_%n minutes ago_" : ["pred %n minútou","pred %n minútami","pred %n minútami"],
+ "seconds ago" : "pred sekundami",
+ "Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "Modul s ID: %s neexistuje. Povoľte ho prosím vo vašom nastavení aplikácií alebo konaktujte správcu.",
+ "File name is a reserved word" : "Názov súboru je rezervované slovo.",
+ "File name contains at least one invalid character" : "Názov súboru obsahuje nepovolené znaky.",
+ "File name is too long" : "Meno súboru je veľmi dlhé.",
+ "Dot files are not allowed" : "Názov súboru začínajúci bodkou nie je povolený.",
+ "Empty filename is not allowed" : "Prázdny názov súboru nie je povolený",
+ "APCu" : "APCu",
+ "Redis" : "Redis",
+ "Server settings" : "Nastavenia servera",
+ "Sharing" : "Sprístupnenie",
+ "Encryption" : "Šifrovanie",
+ "Additional settings" : "Ďalšie nastavenia",
+ "Tips & tricks" : "Tipy a triky",
+ "%s enter the database username." : "Zadajte používateľské meno %s databázy.",
+ "%s enter the database name." : "Zadajte názov databázy pre %s databázy.",
+ "%s you may not use dots in the database name" : "V názve databázy %s nemôžete používať bodky",
+ "Oracle connection could not be established" : "Nie je možné pripojiť sa k Oracle",
+ "Oracle username and/or password not valid" : "Používateľské meno a/alebo heslo pre Oracle databázu je neplatné",
+ "DB Error: \"%s\"" : "Chyba DB: \"%s\"",
+ "Offending command was: \"%s\"" : "Podozrivý príkaz bol: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Musíte zadať jestvujúci účet alebo administrátora.",
+ "Offending command was: \"%s\", name: %s, password: %s" : "Podozrivý príkaz bol: \"%s\", meno: %s, heslo: %s",
+ "PostgreSQL username and/or password not valid" : "Používateľské meno a/alebo heslo pre PostgreSQL databázu je neplatné",
+ "Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X nie je podporovaný a %s nebude správne fungovať na tejto platforme. Použite ho na vlastné riziko!",
+ "For the best results, please consider using a GNU/Linux server instead." : "Pre dosiahnutie najlepších výsledkov, prosím zvážte použitie GNU/Linux servera.",
+ "It seems that this %s instance is running on a 32-bit PHP environment and the open_basedir has been configured in php.ini. This will lead to problems with files over 4 GB and is highly discouraged." : "Zdá sa, že táto inštancia %s beží v 32-bitovom prostredí PHP a v php.ini bola nastavená voľba open_basedir. To bude zdrojom problémov so súbormi väčšími ako 4GB a dôrazne sa neodporúča.",
+ "Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "Prosím, odstráňte nastavenie open_basedir vo vašom php.ini alebo prejdite na 64-bit PHP.",
+ "Set an admin username." : "Zadajte používateľské meno administrátora.",
+ "Set an admin password." : "Zadajte heslo administrátora.",
+ "Can't create or write into the data directory %s" : "Nemožno vytvoriť alebo zapisovať do priečinka dát %s",
+ "Invalid Federated Cloud ID" : "Neplatné združené Cloud ID",
+ "%s shared »%s« with you" : "%s vám sprístupnil »%s«",
+ "%s via %s" : "%s cez %s",
+ "Sharing %s failed, because the backend does not allow shares from type %i" : "Sprístupnenie %s zlyhalo, backend nepodporuje typ sprístupnenia %i",
+ "Sharing %s failed, because the file does not exist" : "Nie je možné sprístupniť %s, súbor neexistuje",
+ "You are not allowed to share %s" : "Nemôžete sprístupniť %s",
+ "Sharing %s failed, because you can not share with yourself" : "Sprístupnenie %s zlyhalo, nieje možné sprístupniť obsah so sebou samým",
+ "Sharing %s failed, because the user %s does not exist" : "Sprístupnenie %s zlyhalo, používateľ %s neexistuje",
+ "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Sprístupnenie %s zlyhalo, používateľ %s nie je členom žiadnej skupiny spoločnej s používateľom %s",
+ "Sharing %s failed, because this item is already shared with %s" : "Sprístupnenie %s zlyhalo, pretože táto položka už je prístupná pre %s",
+ "Sharing %s failed, because this item is already shared with user %s" : "Sprístupnenie %s zlyhalo, táto položka už je používateľovi %s prístupná",
+ "Sharing %s failed, because the group %s does not exist" : "Sprístupnenie %s zlyhalo, skupina %s neexistuje",
+ "Sharing %s failed, because %s is not a member of the group %s" : "Sprístupnenie %s zlyhalo, %s nie je členom skupiny %s",
+ "You need to provide a password to create a public link, only protected links are allowed" : "Musíte zadať heslo ak chcete vytvoriť verejný odkaz, lebo iba odkazy chránené heslom sú povolené",
+ "Sharing %s failed, because sharing with links is not allowed" : "%s nie je možné sprístupniť, sprístupnenie prostredníctvom odkazu nie je povolené",
+ "Not allowed to create a federated share with the same user" : "Nie je možné vytvoriť združené sprístupnenie so sebou samým",
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Sprístupňovanie %s zlyhalo, nepodarilo sa nájsť %s, možno je server dočasne nedostupný.",
+ "Share type %s is not valid for %s" : "Typ sprístupnenia %s nie je možný pre %s",
+ "Setting permissions for %s failed, because the permissions exceed permissions granted to %s" : "Nastavenie povolení pre %s zlyhalo, pretože povolenia prekračujú povolenia udelené %s",
+ "Setting permissions for %s failed, because the item was not found" : "Nastavenie povolení pre %s zlyhalo, pretože položka sa nenašla",
+ "Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "Sprístupnenie nemôže byť ukončené skôr, ako po %s dňoch.",
+ "Cannot set expiration date. Expiration date is in the past" : "Nie je možné nastaviť dátum konca platnosti. Dátum konca platnosti je v minulosti.",
+ "Cannot clear expiration date. Shares are required to have an expiration date." : "Nemožno vymazať čas expirácie. Pri sprístupnení je čas exspirácie vyžadovaný.",
+ "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Backend pre sprístupnenie %s musí implementovať rozhranie OCP\\Share_Backend",
+ "Sharing backend %s not found" : "Backend sprístupnenia %s nebol nájdený",
+ "Sharing backend for %s not found" : "Backend sprístupnenia pre %s nebol nájdený",
+ "Sharing failed, because the user %s is the original sharer" : "Sprístupnenie zlyhalo, pretože používateľ %s je pôvodný spoločný používateľ",
+ "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Sprístupnenie %s zlyhalo, pretože povolenia prekračujú povolenia udelené %s",
+ "Sharing %s failed, because resharing is not allowed" : "Nie je možné sprístupniť %s ďalším osobám",
+ "Sharing %s failed, because the sharing backend for %s could not find its source" : "Sprístupnenie %s zlyhalo, backend nenašiel zdrojový %s",
+ "Sharing %s failed, because the file could not be found in the file cache" : "Sprístupnenie %s zlyhalo, pretože súbor sa nenachádza vo vyrovnávacej pamäti súborov",
+ "Expiration date is in the past" : "Dátum konca platnosti je v minulosti",
+ "Cannot set expiration date more than %s days in the future" : "Nie je možné nastaviť dátum konca platnosti viac ako %s dní v budúcnosti",
+ "Could not find category \"%s\"" : "Nemožno nájsť danú kategóriu \"%s\"",
+ "Sunday" : "Nedeľa",
+ "Monday" : "Pondelok",
+ "Tuesday" : "Utorok",
+ "Wednesday" : "Streda",
+ "Thursday" : "Štvrtok",
+ "Friday" : "Piatok",
+ "Saturday" : "Sobota",
+ "Sun." : "Ned.",
+ "Mon." : "Pon.",
+ "Tue." : "Uto.",
+ "Wed." : "Str.",
+ "Thu." : "Štv.",
+ "Fri." : "Pia.",
+ "Sat." : "Sob.",
+ "Su" : "Ne",
+ "Mo" : "Po",
+ "Tu" : "Ut",
+ "We" : "St",
+ "Th" : "Št",
+ "Fr" : "Pi",
+ "Sa" : "So",
+ "January" : "Január",
+ "February" : "Február",
+ "March" : "Marec",
+ "April" : "Apríl",
+ "May" : "Máj",
+ "June" : "Jún",
+ "July" : "Júl",
+ "August" : "August",
+ "September" : "September",
+ "October" : "Október",
+ "November" : "November",
+ "December" : "December",
+ "Jan." : "Jan.",
+ "Feb." : "Feb.",
+ "Mar." : "Mar.",
+ "Apr." : "Apr.",
+ "May." : "Máj.",
+ "Jun." : "Jún.",
+ "Jul." : "Júl.",
+ "Aug." : "Aug.",
+ "Sep." : "Sep.",
+ "Oct." : "Okt.",
+ "Nov." : "Nov.",
+ "Dec." : "Dec.",
+ "Apps" : "Aplikácie",
+ "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "V mene používateľa je možné použiť iba nasledovné znaky: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"",
+ "A valid username must be provided" : "Musíte zadať platné používateľské meno",
+ "Username contains whitespace at the beginning or at the end" : "Meno používateľa obsahuje na začiatku, alebo na konci medzeru",
+ "A valid password must be provided" : "Musíte zadať platné heslo",
+ "The username is already being used" : "Meno používateľa je už použité",
+ "Login canceled by app" : "Prihlásenie bolo zrušené aplikáciou",
+ "User disabled" : "Používateľ zakázaný",
+ "Help" : "Pomoc",
+ "Personal" : "Osobné",
+ "Users" : "Používatelia",
+ "Admin" : "Administrátor",
+ "App \"%s\" cannot be installed because appinfo file cannot be read." : "Aplikáciu \"%s\" nie je možné nainštalovať, lebo nebolo možné načítať súbor s informáciami o aplikácií.",
+ "App \"%s\" cannot be installed because it is not compatible with this version of the server." : "Aplikácia \"%s\" nie je kompatibilná s verziou servera, preto nemôže byť nainštalovaná.",
+ "No app name specified" : "Nešpecifikované meno aplikácie",
+ "App '%s' could not be installed!" : "Aplikáciu '%s' nebolo možné nainštalovať!",
+ "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "Aplikáciu \"%s\" nie je možné inštalovať, pretože nie sú splnené nasledovné závislosti: %s",
+ "a safe home for all your data" : "bezpečný domov pre všetky vaše dáta",
+ "File is currently busy, please try again later" : "Súbor sa práve používa, skúste prosím neskôr",
+ "Can't read file" : "Nemožno čítať súbor.",
+ "Application is not enabled" : "Aplikácia nie je zapnutá",
+ "Authentication error" : "Chyba autentifikácie",
+ "Token expired. Please reload page." : "Token vypršal. Obnovte, prosím, stránku.",
+ "Unknown user" : "Neznámy používateľ",
+ "No database drivers (sqlite, mysql, or postgresql) installed." : "Ovládače databázy (sqlite, mysql, alebo postgresql) nie sú nainštalované.",
+ "Cannot write into \"config\" directory" : "Nie je možné zapisovať do priečinka \"config\"",
+ "Cannot write into \"apps\" directory" : "Nie je možné zapisovať do priečinka \"apps\"",
+ "This can usually be fixed by %sgiving the webserver write access to the apps directory%s or disabling the appstore in the config file." : "Toto je zvyčajne možné opraviť tým, že %s udelíte webovému serveru oprávnenie na zápis do priečinka aplikácií %s alebo vypnete obchod s aplikáciami v konfiguračnom súbore.",
+ "Cannot create \"data\" directory (%s)" : "Nie je možné vytvoriť priečinok \"data\" (%s)",
+ "This can usually be fixed by <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">giving the webserver write access to the root directory</a>." : "To je zvyčajne možné opraviť tým <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">že udelíte webovému serveru oprávnenie na zápis do koreňového priečinka</a>.",
+ "Permissions can usually be fixed by %sgiving the webserver write access to the root directory%s." : "Oprávnenia je zvyčajne možné opraviť tým, že %sudelíte webovému serveru oprávnenie na zápis do koreňového priečinka%s.",
+ "Setting locale to %s failed" : "Nastavenie locale na %s zlyhalo",
+ "Please install one of these locales on your system and restart your webserver." : "Prosím, nainštalujte si aspoň jeden z týchto jazykov so svojho systému a reštartujte webserver.",
+ "Please ask your server administrator to install the module." : "Prosím, požiadajte administrátora vášho servera o inštaláciu modulu.",
+ "PHP module %s not installed." : "PHP modul %s nie je nainštalovaný.",
+ "PHP setting \"%s\" is not set to \"%s\"." : "Voľba PHP „%s“ nie je nastavená na „%s“.",
+ "Adjusting this setting in php.ini will make Nextcloud run again" : "Použitím týchto nastavení v php.ini dovolí Nextcloudu sa znova spustiť",
+ "mbstring.func_overload is set to \"%s\" instead of the expected value \"0\"" : "mbstring.func_overload je nastavený na \"%s\", namiesto predpokladanej hodnoty \"0\"",
+ "To fix this issue set <code>mbstring.func_overload</code> to <code>0</code> in your php.ini" : "Oprava problému spočíva v nastavení <code>mbstring.func_overload</code> na <code>0</code> vo vašom php.ini",
+ "libxml2 2.7.0 is at least required. Currently %s is installed." : "Vyžadovaná verzia libxml2 je 2.7.0 a vyššia. Momentálne je nainštalovaná verzia %s.",
+ "To fix this issue update your libxml2 version and restart your web server." : "Pre vyriešenie tohto problému aktualizujte prosím verziu libxml2 a reštartujte webový server.",
+ "PHP is apparently set up to strip inline doc blocks. This will make several core apps inaccessible." : "PHP je zjavne nastavené, aby odstraňovalo bloky vloženej dokumentácie. To zneprístupní niekoľko základných aplikácií.",
+ "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "To je pravdepodobne spôsobené cache/akcelerátorom ako napr. Zend OPcache alebo eAccelerator.",
+ "PHP modules have been installed, but they are still listed as missing?" : "PHP moduly boli nainštalované, ale stále sa tvária, že chýbajú?",
+ "Please ask your server administrator to restart the web server." : "Prosím, požiadajte administrátora vášho servera o reštartovanie webového servera.",
+ "PostgreSQL >= 9 required" : "Vyžadované PostgreSQL >= 9",
+ "Please upgrade your database version" : "Prosím, aktualizujte verziu svojej databázy",
+ "Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Prosím, zmeňte oprávnenia na 0770, aby tento priečinok nemohli ostatní používatelia otvoriť.",
+ "Data directory (%s) is readable by other users" : "Priečinok dát (%s) je prístupný na čítanie ostatným používateľom",
+ "Data directory (%s) must be an absolute path" : "Priečinok dát (%s) musí byť zadaný ako absolútna cesta",
+ "Check the value of \"datadirectory\" in your configuration" : "Skontrolujte hodnotu \"datadirectory\" vo vašej konfigurácii",
+ "Data directory (%s) is invalid" : "Priečinok dát (%s) je neplatný",
+ "Please check that the data directory contains a file \".ocdata\" in its root." : "Prosím, skontrolujte, či priečinok dát obsahuje súbor \".ocdata\".",
+ "Could not obtain lock type %d on \"%s\"." : "Nepodarilo sa získať zámok typu %d na „%s“.",
+ "4-byte characters are not supported in file names" : "V názve súbou nie sú podporované 4-bajtové znaky.",
+ "App directory already exists" : "Aplikačný priečinok už existuje",
+ "Can't create app folder. Please fix permissions. %s" : "Nemožno vytvoriť aplikačný priečinok. Prosím upravte povolenia. %s",
+ "Archive does not contain a directory named %s" : "Archív neobsahuje priečinok zvaný %s",
+ "No source specified when installing app" : "Nešpecifikovaný zdroj pri inštalácii aplikácie",
+ "No href specified when installing app from http" : "Nešpecifikovaný atribút \"href\" pri inštalácii aplikácie pomocou protokolu \"http\"",
+ "No path specified when installing app from local file" : "Nešpecifikovaná cesta pri inštalácii aplikácie z lokálneho súboru",
+ "Archives of type %s are not supported" : "Tento typ archívu %s nie je podporovaný",
+ "Failed to open archive when installing app" : "Zlyhanie pri otváraní archívu počas inštalácie aplikácie",
+ "App does not provide an info.xml file" : "Aplikácia neposkytuje súbor info.xml",
+ "App cannot be installed because appinfo file cannot be read." : "Aplikáciu nie je možné nainštalovať, lebo nebolo možné načítať súbor s informáciami o aplikácií.",
+ "Signature could not get checked. Please contact the app developer and check your admin screen." : "Nebolo možné skontrolovať podpis aplikácie. Kontaktujte prosím vývojára aplikácie a skontrolujte administrátorské nastavenia.",
+ "App can't be installed because of not allowed code in the App" : "Aplikácia nemôže byť nainštalovaná pre nepovolený kód v aplikácii",
+ "App can't be installed because it is not compatible with this version of the server" : "Aplikácia nie je kompatibilná s verziou servera, preto nemôže byť nainštalovaná",
+ "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "Aplikácia nemôže byť nainštalovaná pretože obsahuje značku<shipped>true</shipped>, ktorá nie je povolená pre nedodávané aplikácie",
+ "Recommended" : "Odporúčané",
+ "Microsoft Windows Platform is not supported" : "Microsoft Windows platforma nieje podporovaná",
+ "Storage not available" : "Úložisko nie je dostupné"
+},"pluralForm" :"nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"
+} \ No newline at end of file
diff --git a/lib/l10n/sq.js b/lib/l10n/sq.js
new file mode 100644
index 00000000000..97f60522df5
--- /dev/null
+++ b/lib/l10n/sq.js
@@ -0,0 +1,233 @@
+OC.L10N.register(
+ "lib",
+ {
+ "Cannot write into \"config\" directory!" : "Nuk shkruhet dot te drejtoria \"config\"!",
+ "This can usually be fixed by giving the webserver write access to the config directory" : "Zakonisht kjo mund të ndreqet duke i akorduar shërbyesit web të drejta shkrimi mbi drejtorinë e formësimeve",
+ "See %s" : "Shihni %s",
+ "This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Zakonisht kjo mund të ndreqet duke %si akorduar shërbyesit web të drejta shkrimi mbi drejtorinë e formësimeve%s.",
+ "The files of the app %$1s were not replaced correctly. Make sure it is a version compatible with the server." : "Skedarët e aplikacionit %$1s nuk u zëvëndësuan në mënyrë korrekte. Sigurohuni që është një version që përputhet me serverin.",
+ "Sample configuration detected" : "U gjet formësim shembull",
+ "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "U pa se është kopjuar shembulli për formësime. Kjo mund të prishë instalimin tuaj dhe nuk mbulohet. Ju lutemi, lexoni dokumentimin, përpara se të kryeni ndryshime te config.php",
+ "%1$s and %2$s" : "%1$s dhe %2$s",
+ "%1$s, %2$s and %3$s" : "%1$s, %2$s dhe %3$s",
+ "%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s dhe %4$s",
+ "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s dhe %5$s",
+ "PHP %s or higher is required." : "Kërkohet PHP %s ose më sipër.",
+ "PHP with a version lower than %s is required." : "Lypset PHP me një version më të ulët se sa %s.",
+ "%sbit or higher PHP required." : "Lypset PHP %sbit ose më i ri.",
+ "Following databases are supported: %s" : "Mbulohen bazat vijuese të të dhënave: %s",
+ "The command line tool %s could not be found" : "Mjeti rresht urdhrash %s s’u gjet dot",
+ "The library %s is not available." : "Libraria %s s’është e passhme.",
+ "Library %s with a version higher than %s is required - available version %s." : "Kërkohet librari %s me një version më të madh se %s - version gati %s.",
+ "Library %s with a version lower than %s is required - available version %s." : "Lypset librari %s me një version më të vogël se %s - version gati %s.",
+ "Following platforms are supported: %s" : "Mbulohen platformat vijuese: %s",
+ "Server version %s or higher is required." : "Versioni i serverit kërkohet %s ose më lartë",
+ "Server version %s or lower is required." : "Versioni i serverit kërkohet %s ose më poshtë",
+ "Unknown filetype" : "Lloj i panjohur skedari",
+ "Invalid image" : "Figurë e pavlefshme",
+ "Avatar image is not square" : "Imazhi avatar nuk është katror",
+ "today" : "sot",
+ "yesterday" : "dje",
+ "_%n day ago_::_%n days ago_" : ["%n ditë më parë","%n ditë më parë"],
+ "last month" : "muajin e shkuar",
+ "_%n month ago_::_%n months ago_" : ["%n muaj më parë","%n muaj më parë"],
+ "last year" : "vitin e shkuar",
+ "_%n year ago_::_%n years ago_" : ["%n vit më parë","%n vjet më parë"],
+ "_%n hour ago_::_%n hours ago_" : ["%n orë më parë","%n orë më parë"],
+ "_%n minute ago_::_%n minutes ago_" : ["%n minutë më parë","%n minuta më parë"],
+ "seconds ago" : "sekonda më parë",
+ "Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "S’ka modul me id: %s. Ju lutemi, aktivizojeni te rregullimet tuaja për aplikacionin ose lidhuni me përgjegjësin tuaj.",
+ "File name is a reserved word" : "Emri i kartelës është një emër i rezervuar",
+ "File name contains at least one invalid character" : "Emri i kartelës përmban të paktën një shenjë të pavlefshme",
+ "File name is too long" : "Emri i kartelës është shumë i gjatë",
+ "Dot files are not allowed" : "Nuk lejohen kartela të fshehura",
+ "Empty filename is not allowed" : "Nuk lejohen emra të zbrazët kartelash",
+ "APCu" : "APCu",
+ "Redis" : "Redis",
+ "Server settings" : "Konfigurimi i serverit",
+ "Sharing" : "Ndarja",
+ "Encryption" : "Enkriptimi",
+ "Additional settings" : "Konfigurime shtesë",
+ "Tips & tricks" : "Këshilla dhe rrengje",
+ "%s enter the database username and name." : "%s jepni emrin e bazës së të dhënave dhe emrin e përdoruesit për të.",
+ "%s enter the database username." : "%s jepni emrin e përdoruesit të bazës së të dhënave.",
+ "%s enter the database name." : "%s jepni emrin e bazës së të dhënave.",
+ "%s you may not use dots in the database name" : "%s s’mund të përdorni pika te emri i bazës së të dhënave",
+ "Oracle connection could not be established" : "S’u vendos dot lidhje me Oracle",
+ "Oracle username and/or password not valid" : "Emër përdoruesi dhe/ose fjalëkalim Oracle-i i pavlefshëm",
+ "DB Error: \"%s\"" : "Gabim DB-je: \"%s\"",
+ "Offending command was: \"%s\"" : "Urdhri shkaktar qe: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Lypset të jepni ose një llogari ekzistuese, ose llogarinë e përgjegjësit.",
+ "Offending command was: \"%s\", name: %s, password: %s" : "Urdhri shkaktar qe: \"%s\", emër: %s, fjalëkalim: %s",
+ "PostgreSQL username and/or password not valid" : "Emër përdoruesi dhe/ose fjalëkalim PostgreSQL jo të vlefshëm",
+ "Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X nuk mbulohet dhe %s s’do të funksionojë si duhet në këtë platformë. Përdoreni nën përgjegjësinë tuaj! ",
+ "For the best results, please consider using a GNU/Linux server instead." : "Për përfundimet më të mira, ju lutemi, më mirë konsideroni përdorimin e një shërbyesi GNU/Linux.",
+ "It seems that this %s instance is running on a 32-bit PHP environment and the open_basedir has been configured in php.ini. This will lead to problems with files over 4 GB and is highly discouraged." : "Duket se kjo instancë %s xhiron një mjedis PHP 32-bitësh dhe open_basedir është e formësuar, te php.ini. Kjo do të shpjerë në probleme me kartela më të mëdha se 4 GB dhe këshillohet me forcë të mos ndodhë.",
+ "Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "Ju lutemi, hiqeni rregullimin open_basedir nga php.ini juaj ose hidhuni te PHP për 64-bit.",
+ "Set an admin username." : "Caktoni një emër përdoruesi për përgjegjësin.",
+ "Set an admin password." : "Caktoni një fjalëkalim për përgjegjësin.",
+ "Can't create or write into the data directory %s" : "S’e krijon ose s’shkruan dot te drejtoria e të dhënave %s",
+ "Invalid Federated Cloud ID" : "ID Federated Cloud e pavlefshme",
+ "%s shared »%s« with you" : "%s ndau me ju »%s«",
+ "%s via %s" : "%s përmes %s",
+ "Sharing %s failed, because the backend does not allow shares from type %i" : "Ndarja e %s dështoi, ngaqë pjesa përgjegjëse e shërbyesit nuk lejon ndarje prej llojit %i",
+ "Sharing %s failed, because the file does not exist" : "Ndarja e %s me të tjerët dështoi, ngaqë kartela s’ekziston",
+ "You are not allowed to share %s" : "Nuk ju lejohet ta ndani %s me të tjerët",
+ "Sharing %s failed, because you can not share with yourself" : "Ndarja e %s dështoi, ngaqë s’mund të ndani gjëra me vetveten",
+ "Sharing %s failed, because the user %s does not exist" : "Ndarja e %s me të tjerët dështoi, ngaqë përdoruesi %s nuk ekziston",
+ "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Ndarja për %s dështoi, ngaqë përdoruesi %s s’është anëtar i ndonjë grupi ku %s është anëtar",
+ "Sharing %s failed, because this item is already shared with %s" : "Ndarja për %s dështoi, ngaqë ky objekt është ndarë një herë me %s",
+ "Sharing %s failed, because this item is already shared with user %s" : "Ndarja e %s me të tjerët dështoi, ngaqë ky objekt është ndarë tashmë me përdoruesin %s",
+ "Sharing %s failed, because the group %s does not exist" : "Ndarja e %s me të tjerët dështoi, ngaqë grupi %s nuk ekziston",
+ "Sharing %s failed, because %s is not a member of the group %s" : "Ndarja e %s me të tjerët dështoi, ngaqë %s s’është anëtar i grupit %s",
+ "You need to provide a password to create a public link, only protected links are allowed" : "Lypset të jepni një fjalëkalim që të krijoni një lidhje publike, lejohen vetëm lidhje të mbrojtura",
+ "Sharing %s failed, because sharing with links is not allowed" : "Ndarja e %s me të tjerët dështoi, ngaqë nuk lejohet ndarja me lidhje",
+ "Not allowed to create a federated share with the same user" : "S’i lejohet të krijojë një ndarje të federuar me të njëjtin përdorues",
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Ndarja për %s dështoi, s’u gjet dot %s, ndoshta shërbyesi është hëpërhë jashtë pune.",
+ "Share type %s is not valid for %s" : "Lloji i ndarjes %s s’është i vlefshëm për %s",
+ "Setting permissions for %s failed, because the permissions exceed permissions granted to %s" : "Caktimi i lejeve për %s dështoi, ngaqë lejet tejkalojnë lejet e akorduara për %s",
+ "Setting permissions for %s failed, because the item was not found" : "Caktimi i lejeve për %s dështoi, ngaqë s’u gjet objekti",
+ "Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "S’caktohet dot data e skadimit. Ndarjet s’mund të skadojnë më vonë se %s pasi të jenë ofruar",
+ "Cannot set expiration date. Expiration date is in the past" : "S’caktohet dot data e skadimit. Data e skadimit bie në të kaluarën",
+ "Cannot clear expiration date. Shares are required to have an expiration date." : "S’hiqet dot data e skadimit. Ndarjet lypse të kenë një datë skadimi.",
+ "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Mekanizmi i shërbimit për ndarje %s duhet të sendërtojë ndërfaqen OCP\\Share_Backend",
+ "Sharing backend %s not found" : "S’u gjet mekanizmi i shërbimit për ndarje %s",
+ "Sharing backend for %s not found" : "S’u gjet mekanizmi i shërbimit për ndarje për %s",
+ "Sharing failed, because the user %s is the original sharer" : "Ndarja dështoi, ngaqë përdoruesi %s është ai që e ndau fillimisht",
+ "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Ndarja e %s me të tjerët dështoi, ngaqë lejet tejkalojnë lejet e akorduara për %s",
+ "Sharing %s failed, because resharing is not allowed" : "Ndarja e %s me të tjerët dështoi, ngaqë nuk lejohen rindarje",
+ "Sharing %s failed, because the sharing backend for %s could not find its source" : "Ndarja e %s dështoi, ngaqë mekanizmi i shërbimit për ndarje për %s s’gjeti dot burimin për të",
+ "Sharing %s failed, because the file could not be found in the file cache" : "Ndarja e %s me të tjerët dështoi, ngaqë kartela s’u gjet dot te fshehtina e kartelave",
+ "Cannot increase permissions of %s" : "S’mund të shtohen lejet për %s",
+ "Files can't be shared with delete permissions" : "Kartelat s’mund të ndahen me leje fshirjeje",
+ "Files can't be shared with create permissions" : "Kartelat s’mund të ndahen me leje krijimi",
+ "Expiration date is in the past" : "Data e skadimit bie në të kaluarën",
+ "Cannot set expiration date more than %s days in the future" : "S’mund të caktohet data e skadimit më shumë se %s ditë në të ardhmen",
+ "Could not find category \"%s\"" : "S’u gjet kategori \"%s\"",
+ "Sunday" : "E diel",
+ "Monday" : "E hënë",
+ "Tuesday" : "E martë",
+ "Wednesday" : "E mërkurë",
+ "Thursday" : "E enjte",
+ "Friday" : "E premte",
+ "Saturday" : "E shtunë",
+ "Sun." : "Die.",
+ "Mon." : "Hën.",
+ "Tue." : "Mar.",
+ "Wed." : "Mër.",
+ "Thu." : "Enj.",
+ "Fri." : "Pre.",
+ "Sat." : "Sht.",
+ "Su" : "Di",
+ "Mo" : "Hë",
+ "Tu" : "Ma",
+ "We" : "Më",
+ "Th" : "En",
+ "Fr" : "Pr",
+ "Sa" : "Sh",
+ "January" : "Janar",
+ "February" : "Shkurt",
+ "March" : "Mars",
+ "April" : "Prill",
+ "May" : "Maj",
+ "June" : "Qershor",
+ "July" : "Korrik",
+ "August" : "Gusht",
+ "September" : "Shtator",
+ "October" : "Tetor",
+ "November" : "Nëntor",
+ "December" : "Dhjetor",
+ "Jan." : "Jan.",
+ "Feb." : "Shk.",
+ "Mar." : "Mar.",
+ "Apr." : "Pri.",
+ "May." : "Maj.",
+ "Jun." : "Qer.",
+ "Jul." : "Kor.",
+ "Aug." : "Gus.",
+ "Sep." : "Sht.",
+ "Oct." : "Tet.",
+ "Nov." : "Nën.",
+ "Dec." : "Dhj.",
+ "Apps" : "Aplikacione",
+ "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "Në një emër përdoruesi lejohen vetëm shenjat vijuese: \"a-z\", \"A-Z\", \"0-9\", dhe \"_.@-\"",
+ "A valid username must be provided" : "Duhet dhënë një emër i vlefshëm përdoruesi",
+ "Username contains whitespace at the beginning or at the end" : "Emri i përdoruesit përmban hapësirë në fillim ose në fund",
+ "A valid password must be provided" : "Duhet dhënë një fjalëkalim i vlefshëm",
+ "The username is already being used" : "Emri i përdoruesit është tashmë i përdorur",
+ "Login canceled by app" : "Hyrja u anulua nga aplikacioni",
+ "User disabled" : "Përdorues i çaktivizuar",
+ "Help" : "Ndihmë",
+ "Personal" : "Personale",
+ "Users" : "Përdorues",
+ "Admin" : "Admin",
+ "App \"%s\" cannot be installed because appinfo file cannot be read." : "Aplikacioni \"%s\" s’mund të instalohet, ngaqë s’lexohet dot kartela appinfo.",
+ "App \"%s\" cannot be installed because it is not compatible with this version of the server." : "Aplikacioni \"%s\" nuk mund të instalohet sepse nuk përputhet me këtë version të serverit.",
+ "No app name specified" : "S’u dha emër aplikacioni",
+ "App '%s' could not be installed!" : "Aplikacioni \"%s\" nuk mund të instalohet!",
+ "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "Përditësimi \"%s\" s’instalohet dot, ngaqë s’plotësohen varësitë vijuese: %s.",
+ "a safe home for all your data" : "Një shtëpi e sigurt për të dhënat e tua",
+ "File is currently busy, please try again later" : "Kartela tani është e zënë, ju lutemi, riprovoni më vonë.",
+ "Can't read file" : "S'lexohet dot kartela",
+ "Application is not enabled" : "Aplikacioni s’është aktivizuar",
+ "Authentication error" : "Gabim mirëfilltësimi",
+ "Token expired. Please reload page." : "Token-i ka skaduar. Ju lutemi, ringarkoni faqen.",
+ "Unknown user" : "Përdorues i panjohur",
+ "No database drivers (sqlite, mysql, or postgresql) installed." : "S’ka baza të dhënash (sqlite, mysql, ose postgresql) të instaluara.",
+ "Cannot write into \"config\" directory" : "S’shkruhet dot te drejtoria \"config\"",
+ "Cannot write into \"apps\" directory" : "S’shkruhet dot te drejtoria \"apps\"",
+ "This can usually be fixed by %sgiving the webserver write access to the apps directory%s or disabling the appstore in the config file." : "Zakonisht kjo mund të ndreqet duke %si akorduar shërbyesit web të drejta shkrimi mbi drejtorinë e aplikacionit%s ose duke e çaktivizuar appstore-in te kartela e formësimit.",
+ "Cannot create \"data\" directory (%s)" : "S’krijohet dot drejtoria \"data\" (%s)",
+ "This can usually be fixed by <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">giving the webserver write access to the root directory</a>." : "Zakonisht kjo mund të ndreqet duke <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">i akorduar shërbyesit web të drejta shkrimi mbi drejtorinë rrënjë</a>.",
+ "Permissions can usually be fixed by %sgiving the webserver write access to the root directory%s." : "Zakonisht lejet mund të ndreqen duke %si akorduar shërbyesit web të drejta shkrimi mbi drejtorinë rrënjë%s.",
+ "Setting locale to %s failed" : "Caktimi i gjuhës si %s dështoi",
+ "Please install one of these locales on your system and restart your webserver." : "Ju lutemi, instaloni te sistemi juaj një prej këtyre vendoreve dhe rinisni shërbyesin tuaj web.",
+ "Please ask your server administrator to install the module." : "Ju lutemi, kërkojini përgjegjësit të shërbyesit ta instalojë modulin.",
+ "PHP module %s not installed." : "Moduli PHP %s s’është i instaluar.",
+ "PHP setting \"%s\" is not set to \"%s\"." : "Rregullimi PHP \"%s\" s’është vënë si \"%s\".",
+ "Adjusting this setting in php.ini will make Nextcloud run again" : "Përshtatja e këtij konfigurimi në php.ini do e bëjë Nextcloud të punoj përsëri",
+ "mbstring.func_overload is set to \"%s\" instead of the expected value \"0\"" : "mbstring.func_overload është caktuar si \"%s\", në vend të vlerës së pritshme \"0\"",
+ "To fix this issue set <code>mbstring.func_overload</code> to <code>0</code> in your php.ini" : "Për ta ndrequr këtë problem, caktoni për <code>mbstring.func_overload</code> vlerën <code>0</code> te php.ini juaj",
+ "libxml2 2.7.0 is at least required. Currently %s is installed." : "Lypset të paktën libxml2 2.7.0. Hëpërhë e instaluar është %s.",
+ "To fix this issue update your libxml2 version and restart your web server." : "Për të ndrequr këtë problem, përditësoni libxml2 dhe rinisni shërbyesin tuaj web.",
+ "PHP is apparently set up to strip inline doc blocks. This will make several core apps inaccessible." : "Me sa duket, PHP-ja është rregulluar që të heqë blloqe të brendshëm dokumentimi. Kjo do t’i nxjerrë nga funksionimi disa aplikacione bazë.",
+ "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Kjo ka gjasa të jetë shkaktuar nga një fshehtinë/përshpejtues i tillë si Zend OPcache ose eAccelerator.",
+ "PHP modules have been installed, but they are still listed as missing?" : "Modulet PHP janë instaluar, por tregohen ende sikur mungojnë?",
+ "Please ask your server administrator to restart the web server." : "Ju lutemi, kërkojini përgjegjësit të shërbyesit tuaj të rinisë shërbyesin web.",
+ "PostgreSQL >= 9 required" : "Lypset PostgreSQL >= 9",
+ "Please upgrade your database version" : "Ju lutemi, përmirësoni bazën tuaj të të dhënave me një version më të ri.",
+ "Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Ju lutemi, kalojani lejet në 0770, që kështu atë drejtori të mos mund ta shfaqin përdorues të tjerë.",
+ "Data directory (%s) is readable by other users" : "Drejtoria e të dhënave (%s) është e lexueshme nga përdorues të tjerë",
+ "Data directory (%s) must be an absolute path" : "Drejtoria e të dhënave (%s) duhet të jepë një shteg absolut",
+ "Check the value of \"datadirectory\" in your configuration" : "Kontrolloni vlerën e \"datadirectory\" te formësimi juaj",
+ "Data directory (%s) is invalid" : "Drejtoria e të dhënave (%s) është e pavlefshme",
+ "Please check that the data directory contains a file \".ocdata\" in its root." : "Ju lutemi, kontrolloni që drejtoria e të dhënave përmban në rrënjën e saj një kartelë \".ocdata\".",
+ "Could not obtain lock type %d on \"%s\"." : "S’u mor dot lloj kyçjeje %d në \"%s\".",
+ "Storage unauthorized. %s" : "Depozitë e paautorizuar. %s",
+ "Storage incomplete configuration. %s" : "Formësim jo i plotë i depozitës. %s",
+ "Storage connection error. %s" : "Gabim lidhje te depozita. %s",
+ "Storage is temporarily not available" : "Hapsira ruajtëse nuk është në dispozicion përkohësisht",
+ "Storage connection timeout. %s" : "Mbarim kohe lidhjeje për depozitën. %s",
+ "4-byte characters are not supported in file names" : "Shenjat 4-bajtshe nuk mbulohet në emra kartelash",
+ "App directory already exists" : "Drejtoria e aplikacionit ekziston tashmë",
+ "Can't create app folder. Please fix permissions. %s" : "S’krijohet dot dosje aplikacioni. Ju lutemi, ndreqni lejet. %s",
+ "Archive does not contain a directory named %s" : "Arkivi s’përmban një drejtori të quajtur %s",
+ "No source specified when installing app" : "S’u dha burim gjatë instalimit të aplikacionit",
+ "No href specified when installing app from http" : "S’u tregua href gjatë instalimit të aplikacionit nga http",
+ "No path specified when installing app from local file" : "S’u caktua shteg gjatë instalimit të aplikacionit prej kartele vendore",
+ "Archives of type %s are not supported" : "Nuk mbulohen arkivat e llojit %s",
+ "Failed to open archive when installing app" : "Dështoi në hapje arkivi teksa instalohej aplikacioni",
+ "App does not provide an info.xml file" : "Aplikacioni s’ofron kartele të vlefshme .xml",
+ "App cannot be installed because appinfo file cannot be read." : "Aplikacioni s’mund të instalohet, ngaqë s’lexohet dot kartela appinfo.",
+ "Signature could not get checked. Please contact the app developer and check your admin screen." : "Nënshkrimi s’u kontrollua dot. Ju lutemi, lidhuni me zhvilluesin e aplikacionit dhe kontrolloni te skena juaj e përgjegjësit.",
+ "App can't be installed because of not allowed code in the App" : "Aplikacioni s’mund të instalohet, për shkak kodi të palejuar te Aplikacioni",
+ "App can't be installed because it is not compatible with this version of the server" : "Aplikacioni nuk mund të instalohet sepse nuk përputhet me këtë version të serverit.",
+ "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "Aplikacioni s’mund të instalohet, ngaqë përmban etiketën <shipped>true</shipped> e cila nuk lejohet për aplikacione që s’janë hedhur në qarkullim",
+ "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "Aplikacioni s’mund të instalohet, ngaqë versioni te info.xml s’është i njëjti me versionin e treguar nga shitorja e aplikacioneve",
+ "Logging" : "Duke u lidhur",
+ "Recommended" : "E rekomanduar",
+ "Microsoft Windows Platform is not supported" : "Microsoft Windows Platform nuk mbulohet",
+ "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "Përdorimi i Serverit Nextcloud në një platformë Microsoft Windows nuk mbështetet. Ne ju sugjerojmë të përdorni një server Linux në një makinë virtuale nëse nuk e keni mundësinë që të migroni vetë serverin.",
+ "Storage not available" : "Pa depozitë gati"
+},
+"nplurals=2; plural=(n != 1);");
diff --git a/lib/l10n/sq.json b/lib/l10n/sq.json
new file mode 100644
index 00000000000..2adce922b41
--- /dev/null
+++ b/lib/l10n/sq.json
@@ -0,0 +1,231 @@
+{ "translations": {
+ "Cannot write into \"config\" directory!" : "Nuk shkruhet dot te drejtoria \"config\"!",
+ "This can usually be fixed by giving the webserver write access to the config directory" : "Zakonisht kjo mund të ndreqet duke i akorduar shërbyesit web të drejta shkrimi mbi drejtorinë e formësimeve",
+ "See %s" : "Shihni %s",
+ "This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Zakonisht kjo mund të ndreqet duke %si akorduar shërbyesit web të drejta shkrimi mbi drejtorinë e formësimeve%s.",
+ "The files of the app %$1s were not replaced correctly. Make sure it is a version compatible with the server." : "Skedarët e aplikacionit %$1s nuk u zëvëndësuan në mënyrë korrekte. Sigurohuni që është një version që përputhet me serverin.",
+ "Sample configuration detected" : "U gjet formësim shembull",
+ "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "U pa se është kopjuar shembulli për formësime. Kjo mund të prishë instalimin tuaj dhe nuk mbulohet. Ju lutemi, lexoni dokumentimin, përpara se të kryeni ndryshime te config.php",
+ "%1$s and %2$s" : "%1$s dhe %2$s",
+ "%1$s, %2$s and %3$s" : "%1$s, %2$s dhe %3$s",
+ "%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s dhe %4$s",
+ "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s dhe %5$s",
+ "PHP %s or higher is required." : "Kërkohet PHP %s ose më sipër.",
+ "PHP with a version lower than %s is required." : "Lypset PHP me një version më të ulët se sa %s.",
+ "%sbit or higher PHP required." : "Lypset PHP %sbit ose më i ri.",
+ "Following databases are supported: %s" : "Mbulohen bazat vijuese të të dhënave: %s",
+ "The command line tool %s could not be found" : "Mjeti rresht urdhrash %s s’u gjet dot",
+ "The library %s is not available." : "Libraria %s s’është e passhme.",
+ "Library %s with a version higher than %s is required - available version %s." : "Kërkohet librari %s me një version më të madh se %s - version gati %s.",
+ "Library %s with a version lower than %s is required - available version %s." : "Lypset librari %s me një version më të vogël se %s - version gati %s.",
+ "Following platforms are supported: %s" : "Mbulohen platformat vijuese: %s",
+ "Server version %s or higher is required." : "Versioni i serverit kërkohet %s ose më lartë",
+ "Server version %s or lower is required." : "Versioni i serverit kërkohet %s ose më poshtë",
+ "Unknown filetype" : "Lloj i panjohur skedari",
+ "Invalid image" : "Figurë e pavlefshme",
+ "Avatar image is not square" : "Imazhi avatar nuk është katror",
+ "today" : "sot",
+ "yesterday" : "dje",
+ "_%n day ago_::_%n days ago_" : ["%n ditë më parë","%n ditë më parë"],
+ "last month" : "muajin e shkuar",
+ "_%n month ago_::_%n months ago_" : ["%n muaj më parë","%n muaj më parë"],
+ "last year" : "vitin e shkuar",
+ "_%n year ago_::_%n years ago_" : ["%n vit më parë","%n vjet më parë"],
+ "_%n hour ago_::_%n hours ago_" : ["%n orë më parë","%n orë më parë"],
+ "_%n minute ago_::_%n minutes ago_" : ["%n minutë më parë","%n minuta më parë"],
+ "seconds ago" : "sekonda më parë",
+ "Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "S’ka modul me id: %s. Ju lutemi, aktivizojeni te rregullimet tuaja për aplikacionin ose lidhuni me përgjegjësin tuaj.",
+ "File name is a reserved word" : "Emri i kartelës është një emër i rezervuar",
+ "File name contains at least one invalid character" : "Emri i kartelës përmban të paktën një shenjë të pavlefshme",
+ "File name is too long" : "Emri i kartelës është shumë i gjatë",
+ "Dot files are not allowed" : "Nuk lejohen kartela të fshehura",
+ "Empty filename is not allowed" : "Nuk lejohen emra të zbrazët kartelash",
+ "APCu" : "APCu",
+ "Redis" : "Redis",
+ "Server settings" : "Konfigurimi i serverit",
+ "Sharing" : "Ndarja",
+ "Encryption" : "Enkriptimi",
+ "Additional settings" : "Konfigurime shtesë",
+ "Tips & tricks" : "Këshilla dhe rrengje",
+ "%s enter the database username and name." : "%s jepni emrin e bazës së të dhënave dhe emrin e përdoruesit për të.",
+ "%s enter the database username." : "%s jepni emrin e përdoruesit të bazës së të dhënave.",
+ "%s enter the database name." : "%s jepni emrin e bazës së të dhënave.",
+ "%s you may not use dots in the database name" : "%s s’mund të përdorni pika te emri i bazës së të dhënave",
+ "Oracle connection could not be established" : "S’u vendos dot lidhje me Oracle",
+ "Oracle username and/or password not valid" : "Emër përdoruesi dhe/ose fjalëkalim Oracle-i i pavlefshëm",
+ "DB Error: \"%s\"" : "Gabim DB-je: \"%s\"",
+ "Offending command was: \"%s\"" : "Urdhri shkaktar qe: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Lypset të jepni ose një llogari ekzistuese, ose llogarinë e përgjegjësit.",
+ "Offending command was: \"%s\", name: %s, password: %s" : "Urdhri shkaktar qe: \"%s\", emër: %s, fjalëkalim: %s",
+ "PostgreSQL username and/or password not valid" : "Emër përdoruesi dhe/ose fjalëkalim PostgreSQL jo të vlefshëm",
+ "Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X nuk mbulohet dhe %s s’do të funksionojë si duhet në këtë platformë. Përdoreni nën përgjegjësinë tuaj! ",
+ "For the best results, please consider using a GNU/Linux server instead." : "Për përfundimet më të mira, ju lutemi, më mirë konsideroni përdorimin e një shërbyesi GNU/Linux.",
+ "It seems that this %s instance is running on a 32-bit PHP environment and the open_basedir has been configured in php.ini. This will lead to problems with files over 4 GB and is highly discouraged." : "Duket se kjo instancë %s xhiron një mjedis PHP 32-bitësh dhe open_basedir është e formësuar, te php.ini. Kjo do të shpjerë në probleme me kartela më të mëdha se 4 GB dhe këshillohet me forcë të mos ndodhë.",
+ "Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "Ju lutemi, hiqeni rregullimin open_basedir nga php.ini juaj ose hidhuni te PHP për 64-bit.",
+ "Set an admin username." : "Caktoni një emër përdoruesi për përgjegjësin.",
+ "Set an admin password." : "Caktoni një fjalëkalim për përgjegjësin.",
+ "Can't create or write into the data directory %s" : "S’e krijon ose s’shkruan dot te drejtoria e të dhënave %s",
+ "Invalid Federated Cloud ID" : "ID Federated Cloud e pavlefshme",
+ "%s shared »%s« with you" : "%s ndau me ju »%s«",
+ "%s via %s" : "%s përmes %s",
+ "Sharing %s failed, because the backend does not allow shares from type %i" : "Ndarja e %s dështoi, ngaqë pjesa përgjegjëse e shërbyesit nuk lejon ndarje prej llojit %i",
+ "Sharing %s failed, because the file does not exist" : "Ndarja e %s me të tjerët dështoi, ngaqë kartela s’ekziston",
+ "You are not allowed to share %s" : "Nuk ju lejohet ta ndani %s me të tjerët",
+ "Sharing %s failed, because you can not share with yourself" : "Ndarja e %s dështoi, ngaqë s’mund të ndani gjëra me vetveten",
+ "Sharing %s failed, because the user %s does not exist" : "Ndarja e %s me të tjerët dështoi, ngaqë përdoruesi %s nuk ekziston",
+ "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Ndarja për %s dështoi, ngaqë përdoruesi %s s’është anëtar i ndonjë grupi ku %s është anëtar",
+ "Sharing %s failed, because this item is already shared with %s" : "Ndarja për %s dështoi, ngaqë ky objekt është ndarë një herë me %s",
+ "Sharing %s failed, because this item is already shared with user %s" : "Ndarja e %s me të tjerët dështoi, ngaqë ky objekt është ndarë tashmë me përdoruesin %s",
+ "Sharing %s failed, because the group %s does not exist" : "Ndarja e %s me të tjerët dështoi, ngaqë grupi %s nuk ekziston",
+ "Sharing %s failed, because %s is not a member of the group %s" : "Ndarja e %s me të tjerët dështoi, ngaqë %s s’është anëtar i grupit %s",
+ "You need to provide a password to create a public link, only protected links are allowed" : "Lypset të jepni një fjalëkalim që të krijoni një lidhje publike, lejohen vetëm lidhje të mbrojtura",
+ "Sharing %s failed, because sharing with links is not allowed" : "Ndarja e %s me të tjerët dështoi, ngaqë nuk lejohet ndarja me lidhje",
+ "Not allowed to create a federated share with the same user" : "S’i lejohet të krijojë një ndarje të federuar me të njëjtin përdorues",
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Ndarja për %s dështoi, s’u gjet dot %s, ndoshta shërbyesi është hëpërhë jashtë pune.",
+ "Share type %s is not valid for %s" : "Lloji i ndarjes %s s’është i vlefshëm për %s",
+ "Setting permissions for %s failed, because the permissions exceed permissions granted to %s" : "Caktimi i lejeve për %s dështoi, ngaqë lejet tejkalojnë lejet e akorduara për %s",
+ "Setting permissions for %s failed, because the item was not found" : "Caktimi i lejeve për %s dështoi, ngaqë s’u gjet objekti",
+ "Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "S’caktohet dot data e skadimit. Ndarjet s’mund të skadojnë më vonë se %s pasi të jenë ofruar",
+ "Cannot set expiration date. Expiration date is in the past" : "S’caktohet dot data e skadimit. Data e skadimit bie në të kaluarën",
+ "Cannot clear expiration date. Shares are required to have an expiration date." : "S’hiqet dot data e skadimit. Ndarjet lypse të kenë një datë skadimi.",
+ "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Mekanizmi i shërbimit për ndarje %s duhet të sendërtojë ndërfaqen OCP\\Share_Backend",
+ "Sharing backend %s not found" : "S’u gjet mekanizmi i shërbimit për ndarje %s",
+ "Sharing backend for %s not found" : "S’u gjet mekanizmi i shërbimit për ndarje për %s",
+ "Sharing failed, because the user %s is the original sharer" : "Ndarja dështoi, ngaqë përdoruesi %s është ai që e ndau fillimisht",
+ "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Ndarja e %s me të tjerët dështoi, ngaqë lejet tejkalojnë lejet e akorduara për %s",
+ "Sharing %s failed, because resharing is not allowed" : "Ndarja e %s me të tjerët dështoi, ngaqë nuk lejohen rindarje",
+ "Sharing %s failed, because the sharing backend for %s could not find its source" : "Ndarja e %s dështoi, ngaqë mekanizmi i shërbimit për ndarje për %s s’gjeti dot burimin për të",
+ "Sharing %s failed, because the file could not be found in the file cache" : "Ndarja e %s me të tjerët dështoi, ngaqë kartela s’u gjet dot te fshehtina e kartelave",
+ "Cannot increase permissions of %s" : "S’mund të shtohen lejet për %s",
+ "Files can't be shared with delete permissions" : "Kartelat s’mund të ndahen me leje fshirjeje",
+ "Files can't be shared with create permissions" : "Kartelat s’mund të ndahen me leje krijimi",
+ "Expiration date is in the past" : "Data e skadimit bie në të kaluarën",
+ "Cannot set expiration date more than %s days in the future" : "S’mund të caktohet data e skadimit më shumë se %s ditë në të ardhmen",
+ "Could not find category \"%s\"" : "S’u gjet kategori \"%s\"",
+ "Sunday" : "E diel",
+ "Monday" : "E hënë",
+ "Tuesday" : "E martë",
+ "Wednesday" : "E mërkurë",
+ "Thursday" : "E enjte",
+ "Friday" : "E premte",
+ "Saturday" : "E shtunë",
+ "Sun." : "Die.",
+ "Mon." : "Hën.",
+ "Tue." : "Mar.",
+ "Wed." : "Mër.",
+ "Thu." : "Enj.",
+ "Fri." : "Pre.",
+ "Sat." : "Sht.",
+ "Su" : "Di",
+ "Mo" : "Hë",
+ "Tu" : "Ma",
+ "We" : "Më",
+ "Th" : "En",
+ "Fr" : "Pr",
+ "Sa" : "Sh",
+ "January" : "Janar",
+ "February" : "Shkurt",
+ "March" : "Mars",
+ "April" : "Prill",
+ "May" : "Maj",
+ "June" : "Qershor",
+ "July" : "Korrik",
+ "August" : "Gusht",
+ "September" : "Shtator",
+ "October" : "Tetor",
+ "November" : "Nëntor",
+ "December" : "Dhjetor",
+ "Jan." : "Jan.",
+ "Feb." : "Shk.",
+ "Mar." : "Mar.",
+ "Apr." : "Pri.",
+ "May." : "Maj.",
+ "Jun." : "Qer.",
+ "Jul." : "Kor.",
+ "Aug." : "Gus.",
+ "Sep." : "Sht.",
+ "Oct." : "Tet.",
+ "Nov." : "Nën.",
+ "Dec." : "Dhj.",
+ "Apps" : "Aplikacione",
+ "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "Në një emër përdoruesi lejohen vetëm shenjat vijuese: \"a-z\", \"A-Z\", \"0-9\", dhe \"_.@-\"",
+ "A valid username must be provided" : "Duhet dhënë një emër i vlefshëm përdoruesi",
+ "Username contains whitespace at the beginning or at the end" : "Emri i përdoruesit përmban hapësirë në fillim ose në fund",
+ "A valid password must be provided" : "Duhet dhënë një fjalëkalim i vlefshëm",
+ "The username is already being used" : "Emri i përdoruesit është tashmë i përdorur",
+ "Login canceled by app" : "Hyrja u anulua nga aplikacioni",
+ "User disabled" : "Përdorues i çaktivizuar",
+ "Help" : "Ndihmë",
+ "Personal" : "Personale",
+ "Users" : "Përdorues",
+ "Admin" : "Admin",
+ "App \"%s\" cannot be installed because appinfo file cannot be read." : "Aplikacioni \"%s\" s’mund të instalohet, ngaqë s’lexohet dot kartela appinfo.",
+ "App \"%s\" cannot be installed because it is not compatible with this version of the server." : "Aplikacioni \"%s\" nuk mund të instalohet sepse nuk përputhet me këtë version të serverit.",
+ "No app name specified" : "S’u dha emër aplikacioni",
+ "App '%s' could not be installed!" : "Aplikacioni \"%s\" nuk mund të instalohet!",
+ "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "Përditësimi \"%s\" s’instalohet dot, ngaqë s’plotësohen varësitë vijuese: %s.",
+ "a safe home for all your data" : "Një shtëpi e sigurt për të dhënat e tua",
+ "File is currently busy, please try again later" : "Kartela tani është e zënë, ju lutemi, riprovoni më vonë.",
+ "Can't read file" : "S'lexohet dot kartela",
+ "Application is not enabled" : "Aplikacioni s’është aktivizuar",
+ "Authentication error" : "Gabim mirëfilltësimi",
+ "Token expired. Please reload page." : "Token-i ka skaduar. Ju lutemi, ringarkoni faqen.",
+ "Unknown user" : "Përdorues i panjohur",
+ "No database drivers (sqlite, mysql, or postgresql) installed." : "S’ka baza të dhënash (sqlite, mysql, ose postgresql) të instaluara.",
+ "Cannot write into \"config\" directory" : "S’shkruhet dot te drejtoria \"config\"",
+ "Cannot write into \"apps\" directory" : "S’shkruhet dot te drejtoria \"apps\"",
+ "This can usually be fixed by %sgiving the webserver write access to the apps directory%s or disabling the appstore in the config file." : "Zakonisht kjo mund të ndreqet duke %si akorduar shërbyesit web të drejta shkrimi mbi drejtorinë e aplikacionit%s ose duke e çaktivizuar appstore-in te kartela e formësimit.",
+ "Cannot create \"data\" directory (%s)" : "S’krijohet dot drejtoria \"data\" (%s)",
+ "This can usually be fixed by <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">giving the webserver write access to the root directory</a>." : "Zakonisht kjo mund të ndreqet duke <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">i akorduar shërbyesit web të drejta shkrimi mbi drejtorinë rrënjë</a>.",
+ "Permissions can usually be fixed by %sgiving the webserver write access to the root directory%s." : "Zakonisht lejet mund të ndreqen duke %si akorduar shërbyesit web të drejta shkrimi mbi drejtorinë rrënjë%s.",
+ "Setting locale to %s failed" : "Caktimi i gjuhës si %s dështoi",
+ "Please install one of these locales on your system and restart your webserver." : "Ju lutemi, instaloni te sistemi juaj një prej këtyre vendoreve dhe rinisni shërbyesin tuaj web.",
+ "Please ask your server administrator to install the module." : "Ju lutemi, kërkojini përgjegjësit të shërbyesit ta instalojë modulin.",
+ "PHP module %s not installed." : "Moduli PHP %s s’është i instaluar.",
+ "PHP setting \"%s\" is not set to \"%s\"." : "Rregullimi PHP \"%s\" s’është vënë si \"%s\".",
+ "Adjusting this setting in php.ini will make Nextcloud run again" : "Përshtatja e këtij konfigurimi në php.ini do e bëjë Nextcloud të punoj përsëri",
+ "mbstring.func_overload is set to \"%s\" instead of the expected value \"0\"" : "mbstring.func_overload është caktuar si \"%s\", në vend të vlerës së pritshme \"0\"",
+ "To fix this issue set <code>mbstring.func_overload</code> to <code>0</code> in your php.ini" : "Për ta ndrequr këtë problem, caktoni për <code>mbstring.func_overload</code> vlerën <code>0</code> te php.ini juaj",
+ "libxml2 2.7.0 is at least required. Currently %s is installed." : "Lypset të paktën libxml2 2.7.0. Hëpërhë e instaluar është %s.",
+ "To fix this issue update your libxml2 version and restart your web server." : "Për të ndrequr këtë problem, përditësoni libxml2 dhe rinisni shërbyesin tuaj web.",
+ "PHP is apparently set up to strip inline doc blocks. This will make several core apps inaccessible." : "Me sa duket, PHP-ja është rregulluar që të heqë blloqe të brendshëm dokumentimi. Kjo do t’i nxjerrë nga funksionimi disa aplikacione bazë.",
+ "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Kjo ka gjasa të jetë shkaktuar nga një fshehtinë/përshpejtues i tillë si Zend OPcache ose eAccelerator.",
+ "PHP modules have been installed, but they are still listed as missing?" : "Modulet PHP janë instaluar, por tregohen ende sikur mungojnë?",
+ "Please ask your server administrator to restart the web server." : "Ju lutemi, kërkojini përgjegjësit të shërbyesit tuaj të rinisë shërbyesin web.",
+ "PostgreSQL >= 9 required" : "Lypset PostgreSQL >= 9",
+ "Please upgrade your database version" : "Ju lutemi, përmirësoni bazën tuaj të të dhënave me një version më të ri.",
+ "Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Ju lutemi, kalojani lejet në 0770, që kështu atë drejtori të mos mund ta shfaqin përdorues të tjerë.",
+ "Data directory (%s) is readable by other users" : "Drejtoria e të dhënave (%s) është e lexueshme nga përdorues të tjerë",
+ "Data directory (%s) must be an absolute path" : "Drejtoria e të dhënave (%s) duhet të jepë një shteg absolut",
+ "Check the value of \"datadirectory\" in your configuration" : "Kontrolloni vlerën e \"datadirectory\" te formësimi juaj",
+ "Data directory (%s) is invalid" : "Drejtoria e të dhënave (%s) është e pavlefshme",
+ "Please check that the data directory contains a file \".ocdata\" in its root." : "Ju lutemi, kontrolloni që drejtoria e të dhënave përmban në rrënjën e saj një kartelë \".ocdata\".",
+ "Could not obtain lock type %d on \"%s\"." : "S’u mor dot lloj kyçjeje %d në \"%s\".",
+ "Storage unauthorized. %s" : "Depozitë e paautorizuar. %s",
+ "Storage incomplete configuration. %s" : "Formësim jo i plotë i depozitës. %s",
+ "Storage connection error. %s" : "Gabim lidhje te depozita. %s",
+ "Storage is temporarily not available" : "Hapsira ruajtëse nuk është në dispozicion përkohësisht",
+ "Storage connection timeout. %s" : "Mbarim kohe lidhjeje për depozitën. %s",
+ "4-byte characters are not supported in file names" : "Shenjat 4-bajtshe nuk mbulohet në emra kartelash",
+ "App directory already exists" : "Drejtoria e aplikacionit ekziston tashmë",
+ "Can't create app folder. Please fix permissions. %s" : "S’krijohet dot dosje aplikacioni. Ju lutemi, ndreqni lejet. %s",
+ "Archive does not contain a directory named %s" : "Arkivi s’përmban një drejtori të quajtur %s",
+ "No source specified when installing app" : "S’u dha burim gjatë instalimit të aplikacionit",
+ "No href specified when installing app from http" : "S’u tregua href gjatë instalimit të aplikacionit nga http",
+ "No path specified when installing app from local file" : "S’u caktua shteg gjatë instalimit të aplikacionit prej kartele vendore",
+ "Archives of type %s are not supported" : "Nuk mbulohen arkivat e llojit %s",
+ "Failed to open archive when installing app" : "Dështoi në hapje arkivi teksa instalohej aplikacioni",
+ "App does not provide an info.xml file" : "Aplikacioni s’ofron kartele të vlefshme .xml",
+ "App cannot be installed because appinfo file cannot be read." : "Aplikacioni s’mund të instalohet, ngaqë s’lexohet dot kartela appinfo.",
+ "Signature could not get checked. Please contact the app developer and check your admin screen." : "Nënshkrimi s’u kontrollua dot. Ju lutemi, lidhuni me zhvilluesin e aplikacionit dhe kontrolloni te skena juaj e përgjegjësit.",
+ "App can't be installed because of not allowed code in the App" : "Aplikacioni s’mund të instalohet, për shkak kodi të palejuar te Aplikacioni",
+ "App can't be installed because it is not compatible with this version of the server" : "Aplikacioni nuk mund të instalohet sepse nuk përputhet me këtë version të serverit.",
+ "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "Aplikacioni s’mund të instalohet, ngaqë përmban etiketën <shipped>true</shipped> e cila nuk lejohet për aplikacione që s’janë hedhur në qarkullim",
+ "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "Aplikacioni s’mund të instalohet, ngaqë versioni te info.xml s’është i njëjti me versionin e treguar nga shitorja e aplikacioneve",
+ "Logging" : "Duke u lidhur",
+ "Recommended" : "E rekomanduar",
+ "Microsoft Windows Platform is not supported" : "Microsoft Windows Platform nuk mbulohet",
+ "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "Përdorimi i Serverit Nextcloud në një platformë Microsoft Windows nuk mbështetet. Ne ju sugjerojmë të përdorni një server Linux në një makinë virtuale nëse nuk e keni mundësinë që të migroni vetë serverin.",
+ "Storage not available" : "Pa depozitë gati"
+},"pluralForm" :"nplurals=2; plural=(n != 1);"
+} \ No newline at end of file
diff --git a/lib/l10n/sv.js b/lib/l10n/sv.js
new file mode 100644
index 00000000000..af52142692c
--- /dev/null
+++ b/lib/l10n/sv.js
@@ -0,0 +1,233 @@
+OC.L10N.register(
+ "lib",
+ {
+ "Cannot write into \"config\" directory!" : "Kan inte skriva till \"config\" katalogen!",
+ "This can usually be fixed by giving the webserver write access to the config directory" : "Detta kan vanligtvis åtgärdas genom att ge skrivrättigheter till config katalgogen",
+ "See %s" : "Se %s",
+ "This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Detta kan vanligtvis åtgärdas genom att %s ger webbservern skrivrättigheter till konfigurations-katalogen %s.",
+ "The files of the app %$1s were not replaced correctly. Make sure it is a version compatible with the server." : "Filerna i appen %$1s ersattes inte korrekt. Se till att det är en version som är kompatibel med servern.",
+ "Sample configuration detected" : "Exempel-konfiguration detekterad",
+ "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Det har detekterats att exempel-konfigurationen har kopierats. Detta kan förstöra din installation och stöds ej. Vänligen läs dokumentationen innan ändringar på config.php utförs",
+ "%1$s and %2$s" : "%1$s och %2$s",
+ "%1$s, %2$s and %3$s" : "%1$s, %2$s och %3$s",
+ "%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s och %4$s",
+ "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s och %5$s",
+ "PHP %s or higher is required." : "PHP %s eller högre krävs.",
+ "PHP with a version lower than %s is required." : "PHP med version lägre än %s krävs.",
+ "%sbit or higher PHP required." : "%sbit eller nyare PHP-version krävs.",
+ "Following databases are supported: %s" : "Följande databastyper stödjs: %s",
+ "The command line tool %s could not be found" : "Kommandoradsverktyget %s hittades inte.",
+ "The library %s is not available." : "Biblioteket %s är inte tillgängligt.",
+ "Library %s with a version higher than %s is required - available version %s." : "Bibliotek %s med version högre än %s krävs - tillgänglig version %s.",
+ "Library %s with a version lower than %s is required - available version %s." : "Bibliotek %s med version lägre än %s krävs - tillgänglig version %s.",
+ "Following platforms are supported: %s" : "Följande plattformar stödjs: %s",
+ "Server version %s or higher is required." : "Serverversion %s eller nyare krävs.",
+ "Server version %s or lower is required." : "Serverversion %s eller äldre krävs.",
+ "Unknown filetype" : "Okänd filtyp",
+ "Invalid image" : "Ogiltig bild",
+ "Avatar image is not square" : "Profilbilden är inte fyrkantig/kvadrat",
+ "today" : "i dag",
+ "yesterday" : "i går",
+ "_%n day ago_::_%n days ago_" : ["%n dag sedan","%n dagar sedan"],
+ "last month" : "förra månaden",
+ "_%n month ago_::_%n months ago_" : ["%n månad sedan","%n månader sedan"],
+ "last year" : "förra året",
+ "_%n year ago_::_%n years ago_" : ["%n år sedan","%n år sedan"],
+ "_%n hour ago_::_%n hours ago_" : ["%n timme sedan","%n timmar sedan"],
+ "_%n minute ago_::_%n minutes ago_" : ["%n minut sedan","%n minuter sedan"],
+ "seconds ago" : "sekunder sedan",
+ "Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "Modulen med id: %s finns inte. Vänligen aktivera det i dina app-inställningar eller kontakta din administratör.",
+ "File name is a reserved word" : "Filnamnet är ett reserverat ord",
+ "File name contains at least one invalid character" : "Filnamnet innehåller minst ett ogiltigt tecken",
+ "File name is too long" : "Filnamnet är för långt",
+ "Dot files are not allowed" : "Dot filer är inte tillåtna",
+ "Empty filename is not allowed" : "Tomma filnamn är inte tillåtna",
+ "APCu" : "APCu",
+ "Redis" : "Redis",
+ "Server settings" : "Serverinställningar",
+ "Sharing" : "Delning",
+ "Encryption" : "Kryptering",
+ "Additional settings" : "Övriga inställningar",
+ "Tips & tricks" : "Knep & Trick",
+ "%s enter the database username and name." : "%s ange användarnamn och namn för databasen.",
+ "%s enter the database username." : "%s ange databasanvändare.",
+ "%s enter the database name." : "%s ange databasnamn",
+ "%s you may not use dots in the database name" : "%s du får inte använda punkter i databasnamnet",
+ "Oracle connection could not be established" : "Oracle-anslutning kunde inte etableras",
+ "Oracle username and/or password not valid" : "Oracle-användarnamnet och/eller lösenordet är felaktigt",
+ "DB Error: \"%s\"" : "DB fel: \"%s\"",
+ "Offending command was: \"%s\"" : "Det felaktiga kommandot var: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Du måste antingen ange ett befintligt konto eller administratör.",
+ "Offending command was: \"%s\", name: %s, password: %s" : "Det felande kommandot var: \"%s\", name: %s, password: %s",
+ "PostgreSQL username and/or password not valid" : "PostgreSQL-användarnamnet och/eller lösenordet är felaktigt",
+ "Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X stöds inte och %s kommer inte att fungera korrekt på denna plattform. Använd på egen risk!",
+ "For the best results, please consider using a GNU/Linux server instead." : "För bästa resultat, överväg att använda en GNU/Linux server istället.",
+ "It seems that this %s instance is running on a 32-bit PHP environment and the open_basedir has been configured in php.ini. This will lead to problems with files over 4 GB and is highly discouraged." : "Det verkar som om denna %s instans körs på en 32-bitars PHP miljö och open_basedir har konfigurerats i php.ini. Detta kommer att leda till problem med filer över 4 GB och är verkligen inte rekommenderat!",
+ "Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "Ta bort open_basedir i din php.ini eller byt till 64-bitars PHP.",
+ "Set an admin username." : "Ange ett användarnamn för administratören.",
+ "Set an admin password." : "Ange ett administratörslösenord.",
+ "Can't create or write into the data directory %s" : "Kan inte skapa eller skriva till data-katalogen %s",
+ "Invalid Federated Cloud ID" : "Ogiltigt Federarat Moln-ID",
+ "%s shared »%s« with you" : "%s delade »%s« med dig",
+ "%s via %s" : "%s via %s",
+ "Sharing %s failed, because the backend does not allow shares from type %i" : "Misslyckades dela ut %s då backend inte tillåter delningar från typ %i",
+ "Sharing %s failed, because the file does not exist" : "Delning av %s misslyckades på grund av att filen inte existerar",
+ "You are not allowed to share %s" : "Du har inte rätt att dela %s",
+ "Sharing %s failed, because you can not share with yourself" : "Delning %s misslyckades därför att du inte kan dela med dig själv.",
+ "Sharing %s failed, because the user %s does not exist" : "Delning %s misslyckades därför att användaren %s inte existerar",
+ "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Delning %s misslyckades därför att användaren %s inte är medlem i någon utav de grupper som %s är medlem i",
+ "Sharing %s failed, because this item is already shared with %s" : "Delning %s misslyckades därför att objektet redan är delat med %s",
+ "Sharing %s failed, because this item is already shared with user %s" : "Delning %s misslyckades därför att detta redan är delat med användaren %s",
+ "Sharing %s failed, because the group %s does not exist" : "Delning %s misslyckades därför att gruppen %s inte existerar",
+ "Sharing %s failed, because %s is not a member of the group %s" : "Delning %s misslyckades därför att %s inte ingår i gruppen %s",
+ "You need to provide a password to create a public link, only protected links are allowed" : "Du måste ange ett lösenord för att skapa en offentlig länk, endast skyddade länkar är tillåtna",
+ "Sharing %s failed, because sharing with links is not allowed" : "Delning %s misslyckades därför att delning utav länkar inte är tillåtet",
+ "Not allowed to create a federated share with the same user" : "Ej tillåtet att skapa en förbundsdelning med samma användare",
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Misslyckades dela ut %s, kan inte hitta %s, kanske är servern inte åtkomlig för närvarande.",
+ "Share type %s is not valid for %s" : "Delningstyp %s är inte giltig för %s",
+ "Setting permissions for %s failed, because the permissions exceed permissions granted to %s" : "Misslyckades att sätta rättigheter för %s därför att rättigheterna överskrider de som är tillåtna för %s",
+ "Setting permissions for %s failed, because the item was not found" : "Att sätta rättigheterna för %s misslyckades därför att objektet inte hittades",
+ "Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "Kan inte sätta utgångsdatum. Utdelningar kan inte utgå senare än %s efter de har delats ut",
+ "Cannot set expiration date. Expiration date is in the past" : "Kan inte sätta utgångsdatum. Utgångsdatumet är i det förflutna.",
+ "Cannot clear expiration date. Shares are required to have an expiration date." : "Kan ej ta bort utgångsdatumet. Delningen kräver att det finns ett utgångsdatum.",
+ "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Delningsgränssnittet %s måste implementera gränssnittet OCP\\Share_Backend",
+ "Sharing backend %s not found" : "Delningsgränssnittet %s hittades inte",
+ "Sharing backend for %s not found" : "Delningsgränssnittet för %s hittades inte",
+ "Sharing failed, because the user %s is the original sharer" : "Delning misslyckades eftersom användaren %s redan är den som har delat detta.",
+ "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Delning %s misslyckades därför att rättigheterna överskrider de rättigheter som är tillåtna för %s",
+ "Sharing %s failed, because resharing is not allowed" : "Delning %s misslyckades därför att vidaredelning inte är tillåten",
+ "Sharing %s failed, because the sharing backend for %s could not find its source" : "Delning %s misslyckades därför att delningsgränsnittet för %s inte kunde hitta sin källa",
+ "Sharing %s failed, because the file could not be found in the file cache" : "Delning %s misslyckades därför att filen inte kunde hittas i filcachen",
+ "Cannot increase permissions of %s" : "Kan ej öka behörigheterna för %s",
+ "Files can't be shared with delete permissions" : "Filerna kan ej delas med \"radera behörigheter\"",
+ "Files can't be shared with create permissions" : "Filerna kan ej delas med \"skapa behörigheter\"",
+ "Expiration date is in the past" : "Utgångsdatum är i det förflutna",
+ "Cannot set expiration date more than %s days in the future" : "Kan ej välja ett utgångsdatum längre fram än %s dagar",
+ "Could not find category \"%s\"" : "Kunde inte hitta kategorin \"%s\"",
+ "Sunday" : "Söndag",
+ "Monday" : "Måndag",
+ "Tuesday" : "Tisdag",
+ "Wednesday" : "Onsdag",
+ "Thursday" : "Torsdag",
+ "Friday" : "Fredag",
+ "Saturday" : "Lördag",
+ "Sun." : "Sön.",
+ "Mon." : "Mån.",
+ "Tue." : "Tis.",
+ "Wed." : "Ons.",
+ "Thu." : "Tors.",
+ "Fri." : "Fre.",
+ "Sat." : "Lör.",
+ "Su" : "Sö",
+ "Mo" : "Må",
+ "Tu" : "Ti",
+ "We" : "On",
+ "Th" : "To",
+ "Fr" : "Fr",
+ "Sa" : "Lö",
+ "January" : "Januari",
+ "February" : "Februari",
+ "March" : "Mars",
+ "April" : "April",
+ "May" : "Maj",
+ "June" : "Juni",
+ "July" : "Juli",
+ "August" : "Augusti",
+ "September" : "September",
+ "October" : "Oktober",
+ "November" : "November",
+ "December" : "December",
+ "Jan." : "Jan.",
+ "Feb." : "Feb.",
+ "Mar." : "Mar.",
+ "Apr." : "Apr.",
+ "May." : "Maj.",
+ "Jun." : "Jun.",
+ "Jul." : "Jul.",
+ "Aug." : "Aug.",
+ "Sep." : "Sep.",
+ "Oct." : "Okt.",
+ "Nov." : "Nov.",
+ "Dec." : "Dec.",
+ "Apps" : "Applikationer",
+ "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "Endast följande tecken är tillåtna i användarnamnet: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"",
+ "A valid username must be provided" : "Ett giltigt användarnamn måste anges",
+ "Username contains whitespace at the beginning or at the end" : "Användarnamnet består av ett mellanslag i början eller i slutet",
+ "A valid password must be provided" : "Ett giltigt lösenord måste anges",
+ "The username is already being used" : "Användarnamnet används redan",
+ "Login canceled by app" : "Inloggningen avbruten av appen",
+ "User disabled" : "Användare inaktiverad",
+ "Help" : "Hjälp",
+ "Personal" : "Personliga Inställningar",
+ "Users" : "Användare",
+ "Admin" : "Administration",
+ "App \"%s\" cannot be installed because appinfo file cannot be read." : "Applikationen \"%s\" kan ej installeras eftersom informationen från appen ej kunde läsas.",
+ "App \"%s\" cannot be installed because it is not compatible with this version of the server." : "Applikationen \"%s\" kan ej installeras eftersom den inte är kompatibel med denna serverversion.",
+ "No app name specified" : "Inget appnamn angivet",
+ "App '%s' could not be installed!" : "Applikationen \"%s\" gick inte att installera!",
+ "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "Applikationen \"%s\" kan ej installeras eftersom följande kriterier inte är uppfyllda: %s",
+ "a safe home for all your data" : "En säker plats för dina filer och data",
+ "File is currently busy, please try again later" : "Filen är för tillfället upptagen, vänligen försök igen senare",
+ "Can't read file" : "Kan ej läsa filen",
+ "Application is not enabled" : "Applikationen är inte aktiverad",
+ "Authentication error" : "Fel vid autentisering",
+ "Token expired. Please reload page." : "Ogiltig token. Ladda om sidan.",
+ "Unknown user" : "Okänd användare",
+ "No database drivers (sqlite, mysql, or postgresql) installed." : "Inga databasdrivrutiner (sqlite, mysql, eller postgresql) installerade.",
+ "Cannot write into \"config\" directory" : "Kan inte skriva till \"config\" katalogen",
+ "Cannot write into \"apps\" directory" : "Kan inte skriva till \"apps\" katalogen!",
+ "This can usually be fixed by %sgiving the webserver write access to the apps directory%s or disabling the appstore in the config file." : "Detta kan vanligtvis åtgärdas genom att %s ger webbservern skrivrättigheter till applikationskatalogen %s eller stänga av app-butik i konfigurationsfilen.",
+ "Cannot create \"data\" directory (%s)" : "Kan inte skapa \"data\" katalog (%s)",
+ "This can usually be fixed by <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">giving the webserver write access to the root directory</a>." : "Detta kan vanligtvis åtgärdas genom att <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\"> ge webbserver skrivåtkomst till rotkatalogen </a>.",
+ "Permissions can usually be fixed by %sgiving the webserver write access to the root directory%s." : "Rättigheterna kan vanligtvis åtgärdas genom att %s ger webbservern skrivrättigheter till rootkatalogen %s.",
+ "Setting locale to %s failed" : "Sätta locale till %s misslyckades",
+ "Please install one of these locales on your system and restart your webserver." : "Vänligen installera en av dessa locale på din server och starta om dinn webbserver,",
+ "Please ask your server administrator to install the module." : "Vänligen be din administratör att installera modulen.",
+ "PHP module %s not installed." : "PHP modulen %s är inte installerad.",
+ "PHP setting \"%s\" is not set to \"%s\"." : "PHP inställning \"%s\" är inte inställd på \"%s\".",
+ "Adjusting this setting in php.ini will make Nextcloud run again" : "Att ändra denna inställning i php.ini kommer göra så att Nextcloud fungerar igen",
+ "mbstring.func_overload is set to \"%s\" instead of the expected value \"0\"" : "mbstring.func_overload är satt till \"%s\" istället för det förväntade värdet \"0\"",
+ "To fix this issue set <code>mbstring.func_overload</code> to <code>0</code> in your php.ini" : "För att åtgärda detta problem sätt värdet <code> mbstring.func_overload till </ code> <code> 0 </ code> i din php.ini",
+ "libxml2 2.7.0 is at least required. Currently %s is installed." : "libxml2 2.7.0 är det minsta som krävs. För närvarande är %s installerat.",
+ "To fix this issue update your libxml2 version and restart your web server." : "För att åtgärda detta problem uppdatera libxml2 versionen och starta om din webbserver.",
+ "PHP is apparently set up to strip inline doc blocks. This will make several core apps inaccessible." : "PHP är tydligen inställt för att tömma \"inline doc blocks\". Detta kommer att göra flera kärnprogram otillgängliga.",
+ "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Detta orsakas troligtvis av en cache/accelerator som t ex Zend OPchache eller eAccelerator.",
+ "PHP modules have been installed, but they are still listed as missing?" : "PHP-moduler har installerats, men de listas fortfarande som saknade?",
+ "Please ask your server administrator to restart the web server." : "Vänligen be din serveradministratör att starta om webservern.",
+ "PostgreSQL >= 9 required" : "PostgreSQL >= 9 krävs",
+ "Please upgrade your database version" : "Vänligen uppgradera din databas-version",
+ "Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Vänligen ändra rättigheterna till 0770 så att katalogen inte kan listas utav andra användare.",
+ "Data directory (%s) is readable by other users" : "Datakatalogen (%s) kan läsas av andra användare",
+ "Data directory (%s) must be an absolute path" : "Datakatalogen (%s) måste vara hela sökvägen",
+ "Check the value of \"datadirectory\" in your configuration" : "Kontrollera värdet av \"datakatalog\" i din konfiguration",
+ "Data directory (%s) is invalid" : "Datakatlogen (%s) är ogiltig",
+ "Please check that the data directory contains a file \".ocdata\" in its root." : "Vänligen kontrollera att datakatalogen innehåller filen \".ocdata\" i rooten.",
+ "Could not obtain lock type %d on \"%s\"." : "Kunde inte hämta låstyp %d på \"%s\".",
+ "Storage unauthorized. %s" : "Lagringsutrymme ej tillåtet. %s",
+ "Storage incomplete configuration. %s" : "Lagringsutrymme felaktigt inställt. %s",
+ "Storage connection error. %s" : "Lagringsutrymme lyckas inte ansluta. %s",
+ "Storage is temporarily not available" : "Lagringsutrymme är för tillfället inte tillgängligt",
+ "Storage connection timeout. %s" : "Lagringsutrymme lyckas inte ansluta \"timeout\". %s",
+ "4-byte characters are not supported in file names" : "4-bitars tecken är inte tillåtet i filnamn",
+ "App directory already exists" : "Appens mapp finns redan",
+ "Can't create app folder. Please fix permissions. %s" : "Kan inte skapa appens mapp. Var god åtgärda rättigheterna. %s",
+ "Archive does not contain a directory named %s" : "Arkivet innehåller inte en mapp vid namn %s",
+ "No source specified when installing app" : "Ingen källa angiven vid installation av app ",
+ "No href specified when installing app from http" : "Ingen href angiven vid installation av app från http",
+ "No path specified when installing app from local file" : "Ingen sökväg angiven vid installation av app från lokal fil",
+ "Archives of type %s are not supported" : "Arkiv av typen %s stöds ej",
+ "Failed to open archive when installing app" : "Kunde inte öppna arkivet när appen skulle installeras",
+ "App does not provide an info.xml file" : "Appen har ingen info.xml fil",
+ "App cannot be installed because appinfo file cannot be read." : "Appen kan inte installeras eftersom app-informationen inte kan läsas i filen.",
+ "Signature could not get checked. Please contact the app developer and check your admin screen." : "Signaturen kunde inte kontrolleras. Vänligen kontakta appens utvecklare och kontrollera administratörsinställningarna.",
+ "App can't be installed because of not allowed code in the App" : "Appen kan inte installeras eftersom att den innehåller otillåten kod",
+ "App can't be installed because it is not compatible with this version of the server" : "Appen kan inte installeras eftersom den inte är förenlig med den här versionen av servern",
+ "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "Appen kan inte installeras eftersom att den innehåller etiketten <shipped>true</shipped> vilket inte är tillåtet för icke inkluderade appar",
+ "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "Appen kan inte installeras eftersom det är fel version på info.xml och stämmer inte överens med versionen från \"App Store\"",
+ "Logging" : "Loggning",
+ "Recommended" : "Rekomenderad",
+ "Microsoft Windows Platform is not supported" : "Microsoft Windows-plattformen stöds inte",
+ "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "Att köra en Nextcloud-Server på Microsoft Windows-plattformen stöds inte. Vi föreslår att du använder en Linux-server i en virtuell maskin om du inte har möjlighet att migrera själva servern.",
+ "Storage not available" : "Lagringsutrymme ej tillgängligt"
+},
+"nplurals=2; plural=(n != 1);");
diff --git a/lib/l10n/sv.json b/lib/l10n/sv.json
new file mode 100644
index 00000000000..ac8d56e125f
--- /dev/null
+++ b/lib/l10n/sv.json
@@ -0,0 +1,231 @@
+{ "translations": {
+ "Cannot write into \"config\" directory!" : "Kan inte skriva till \"config\" katalogen!",
+ "This can usually be fixed by giving the webserver write access to the config directory" : "Detta kan vanligtvis åtgärdas genom att ge skrivrättigheter till config katalgogen",
+ "See %s" : "Se %s",
+ "This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "Detta kan vanligtvis åtgärdas genom att %s ger webbservern skrivrättigheter till konfigurations-katalogen %s.",
+ "The files of the app %$1s were not replaced correctly. Make sure it is a version compatible with the server." : "Filerna i appen %$1s ersattes inte korrekt. Se till att det är en version som är kompatibel med servern.",
+ "Sample configuration detected" : "Exempel-konfiguration detekterad",
+ "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Det har detekterats att exempel-konfigurationen har kopierats. Detta kan förstöra din installation och stöds ej. Vänligen läs dokumentationen innan ändringar på config.php utförs",
+ "%1$s and %2$s" : "%1$s och %2$s",
+ "%1$s, %2$s and %3$s" : "%1$s, %2$s och %3$s",
+ "%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s och %4$s",
+ "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s och %5$s",
+ "PHP %s or higher is required." : "PHP %s eller högre krävs.",
+ "PHP with a version lower than %s is required." : "PHP med version lägre än %s krävs.",
+ "%sbit or higher PHP required." : "%sbit eller nyare PHP-version krävs.",
+ "Following databases are supported: %s" : "Följande databastyper stödjs: %s",
+ "The command line tool %s could not be found" : "Kommandoradsverktyget %s hittades inte.",
+ "The library %s is not available." : "Biblioteket %s är inte tillgängligt.",
+ "Library %s with a version higher than %s is required - available version %s." : "Bibliotek %s med version högre än %s krävs - tillgänglig version %s.",
+ "Library %s with a version lower than %s is required - available version %s." : "Bibliotek %s med version lägre än %s krävs - tillgänglig version %s.",
+ "Following platforms are supported: %s" : "Följande plattformar stödjs: %s",
+ "Server version %s or higher is required." : "Serverversion %s eller nyare krävs.",
+ "Server version %s or lower is required." : "Serverversion %s eller äldre krävs.",
+ "Unknown filetype" : "Okänd filtyp",
+ "Invalid image" : "Ogiltig bild",
+ "Avatar image is not square" : "Profilbilden är inte fyrkantig/kvadrat",
+ "today" : "i dag",
+ "yesterday" : "i går",
+ "_%n day ago_::_%n days ago_" : ["%n dag sedan","%n dagar sedan"],
+ "last month" : "förra månaden",
+ "_%n month ago_::_%n months ago_" : ["%n månad sedan","%n månader sedan"],
+ "last year" : "förra året",
+ "_%n year ago_::_%n years ago_" : ["%n år sedan","%n år sedan"],
+ "_%n hour ago_::_%n hours ago_" : ["%n timme sedan","%n timmar sedan"],
+ "_%n minute ago_::_%n minutes ago_" : ["%n minut sedan","%n minuter sedan"],
+ "seconds ago" : "sekunder sedan",
+ "Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "Modulen med id: %s finns inte. Vänligen aktivera det i dina app-inställningar eller kontakta din administratör.",
+ "File name is a reserved word" : "Filnamnet är ett reserverat ord",
+ "File name contains at least one invalid character" : "Filnamnet innehåller minst ett ogiltigt tecken",
+ "File name is too long" : "Filnamnet är för långt",
+ "Dot files are not allowed" : "Dot filer är inte tillåtna",
+ "Empty filename is not allowed" : "Tomma filnamn är inte tillåtna",
+ "APCu" : "APCu",
+ "Redis" : "Redis",
+ "Server settings" : "Serverinställningar",
+ "Sharing" : "Delning",
+ "Encryption" : "Kryptering",
+ "Additional settings" : "Övriga inställningar",
+ "Tips & tricks" : "Knep & Trick",
+ "%s enter the database username and name." : "%s ange användarnamn och namn för databasen.",
+ "%s enter the database username." : "%s ange databasanvändare.",
+ "%s enter the database name." : "%s ange databasnamn",
+ "%s you may not use dots in the database name" : "%s du får inte använda punkter i databasnamnet",
+ "Oracle connection could not be established" : "Oracle-anslutning kunde inte etableras",
+ "Oracle username and/or password not valid" : "Oracle-användarnamnet och/eller lösenordet är felaktigt",
+ "DB Error: \"%s\"" : "DB fel: \"%s\"",
+ "Offending command was: \"%s\"" : "Det felaktiga kommandot var: \"%s\"",
+ "You need to enter either an existing account or the administrator." : "Du måste antingen ange ett befintligt konto eller administratör.",
+ "Offending command was: \"%s\", name: %s, password: %s" : "Det felande kommandot var: \"%s\", name: %s, password: %s",
+ "PostgreSQL username and/or password not valid" : "PostgreSQL-användarnamnet och/eller lösenordet är felaktigt",
+ "Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X stöds inte och %s kommer inte att fungera korrekt på denna plattform. Använd på egen risk!",
+ "For the best results, please consider using a GNU/Linux server instead." : "För bästa resultat, överväg att använda en GNU/Linux server istället.",
+ "It seems that this %s instance is running on a 32-bit PHP environment and the open_basedir has been configured in php.ini. This will lead to problems with files over 4 GB and is highly discouraged." : "Det verkar som om denna %s instans körs på en 32-bitars PHP miljö och open_basedir har konfigurerats i php.ini. Detta kommer att leda till problem med filer över 4 GB och är verkligen inte rekommenderat!",
+ "Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "Ta bort open_basedir i din php.ini eller byt till 64-bitars PHP.",
+ "Set an admin username." : "Ange ett användarnamn för administratören.",
+ "Set an admin password." : "Ange ett administratörslösenord.",
+ "Can't create or write into the data directory %s" : "Kan inte skapa eller skriva till data-katalogen %s",
+ "Invalid Federated Cloud ID" : "Ogiltigt Federarat Moln-ID",
+ "%s shared »%s« with you" : "%s delade »%s« med dig",
+ "%s via %s" : "%s via %s",
+ "Sharing %s failed, because the backend does not allow shares from type %i" : "Misslyckades dela ut %s då backend inte tillåter delningar från typ %i",
+ "Sharing %s failed, because the file does not exist" : "Delning av %s misslyckades på grund av att filen inte existerar",
+ "You are not allowed to share %s" : "Du har inte rätt att dela %s",
+ "Sharing %s failed, because you can not share with yourself" : "Delning %s misslyckades därför att du inte kan dela med dig själv.",
+ "Sharing %s failed, because the user %s does not exist" : "Delning %s misslyckades därför att användaren %s inte existerar",
+ "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "Delning %s misslyckades därför att användaren %s inte är medlem i någon utav de grupper som %s är medlem i",
+ "Sharing %s failed, because this item is already shared with %s" : "Delning %s misslyckades därför att objektet redan är delat med %s",
+ "Sharing %s failed, because this item is already shared with user %s" : "Delning %s misslyckades därför att detta redan är delat med användaren %s",
+ "Sharing %s failed, because the group %s does not exist" : "Delning %s misslyckades därför att gruppen %s inte existerar",
+ "Sharing %s failed, because %s is not a member of the group %s" : "Delning %s misslyckades därför att %s inte ingår i gruppen %s",
+ "You need to provide a password to create a public link, only protected links are allowed" : "Du måste ange ett lösenord för att skapa en offentlig länk, endast skyddade länkar är tillåtna",
+ "Sharing %s failed, because sharing with links is not allowed" : "Delning %s misslyckades därför att delning utav länkar inte är tillåtet",
+ "Not allowed to create a federated share with the same user" : "Ej tillåtet att skapa en förbundsdelning med samma användare",
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "Misslyckades dela ut %s, kan inte hitta %s, kanske är servern inte åtkomlig för närvarande.",
+ "Share type %s is not valid for %s" : "Delningstyp %s är inte giltig för %s",
+ "Setting permissions for %s failed, because the permissions exceed permissions granted to %s" : "Misslyckades att sätta rättigheter för %s därför att rättigheterna överskrider de som är tillåtna för %s",
+ "Setting permissions for %s failed, because the item was not found" : "Att sätta rättigheterna för %s misslyckades därför att objektet inte hittades",
+ "Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "Kan inte sätta utgångsdatum. Utdelningar kan inte utgå senare än %s efter de har delats ut",
+ "Cannot set expiration date. Expiration date is in the past" : "Kan inte sätta utgångsdatum. Utgångsdatumet är i det förflutna.",
+ "Cannot clear expiration date. Shares are required to have an expiration date." : "Kan ej ta bort utgångsdatumet. Delningen kräver att det finns ett utgångsdatum.",
+ "Sharing backend %s must implement the interface OCP\\Share_Backend" : "Delningsgränssnittet %s måste implementera gränssnittet OCP\\Share_Backend",
+ "Sharing backend %s not found" : "Delningsgränssnittet %s hittades inte",
+ "Sharing backend for %s not found" : "Delningsgränssnittet för %s hittades inte",
+ "Sharing failed, because the user %s is the original sharer" : "Delning misslyckades eftersom användaren %s redan är den som har delat detta.",
+ "Sharing %s failed, because the permissions exceed permissions granted to %s" : "Delning %s misslyckades därför att rättigheterna överskrider de rättigheter som är tillåtna för %s",
+ "Sharing %s failed, because resharing is not allowed" : "Delning %s misslyckades därför att vidaredelning inte är tillåten",
+ "Sharing %s failed, because the sharing backend for %s could not find its source" : "Delning %s misslyckades därför att delningsgränsnittet för %s inte kunde hitta sin källa",
+ "Sharing %s failed, because the file could not be found in the file cache" : "Delning %s misslyckades därför att filen inte kunde hittas i filcachen",
+ "Cannot increase permissions of %s" : "Kan ej öka behörigheterna för %s",
+ "Files can't be shared with delete permissions" : "Filerna kan ej delas med \"radera behörigheter\"",
+ "Files can't be shared with create permissions" : "Filerna kan ej delas med \"skapa behörigheter\"",
+ "Expiration date is in the past" : "Utgångsdatum är i det förflutna",
+ "Cannot set expiration date more than %s days in the future" : "Kan ej välja ett utgångsdatum längre fram än %s dagar",
+ "Could not find category \"%s\"" : "Kunde inte hitta kategorin \"%s\"",
+ "Sunday" : "Söndag",
+ "Monday" : "Måndag",
+ "Tuesday" : "Tisdag",
+ "Wednesday" : "Onsdag",
+ "Thursday" : "Torsdag",
+ "Friday" : "Fredag",
+ "Saturday" : "Lördag",
+ "Sun." : "Sön.",
+ "Mon." : "Mån.",
+ "Tue." : "Tis.",
+ "Wed." : "Ons.",
+ "Thu." : "Tors.",
+ "Fri." : "Fre.",
+ "Sat." : "Lör.",
+ "Su" : "Sö",
+ "Mo" : "Må",
+ "Tu" : "Ti",
+ "We" : "On",
+ "Th" : "To",
+ "Fr" : "Fr",
+ "Sa" : "Lö",
+ "January" : "Januari",
+ "February" : "Februari",
+ "March" : "Mars",
+ "April" : "April",
+ "May" : "Maj",
+ "June" : "Juni",
+ "July" : "Juli",
+ "August" : "Augusti",
+ "September" : "September",
+ "October" : "Oktober",
+ "November" : "November",
+ "December" : "December",
+ "Jan." : "Jan.",
+ "Feb." : "Feb.",
+ "Mar." : "Mar.",
+ "Apr." : "Apr.",
+ "May." : "Maj.",
+ "Jun." : "Jun.",
+ "Jul." : "Jul.",
+ "Aug." : "Aug.",
+ "Sep." : "Sep.",
+ "Oct." : "Okt.",
+ "Nov." : "Nov.",
+ "Dec." : "Dec.",
+ "Apps" : "Applikationer",
+ "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "Endast följande tecken är tillåtna i användarnamnet: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"",
+ "A valid username must be provided" : "Ett giltigt användarnamn måste anges",
+ "Username contains whitespace at the beginning or at the end" : "Användarnamnet består av ett mellanslag i början eller i slutet",
+ "A valid password must be provided" : "Ett giltigt lösenord måste anges",
+ "The username is already being used" : "Användarnamnet används redan",
+ "Login canceled by app" : "Inloggningen avbruten av appen",
+ "User disabled" : "Användare inaktiverad",
+ "Help" : "Hjälp",
+ "Personal" : "Personliga Inställningar",
+ "Users" : "Användare",
+ "Admin" : "Administration",
+ "App \"%s\" cannot be installed because appinfo file cannot be read." : "Applikationen \"%s\" kan ej installeras eftersom informationen från appen ej kunde läsas.",
+ "App \"%s\" cannot be installed because it is not compatible with this version of the server." : "Applikationen \"%s\" kan ej installeras eftersom den inte är kompatibel med denna serverversion.",
+ "No app name specified" : "Inget appnamn angivet",
+ "App '%s' could not be installed!" : "Applikationen \"%s\" gick inte att installera!",
+ "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "Applikationen \"%s\" kan ej installeras eftersom följande kriterier inte är uppfyllda: %s",
+ "a safe home for all your data" : "En säker plats för dina filer och data",
+ "File is currently busy, please try again later" : "Filen är för tillfället upptagen, vänligen försök igen senare",
+ "Can't read file" : "Kan ej läsa filen",
+ "Application is not enabled" : "Applikationen är inte aktiverad",
+ "Authentication error" : "Fel vid autentisering",
+ "Token expired. Please reload page." : "Ogiltig token. Ladda om sidan.",
+ "Unknown user" : "Okänd användare",
+ "No database drivers (sqlite, mysql, or postgresql) installed." : "Inga databasdrivrutiner (sqlite, mysql, eller postgresql) installerade.",
+ "Cannot write into \"config\" directory" : "Kan inte skriva till \"config\" katalogen",
+ "Cannot write into \"apps\" directory" : "Kan inte skriva till \"apps\" katalogen!",
+ "This can usually be fixed by %sgiving the webserver write access to the apps directory%s or disabling the appstore in the config file." : "Detta kan vanligtvis åtgärdas genom att %s ger webbservern skrivrättigheter till applikationskatalogen %s eller stänga av app-butik i konfigurationsfilen.",
+ "Cannot create \"data\" directory (%s)" : "Kan inte skapa \"data\" katalog (%s)",
+ "This can usually be fixed by <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">giving the webserver write access to the root directory</a>." : "Detta kan vanligtvis åtgärdas genom att <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\"> ge webbserver skrivåtkomst till rotkatalogen </a>.",
+ "Permissions can usually be fixed by %sgiving the webserver write access to the root directory%s." : "Rättigheterna kan vanligtvis åtgärdas genom att %s ger webbservern skrivrättigheter till rootkatalogen %s.",
+ "Setting locale to %s failed" : "Sätta locale till %s misslyckades",
+ "Please install one of these locales on your system and restart your webserver." : "Vänligen installera en av dessa locale på din server och starta om dinn webbserver,",
+ "Please ask your server administrator to install the module." : "Vänligen be din administratör att installera modulen.",
+ "PHP module %s not installed." : "PHP modulen %s är inte installerad.",
+ "PHP setting \"%s\" is not set to \"%s\"." : "PHP inställning \"%s\" är inte inställd på \"%s\".",
+ "Adjusting this setting in php.ini will make Nextcloud run again" : "Att ändra denna inställning i php.ini kommer göra så att Nextcloud fungerar igen",
+ "mbstring.func_overload is set to \"%s\" instead of the expected value \"0\"" : "mbstring.func_overload är satt till \"%s\" istället för det förväntade värdet \"0\"",
+ "To fix this issue set <code>mbstring.func_overload</code> to <code>0</code> in your php.ini" : "För att åtgärda detta problem sätt värdet <code> mbstring.func_overload till </ code> <code> 0 </ code> i din php.ini",
+ "libxml2 2.7.0 is at least required. Currently %s is installed." : "libxml2 2.7.0 är det minsta som krävs. För närvarande är %s installerat.",
+ "To fix this issue update your libxml2 version and restart your web server." : "För att åtgärda detta problem uppdatera libxml2 versionen och starta om din webbserver.",
+ "PHP is apparently set up to strip inline doc blocks. This will make several core apps inaccessible." : "PHP är tydligen inställt för att tömma \"inline doc blocks\". Detta kommer att göra flera kärnprogram otillgängliga.",
+ "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "Detta orsakas troligtvis av en cache/accelerator som t ex Zend OPchache eller eAccelerator.",
+ "PHP modules have been installed, but they are still listed as missing?" : "PHP-moduler har installerats, men de listas fortfarande som saknade?",
+ "Please ask your server administrator to restart the web server." : "Vänligen be din serveradministratör att starta om webservern.",
+ "PostgreSQL >= 9 required" : "PostgreSQL >= 9 krävs",
+ "Please upgrade your database version" : "Vänligen uppgradera din databas-version",
+ "Please change the permissions to 0770 so that the directory cannot be listed by other users." : "Vänligen ändra rättigheterna till 0770 så att katalogen inte kan listas utav andra användare.",
+ "Data directory (%s) is readable by other users" : "Datakatalogen (%s) kan läsas av andra användare",
+ "Data directory (%s) must be an absolute path" : "Datakatalogen (%s) måste vara hela sökvägen",
+ "Check the value of \"datadirectory\" in your configuration" : "Kontrollera värdet av \"datakatalog\" i din konfiguration",
+ "Data directory (%s) is invalid" : "Datakatlogen (%s) är ogiltig",
+ "Please check that the data directory contains a file \".ocdata\" in its root." : "Vänligen kontrollera att datakatalogen innehåller filen \".ocdata\" i rooten.",
+ "Could not obtain lock type %d on \"%s\"." : "Kunde inte hämta låstyp %d på \"%s\".",
+ "Storage unauthorized. %s" : "Lagringsutrymme ej tillåtet. %s",
+ "Storage incomplete configuration. %s" : "Lagringsutrymme felaktigt inställt. %s",
+ "Storage connection error. %s" : "Lagringsutrymme lyckas inte ansluta. %s",
+ "Storage is temporarily not available" : "Lagringsutrymme är för tillfället inte tillgängligt",
+ "Storage connection timeout. %s" : "Lagringsutrymme lyckas inte ansluta \"timeout\". %s",
+ "4-byte characters are not supported in file names" : "4-bitars tecken är inte tillåtet i filnamn",
+ "App directory already exists" : "Appens mapp finns redan",
+ "Can't create app folder. Please fix permissions. %s" : "Kan inte skapa appens mapp. Var god åtgärda rättigheterna. %s",
+ "Archive does not contain a directory named %s" : "Arkivet innehåller inte en mapp vid namn %s",
+ "No source specified when installing app" : "Ingen källa angiven vid installation av app ",
+ "No href specified when installing app from http" : "Ingen href angiven vid installation av app från http",
+ "No path specified when installing app from local file" : "Ingen sökväg angiven vid installation av app från lokal fil",
+ "Archives of type %s are not supported" : "Arkiv av typen %s stöds ej",
+ "Failed to open archive when installing app" : "Kunde inte öppna arkivet när appen skulle installeras",
+ "App does not provide an info.xml file" : "Appen har ingen info.xml fil",
+ "App cannot be installed because appinfo file cannot be read." : "Appen kan inte installeras eftersom app-informationen inte kan läsas i filen.",
+ "Signature could not get checked. Please contact the app developer and check your admin screen." : "Signaturen kunde inte kontrolleras. Vänligen kontakta appens utvecklare och kontrollera administratörsinställningarna.",
+ "App can't be installed because of not allowed code in the App" : "Appen kan inte installeras eftersom att den innehåller otillåten kod",
+ "App can't be installed because it is not compatible with this version of the server" : "Appen kan inte installeras eftersom den inte är förenlig med den här versionen av servern",
+ "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "Appen kan inte installeras eftersom att den innehåller etiketten <shipped>true</shipped> vilket inte är tillåtet för icke inkluderade appar",
+ "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "Appen kan inte installeras eftersom det är fel version på info.xml och stämmer inte överens med versionen från \"App Store\"",
+ "Logging" : "Loggning",
+ "Recommended" : "Rekomenderad",
+ "Microsoft Windows Platform is not supported" : "Microsoft Windows-plattformen stöds inte",
+ "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "Att köra en Nextcloud-Server på Microsoft Windows-plattformen stöds inte. Vi föreslår att du använder en Linux-server i en virtuell maskin om du inte har möjlighet att migrera själva servern.",
+ "Storage not available" : "Lagringsutrymme ej tillgängligt"
+},"pluralForm" :"nplurals=2; plural=(n != 1);"
+} \ No newline at end of file
diff --git a/lib/l10n/zh_CN.js b/lib/l10n/zh_CN.js
new file mode 100644
index 00000000000..e2c683b68bb
--- /dev/null
+++ b/lib/l10n/zh_CN.js
@@ -0,0 +1,233 @@
+OC.L10N.register(
+ "lib",
+ {
+ "Cannot write into \"config\" directory!" : "无法写入 \"config\" 目录!",
+ "This can usually be fixed by giving the webserver write access to the config directory" : "您可以设置 Web 服务器对 config 目录的写权限修复这个问题",
+ "See %s" : "查看 %s",
+ "This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "您可以由 %s 设置 Web 服务器对 config 目录 %s 的写权限修复这个问题",
+ "The files of the app %$1s were not replaced correctly. Make sure it is a version compatible with the server." : "应用 %$1s 的文件替换不正确. 请确认版本与当前服务器兼容.",
+ "Sample configuration detected" : "示例配置检测",
+ "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "您似乎直接把 config.php 的样例文件直接复制使用. 这可能会破坏您的安装. 在对 config.php 进行修改之前请先阅读相关文档.",
+ "%1$s and %2$s" : "%1$s 和 %2$s",
+ "%1$s, %2$s and %3$s" : "%1$s, %2$s 和 %3$s",
+ "%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s 和 %4$s",
+ "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s 和 %5$s",
+ "PHP %s or higher is required." : "要求 PHP 版本 %s 或者更高。",
+ "PHP with a version lower than %s is required." : "需要版本低于 %s 的PHP.",
+ "%sbit or higher PHP required." : "需要 %s 或更高版本的 PHP",
+ "Following databases are supported: %s" : "支持以下数据库: %s",
+ "The command line tool %s could not be found" : "命令行工具 %s 未找到",
+ "The library %s is not available." : "库文件 %s 不可用",
+ "Library %s with a version higher than %s is required - available version %s." : "%s 需要 %s 或更高的版本 - 可用版本 %s.",
+ "Library %s with a version lower than %s is required - available version %s." : "%s 需要 %s 或更低的版本 - 可用版本 %s.",
+ "Following platforms are supported: %s" : "支持以下平台:%s",
+ "Server version %s or higher is required." : "需要服务器版本 %s 或更高版本。",
+ "Server version %s or lower is required." : "需要服务器版本 %s 或更低版本。",
+ "Unknown filetype" : "未知的文件类型",
+ "Invalid image" : "无效的图像",
+ "Avatar image is not square" : "头像图像不是正方形",
+ "today" : "今天",
+ "yesterday" : "昨天",
+ "_%n day ago_::_%n days ago_" : ["%n 天前"],
+ "last month" : "上月",
+ "_%n month ago_::_%n months ago_" : ["%n 月前"],
+ "last year" : "去年",
+ "_%n year ago_::_%n years ago_" : ["%n 年前"],
+ "_%n hour ago_::_%n hours ago_" : ["%n 小时前"],
+ "_%n minute ago_::_%n minutes ago_" : ["%n 分钟前"],
+ "seconds ago" : "秒前",
+ "Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "ID 为 %s 的模块不存在. 请在应用设置中启用或联系您的管理员.",
+ "File name is a reserved word" : "文件名包含敏感字符",
+ "File name contains at least one invalid character" : "文件名中存在至少一个非法字符",
+ "File name is too long" : "文件名过长",
+ "Dot files are not allowed" : ".文件 不被允许",
+ "Empty filename is not allowed" : "不允许使用空名称。",
+ "APCu" : "APCu",
+ "Redis" : "Redis",
+ "Server settings" : "服务器设置",
+ "Sharing" : "分享",
+ "Encryption" : "加密",
+ "Additional settings" : "其他设置",
+ "Tips & tricks" : "小提示",
+ "%s enter the database username and name." : "%s 输入数据库用户名和名称.",
+ "%s enter the database username." : "%s 输入数据库用户名。",
+ "%s enter the database name." : "%s 输入数据库名称。",
+ "%s you may not use dots in the database name" : "%s 您不能在数据库名称中使用英文句号。",
+ "Oracle connection could not be established" : "不能建立甲骨文连接",
+ "Oracle username and/or password not valid" : "Oracle 数据库用户名和/或密码无效",
+ "DB Error: \"%s\"" : "数据库错误:\"%s\"",
+ "Offending command was: \"%s\"" : "冲突命令为:\"%s\"",
+ "You need to enter either an existing account or the administrator." : "你需要输入一个数据库中已有的账户或管理员账户。",
+ "Offending command was: \"%s\", name: %s, password: %s" : "冲突命令为:\"%s\",名称:%s,密码:%s",
+ "PostgreSQL username and/or password not valid" : "PostgreSQL 数据库用户名和/或密码无效",
+ "Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X 不被支持并且 %s 在这个平台上无法正常工作。请自行承担风险!",
+ "For the best results, please consider using a GNU/Linux server instead." : "为了达到最好的效果,请考虑使用 GNU/Linux 服务器。",
+ "It seems that this %s instance is running on a 32-bit PHP environment and the open_basedir has been configured in php.ini. This will lead to problems with files over 4 GB and is highly discouraged." : "看起来这个 %s 实例运行在32位PHP环境中并且已在php.ini中配置open_basedir。这将在文件超过4GB时出现问题,我们极力反对这样做。",
+ "Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "请删除php.ini中的open_basedir设置或切换到64位PHP。",
+ "Set an admin username." : "请设置一个管理员用户名。",
+ "Set an admin password." : "请设置一个管理员密码。",
+ "Can't create or write into the data directory %s" : "无法创建或写入数据目录 %s",
+ "Invalid Federated Cloud ID" : "无效的联合云ID",
+ "%s shared »%s« with you" : "%s 向您分享了 »%s«",
+ "%s via %s" : "%s 通过 %s",
+ "Sharing %s failed, because the backend does not allow shares from type %i" : "分享 %s 失败, 因为后端不允许分享 %i 类型",
+ "Sharing %s failed, because the file does not exist" : "分享 %s 失败, 因为文件不存在.",
+ "You are not allowed to share %s" : "您无权分享 %s",
+ "Sharing %s failed, because you can not share with yourself" : "分享 %s 失败, 因为您不能分享给自己",
+ "Sharing %s failed, because the user %s does not exist" : "分享 %s 失败, 因为用户 %s 不存在",
+ "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "分享 %s 失败, 因为用户 %s 不是 %s 所属的任何组的用户",
+ "Sharing %s failed, because this item is already shared with %s" : "分享 %s 失败, 因为该项已经分享给用户 %s",
+ "Sharing %s failed, because this item is already shared with user %s" : "分享 %s 失败, 因为该项已经分享给用户 %s",
+ "Sharing %s failed, because the group %s does not exist" : "分享 %s 失败, 因为 %s 分组不存在",
+ "Sharing %s failed, because %s is not a member of the group %s" : "分享 %s 失败, 因为 %s 不是 %s 分组的成员",
+ "You need to provide a password to create a public link, only protected links are allowed" : "链接分享需要密码, 您需要提供一个密码以创建公开连接",
+ "Sharing %s failed, because sharing with links is not allowed" : "分享 %s 失败, 因为不允许使用链接分享",
+ "Not allowed to create a federated share with the same user" : "不能给你自己分享文件",
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "分享 %s 失败, 无法找到 %s, 该服务当前无法连接.",
+ "Share type %s is not valid for %s" : "%s 不是 %s 的合法共享类型",
+ "Setting permissions for %s failed, because the permissions exceed permissions granted to %s" : "设置 %s 权限失败,因为权限超出了 %s 已有权限。",
+ "Setting permissions for %s failed, because the item was not found" : "设置 %s 的权限失败,因为未找到到对应项",
+ "Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "无法设置过期时间. 过期时间不能晚于其分享时间 %s",
+ "Cannot set expiration date. Expiration date is in the past" : "无法设置过期时间. 过期时间不能为过去",
+ "Cannot clear expiration date. Shares are required to have an expiration date." : "无法清除过期时间. 每个分享必须有一个过期时间",
+ "Sharing backend %s must implement the interface OCP\\Share_Backend" : "分享后端 %s 必须实现 OCP\\Share_Backend 接口",
+ "Sharing backend %s not found" : "%s 的分享后端未找到",
+ "Sharing backend for %s not found" : "%s 的分享后端未找到",
+ "Sharing failed, because the user %s is the original sharer" : "分享失败, 因为用户 %s 是原始的分享者.",
+ "Sharing %s failed, because the permissions exceed permissions granted to %s" : "分享 %s 失败, 因为权限超过了 %s 的已有权限",
+ "Sharing %s failed, because resharing is not allowed" : "分享 %s 失败, 因为不允许二次共享",
+ "Sharing %s failed, because the sharing backend for %s could not find its source" : "分享 %s 失败, 因为无法找到 %s 分享后端的来源",
+ "Sharing %s failed, because the file could not be found in the file cache" : "分享 %s 失败, 因为文件缓存中找不到该文件",
+ "Cannot increase permissions of %s" : "无法提升 %s 的权限",
+ "Files can't be shared with delete permissions" : "无法分享有删除权限的文件",
+ "Files can't be shared with create permissions" : "无法分享有创建权限的文件",
+ "Expiration date is in the past" : "到期日期已过.",
+ "Cannot set expiration date more than %s days in the future" : "无法将过期日期设置为超过 %s 天.",
+ "Could not find category \"%s\"" : "无法找到分类 \"%s\"",
+ "Sunday" : "星期日",
+ "Monday" : "星期一",
+ "Tuesday" : "星期二",
+ "Wednesday" : "星期三",
+ "Thursday" : "星期四",
+ "Friday" : "星期五",
+ "Saturday" : "星期六",
+ "Sun." : "周日",
+ "Mon." : "周一",
+ "Tue." : "周二",
+ "Wed." : "周三",
+ "Thu." : "周四",
+ "Fri." : "周五",
+ "Sat." : "周六",
+ "Su" : "日",
+ "Mo" : "一",
+ "Tu" : "二",
+ "We" : "三",
+ "Th" : "四",
+ "Fr" : "五",
+ "Sa" : "六",
+ "January" : "一月",
+ "February" : "二月",
+ "March" : "三月",
+ "April" : "四月",
+ "May" : "五月",
+ "June" : "六月",
+ "July" : "七月",
+ "August" : "八月",
+ "September" : "九月",
+ "October" : "十月",
+ "November" : "十一月",
+ "December" : "十二月",
+ "Jan." : "一月",
+ "Feb." : "二月",
+ "Mar." : "三月",
+ "Apr." : "四月",
+ "May." : "五月",
+ "Jun." : "六月",
+ "Jul." : "七月",
+ "Aug." : "八月",
+ "Sep." : "九月",
+ "Oct." : "十月",
+ "Nov." : "十一月",
+ "Dec." : "十二月",
+ "Apps" : "应用",
+ "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "在用户名中只允许使用以下字符:“a-z”,“A-Z”,“0-9”和\"_.@-'\"",
+ "A valid username must be provided" : "必须提供合法的用户名",
+ "Username contains whitespace at the beginning or at the end" : "用户名在开头或结尾处包含空格",
+ "A valid password must be provided" : "必须提供合法的密码",
+ "The username is already being used" : "用户名已被使用",
+ "Login canceled by app" : "已通过应用取消登录",
+ "User disabled" : "用户已禁用",
+ "Help" : "帮助",
+ "Personal" : "个人",
+ "Users" : "用户",
+ "Admin" : "管理",
+ "App \"%s\" cannot be installed because appinfo file cannot be read." : "无法安装应用\"%s\",因为无法读取appinfo文件.",
+ "App \"%s\" cannot be installed because it is not compatible with this version of the server." : "应用程式 \"%s\" 无法安装,因为它与这个版本的服务器不兼容.",
+ "No app name specified" : "没有指定的 App 名称",
+ "App '%s' could not be installed!" : "应用程序 '%s' 无法被安装!",
+ "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "应用程序 \"%s\" 无法被安装,因为为满足下列依赖关系: %s",
+ "a safe home for all your data" : "给您所有的数据一个安全的家",
+ "File is currently busy, please try again later" : "文件当前正忙,请稍后再试",
+ "Can't read file" : "无法读取文件",
+ "Application is not enabled" : "应用程序未启用",
+ "Authentication error" : "认证出错",
+ "Token expired. Please reload page." : "Token 过期,请刷新页面。",
+ "Unknown user" : "未知用户",
+ "No database drivers (sqlite, mysql, or postgresql) installed." : "没有安装数据库驱动 (SQLite、MySQL 或 PostgreSQL)。",
+ "Cannot write into \"config\" directory" : "无法写入“config”目录",
+ "Cannot write into \"apps\" directory" : "无法写入“apps”目录",
+ "This can usually be fixed by %sgiving the webserver write access to the apps directory%s or disabling the appstore in the config file." : "您可以由 %s 设置 Web 服务器对应用目录 %s 的写权限或在配置文件中禁用应用商店可以修复这个问题.",
+ "Cannot create \"data\" directory (%s)" : "无法创建“apps”目录 (%s)",
+ "This can usually be fixed by <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">giving the webserver write access to the root directory</a>." : "点击 <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">设置 Web 服务器对根目录的写入权限</a> 可修复这个问题.",
+ "Permissions can usually be fixed by %sgiving the webserver write access to the root directory%s." : "您可以由 %s 设置 Web 服务器对根目录 %s 的写权限可以修复这个问题.",
+ "Setting locale to %s failed" : "设置语言为 %s 失败",
+ "Please install one of these locales on your system and restart your webserver." : "请在您的系统中安装下述一种语言并重启 Web 服务器.",
+ "Please ask your server administrator to install the module." : "请联系服务器管理员安装模块.",
+ "PHP module %s not installed." : "PHP %s 模块未安装.",
+ "PHP setting \"%s\" is not set to \"%s\"." : "PHP 选项 \"%s\" 未设置为 \"%s\".",
+ "Adjusting this setting in php.ini will make Nextcloud run again" : "在 php.ini 中调整该设置将导致 Nextcloud 重新运行",
+ "mbstring.func_overload is set to \"%s\" instead of the expected value \"0\"" : "mbstring.func_overload 当前设置为 \"%s\", 预期值为 \"0\"",
+ "To fix this issue set <code>mbstring.func_overload</code> to <code>0</code> in your php.ini" : "请在 php.ini 中设置 <code>mbstring.func_overload</code> 为 <code>0</code> 以解决该问题",
+ "libxml2 2.7.0 is at least required. Currently %s is installed." : "至少需要 libxml2 2.7.0. 当前安装 %s.",
+ "To fix this issue update your libxml2 version and restart your web server." : "升级您的 libxml2 版本然后重启 Web 服务器以解决该问题.",
+ "PHP is apparently set up to strip inline doc blocks. This will make several core apps inaccessible." : "PHP 被设置为移除内联块, 这将导致多个核心应用无法访问.",
+ "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "这可能由缓存/加速器导致的, 例如 Zend OPcache 或 eAccelerator.",
+ "PHP modules have been installed, but they are still listed as missing?" : "PHP 模块已经安装, 但仍然显示未安装?",
+ "Please ask your server administrator to restart the web server." : "请联系服务器管理员重启 Web 服务器.",
+ "PostgreSQL >= 9 required" : "要求 PostgreSQL >= 9",
+ "Please upgrade your database version" : "请升级您的数据库版本",
+ "Please change the permissions to 0770 so that the directory cannot be listed by other users." : "请更改权限为 0770 以避免其他用户查看目录.",
+ "Data directory (%s) is readable by other users" : "数据目录 (%s) 能被其他用户读取",
+ "Data directory (%s) must be an absolute path" : "数据目录 (%s) 必须为绝对路径",
+ "Check the value of \"datadirectory\" in your configuration" : "请检查配置文件中 \"datadirectory\" 的值",
+ "Data directory (%s) is invalid" : "数据目录 (%s) 无效",
+ "Please check that the data directory contains a file \".ocdata\" in its root." : "请检查根目录下 data 目录中包含名为 \".ocdata\" 的文件.",
+ "Could not obtain lock type %d on \"%s\"." : "无法在 \"%s\" 上获取锁类型 %d.",
+ "Storage unauthorized. %s" : "存储认证失败. %s",
+ "Storage incomplete configuration. %s" : "存储未完成配置. %s",
+ "Storage connection error. %s" : "存储连接错误. %s",
+ "Storage is temporarily not available" : "存储暂时不可用",
+ "Storage connection timeout. %s" : "存储连接超时. %s",
+ "4-byte characters are not supported in file names" : "文件名中不支持 4 字节字符",
+ "App directory already exists" : "应用目录已经存在",
+ "Can't create app folder. Please fix permissions. %s" : "无法创建应用文件夹. 请修改权限. %s",
+ "Archive does not contain a directory named %s" : "压缩文件中不包含目录 %s",
+ "No source specified when installing app" : "安装应用时未指定来源",
+ "No href specified when installing app from http" : "从 http 安装应用时未指定链接",
+ "No path specified when installing app from local file" : "从本地文件安装应用时未指定路径",
+ "Archives of type %s are not supported" : "不支持 %s 的压缩格式",
+ "Failed to open archive when installing app" : "安装应用时打开文件失败",
+ "App does not provide an info.xml file" : "应用未提供 info.xml 文件",
+ "App cannot be installed because appinfo file cannot be read." : "无法安装应用, 因为无法读取应用信息文件",
+ "Signature could not get checked. Please contact the app developer and check your admin screen." : "签名检查失败. 请联系应用开发者并检查您的管理界面",
+ "App can't be installed because of not allowed code in the App" : "无法安装应用, 因为应用中包含不允许的代码",
+ "App can't be installed because it is not compatible with this version of the server" : "无法安装应用, 因为应用不兼容当前服务器的版本",
+ "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "无法安装应用, 因为应用包含 <shipped>true</shipped> 标签",
+ "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "无法安装应用, 因为 info.xml 中的版本与应用市场中的版本不同",
+ "Logging" : "日志",
+ "Recommended" : "推荐",
+ "Microsoft Windows Platform is not supported" : "不支持 Microsoft Windows 平台",
+ "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "不支持在 Microsoft Windows 平台运行 Nextcloud 服务器. 如果您没有迁移服务器的计划, 我们建议您在虚拟机中使用 Linux 服务器.",
+ "Storage not available" : "存储空间不可用"
+},
+"nplurals=1; plural=0;");
diff --git a/lib/l10n/zh_CN.json b/lib/l10n/zh_CN.json
new file mode 100644
index 00000000000..f5b88f87ad9
--- /dev/null
+++ b/lib/l10n/zh_CN.json
@@ -0,0 +1,231 @@
+{ "translations": {
+ "Cannot write into \"config\" directory!" : "无法写入 \"config\" 目录!",
+ "This can usually be fixed by giving the webserver write access to the config directory" : "您可以设置 Web 服务器对 config 目录的写权限修复这个问题",
+ "See %s" : "查看 %s",
+ "This can usually be fixed by %sgiving the webserver write access to the config directory%s." : "您可以由 %s 设置 Web 服务器对 config 目录 %s 的写权限修复这个问题",
+ "The files of the app %$1s were not replaced correctly. Make sure it is a version compatible with the server." : "应用 %$1s 的文件替换不正确. 请确认版本与当前服务器兼容.",
+ "Sample configuration detected" : "示例配置检测",
+ "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "您似乎直接把 config.php 的样例文件直接复制使用. 这可能会破坏您的安装. 在对 config.php 进行修改之前请先阅读相关文档.",
+ "%1$s and %2$s" : "%1$s 和 %2$s",
+ "%1$s, %2$s and %3$s" : "%1$s, %2$s 和 %3$s",
+ "%1$s, %2$s, %3$s and %4$s" : "%1$s, %2$s, %3$s 和 %4$s",
+ "%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s 和 %5$s",
+ "PHP %s or higher is required." : "要求 PHP 版本 %s 或者更高。",
+ "PHP with a version lower than %s is required." : "需要版本低于 %s 的PHP.",
+ "%sbit or higher PHP required." : "需要 %s 或更高版本的 PHP",
+ "Following databases are supported: %s" : "支持以下数据库: %s",
+ "The command line tool %s could not be found" : "命令行工具 %s 未找到",
+ "The library %s is not available." : "库文件 %s 不可用",
+ "Library %s with a version higher than %s is required - available version %s." : "%s 需要 %s 或更高的版本 - 可用版本 %s.",
+ "Library %s with a version lower than %s is required - available version %s." : "%s 需要 %s 或更低的版本 - 可用版本 %s.",
+ "Following platforms are supported: %s" : "支持以下平台:%s",
+ "Server version %s or higher is required." : "需要服务器版本 %s 或更高版本。",
+ "Server version %s or lower is required." : "需要服务器版本 %s 或更低版本。",
+ "Unknown filetype" : "未知的文件类型",
+ "Invalid image" : "无效的图像",
+ "Avatar image is not square" : "头像图像不是正方形",
+ "today" : "今天",
+ "yesterday" : "昨天",
+ "_%n day ago_::_%n days ago_" : ["%n 天前"],
+ "last month" : "上月",
+ "_%n month ago_::_%n months ago_" : ["%n 月前"],
+ "last year" : "去年",
+ "_%n year ago_::_%n years ago_" : ["%n 年前"],
+ "_%n hour ago_::_%n hours ago_" : ["%n 小时前"],
+ "_%n minute ago_::_%n minutes ago_" : ["%n 分钟前"],
+ "seconds ago" : "秒前",
+ "Module with id: %s does not exist. Please enable it in your apps settings or contact your administrator." : "ID 为 %s 的模块不存在. 请在应用设置中启用或联系您的管理员.",
+ "File name is a reserved word" : "文件名包含敏感字符",
+ "File name contains at least one invalid character" : "文件名中存在至少一个非法字符",
+ "File name is too long" : "文件名过长",
+ "Dot files are not allowed" : ".文件 不被允许",
+ "Empty filename is not allowed" : "不允许使用空名称。",
+ "APCu" : "APCu",
+ "Redis" : "Redis",
+ "Server settings" : "服务器设置",
+ "Sharing" : "分享",
+ "Encryption" : "加密",
+ "Additional settings" : "其他设置",
+ "Tips & tricks" : "小提示",
+ "%s enter the database username and name." : "%s 输入数据库用户名和名称.",
+ "%s enter the database username." : "%s 输入数据库用户名。",
+ "%s enter the database name." : "%s 输入数据库名称。",
+ "%s you may not use dots in the database name" : "%s 您不能在数据库名称中使用英文句号。",
+ "Oracle connection could not be established" : "不能建立甲骨文连接",
+ "Oracle username and/or password not valid" : "Oracle 数据库用户名和/或密码无效",
+ "DB Error: \"%s\"" : "数据库错误:\"%s\"",
+ "Offending command was: \"%s\"" : "冲突命令为:\"%s\"",
+ "You need to enter either an existing account or the administrator." : "你需要输入一个数据库中已有的账户或管理员账户。",
+ "Offending command was: \"%s\", name: %s, password: %s" : "冲突命令为:\"%s\",名称:%s,密码:%s",
+ "PostgreSQL username and/or password not valid" : "PostgreSQL 数据库用户名和/或密码无效",
+ "Mac OS X is not supported and %s will not work properly on this platform. Use it at your own risk! " : "Mac OS X 不被支持并且 %s 在这个平台上无法正常工作。请自行承担风险!",
+ "For the best results, please consider using a GNU/Linux server instead." : "为了达到最好的效果,请考虑使用 GNU/Linux 服务器。",
+ "It seems that this %s instance is running on a 32-bit PHP environment and the open_basedir has been configured in php.ini. This will lead to problems with files over 4 GB and is highly discouraged." : "看起来这个 %s 实例运行在32位PHP环境中并且已在php.ini中配置open_basedir。这将在文件超过4GB时出现问题,我们极力反对这样做。",
+ "Please remove the open_basedir setting within your php.ini or switch to 64-bit PHP." : "请删除php.ini中的open_basedir设置或切换到64位PHP。",
+ "Set an admin username." : "请设置一个管理员用户名。",
+ "Set an admin password." : "请设置一个管理员密码。",
+ "Can't create or write into the data directory %s" : "无法创建或写入数据目录 %s",
+ "Invalid Federated Cloud ID" : "无效的联合云ID",
+ "%s shared »%s« with you" : "%s 向您分享了 »%s«",
+ "%s via %s" : "%s 通过 %s",
+ "Sharing %s failed, because the backend does not allow shares from type %i" : "分享 %s 失败, 因为后端不允许分享 %i 类型",
+ "Sharing %s failed, because the file does not exist" : "分享 %s 失败, 因为文件不存在.",
+ "You are not allowed to share %s" : "您无权分享 %s",
+ "Sharing %s failed, because you can not share with yourself" : "分享 %s 失败, 因为您不能分享给自己",
+ "Sharing %s failed, because the user %s does not exist" : "分享 %s 失败, 因为用户 %s 不存在",
+ "Sharing %s failed, because the user %s is not a member of any groups that %s is a member of" : "分享 %s 失败, 因为用户 %s 不是 %s 所属的任何组的用户",
+ "Sharing %s failed, because this item is already shared with %s" : "分享 %s 失败, 因为该项已经分享给用户 %s",
+ "Sharing %s failed, because this item is already shared with user %s" : "分享 %s 失败, 因为该项已经分享给用户 %s",
+ "Sharing %s failed, because the group %s does not exist" : "分享 %s 失败, 因为 %s 分组不存在",
+ "Sharing %s failed, because %s is not a member of the group %s" : "分享 %s 失败, 因为 %s 不是 %s 分组的成员",
+ "You need to provide a password to create a public link, only protected links are allowed" : "链接分享需要密码, 您需要提供一个密码以创建公开连接",
+ "Sharing %s failed, because sharing with links is not allowed" : "分享 %s 失败, 因为不允许使用链接分享",
+ "Not allowed to create a federated share with the same user" : "不能给你自己分享文件",
+ "Sharing %s failed, could not find %s, maybe the server is currently unreachable." : "分享 %s 失败, 无法找到 %s, 该服务当前无法连接.",
+ "Share type %s is not valid for %s" : "%s 不是 %s 的合法共享类型",
+ "Setting permissions for %s failed, because the permissions exceed permissions granted to %s" : "设置 %s 权限失败,因为权限超出了 %s 已有权限。",
+ "Setting permissions for %s failed, because the item was not found" : "设置 %s 的权限失败,因为未找到到对应项",
+ "Cannot set expiration date. Shares cannot expire later than %s after they have been shared" : "无法设置过期时间. 过期时间不能晚于其分享时间 %s",
+ "Cannot set expiration date. Expiration date is in the past" : "无法设置过期时间. 过期时间不能为过去",
+ "Cannot clear expiration date. Shares are required to have an expiration date." : "无法清除过期时间. 每个分享必须有一个过期时间",
+ "Sharing backend %s must implement the interface OCP\\Share_Backend" : "分享后端 %s 必须实现 OCP\\Share_Backend 接口",
+ "Sharing backend %s not found" : "%s 的分享后端未找到",
+ "Sharing backend for %s not found" : "%s 的分享后端未找到",
+ "Sharing failed, because the user %s is the original sharer" : "分享失败, 因为用户 %s 是原始的分享者.",
+ "Sharing %s failed, because the permissions exceed permissions granted to %s" : "分享 %s 失败, 因为权限超过了 %s 的已有权限",
+ "Sharing %s failed, because resharing is not allowed" : "分享 %s 失败, 因为不允许二次共享",
+ "Sharing %s failed, because the sharing backend for %s could not find its source" : "分享 %s 失败, 因为无法找到 %s 分享后端的来源",
+ "Sharing %s failed, because the file could not be found in the file cache" : "分享 %s 失败, 因为文件缓存中找不到该文件",
+ "Cannot increase permissions of %s" : "无法提升 %s 的权限",
+ "Files can't be shared with delete permissions" : "无法分享有删除权限的文件",
+ "Files can't be shared with create permissions" : "无法分享有创建权限的文件",
+ "Expiration date is in the past" : "到期日期已过.",
+ "Cannot set expiration date more than %s days in the future" : "无法将过期日期设置为超过 %s 天.",
+ "Could not find category \"%s\"" : "无法找到分类 \"%s\"",
+ "Sunday" : "星期日",
+ "Monday" : "星期一",
+ "Tuesday" : "星期二",
+ "Wednesday" : "星期三",
+ "Thursday" : "星期四",
+ "Friday" : "星期五",
+ "Saturday" : "星期六",
+ "Sun." : "周日",
+ "Mon." : "周一",
+ "Tue." : "周二",
+ "Wed." : "周三",
+ "Thu." : "周四",
+ "Fri." : "周五",
+ "Sat." : "周六",
+ "Su" : "日",
+ "Mo" : "一",
+ "Tu" : "二",
+ "We" : "三",
+ "Th" : "四",
+ "Fr" : "五",
+ "Sa" : "六",
+ "January" : "一月",
+ "February" : "二月",
+ "March" : "三月",
+ "April" : "四月",
+ "May" : "五月",
+ "June" : "六月",
+ "July" : "七月",
+ "August" : "八月",
+ "September" : "九月",
+ "October" : "十月",
+ "November" : "十一月",
+ "December" : "十二月",
+ "Jan." : "一月",
+ "Feb." : "二月",
+ "Mar." : "三月",
+ "Apr." : "四月",
+ "May." : "五月",
+ "Jun." : "六月",
+ "Jul." : "七月",
+ "Aug." : "八月",
+ "Sep." : "九月",
+ "Oct." : "十月",
+ "Nov." : "十一月",
+ "Dec." : "十二月",
+ "Apps" : "应用",
+ "Only the following characters are allowed in a username: \"a-z\", \"A-Z\", \"0-9\", and \"_.@-'\"" : "在用户名中只允许使用以下字符:“a-z”,“A-Z”,“0-9”和\"_.@-'\"",
+ "A valid username must be provided" : "必须提供合法的用户名",
+ "Username contains whitespace at the beginning or at the end" : "用户名在开头或结尾处包含空格",
+ "A valid password must be provided" : "必须提供合法的密码",
+ "The username is already being used" : "用户名已被使用",
+ "Login canceled by app" : "已通过应用取消登录",
+ "User disabled" : "用户已禁用",
+ "Help" : "帮助",
+ "Personal" : "个人",
+ "Users" : "用户",
+ "Admin" : "管理",
+ "App \"%s\" cannot be installed because appinfo file cannot be read." : "无法安装应用\"%s\",因为无法读取appinfo文件.",
+ "App \"%s\" cannot be installed because it is not compatible with this version of the server." : "应用程式 \"%s\" 无法安装,因为它与这个版本的服务器不兼容.",
+ "No app name specified" : "没有指定的 App 名称",
+ "App '%s' could not be installed!" : "应用程序 '%s' 无法被安装!",
+ "App \"%s\" cannot be installed because the following dependencies are not fulfilled: %s" : "应用程序 \"%s\" 无法被安装,因为为满足下列依赖关系: %s",
+ "a safe home for all your data" : "给您所有的数据一个安全的家",
+ "File is currently busy, please try again later" : "文件当前正忙,请稍后再试",
+ "Can't read file" : "无法读取文件",
+ "Application is not enabled" : "应用程序未启用",
+ "Authentication error" : "认证出错",
+ "Token expired. Please reload page." : "Token 过期,请刷新页面。",
+ "Unknown user" : "未知用户",
+ "No database drivers (sqlite, mysql, or postgresql) installed." : "没有安装数据库驱动 (SQLite、MySQL 或 PostgreSQL)。",
+ "Cannot write into \"config\" directory" : "无法写入“config”目录",
+ "Cannot write into \"apps\" directory" : "无法写入“apps”目录",
+ "This can usually be fixed by %sgiving the webserver write access to the apps directory%s or disabling the appstore in the config file." : "您可以由 %s 设置 Web 服务器对应用目录 %s 的写权限或在配置文件中禁用应用商店可以修复这个问题.",
+ "Cannot create \"data\" directory (%s)" : "无法创建“apps”目录 (%s)",
+ "This can usually be fixed by <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">giving the webserver write access to the root directory</a>." : "点击 <a href=\"%s\" target=\"_blank\" rel=\"noreferrer\">设置 Web 服务器对根目录的写入权限</a> 可修复这个问题.",
+ "Permissions can usually be fixed by %sgiving the webserver write access to the root directory%s." : "您可以由 %s 设置 Web 服务器对根目录 %s 的写权限可以修复这个问题.",
+ "Setting locale to %s failed" : "设置语言为 %s 失败",
+ "Please install one of these locales on your system and restart your webserver." : "请在您的系统中安装下述一种语言并重启 Web 服务器.",
+ "Please ask your server administrator to install the module." : "请联系服务器管理员安装模块.",
+ "PHP module %s not installed." : "PHP %s 模块未安装.",
+ "PHP setting \"%s\" is not set to \"%s\"." : "PHP 选项 \"%s\" 未设置为 \"%s\".",
+ "Adjusting this setting in php.ini will make Nextcloud run again" : "在 php.ini 中调整该设置将导致 Nextcloud 重新运行",
+ "mbstring.func_overload is set to \"%s\" instead of the expected value \"0\"" : "mbstring.func_overload 当前设置为 \"%s\", 预期值为 \"0\"",
+ "To fix this issue set <code>mbstring.func_overload</code> to <code>0</code> in your php.ini" : "请在 php.ini 中设置 <code>mbstring.func_overload</code> 为 <code>0</code> 以解决该问题",
+ "libxml2 2.7.0 is at least required. Currently %s is installed." : "至少需要 libxml2 2.7.0. 当前安装 %s.",
+ "To fix this issue update your libxml2 version and restart your web server." : "升级您的 libxml2 版本然后重启 Web 服务器以解决该问题.",
+ "PHP is apparently set up to strip inline doc blocks. This will make several core apps inaccessible." : "PHP 被设置为移除内联块, 这将导致多个核心应用无法访问.",
+ "This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "这可能由缓存/加速器导致的, 例如 Zend OPcache 或 eAccelerator.",
+ "PHP modules have been installed, but they are still listed as missing?" : "PHP 模块已经安装, 但仍然显示未安装?",
+ "Please ask your server administrator to restart the web server." : "请联系服务器管理员重启 Web 服务器.",
+ "PostgreSQL >= 9 required" : "要求 PostgreSQL >= 9",
+ "Please upgrade your database version" : "请升级您的数据库版本",
+ "Please change the permissions to 0770 so that the directory cannot be listed by other users." : "请更改权限为 0770 以避免其他用户查看目录.",
+ "Data directory (%s) is readable by other users" : "数据目录 (%s) 能被其他用户读取",
+ "Data directory (%s) must be an absolute path" : "数据目录 (%s) 必须为绝对路径",
+ "Check the value of \"datadirectory\" in your configuration" : "请检查配置文件中 \"datadirectory\" 的值",
+ "Data directory (%s) is invalid" : "数据目录 (%s) 无效",
+ "Please check that the data directory contains a file \".ocdata\" in its root." : "请检查根目录下 data 目录中包含名为 \".ocdata\" 的文件.",
+ "Could not obtain lock type %d on \"%s\"." : "无法在 \"%s\" 上获取锁类型 %d.",
+ "Storage unauthorized. %s" : "存储认证失败. %s",
+ "Storage incomplete configuration. %s" : "存储未完成配置. %s",
+ "Storage connection error. %s" : "存储连接错误. %s",
+ "Storage is temporarily not available" : "存储暂时不可用",
+ "Storage connection timeout. %s" : "存储连接超时. %s",
+ "4-byte characters are not supported in file names" : "文件名中不支持 4 字节字符",
+ "App directory already exists" : "应用目录已经存在",
+ "Can't create app folder. Please fix permissions. %s" : "无法创建应用文件夹. 请修改权限. %s",
+ "Archive does not contain a directory named %s" : "压缩文件中不包含目录 %s",
+ "No source specified when installing app" : "安装应用时未指定来源",
+ "No href specified when installing app from http" : "从 http 安装应用时未指定链接",
+ "No path specified when installing app from local file" : "从本地文件安装应用时未指定路径",
+ "Archives of type %s are not supported" : "不支持 %s 的压缩格式",
+ "Failed to open archive when installing app" : "安装应用时打开文件失败",
+ "App does not provide an info.xml file" : "应用未提供 info.xml 文件",
+ "App cannot be installed because appinfo file cannot be read." : "无法安装应用, 因为无法读取应用信息文件",
+ "Signature could not get checked. Please contact the app developer and check your admin screen." : "签名检查失败. 请联系应用开发者并检查您的管理界面",
+ "App can't be installed because of not allowed code in the App" : "无法安装应用, 因为应用中包含不允许的代码",
+ "App can't be installed because it is not compatible with this version of the server" : "无法安装应用, 因为应用不兼容当前服务器的版本",
+ "App can't be installed because it contains the <shipped>true</shipped> tag which is not allowed for non shipped apps" : "无法安装应用, 因为应用包含 <shipped>true</shipped> 标签",
+ "App can't be installed because the version in info.xml is not the same as the version reported from the app store" : "无法安装应用, 因为 info.xml 中的版本与应用市场中的版本不同",
+ "Logging" : "日志",
+ "Recommended" : "推荐",
+ "Microsoft Windows Platform is not supported" : "不支持 Microsoft Windows 平台",
+ "Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "不支持在 Microsoft Windows 平台运行 Nextcloud 服务器. 如果您没有迁移服务器的计划, 我们建议您在虚拟机中使用 Linux 服务器.",
+ "Storage not available" : "存储空间不可用"
+},"pluralForm" :"nplurals=1; plural=0;"
+} \ No newline at end of file
diff --git a/lib/l10n/zh_TW.js b/lib/l10n/zh_TW.js
index bdf63be8b5f..f03e9849cb9 100644
--- a/lib/l10n/zh_TW.js
+++ b/lib/l10n/zh_TW.js
@@ -221,8 +221,6 @@ OC.L10N.register(
"Recommended" : "建議",
"Microsoft Windows Platform is not supported" : "不支援微軟Windows系統",
"Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "微軟Windows不支援Nextcloud伺服器,如果您一定要使用,我們建議您在虛擬機中安裝Linux版本伺服器。",
- "Storage not available" : "無法存取儲存空間",
- "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "應用程式 \"%s\" 無法安裝,因為與此版本 Nextcloud 不相容",
- "App can't be installed because it is not compatible with this version of Nextcloud" : "應用程式無法安裝,因為與此版本 Nextcloud 不相容"
+ "Storage not available" : "無法存取儲存空間"
},
"nplurals=1; plural=0;");
diff --git a/lib/l10n/zh_TW.json b/lib/l10n/zh_TW.json
index e2f39b8c3b1..7857eb4a7ea 100644
--- a/lib/l10n/zh_TW.json
+++ b/lib/l10n/zh_TW.json
@@ -219,8 +219,6 @@
"Recommended" : "建議",
"Microsoft Windows Platform is not supported" : "不支援微軟Windows系統",
"Running Nextcloud Server on the Microsoft Windows platform is not supported. We suggest you use a Linux server in a virtual machine if you have no option for migrating the server itself." : "微軟Windows不支援Nextcloud伺服器,如果您一定要使用,我們建議您在虛擬機中安裝Linux版本伺服器。",
- "Storage not available" : "無法存取儲存空間",
- "App \"%s\" cannot be installed because it is not compatible with this version of Nextcloud." : "應用程式 \"%s\" 無法安裝,因為與此版本 Nextcloud 不相容",
- "App can't be installed because it is not compatible with this version of Nextcloud" : "應用程式無法安裝,因為與此版本 Nextcloud 不相容"
+ "Storage not available" : "無法存取儲存空間"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/lib/private/AllConfig.php b/lib/private/AllConfig.php
index 4e13d70371b..1f59e677a54 100644
--- a/lib/private/AllConfig.php
+++ b/lib/private/AllConfig.php
@@ -68,7 +68,7 @@ class AllConfig implements \OCP\IConfig {
/**
* @param SystemConfig $systemConfig
*/
- function __construct(SystemConfig $systemConfig) {
+ public function __construct(SystemConfig $systemConfig) {
$this->userCache = new CappedMemoryCache();
$this->systemConfig = $systemConfig;
}
@@ -358,12 +358,17 @@ class AllConfig implements \OCP\IConfig {
* ]
*/
private function getUserValues($userId) {
- // TODO - FIXME
- $this->fixDIInit();
-
if (isset($this->userCache[$userId])) {
return $this->userCache[$userId];
}
+ if ($userId === null || $userId === '') {
+ $this->userCache[$userId]=array();
+ return $this->userCache[$userId];
+ }
+
+ // TODO - FIXME
+ $this->fixDIInit();
+
$data = array();
$query = 'SELECT `appid`, `configkey`, `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ?';
$result = $this->connection->executeQuery($query, array($userId));
diff --git a/lib/private/App/AppManager.php b/lib/private/App/AppManager.php
index fca5c9b87ac..6b819ef7ac1 100644
--- a/lib/private/App/AppManager.php
+++ b/lib/private/App/AppManager.php
@@ -221,6 +221,21 @@ class AppManager implements IAppManager {
}
/**
+ * Whether a list of types contains a protected app type
+ *
+ * @param string[] $types
+ * @return bool
+ */
+ public function hasProtectedAppType($types) {
+ if (empty($types)) {
+ return false;
+ }
+
+ $protectedTypes = array_intersect($this->protectedAppTypes, $types);
+ return !empty($protectedTypes);
+ }
+
+ /**
* Enable an app only for specific groups
*
* @param string $appId
diff --git a/lib/private/App/AppStore/Fetcher/AppFetcher.php b/lib/private/App/AppStore/Fetcher/AppFetcher.php
index bbe75c723d5..7c5efafc92f 100644
--- a/lib/private/App/AppStore/Fetcher/AppFetcher.php
+++ b/lib/private/App/AppStore/Fetcher/AppFetcher.php
@@ -28,9 +28,6 @@ use OCP\Http\Client\IClientService;
use OCP\IConfig;
class AppFetcher extends Fetcher {
- /** @var IConfig */
- private $config;
-
/**
* @param IAppData $appData
* @param IClientService $clientService
@@ -44,13 +41,13 @@ class AppFetcher extends Fetcher {
parent::__construct(
$appData,
$clientService,
- $timeFactory
+ $timeFactory,
+ $config
);
$this->fileName = 'apps.json';
- $this->config = $config;
- $versionArray = \OC_Util::getVersion();
+ $versionArray = explode('.', $this->config->getSystemValue('version'));
$this->endpointUrl = sprintf(
'https://apps.nextcloud.com/api/v1/platform/%d.%d.%d/apps.json',
$versionArray[0],
@@ -62,15 +59,14 @@ class AppFetcher extends Fetcher {
/**
* Only returns the latest compatible app release in the releases array
*
+ * @param string $ETag
+ * @param string $content
+ *
* @return array
*/
- protected function fetch() {
- $client = $this->clientService->newClient();
- $response = $client->get($this->endpointUrl);
- $responseJson = [];
- $responseJson['data'] = json_decode($response->getBody(), true);
- $responseJson['timestamp'] = $this->timeFactory->getTime();
- $response = $responseJson;
+ protected function fetch($ETag, $content) {
+ /** @var mixed[] $response */
+ $response = parent::fetch($ETag, $content);
$ncVersion = $this->config->getSystemValue('version');
$ncMajorVersion = explode('.', $ncVersion)[0];
diff --git a/lib/private/App/AppStore/Fetcher/CategoryFetcher.php b/lib/private/App/AppStore/Fetcher/CategoryFetcher.php
index 74201ec3737..8b79259a66a 100644
--- a/lib/private/App/AppStore/Fetcher/CategoryFetcher.php
+++ b/lib/private/App/AppStore/Fetcher/CategoryFetcher.php
@@ -24,20 +24,24 @@ namespace OC\App\AppStore\Fetcher;
use OCP\AppFramework\Utility\ITimeFactory;
use OCP\Files\IAppData;
use OCP\Http\Client\IClientService;
+use OCP\IConfig;
class CategoryFetcher extends Fetcher {
/**
* @param IAppData $appData
* @param IClientService $clientService
* @param ITimeFactory $timeFactory
+ * @param IConfig $config
*/
public function __construct(IAppData $appData,
IClientService $clientService,
- ITimeFactory $timeFactory) {
+ ITimeFactory $timeFactory,
+ IConfig $config) {
parent::__construct(
$appData,
$clientService,
- $timeFactory
+ $timeFactory,
+ $config
);
$this->fileName = 'categories.json';
$this->endpointUrl = 'https://apps.nextcloud.com/api/v1/categories.json';
diff --git a/lib/private/App/AppStore/Fetcher/Fetcher.php b/lib/private/App/AppStore/Fetcher/Fetcher.php
index f82e1a253f6..dab79e11821 100644
--- a/lib/private/App/AppStore/Fetcher/Fetcher.php
+++ b/lib/private/App/AppStore/Fetcher/Fetcher.php
@@ -21,10 +21,12 @@
namespace OC\App\AppStore\Fetcher;
+use OCP\AppFramework\Http;
use OCP\AppFramework\Utility\ITimeFactory;
use OCP\Files\IAppData;
use OCP\Files\NotFoundException;
use OCP\Http\Client\IClientService;
+use OCP\IConfig;
abstract class Fetcher {
const INVALIDATE_AFTER_SECONDS = 300;
@@ -35,6 +37,8 @@ abstract class Fetcher {
protected $clientService;
/** @var ITimeFactory */
protected $timeFactory;
+ /** @var IConfig */
+ protected $config;
/** @var string */
protected $fileName;
/** @var string */
@@ -44,26 +48,52 @@ abstract class Fetcher {
* @param IAppData $appData
* @param IClientService $clientService
* @param ITimeFactory $timeFactory
+ * @param IConfig $config
*/
public function __construct(IAppData $appData,
IClientService $clientService,
- ITimeFactory $timeFactory) {
+ ITimeFactory $timeFactory,
+ IConfig $config) {
$this->appData = $appData;
$this->clientService = $clientService;
$this->timeFactory = $timeFactory;
+ $this->config = $config;
}
/**
* Fetches the response from the server
*
+ * @param string $ETag
+ * @param string $content
+ *
* @return array
*/
- protected function fetch() {
+ protected function fetch($ETag, $content) {
+ $options = [];
+
+ if ($ETag !== '') {
+ $options['headers'] = [
+ 'If-None-Match' => $ETag,
+ ];
+ }
+
$client = $this->clientService->newClient();
- $response = $client->get($this->endpointUrl);
+ $response = $client->get($this->endpointUrl, $options);
+
$responseJson = [];
- $responseJson['data'] = json_decode($response->getBody(), true);
+ if ($response->getStatusCode() === Http::STATUS_NOT_MODIFIED) {
+ $responseJson['data'] = json_decode($content, true);
+ } else {
+ $responseJson['data'] = json_decode($response->getBody(), true);
+ $ETag = $response->getHeader('ETag');
+ }
+
$responseJson['timestamp'] = $this->timeFactory->getTime();
+ $responseJson['ncversion'] = $this->config->getSystemValue('version');
+ if ($ETag !== '') {
+ $responseJson['ETag'] = $ETag;
+ }
+
return $responseJson;
}
@@ -75,15 +105,27 @@ abstract class Fetcher {
public function get() {
$rootFolder = $this->appData->getFolder('/');
+ $ETag = '';
+ $content = '';
+
try {
// File does already exists
$file = $rootFolder->getFile($this->fileName);
$jsonBlob = json_decode($file->getContent(), true);
if(is_array($jsonBlob)) {
- // If the timestamp is older than 300 seconds request the files new
- if((int)$jsonBlob['timestamp'] > ($this->timeFactory->getTime() - self::INVALIDATE_AFTER_SECONDS)) {
+ /*
+ * If the timestamp is older than 300 seconds request the files new
+ * If the version changed (update!) also refresh
+ */
+ if((int)$jsonBlob['timestamp'] > ($this->timeFactory->getTime() - self::INVALIDATE_AFTER_SECONDS) &&
+ isset($jsonBlob['ncversion']) && $jsonBlob['ncversion'] === $this->config->getSystemValue('version', '0.0.0')) {
return $jsonBlob['data'];
}
+
+ if (isset($jsonBlob['ETag'])) {
+ $ETag = $jsonBlob['ETag'];
+ $content = json_encode($jsonBlob['data']);
+ }
}
} catch (NotFoundException $e) {
// File does not already exists
@@ -92,7 +134,7 @@ abstract class Fetcher {
// Refresh the file content
try {
- $responseJson = $this->fetch();
+ $responseJson = $this->fetch($ETag, $content);
$file->putContent(json_encode($responseJson));
return json_decode($file->getContent(), true)['data'];
} catch (\Exception $e) {
diff --git a/lib/private/AppConfig.php b/lib/private/AppConfig.php
index d92e8965b5c..4e102522550 100644
--- a/lib/private/AppConfig.php
+++ b/lib/private/AppConfig.php
@@ -1,5 +1,6 @@
<?php
/**
+ * @copyright Copyright (c) 2017, Joas Schilling <coding@schilljs.com>
* @copyright Copyright (c) 2016, ownCloud, Inc.
*
* @author Arthur Schiwon <blizzz@arthur-schiwon.de>
@@ -29,7 +30,9 @@
namespace OC;
+use OC\DB\OracleConnection;
use OCP\IAppConfig;
+use OCP\IConfig;
use OCP\IDBConnection;
/**
@@ -37,12 +40,25 @@ use OCP\IDBConnection;
* database.
*/
class AppConfig implements IAppConfig {
- /**
- * @var \OCP\IDBConnection $conn
- */
+
+ /** @var array[] */
+ protected $sensitiveValues = [
+ 'spreed' => [
+ 'turn_server_secret',
+ ],
+ 'user_ldap' => [
+ 'ldap_agent_password',
+ ],
+ ];
+
+ /** @var \OCP\IDBConnection */
protected $conn;
- private $cache = array();
+ /** @var array[] */
+ private $cache = [];
+
+ /** @var bool */
+ private $configLoaded = false;
/**
* @param IDBConnection $conn
@@ -85,6 +101,7 @@ class AppConfig implements IAppConfig {
*
* @param string $app the app we are looking for
* @return array an array of key names
+ * @deprecated 8.0.0 use method getAppKeys of \OCP\IConfig
*
* This function gets all keys of an app. Please note that the values are
* not returned.
@@ -112,6 +129,7 @@ class AppConfig implements IAppConfig {
* @param string $key key
* @param string $default = null, default value if the key does not exist
* @return string the value or $default
+ * @deprecated 8.0.0 use method getAppValue of \OCP\IConfig
*
* This function gets a value from the appconfig table. If the key does
* not exist the default value will be returned
@@ -146,6 +164,7 @@ class AppConfig implements IAppConfig {
* @param string $key key
* @param string|float|int $value value
* @return bool True if the value was inserted or updated, false if the value was the same
+ * @deprecated 8.0.0 use method setAppValue of \OCP\IConfig
*/
public function setValue($app, $key, $value) {
if (!$this->hasKey($app, $key)) {
@@ -182,7 +201,7 @@ class AppConfig implements IAppConfig {
* http://docs.oracle.com/cd/E11882_01/server.112/e26088/conditions002.htm#i1033286
* > Large objects (LOBs) are not supported in comparison conditions.
*/
- if (!($this->conn instanceof \OC\DB\OracleConnection)) {
+ if (!($this->conn instanceof OracleConnection)) {
// Only update the value when it is not the same
$sql->andWhere($sql->expr()->neq('configvalue', $sql->createParameter('configvalue')))
->setParameter('configvalue', $value);
@@ -200,7 +219,8 @@ class AppConfig implements IAppConfig {
*
* @param string $app app
* @param string $key key
- * @return boolean|null
+ * @return boolean
+ * @deprecated 8.0.0 use method deleteAppValue of \OCP\IConfig
*/
public function deleteKey($app, $key) {
$this->loadConfigValues();
@@ -214,13 +234,15 @@ class AppConfig implements IAppConfig {
$sql->execute();
unset($this->cache[$app][$key]);
+ return false;
}
/**
* Remove app from appconfig
*
* @param string $app app
- * @return boolean|null
+ * @return boolean
+ * @deprecated 8.0.0 use method deleteAppValue of \OCP\IConfig
*
* Removes all keys in appconfig belonging to the app.
*/
@@ -234,6 +256,7 @@ class AppConfig implements IAppConfig {
$sql->execute();
unset($this->cache[$app]);
+ return false;
}
/**
@@ -262,10 +285,30 @@ class AppConfig implements IAppConfig {
}
/**
+ * get all values of the app or and filters out sensitive data
+ *
+ * @param string $app
+ * @return array
+ */
+ public function getFilteredValues($app) {
+ $values = $this->getValues($app, false);
+
+ foreach ($this->sensitiveValues[$app] as $sensitiveKey) {
+ if (isset($values[$sensitiveKey])) {
+ $values[$sensitiveKey] = IConfig::SENSITIVE_VALUE;
+ }
+ }
+
+ return $values;
+ }
+
+ /**
* Load all the app config values
*/
protected function loadConfigValues() {
- if ($this->configLoaded) return;
+ if ($this->configLoaded) {
+ return;
+ }
$this->cache = [];
diff --git a/lib/private/AppFramework/Db/Db.php b/lib/private/AppFramework/Db/Db.php
deleted file mode 100644
index 5aacdc517a2..00000000000
--- a/lib/private/AppFramework/Db/Db.php
+++ /dev/null
@@ -1,314 +0,0 @@
-<?php
-/**
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- *
- * @author Bernhard Posselt <dev@bernhard-posselt.com>
- * @author Joas Schilling <coding@schilljs.com>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Robin Appelman <robin@icewind.nl>
- * @author Robin McCorkell <robin@mccorkell.me.uk>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- *
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program 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, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
- */
-
-namespace OC\AppFramework\Db;
-
-use OCP\DB\QueryBuilder\IQueryBuilder;
-use OCP\IDb;
-use OCP\IDBConnection;
-use OCP\PreConditionNotMetException;
-use Doctrine\DBAL\Platforms\MySqlPlatform;
-
-/**
- * @deprecated use IDBConnection directly, will be removed in ownCloud 10
- * Small Facade for being able to inject the database connection for tests
- */
-class Db implements IDb {
- /**
- * @var IDBConnection
- */
- protected $connection;
-
- /**
- * @param IDBConnection $connection
- */
- public function __construct(IDBConnection $connection) {
- $this->connection = $connection;
- }
-
- /**
- * Gets the ExpressionBuilder for the connection.
- *
- * @return \OCP\DB\QueryBuilder\IQueryBuilder
- */
- public function getQueryBuilder() {
- return $this->connection->getQueryBuilder();
- }
-
- /**
- * Used to abstract the ownCloud database access away
- *
- * @param string $sql the sql query with ? placeholder for params
- * @param int $limit the maximum number of rows
- * @param int $offset from which row we want to start
- * @deprecated use prepare instead, will be removed in ownCloud 10
- * @return \OC_DB_StatementWrapper prepared SQL query
- */
- public function prepareQuery($sql, $limit = null, $offset = null) {
- $isManipulation = \OC_DB::isManipulation($sql);
- $statement = $this->connection->prepare($sql, $limit, $offset);
- return new \OC_DB_StatementWrapper($statement, $isManipulation);
- }
-
-
- /**
- * Used to get the id of the just inserted element
- *
- * @deprecated use lastInsertId instead, will be removed in ownCloud 10
- * @param string $tableName the name of the table where we inserted the item
- * @return int the id of the inserted element
- */
- public function getInsertId($tableName) {
- return $this->connection->lastInsertId($tableName);
- }
-
- /**
- * Used to abstract the ownCloud database access away
- * @param string $sql the sql query with ? placeholder for params
- * @param int $limit the maximum number of rows
- * @param int $offset from which row we want to start
- * @return \Doctrine\DBAL\Driver\Statement The prepared statement.
- */
- public function prepare($sql, $limit=null, $offset=null) {
- return $this->connection->prepare($sql, $limit, $offset);
- }
-
- /**
- * Executes an, optionally parameterized, SQL query.
- *
- * If the query is parameterized, a prepared statement is used.
- * If an SQLLogger is configured, the execution is logged.
- *
- * @param string $query The SQL query to execute.
- * @param string[] $params The parameters to bind to the query, if any.
- * @param array $types The types the previous parameters are in.
- * @return \Doctrine\DBAL\Driver\Statement The executed statement.
- */
- public function executeQuery($query, array $params = array(), $types = array()) {
- return $this->connection->executeQuery($query, $params, $types);
- }
-
- /**
- * Executes an SQL INSERT/UPDATE/DELETE query with the given parameters
- * and returns the number of affected rows.
- *
- * This method supports PDO binding types as well as DBAL mapping types.
- *
- * @param string $query The SQL query.
- * @param array $params The query parameters.
- * @param array $types The parameter types.
- * @return integer The number of affected rows.
- */
- public function executeUpdate($query, array $params = array(), array $types = array()) {
- return $this->connection->executeUpdate($query, $params, $types);
- }
-
- /**
- * Used to get the id of the just inserted element
- * @param string $table the name of the table where we inserted the item
- * @return int the id of the inserted element
- */
- public function lastInsertId($table = null) {
- return $this->connection->lastInsertId($table);
- }
-
- /**
- * Insert a row if the matching row does not exists.
- *
- * @param string $table The table name (will replace *PREFIX* with the actual prefix)
- * @param array $input data that should be inserted into the table (column name => value)
- * @param array|null $compare List of values that should be checked for "if not exists"
- * If this is null or an empty array, all keys of $input will be compared
- * Please note: text fields (clob) must not be used in the compare array
- * @return int number of inserted rows
- * @throws \Doctrine\DBAL\DBALException
- */
- public function insertIfNotExist($table, $input, array $compare = null) {
- return $this->connection->insertIfNotExist($table, $input, $compare);
- }
-
- /**
- * Insert or update a row value
- *
- * @param string $table
- * @param array $keys (column name => value)
- * @param array $values (column name => value)
- * @param array $updatePreconditionValues ensure values match preconditions (column name => value)
- * @return int number of new rows
- * @throws \Doctrine\DBAL\DBALException
- * @throws PreConditionNotMetException
- */
- public function setValues($table, array $keys, array $values, array $updatePreconditionValues = []) {
- return $this->connection->setValues($table, $keys, $values, $updatePreconditionValues);
- }
-
- /**
- * @inheritdoc
- */
- public function lockTable($tableName) {
- $this->connection->lockTable($tableName);
- }
-
- /**
- * @inheritdoc
- */
- public function unlockTable() {
- $this->connection->unlockTable();
- }
-
- /**
- * Start a transaction
- */
- public function beginTransaction() {
- $this->connection->beginTransaction();
- }
-
- /**
- * Check if a transaction is active
- *
- * @return bool
- */
- public function inTransaction() {
- return $this->connection->inTransaction();
- }
-
- /**
- * Commit the database changes done during a transaction that is in progress
- */
- public function commit() {
- $this->connection->commit();
- }
-
- /**
- * Rollback the database changes done during a transaction that is in progress
- */
- public function rollBack() {
- $this->connection->rollBack();
- }
-
- /**
- * Gets the error code and message as a string for logging
- * @return string
- */
- public function getError() {
- return $this->connection->getError();
- }
-
- /**
- * Fetch the SQLSTATE associated with the last database operation.
- *
- * @return integer The last error code.
- */
- public function errorCode() {
- return $this->connection->errorCode();
- }
-
- /**
- * Fetch extended error information associated with the last database operation.
- *
- * @return array The last error information.
- */
- public function errorInfo() {
- return $this->connection->errorInfo();
- }
-
- /**
- * Establishes the connection with the database.
- *
- * @return bool
- */
- public function connect() {
- return $this->connection->connect();
- }
-
- /**
- * Close the database connection
- */
- public function close() {
- $this->connection->close();
- }
-
- /**
- * Quotes a given input parameter.
- *
- * @param mixed $input Parameter to be quoted.
- * @param int $type Type of the parameter.
- * @return string The quoted parameter.
- */
- public function quote($input, $type = IQueryBuilder::PARAM_STR) {
- return $this->connection->quote($input, $type);
- }
-
- /**
- * Gets the DatabasePlatform instance that provides all the metadata about
- * the platform this driver connects to.
- *
- * @return \Doctrine\DBAL\Platforms\AbstractPlatform The database platform.
- */
- public function getDatabasePlatform() {
- return $this->connection->getDatabasePlatform();
- }
-
- /**
- * Drop a table from the database if it exists
- *
- * @param string $table table name without the prefix
- */
- public function dropTable($table) {
- $this->connection->dropTable($table);
- }
-
- /**
- * Check if a table exists
- *
- * @param string $table table name without the prefix
- * @return bool
- */
- public function tableExists($table) {
- return $this->connection->tableExists($table);
- }
-
- /**
- * Espace a parameter to be used in a LIKE query
- *
- * @param string $param
- * @return string
- */
- public function escapeLikeParameter($param) {
- return $this->connection->escapeLikeParameter($param);
- }
-
- /**
- * Check whether or not the current database support 4byte wide unicode
- *
- * @return bool
- * @since 11.0.0
- */
- public function supports4ByteText() {
- return $this->connection->supports4ByteText();
- }
-}
diff --git a/lib/private/AppFramework/DependencyInjection/DIContainer.php b/lib/private/AppFramework/DependencyInjection/DIContainer.php
index 148a15172ac..0879b3e9330 100644
--- a/lib/private/AppFramework/DependencyInjection/DIContainer.php
+++ b/lib/private/AppFramework/DependencyInjection/DIContainer.php
@@ -43,8 +43,10 @@ use OC\AppFramework\Middleware\OCSMiddleware;
use OC\AppFramework\Middleware\Security\SecurityMiddleware;
use OC\AppFramework\Middleware\SessionMiddleware;
use OC\AppFramework\Utility\SimpleContainer;
+use OC\AppFramework\Utility\TimeFactory;
use OC\Core\Middleware\TwoFactorMiddleware;
use OC\RichObjectStrings\Validator;
+use OC\Security\Bruteforce\Throttler;
use OCP\AppFramework\IApi;
use OCP\AppFramework\IAppContainer;
use OCP\Files\IAppData;
@@ -91,6 +93,10 @@ class DIContainer extends SimpleContainer implements IAppContainer {
return new Output($this->getServer()->getWebRoot());
});
+ $this->registerService(\OCP\Authentication\LoginCredentials\IStore::class, function() {
+ return $this->getServer()->query(\OCP\Authentication\LoginCredentials\IStore::class);
+ });
+
$this->registerService('OCP\\IAvatarManager', function($c) {
return $this->getServer()->getAvatarManager();
});
@@ -134,10 +140,6 @@ class DIContainer extends SimpleContainer implements IAppContainer {
return $this->getServer()->getDateTimeFormatter();
});
- $this->registerService('OCP\\IDb', function($c) {
- return $this->getServer()->getDb();
- });
-
$this->registerService('OCP\\IDBConnection', function($c) {
return $this->getServer()->getDatabaseConnection();
});
@@ -380,20 +382,25 @@ class DIContainer extends SimpleContainer implements IAppContainer {
*/
$app = $this;
$this->registerService('SecurityMiddleware', function($c) use ($app){
+ /** @var \OC\Server $server */
+ $server = $app->getServer();
+
return new SecurityMiddleware(
$c['Request'],
$c['ControllerMethodReflector'],
- $app->getServer()->getNavigationManager(),
- $app->getServer()->getURLGenerator(),
- $app->getServer()->getLogger(),
- $app->getServer()->getSession(),
+ $server->getNavigationManager(),
+ $server->getURLGenerator(),
+ $server->getLogger(),
+ $server->getSession(),
$c['AppName'],
$app->isLoggedIn(),
$app->isAdminUser(),
- $app->getServer()->getContentSecurityPolicyManager(),
- $app->getServer()->getCsrfTokenManager(),
- $app->getServer()->getContentSecurityPolicyNonceManager()
+ $server->getContentSecurityPolicyManager(),
+ $server->getCsrfTokenManager(),
+ $server->getContentSecurityPolicyNonceManager(),
+ $server->getBruteForceThrottler()
);
+
});
$this->registerService('CORSMiddleware', function($c) {
diff --git a/lib/private/AppFramework/Middleware/Security/SecurityMiddleware.php b/lib/private/AppFramework/Middleware/Security/SecurityMiddleware.php
index d60d5749d57..edba6a3e759 100644
--- a/lib/private/AppFramework/Middleware/Security/SecurityMiddleware.php
+++ b/lib/private/AppFramework/Middleware/Security/SecurityMiddleware.php
@@ -36,6 +36,7 @@ use OC\AppFramework\Middleware\Security\Exceptions\NotConfirmedException;
use OC\AppFramework\Middleware\Security\Exceptions\NotLoggedInException;
use OC\AppFramework\Middleware\Security\Exceptions\StrictCookieMissingException;
use OC\AppFramework\Utility\ControllerMethodReflector;
+use OC\Security\Bruteforce\Throttler;
use OC\Security\CSP\ContentSecurityPolicyManager;
use OC\Security\CSP\ContentSecurityPolicyNonceManager;
use OC\Security\CSRF\CsrfTokenManager;
@@ -87,6 +88,8 @@ class SecurityMiddleware extends Middleware {
private $csrfTokenManager;
/** @var ContentSecurityPolicyNonceManager */
private $cspNonceManager;
+ /** @var Throttler */
+ private $throttler;
/**
* @param IRequest $request
@@ -101,6 +104,7 @@ class SecurityMiddleware extends Middleware {
* @param ContentSecurityPolicyManager $contentSecurityPolicyManager
* @param CSRFTokenManager $csrfTokenManager
* @param ContentSecurityPolicyNonceManager $cspNonceManager
+ * @param Throttler $throttler
*/
public function __construct(IRequest $request,
ControllerMethodReflector $reflector,
@@ -113,7 +117,8 @@ class SecurityMiddleware extends Middleware {
$isAdminUser,
ContentSecurityPolicyManager $contentSecurityPolicyManager,
CsrfTokenManager $csrfTokenManager,
- ContentSecurityPolicyNonceManager $cspNonceManager) {
+ ContentSecurityPolicyNonceManager $cspNonceManager,
+ Throttler $throttler) {
$this->navigationManager = $navigationManager;
$this->request = $request;
$this->reflector = $reflector;
@@ -126,6 +131,7 @@ class SecurityMiddleware extends Middleware {
$this->contentSecurityPolicyManager = $contentSecurityPolicyManager;
$this->csrfTokenManager = $csrfTokenManager;
$this->cspNonceManager = $cspNonceManager;
+ $this->throttler = $throttler;
}
@@ -185,6 +191,12 @@ class SecurityMiddleware extends Middleware {
}
}
+ if($this->reflector->hasAnnotation('BruteForceProtection')) {
+ $action = $this->reflector->getAnnotationParameter('BruteForceProtection');
+ $this->throttler->sleepDelay($this->request->getRemoteAddress(), $action);
+ $this->throttler->registerAttempt($action, $this->request->getRemoteAddress());
+ }
+
/**
* FIXME: Use DI once available
* Checks if app is enabled (also includes a check whether user is allowed to access the resource)
diff --git a/lib/private/AppFramework/Utility/ControllerMethodReflector.php b/lib/private/AppFramework/Utility/ControllerMethodReflector.php
index 33a117d8121..034fc3a1759 100644
--- a/lib/private/AppFramework/Utility/ControllerMethodReflector.php
+++ b/lib/private/AppFramework/Utility/ControllerMethodReflector.php
@@ -55,8 +55,10 @@ class ControllerMethodReflector implements IControllerMethodReflector{
$docs = $reflection->getDocComment();
// extract everything prefixed by @ and first letter uppercase
- preg_match_all('/@([A-Z]\w+)/', $docs, $matches);
- $this->annotations = $matches[1];
+ preg_match_all('/^\h+\*\h+@(?P<annotation>[A-Z]\w+)(\h+(?P<parameter>\w+))?$/m', $docs, $matches);
+ foreach($matches['annotation'] as $key => $annontation) {
+ $this->annotations[$annontation] = $matches['parameter'][$key];
+ }
// extract type parameter information
preg_match_all('/@param\h+(?P<type>\w+)\h+\$(?P<var>\w+)/', $docs, $matches);
@@ -112,7 +114,22 @@ class ControllerMethodReflector implements IControllerMethodReflector{
* @return bool true if the annotation is found
*/
public function hasAnnotation($name){
- return in_array($name, $this->annotations);
+ return array_key_exists($name, $this->annotations);
+ }
+
+
+ /**
+ * Get optional annotation parameter
+ * @param string $name the name of the annotation
+ * @return string
+ */
+ public function getAnnotationParameter($name){
+ $parameter = '';
+ if($this->hasAnnotation($name)) {
+ $parameter = $this->annotations[$name];
+ }
+
+ return $parameter;
}
diff --git a/lib/private/Archive/TAR.php b/lib/private/Archive/TAR.php
index bbd24bd05a1..07ccd09f399 100644
--- a/lib/private/Archive/TAR.php
+++ b/lib/private/Archive/TAR.php
@@ -33,6 +33,8 @@
namespace OC\Archive;
+use Icewind\Streams\CallbackWrapper;
+
class TAR extends Archive {
const PLAIN = 0;
const GZIP = 1;
@@ -359,22 +361,19 @@ class TAR extends Archive {
if ($mode == 'r' or $mode == 'rb') {
return fopen($tmpFile, $mode);
} else {
- \OC\Files\Stream\Close::registerCallback($tmpFile, array($this, 'writeBack'));
- self::$tempFiles[$tmpFile] = $path;
- return fopen('close://' . $tmpFile, $mode);
+ $handle = fopen($tmpFile, $mode);
+ return CallbackWrapper::wrap($handle, null, null, function () use ($path, $tmpFile) {
+ $this->writeBack($tmpFile, $path);
+ });
}
}
- private static $tempFiles = array();
-
/**
* write back temporary files
*/
- function writeBack($tmpFile) {
- if (isset(self::$tempFiles[$tmpFile])) {
- $this->addFile(self::$tempFiles[$tmpFile], $tmpFile);
- unlink($tmpFile);
- }
+ function writeBack($tmpFile, $path) {
+ $this->addFile($path, $tmpFile);
+ unlink($tmpFile);
}
/**
diff --git a/lib/private/Archive/ZIP.php b/lib/private/Archive/ZIP.php
index 9e9fe40b2b4..0ed0f48acc4 100644
--- a/lib/private/Archive/ZIP.php
+++ b/lib/private/Archive/ZIP.php
@@ -31,6 +31,8 @@
namespace OC\Archive;
+use Icewind\Streams\CallbackWrapper;
+
class ZIP extends Archive{
/**
* @var \ZipArchive zip
@@ -198,24 +200,22 @@ class ZIP extends Archive{
$ext='';
}
$tmpFile=\OCP\Files::tmpFile($ext);
- \OC\Files\Stream\Close::registerCallback($tmpFile, array($this, 'writeBack'));
if($this->fileExists($path)) {
$this->extractFile($path, $tmpFile);
}
- self::$tempFiles[$tmpFile]=$path;
- return fopen('close://'.$tmpFile, $mode);
+ $handle = fopen($tmpFile, $mode);
+ return CallbackWrapper::wrap($handle, null, null, function () use ($path, $tmpFile) {
+ $this->writeBack($tmpFile, $path);
+ });
}
}
- private static $tempFiles=array();
/**
* write back temporary files
*/
- function writeBack($tmpFile) {
- if(isset(self::$tempFiles[$tmpFile])) {
- $this->addFile(self::$tempFiles[$tmpFile], $tmpFile);
- unlink($tmpFile);
- }
+ function writeBack($tmpFile, $path) {
+ $this->addFile($path, $tmpFile);
+ unlink($tmpFile);
}
/**
diff --git a/lib/private/Authentication/LoginCredentials/Credentials.php b/lib/private/Authentication/LoginCredentials/Credentials.php
new file mode 100644
index 00000000000..9314b7489db
--- /dev/null
+++ b/lib/private/Authentication/LoginCredentials/Credentials.php
@@ -0,0 +1,72 @@
+<?php
+
+/**
+ * @copyright 2016 Christoph Wurst <christoph@winzerhof-wurst.at>
+ *
+ * @author 2016 Christoph Wurst <christoph@winzerhof-wurst.at>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program 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 program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OC\Authentication\LoginCredentials;
+
+use OCP\Authentication\LoginCredentials\ICredentials;
+
+class Credentials implements ICredentials {
+
+ /** @var string */
+ private $uid;
+
+ /** @var string */
+ private $loginName;
+
+ /** @var string */
+ private $password;
+
+ /**
+ * @param string $uid
+ * @param string $loginName
+ * @param string $password
+ */
+ public function __construct($uid, $loginName, $password) {
+ $this->uid = $uid;
+ $this->loginName = $loginName;
+ $this->password = $password;
+ }
+
+ /**
+ * @return string
+ */
+ public function getUID() {
+ return $this->uid;
+ }
+
+ /**
+ * @return string
+ */
+ public function getLoginName() {
+ return $this->loginName;
+ }
+
+ /**
+ * @return string
+ */
+ public function getPassword() {
+ return $this->password;
+ }
+
+}
diff --git a/lib/private/Authentication/LoginCredentials/Store.php b/lib/private/Authentication/LoginCredentials/Store.php
new file mode 100644
index 00000000000..e44c88c7aea
--- /dev/null
+++ b/lib/private/Authentication/LoginCredentials/Store.php
@@ -0,0 +1,120 @@
+<?php
+
+/**
+ * @copyright 2016 Christoph Wurst <christoph@winzerhof-wurst.at>
+ *
+ * @author 2016 Christoph Wurst <christoph@winzerhof-wurst.at>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program 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 program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OC\Authentication\LoginCredentials;
+
+use OC\Authentication\Exceptions\InvalidTokenException;
+use OC\Authentication\Exceptions\PasswordlessTokenException;
+use OC\Authentication\Token\IProvider;
+use OCP\Authentication\Exceptions\CredentialsUnavailableException;
+use OCP\Authentication\LoginCredentials\ICredentials;
+use OCP\Authentication\LoginCredentials\IStore;
+use OCP\ILogger;
+use OCP\ISession;
+use OCP\Session\Exceptions\SessionNotAvailableException;
+use OCP\Util;
+
+class Store implements IStore {
+
+ /** @var ISession */
+ private $session;
+
+ /** @var ILogger */
+ private $logger;
+
+ /** @var IProvider|null */
+ private $tokenProvider;
+
+ /**
+ * @param ISession $session
+ * @param ILogger $logger
+ * @param IProvider $tokenProvider
+ */
+ public function __construct(ISession $session, ILogger $logger, IProvider $tokenProvider = null) {
+ $this->session = $session;
+ $this->logger = $logger;
+ $this->tokenProvider = $tokenProvider;
+
+ Util::connectHook('OC_User', 'post_login', $this, 'authenticate');
+ }
+
+ /**
+ * Hook listener on post login
+ *
+ * @param array $params
+ */
+ public function authenticate(array $params) {
+ $this->session->set('login_credentials', json_encode($params));
+ }
+
+ /**
+ * Replace the session implementation
+ *
+ * @param ISession $session
+ */
+ public function setSession(ISession $session) {
+ $this->session = $session;
+ }
+
+ /**
+ * @since 12
+ *
+ * @return ICredentials the login credentials of the current user
+ * @throws CredentialsUnavailableException
+ */
+ public function getLoginCredentials() {
+ if (is_null($this->tokenProvider)) {
+ throw new CredentialsUnavailableException();
+ }
+
+ $trySession = false;
+ try {
+ $sessionId = $this->session->getId();
+ $token = $this->tokenProvider->getToken($sessionId);
+
+ $uid = $token->getUID();
+ $user = $token->getLoginName();
+ $password = $this->tokenProvider->getPassword($token, $sessionId);
+
+ return new Credentials($uid, $user, $password);
+ } catch (SessionNotAvailableException $ex) {
+ $this->logger->debug('could not get login credentials because session is unavailable', ['app' => 'core']);
+ } catch (InvalidTokenException $ex) {
+ $this->logger->debug('could not get login credentials because the token is invalid', ['app' => 'core']);
+ $trySession = true;
+ } catch (PasswordlessTokenException $ex) {
+ $this->logger->debug('could not get login credentials because the token has no password', ['app' => 'core']);
+ $trySession = true;
+ }
+
+ if ($trySession && $this->session->exists('login_credentials')) {
+ $creds = json_decode($this->session->get('login_credentials'));
+ return new Credentials($creds->uid, $creds->uid, $creds->password);
+ }
+
+ // If we reach this line, an exception was thrown.
+ throw new CredentialsUnavailableException();
+ }
+
+}
diff --git a/lib/private/Authentication/TwoFactorAuth/Manager.php b/lib/private/Authentication/TwoFactorAuth/Manager.php
index 48792aa685b..1d0deada696 100644
--- a/lib/private/Authentication/TwoFactorAuth/Manager.php
+++ b/lib/private/Authentication/TwoFactorAuth/Manager.php
@@ -1,4 +1,5 @@
<?php
+
/**
* @copyright Copyright (c) 2016, ownCloud, Inc.
*
@@ -26,9 +27,11 @@ use Exception;
use OC;
use OC\App\AppManager;
use OC_App;
+use OCP\Activity\IManager;
use OCP\AppFramework\QueryException;
use OCP\Authentication\TwoFactorAuth\IProvider;
use OCP\IConfig;
+use OCP\ILogger;
use OCP\ISession;
use OCP\IUser;
@@ -48,15 +51,26 @@ class Manager {
/** @var IConfig */
private $config;
+ /** @var IManager */
+ private $activityManager;
+
+ /** @var ILogger */
+ private $logger;
+
/**
* @param AppManager $appManager
* @param ISession $session
* @param IConfig $config
+ * @param IManager $activityManager
+ * @param ILogger $logger
*/
- public function __construct(AppManager $appManager, ISession $session, IConfig $config) {
+ public function __construct(AppManager $appManager, ISession $session, IConfig $config, IManager $activityManager,
+ ILogger $logger) {
$this->appManager = $appManager;
$this->session = $session;
$this->config = $config;
+ $this->activityManager = $activityManager;
+ $this->logger = $logger;
}
/**
@@ -184,11 +198,40 @@ class Manager {
}
$this->session->remove(self::SESSION_UID_KEY);
$this->session->remove(self::REMEMBER_LOGIN);
+
+ $this->publishEvent($user, 'twofactor_success', [
+ 'provider' => $provider->getDisplayName(),
+ ]);
+ } else {
+ $this->publishEvent($user, 'twofactor_failed', [
+ 'provider' => $provider->getDisplayName(),
+ ]);
}
return $passed;
}
/**
+ * Push a 2fa event the user's activity stream
+ *
+ * @param IUser $user
+ * @param string $event
+ */
+ private function publishEvent(IUser $user, $event, array $params) {
+ $activity = $this->activityManager->generateEvent();
+ $activity->setApp('twofactor_generic')
+ ->setType('twofactor')
+ ->setAuthor($user->getUID())
+ ->setAffectedUser($user->getUID())
+ ->setSubject($event, $params);
+ try {
+ $this->activityManager->publish($activity);
+ } catch (Exception $e) {
+ $this->logger->warning('could not publish backup code creation activity', ['app' => 'twofactor_backupcodes']);
+ $this->logger->logException($e, ['app' => 'twofactor_backupcodes']);
+ }
+ }
+
+ /**
* Check if the currently logged in user needs to pass 2FA
*
* @param IUser $user the currently logged in user
diff --git a/lib/private/Console/TimestampFormatter.php b/lib/private/Console/TimestampFormatter.php
index 5b292439a4c..66dd38e6ac3 100644
--- a/lib/private/Console/TimestampFormatter.php
+++ b/lib/private/Console/TimestampFormatter.php
@@ -97,11 +97,11 @@ class TimestampFormatter implements OutputFormatterInterface {
*/
public function format($message) {
- $timeZone = $this->config->getSystemValue('logtimezone', null);
+ $timeZone = $this->config->getSystemValue('logtimezone', 'UTC');
$timeZone = $timeZone !== null ? new \DateTimeZone($timeZone) : null;
$time = new \DateTime('now', $timeZone);
- $timestampInfo = $time->format($this->config->getSystemValue('logdateformat', 'c'));
+ $timestampInfo = $time->format($this->config->getSystemValue('logdateformat', \DateTime::ATOM));
return $timestampInfo . ' ' . $this->formatter->format($message);
}
diff --git a/lib/private/DB/QueryBuilder/ExpressionBuilder/ExpressionBuilder.php b/lib/private/DB/QueryBuilder/ExpressionBuilder/ExpressionBuilder.php
index f9170e97a02..f172260df79 100644
--- a/lib/private/DB/QueryBuilder/ExpressionBuilder/ExpressionBuilder.php
+++ b/lib/private/DB/QueryBuilder/ExpressionBuilder/ExpressionBuilder.php
@@ -30,6 +30,8 @@ use OC\DB\QueryBuilder\Literal;
use OC\DB\QueryBuilder\QueryFunction;
use OC\DB\QueryBuilder\QuoteHelper;
use OCP\DB\QueryBuilder\IExpressionBuilder;
+use OCP\DB\QueryBuilder\ILiteral;
+use OCP\DB\QueryBuilder\IQueryFunction;
use OCP\IDBConnection;
class ExpressionBuilder implements IExpressionBuilder {
@@ -39,12 +41,16 @@ class ExpressionBuilder implements IExpressionBuilder {
/** @var QuoteHelper */
protected $helper;
+ /** @var IDBConnection */
+ protected $connection;
+
/**
* Initializes a new <tt>ExpressionBuilder</tt>.
*
* @param \OCP\IDBConnection $connection
*/
public function __construct(IDBConnection $connection) {
+ $this->connection = $connection;
$this->helper = new QuoteHelper();
$this->expressionBuilder = new DoctrineExpressionBuilder($connection);
}
@@ -345,12 +351,42 @@ class ExpressionBuilder implements IExpressionBuilder {
}
/**
+ * Binary AND Operator copies a bit to the result if it exists in both operands.
+ *
+ * @param string|ILiteral $x The field or value to check
+ * @param int $y Bitmap that must be set
+ * @return IQueryFunction
+ * @since 12.0.0
+ */
+ public function bitwiseAnd($x, $y) {
+ return new QueryFunction($this->connection->getDatabasePlatform()->getBitAndComparisonExpression(
+ $this->helper->quoteColumnName($x),
+ $y
+ ));
+ }
+
+ /**
+ * Binary OR Operator copies a bit if it exists in either operand.
+ *
+ * @param string|ILiteral $x The field or value to check
+ * @param int $y Bitmap that must be set
+ * @return IQueryFunction
+ * @since 12.0.0
+ */
+ public function bitwiseOr($x, $y) {
+ return new QueryFunction($this->connection->getDatabasePlatform()->getBitOrComparisonExpression(
+ $this->helper->quoteColumnName($x),
+ $y
+ ));
+ }
+
+ /**
* Quotes a given input parameter.
*
* @param mixed $input The parameter to be quoted.
* @param mixed|null $type One of the IQueryBuilder::PARAM_* constants
*
- * @return Literal
+ * @return ILiteral
*/
public function literal($input, $type = null) {
return new Literal($this->expressionBuilder->literal($input, $type));
diff --git a/lib/private/Encryption/Keys/Storage.php b/lib/private/Encryption/Keys/Storage.php
index 8149ffe9dce..e8d152581fe 100644
--- a/lib/private/Encryption/Keys/Storage.php
+++ b/lib/private/Encryption/Keys/Storage.php
@@ -51,6 +51,9 @@ class Storage implements IStorage {
/** @var string */
private $encryption_base_dir;
+ /** @var string */
+ private $backup_base_dir;
+
/** @var array */
private $keyCache = [];
@@ -64,6 +67,7 @@ class Storage implements IStorage {
$this->encryption_base_dir = '/files_encryption';
$this->keys_base_dir = $this->encryption_base_dir .'/keys';
+ $this->backup_base_dir = $this->encryption_base_dir .'/backup';
$this->root_dir = $this->util->getKeyStorageRoot();
}
@@ -287,6 +291,37 @@ class Storage implements IStorage {
}
/**
+ * backup keys of a given encryption module
+ *
+ * @param string $encryptionModuleId
+ * @param string $purpose
+ * @param string $uid
+ * @return bool
+ * @since 12.0.0
+ */
+ public function backupUserKeys($encryptionModuleId, $purpose, $uid) {
+ $source = $uid . $this->encryption_base_dir . '/' . $encryptionModuleId;
+ $backupDir = $uid . $this->backup_base_dir;
+ if (!$this->view->file_exists($backupDir)) {
+ $this->view->mkdir($backupDir);
+ }
+
+ $backupDir = $backupDir . '/' . $purpose . '.' . $encryptionModuleId . '.' . $this->getTimestamp();
+ $this->view->mkdir($backupDir);
+
+ return $this->view->copy($source, $backupDir);
+ }
+
+ /**
+ * get the current timestamp
+ *
+ * @return int
+ */
+ protected function getTimestamp() {
+ return time();
+ }
+
+ /**
* get system wide path and detect mount points
*
* @param string $path
diff --git a/lib/private/Files/Cache/Cache.php b/lib/private/Files/Cache/Cache.php
index 3a3f51488e6..a966d621c58 100644
--- a/lib/private/Files/Cache/Cache.php
+++ b/lib/private/Files/Cache/Cache.php
@@ -142,7 +142,7 @@ class Cache implements ICache {
}
return $data;
} else {
- return self::cacheEntryFromData($data, $this->storageId, $this->mimetypeLoader);
+ return self::cacheEntryFromData($data, $this->mimetypeLoader);
}
}
@@ -150,11 +150,10 @@ class Cache implements ICache {
* Create a CacheEntry from database row
*
* @param array $data
- * @param string $storageId
* @param IMimeTypeLoader $mimetypeLoader
* @return CacheEntry
*/
- public static function cacheEntryFromData($data, $storageId, IMimeTypeLoader $mimetypeLoader) {
+ public static function cacheEntryFromData($data, IMimeTypeLoader $mimetypeLoader) {
//fix types
$data['fileid'] = (int)$data['fileid'];
$data['parent'] = (int)$data['parent'];
@@ -163,7 +162,7 @@ class Cache implements ICache {
$data['storage_mtime'] = (int)$data['storage_mtime'];
$data['encryptedVersion'] = (int)$data['encrypted'];
$data['encrypted'] = (bool)$data['encrypted'];
- $data['storage'] = $storageId;
+ $data['storage_id'] = $data['storage'];
$data['mimetype'] = $mimetypeLoader->getMimetypeById($data['mimetype']);
$data['mimepart'] = $mimetypeLoader->getMimetypeById($data['mimepart']);
if ($data['storage_mtime'] == 0) {
diff --git a/lib/private/Files/Config/UserMountCache.php b/lib/private/Files/Config/UserMountCache.php
index c9a701d24b6..423eb5c423d 100644
--- a/lib/private/Files/Config/UserMountCache.php
+++ b/lib/private/Files/Config/UserMountCache.php
@@ -141,7 +141,11 @@ class UserMountCache implements IUserMountCache {
foreach ($cachedMounts as $cachedMount) {
if (
$newMount->getRootId() === $cachedMount->getRootId() &&
- ($newMount->getMountPoint() !== $cachedMount->getMountPoint() || $newMount->getMountId() !== $cachedMount->getMountId())
+ (
+ $newMount->getMountPoint() !== $cachedMount->getMountPoint() ||
+ $newMount->getStorageId() !== $cachedMount->getStorageId() ||
+ $newMount->getMountId() !== $cachedMount->getMountId()
+ )
) {
$changed[] = $newMount;
}
@@ -169,6 +173,7 @@ class UserMountCache implements IUserMountCache {
$builder = $this->connection->getQueryBuilder();
$query = $builder->update('mounts')
+ ->set('storage_id', $builder->createNamedParameter($mount->getStorageId()))
->set('mount_point', $builder->createNamedParameter($mount->getMountPoint()))
->set('mount_id', $builder->createNamedParameter($mount->getMountId(), IQueryBuilder::PARAM_INT))
->where($builder->expr()->eq('user_id', $builder->createNamedParameter($mount->getUser()->getUID())))
diff --git a/lib/private/Files/Mount/LocalHomeMountProvider.php b/lib/private/Files/Mount/LocalHomeMountProvider.php
index 23bbfcd5ffa..9057f62995f 100644
--- a/lib/private/Files/Mount/LocalHomeMountProvider.php
+++ b/lib/private/Files/Mount/LocalHomeMountProvider.php
@@ -39,9 +39,6 @@ class LocalHomeMountProvider implements IHomeMountProvider {
*/
public function getHomeMountForUser(IUser $user, IStorageFactory $loader) {
$arguments = ['user' => $user];
- if (\OC\Files\Cache\Storage::exists('local::' . $user->getHome() . '/')) {
- $arguments['legacy'] = true;
- }
return new MountPoint('\OC\Files\Storage\Home', '/' . $user->getUID(), $arguments, $loader);
}
}
diff --git a/lib/private/Files/Node/File.php b/lib/private/Files/Node/File.php
index c4430b9181d..4bfa5d583f7 100644
--- a/lib/private/Files/Node/File.php
+++ b/lib/private/Files/Node/File.php
@@ -30,6 +30,16 @@ use OCP\Files\NotPermittedException;
class File extends Node implements \OCP\Files\File {
/**
+ * Creates a Folder that represents a non-existing path
+ *
+ * @param string $path path
+ * @return string non-existing node class
+ */
+ protected function createNonExistingNode($path) {
+ return new NonExistingFile($this->root, $this->view, $path);
+ }
+
+ /**
* @return string
* @throws \OCP\Files\NotPermittedException
*/
@@ -114,52 +124,6 @@ class File extends Node implements \OCP\Files\File {
}
/**
- * @param string $targetPath
- * @throws \OCP\Files\NotPermittedException
- * @return \OC\Files\Node\Node
- */
- public function copy($targetPath) {
- $targetPath = $this->normalizePath($targetPath);
- $parent = $this->root->get(dirname($targetPath));
- if ($parent instanceof Folder and $this->isValidPath($targetPath) and $parent->isCreatable()) {
- $nonExisting = new NonExistingFile($this->root, $this->view, $targetPath);
- $this->root->emit('\OC\Files', 'preCopy', array($this, $nonExisting));
- $this->root->emit('\OC\Files', 'preWrite', array($nonExisting));
- $this->view->copy($this->path, $targetPath);
- $targetNode = $this->root->get($targetPath);
- $this->root->emit('\OC\Files', 'postCopy', array($this, $targetNode));
- $this->root->emit('\OC\Files', 'postWrite', array($targetNode));
- return $targetNode;
- } else {
- throw new NotPermittedException();
- }
- }
-
- /**
- * @param string $targetPath
- * @throws \OCP\Files\NotPermittedException
- * @return \OC\Files\Node\Node
- */
- public function move($targetPath) {
- $targetPath = $this->normalizePath($targetPath);
- $parent = $this->root->get(dirname($targetPath));
- if ($parent instanceof Folder and $this->isValidPath($targetPath) and $parent->isCreatable()) {
- $nonExisting = new NonExistingFile($this->root, $this->view, $targetPath);
- $this->root->emit('\OC\Files', 'preRename', array($this, $nonExisting));
- $this->root->emit('\OC\Files', 'preWrite', array($nonExisting));
- $this->view->rename($this->path, $targetPath);
- $targetNode = $this->root->get($targetPath);
- $this->root->emit('\OC\Files', 'postRename', array($this, $targetNode));
- $this->root->emit('\OC\Files', 'postWrite', array($targetNode));
- $this->path = $targetPath;
- $this->fileInfo = null;
- return $targetNode;
- } else {
- throw new NotPermittedException();
- }
- }
-
- /**
* @param string $type
* @param bool $raw
* @return string
diff --git a/lib/private/Files/Node/Folder.php b/lib/private/Files/Node/Folder.php
index 288a02ef207..fd907f708f3 100644
--- a/lib/private/Files/Node/Folder.php
+++ b/lib/private/Files/Node/Folder.php
@@ -36,6 +36,16 @@ use OCP\Files\NotPermittedException;
class Folder extends Node implements \OCP\Files\Folder {
/**
+ * Creates a Folder that represents a non-existing path
+ *
+ * @param string $path path
+ * @return string non-existing node class
+ */
+ protected function createNonExistingNode($path) {
+ return new NonExistingFolder($this->root, $this->view, $path);
+ }
+
+ /**
* @param string $path path relative to the folder
* @return string
* @throws \OCP\Files\NotPermittedException
@@ -326,51 +336,6 @@ class Folder extends Node implements \OCP\Files\Folder {
}
/**
- * @param string $targetPath
- * @throws \OCP\Files\NotPermittedException
- * @return \OC\Files\Node\Node
- */
- public function copy($targetPath) {
- $targetPath = $this->normalizePath($targetPath);
- $parent = $this->root->get(dirname($targetPath));
- if ($parent instanceof Folder and $this->isValidPath($targetPath) and $parent->isCreatable()) {
- $nonExisting = new NonExistingFolder($this->root, $this->view, $targetPath);
- $this->root->emit('\OC\Files', 'preCopy', array($this, $nonExisting));
- $this->root->emit('\OC\Files', 'preWrite', array($nonExisting));
- $this->view->copy($this->path, $targetPath);
- $targetNode = $this->root->get($targetPath);
- $this->root->emit('\OC\Files', 'postCopy', array($this, $targetNode));
- $this->root->emit('\OC\Files', 'postWrite', array($targetNode));
- return $targetNode;
- } else {
- throw new NotPermittedException('No permission to copy to path');
- }
- }
-
- /**
- * @param string $targetPath
- * @throws \OCP\Files\NotPermittedException
- * @return \OC\Files\Node\Node
- */
- public function move($targetPath) {
- $targetPath = $this->normalizePath($targetPath);
- $parent = $this->root->get(dirname($targetPath));
- if ($parent instanceof Folder and $this->isValidPath($targetPath) and $parent->isCreatable()) {
- $nonExisting = new NonExistingFolder($this->root, $this->view, $targetPath);
- $this->root->emit('\OC\Files', 'preRename', array($this, $nonExisting));
- $this->root->emit('\OC\Files', 'preWrite', array($nonExisting));
- $this->view->rename($this->path, $targetPath);
- $targetNode = $this->root->get($targetPath);
- $this->root->emit('\OC\Files', 'postRename', array($this, $targetNode));
- $this->root->emit('\OC\Files', 'postWrite', array($targetNode));
- $this->path = $targetPath;
- return $targetNode;
- } else {
- throw new NotPermittedException('No permission to move to path');
- }
- }
-
- /**
* Add a suffix to the name in case the file exists
*
* @param string $name
diff --git a/lib/private/Files/Node/Node.php b/lib/private/Files/Node/Node.php
index 226c182622f..e00debe6903 100644
--- a/lib/private/Files/Node/Node.php
+++ b/lib/private/Files/Node/Node.php
@@ -33,6 +33,7 @@ use OCP\Files\InvalidPathException;
use OCP\Files\NotFoundException;
use OCP\Files\NotPermittedException;
+// FIXME: this class really should be abstract
class Node implements \OCP\Files\Node {
/**
* @var \OC\Files\View $view
@@ -56,7 +57,7 @@ class Node implements \OCP\Files\Node {
/**
* @param \OC\Files\View $view
- * @param \OC\Files\Node\Root $root
+ * @param \OCP\Files\IRootFolder $root
* @param string $path
* @param FileInfo $fileInfo
*/
@@ -68,6 +69,16 @@ class Node implements \OCP\Files\Node {
}
/**
+ * Creates a Node of the same type that represents a non-existing path
+ *
+ * @param string $path path
+ * @return string non-existing node class
+ */
+ protected function createNonExistingNode($path) {
+ throw new \Exception('Must be implemented by subclasses');
+ }
+
+ /**
* Returns the matching file info
*
* @return FileInfo
@@ -106,28 +117,11 @@ class Node implements \OCP\Files\Node {
return ($this->getPermissions() & $permissions) === $permissions;
}
- /**
- * @param string $targetPath
- * @throws \OCP\Files\NotPermittedException
- * @return \OC\Files\Node\Node
- */
- public function move($targetPath) {
- return;
- }
-
public function delete() {
return;
}
/**
- * @param string $targetPath
- * @return \OC\Files\Node\Node
- */
- public function copy($targetPath) {
- return;
- }
-
- /**
* @param int $mtime
* @throws \OCP\Files\NotPermittedException
*/
@@ -381,4 +375,54 @@ class Node implements \OCP\Files\Node {
public function unlock($type) {
$this->view->unlockFile($this->path, $type);
}
+
+ /**
+ * @param string $targetPath
+ * @throws \OCP\Files\NotPermittedException if copy not allowed or failed
+ * @return \OC\Files\Node\Node
+ */
+ public function copy($targetPath) {
+ $targetPath = $this->normalizePath($targetPath);
+ $parent = $this->root->get(dirname($targetPath));
+ if ($parent instanceof Folder and $this->isValidPath($targetPath) and $parent->isCreatable()) {
+ $nonExisting = $this->createNonExistingNode($targetPath);
+ $this->root->emit('\OC\Files', 'preCopy', [$this, $nonExisting]);
+ $this->root->emit('\OC\Files', 'preWrite', [$nonExisting]);
+ if (!$this->view->copy($this->path, $targetPath)) {
+ throw new NotPermittedException('Could not copy ' . $this->path . ' to ' . $targetPath);
+ }
+ $targetNode = $this->root->get($targetPath);
+ $this->root->emit('\OC\Files', 'postCopy', [$this, $targetNode]);
+ $this->root->emit('\OC\Files', 'postWrite', [$targetNode]);
+ return $targetNode;
+ } else {
+ throw new NotPermittedException('No permission to copy to path ' . $targetPath);
+ }
+ }
+
+ /**
+ * @param string $targetPath
+ * @throws \OCP\Files\NotPermittedException if move not allowed or failed
+ * @return \OC\Files\Node\Node
+ */
+ public function move($targetPath) {
+ $targetPath = $this->normalizePath($targetPath);
+ $parent = $this->root->get(dirname($targetPath));
+ if ($parent instanceof Folder and $this->isValidPath($targetPath) and $parent->isCreatable()) {
+ $nonExisting = $this->createNonExistingNode($targetPath);
+ $this->root->emit('\OC\Files', 'preRename', [$this, $nonExisting]);
+ $this->root->emit('\OC\Files', 'preWrite', [$nonExisting]);
+ if (!$this->view->rename($this->path, $targetPath)) {
+ throw new NotPermittedException('Could not move ' . $this->path . ' to ' . $targetPath);
+ }
+ $targetNode = $this->root->get($targetPath);
+ $this->root->emit('\OC\Files', 'postRename', [$this, $targetNode]);
+ $this->root->emit('\OC\Files', 'postWrite', [$targetNode]);
+ $this->path = $targetPath;
+ return $targetNode;
+ } else {
+ throw new NotPermittedException('No permission to move to path ' . $targetPath);
+ }
+ }
+
}
diff --git a/lib/private/Files/Notify/Change.php b/lib/private/Files/Notify/Change.php
new file mode 100644
index 00000000000..78cc007b27d
--- /dev/null
+++ b/lib/private/Files/Notify/Change.php
@@ -0,0 +1,65 @@
+<?php
+/**
+ * @copyright Copyright (c) 2017 Robin Appelman <robin@icewind.nl>
+ *
+ * @author Robin Appelman <robin@icewind.nl>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program 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 program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OC\Files\Notify;
+
+use OCP\Files\Notify\IChange;
+
+class Change implements IChange {
+ /** @var int */
+ private $type;
+
+ /** @var string */
+ private $path;
+
+ /**
+ * Change constructor.
+ *
+ * @param int $type
+ * @param string $path
+ */
+ public function __construct($type, $path) {
+ $this->type = $type;
+ $this->path = $path;
+ }
+
+ /**
+ * Get the type of the change
+ *
+ * @return int IChange::ADDED, IChange::REMOVED, IChange::MODIFIED or IChange::RENAMED
+ */
+ public function getType() {
+ return $this->type;
+ }
+
+ /**
+ * Get the path of the file that was changed relative to the root of the storage
+ *
+ * Note, for rename changes this path is the old path for the file
+ *
+ * @return mixed
+ */
+ public function getPath() {
+ return $this->path;
+ }
+}
diff --git a/lib/private/Files/Notify/RenameChange.php b/lib/private/Files/Notify/RenameChange.php
new file mode 100644
index 00000000000..b83dffa0cb2
--- /dev/null
+++ b/lib/private/Files/Notify/RenameChange.php
@@ -0,0 +1,52 @@
+<?php
+/**
+ * @copyright Copyright (c) 2017 Robin Appelman <robin@icewind.nl>
+ *
+ * @author Robin Appelman <robin@icewind.nl>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program 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 program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OC\Files\Notify;
+
+use OCP\Files\Notify\IRenameChange;
+
+class RenameChange extends Change implements IRenameChange {
+ /** @var string */
+ private $targetPath;
+
+ /**
+ * Change constructor.
+ *
+ * @param int $type
+ * @param string $path
+ * @param string $targetPath
+ */
+ public function __construct($type, $path, $targetPath) {
+ parent::__construct($type, $path);
+ $this->targetPath = $targetPath;
+ }
+
+ /**
+ * Get the new path of the renamed file relative to the storage root
+ *
+ * @return string
+ */
+ public function getTargetPath() {
+ return $this->targetPath;
+ }
+}
diff --git a/lib/private/Files/ObjectStore/ObjectStoreStorage.php b/lib/private/Files/ObjectStore/ObjectStoreStorage.php
index 2dcf830cc1e..ab77c21e6c4 100644
--- a/lib/private/Files/ObjectStore/ObjectStoreStorage.php
+++ b/lib/private/Files/ObjectStore/ObjectStoreStorage.php
@@ -25,16 +25,12 @@
namespace OC\Files\ObjectStore;
+use Icewind\Streams\CallbackWrapper;
use Icewind\Streams\IteratorDirectory;
use OC\Files\Cache\CacheEntry;
use OCP\Files\ObjectStore\IObjectStore;
class ObjectStoreStorage extends \OC\Files\Storage\Common {
-
- /**
- * @var array
- */
- private static $tmpFiles = array();
/**
* @var \OCP\Files\ObjectStore\IObjectStore $objectStore
*/
@@ -291,14 +287,14 @@ class ObjectStoreStorage extends \OC\Files\Storage\Common {
$ext = '';
}
$tmpFile = \OC::$server->getTempManager()->getTemporaryFile($ext);
- \OC\Files\Stream\Close::registerCallback($tmpFile, array($this, 'writeBack'));
if ($this->file_exists($path)) {
$source = $this->fopen($path, 'r');
file_put_contents($tmpFile, $source);
}
- self::$tmpFiles[$tmpFile] = $path;
-
- return fopen('close://' . $tmpFile, $mode);
+ $handle = fopen($tmpFile, $mode);
+ return CallbackWrapper::wrap($handle, null, null, function () use ($path, $tmpFile) {
+ $this->writeBack($tmpFile, $path);
+ });
}
return false;
}
@@ -368,12 +364,7 @@ class ObjectStoreStorage extends \OC\Files\Storage\Common {
return true;
}
- public function writeBack($tmpFile) {
- if (!isset(self::$tmpFiles[$tmpFile])) {
- return;
- }
-
- $path = self::$tmpFiles[$tmpFile];
+ public function writeBack($tmpFile, $path) {
$stat = $this->stat($path);
if (empty($stat)) {
// create new file
diff --git a/lib/private/Files/Storage/Common.php b/lib/private/Files/Storage/Common.php
index 5561f6a889b..f3e3cb9e58c 100644
--- a/lib/private/Files/Storage/Common.php
+++ b/lib/private/Files/Storage/Common.php
@@ -436,10 +436,14 @@ abstract class Common implements Storage, ILockingStorage {
* @return bool
*/
public function test() {
- if ($this->stat('')) {
- return true;
+ try {
+ if ($this->stat('')) {
+ return true;
+ }
+ return false;
+ } catch (\Exception $e) {
+ return false;
}
- return false;
}
/**
diff --git a/lib/private/Files/Storage/DAV.php b/lib/private/Files/Storage/DAV.php
index ea4bbba2748..3b89a66d6a2 100644
--- a/lib/private/Files/Storage/DAV.php
+++ b/lib/private/Files/Storage/DAV.php
@@ -36,6 +36,7 @@ namespace OC\Files\Storage;
use Exception;
use GuzzleHttp\Exception\RequestException;
use GuzzleHttp\Message\ResponseInterface;
+use Icewind\Streams\CallbackWrapper;
use OC\Files\Filesystem;
use OC\Files\Stream\Close;
use Icewind\Streams\IteratorDirectory;
@@ -48,7 +49,6 @@ use OCP\Files\StorageInvalidException;
use OCP\Files\StorageNotAvailableException;
use OCP\Util;
use Sabre\DAV\Client;
-use Sabre\DAV\Exception\NotFound;
use Sabre\DAV\Xml\Property\ResourceType;
use Sabre\HTTP\ClientException;
use Sabre\HTTP\ClientHttpException;
@@ -77,8 +77,6 @@ class DAV extends Common {
private $client;
/** @var ArrayCache */
private $statCache;
- /** @var array */
- private static $tempFiles = [];
/** @var \OCP\Http\Client\IClientService */
private $httpClientService;
@@ -203,13 +201,15 @@ class DAV extends Common {
$this->init();
$path = $this->cleanPath($path);
try {
- $response = $this->client->propfind(
+ $response = $this->client->propFind(
$this->encodePath($path),
- array(),
+ [],
1
);
- $id = md5('webdav' . $this->root . $path);
- $content = array();
+ if ($response === false) {
+ return false;
+ }
+ $content = [];
$files = array_keys($response);
array_shift($files); //the first entry is the current directory
@@ -226,13 +226,6 @@ class DAV extends Common {
$content[] = $file;
}
return IteratorDirectory::wrap($content);
- } catch (ClientHttpException $e) {
- if ($e->getHttpStatus() === 404) {
- $this->statCache->clear($path . '/');
- $this->statCache->set($path, false);
- return false;
- }
- $this->convertException($e, $path);
} catch (\Exception $e) {
$this->convertException($e, $path);
}
@@ -247,22 +240,18 @@ class DAV extends Common {
*
* @param string $path path to propfind
*
- * @return array propfind response
+ * @return array|boolean propfind response or false if the entry was not found
*
- * @throws NotFound
+ * @throws ClientHttpException
*/
protected function propfind($path) {
$path = $this->cleanPath($path);
$cachedResponse = $this->statCache->get($path);
- if ($cachedResponse === false) {
- // we know it didn't exist
- throw new NotFound();
- }
// we either don't know it, or we know it exists but need more details
if (is_null($cachedResponse) || $cachedResponse === true) {
$this->init();
try {
- $response = $this->client->propfind(
+ $response = $this->client->propFind(
$this->encodePath($path),
array(
'{DAV:}getlastmodified',
@@ -275,11 +264,15 @@ class DAV extends Common {
)
);
$this->statCache->set($path, $response);
- } catch (NotFound $e) {
- // remember that this path did not exist
- $this->statCache->clear($path . '/');
- $this->statCache->set($path, false);
- throw $e;
+ } catch (ClientHttpException $e) {
+ if ($e->getHttpStatus() === 404) {
+ $this->statCache->clear($path . '/');
+ $this->statCache->set($path, false);
+ return false;
+ }
+ $this->convertException($e, $path);
+ } catch (\Exception $e) {
+ $this->convertException($e, $path);
}
} else {
$response = $cachedResponse;
@@ -291,17 +284,15 @@ class DAV extends Common {
public function filetype($path) {
try {
$response = $this->propfind($path);
- $responseType = array();
+ if ($response === false) {
+ return false;
+ }
+ $responseType = [];
if (isset($response["{DAV:}resourcetype"])) {
/** @var ResourceType[] $response */
$responseType = $response["{DAV:}resourcetype"]->getValue();
}
return (count($responseType) > 0 and $responseType[0] == "{DAV:}collection") ? 'dir' : 'file';
- } catch (ClientHttpException $e) {
- if ($e->getHttpStatus() === 404) {
- return false;
- }
- $this->convertException($e, $path);
} catch (\Exception $e) {
$this->convertException($e, $path);
}
@@ -320,13 +311,7 @@ class DAV extends Common {
return true;
}
// need to get from server
- $this->propfind($path);
- return true; //no 404 exception
- } catch (ClientHttpException $e) {
- if ($e->getHttpStatus() === 404) {
- return false;
- }
- $this->convertException($e, $path);
+ return ($this->propfind($path) !== false);
} catch (\Exception $e) {
$this->convertException($e, $path);
}
@@ -409,20 +394,19 @@ class DAV extends Common {
}
$tmpFile = $tempManager->getTemporaryFile($ext);
}
- Close::registerCallback($tmpFile, array($this, 'writeBack'));
- self::$tempFiles[$tmpFile] = $path;
- return fopen('close://' . $tmpFile, $mode);
+ $handle = fopen($tmpFile, $mode);
+ return CallbackWrapper::wrap($handle, null, null, function () use ($path, $tmpFile) {
+ $this->writeBack($tmpFile, $path);
+ });
}
}
/**
* @param string $tmpFile
*/
- public function writeBack($tmpFile) {
- if (isset(self::$tempFiles[$tmpFile])) {
- $this->uploadFile($tmpFile, self::$tempFiles[$tmpFile]);
- unlink($tmpFile);
- }
+ public function writeBack($tmpFile, $path) {
+ $this->uploadFile($tmpFile, $path);
+ unlink($tmpFile);
}
/** {@inheritdoc} */
@@ -431,7 +415,10 @@ class DAV extends Common {
$path = $this->cleanPath($path);
try {
// TODO: cacheable ?
- $response = $this->client->propfind($this->encodePath($path), array('{DAV:}quota-available-bytes'));
+ $response = $this->client->propfind($this->encodePath($path), ['{DAV:}quota-available-bytes']);
+ if ($response === false) {
+ return FileInfo::SPACE_UNKNOWN;
+ }
if (isset($response['{DAV:}quota-available-bytes'])) {
return (int)$response['{DAV:}quota-available-bytes'];
} else {
@@ -457,6 +444,9 @@ class DAV extends Common {
$this->client->proppatch($this->encodePath($path), ['{DAV:}lastmodified' => $mtime]);
// non-owncloud clients might not have accepted the property, need to recheck it
$response = $this->client->propfind($this->encodePath($path), ['{DAV:}getlastmodified'], 0);
+ if ($response === false) {
+ return false;
+ }
if (isset($response['{DAV:}getlastmodified'])) {
$remoteMtime = strtotime($response['{DAV:}getlastmodified']);
if ($remoteMtime !== $mtime) {
@@ -579,15 +569,13 @@ class DAV extends Common {
public function stat($path) {
try {
$response = $this->propfind($path);
- return array(
+ if (!$response) {
+ return false;
+ }
+ return [
'mtime' => strtotime($response['{DAV:}getlastmodified']),
'size' => (int)isset($response['{DAV:}getcontentlength']) ? $response['{DAV:}getcontentlength'] : 0,
- );
- } catch (ClientHttpException $e) {
- if ($e->getHttpStatus() === 404) {
- return array();
- }
- $this->convertException($e, $path);
+ ];
} catch (\Exception $e) {
$this->convertException($e, $path);
}
@@ -598,7 +586,10 @@ class DAV extends Common {
public function getMimeType($path) {
try {
$response = $this->propfind($path);
- $responseType = array();
+ if ($response === false) {
+ return false;
+ }
+ $responseType = [];
if (isset($response["{DAV:}resourcetype"])) {
/** @var ResourceType[] $response */
$responseType = $response["{DAV:}resourcetype"]->getValue();
@@ -611,11 +602,6 @@ class DAV extends Common {
} else {
return false;
}
- } catch (ClientHttpException $e) {
- if ($e->getHttpStatus() === 404) {
- return false;
- }
- $this->convertException($e, $path);
} catch (\Exception $e) {
$this->convertException($e, $path);
}
@@ -706,6 +692,9 @@ class DAV extends Common {
$this->init();
$path = $this->cleanPath($path);
$response = $this->propfind($path);
+ if ($response === false) {
+ return 0;
+ }
if (isset($response['{http://owncloud.org/ns}permissions'])) {
return $this->parsePermissions($response['{http://owncloud.org/ns}permissions']);
} else if ($this->is_dir($path)) {
@@ -722,6 +711,9 @@ class DAV extends Common {
$this->init();
$path = $this->cleanPath($path);
$response = $this->propfind($path);
+ if ($response === false) {
+ return null;
+ }
if (isset($response['{DAV:}getetag'])) {
return trim($response['{DAV:}getetag'], '"');
}
@@ -765,6 +757,13 @@ class DAV extends Common {
// force refresh for $path
$this->statCache->remove($path);
$response = $this->propfind($path);
+ if ($response === false) {
+ if ($path === '') {
+ // if root is gone it means the storage is not available
+ throw new StorageNotAvailableException(get_class($e) . ': ' . $e->getMessage());
+ }
+ return false;
+ }
if (isset($response['{DAV:}getetag'])) {
$cachedData = $this->getCache()->get($path);
$etag = null;
@@ -787,7 +786,7 @@ class DAV extends Common {
return $remoteMtime > $time;
}
} catch (ClientHttpException $e) {
- if ($e->getHttpStatus() === 404 || $e->getHttpStatus() === 405) {
+ if ($e->getHttpStatus() === 405) {
if ($path === '') {
// if root is gone it means the storage is not available
throw new StorageNotAvailableException(get_class($e) . ': ' . $e->getMessage());
diff --git a/lib/private/Files/Storage/Home.php b/lib/private/Files/Storage/Home.php
index e5ba0f9dfe4..57b32349324 100644
--- a/lib/private/Files/Storage/Home.php
+++ b/lib/private/Files/Storage/Home.php
@@ -44,19 +44,12 @@ class Home extends Local implements \OCP\Files\IHomeStorage {
/**
* Construct a Home storage instance
* @param array $arguments array with "user" containing the
- * storage owner and "legacy" containing "true" if the storage is
- * a legacy storage with "local::" URL instead of the new "home::" one.
+ * storage owner
*/
public function __construct($arguments) {
$this->user = $arguments['user'];
$datadir = $this->user->getHome();
- if (isset($arguments['legacy']) && $arguments['legacy']) {
- // legacy home id (<= 5.0.12)
- $this->id = 'local::' . $datadir . '/';
- }
- else {
- $this->id = 'home::' . $this->user->getUID();
- }
+ $this->id = 'home::' . $this->user->getUID();
parent::__construct(array('datadir' => $datadir));
}
diff --git a/lib/private/Files/Storage/Local.php b/lib/private/Files/Storage/Local.php
index 4fe7dcafbbf..80d48680be1 100644
--- a/lib/private/Files/Storage/Local.php
+++ b/lib/private/Files/Storage/Local.php
@@ -205,18 +205,7 @@ class Local extends \OC\Files\Storage\Common {
}
public function file_get_contents($path) {
- // file_get_contents() has a memory leak: https://bugs.php.net/bug.php?id=61961
- $fileName = $this->getSourcePath($path);
-
- $fileSize = filesize($fileName);
- if ($fileSize === 0) {
- return '';
- }
-
- $handle = fopen($fileName, 'rb');
- $content = fread($handle, $fileSize);
- fclose($handle);
- return $content;
+ return file_get_contents($this->getSourcePath($path));
}
public function file_put_contents($path, $data) {
diff --git a/lib/private/Files/Stream/Close.php b/lib/private/Files/Stream/Close.php
deleted file mode 100644
index 7cc9903c912..00000000000
--- a/lib/private/Files/Stream/Close.php
+++ /dev/null
@@ -1,119 +0,0 @@
-<?php
-/**
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- *
- * @author Jörn Friedrich Dreyer <jfd@butonic.de>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Robin Appelman <robin@icewind.nl>
- *
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program 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, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
- */
-
-namespace OC\Files\Stream;
-
-/**
- * stream wrapper that provides a callback on stream close
- */
-class Close {
- private static $callBacks = array();
- private $path = '';
- private $source;
- private static $open = array();
-
- public function stream_open($path, $mode, $options, &$opened_path) {
- $path = substr($path, strlen('close://'));
- $this->path = $path;
- $this->source = fopen($path, $mode);
- if (is_resource($this->source)) {
- $this->meta = stream_get_meta_data($this->source);
- }
- self::$open[] = $path;
- return is_resource($this->source);
- }
-
- public function stream_seek($offset, $whence = SEEK_SET) {
- return fseek($this->source, $offset, $whence) === 0;
- }
-
- public function stream_tell() {
- return ftell($this->source);
- }
-
- public function stream_read($count) {
- return fread($this->source, $count);
- }
-
- public function stream_write($data) {
- return fwrite($this->source, $data);
- }
-
- public function stream_set_option($option, $arg1, $arg2) {
- switch ($option) {
- case STREAM_OPTION_BLOCKING:
- stream_set_blocking($this->source, $arg1);
- break;
- case STREAM_OPTION_READ_TIMEOUT:
- stream_set_timeout($this->source, $arg1, $arg2);
- break;
- case STREAM_OPTION_WRITE_BUFFER:
- stream_set_write_buffer($this->source, $arg1, $arg2);
- }
- }
-
- public function stream_stat() {
- return fstat($this->source);
- }
-
- public function stream_lock($mode) {
- flock($this->source, $mode);
- }
-
- public function stream_flush() {
- return fflush($this->source);
- }
-
- public function stream_eof() {
- return feof($this->source);
- }
-
- public function url_stat($path) {
- $path = substr($path, strlen('close://'));
- if (file_exists($path)) {
- return stat($path);
- } else {
- return false;
- }
- }
-
- public function stream_close() {
- fclose($this->source);
- if (isset(self::$callBacks[$this->path])) {
- call_user_func(self::$callBacks[$this->path], $this->path);
- }
- }
-
- public function unlink($path) {
- $path = substr($path, strlen('close://'));
- return unlink($path);
- }
-
- /**
- * @param string $path
- */
- public static function registerCallback($path, $callback) {
- self::$callBacks[$path] = $callback;
- }
-}
diff --git a/lib/private/Files/Stream/Dir.php b/lib/private/Files/Stream/Dir.php
deleted file mode 100644
index f8f6b1fa89a..00000000000
--- a/lib/private/Files/Stream/Dir.php
+++ /dev/null
@@ -1,67 +0,0 @@
-<?php
-/**
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- *
- * @author Jörn Friedrich Dreyer <jfd@butonic.de>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Robin Appelman <robin@icewind.nl>
- *
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program 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, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
- */
-
-namespace OC\Files\Stream;
-
-class Dir {
- private static $dirs = array();
- private $name;
- private $index;
-
- public function dir_opendir($path, $options) {
- $this->name = substr($path, strlen('fakedir://'));
- $this->index = 0;
- if (!isset(self::$dirs[$this->name])) {
- self::$dirs[$this->name] = array();
- }
- return true;
- }
-
- public function dir_readdir() {
- if ($this->index >= count(self::$dirs[$this->name])) {
- return false;
- }
- $filename = self::$dirs[$this->name][$this->index];
- $this->index++;
- return $filename;
- }
-
- public function dir_closedir() {
- $this->name = '';
- return true;
- }
-
- public function dir_rewinddir() {
- $this->index = 0;
- return true;
- }
-
- /**
- * @param string $path
- * @param string[] $content
- */
- public static function register($path, $content) {
- self::$dirs[$path] = $content;
- }
-}
diff --git a/lib/private/Files/Stream/Quota.php b/lib/private/Files/Stream/Quota.php
index f064ca6c011..624a2021b9c 100644
--- a/lib/private/Files/Stream/Quota.php
+++ b/lib/private/Files/Stream/Quota.php
@@ -25,61 +25,44 @@
namespace OC\Files\Stream;
+use Icewind\Streams\Wrapper;
+
/**
* stream wrapper limits the amount of data that can be written to a stream
*
- * usage: void \OC\Files\Stream\Quota::register($id, $stream, $limit)
- * or: resource \OC\Files\Stream\Quota::wrap($stream, $limit)
+ * usage: resource \OC\Files\Stream\Quota::wrap($stream, $limit)
*/
-class Quota {
- private static $streams = array();
-
- /**
- * @var resource $source
- */
- private $source;
-
+class Quota extends Wrapper {
/**
* @var int $limit
*/
private $limit;
/**
- * @param string $id
- * @param resource $stream
- * @param int $limit
- */
- public static function register($id, $stream, $limit) {
- self::$streams[$id] = array($stream, $limit);
- }
-
- /**
- * remove all registered streams
- */
- public static function clear() {
- self::$streams = array();
- }
-
- /**
* @param resource $stream
* @param int $limit
* @return resource
*/
static public function wrap($stream, $limit) {
- $id = uniqid();
- self::register($id, $stream, $limit);
- $meta = stream_get_meta_data($stream);
- return fopen('quota://' . $id, $meta['mode']);
+ $context = stream_context_create(array(
+ 'quota' => array(
+ 'source' => $stream,
+ 'limit' => $limit
+ )
+ ));
+ return Wrapper::wrapSource($stream, $context, 'quota', self::class);
}
public function stream_open($path, $mode, $options, &$opened_path) {
- $id = substr($path, strlen('quota://'));
- if (isset(self::$streams[$id])) {
- list($this->source, $this->limit) = self::$streams[$id];
- return true;
- } else {
- return false;
- }
+ $context = $this->loadContext('quota');
+ $this->source = $context['source'];
+ $this->limit = $context['limit'];
+
+ return true;
+ }
+
+ public function dir_opendir($path, $options) {
+ return false;
}
public function stream_seek($offset, $whence = SEEK_SET) {
@@ -103,10 +86,6 @@ class Quota {
return fseek($this->source, $offset, $whence) === 0;
}
- public function stream_tell() {
- return ftell($this->source);
- }
-
public function stream_read($count) {
$this->limit -= $count;
return fread($this->source, $count);
@@ -121,37 +100,4 @@ class Quota {
$this->limit -= $size;
return fwrite($this->source, $data);
}
-
- public function stream_set_option($option, $arg1, $arg2) {
- switch ($option) {
- case STREAM_OPTION_BLOCKING:
- stream_set_blocking($this->source, $arg1);
- break;
- case STREAM_OPTION_READ_TIMEOUT:
- stream_set_timeout($this->source, $arg1, $arg2);
- break;
- case STREAM_OPTION_WRITE_BUFFER:
- stream_set_write_buffer($this->source, $arg1, $arg2);
- }
- }
-
- public function stream_stat() {
- return fstat($this->source);
- }
-
- public function stream_lock($mode) {
- return flock($this->source, $mode);
- }
-
- public function stream_flush() {
- return fflush($this->source);
- }
-
- public function stream_eof() {
- return feof($this->source);
- }
-
- public function stream_close() {
- fclose($this->source);
- }
}
diff --git a/lib/private/Files/Stream/StaticStream.php b/lib/private/Files/Stream/StaticStream.php
deleted file mode 100644
index 3c91b23fd36..00000000000
--- a/lib/private/Files/Stream/StaticStream.php
+++ /dev/null
@@ -1,171 +0,0 @@
-<?php
-/**
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- *
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Robin Appelman <robin@icewind.nl>
- *
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program 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, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
- */
-
-namespace OC\Files\Stream;
-
-class StaticStream {
- const MODE_FILE = 0100000;
-
- public $context;
- protected static $data = array();
-
- protected $path = '';
- protected $pointer = 0;
- protected $writable = false;
-
- public function stream_close() {
- }
-
- public function stream_eof() {
- return $this->pointer >= strlen(self::$data[$this->path]);
- }
-
- public function stream_flush() {
- }
-
- public static function clear() {
- self::$data = array();
- }
-
- public function stream_open($path, $mode, $options, &$opened_path) {
- switch ($mode[0]) {
- case 'r':
- if (!isset(self::$data[$path])) return false;
- $this->path = $path;
- $this->writable = isset($mode[1]) && $mode[1] == '+';
- break;
- case 'w':
- self::$data[$path] = '';
- $this->path = $path;
- $this->writable = true;
- break;
- case 'a':
- if (!isset(self::$data[$path])) self::$data[$path] = '';
- $this->path = $path;
- $this->writable = true;
- $this->pointer = strlen(self::$data[$path]);
- break;
- case 'x':
- if (isset(self::$data[$path])) return false;
- $this->path = $path;
- $this->writable = true;
- break;
- case 'c':
- if (!isset(self::$data[$path])) self::$data[$path] = '';
- $this->path = $path;
- $this->writable = true;
- break;
- default:
- return false;
- }
- $opened_path = $this->path;
- return true;
- }
-
- public function stream_read($count) {
- $bytes = min(strlen(self::$data[$this->path]) - $this->pointer, $count);
- $data = substr(self::$data[$this->path], $this->pointer, $bytes);
- $this->pointer += $bytes;
- return $data;
- }
-
- public function stream_seek($offset, $whence = SEEK_SET) {
- $len = strlen(self::$data[$this->path]);
- switch ($whence) {
- case SEEK_SET:
- if ($offset <= $len) {
- $this->pointer = $offset;
- return true;
- }
- break;
- case SEEK_CUR:
- if ($this->pointer + $offset <= $len) {
- $this->pointer += $offset;
- return true;
- }
- break;
- case SEEK_END:
- if ($len + $offset <= $len) {
- $this->pointer = $len + $offset;
- return true;
- }
- break;
- }
- return false;
- }
-
- public function stream_stat() {
- return $this->url_stat($this->path);
- }
-
- public function stream_tell() {
- return $this->pointer;
- }
-
- public function stream_write($data) {
- if (!$this->writable) return 0;
- $size = strlen($data);
- if ($this->stream_eof()) {
- self::$data[$this->path] .= $data;
- } else {
- self::$data[$this->path] = substr_replace(
- self::$data[$this->path],
- $data,
- $this->pointer
- );
- }
- $this->pointer += $size;
- return $size;
- }
-
- public function unlink($path) {
- if (isset(self::$data[$path])) {
- unset(self::$data[$path]);
- }
- return true;
- }
-
- public function url_stat($path) {
- if (isset(self::$data[$path])) {
- $size = strlen(self::$data[$path]);
- $time = time();
- $data = array(
- 'dev' => 0,
- 'ino' => 0,
- 'mode' => self::MODE_FILE | 0777,
- 'nlink' => 1,
- 'uid' => 0,
- 'gid' => 0,
- 'rdev' => '',
- 'size' => $size,
- 'atime' => $time,
- 'mtime' => $time,
- 'ctime' => $time,
- 'blksize' => -1,
- 'blocks' => -1,
- );
- return array_values($data) + $data;
- }
- return false;
- }
-}
diff --git a/lib/private/Files/Type/Detection.php b/lib/private/Files/Type/Detection.php
index 84d727ebb0e..cd4ddc2f067 100644
--- a/lib/private/Files/Type/Detection.php
+++ b/lib/private/Files/Type/Detection.php
@@ -167,6 +167,10 @@ class Detection implements IMimeTypeDetector {
$this->loadMappings();
$fileName = basename($path);
+
+ // remove leading dot on hidden files with a file extension
+ $fileName = ltrim($fileName, '.');
+
// note: leading dot doesn't qualify as extension
if (strpos($fileName, '.') > 0) {
//try to guess the type by the file extension
diff --git a/lib/private/Files/Utils/Scanner.php b/lib/private/Files/Utils/Scanner.php
index d26c601be1a..98e2c3c8ca2 100644
--- a/lib/private/Files/Utils/Scanner.php
+++ b/lib/private/Files/Utils/Scanner.php
@@ -31,6 +31,7 @@ use OC\Files\Filesystem;
use OC\ForbiddenException;
use OC\Hooks\PublicEmitter;
use OC\Lock\DBLockingProvider;
+use OCA\Files_Sharing\SharedStorage;
use OCP\Files\Storage\IStorage;
use OCP\Files\StorageNotAvailableException;
use OCP\ILogger;
@@ -118,14 +119,19 @@ class Scanner extends PublicEmitter {
public function backgroundScan($dir) {
$mounts = $this->getMounts($dir);
foreach ($mounts as $mount) {
- if (is_null($mount->getStorage())) {
+ $storage = $mount->getStorage();
+ if (is_null($storage)) {
continue;
}
// don't scan the root storage
- if ($mount->getStorage()->instanceOfStorage('\OC\Files\Storage\Local') && $mount->getMountPoint() === '/') {
+ if ($storage->instanceOfStorage('\OC\Files\Storage\Local') && $mount->getMountPoint() === '/') {
+ continue;
+ }
+
+ // don't scan received local shares, these can be scanned when scanning the owner's storage
+ if ($storage->instanceOfStorage(SharedStorage::class)) {
continue;
}
- $storage = $mount->getStorage();
$scanner = $storage->getScanner();
$this->attachListener($mount);
@@ -156,10 +162,10 @@ class Scanner extends PublicEmitter {
}
$mounts = $this->getMounts($dir);
foreach ($mounts as $mount) {
- if (is_null($mount->getStorage())) {
+ $storage = $mount->getStorage();
+ if (is_null($storage)) {
continue;
}
- $storage = $mount->getStorage();
// if the home storage isn't writable then the scanner is run as the wrong user
if ($storage->instanceOfStorage('\OC\Files\Storage\Home') and
(!$storage->isCreatable('') or !$storage->isCreatable('files'))
@@ -171,6 +177,11 @@ class Scanner extends PublicEmitter {
}
}
+
+ // don't scan received local shares, these can be scanned when scanning the owner's storage
+ if ($storage->instanceOfStorage(SharedStorage::class)) {
+ continue;
+ }
$relativePath = $mount->getInternalPath($dir);
$scanner = $storage->getScanner();
$scanner->setUseTransactions(false);
diff --git a/lib/private/Files/View.php b/lib/private/Files/View.php
index 6facc7b9462..db21d400b39 100644
--- a/lib/private/Files/View.php
+++ b/lib/private/Files/View.php
@@ -931,39 +931,36 @@ class View {
/**
* @param string $path
- * @param string $mode
+ * @param string $mode 'r' or 'w'
* @return resource
*/
public function fopen($path, $mode) {
+ $mode = str_replace('b', '', $mode); // the binary flag is a windows only feature which we do not support
$hooks = array();
switch ($mode) {
case 'r':
- case 'rb':
$hooks[] = 'read';
break;
case 'r+':
- case 'rb+':
case 'w+':
- case 'wb+':
case 'x+':
- case 'xb+':
case 'a+':
- case 'ab+':
$hooks[] = 'read';
$hooks[] = 'write';
break;
case 'w':
- case 'wb':
case 'x':
- case 'xb':
case 'a':
- case 'ab':
$hooks[] = 'write';
break;
default:
\OCP\Util::writeLog('core', 'invalid mode (' . $mode . ') for ' . $path, \OCP\Util::ERROR);
}
+ if ($mode !== 'r' && $mode !== 'w') {
+ \OC::$server->getLogger()->info('Trying to open a file with a mode other than "r" or "w" can cause severe performance issues with some backends');
+ }
+
return $this->basicOperation('fopen', $path, $hooks, $mode);
}
@@ -1005,7 +1002,7 @@ class View {
// Create the directories if any
if (!$this->file_exists($filePath)) {
$result = $this->createParentDirectories($filePath);
- if($result === false) {
+ if ($result === false) {
return false;
}
}
@@ -1149,6 +1146,8 @@ class View {
$unlockLater = false;
if ($this->lockingEnabled && $operation === 'fopen' && is_resource($result)) {
$unlockLater = true;
+ // make sure our unlocking callback will still be called if connection is aborted
+ ignore_user_abort(true);
$result = CallbackWrapper::wrap($result, null, null, function () use ($hooks, $path) {
if (in_array('write', $hooks)) {
$this->unlockFile($path, ILockingProvider::LOCK_EXCLUSIVE);
@@ -1357,7 +1356,7 @@ class View {
//add the sizes of other mount points to the folder
$extOnly = ($includeMountPoints === 'ext');
$mounts = Filesystem::getMountManager()->findIn($path);
- $info->setSubMounts(array_filter($mounts, function(IMountPoint $mount) use ($extOnly) {
+ $info->setSubMounts(array_filter($mounts, function (IMountPoint $mount) use ($extOnly) {
$subStorage = $mount->getStorage();
return !($extOnly && $subStorage instanceof \OCA\Files_Sharing\SharedStorage);
}));
@@ -2106,13 +2105,13 @@ class View {
private function createParentDirectories($filePath) {
$directoryParts = explode('/', $filePath);
$directoryParts = array_filter($directoryParts);
- foreach($directoryParts as $key => $part) {
+ foreach ($directoryParts as $key => $part) {
$currentPathElements = array_slice($directoryParts, 0, $key);
$currentPath = '/' . implode('/', $currentPathElements);
- if($this->is_file($currentPath)) {
+ if ($this->is_file($currentPath)) {
return false;
}
- if(!$this->file_exists($currentPath)) {
+ if (!$this->file_exists($currentPath)) {
$this->mkdir($currentPath);
}
}
diff --git a/lib/private/Group/Backend.php b/lib/private/Group/Backend.php
index 14c36d93422..1e8d62f5e42 100644
--- a/lib/private/Group/Backend.php
+++ b/lib/private/Group/Backend.php
@@ -31,23 +31,14 @@ abstract class Backend implements \OCP\GroupInterface {
*/
const NOT_IMPLEMENTED = -501;
- /**
- * actions that user backends can define
- */
- const CREATE_GROUP = 0x00000001;
- const DELETE_GROUP = 0x00000010;
- const ADD_TO_GROUP = 0x00000100;
- const REMOVE_FROM_GOUP = 0x00001000;
- //OBSOLETE const GET_DISPLAYNAME = 0x00010000;
- const COUNT_USERS = 0x00100000;
-
- protected $possibleActions = array(
+ protected $possibleActions = [
self::CREATE_GROUP => 'createGroup',
self::DELETE_GROUP => 'deleteGroup',
self::ADD_TO_GROUP => 'addToGroup',
self::REMOVE_FROM_GOUP => 'removeFromGroup',
self::COUNT_USERS => 'countUsersInGroup',
- );
+ self::GROUP_DETAILS => 'getGroupDetails',
+ ];
/**
* Get all supported actions
diff --git a/lib/private/Group/Database.php b/lib/private/Group/Database.php
index e4144fdbe20..8be24fc50de 100644
--- a/lib/private/Group/Database.php
+++ b/lib/private/Group/Database.php
@@ -202,6 +202,11 @@ class Database extends \OC\Group\Backend {
* if the user exists at all.
*/
public function getUserGroups( $uid ) {
+ //guests has empty or null $uid
+ if ($uid === null || $uid === '') {
+ return [];
+ }
+
$this->fixDI();
// No magic!
diff --git a/lib/private/Group/Group.php b/lib/private/Group/Group.php
index 9379d604c48..69dce215694 100644
--- a/lib/private/Group/Group.php
+++ b/lib/private/Group/Group.php
@@ -31,6 +31,9 @@ namespace OC\Group;
use OCP\IGroup;
class Group implements IGroup {
+ /** @var null|string */
+ protected $displayName;
+
/**
* @var string $id
*/
@@ -66,18 +69,27 @@ class Group implements IGroup {
* @param \OC\Group\Backend[] $backends
* @param \OC\User\Manager $userManager
* @param \OC\Hooks\PublicEmitter $emitter
+ * @param string $displayName
*/
- public function __construct($gid, $backends, $userManager, $emitter = null) {
+ public function __construct($gid, $backends, $userManager, $emitter = null, $displayName = null) {
$this->gid = $gid;
$this->backends = $backends;
$this->userManager = $userManager;
$this->emitter = $emitter;
+ $this->displayName = $displayName;
}
public function getGID() {
return $this->gid;
}
+ public function getDisplayName() {
+ if (is_null($this->displayName)) {
+ return $this->gid;
+ }
+ return $this->displayName;
+ }
+
/**
* get all users in the group
*
diff --git a/lib/private/Group/Manager.php b/lib/private/Group/Manager.php
index 31911138985..944598a8296 100644
--- a/lib/private/Group/Manager.php
+++ b/lib/private/Group/Manager.php
@@ -155,19 +155,29 @@ class Manager extends PublicEmitter implements IGroupManager {
/**
* @param string $gid
+ * @param string $displayName
* @return \OCP\IGroup
*/
- protected function getGroupObject($gid) {
+ protected function getGroupObject($gid, $displayName = null) {
$backends = array();
foreach ($this->backends as $backend) {
- if ($backend->groupExists($gid)) {
+ if ($backend->implementsActions(\OC\Group\Backend::GROUP_DETAILS)) {
+ $groupData = $backend->getGroupDetails($gid);
+ if (is_array($groupData)) {
+ // take the display name from the first backend that has a non-null one
+ if (is_null($displayName) && isset($groupData['displayName'])) {
+ $displayName = $groupData['displayName'];
+ }
+ $backends[] = $backend;
+ }
+ } else if ($backend->groupExists($gid)) {
$backends[] = $backend;
}
}
if (count($backends) === 0) {
return null;
}
- $this->cachedGroups[$gid] = new Group($gid, $backends, $this->userManager, $this);
+ $this->cachedGroups[$gid] = new Group($gid, $backends, $this->userManager, $this, $displayName);
return $this->cachedGroups[$gid];
}
diff --git a/lib/private/Http/Client/Client.php b/lib/private/Http/Client/Client.php
index 8e182111303..4697f2e038c 100644
--- a/lib/private/Http/Client/Client.php
+++ b/lib/private/Http/Client/Client.php
@@ -77,9 +77,10 @@ class Client implements IClient {
}
}
- $this->client->setDefaultOption('headers/User-Agent', 'ownCloud Server Crawler');
- if ($this->getProxyUri() !== '') {
- $this->client->setDefaultOption('proxy', $this->getProxyUri());
+ $this->client->setDefaultOption('headers/User-Agent', 'Nextcloud Server Crawler');
+ $proxyUri = $this->getProxyUri();
+ if ($proxyUri !== '') {
+ $this->client->setDefaultOption('proxy', $proxyUri);
}
}
@@ -93,10 +94,10 @@ class Client implements IClient {
$proxyUserPwd = $this->config->getSystemValue('proxyuserpwd', null);
$proxyUri = '';
- if (!is_null($proxyUserPwd)) {
+ if ($proxyUserPwd !== null) {
$proxyUri .= $proxyUserPwd . '@';
}
- if (!is_null($proxyHost)) {
+ if ($proxyHost !== null) {
$proxyUri .= $proxyHost;
}
diff --git a/lib/private/IntegrityCheck/Checker.php b/lib/private/IntegrityCheck/Checker.php
index 102fe42a99d..419f989fa0f 100644
--- a/lib/private/IntegrityCheck/Checker.php
+++ b/lib/private/IntegrityCheck/Checker.php
@@ -96,12 +96,8 @@ class Checker {
* @return bool
*/
public function isCodeCheckEnforced() {
- $signedChannels = [
- 'daily',
- 'testing',
- 'stable',
- ];
- if(!in_array($this->environmentHelper->getChannel(), $signedChannels, true)) {
+ $notSignedChannels = [ '', 'git'];
+ if (in_array($this->environmentHelper->getChannel(), $notSignedChannels, true)) {
return false;
}
@@ -115,7 +111,7 @@ class Checker {
} else {
$isIntegrityCheckDisabled = false;
}
- if($isIntegrityCheckDisabled === true) {
+ if ($isIntegrityCheckDisabled === true) {
return false;
}
@@ -271,16 +267,23 @@ class Checker {
public function writeAppSignature($path,
X509 $certificate,
RSA $privateKey) {
- if(!is_dir($path)) {
- throw new \Exception('Directory does not exist.');
- }
- $iterator = $this->getFolderIterator($path);
- $hashes = $this->generateHashes($iterator, $path);
- $signature = $this->createSignatureData($hashes, $certificate, $privateKey);
- $this->fileAccessHelper->file_put_contents(
- $path . '/appinfo/signature.json',
+ $appInfoDir = $path . '/appinfo';
+ try {
+ $this->fileAccessHelper->assertDirectoryExists($appInfoDir);
+
+ $iterator = $this->getFolderIterator($path);
+ $hashes = $this->generateHashes($iterator, $path);
+ $signature = $this->createSignatureData($hashes, $certificate, $privateKey);
+ $this->fileAccessHelper->file_put_contents(
+ $appInfoDir . '/signature.json',
json_encode($signature, JSON_PRETTY_PRINT)
- );
+ );
+ } catch (\Exception $e){
+ if (!$this->fileAccessHelper->is_writable($appInfoDir)) {
+ throw new \Exception($appInfoDir . ' is not writable');
+ }
+ throw $e;
+ }
}
/**
@@ -289,17 +292,28 @@ class Checker {
* @param X509 $certificate
* @param RSA $rsa
* @param string $path
+ * @throws \Exception
*/
public function writeCoreSignature(X509 $certificate,
RSA $rsa,
$path) {
- $iterator = $this->getFolderIterator($path, $path);
- $hashes = $this->generateHashes($iterator, $path);
- $signatureData = $this->createSignatureData($hashes, $certificate, $rsa);
- $this->fileAccessHelper->file_put_contents(
- $path . '/core/signature.json',
+ $coreDir = $path . '/core';
+ try {
+
+ $this->fileAccessHelper->assertDirectoryExists($coreDir);
+ $iterator = $this->getFolderIterator($path, $path);
+ $hashes = $this->generateHashes($iterator, $path);
+ $signatureData = $this->createSignatureData($hashes, $certificate, $rsa);
+ $this->fileAccessHelper->file_put_contents(
+ $coreDir . '/signature.json',
json_encode($signatureData, JSON_PRETTY_PRINT)
- );
+ );
+ } catch (\Exception $e){
+ if (!$this->fileAccessHelper->is_writable($coreDir)) {
+ throw new \Exception($coreDir . ' is not writable');
+ }
+ throw $e;
+ }
}
/**
diff --git a/lib/private/IntegrityCheck/Helpers/FileAccessHelper.php b/lib/private/IntegrityCheck/Helpers/FileAccessHelper.php
index 9e2b76ce11a..a7e378c165e 100644
--- a/lib/private/IntegrityCheck/Helpers/FileAccessHelper.php
+++ b/lib/private/IntegrityCheck/Helpers/FileAccessHelper.php
@@ -53,10 +53,33 @@ class FileAccessHelper {
* Wrapper around file_put_contents($filename, $data)
*
* @param string $filename
- * @param $data
- * @return int|false
+ * @param string $data
+ * @return int
+ * @throws \Exception
*/
public function file_put_contents($filename, $data) {
- return file_put_contents($filename, $data);
+ $bytesWritten = @file_put_contents($filename, $data);
+ if ($bytesWritten === false || $bytesWritten !== strlen($data)){
+ throw new \Exception('Failed to write into ' . $filename);
+ }
+ return $bytesWritten;
+ }
+
+ /**
+ * @param string $path
+ * @return bool
+ */
+ public function is_writable($path) {
+ return is_writable($path);
+ }
+
+ /**
+ * @param string $path
+ * @throws \Exception
+ */
+ public function assertDirectoryExists($path) {
+ if (!is_dir($path)) {
+ throw new \Exception('Directory ' . $path . ' does not exist.');
+ }
}
}
diff --git a/lib/private/Log.php b/lib/private/Log.php
index ef1b70d3cb9..fddd3593127 100644
--- a/lib/private/Log.php
+++ b/lib/private/Log.php
@@ -106,12 +106,8 @@ class Log implements ILogger {
// FIXME: Add this for backwards compatibility, should be fixed at some point probably
if($logger === null) {
- // TODO: Drop backwards compatibility for config in the future
$logType = $this->config->getValue('log_type', 'file');
- if($logType==='owncloud') {
- $logType = 'file';
- }
- $this->logger = 'OC\\Log\\'.ucfirst($logType);
+ $this->logger = static::getLogClass($logType);
call_user_func(array($this->logger, 'init'));
} else {
$this->logger = $logger;
@@ -327,4 +323,26 @@ class Log implements ILogger {
$msg .= ': ' . json_encode($exception);
$this->error($msg, $context);
}
+
+ /**
+ * @param string $logType
+ * @return string
+ * @internal
+ */
+ public static function getLogClass($logType) {
+ switch (strtolower($logType)) {
+ case 'errorlog':
+ return \OC\Log\Errorlog::class;
+ case 'syslog':
+ return \OC\Log\Syslog::class;
+ case 'file':
+ return \OC\Log\File::class;
+
+ // Backwards compatibility for old and fallback for unknown log types
+ case 'owncloud':
+ case 'nextcloud':
+ default:
+ return \OC\Log\File::class;
+ }
+ }
}
diff --git a/lib/private/Log/File.php b/lib/private/Log/File.php
index 904aa1d93f1..be8b72b3a3f 100644
--- a/lib/private/Log/File.php
+++ b/lib/private/Log/File.php
@@ -75,8 +75,8 @@ class File {
$config = \OC::$server->getSystemConfig();
// default to ISO8601
- $format = $config->getValue('logdateformat', 'c');
- $logTimeZone = $config->getValue( "logtimezone", 'UTC' );
+ $format = $config->getValue('logdateformat', \DateTime::ATOM);
+ $logTimeZone = $config->getValue('logtimezone', 'UTC');
try {
$timezone = new \DateTimeZone($logTimeZone);
} catch (\Exception $e) {
diff --git a/lib/private/Log/Rotate.php b/lib/private/Log/Rotate.php
index 6c87c167378..866068433ff 100644
--- a/lib/private/Log/Rotate.php
+++ b/lib/private/Log/Rotate.php
@@ -32,7 +32,9 @@ namespace OC\Log;
*/
class Rotate extends \OC\BackgroundJob\Job {
private $max_log_size;
- public function run($logFile) {
+ public function run($dummy) {
+ $systemConfig = \OC::$server->getSystemConfig();
+ $logFile = $systemConfig->getValue('logfile', $systemConfig->getValue('datadirectory', \OC::$SERVERROOT . '/data') . '/nextcloud.log');
$this->max_log_size = \OC::$server->getConfig()->getSystemValue('log_rotate_size', false);
if ($this->max_log_size) {
$filesize = @filesize($logFile);
diff --git a/lib/private/Mail/Mailer.php b/lib/private/Mail/Mailer.php
index df8fa80f2c2..e704e8e3490 100644
--- a/lib/private/Mail/Mailer.php
+++ b/lib/private/Mail/Mailer.php
@@ -200,7 +200,7 @@ class Mailer implements IMailer {
* @return \Swift_SendmailTransport
*/
protected function getSendMailInstance() {
- switch ($this->config->getSystemValue('mail_smtpmode', 'sendmail')) {
+ switch ($this->config->getSystemValue('mail_smtpmode', 'php')) {
case 'qmail':
$binaryPath = '/var/qmail/bin/sendmail';
break;
diff --git a/lib/private/Memcache/APC.php b/lib/private/Memcache/APC.php
deleted file mode 100644
index 7db6d64b085..00000000000
--- a/lib/private/Memcache/APC.php
+++ /dev/null
@@ -1,136 +0,0 @@
-<?php
-/**
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- *
- * @author Andreas Fischer <bantu@owncloud.com>
- * @author Clark Tomlinson <fallen013@gmail.com>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Otto Sabart <ottosabart@seberm.com>
- * @author Robin Appelman <robin@icewind.nl>
- *
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program 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, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
- */
-
-namespace OC\Memcache;
-
-use OCP\IMemcache;
-
-class APC extends Cache implements IMemcache {
- use CASTrait {
- cas as casEmulated;
- }
-
- use CADTrait;
-
- public function get($key) {
- $result = apc_fetch($this->getPrefix() . $key, $success);
- if (!$success) {
- return null;
- }
- return $result;
- }
-
- public function set($key, $value, $ttl = 0) {
- return apc_store($this->getPrefix() . $key, $value, $ttl);
- }
-
- public function hasKey($key) {
- return apc_exists($this->getPrefix() . $key);
- }
-
- public function remove($key) {
- return apc_delete($this->getPrefix() . $key);
- }
-
- public function clear($prefix = '') {
- $ns = $this->getPrefix() . $prefix;
- $ns = preg_quote($ns, '/');
- $iter = new \APCIterator('user', '/^' . $ns . '/', APC_ITER_KEY);
- return apc_delete($iter);
- }
-
- /**
- * Set a value in the cache if it's not already stored
- *
- * @param string $key
- * @param mixed $value
- * @param int $ttl Time To Live in seconds. Defaults to 60*60*24
- * @return bool
- */
- public function add($key, $value, $ttl = 0) {
- return apc_add($this->getPrefix() . $key, $value, $ttl);
- }
-
- /**
- * Increase a stored number
- *
- * @param string $key
- * @param int $step
- * @return int | bool
- */
- public function inc($key, $step = 1) {
- $this->add($key, 0);
- return apc_inc($this->getPrefix() . $key, $step);
- }
-
- /**
- * Decrease a stored number
- *
- * @param string $key
- * @param int $step
- * @return int | bool
- */
- public function dec($key, $step = 1) {
- return apc_dec($this->getPrefix() . $key, $step);
- }
-
- /**
- * Compare and set
- *
- * @param string $key
- * @param mixed $old
- * @param mixed $new
- * @return bool
- */
- public function cas($key, $old, $new) {
- // apc only does cas for ints
- if (is_int($old) and is_int($new)) {
- return apc_cas($this->getPrefix() . $key, $old, $new);
- } else {
- return $this->casEmulated($key, $old, $new);
- }
- }
-
- static public function isAvailable() {
- if (!extension_loaded('apc')) {
- return false;
- } elseif (!\OC::$server->getIniWrapper()->getBool('apc.enabled')) {
- return false;
- } elseif (!\OC::$server->getIniWrapper()->getBool('apc.enable_cli') && \OC::$CLI) {
- return false;
- } else {
- return true;
- }
- }
-}
-
-if (!function_exists('apc_exists')) {
- function apc_exists($keys) {
- $result = false;
- apc_fetch($keys, $result);
- return $result;
- }
-}
diff --git a/lib/private/Memcache/Factory.php b/lib/private/Memcache/Factory.php
index f3841d31679..8e62e020faa 100644
--- a/lib/private/Memcache/Factory.php
+++ b/lib/private/Memcache/Factory.php
@@ -83,7 +83,7 @@ class Factory implements ICacheFactory {
$missingCacheMessage = 'Memcache {class} not available for {use} cache';
$missingCacheHint = 'Is the matching PHP module installed and enabled?';
- if (!$localCacheClass::isAvailable()) {
+ if (!class_exists($localCacheClass) || !$localCacheClass::isAvailable()) {
if (\OC::$CLI && !defined('PHPUNIT_RUN')) {
// CLI should not hard-fail on broken memcache
$this->logger->info($missingCacheMessage, [
@@ -98,7 +98,7 @@ class Factory implements ICacheFactory {
]), $missingCacheHint);
}
}
- if (!$distributedCacheClass::isAvailable()) {
+ if (!class_exists($distributedCacheClass) || !$distributedCacheClass::isAvailable()) {
if (\OC::$CLI && !defined('PHPUNIT_RUN')) {
// CLI should not hard-fail on broken memcache
$this->logger->info($missingCacheMessage, [
@@ -113,7 +113,7 @@ class Factory implements ICacheFactory {
]), $missingCacheHint);
}
}
- if (!($lockingCacheClass && $lockingCacheClass::isAvailable())) {
+ if (!($lockingCacheClass && class_exists($distributedCacheClass) && $lockingCacheClass::isAvailable())) {
// don't fallback since the fallback might not be suitable for storing lock
$lockingCacheClass = self::NULL_CACHE;
}
diff --git a/lib/private/Memcache/Memcached.php b/lib/private/Memcache/Memcached.php
index 12f45739374..bf07fd0e6e7 100644
--- a/lib/private/Memcache/Memcached.php
+++ b/lib/private/Memcache/Memcached.php
@@ -46,16 +46,6 @@ class Memcached extends Cache implements IMemcache {
parent::__construct($prefix);
if (is_null(self::$cache)) {
self::$cache = new \Memcached();
- $servers = \OC::$server->getSystemConfig()->getValue('memcached_servers');
- if (!$servers) {
- $server = \OC::$server->getSystemConfig()->getValue('memcached_server');
- if ($server) {
- $servers = array($server);
- } else {
- $servers = array(array('localhost', 11211));
- }
- }
- self::$cache->addServers($servers);
$defaultOptions = [
\Memcached::OPT_CONNECT_TIMEOUT => 50,
@@ -71,7 +61,7 @@ class Memcached extends Cache implements IMemcache {
\Memcached::OPT_LIBKETAMA_COMPATIBLE => true,
// Enable Binary Protocol
- \Memcached::OPT_BINARY_PROTOCOL => true,
+ //\Memcached::OPT_BINARY_PROTOCOL => true,
];
// by default enable igbinary serializer if available
if (\Memcached::HAVE_IGBINARY) {
@@ -85,6 +75,17 @@ class Memcached extends Cache implements IMemcache {
} else {
throw new HintException("Expected 'memcached_options' config to be an array, got $options");
}
+
+ $servers = \OC::$server->getSystemConfig()->getValue('memcached_servers');
+ if (!$servers) {
+ $server = \OC::$server->getSystemConfig()->getValue('memcached_server');
+ if ($server) {
+ $servers = [$server];
+ } else {
+ $servers = [['localhost', 11211]];
+ }
+ }
+ self::$cache->addServers($servers);
}
}
@@ -110,7 +111,9 @@ class Memcached extends Cache implements IMemcache {
} else {
$result = self::$cache->set($this->getNamespace() . $key, $value);
}
- $this->verifyReturnCode();
+ if ($result !== true) {
+ $this->verifyReturnCode();
+ }
return $result;
}
diff --git a/lib/private/NavigationManager.php b/lib/private/NavigationManager.php
index 3e9ddfc6466..f7bc02943a3 100644
--- a/lib/private/NavigationManager.php
+++ b/lib/private/NavigationManager.php
@@ -1,6 +1,6 @@
<?php
/**
- * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @copyright Copyright (c) 2016, ownCloud GmbH
*
* @author Bart Visscher <bartv@thisnet.nl>
* @author Joas Schilling <coding@schilljs.com>
@@ -26,13 +26,46 @@
namespace OC;
+use OC\App\AppManager;
+use OCP\App\IAppManager;
+use OCP\IGroupManager;
+use OCP\INavigationManager;
+use OCP\IURLGenerator;
+use OCP\IUserSession;
+use OCP\L10N\IFactory;
+
/**
* Manages the ownCloud navigation
*/
-class NavigationManager implements \OCP\INavigationManager {
- protected $entries = array();
- protected $closureEntries = array();
+
+class NavigationManager implements INavigationManager {
+ protected $entries = [];
+ protected $closureEntries = [];
protected $activeEntry;
+ /** @var bool */
+ protected $init = false;
+ /** @var IAppManager|AppManager */
+ protected $appManager;
+ /** @var IURLGenerator */
+ private $urlGenerator;
+ /** @var IFactory */
+ private $l10nFac;
+ /** @var IUserSession */
+ private $userSession;
+ /** @var IGroupManager */
+ private $groupManager;
+
+ public function __construct(IAppManager $appManager = null,
+ IURLGenerator $urlGenerator = null,
+ IFactory $l10nFac = null,
+ IUserSession $userSession = null,
+ IGroupManager$groupManager = null) {
+ $this->appManager = $appManager;
+ $this->urlGenerator = $urlGenerator;
+ $this->l10nFac = $l10nFac;
+ $this->userSession = $userSession;
+ $this->groupManager = $groupManager;
+ }
/**
* Creates a new navigation entry
@@ -60,6 +93,7 @@ class NavigationManager implements \OCP\INavigationManager {
* @return array an array of the added entries
*/
public function getAll() {
+ $this->init();
foreach ($this->closureEntries as $c) {
$this->add($c());
}
@@ -71,8 +105,9 @@ class NavigationManager implements \OCP\INavigationManager {
* removes all the entries
*/
public function clear() {
- $this->entries = array();
- $this->closureEntries = array();
+ $this->entries = [];
+ $this->closureEntries = [];
+ $this->init = false;
}
/**
@@ -93,4 +128,64 @@ class NavigationManager implements \OCP\INavigationManager {
public function getActiveEntry() {
return $this->activeEntry;
}
+
+ private function init() {
+ if ($this->init) {
+ return;
+ }
+ $this->init = true;
+ if (is_null($this->appManager)) {
+ return;
+ }
+ foreach ($this->appManager->getInstalledApps() as $app) {
+ // load plugins and collections from info.xml
+ $info = $this->appManager->getAppInfo($app);
+ if (!isset($info['navigation'])) {
+ continue;
+ }
+ $nav = $info['navigation'];
+ if (!isset($nav['name'])) {
+ continue;
+ }
+ if (!isset($nav['route'])) {
+ continue;
+ }
+ $role = isset($nav['@attributes']['role']) ? $nav['@attributes']['role'] : 'all';
+ if ($role === 'admin' && !$this->isAdmin()) {
+ continue;
+ }
+ $l = $this->l10nFac->get($app);
+ $order = isset($nav['order']) ? $nav['order'] : 100;
+ $route = $this->urlGenerator->linkToRoute($nav['route']);
+ $icon = isset($nav['icon']) ? $nav['icon'] : 'app.svg';
+ foreach ([$icon, "$app.svg"] as $i) {
+ try {
+ $icon = $this->urlGenerator->imagePath($app, $i);
+ break;
+ } catch (\RuntimeException $ex) {
+ // no icon? - ignore it then
+ }
+ }
+ if (is_null($icon)) {
+ $icon = $this->urlGenerator->imagePath('core', 'default-app-icon');
+ }
+
+ $this->add([
+ 'id' => $app,
+ 'order' => $order,
+ 'href' => $route,
+ 'icon' => $icon,
+ 'name' => $l->t($nav['name']),
+ ]);
+ }
+ }
+
+ private function isAdmin() {
+ $user = $this->userSession->getUser();
+ if ($user !== null) {
+ return $this->groupManager->isAdmin($user->getUID());
+ }
+ return false;
+ }
+
}
diff --git a/lib/private/Preview.php b/lib/private/Preview.php
deleted file mode 100644
index caa1e89bacc..00000000000
--- a/lib/private/Preview.php
+++ /dev/null
@@ -1,1349 +0,0 @@
-<?php
-/**
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- *
- * @author Björn Schießle <bjoern@schiessle.org>
- * @author Frank Karlitschek <frank@karlitschek.de>
- * @author Georg Ehrke <georg@owncloud.com>
- * @author Joas Schilling <coding@schilljs.com>
- * @author Jörn Friedrich Dreyer <jfd@butonic.de>
- * @author Lukas Reschke <lukas@statuscode.ch>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Olivier Paroz <github@oparoz.com>
- * @author Robin Appelman <robin@icewind.nl>
- * @author Roeland Jago Douma <roeland@famdouma.nl>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- * @author Tobias Kaminsky <tobias@kaminsky.me>
- *
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program 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, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
- */
-namespace OC;
-
-use OC\Preview\Provider;
-use OCP\Files\FileInfo;
-use OCP\Files\NotFoundException;
-
-class Preview {
- //the thumbnail folder
- const THUMBNAILS_FOLDER = 'thumbnails';
-
- const MODE_FILL = 'fill';
- const MODE_COVER = 'cover';
-
- //config
- private $maxScaleFactor;
- /** @var int maximum width allowed for a preview */
- private $configMaxWidth;
- /** @var int maximum height allowed for a preview */
- private $configMaxHeight;
-
- //fileview object
- private $fileView = null;
- private $userView = null;
-
- //vars
- private $file;
- private $maxX;
- private $maxY;
- private $scalingUp;
- private $mimeType;
- private $keepAspect = false;
- private $mode = self::MODE_FILL;
-
- //used to calculate the size of the preview to generate
- /** @var int $maxPreviewWidth max width a preview can have */
- private $maxPreviewWidth;
- /** @var int $maxPreviewHeight max height a preview can have */
- private $maxPreviewHeight;
- /** @var int $previewWidth calculated width of the preview we're looking for */
- private $previewWidth;
- /** @var int $previewHeight calculated height of the preview we're looking for */
- private $previewHeight;
-
- //filemapper used for deleting previews
- // index is path, value is fileinfo
- static public $deleteFileMapper = array();
- static public $deleteChildrenMapper = array();
-
- /**
- * preview images object
- *
- * @var \OCP\IImage
- */
- private $preview;
-
- /**
- * @var \OCP\Files\FileInfo
- */
- protected $info;
-
- /**
- * check if thumbnail or bigger version of thumbnail of file is cached
- *
- * @param string $user userid - if no user is given, OC_User::getUser will be used
- * @param string $root path of root
- * @param string $file The path to the file where you want a thumbnail from
- * @param int $maxX The maximum X size of the thumbnail. It can be smaller depending on the
- * shape of the image
- * @param int $maxY The maximum Y size of the thumbnail. It can be smaller depending on the
- * shape of the image
- * @param bool $scalingUp Disable/Enable upscaling of previews
- *
- * @throws \Exception
- * @return mixed (bool / string)
- * false if thumbnail does not exist
- * path to thumbnail if thumbnail exists
- */
- public function __construct(
- $user = '',
- $root = '/',
- $file = '', $maxX = 1,
- $maxY = 1,
- $scalingUp = true
- ) {
- //init fileviews
- if ($user === '') {
- $user = \OC_User::getUser();
- }
- $this->fileView = new \OC\Files\View('/' . $user . '/' . $root);
- $this->userView = new \OC\Files\View('/' . $user);
-
- //set config
- $sysConfig = \OC::$server->getConfig();
- $this->configMaxWidth = $sysConfig->getSystemValue('preview_max_x', 2048);
- $this->configMaxHeight = $sysConfig->getSystemValue('preview_max_y', 2048);
- $this->maxScaleFactor = $sysConfig->getSystemValue('preview_max_scale_factor', 1);
-
- //save parameters
- $this->setFile($file);
- $this->setMaxX((int)$maxX);
- $this->setMaxY((int)$maxY);
- $this->setScalingup($scalingUp);
-
- $this->preview = null;
-
- //check if there are preview backends
- if (!\OC::$server->getPreviewManager()
- ->hasProviders()
- && \OC::$server->getConfig()
- ->getSystemValue('enable_previews', true)
- ) {
- \OCP\Util::writeLog('core', 'No preview providers exist', \OCP\Util::ERROR);
- throw new \Exception('No preview providers');
- }
- }
-
- /**
- * returns the path of the file you want a thumbnail from
- *
- * @return string
- */
- public function getFile() {
- return $this->file;
- }
-
- /**
- * returns the max width of the preview
- *
- * @return integer
- */
- public function getMaxX() {
- return $this->maxX;
- }
-
- /**
- * returns the max height of the preview
- *
- * @return integer
- */
- public function getMaxY() {
- return $this->maxY;
- }
-
- /**
- * returns whether or not scalingup is enabled
- *
- * @return bool
- */
- public function getScalingUp() {
- return $this->scalingUp;
- }
-
- /**
- * returns the name of the thumbnailfolder
- *
- * @return string
- */
- public function getThumbnailsFolder() {
- return self::THUMBNAILS_FOLDER;
- }
-
- /**
- * returns the max scale factor
- *
- * @return string
- */
- public function getMaxScaleFactor() {
- return $this->maxScaleFactor;
- }
-
- /**
- * returns the max width set in ownCloud's config
- *
- * @return integer
- */
- public function getConfigMaxX() {
- return $this->configMaxWidth;
- }
-
- /**
- * returns the max height set in ownCloud's config
- *
- * @return integer
- */
- public function getConfigMaxY() {
- return $this->configMaxHeight;
- }
-
- /**
- * Returns the FileInfo object associated with the file to preview
- *
- * @return false|Files\FileInfo|\OCP\Files\FileInfo
- */
- protected function getFileInfo() {
- $absPath = $this->fileView->getAbsolutePath($this->file);
- $absPath = Files\Filesystem::normalizePath($absPath);
- if (array_key_exists($absPath, self::$deleteFileMapper)) {
- $this->info = self::$deleteFileMapper[$absPath];
- } else if (!$this->info) {
- $this->info = $this->fileView->getFileInfo($this->file);
- }
-
- return $this->info;
- }
-
-
- /**
- * @return array|null
- */
- private function getChildren() {
- $absPath = $this->fileView->getAbsolutePath($this->file);
- $absPath = Files\Filesystem::normalizePath($absPath);
-
- if (array_key_exists($absPath, self::$deleteChildrenMapper)) {
- return self::$deleteChildrenMapper[$absPath];
- }
-
- return null;
- }
-
- /**
- * Sets the path of the file you want a preview of
- *
- * @param string $file
- * @param \OCP\Files\FileInfo|null $info
- *
- * @return \OC\Preview
- */
- public function setFile($file, $info = null) {
- $this->file = $file;
- $this->info = $info;
-
- if ($file !== '') {
- $this->getFileInfo();
- if ($this->info instanceof \OCP\Files\FileInfo) {
- $this->mimeType = $this->info->getMimetype();
- }
- }
-
- return $this;
- }
-
- /**
- * Forces the use of a specific media type
- *
- * @param string $mimeType
- */
- public function setMimetype($mimeType) {
- $this->mimeType = $mimeType;
- }
-
- /**
- * Sets the max width of the preview. It's capped by the maximum allowed size set in the
- * configuration
- *
- * @param int $maxX
- *
- * @throws \Exception
- * @return \OC\Preview
- */
- public function setMaxX($maxX = 1) {
- if ($maxX <= 0) {
- throw new \Exception('Cannot set width of 0 or smaller!');
- }
- $configMaxX = $this->getConfigMaxX();
- $maxX = $this->limitMaxDim($maxX, $configMaxX, 'maxX');
- $this->maxX = $maxX;
-
- return $this;
- }
-
- /**
- * Sets the max height of the preview. It's capped by the maximum allowed size set in the
- * configuration
- *
- * @param int $maxY
- *
- * @throws \Exception
- * @return \OC\Preview
- */
- public function setMaxY($maxY = 1) {
- if ($maxY <= 0) {
- throw new \Exception('Cannot set height of 0 or smaller!');
- }
- $configMaxY = $this->getConfigMaxY();
- $maxY = $this->limitMaxDim($maxY, $configMaxY, 'maxY');
- $this->maxY = $maxY;
-
- return $this;
- }
-
- /**
- * Sets whether we're allowed to scale up when generating a preview. It's capped by the maximum
- * allowed scale factor set in the configuration
- *
- * @param bool $scalingUp
- *
- * @return \OC\Preview
- */
- public function setScalingup($scalingUp) {
- if ($this->getMaxScaleFactor() === 1) {
- $scalingUp = false;
- }
- $this->scalingUp = $scalingUp;
-
- return $this;
- }
-
- /**
- * Set whether to cover or fill the specified dimensions
- *
- * @param string $mode
- *
- * @return \OC\Preview
- */
- public function setMode($mode) {
- $this->mode = $mode;
-
- return $this;
- }
-
- /**
- * Sets whether we need to generate a preview which keeps the aspect ratio of the original file
- *
- * @param bool $keepAspect
- *
- * @return \OC\Preview
- */
- public function setKeepAspect($keepAspect) {
- $this->keepAspect = $keepAspect;
-
- return $this;
- }
-
- /**
- * Makes sure we were given a file to preview and that it exists in the filesystem
- *
- * @return bool
- */
- public function isFileValid() {
- $file = $this->getFile();
- if ($file === '') {
- \OCP\Util::writeLog('core', 'No filename passed', \OCP\Util::DEBUG);
-
- return false;
- }
-
- if (!$this->getFileInfo() instanceof FileInfo) {
- \OCP\Util::writeLog('core', 'File:"' . $file . '" not found', \OCP\Util::DEBUG);
-
- return false;
- }
-
- return true;
- }
-
- /**
- * Deletes the preview of a file with specific width and height
- *
- * This should never delete the max preview, use deleteAllPreviews() instead
- *
- * @return bool
- */
- public function deletePreview() {
- $fileInfo = $this->getFileInfo();
- if ($fileInfo !== null && $fileInfo !== false) {
- $fileId = $fileInfo->getId();
-
- $previewPath = $this->buildCachePath($fileId);
- if (!strpos($previewPath, 'max')) {
- return $this->userView->unlink($previewPath);
- }
- }
-
- return false;
- }
-
- /**
- * Deletes all previews of a file
- */
- public function deleteAllPreviews() {
- $thumbnailMount = $this->userView->getMount($this->getThumbnailsFolder());
- $propagator = $thumbnailMount->getStorage()->getPropagator();
- $propagator->beginBatch();
-
- $toDelete = $this->getChildren();
- $toDelete[] = $this->getFileInfo();
-
- foreach ($toDelete as $delete) {
- if ($delete instanceof FileInfo) {
- /** @var \OCP\Files\FileInfo $delete */
- $fileId = $delete->getId();
-
- // getId() might return null, e.g. when the file is a
- // .ocTransferId*.part file from chunked file upload.
- if (!empty($fileId)) {
- $previewPath = $this->getPreviewPath($fileId);
- $this->userView->rmdir($previewPath);
- }
- }
- }
-
- $propagator->commitBatch();
- }
-
- /**
- * Checks if a preview matching the asked dimensions or a bigger version is already cached
- *
- * * We first retrieve the size of the max preview since this is what we be used to create
- * all our preview. If it doesn't exist we return false, so that it can be generated
- * * Using the dimensions of the max preview, we calculate what the size of the new
- * thumbnail should be
- * * And finally, we look for a suitable candidate in the cache
- *
- * @param int $fileId fileId of the original file we need a preview of
- *
- * @return string|false path to the cached preview if it exists or false
- */
- public function isCached($fileId) {
- if (is_null($fileId)) {
- return false;
- }
-
- /**
- * Phase 1: Looking for the max preview
- */
- $previewPath = $this->getPreviewPath($fileId);
- // We currently can't look for a single file due to bugs related to #16478
- $allThumbnails = $this->userView->getDirectoryContent($previewPath);
- list($maxPreviewWidth, $maxPreviewHeight) = $this->getMaxPreviewSize($allThumbnails);
-
- // Only use the cache if we have a max preview
- if (!is_null($maxPreviewWidth) && !is_null($maxPreviewHeight)) {
-
- /**
- * Phase 2: Calculating the size of the preview we need to send back
- */
- $this->maxPreviewWidth = $maxPreviewWidth;
- $this->maxPreviewHeight = $maxPreviewHeight;
-
- list($previewWidth, $previewHeight) = $this->simulatePreviewDimensions();
- if (empty($previewWidth) || empty($previewHeight)) {
- return false;
- }
-
- $this->previewWidth = $previewWidth;
- $this->previewHeight = $previewHeight;
-
- /**
- * Phase 3: We look for a preview of the exact size
- */
- // This gives us a calculated path to a preview of asked dimensions
- // thumbnailFolder/fileId/<maxX>-<maxY>(-max|-with-aspect).png
- $preview = $this->buildCachePath($fileId, $previewWidth, $previewHeight);
-
- // This checks if we have a preview of those exact dimensions in the cache
- if ($this->thumbnailSizeExists($allThumbnails, basename($preview))) {
- return $preview;
- }
-
- /**
- * Phase 4: We look for a larger preview, matching the aspect ratio
- */
- if (($this->getMaxX() >= $maxPreviewWidth)
- && ($this->getMaxY() >= $maxPreviewHeight)
- ) {
- // The preview we-re looking for is the exact size or larger than the max preview,
- // so return that
- return $this->buildCachePath($fileId, $maxPreviewWidth, $maxPreviewHeight);
- } else {
- // The last resort is to look for something bigger than what we've calculated,
- // but still smaller than the max preview
- return $this->isCachedBigger($fileId, $allThumbnails);
- }
- }
-
- return false;
- }
-
- /**
- * Returns the dimensions of the max preview
- *
- * @param FileInfo[] $allThumbnails the list of all our cached thumbnails
- *
- * @return int[]
- */
- private function getMaxPreviewSize($allThumbnails) {
- $maxPreviewX = null;
- $maxPreviewY = null;
-
- foreach ($allThumbnails as $thumbnail) {
- $name = $thumbnail['name'];
- if (strpos($name, 'max')) {
- list($maxPreviewX, $maxPreviewY) = $this->getDimensionsFromFilename($name);
- break;
- }
- }
-
- return [$maxPreviewX, $maxPreviewY];
- }
-
- /**
- * Check if a specific thumbnail size is cached
- *
- * @param FileInfo[] $allThumbnails the list of all our cached thumbnails
- * @param string $name
- * @return bool
- */
- private function thumbnailSizeExists(array $allThumbnails, $name) {
-
- foreach ($allThumbnails as $thumbnail) {
- if ($name === $thumbnail->getName()) {
- return true;
- }
- }
-
- return false;
- }
-
- /**
- * Determines the size of the preview we should be looking for in the cache
- *
- * @return integer[]
- */
- private function simulatePreviewDimensions() {
- $askedWidth = $this->getMaxX();
- $askedHeight = $this->getMaxY();
-
- if ($this->keepAspect) {
- list($newPreviewWidth, $newPreviewHeight) =
- $this->applyAspectRatio($askedWidth, $askedHeight);
- } else {
- list($newPreviewWidth, $newPreviewHeight) = $this->fixSize($askedWidth, $askedHeight);
- }
-
- return [(int)$newPreviewWidth, (int)$newPreviewHeight];
- }
-
- /**
- * Resizes the boundaries to match the aspect ratio
- *
- * @param int $askedWidth
- * @param int $askedHeight
- *
- * @param int $originalWidth
- * @param int $originalHeight
- * @return integer[]
- */
- private function applyAspectRatio($askedWidth, $askedHeight, $originalWidth = 0, $originalHeight = 0) {
- if (!$originalWidth) {
- $originalWidth = $this->maxPreviewWidth;
- }
- if (!$originalHeight) {
- $originalHeight = $this->maxPreviewHeight;
- }
- $originalRatio = $originalWidth / $originalHeight;
- // Defines the box in which the preview has to fit
- $scaleFactor = $this->scalingUp ? $this->maxScaleFactor : 1;
- $askedWidth = min($askedWidth, $originalWidth * $scaleFactor);
- $askedHeight = min($askedHeight, $originalHeight * $scaleFactor);
-
- if ($askedWidth / $originalRatio < $askedHeight) {
- // width restricted
- $askedHeight = round($askedWidth / $originalRatio);
- } else {
- $askedWidth = round($askedHeight * $originalRatio);
- }
-
- return [(int)$askedWidth, (int)$askedHeight];
- }
-
- /**
- * Resizes the boundaries to cover the area
- *
- * @param int $askedWidth
- * @param int $askedHeight
- * @param int $previewWidth
- * @param int $previewHeight
- * @return integer[]
- */
- private function applyCover($askedWidth, $askedHeight, $previewWidth, $previewHeight) {
- $originalRatio = $previewWidth / $previewHeight;
- // Defines the box in which the preview has to fit
- $scaleFactor = $this->scalingUp ? $this->maxScaleFactor : 1;
- $askedWidth = min($askedWidth, $previewWidth * $scaleFactor);
- $askedHeight = min($askedHeight, $previewHeight * $scaleFactor);
-
- if ($askedWidth / $originalRatio > $askedHeight) {
- // height restricted
- $askedHeight = round($askedWidth / $originalRatio);
- } else {
- $askedWidth = round($askedHeight * $originalRatio);
- }
-
- return [(int)$askedWidth, (int)$askedHeight];
- }
-
- /**
- * Makes sure an upscaled preview doesn't end up larger than the max dimensions defined in the
- * config
- *
- * @param int $askedWidth
- * @param int $askedHeight
- *
- * @return integer[]
- */
- private function fixSize($askedWidth, $askedHeight) {
- if ($this->scalingUp) {
- $askedWidth = min($this->configMaxWidth, $askedWidth);
- $askedHeight = min($this->configMaxHeight, $askedHeight);
- }
-
- return [(int)$askedWidth, (int)$askedHeight];
- }
-
- /**
- * Checks if a bigger version of a file preview is cached and if not
- * return the preview of max allowed dimensions
- *
- * @param int $fileId fileId of the original image
- * @param FileInfo[] $allThumbnails the list of all our cached thumbnails
- *
- * @return string path to bigger thumbnail
- */
- private function isCachedBigger($fileId, $allThumbnails) {
- // This is used to eliminate any thumbnail narrower than what we need
- $maxX = $this->getMaxX();
-
- //array for usable cached thumbnails
- $possibleThumbnails = $this->getPossibleThumbnails($allThumbnails);
-
- foreach ($possibleThumbnails as $width => $path) {
- if ($width < $maxX) {
- continue;
- } else {
- return $path;
- }
- }
-
- // At this stage, we didn't find a preview, so we return the max preview
- return $this->buildCachePath($fileId, $this->maxPreviewWidth, $this->maxPreviewHeight);
- }
-
- /**
- * Get possible bigger thumbnails of the given image with the proper aspect ratio
- *
- * @param FileInfo[] $allThumbnails the list of all our cached thumbnails
- *
- * @return string[] an array of paths to bigger thumbnails
- */
- private function getPossibleThumbnails($allThumbnails) {
- if ($this->keepAspect) {
- $wantedAspectRatio = (float)($this->maxPreviewWidth / $this->maxPreviewHeight);
- } else {
- $wantedAspectRatio = (float)($this->getMaxX() / $this->getMaxY());
- }
-
- //array for usable cached thumbnails
- $possibleThumbnails = array();
- foreach ($allThumbnails as $thumbnail) {
- $name = rtrim($thumbnail['name'], '.png');
- list($x, $y, $aspectRatio) = $this->getDimensionsFromFilename($name);
- if (abs($aspectRatio - $wantedAspectRatio) >= 0.000001
- || $this->unscalable($x, $y)
- ) {
- continue;
- }
- $possibleThumbnails[$x] = $thumbnail['path'];
- }
-
- ksort($possibleThumbnails);
-
- return $possibleThumbnails;
- }
-
- /**
- * Looks at the preview filename from the cache and extracts the size of the preview
- *
- * @param string $name
- *
- * @return array<int,int,float>
- */
- private function getDimensionsFromFilename($name) {
- $size = explode('-', $name);
- $x = (int)$size[0];
- $y = (int)$size[1];
- $aspectRatio = (float)($x / $y);
-
- return array($x, $y, $aspectRatio);
- }
-
- /**
- * @param int $x
- * @param int $y
- *
- * @return bool
- */
- private function unscalable($x, $y) {
-
- $maxX = $this->getMaxX();
- $maxY = $this->getMaxY();
- $scalingUp = $this->getScalingUp();
- $maxScaleFactor = $this->getMaxScaleFactor();
-
- if ($x < $maxX || $y < $maxY) {
- if ($scalingUp) {
- $scaleFactor = $maxX / $x;
- if ($scaleFactor > $maxScaleFactor) {
- return true;
- }
- } else {
- return true;
- }
- }
-
- return false;
- }
-
- /**
- * Returns a preview of a file
- *
- * The cache is searched first and if nothing usable was found then a preview is
- * generated by one of the providers
- *
- * @return \OCP\IImage
- */
- public function getPreview() {
- if (!is_null($this->preview) && $this->preview->valid()) {
- return $this->preview;
- }
-
- $this->preview = null;
- $fileInfo = $this->getFileInfo();
- if ($fileInfo === null || $fileInfo === false || !$fileInfo->isReadable()) {
- return new \OC_Image();
- }
-
- $fileId = $fileInfo->getId();
- $cached = $this->isCached($fileId);
- if ($cached) {
- $this->getCachedPreview($fileId, $cached);
- }
-
- if (is_null($this->preview)) {
- $this->generatePreview($fileId);
- }
-
- // We still don't have a preview, so we send back an empty object
- if (is_null($this->preview)) {
- $this->preview = new \OC_Image();
- }
-
- return $this->preview;
- }
-
- /**
- * Sends the preview, including the headers to client which requested it
- *
- * @param null|string $mimeTypeForHeaders the media type to use when sending back the reply
- *
- * @throws NotFoundException
- * @throws PreviewNotAvailableException
- */
- public function showPreview($mimeTypeForHeaders = null) {
- // Check if file is valid
- if ($this->isFileValid() === false) {
- throw new NotFoundException('File not found.');
- }
-
- if (is_null($this->preview)) {
- $this->getPreview();
- }
- if ($this->preview instanceof \OCP\IImage) {
- if ($this->preview->valid()) {
- \OCP\Response::enableCaching(3600 * 24); // 24 hours
- } else {
- $this->getMimeIcon();
- }
- $this->preview->show($mimeTypeForHeaders);
- }
- }
-
- /**
- * Retrieves the preview from the cache and resizes it if necessary
- *
- * @param int $fileId fileId of the original image
- * @param string $cached the path to the cached preview
- */
- private function getCachedPreview($fileId, $cached) {
- $stream = $this->userView->fopen($cached, 'r');
- $this->preview = null;
- if ($stream) {
- $image = new \OC_Image();
- $image->loadFromFileHandle($stream);
-
- $this->preview = $image->valid() ? $image : null;
-
- if (!is_null($this->preview)) {
- // Size of the preview we calculated
- $maxX = $this->previewWidth;
- $maxY = $this->previewHeight;
- // Size of the preview we retrieved from the cache
- $previewX = (int)$this->preview->width();
- $previewY = (int)$this->preview->height();
-
- // We don't have an exact match
- if ($previewX !== $maxX || $previewY !== $maxY) {
- $this->resizeAndStore($fileId);
- }
- }
-
- fclose($stream);
- }
- }
-
- /**
- * Resizes, crops, fixes orientation and stores in the cache
- *
- * @param int $fileId fileId of the original image
- */
- private function resizeAndStore($fileId) {
- $image = $this->preview;
- if (!($image instanceof \OCP\IImage)) {
- \OCP\Util::writeLog(
- 'core', '$this->preview is not an instance of \OCP\IImage', \OCP\Util::DEBUG
- );
-
- return;
- }
- $previewWidth = (int)$image->width();
- $previewHeight = (int)$image->height();
- $askedWidth = $this->getMaxX();
- $askedHeight = $this->getMaxY();
-
- if ($this->mode === self::MODE_COVER) {
- list($askedWidth, $askedHeight) =
- $this->applyCover($askedWidth, $askedHeight, $previewWidth, $previewHeight);
- }
-
- /**
- * Phase 1: If required, adjust boundaries to keep aspect ratio
- */
- if ($this->keepAspect) {
- list($askedWidth, $askedHeight) =
- $this->applyAspectRatio($askedWidth, $askedHeight, $previewWidth, $previewHeight);
- }
-
- /**
- * Phase 2: Resizes preview to try and match requirements.
- * Takes the scaling ratio into consideration
- */
- list($newPreviewWidth, $newPreviewHeight) = $this->scale(
- $image, $askedWidth, $askedHeight, $previewWidth, $previewHeight
- );
-
- // The preview has been resized and should now have the asked dimensions
- if ($newPreviewWidth === $askedWidth && $newPreviewHeight === $askedHeight) {
- $this->storePreview($fileId, $newPreviewWidth, $newPreviewHeight);
-
- return;
- }
-
- /**
- * Phase 3: We're still not there yet, so we're clipping and filling
- * to match the asked dimensions
- */
- // It turns out the scaled preview is now too big, so we crop the image
- if ($newPreviewWidth >= $askedWidth && $newPreviewHeight >= $askedHeight) {
- $this->crop($image, $askedWidth, $askedHeight, $newPreviewWidth, $newPreviewHeight);
- $this->storePreview($fileId, $askedWidth, $askedHeight);
-
- return;
- }
-
- // At least one dimension of the scaled preview is too small,
- // so we fill the space with a transparent background
- if (($newPreviewWidth < $askedWidth || $newPreviewHeight < $askedHeight)) {
- $this->cropAndFill(
- $image, $askedWidth, $askedHeight, $newPreviewWidth, $newPreviewHeight
- );
- $this->storePreview($fileId, $askedWidth, $askedHeight);
-
- return;
- }
-
- // The preview is smaller, but we can't touch it
- $this->storePreview($fileId, $newPreviewWidth, $newPreviewHeight);
- }
-
- /**
- * Calculates the new dimensions of the preview
- *
- * The new dimensions can be larger or smaller than the ones of the preview we have to resize
- *
- * @param \OCP\IImage $image
- * @param int $askedWidth
- * @param int $askedHeight
- * @param int $previewWidth
- * @param int $previewHeight
- *
- * @return int[]
- */
- private function scale($image, $askedWidth, $askedHeight, $previewWidth, $previewHeight) {
- $scalingUp = $this->getScalingUp();
- $maxScaleFactor = $this->getMaxScaleFactor();
-
- $factorX = $askedWidth / $previewWidth;
- $factorY = $askedHeight / $previewHeight;
-
- if ($factorX >= $factorY) {
- $factor = $factorX;
- } else {
- $factor = $factorY;
- }
-
- if ($scalingUp === false) {
- if ($factor > 1) {
- $factor = 1;
- }
- }
-
- // We cap when upscaling
- if (!is_null($maxScaleFactor)) {
- if ($factor > $maxScaleFactor) {
- \OCP\Util::writeLog(
- 'core', 'scale factor reduced from ' . $factor . ' to ' . $maxScaleFactor,
- \OCP\Util::DEBUG
- );
- $factor = $maxScaleFactor;
- }
- }
-
- $newPreviewWidth = round($previewWidth * $factor);
- $newPreviewHeight = round($previewHeight * $factor);
-
- $image->preciseResize($newPreviewWidth, $newPreviewHeight);
- $this->preview = $image;
-
- return [$newPreviewWidth, $newPreviewHeight];
- }
-
- /**
- * Crops a preview which is larger than the dimensions we've received
- *
- * @param \OCP\IImage $image
- * @param int $askedWidth
- * @param int $askedHeight
- * @param int $previewWidth
- * @param int $previewHeight
- */
- private function crop($image, $askedWidth, $askedHeight, $previewWidth, $previewHeight = null) {
- $cropX = floor(abs($askedWidth - $previewWidth) * 0.5);
- //don't crop previews on the Y axis, this sucks if it's a document.
- //$cropY = floor(abs($y - $newPreviewHeight) * 0.5);
- $cropY = 0;
- $image->crop($cropX, $cropY, $askedWidth, $askedHeight);
- $this->preview = $image;
- }
-
- /**
- * Crops an image if it's larger than the dimensions we've received and fills the empty space
- * with a transparent background
- *
- * @param \OCP\IImage $image
- * @param int $askedWidth
- * @param int $askedHeight
- * @param int $previewWidth
- * @param int $previewHeight
- */
- private function cropAndFill($image, $askedWidth, $askedHeight, $previewWidth, $previewHeight) {
- if ($previewWidth > $askedWidth) {
- $cropX = floor(($previewWidth - $askedWidth) * 0.5);
- $image->crop($cropX, 0, $askedWidth, $previewHeight);
- $previewWidth = $askedWidth;
- }
-
- if ($previewHeight > $askedHeight) {
- $cropY = floor(($previewHeight - $askedHeight) * 0.5);
- $image->crop(0, $cropY, $previewWidth, $askedHeight);
- $previewHeight = $askedHeight;
- }
-
- // Creates a transparent background
- $backgroundLayer = imagecreatetruecolor($askedWidth, $askedHeight);
- imagealphablending($backgroundLayer, false);
- $transparency = imagecolorallocatealpha($backgroundLayer, 0, 0, 0, 127);
- imagefill($backgroundLayer, 0, 0, $transparency);
- imagesavealpha($backgroundLayer, true);
-
- $image = $image->resource();
-
- $mergeX = floor(abs($askedWidth - $previewWidth) * 0.5);
- $mergeY = floor(abs($askedHeight - $previewHeight) * 0.5);
-
- // Pastes the preview on top of the background
- imagecopy(
- $backgroundLayer, $image, $mergeX, $mergeY, 0, 0, $previewWidth,
- $previewHeight
- );
-
- $image = new \OC_Image($backgroundLayer);
-
- $this->preview = $image;
- }
-
- /**
- * Saves a preview in the cache to speed up future calls
- *
- * Do not nullify the preview as it might send the whole process in a loop
- *
- * @param int $fileId fileId of the original image
- * @param int $previewWidth
- * @param int $previewHeight
- */
- private function storePreview($fileId, $previewWidth, $previewHeight) {
- if (empty($previewWidth) || empty($previewHeight)) {
- \OCP\Util::writeLog(
- 'core', 'Cannot save preview of dimension ' . $previewWidth . 'x' . $previewHeight,
- \OCP\Util::DEBUG
- );
-
- } else {
- $cachePath = $this->buildCachePath($fileId, $previewWidth, $previewHeight);
- $this->userView->file_put_contents($cachePath, $this->preview->data());
- }
- }
-
- /**
- * Returns the path to a preview based on its dimensions and aspect
- *
- * @param int $fileId
- * @param int|null $maxX
- * @param int|null $maxY
- *
- * @return string
- */
- private function buildCachePath($fileId, $maxX = null, $maxY = null) {
- if (is_null($maxX)) {
- $maxX = $this->getMaxX();
- }
- if (is_null($maxY)) {
- $maxY = $this->getMaxY();
- }
-
- $previewPath = $this->getPreviewPath($fileId);
- $previewPath = $previewPath . strval($maxX) . '-' . strval($maxY);
- $isMaxPreview =
- ($maxX === $this->maxPreviewWidth && $maxY === $this->maxPreviewHeight) ? true : false;
- if ($isMaxPreview) {
- $previewPath .= '-max';
- }
- if ($this->keepAspect && !$isMaxPreview) {
- $previewPath .= '-with-aspect';
- }
- if ($this->mode === self::MODE_COVER) {
- $previewPath .= '-cover';
- }
- $previewPath .= '.png';
-
- return $previewPath;
- }
-
- /**
- * Returns the path to the folder where the previews are stored, identified by the fileId
- *
- * @param int $fileId
- *
- * @return string
- */
- private function getPreviewPath($fileId) {
- return $this->getThumbnailsFolder() . '/' . $fileId . '/';
- }
-
- /**
- * Asks the provider to send a preview of the file which respects the maximum dimensions
- * defined in the configuration and after saving it in the cache, it is then resized to the
- * asked dimensions
- *
- * This is only called once in order to generate a large PNG of dimensions defined in the
- * configuration file. We'll be able to quickly resize it later on.
- * We never upscale the original conversion as this will be done later by the resizing
- * operation
- *
- * @param int $fileId fileId of the original image
- */
- private function generatePreview($fileId) {
- $file = $this->getFile();
- $preview = null;
-
- $previewProviders = \OC::$server->getPreviewManager()
- ->getProviders();
- foreach ($previewProviders as $supportedMimeType => $providers) {
- if (!preg_match($supportedMimeType, $this->mimeType)) {
- continue;
- }
-
- foreach ($providers as $closure) {
- $provider = $closure();
- if (!($provider instanceof \OCP\Preview\IProvider)) {
- continue;
- }
-
- \OCP\Util::writeLog(
- 'core', 'Generating preview for "' . $file . '" with "' . get_class($provider)
- . '"', \OCP\Util::DEBUG
- );
-
- /** @var $provider Provider */
- $preview = $provider->getThumbnail(
- $file, $this->configMaxWidth, $this->configMaxHeight, $scalingUp = false,
- $this->fileView
- );
-
- if (!($preview instanceof \OCP\IImage)) {
- continue;
- }
-
- $this->preview = $preview;
- $previewPath = $this->getPreviewPath($fileId);
-
- if ($this->userView->is_dir($this->getThumbnailsFolder() . '/') === false) {
- $this->userView->mkdir($this->getThumbnailsFolder() . '/');
- }
-
- if ($this->userView->is_dir($previewPath) === false) {
- $this->userView->mkdir($previewPath);
- }
-
- // This stores our large preview so that it can be used in subsequent resizing requests
- $this->storeMaxPreview($previewPath);
-
- break 2;
- }
- }
-
- // The providers have been kind enough to give us a preview
- if ($preview) {
- $this->resizeAndStore($fileId);
- }
- }
-
- /**
- * Defines the media icon, for the media type of the original file, as the preview
- * @throws PreviewNotAvailableException
- */
- private function getMimeIcon() {
- $image = new \OC_Image();
- $mimeIconWebPath = \OC::$server->getMimeTypeDetector()->mimeTypeIcon($this->mimeType);
- if (empty(\OC::$WEBROOT)) {
- $mimeIconServerPath = \OC::$SERVERROOT . $mimeIconWebPath;
- } else {
- $mimeIconServerPath = str_replace(\OC::$WEBROOT, \OC::$SERVERROOT, $mimeIconWebPath);
- }
- // we can't load SVGs into an image
- if (substr($mimeIconWebPath, -4) === '.svg') {
- throw new PreviewNotAvailableException('SVG mimetype cannot be rendered');
- }
- $image->loadFromFile($mimeIconServerPath);
-
- $this->preview = $image;
- }
-
- /**
- * Stores the max preview in the cache
- *
- * @param string $previewPath path to the preview
- */
- private function storeMaxPreview($previewPath) {
- $maxPreviewExists = false;
- $preview = $this->preview;
-
- $allThumbnails = $this->userView->getDirectoryContent($previewPath);
- // This is so that the cache doesn't need emptying when upgrading
- // Can be replaced by an upgrade script...
- foreach ($allThumbnails as $thumbnail) {
- $name = rtrim($thumbnail['name'], '.png');
- if (strpos($name, 'max')) {
- $maxPreviewExists = true;
- break;
- }
- }
- // We haven't found the max preview, so we create it
- if (!$maxPreviewExists) {
- $previewWidth = $preview->width();
- $previewHeight = $preview->height();
- $previewPath = $previewPath . strval($previewWidth) . '-' . strval($previewHeight);
- $previewPath .= '-max.png';
- $this->userView->file_put_contents($previewPath, $preview->data());
- $this->maxPreviewWidth = $previewWidth;
- $this->maxPreviewHeight = $previewHeight;
- }
- }
-
- /**
- * Limits a dimension to the maximum dimension provided as argument
- *
- * @param int $dim
- * @param int $maxDim
- * @param string $dimName
- *
- * @return integer
- */
- private function limitMaxDim($dim, $maxDim, $dimName) {
- if (!is_null($maxDim)) {
- if ($dim > $maxDim) {
- \OCP\Util::writeLog(
- 'core', $dimName . ' reduced from ' . $dim . ' to ' . $maxDim, \OCP\Util::DEBUG
- );
- $dim = $maxDim;
- }
- }
-
- return $dim;
- }
-
- /**
- * @param array $args
- */
- public static function post_write($args) {
- self::post_delete($args, 'files/');
- }
-
- /**
- * @param array $args
- */
- public static function prepare_delete_files($args) {
- self::prepare_delete($args, 'files/');
- }
-
- /**
- * @param array $args
- * @param string $prefix
- */
- public static function prepare_delete(array $args, $prefix = '') {
- $path = $args['path'];
- if (substr($path, 0, 1) === '/') {
- $path = substr($path, 1);
- }
-
- $view = new \OC\Files\View('/' . \OC_User::getUser() . '/' . $prefix);
-
- $absPath = Files\Filesystem::normalizePath($view->getAbsolutePath($path));
- $fileInfo = $view->getFileInfo($path);
- if ($fileInfo === false) {
- return;
- }
- self::addPathToDeleteFileMapper($absPath, $fileInfo);
- if ($view->is_dir($path)) {
- $children = self::getAllChildren($view, $path);
- self::$deleteChildrenMapper[$absPath] = $children;
- }
- }
-
- /**
- * @param string $absolutePath
- * @param \OCP\Files\FileInfo $info
- */
- private static function addPathToDeleteFileMapper($absolutePath, $info) {
- self::$deleteFileMapper[$absolutePath] = $info;
- }
-
- /**
- * @param \OC\Files\View $view
- * @param string $path
- *
- * @return array
- */
- private static function getAllChildren($view, $path) {
- $children = $view->getDirectoryContent($path);
- $childrensFiles = array();
-
- $fakeRootLength = strlen($view->getRoot());
-
- for ($i = 0; $i < count($children); $i++) {
- $child = $children[$i];
-
- $childsPath = substr($child->getPath(), $fakeRootLength);
-
- if ($view->is_dir($childsPath)) {
- $children = array_merge(
- $children,
- $view->getDirectoryContent($childsPath)
- );
- } else {
- $childrensFiles[] = $child;
- }
- }
-
- return $childrensFiles;
- }
-
- /**
- * @param array $args
- */
- public static function post_delete_files($args) {
- self::post_delete($args, 'files/');
- }
-
- /**
- * @param array $args
- */
- public static function post_delete_versions($args) {
- self::post_delete($args, 'files/');
- }
-
- /**
- * @param array $args
- * @param string $prefix
- */
- public static function post_delete($args, $prefix = '') {
- $path = Files\Filesystem::normalizePath($args['path']);
-
- $preview = new Preview(\OC_User::getUser(), $prefix, $path);
- $preview->deleteAllPreviews();
- }
-
-}
diff --git a/lib/private/PreviewManager.php b/lib/private/PreviewManager.php
index 36b3730a720..8c5a7ad29f1 100644
--- a/lib/private/PreviewManager.php
+++ b/lib/private/PreviewManager.php
@@ -68,6 +68,9 @@ class PreviewManager implements IPreview {
/** @var array */
protected $defaultProviders;
+ /** @var string */
+ protected $userId;
+
/**
* PreviewManager constructor.
*
@@ -75,15 +78,18 @@ class PreviewManager implements IPreview {
* @param IRootFolder $rootFolder
* @param IAppData $appData
* @param EventDispatcherInterface $eventDispatcher
+ * @param string $userId
*/
public function __construct(IConfig $config,
IRootFolder $rootFolder,
IAppData $appData,
- EventDispatcherInterface $eventDispatcher) {
+ EventDispatcherInterface $eventDispatcher,
+ $userId) {
$this->config = $config;
$this->rootFolder = $rootFolder;
$this->appData = $appData;
$this->eventDispatcher = $eventDispatcher;
+ $this->userId = $userId;
}
/**
@@ -144,10 +150,22 @@ class PreviewManager implements IPreview {
* @param int $maxY The maximum Y size of the thumbnail. It can be smaller depending on the shape of the image
* @param boolean $scaleUp Scale smaller images up to the thumbnail size or not. Might look ugly
* @return \OCP\IImage
+ * @deprecated 11 Use getPreview
*/
public function createPreview($file, $maxX = 100, $maxY = 75, $scaleUp = false) {
- $preview = new \OC\Preview('', '/', $file, $maxX, $maxY, $scaleUp);
- return $preview->getPreview();
+ try {
+ $userRoot = $this->rootFolder->getUserFolder($this->userId)->getParent();
+ $node = $userRoot->get($file);
+ if (!($file instanceof File)) {
+ throw new NotFoundException();
+ }
+
+ $preview = $this->getPreview($node, $maxX, $maxY);
+ } catch (\Exception $e) {
+ return new \OC_Image();
+ }
+
+ return new \OC_Image($preview->getContent());
}
/**
diff --git a/lib/private/Repair.php b/lib/private/Repair.php
index c212ea90744..e8d466cd844 100644
--- a/lib/private/Repair.php
+++ b/lib/private/Repair.php
@@ -31,12 +31,12 @@
namespace OC;
use OC\Repair\AssetCache;
-use OC\Repair\AvatarPermissions;
use OC\Repair\CleanTags;
use OC\Repair\Collation;
use OC\Repair\DropOldJobs;
use OC\Repair\MoveUpdaterStepFile;
use OC\Repair\NC11\CleanPreviews;
+use OC\Repair\NC11\FixMountStorages;
use OC\Repair\NC11\MoveAvatars;
use OC\Repair\OldGroupMembershipShares;
use OC\Repair\RemoveGetETagEntries;
@@ -47,7 +47,6 @@ use OC\Repair\SqliteAutoincrement;
use OC\Repair\DropOldTables;
use OC\Repair\FillETags;
use OC\Repair\InnoDB;
-use OC\Repair\RepairLegacyStorages;
use OC\Repair\RepairMimeTypes;
use OC\Repair\SearchLuceneTables;
use OC\Repair\UpdateOutdatedOcsIds;
@@ -132,7 +131,6 @@ class Repair implements IOutput{
return [
new Collation(\OC::$server->getConfig(), \OC::$server->getLogger(), \OC::$server->getDatabaseConnection(), false),
new RepairMimeTypes(\OC::$server->getConfig()),
- new RepairLegacyStorages(\OC::$server->getConfig(), \OC::$server->getDatabaseConnection()),
new AssetCache(),
new FillETags(\OC::$server->getDatabaseConnection()),
new CleanTags(\OC::$server->getDatabaseConnection(), \OC::$server->getUserManager()),
@@ -143,7 +141,6 @@ class Repair implements IOutput{
new RepairInvalidShares(\OC::$server->getConfig(), \OC::$server->getDatabaseConnection()),
new SharePropagation(\OC::$server->getConfig()),
new RemoveOldShares(\OC::$server->getDatabaseConnection()),
- new AvatarPermissions(\OC::$server->getDatabaseConnection()),
new RemoveRootShares(\OC::$server->getDatabaseConnection(), \OC::$server->getUserManager(), \OC::$server->getLazyRootFolder()),
new RepairUnmergedShares(
\OC::$server->getConfig(),
@@ -161,6 +158,7 @@ class Repair implements IOutput{
\OC::$server->getUserManager(),
\OC::$server->getConfig()
),
+ new FixMountStorages(\OC::$server->getDatabaseConnection()),
];
}
diff --git a/lib/private/Repair/AvatarPermissions.php b/lib/private/Repair/AvatarPermissions.php
deleted file mode 100644
index 9d75062358c..00000000000
--- a/lib/private/Repair/AvatarPermissions.php
+++ /dev/null
@@ -1,116 +0,0 @@
-<?php
-/**
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- *
- * @author Roeland Jago Douma <roeland@famdouma.nl>
- *
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program 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, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
- */
-namespace OC\Repair;
-
-use Doctrine\DBAL\Platforms\OraclePlatform;
-use OCP\IDBConnection;
-use OCP\Migration\IOutput;
-use OCP\Migration\IRepairStep;
-
-/**
- * Class AvatarPermissions
- *
- * @package OC\Repair
- */
-class AvatarPermissions implements IRepairStep {
- /** @var IDBConnection */
- private $connection;
-
- /**
- * AvatarPermissions constructor.
- *
- * @param IDBConnection $connection
- */
- public function __construct(IDBConnection $connection) {
- $this->connection = $connection;
- }
-
- /**
- * @return string
- */
- public function getName() {
- return 'Fix permissions so avatars can be stored again';
- }
-
- /**
- * @param IOutput $output
- */
- public function run(IOutput $output) {
- $output->startProgress(2);
- $this->fixUserRootPermissions();
- $output->advance();
- $this->fixAvatarPermissions();
- $output->finishProgress();
- }
-
- /**
- * Make sure all user roots have permissions 23 (all but share)
- */
- protected function fixUserRootPermissions() {
- $qb = $this->connection->getQueryBuilder();
- $qb2 = $this->connection->getQueryBuilder();
-
- $qb->select('numeric_id')
- ->from('storages')
- ->where($qb->expr()->like('id', $qb2->createParameter('like')));
-
- if ($this->connection->getDatabasePlatform() instanceof OraclePlatform) {
- // '' is null on oracle
- $path = $qb2->expr()->isNull('path');
- } else {
- $path = $qb2->expr()->eq('path', $qb2->createNamedParameter(''));
- }
-
- $qb2->update('filecache')
- ->set('permissions', $qb2->createNamedParameter(23))
- ->where($path)
- ->andWhere($qb2->expr()->in('storage', $qb2->createFunction($qb->getSQL())))
- ->andWhere($qb2->expr()->neq('permissions', $qb2->createNamedParameter(23)))
- ->setParameter('like', 'home::%');
-
-
- $qb2->execute();
- }
-
- /**
- * Make sure all avatar files in the user roots have permission 27
- */
- protected function fixAvatarPermissions() {
- $qb = $this->connection->getQueryBuilder();
- $qb2 = $this->connection->getQueryBuilder();
-
- $qb->select('numeric_id')
- ->from('storages')
- ->where($qb->expr()->like('id', $qb2->createParameter('like')));
-
- $qb2->update('filecache')
- ->set('permissions', $qb2->createNamedParameter(27))
- ->where($qb2->expr()->like('path', $qb2->createNamedParameter('avatar.%')))
- ->andWhere($qb2->expr()->in('storage', $qb2->createFunction($qb->getSQL())))
- ->andWhere($qb2->expr()->neq('permissions', $qb2->createNamedParameter(27)))
- ->setParameter('like', 'home::%');
-
- $qb2->execute();
- }
-
-}
-
diff --git a/lib/private/Repair/Collation.php b/lib/private/Repair/Collation.php
index 54de1a719bd..a3535fb33a2 100644
--- a/lib/private/Repair/Collation.php
+++ b/lib/private/Repair/Collation.php
@@ -75,6 +75,18 @@ class Collation implements IRepairStep {
$tables = $this->getAllNonUTF8BinTables($this->connection);
foreach ($tables as $table) {
+ $output->info("Change row format for $table ...");
+ $query = $this->connection->prepare('ALTER TABLE `' . $table . '` ROW_FORMAT = DYNAMIC;');
+ try {
+ $query->execute();
+ } catch (DriverException $e) {
+ // Just log this
+ $this->logger->logException($e);
+ if (!$this->ignoreFailures) {
+ throw $e;
+ }
+ }
+
$output->info("Change collation for $table ...");
$query = $this->connection->prepare('ALTER TABLE `' . $table . '` CONVERT TO CHARACTER SET ' . $characterSet . ' COLLATE ' . $characterSet . '_bin;');
try {
diff --git a/lib/private/Repair/MoveUpdaterStepFile.php b/lib/private/Repair/MoveUpdaterStepFile.php
index fabaff40d24..feb8a291282 100644
--- a/lib/private/Repair/MoveUpdaterStepFile.php
+++ b/lib/private/Repair/MoveUpdaterStepFile.php
@@ -44,7 +44,7 @@ class MoveUpdaterStepFile implements IRepairStep {
public function run(IOutput $output) {
- $dataDir = $this->config->getSystemValue('datadirectory', \OC::$SERVERROOT);
+ $dataDir = $this->config->getSystemValue('datadirectory', \OC::$SERVERROOT . '/data');
$instanceId = $this->config->getSystemValue('instanceid', null);
if(!is_string($instanceId) || empty($instanceId)) {
diff --git a/lib/private/Repair/NC11/FixMountStorages.php b/lib/private/Repair/NC11/FixMountStorages.php
new file mode 100644
index 00000000000..d57a356dff9
--- /dev/null
+++ b/lib/private/Repair/NC11/FixMountStorages.php
@@ -0,0 +1,78 @@
+<?php
+/**
+ * @copyright 2016 Joas Schilling <coding@schilljs.com>
+ *
+ * @author Joas Schilling <coding@schilljs.com>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program 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 program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+namespace OC\Repair\NC11;
+
+use OCP\DB\QueryBuilder\IQueryBuilder;
+use OCP\IDBConnection;
+use OCP\Migration\IOutput;
+use OCP\Migration\IRepairStep;
+
+class FixMountStorages implements IRepairStep {
+
+ /** @var IDBConnection */
+ private $db;
+
+ /**
+ * @param IDBConnection $db
+ */
+ public function __construct(IDBConnection $db) {
+ $this->db = $db;
+ }
+
+ /**
+ * @return string
+ */
+ public function getName() {
+ return 'Fix potential broken mount points';
+ }
+
+ public function run(IOutput $output) {
+ $query = $this->db->getQueryBuilder();
+ $query->select('m.id', 'f.storage')
+ ->from('mounts', 'm')
+ ->leftJoin('m', 'filecache', 'f', $query->expr()->eq('m.root_id', 'f.fileid'))
+ ->where($query->expr()->neq('m.storage_id', 'f.storage'));
+
+ $update = $this->db->getQueryBuilder();
+ $update->update('mounts')
+ ->set('storage_id', $update->createParameter('storage'))
+ ->where($query->expr()->eq('id', $update->createParameter('mount')));
+
+ $result = $query->execute();
+ $entriesUpdated = 0;
+ while ($row = $result->fetch()) {
+ $update->setParameter('storage', $row['storage'], IQueryBuilder::PARAM_INT)
+ ->setParameter('mount', $row['id'], IQueryBuilder::PARAM_INT);
+ $update->execute();
+ $entriesUpdated++;
+ }
+ $result->closeCursor();
+
+ if ($entriesUpdated > 0) {
+ $output->info($entriesUpdated . ' mounts updated');
+ return;
+ }
+
+ $output->info('No mounts updated');
+ }
+}
diff --git a/lib/private/Repair/NC11/MoveAvatarBackgroundJob.php b/lib/private/Repair/NC11/MoveAvatarsBackgroundJob.php
index f8c0d9b3abf..f8c0d9b3abf 100644
--- a/lib/private/Repair/NC11/MoveAvatarBackgroundJob.php
+++ b/lib/private/Repair/NC11/MoveAvatarsBackgroundJob.php
diff --git a/lib/private/Repair/RepairInvalidShares.php b/lib/private/Repair/RepairInvalidShares.php
index 6cb690057bb..04624c910dd 100644
--- a/lib/private/Repair/RepairInvalidShares.php
+++ b/lib/private/Repair/RepairInvalidShares.php
@@ -27,6 +27,7 @@ namespace OC\Repair;
use OCP\Migration\IOutput;
use OCP\Migration\IRepairStep;
+use Doctrine\DBAL\Platforms\OraclePlatform;
/**
* Repairs shares with invalid data
@@ -92,6 +93,26 @@ class RepairInvalidShares implements IRepairStep {
}
/**
+ * Adjust file share permissions
+ */
+ private function adjustFileSharePermissions(IOutput $out) {
+ $mask = \OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_UPDATE | \OCP\Constants::PERMISSION_SHARE;
+ $builder = $this->connection->getQueryBuilder();
+
+ $permsFunc = $builder->expr()->bitwiseAnd('permissions', $mask);
+ $builder
+ ->update('share')
+ ->set('permissions', $permsFunc)
+ ->where($builder->expr()->eq('item_type', $builder->expr()->literal('file')))
+ ->andWhere($builder->expr()->neq('permissions', $permsFunc));
+
+ $updatedEntries = $builder->execute();
+ if ($updatedEntries > 0) {
+ $out->info('Fixed file share permissions for ' . $updatedEntries . ' shares');
+ }
+ }
+
+ /**
* Remove shares where the parent share does not exist anymore
*/
private function removeSharesNonExistingParent(IOutput $out) {
@@ -137,6 +158,9 @@ class RepairInvalidShares implements IRepairStep {
// this situation was only possible before 9.1
$this->addShareLinkDeletePermission($out);
}
+ if (version_compare($ocVersionFromBeforeUpdate, '12.0.0.11', '<')) {
+ $this->adjustFileSharePermissions($out);
+ }
$this->removeSharesNonExistingParent($out);
}
diff --git a/lib/private/Repair/RepairLegacyStorages.php b/lib/private/Repair/RepairLegacyStorages.php
deleted file mode 100644
index 228bdb67fe8..00000000000
--- a/lib/private/Repair/RepairLegacyStorages.php
+++ /dev/null
@@ -1,257 +0,0 @@
-<?php
-/**
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- *
- * @author Aaron Wood <aaronjwood@gmail.com>
- * @author Joas Schilling <coding@schilljs.com>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- * @author Vincent Petry <pvince81@owncloud.com>
- *
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program 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, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
- */
-
-namespace OC\Repair;
-
-use OC\Files\Cache\Storage;
-use OC\RepairException;
-use OCP\Migration\IOutput;
-use OCP\Migration\IRepairStep;
-
-class RepairLegacyStorages implements IRepairStep{
- /**
- * @var \OCP\IConfig
- */
- protected $config;
-
- /**
- * @var \OCP\IDBConnection
- */
- protected $connection;
-
- protected $findStorageInCacheStatement;
- protected $renameStorageStatement;
-
- /**
- * @param \OCP\IConfig $config
- * @param \OCP\IDBConnection $connection
- */
- public function __construct($config, $connection) {
- $this->connection = $connection;
- $this->config = $config;
-
- $this->findStorageInCacheStatement = $this->connection->prepare(
- 'SELECT DISTINCT `storage` FROM `*PREFIX*filecache`'
- . ' WHERE `storage` in (?, ?)'
- );
- $this->renameStorageStatement = $this->connection->prepare(
- 'UPDATE `*PREFIX*storages`'
- . ' SET `id` = ?'
- . ' WHERE `id` = ?'
- );
- }
-
- public function getName() {
- return 'Repair legacy storages';
- }
-
- /**
- * Extracts the user id from a legacy storage id
- *
- * @param string $storageId legacy storage id in the
- * format "local::/path/to/datadir/userid"
- * @return string user id extracted from the storage id
- */
- private function extractUserId($storageId) {
- $storageId = rtrim($storageId, '/');
- $pos = strrpos($storageId, '/');
- return substr($storageId, $pos + 1);
- }
-
- /**
- * Fix the given legacy storage by renaming the old id
- * to the new id. If the new id already exists, whichever
- * storage that has data in the file cache will be used.
- * If both have data, nothing will be done and false is
- * returned.
- *
- * @param string $oldId old storage id
- * @param int $oldNumericId old storage numeric id
- * @param string $userId
- * @return bool true if fixed, false otherwise
- * @throws RepairException
- */
- private function fixLegacyStorage($oldId, $oldNumericId, $userId = null) {
- // check whether the new storage already exists
- if (is_null($userId)) {
- $userId = $this->extractUserId($oldId);
- }
- $newId = 'home::' . $userId;
-
- // check if target id already exists
- $newNumericId = Storage::getNumericStorageId($newId);
- if (!is_null($newNumericId)) {
- $newNumericId = (int)$newNumericId;
- // try and resolve the conflict
- // check which one of "local::" or "home::" needs to be kept
- $this->findStorageInCacheStatement->execute(array($oldNumericId, $newNumericId));
- $row1 = $this->findStorageInCacheStatement->fetch();
- $row2 = $this->findStorageInCacheStatement->fetch();
- $this->findStorageInCacheStatement->closeCursor();
- if ($row2 !== false) {
- // two results means both storages have data, not auto-fixable
- throw new RepairException(
- 'Could not automatically fix legacy storage '
- . '"' . $oldId . '" => "' . $newId . '"'
- . ' because they both have data.'
- );
- }
- if ($row1 === false || (int)$row1['storage'] === $oldNumericId) {
- // old storage has data, then delete the empty new id
- $toDelete = $newId;
- } else if ((int)$row1['storage'] === $newNumericId) {
- // new storage has data, then delete the empty old id
- $toDelete = $oldId;
- } else {
- // unknown case, do not continue
- return false;
- }
-
- // delete storage including file cache
- Storage::remove($toDelete);
-
- // if we deleted the old id, the new id will be used
- // automatically
- if ($toDelete === $oldId) {
- // nothing more to do
- return true;
- }
- }
-
- // rename old id to new id
- $newId = Storage::adjustStorageId($newId);
- $oldId = Storage::adjustStorageId($oldId);
- $rowCount = $this->renameStorageStatement->execute(array($newId, $oldId));
- $this->renameStorageStatement->closeCursor();
- return ($rowCount === 1);
- }
-
- /**
- * Converts legacy home storage ids in the format
- * "local::/data/dir/path/userid/" to the new format "home::userid"
- */
- public function run(IOutput $out) {
- // only run once
- if ($this->config->getAppValue('core', 'repairlegacystoragesdone') === 'yes') {
- return;
- }
-
- $dataDir = $this->config->getSystemValue('datadirectory', \OC::$SERVERROOT . '/data/');
- $dataDir = rtrim($dataDir, '/') . '/';
- $dataDirId = 'local::' . $dataDir;
-
- $count = 0;
- $hasWarnings = false;
-
- $this->connection->beginTransaction();
-
- // note: not doing a direct UPDATE with the REPLACE function
- // because regexp search/extract is needed and it is not guaranteed
- // to work on all database types
- $sql = 'SELECT `id`, `numeric_id` FROM `*PREFIX*storages`'
- . ' WHERE `id` LIKE ?'
- . ' ORDER BY `id`';
- $result = $this->connection->executeQuery($sql, array($this->connection->escapeLikeParameter($dataDirId) . '%'));
-
- while ($row = $result->fetch()) {
- $currentId = $row['id'];
- // one entry is the datadir itself
- if ($currentId === $dataDirId) {
- continue;
- }
-
- try {
- if ($this->fixLegacyStorage($currentId, (int)$row['numeric_id'])) {
- $count++;
- }
- }
- catch (RepairException $e) {
- $hasWarnings = true;
- $out->warning('Could not repair legacy storage ' . $currentId . ' automatically.');
- }
- }
-
- // check for md5 ids, not in the format "prefix::"
- $sql = 'SELECT COUNT(*) AS "c" FROM `*PREFIX*storages`'
- . ' WHERE `id` NOT LIKE \'%::%\'';
- $result = $this->connection->executeQuery($sql);
- $row = $result->fetch();
-
- // find at least one to make sure it's worth
- // querying the user list
- if ((int)$row['c'] > 0) {
- $userManager = \OC::$server->getUserManager();
-
- // use chunks to avoid caching too many users in memory
- $limit = 30;
- $offset = 0;
-
- do {
- // query the next page of users
- $results = $userManager->search('', $limit, $offset);
- $storageIds = array();
- foreach ($results as $uid => $userObject) {
- $storageId = $dataDirId . $uid . '/';
- if (strlen($storageId) <= 64) {
- // skip short storage ids as they were handled in the previous section
- continue;
- }
- $storageIds[$uid] = $storageId;
- }
-
- if (count($storageIds) > 0) {
- // update the storages of these users
- foreach ($storageIds as $uid => $storageId) {
- $numericId = Storage::getNumericStorageId($storageId);
- try {
- if (!is_null($numericId) && $this->fixLegacyStorage($storageId, (int)$numericId)) {
- $count++;
- }
- }
- catch (RepairException $e) {
- $hasWarnings = true;
- $out->warning('Could not repair legacy storage ' . $storageId . ' automatically.');
- }
- }
- }
- $offset += $limit;
- } while (count($results) >= $limit);
- }
-
- $out->info('Updated ' . $count . ' legacy home storage ids');
-
- $this->connection->commit();
-
- Storage::getGlobalCache()->clearCache();
-
- if ($hasWarnings) {
- $out->warning('Some legacy storages could not be repaired. Please manually fix them then re-run ./occ maintenance:repair');
- } else {
- // if all were done, no need to redo the repair during next upgrade
- $this->config->setAppValue('core', 'repairlegacystoragesdone', 'yes');
- }
- }
-}
diff --git a/lib/private/Security/Bruteforce/Throttler.php b/lib/private/Security/Bruteforce/Throttler.php
index 031c5ffd411..765f109fdb3 100644
--- a/lib/private/Security/Bruteforce/Throttler.php
+++ b/lib/private/Security/Bruteforce/Throttler.php
@@ -189,9 +189,10 @@ class Throttler {
* Get the throttling delay (in milliseconds)
*
* @param string $ip
+ * @param string $action optionally filter by action
* @return int
*/
- public function getDelay($ip) {
+ public function getDelay($ip, $action = '') {
$cutoffTime = (new \DateTime())
->sub($this->getCutoff(43200))
->getTimestamp();
@@ -201,6 +202,11 @@ class Throttler {
->from('bruteforce_attempts')
->where($qb->expr()->gt('occurred', $qb->createNamedParameter($cutoffTime)))
->andWhere($qb->expr()->eq('subnet', $qb->createNamedParameter($this->getSubnet($ip))));
+
+ if ($action !== '') {
+ $qb->andWhere($qb->expr()->eq('action', $qb->createNamedParameter($action)));
+ }
+
$attempts = count($qb->execute()->fetchAll());
if ($attempts === 0) {
@@ -225,10 +231,11 @@ class Throttler {
* Will sleep for the defined amount of time
*
* @param string $ip
+ * @param string $action optionally filter by action
* @return int the time spent sleeping
*/
- public function sleepDelay($ip) {
- $delay = $this->getDelay($ip);
+ public function sleepDelay($ip, $action = '') {
+ $delay = $this->getDelay($ip, $action);
usleep($delay * 1000);
return $delay;
}
diff --git a/lib/private/Security/CSP/ContentSecurityPolicyNonceManager.php b/lib/private/Security/CSP/ContentSecurityPolicyNonceManager.php
index 284700566d6..85ae127f5f1 100644
--- a/lib/private/Security/CSP/ContentSecurityPolicyNonceManager.php
+++ b/lib/private/Security/CSP/ContentSecurityPolicyNonceManager.php
@@ -69,8 +69,6 @@ class ContentSecurityPolicyNonceManager {
Request::USER_AGENT_CHROME,
// Firefox 45+
'/^Mozilla\/5\.0 \([^)]+\) Gecko\/[0-9.]+ Firefox\/(4[5-9]|[5-9][0-9])\.[0-9.]+$/',
- // Safari 10+
- '/^Mozilla\/5\.0 \([^)]+\) AppleWebKit\/[0-9.]+ \(KHTML, like Gecko\) Version\/1[0-9.]+ Safari\/[0-9.A-Z]+$/',
];
if($this->request->isUserAgent($browserWhitelist)) {
diff --git a/lib/private/Security/CertificateManager.php b/lib/private/Security/CertificateManager.php
index f7bf0df58c5..461ef9457a7 100644
--- a/lib/private/Security/CertificateManager.php
+++ b/lib/private/Security/CertificateManager.php
@@ -30,6 +30,7 @@ namespace OC\Security;
use OC\Files\Filesystem;
use OCP\ICertificateManager;
use OCP\IConfig;
+use OCP\ILogger;
/**
* Manage trusted certificates for users
@@ -51,14 +52,21 @@ class CertificateManager implements ICertificateManager {
protected $config;
/**
+ * @var ILogger
+ */
+ protected $logger;
+
+ /**
* @param string $uid
* @param \OC\Files\View $view relative to data/
* @param IConfig $config
+ * @param ILogger $logger
*/
- public function __construct($uid, \OC\Files\View $view, IConfig $config) {
+ public function __construct($uid, \OC\Files\View $view, IConfig $config, ILogger $logger) {
$this->uid = $uid;
$this->view = $view;
$this->config = $config;
+ $this->logger = $logger;
}
/**
@@ -104,6 +112,13 @@ class CertificateManager implements ICertificateManager {
$this->view->mkdir($path);
}
+ $defaultCertificates = file_get_contents(\OC::$SERVERROOT . '/resources/config/ca-bundle.crt');
+ if (strlen($defaultCertificates) < 1024) { // sanity check to verify that we have some content for our bundle
+ // log as exception so we have a stacktrace
+ $this->logger->logException(new \Exception('Shipped ca-bundle is empty, refusing to create certificate bundle'));
+ return;
+ }
+
$fhCerts = $this->view->fopen($path . '/rootcerts.crt', 'w');
// Write user certificates
@@ -117,7 +132,6 @@ class CertificateManager implements ICertificateManager {
}
// Append the default certificates
- $defaultCertificates = file_get_contents(\OC::$SERVERROOT . '/resources/config/ca-bundle.crt');
fwrite($fhCerts, $defaultCertificates);
// Append the system certificate bundle
@@ -203,7 +217,7 @@ class CertificateManager implements ICertificateManager {
}
if ($this->needsRebundling($uid)) {
if (is_null($uid)) {
- $manager = new CertificateManager(null, $this->view, $this->config);
+ $manager = new CertificateManager(null, $this->view, $this->config, $this->logger);
$manager->createCertificateBundle();
} else {
$this->createCertificateBundle();
diff --git a/lib/private/Server.php b/lib/private/Server.php
index 2c0aac9b43c..3c716ae6ce6 100644
--- a/lib/private/Server.php
+++ b/lib/private/Server.php
@@ -45,8 +45,8 @@ use bantu\IniGetWrapper\IniGetWrapper;
use OC\App\AppStore\Fetcher\AppFetcher;
use OC\App\AppStore\Fetcher\CategoryFetcher;
use OC\AppFramework\Http\Request;
-use OC\AppFramework\Db\Db;
use OC\AppFramework\Utility\TimeFactory;
+use OC\Authentication\LoginCredentials\Store;
use OC\Command\AsyncBus;
use OC\Diagnostics\EventLogger;
use OC\Diagnostics\NullEventLogger;
@@ -90,6 +90,7 @@ use OC\Security\TrustedDomainHelper;
use OC\Session\CryptoWrapper;
use OC\Tagging\TagMapper;
use OCA\Theming\ThemingDefaults;
+use OCP\Authentication\LoginCredentials\IStore;
use OCP\IL10N;
use OCP\IServerContainer;
use OCP\RichObjectStrings\IValidator;
@@ -125,7 +126,8 @@ class Server extends ServerContainer implements IServerContainer {
$c->getConfig(),
$c->getRootFolder(),
$c->getAppDataDir('preview'),
- $c->getEventDispatcher()
+ $c->getEventDispatcher(),
+ $c->getSession()->get('user_id')
);
});
@@ -246,6 +248,17 @@ class Server extends ServerContainer implements IServerContainer {
});
return $groupManager;
});
+ $this->registerService(Store::class, function(Server $c) {
+ $session = $c->getSession();
+ if (\OC::$server->getSystemConfig()->getValue('installed', false)) {
+ $tokenProvider = $c->query('OC\Authentication\Token\IProvider');
+ } else {
+ $tokenProvider = null;
+ }
+ $logger = $c->getLogger();
+ return new Store($session, $logger, $tokenProvider);
+ });
+ $this->registerAlias(IStore::class, Store::class);
$this->registerService('OC\Authentication\Token\DefaultTokenMapper', function (Server $c) {
$dbConnection = $c->getDatabaseConnection();
return new Authentication\Token\DefaultTokenMapper($dbConnection);
@@ -313,11 +326,15 @@ class Server extends ServerContainer implements IServerContainer {
});
$this->registerService(\OC\Authentication\TwoFactorAuth\Manager::class, function (Server $c) {
- return new \OC\Authentication\TwoFactorAuth\Manager($c->getAppManager(), $c->getSession(), $c->getConfig());
+ return new \OC\Authentication\TwoFactorAuth\Manager($c->getAppManager(), $c->getSession(), $c->getConfig(), $c->getActivityManager(), $c->getLogger());
});
- $this->registerService('NavigationManager', function ($c) {
- return new \OC\NavigationManager();
+ $this->registerService('NavigationManager', function (Server $c) {
+ return new \OC\NavigationManager($c->getAppManager(),
+ $c->getURLGenerator(),
+ $c->getL10NFactory(),
+ $c->getUserSession(),
+ $c->getGroupManager());
});
$this->registerService('AllConfig', function (Server $c) {
return new \OC\AllConfig(
@@ -361,7 +378,8 @@ class Server extends ServerContainer implements IServerContainer {
return new CategoryFetcher(
$this->getAppDataDir('appstore'),
$this->getHTTPClientService(),
- $this->query(TimeFactory::class)
+ $this->query(TimeFactory::class),
+ $this->getConfig()
);
});
$this->registerService('UserCache', function ($c) {
@@ -376,7 +394,7 @@ class Server extends ServerContainer implements IServerContainer {
$version = implode(',', $v);
$instanceId = \OC_Util::getInstanceId();
$path = \OC::$SERVERROOT;
- $prefix = md5($instanceId . '-' . $version . '-' . $path);
+ $prefix = md5($instanceId . '-' . $version . '-' . $path . '-' . \OC::$WEBROOT);
return new \OC\Memcache\Factory($prefix, $c->getLogger(),
$config->getSystemValue('memcache.local', null),
$config->getSystemValue('memcache.distributed', null),
@@ -418,9 +436,8 @@ class Server extends ServerContainer implements IServerContainer {
);
});
$this->registerService('Logger', function (Server $c) {
- $logClass = $c->query('AllConfig')->getSystemValue('log_type', 'file');
- // TODO: Drop backwards compatibility for config in the future
- $logger = 'OC\\Log\\' . ucfirst($logClass=='owncloud' ? 'file' : $logClass);
+ $logType = $c->query('AllConfig')->getSystemValue('log_type', 'file');
+ $logger = Log::getLogClass($logType);
call_user_func(array($logger, 'init'));
return new Log($logger);
@@ -470,9 +487,6 @@ class Server extends ServerContainer implements IServerContainer {
$connection->getConfiguration()->setSQLLogger($c->getQueryLogger());
return $connection;
});
- $this->registerService('Db', function (Server $c) {
- return new Db($c->getDatabaseConnection());
- });
$this->registerService('HTTPHelper', function (Server $c) {
$config = $c->getConfig();
return new HTTPHelper(
@@ -485,7 +499,7 @@ class Server extends ServerContainer implements IServerContainer {
$uid = $user ? $user : null;
return new ClientService(
$c->getConfig(),
- new \OC\Security\CertificateManager($uid, new View(), $c->getConfig())
+ new \OC\Security\CertificateManager($uid, new View(), $c->getConfig(), $c->getLogger())
);
});
$this->registerService('EventLogger', function (Server $c) {
@@ -794,7 +808,9 @@ class Server extends ServerContainer implements IServerContainer {
$c->getConfig(),
$c->getEncryptionManager(),
$c->getUserManager(),
- $c->getLockingProvider()
+ $c->getLockingProvider(),
+ new \OC\Settings\Mapper($c->getDatabaseConnection()),
+ $c->getURLGenerator()
);
return $manager;
});
@@ -900,7 +916,6 @@ class Server extends ServerContainer implements IServerContainer {
return $this->query('SystemTagObjectMapper');
}
-
/**
* Returns the avatar manager, used for avatar functionality
*
@@ -998,7 +1013,8 @@ class Server extends ServerContainer implements IServerContainer {
*/
public function setSession(\OCP\ISession $session) {
$this->query(SessionStorage::class)->setSession($session);
- return $this->query('UserSession')->setSession($session);
+ $this->query('UserSession')->setSession($session);
+ $this->query(Store::class)->setSession($session);
}
/**
@@ -1199,16 +1215,6 @@ class Server extends ServerContainer implements IServerContainer {
}
/**
- * Returns an instance of the db facade
- *
- * @deprecated use getDatabaseConnection, will be removed in ownCloud 10
- * @return \OCP\IDb
- */
- public function getDb() {
- return $this->query('Db');
- }
-
- /**
* Returns an instance of the HTTP helper class
*
* @deprecated Use getHTTPClientService()
@@ -1233,7 +1239,7 @@ class Server extends ServerContainer implements IServerContainer {
}
$userId = $user->getUID();
}
- return new CertificateManager($userId, new View(), $this->getConfig());
+ return new CertificateManager($userId, new View(), $this->getConfig(), $this->getLogger());
}
/**
diff --git a/lib/private/Settings/Admin/Encryption.php b/lib/private/Settings/Admin/Encryption.php
index 6e93407f1a3..63020c6bce7 100644
--- a/lib/private/Settings/Admin/Encryption.php
+++ b/lib/private/Settings/Admin/Encryption.php
@@ -23,23 +23,23 @@
namespace OC\Settings\Admin;
-use OC\Encryption\Manager;
use OCP\AppFramework\Http\TemplateResponse;
+use OCP\Encryption\IManager;
use OCP\IUserManager;
use OCP\Settings\ISettings;
class Encryption implements ISettings {
- /** @var Manager */
+ /** @var IManager */
private $manager;
/** @var IUserManager */
private $userManager;
/**
- * @param Manager $manager
+ * @param IManager $manager
* @param IUserManager $userManager
*/
- public function __construct(Manager $manager, IUserManager $userManager) {
+ public function __construct(IManager $manager, IUserManager $userManager) {
$this->manager = $manager;
$this->userManager = $userManager;
}
diff --git a/lib/private/Settings/Manager.php b/lib/private/Settings/Manager.php
index 990750848d3..7a339b94199 100644
--- a/lib/private/Settings/Manager.php
+++ b/lib/private/Settings/Manager.php
@@ -29,6 +29,7 @@ use OCP\IConfig;
use OCP\IDBConnection;
use OCP\IL10N;
use OCP\ILogger;
+use OCP\IURLGenerator;
use OCP\IUserManager;
use OCP\Lock\ILockingProvider;
use OCP\Settings\ISettings;
@@ -43,6 +44,8 @@ class Manager implements IManager {
private $log;
/** @var IDBConnection */
private $dbc;
+ /** @var Mapper */
+ private $mapper;
/** @var IL10N */
private $l;
/** @var IConfig */
@@ -53,6 +56,8 @@ class Manager implements IManager {
private $userManager;
/** @var ILockingProvider */
private $lockingProvider;
+ /** @var IURLGenerator */
+ private $url;
/**
* @param ILogger $log
@@ -62,6 +67,8 @@ class Manager implements IManager {
* @param EncryptionManager $encryptionManager
* @param IUserManager $userManager
* @param ILockingProvider $lockingProvider
+ * @param Mapper $mapper
+ * @param IURLGenerator $url
*/
public function __construct(
ILogger $log,
@@ -70,25 +77,29 @@ class Manager implements IManager {
IConfig $config,
EncryptionManager $encryptionManager,
IUserManager $userManager,
- ILockingProvider $lockingProvider
+ ILockingProvider $lockingProvider,
+ Mapper $mapper,
+ IURLGenerator $url
) {
$this->log = $log;
$this->dbc = $dbc;
+ $this->mapper = $mapper;
$this->l = $l;
$this->config = $config;
$this->encryptionManager = $encryptionManager;
$this->userManager = $userManager;
$this->lockingProvider = $lockingProvider;
+ $this->url = $url;
}
/**
* @inheritdoc
*/
public function setupSettings(array $settings) {
- if(isset($settings[IManager::KEY_ADMIN_SECTION])) {
+ if (isset($settings[IManager::KEY_ADMIN_SECTION])) {
$this->setupAdminSection($settings[IManager::KEY_ADMIN_SECTION]);
}
- if(isset($settings[IManager::KEY_ADMIN_SETTINGS])) {
+ if (isset($settings[IManager::KEY_ADMIN_SETTINGS])) {
$this->setupAdminSettings($settings[IManager::KEY_ADMIN_SETTINGS]);
}
}
@@ -104,50 +115,33 @@ class Manager implements IManager {
public function onAppDisabled($appId) {
$appInfo = \OC_App::getAppInfo($appId); // hello static legacy
- if(isset($appInfo['settings'][IManager::KEY_ADMIN_SECTION])) {
- $this->remove(self::TABLE_ADMIN_SECTIONS, trim($appInfo['settings'][IManager::KEY_ADMIN_SECTION], '\\'));
+ if (isset($appInfo['settings'][IManager::KEY_ADMIN_SECTION])) {
+ $this->mapper->remove(self::TABLE_ADMIN_SECTIONS, trim($appInfo['settings'][IManager::KEY_ADMIN_SECTION], '\\'));
}
- if(isset($appInfo['settings'][IManager::KEY_ADMIN_SETTINGS])) {
- $this->remove(self::TABLE_ADMIN_SETTINGS, trim($appInfo['settings'][IManager::KEY_ADMIN_SETTINGS], '\\'));
+ if (isset($appInfo['settings'][IManager::KEY_ADMIN_SETTINGS])) {
+ $this->mapper->remove(self::TABLE_ADMIN_SETTINGS, trim($appInfo['settings'][IManager::KEY_ADMIN_SETTINGS], '\\'));
}
}
public function checkForOrphanedClassNames() {
- $tables = [ self::TABLE_ADMIN_SECTIONS, self::TABLE_ADMIN_SETTINGS ];
+ $tables = [self::TABLE_ADMIN_SECTIONS, self::TABLE_ADMIN_SETTINGS];
foreach ($tables as $table) {
- $classes = $this->getClasses($table);
- foreach($classes as $className) {
+ $classes = $this->mapper->getClasses($table);
+ foreach ($classes as $className) {
try {
\OC::$server->query($className);
} catch (QueryException $e) {
- $this->remove($table, $className);
+ $this->mapper->remove($table, $className);
}
}
}
}
/**
- * returns the registerd classes in the given table
- *
- * @param $table
- * @return string[]
- */
- private function getClasses($table) {
- $q = $this->dbc->getQueryBuilder();
- $resultStatement = $q->select('class')
- ->from($table)
- ->execute();
- $data = $resultStatement->fetchAll();
- $resultStatement->closeCursor();
-
- return array_map(function($row) { return $row['class']; }, $data);
- }
-
- /**
* @param string $sectionClassName
*/
private function setupAdminSection($sectionClassName) {
- if(!class_exists($sectionClassName)) {
+ if (!class_exists($sectionClassName)) {
$this->log->debug('Could not find admin section class ' . $sectionClassName);
return;
}
@@ -158,14 +152,14 @@ class Manager implements IManager {
return;
}
- if(!$section instanceof ISection) {
+ if (!$section instanceof ISection) {
$this->log->error(
'Admin section instance must implement \OCP\ISection. Invalid class: {class}',
['class' => $sectionClassName]
);
return;
}
- if(!$this->hasAdminSection(get_class($section))) {
+ if (!$this->hasAdminSection(get_class($section))) {
$this->addAdminSection($section);
} else {
$this->updateAdminSection($section);
@@ -173,7 +167,7 @@ class Manager implements IManager {
}
private function addAdminSection(ISection $section) {
- $this->add(self::TABLE_ADMIN_SECTIONS, [
+ $this->mapper->add(self::TABLE_ADMIN_SECTIONS, [
'id' => $section->getID(),
'class' => get_class($section),
'priority' => $section->getPriority(),
@@ -181,28 +175,15 @@ class Manager implements IManager {
}
private function addAdminSettings(ISettings $settings) {
- $this->add(self::TABLE_ADMIN_SETTINGS, [
+ $this->mapper->add(self::TABLE_ADMIN_SETTINGS, [
'class' => get_class($settings),
'section' => $settings->getSection(),
'priority' => $settings->getPriority(),
]);
}
- /**
- * @param string $table
- * @param array $values
- */
- private function add($table, array $values) {
- $query = $this->dbc->getQueryBuilder();
- $values = array_map(function($value) use ($query) {
- return $query->createNamedParameter($value);
- }, $values);
- $query->insert($table)->values($values);
- $query->execute();
- }
-
private function updateAdminSettings(ISettings $settings) {
- $this->update(
+ $this->mapper->update(
self::TABLE_ADMIN_SETTINGS,
'class',
get_class($settings),
@@ -214,35 +195,23 @@ class Manager implements IManager {
}
private function updateAdminSection(ISection $section) {
- $this->update(
+ $this->mapper->update(
self::TABLE_ADMIN_SECTIONS,
'class',
get_class($section),
[
- 'id' => $section->getID(),
+ 'id' => $section->getID(),
'priority' => $section->getPriority(),
]
);
}
- private function update($table, $idCol, $id, $values) {
- $query = $this->dbc->getQueryBuilder();
- $query->update($table);
- foreach($values as $key => $value) {
- $query->set($key, $query->createNamedParameter($value));
- }
- $query
- ->where($query->expr()->eq($idCol, $query->createParameter($idCol)))
- ->setParameter($idCol, $id)
- ->execute();
- }
-
/**
* @param string $className
* @return bool
*/
private function hasAdminSection($className) {
- return $this->has(self::TABLE_ADMIN_SECTIONS, $className);
+ return $this->mapper->has(self::TABLE_ADMIN_SECTIONS, $className);
}
/**
@@ -250,44 +219,11 @@ class Manager implements IManager {
* @return bool
*/
private function hasAdminSettings($className) {
- return $this->has(self::TABLE_ADMIN_SETTINGS, $className);
- }
-
- /**
- * @param string $table
- * @param string $className
- * @return bool
- */
- private function has($table, $className) {
- $query = $this->dbc->getQueryBuilder();
- $query->select('class')
- ->from($table)
- ->where($query->expr()->eq('class', $query->createNamedParameter($className)))
- ->setMaxResults(1);
-
- $result = $query->execute();
- $row = $result->fetch();
- $result->closeCursor();
-
- return (bool) $row;
- }
-
- /**
- * deletes an settings or admin entry from the given table
- *
- * @param $table
- * @param $className
- */
- private function remove($table, $className) {
- $query = $this->dbc->getQueryBuilder();
- $query->delete($table)
- ->where($query->expr()->eq('class', $query->createNamedParameter($className)));
-
- $query->execute();
+ return $this->mapper->has(self::TABLE_ADMIN_SETTINGS, $className);
}
private function setupAdminSettings($settingsClassName) {
- if(!class_exists($settingsClassName)) {
+ if (!class_exists($settingsClassName)) {
$this->log->debug('Could not find admin section class ' . $settingsClassName);
return;
}
@@ -300,14 +236,14 @@ class Manager implements IManager {
return;
}
- if(!$settings instanceof ISettings) {
+ if (!$settings instanceof ISettings) {
$this->log->error(
'Admin section instance must implement \OCP\Settings\ISection. Invalid class: {class}',
['class' => $settingsClassName]
);
return;
}
- if(!$this->hasAdminSettings(get_class($settings))) {
+ if (!$this->hasAdminSettings(get_class($settings))) {
$this->addAdminSettings($settings);
} else {
$this->updateAdminSettings($settings);
@@ -329,24 +265,17 @@ class Manager implements IManager {
public function getAdminSections() {
// built-in sections
$sections = [
- 0 => [new Section('server', $this->l->t('Server settings'), 0)],
- 5 => [new Section('sharing', $this->l->t('Sharing'), 0)],
- 45 => [new Section('encryption', $this->l->t('Encryption'), 0)],
- 98 => [new Section('additional', $this->l->t('Additional settings'), 0)],
- 99 => [new Section('tips-tricks', $this->l->t('Tips & tricks'), 0)],
+ 0 => [new Section('server', $this->l->t('Server settings'), 0, $this->url->imagePath('settings', 'admin.svg'))],
+ 5 => [new Section('sharing', $this->l->t('Sharing'), 0, $this->url->imagePath('core', 'actions/share.svg'))],
+ 45 => [new Section('encryption', $this->l->t('Encryption'), 0, $this->url->imagePath('core', 'actions/password.svg'))],
+ 98 => [new Section('additional', $this->l->t('Additional settings'), 0, $this->url->imagePath('core', 'actions/settings-dark.svg'))],
+ 99 => [new Section('tips-tricks', $this->l->t('Tips & tricks'), 0, $this->url->imagePath('settings', 'help.svg'))],
];
- $query = $this->dbc->getQueryBuilder();
- $query->selectDistinct('s.class')
- ->addSelect('s.priority')
- ->from(self::TABLE_ADMIN_SECTIONS, 's')
- ->from(self::TABLE_ADMIN_SETTINGS, 'f')
- ->where($query->expr()->eq('s.id', 'f.section'))
- ;
- $result = $query->execute();
+ $rows = $this->mapper->getAdminSectionsFromDB();
- while($row = $result->fetch()) {
- if(!isset($sections[$row['priority']])) {
+ foreach ($rows as $row) {
+ if (!isset($sections[$row['priority']])) {
$sections[$row['priority']] = [];
}
try {
@@ -355,38 +284,42 @@ class Manager implements IManager {
// skip
}
}
- $result->closeCursor();
ksort($sections);
+
return $sections;
}
+ /**
+ * @param string $section
+ * @return ISection[]
+ */
private function getBuiltInAdminSettings($section) {
$forms = [];
try {
- if($section === 'server') {
+ if ($section === 'server') {
/** @var ISettings $form */
$form = new Admin\Server($this->dbc, $this->config, $this->lockingProvider, $this->l);
$forms[$form->getPriority()] = [$form];
$form = new Admin\ServerDevNotice();
$forms[$form->getPriority()] = [$form];
}
- if($section === 'encryption') {
+ if ($section === 'encryption') {
/** @var ISettings $form */
$form = new Admin\Encryption($this->encryptionManager, $this->userManager);
$forms[$form->getPriority()] = [$form];
}
- if($section === 'sharing') {
+ if ($section === 'sharing') {
/** @var ISettings $form */
$form = new Admin\Sharing($this->config);
$forms[$form->getPriority()] = [$form];
}
- if($section === 'additional') {
+ if ($section === 'additional') {
/** @var ISettings $form */
$form = new Admin\Additional($this->config);
$forms[$form->getPriority()] = [$form];
}
- if($section === 'tips-tricks') {
+ if ($section === 'tips-tricks') {
/** @var ISettings $form */
$form = new Admin\TipsTricks($this->config);
$forms[$form->getPriority()] = [$form];
@@ -397,16 +330,15 @@ class Manager implements IManager {
return $forms;
}
- private function getAdminSettingsFromDB($section, &$settings) {
- $query = $this->dbc->getQueryBuilder();
- $query->select(['class', 'priority'])
- ->from(self::TABLE_ADMIN_SETTINGS)
- ->where($query->expr()->eq('section', $this->dbc->getQueryBuilder()->createParameter('section')))
- ->setParameter('section', $section);
+ /**
+ * @inheritdoc
+ */
+ public function getAdminSettings($section) {
+ $settings = $this->getBuiltInAdminSettings($section);
+ $dbRows = $this->mapper->getAdminSettingsFromDB($section);
- $result = $query->execute();
- while($row = $result->fetch()) {
- if(!isset($settings[$row['priority']])) {
+ foreach ($dbRows as $row) {
+ if (!isset($settings[$row['priority']])) {
$settings[$row['priority']] = [];
}
try {
@@ -415,17 +347,8 @@ class Manager implements IManager {
// skip
}
}
- $result->closeCursor();
ksort($settings);
- }
-
- /**
- * @inheritdoc
- */
- public function getAdminSettings($section) {
- $settings = $this->getBuiltInAdminSettings($section);
- $this->getAdminSettingsFromDB($section, $settings);
return $settings;
}
}
diff --git a/lib/private/Settings/Mapper.php b/lib/private/Settings/Mapper.php
new file mode 100644
index 00000000000..2525f2c9854
--- /dev/null
+++ b/lib/private/Settings/Mapper.php
@@ -0,0 +1,163 @@
+<?php
+/**
+ * @copyright Copyright (c) 2016 Robin Appelman <robin@icewind.nl>
+ *
+ * @author Robin Appelman <robin@icewind.nl>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program 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 program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OC\Settings;
+
+use OCP\IDBConnection;
+
+class Mapper {
+ const TABLE_ADMIN_SETTINGS = 'admin_settings';
+ const TABLE_ADMIN_SECTIONS = 'admin_sections';
+
+ /** @var IDBConnection */
+ private $dbc;
+
+ /**
+ * @param IDBConnection $dbc
+ */
+ public function __construct(IDBConnection $dbc) {
+ $this->dbc = $dbc;
+ }
+
+ /**
+ * Get the configured admin settings from the database for the provided section
+ *
+ * @param string $section
+ * @return array[] [['class' => string, 'priority' => int], ...]
+ */
+ public function getAdminSettingsFromDB($section) {
+ $query = $this->dbc->getQueryBuilder();
+ $query->select(['class', 'priority'])
+ ->from(self::TABLE_ADMIN_SETTINGS)
+ ->where($query->expr()->eq('section', $this->dbc->getQueryBuilder()->createParameter('section')))
+ ->setParameter('section', $section);
+
+ $result = $query->execute();
+ return $result->fetchAll();
+ }
+
+ /**
+ * Get the configured admin sections from the database
+ *
+ * @return array[] [['class' => string, 'priority' => int], ...]
+ */
+ public function getAdminSectionsFromDB() {
+ $query = $this->dbc->getQueryBuilder();
+ $query->selectDistinct('s.class')
+ ->addSelect('s.priority')
+ ->from(self::TABLE_ADMIN_SECTIONS, 's')
+ ->from(self::TABLE_ADMIN_SETTINGS, 'f')
+ ->where($query->expr()->eq('s.id', 'f.section'));
+ $result = $query->execute();
+ return array_map(function ($row) {
+ $row['priority'] = (int)$row['priority'];
+ return $row;
+ }, $result->fetchAll());
+ }
+
+ /**
+ * @param string $table Mapper::TABLE_ADMIN_SECTIONS or Mapper::TABLE_ADMIN_SETTINGS
+ * @param array $values
+ */
+ public function add($table, array $values) {
+ $query = $this->dbc->getQueryBuilder();
+ $values = array_map(function ($value) use ($query) {
+ return $query->createNamedParameter($value);
+ }, $values);
+ $query->insert($table)->values($values);
+ $query->execute();
+ }
+
+ /**
+ * returns the registered classes in the given table
+ *
+ * @param $table Mapper::TABLE_ADMIN_SECTIONS or Mapper::TABLE_ADMIN_SETTINGS
+ * @return string[]
+ */
+ public function getClasses($table) {
+ $q = $this->dbc->getQueryBuilder();
+ $resultStatement = $q->select('class')
+ ->from($table)
+ ->execute();
+ $data = $resultStatement->fetchAll();
+ $resultStatement->closeCursor();
+
+ return array_map(function ($row) {
+ return $row['class'];
+ }, $data);
+ }
+
+ /**
+ * Check if a class is configured in the database
+ *
+ * @param string $table Mapper::TABLE_ADMIN_SECTIONS or Mapper::TABLE_ADMIN_SETTINGS
+ * @param string $className
+ * @return bool
+ */
+ public function has($table, $className) {
+ $query = $this->dbc->getQueryBuilder();
+ $query->select('class')
+ ->from($table)
+ ->where($query->expr()->eq('class', $query->createNamedParameter($className)))
+ ->setMaxResults(1);
+
+ $result = $query->execute();
+ $row = $result->fetch();
+ $result->closeCursor();
+
+ return (bool)$row;
+ }
+
+ /**
+ * deletes an settings or admin entry from the given table
+ *
+ * @param $table Mapper::TABLE_ADMIN_SECTIONS or Mapper::TABLE_ADMIN_SETTINGS
+ * @param $className
+ */
+ public function remove($table, $className) {
+ $query = $this->dbc->getQueryBuilder();
+ $query->delete($table)
+ ->where($query->expr()->eq('class', $query->createNamedParameter($className)));
+
+ $query->execute();
+ }
+
+ /**
+ * @param $table Mapper::TABLE_ADMIN_SECTIONS or Mapper::TABLE_ADMIN_SETTINGS
+ * @param $idCol
+ * @param $id
+ * @param $values
+ */
+ public function update($table, $idCol, $id, $values) {
+ $query = $this->dbc->getQueryBuilder();
+ $query->update($table);
+ foreach ($values as $key => $value) {
+ $query->set($key, $query->createNamedParameter($value));
+ }
+ $query
+ ->where($query->expr()->eq($idCol, $query->createParameter($idCol)))
+ ->setParameter($idCol, $id)
+ ->execute();
+ }
+
+}
diff --git a/lib/private/Settings/Section.php b/lib/private/Settings/Section.php
index b3cf242279f..c89a3999c4e 100644
--- a/lib/private/Settings/Section.php
+++ b/lib/private/Settings/Section.php
@@ -23,25 +23,29 @@
namespace OC\Settings;
-use OCP\Settings\ISection;
+use OCP\Settings\IIconSection;
-class Section implements ISection {
+class Section implements IIconSection {
/** @var string */
private $id;
/** @var string */
private $name;
/** @var int */
private $priority;
+ /** @var string */
+ private $icon;
/**
* @param string $id
* @param string $name
* @param int $priority
+ * @param string $icon
*/
- public function __construct($id, $name, $priority) {
+ public function __construct($id, $name, $priority, $icon = '') {
$this->id = $id;
$this->name = $name;
$this->priority = $priority;
+ $this->icon = $icon;
}
/**
@@ -74,4 +78,15 @@ class Section implements ISection {
public function getPriority() {
return $this->priority;
}
+
+ /**
+ * returns the relative path to an 16*16 icon describing the section.
+ * e.g. '/core/img/places/files.svg'
+ *
+ * @returns string
+ * @since 12
+ */
+ public function getIcon() {
+ return $this->icon;
+ }
}
diff --git a/lib/private/Setup.php b/lib/private/Setup.php
index 81a5343fe21..d9997767684 100644
--- a/lib/private/Setup.php
+++ b/lib/private/Setup.php
@@ -125,8 +125,8 @@ class Setup {
public function getSupportedDatabases($allowAllDatabases = false) {
$availableDatabases = array(
'sqlite' => array(
- 'type' => 'class',
- 'call' => 'SQLite3',
+ 'type' => 'pdo',
+ 'call' => 'sqlite',
'name' => 'SQLite'
),
'mysql' => array(
@@ -163,9 +163,7 @@ class Setup {
$type = $availableDatabases[$database]['type'];
$call = $availableDatabases[$database]['call'];
- if($type === 'class') {
- $working = $this->class_exists($call);
- } elseif ($type === 'function') {
+ if ($type === 'function') {
$working = $this->is_callable($call);
} elseif($type === 'pdo') {
$working = in_array($call, $this->getAvailableDbDriversForPdo(), TRUE);
diff --git a/lib/private/Setup/MySQL.php b/lib/private/Setup/MySQL.php
index d1399c8821c..bafb3866b76 100644
--- a/lib/private/Setup/MySQL.php
+++ b/lib/private/Setup/MySQL.php
@@ -35,7 +35,7 @@ class MySQL extends AbstractDatabase {
public function setupDatabase($username) {
//check if the database user has admin right
- $connection = $this->connect();
+ $connection = $this->connect(['dbname' => null]);
$this->createSpecificUser($username, $connection);
@@ -152,7 +152,7 @@ class MySQL extends AbstractDatabase {
};
}
} catch (\Exception $ex) {
- $this->logger->error('Specific user creation failed: {error}', [
+ $this->logger->info('Can not create a new MySQL user, will continue with the provided user: {error}', [
'app' => 'mysql.setup',
'error' => $ex->getMessage()
]);
diff --git a/lib/private/Setup/PostgreSQL.php b/lib/private/Setup/PostgreSQL.php
index 085e8609ab2..c01e5bc0332 100644
--- a/lib/private/Setup/PostgreSQL.php
+++ b/lib/private/Setup/PostgreSQL.php
@@ -150,14 +150,16 @@ class PostgreSQL extends AbstractDatabase {
}
private function createDBUser(IDBConnection $connection) {
+ $dbUser = $this->dbUser;
try {
- if ($this->userExists($connection)) {
- // change the password
- $query = $connection->prepare("ALTER ROLE " . addslashes($this->dbUser) . " WITH CREATEDB PASSWORD '" . addslashes($this->dbPassword) . "'");
- } else {
- // create the user
- $query = $connection->prepare("CREATE USER " . addslashes($this->dbUser) . " CREATEDB PASSWORD '" . addslashes($this->dbPassword) . "'");
- }
+ $i = 1;
+ while ($this->userExists($connection)) {
+ $i++;
+ $this->dbUser = $dbUser . $i;
+ };
+
+ // create the user
+ $query = $connection->prepare("CREATE USER " . addslashes($this->dbUser) . " CREATEDB PASSWORD '" . addslashes($this->dbPassword) . "'");
$query->execute();
} catch (DatabaseException $e) {
$this->logger->error('Error while trying to create database user');
diff --git a/lib/private/Setup/Sqlite.php b/lib/private/Setup/Sqlite.php
index 63b970be42e..4d860103b60 100644
--- a/lib/private/Setup/Sqlite.php
+++ b/lib/private/Setup/Sqlite.php
@@ -33,7 +33,7 @@ class Sqlite extends AbstractDatabase {
}
public function setupDatabase($username) {
- $datadir = \OC::$server->getSystemConfig()->getValue('datadirectory');
+ $datadir = \OC::$server->getSystemConfig()->getValue('datadirectory', \OC::$SERVERROOT . '/data');
//delete the old sqlite database first, might cause infinte loops otherwise
if(file_exists("$datadir/owncloud.db")) {
diff --git a/lib/private/Share20/DefaultShareProvider.php b/lib/private/Share20/DefaultShareProvider.php
index 7a602950171..23e8db34d7f 100644
--- a/lib/private/Share20/DefaultShareProvider.php
+++ b/lib/private/Share20/DefaultShareProvider.php
@@ -162,7 +162,6 @@ class DefaultShareProvider implements IShareProvider {
$this->dbConn->beginTransaction();
$qb->execute();
$id = $this->dbConn->lastInsertId('*PREFIX*share');
- $this->dbConn->commit();
// Now fetch the inserted share and create a complete share object
$qb = $this->dbConn->getQueryBuilder();
@@ -172,6 +171,7 @@ class DefaultShareProvider implements IShareProvider {
$cursor = $qb->execute();
$data = $cursor->fetch();
+ $this->dbConn->commit();
$cursor->closeCursor();
if ($data === false) {
@@ -853,7 +853,6 @@ class DefaultShareProvider implements IShareProvider {
$entryData['permissions'] = $entryData['f_permissions'];
$entryData['parent'] = $entryData['f_parent'];;
$share->setNodeCacheEntry(Cache::cacheEntryFromData($entryData,
- $entryData['storage_string_id'],
\OC::$server->getMimeTypeLoader()));
}
diff --git a/lib/private/Share20/Manager.php b/lib/private/Share20/Manager.php
index cd1d52c3bbf..acc142f62be 100644
--- a/lib/private/Share20/Manager.php
+++ b/lib/private/Share20/Manager.php
@@ -587,7 +587,6 @@ class Manager implements IManager {
$share->setPassword($this->hasher->hash($share->getPassword()));
}
} else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_EMAIL) {
- $this->linkCreateChecks($share);
$share->setToken(
$this->secureRandom->generate(
\OC\Share\Constants::TOKEN_LENGTH,
@@ -1055,8 +1054,10 @@ class Manager implements IManager {
public function getShareByToken($token) {
$share = null;
try {
- $provider = $this->factory->getProviderForType(\OCP\Share::SHARE_TYPE_LINK);
- $share = $provider->getShareByToken($token);
+ if($this->shareApiAllowLinks()) {
+ $provider = $this->factory->getProviderForType(\OCP\Share::SHARE_TYPE_LINK);
+ $share = $provider->getShareByToken($token);
+ }
} catch (ProviderException $e) {
} catch (ShareNotFound $e) {
}
@@ -1072,7 +1073,7 @@ class Manager implements IManager {
}
}
- // If it is not a link share try to fetch a federated share by token
+ // If it is not a link share try to fetch a mail share by token
if ($share === null && $this->shareProviderExists(\OCP\Share::SHARE_TYPE_EMAIL)) {
try {
$provider = $this->factory->getProviderForType(\OCP\Share::SHARE_TYPE_EMAIL);
diff --git a/lib/private/SubAdmin.php b/lib/private/SubAdmin.php
index 9a2beed09fe..0650c7c6c01 100644
--- a/lib/private/SubAdmin.php
+++ b/lib/private/SubAdmin.php
@@ -188,7 +188,7 @@ class SubAdmin extends PublicEmitter {
* @param IGroup $group
* @return bool
*/
- public function isSubAdminofGroup(IUser $user, IGroup $group) {
+ public function isSubAdminOfGroup(IUser $user, IGroup $group) {
$qb = $this->dbConn->getQueryBuilder();
/*
diff --git a/lib/private/SystemConfig.php b/lib/private/SystemConfig.php
index 1029a6619ff..e5f1adaf004 100644
--- a/lib/private/SystemConfig.php
+++ b/lib/private/SystemConfig.php
@@ -44,7 +44,6 @@ class SystemConfig {
'passwordsalt' => true,
'secret' => true,
'updater.secret' => true,
- 'ldap_agent_password' => true,
'proxyuserpwd' => true,
'log.condition' => [
'shared_secret' => true,
diff --git a/lib/private/Template/CSSResourceLocator.php b/lib/private/Template/CSSResourceLocator.php
index ffeaf765ff5..3a474a1ecfd 100644
--- a/lib/private/Template/CSSResourceLocator.php
+++ b/lib/private/Template/CSSResourceLocator.php
@@ -25,23 +25,46 @@
namespace OC\Template;
+use OCP\ILogger;
+
class CSSResourceLocator extends ResourceLocator {
+
+ /** @var SCSSCacher */
+ protected $scssCacher;
+
+ /**
+ * @param ILogger $logger
+ * @param string $theme
+ * @param array $core_map
+ * @param array $party_map
+ * @param SCSSCacher $scssCacher
+ */
+ public function __construct(ILogger $logger, $theme, $core_map, $party_map, $scssCacher) {
+ $this->scssCacher = $scssCacher;
+
+ parent::__construct($logger, $theme, $core_map, $party_map);
+ }
+
/**
* @param string $style
*/
public function doFind($style) {
+ $app = substr($style, 0, strpos($style, '/'));
if (strpos($style, '3rdparty') === 0
&& $this->appendIfExist($this->thirdpartyroot, $style.'.css')
+ || $this->cacheAndAppendScssIfExist($this->serverroot, $style.'.scss', $app)
+ || $this->cacheAndAppendScssIfExist($this->serverroot, 'core/'.$style.'.scss')
|| $this->appendIfExist($this->serverroot, $style.'.css')
|| $this->appendIfExist($this->serverroot, 'core/'.$style.'.css')
) {
return;
}
- $app = substr($style, 0, strpos($style, '/'));
$style = substr($style, strpos($style, '/')+1);
$app_path = \OC_App::getAppPath($app);
$app_url = \OC_App::getAppWebPath($app);
- $this->append($app_path, $style.'.css', $app_url);
+ if(!$this->cacheAndAppendScssIfExist($app_path, $style.'.scss', $app)) {
+ $this->append($app_path, $style.'.css', $app_url);
+ }
}
/**
@@ -53,4 +76,29 @@ class CSSResourceLocator extends ResourceLocator {
|| $this->appendIfExist($this->serverroot, $theme_dir.$style.'.css')
|| $this->appendIfExist($this->serverroot, $theme_dir.'core/'.$style.'.css');
}
+
+ /**
+ * cache and append the scss $file if exist at $root
+ *
+ * @param string $root path to check
+ * @param string $file the filename
+ * @return bool True if the resource was found and cached, false otherwise
+ */
+ protected function cacheAndAppendScssIfExist($root, $file, $app = 'core') {
+ if (is_file($root.'/'.$file)) {
+ if($this->scssCacher !== null) {
+ if($this->scssCacher->process($root, $file, $app)) {
+ $this->append($root, $this->scssCacher->getCachedSCSS($app, $file), false);
+ return true;
+ } else {
+ $this->logger->warning('Failed to compile and/or save '.$root.'/'.$file, ['app' => 'core']);
+ return false;
+ }
+ } else {
+ $this->logger->debug('Scss is disabled for '.$root.'/'.$file.', ignoring', ['app' => 'core']);
+ return true;
+ }
+ }
+ return false;
+ }
}
diff --git a/lib/private/Template/ResourceLocator.php b/lib/private/Template/ResourceLocator.php
index 420317d27ac..e22ebdcab7d 100644..100755
--- a/lib/private/Template/ResourceLocator.php
+++ b/lib/private/Template/ResourceLocator.php
@@ -75,7 +75,7 @@ abstract class ResourceLocator {
$this->doFind($resource);
} catch (ResourceNotFoundException $e) {
$resourceApp = substr($resource, 0, strpos($resource, '/'));
- $this->logger->error('Could not find resource file "' . $e->getResourcePath() . '"', ['app' => $resourceApp]);
+ $this->logger->debug('Could not find resource file "' . $e->getResourcePath() . '"', ['app' => $resourceApp]);
}
}
if (!empty($this->theme)) {
@@ -84,7 +84,7 @@ abstract class ResourceLocator {
$this->doFindTheme($resource);
} catch (ResourceNotFoundException $e) {
$resourceApp = substr($resource, 0, strpos($resource, '/'));
- $this->logger->error('Could not find resource file "' . $e->getResourcePath() . '"', ['app' => $resourceApp]);
+ $this->logger->debug('Could not find resource file "' . $e->getResourcePath() . '"', ['app' => $resourceApp]);
}
}
}
diff --git a/lib/private/Template/SCSSCacher.php b/lib/private/Template/SCSSCacher.php
new file mode 100644
index 00000000000..d6f5a2c6fd3
--- /dev/null
+++ b/lib/private/Template/SCSSCacher.php
@@ -0,0 +1,190 @@
+<?php
+/**
+ * @copyright Copyright (c) 2016, John Molakvoæ (skjnldsv@protonmail.com)
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program 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 program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OC\Template;
+
+use Leafo\ScssPhp\Compiler;
+use Leafo\ScssPhp\Exception\ParserException;
+use Leafo\ScssPhp\Formatter\Crunched;
+use Leafo\ScssPhp\Formatter\Expanded;
+use OC\SystemConfig;
+use OCP\Files\IAppData;
+use OCP\Files\NotFoundException;
+use OCP\Files\SimpleFS\ISimpleFolder;
+use OCP\ILogger;
+use OCP\IURLGenerator;
+
+class SCSSCacher {
+
+ /** @var ILogger */
+ protected $logger;
+
+ /** @var IAppData */
+ protected $appData;
+
+ /** @var IURLGenerator */
+ protected $urlGenerator;
+
+ /** @var SystemConfig */
+ protected $systemConfig;
+
+ /**
+ * @param ILogger $logger
+ * @param IAppData $appData
+ * @param IURLGenerator $urlGenerator
+ * @param SystemConfig $systemConfig
+ */
+ public function __construct(ILogger $logger, IAppData $appData, IURLGenerator $urlGenerator, SystemConfig $systemConfig) {
+ $this->logger = $logger;
+ $this->appData = $appData;
+ $this->urlGenerator = $urlGenerator;
+ $this->systemConfig = $systemConfig;
+ }
+
+ /**
+ * Process the caching process if needed
+ * @param string $root Root path to the nextcloud installation
+ * @param string $file
+ * @param string $app The app name
+ * @return boolean
+ */
+ public function process($root, $file, $app) {
+ $path = explode('/', $root . '/' . $file);
+
+ $fileNameSCSS = array_pop($path);
+ $fileNameCSS = str_replace('.scss', '.css', $fileNameSCSS);
+
+ $path = implode('/', $path);
+
+ $webDir = explode('/', $file);
+ array_pop($webDir);
+ $webDir = implode('/', $webDir);
+
+ try {
+ $folder = $this->appData->getFolder($app);
+ } catch(NotFoundException $e) {
+ // creating css appdata folder
+ $folder = $this->appData->newFolder($app);
+ }
+
+ if($this->isCached($fileNameCSS, $fileNameSCSS, $folder, $path)) {
+ return true;
+ } else {
+ return $this->cache($path, $fileNameCSS, $fileNameSCSS, $folder, $webDir);
+ }
+ }
+
+ /**
+ * Check if the file is cached or not
+ * @param string $fileNameCSS
+ * @param string $fileNameSCSS
+ * @param ISimpleFolder $folder
+ * @param string $path
+ * @return boolean
+ */
+ private function isCached($fileNameCSS, $fileNameSCSS, ISimpleFolder $folder, $path) {
+ try{
+ $cachedFile = $folder->getFile($fileNameCSS);
+ if( $cachedFile->getMTime() > filemtime($path.'/'.$fileNameSCSS)
+ && $cachedFile->getSize() > 0 ) {
+ return true;
+ }
+ } catch(NotFoundException $e) {
+ return false;
+ }
+ return false;
+ }
+
+ /**
+ * Cache the file with AppData
+ * @param string $path
+ * @param string $fileNameCSS
+ * @param string $fileNameSCSS
+ * @param ISimpleFolder $folder
+ * @param string $webDir
+ * @return boolean
+ */
+ private function cache($path, $fileNameCSS, $fileNameSCSS, ISimpleFolder $folder, $webDir) {
+ $scss = new Compiler();
+ $scss->setImportPaths($path);
+ if($this->systemConfig->getValue('debug')) {
+ // Debug mode
+ $scss->setFormatter(Expanded::class);
+ $scss->setLineNumberStyle(Compiler::LINE_COMMENTS);
+ } else {
+ // Compression
+ $scss->setFormatter(Crunched::class);
+ }
+
+ try {
+ $cachedfile = $folder->getFile($fileNameCSS);
+ } catch(NotFoundException $e) {
+ $cachedfile = $folder->newFile($fileNameCSS);
+ }
+
+ // Compile
+ try {
+ $compiledScss = $scss->compile('@import "'.$fileNameSCSS.'";');
+ } catch(ParserException $e) {
+ $this->logger->error($e, ['app' => 'core']);
+ return false;
+ }
+
+ try {
+ $cachedfile->putContent($this->rebaseUrls($compiledScss, $webDir));
+ $this->logger->debug($webDir.'/'.$fileNameSCSS.' compiled and successfully cached', ['app' => 'core']);
+ return true;
+ } catch(NotFoundException $e) {
+ return false;
+ }
+ }
+
+ /**
+ * Add the correct uri prefix to make uri valid again
+ * @param string $css
+ * @param string $webDir
+ * @return string
+ */
+ private function rebaseUrls($css, $webDir) {
+ $re = '/url\([\'"]([\.\w?=\/-]*)[\'"]\)/x';
+ // OC\Route\Router:75
+ if(($this->systemConfig->getValue('htaccess.IgnoreFrontController', false) === true || getenv('front_controller_active') === 'true')) {
+ $subst = 'url(\'../../'.$webDir.'/$1\')';
+ } else {
+ $subst = 'url(\'../../../'.$webDir.'/$1\')';
+ }
+ return preg_replace($re, $subst, $css);
+ }
+
+ /**
+ * Return the cached css file uri
+ * @param string $appName the app name
+ * @param string $fileName
+ * @return string
+ */
+ public function getCachedSCSS($appName, $fileName) {
+ $tmpfileLoc = explode('/', $fileName);
+ $fileName = array_pop($tmpfileLoc);
+ $fileName = str_replace('.scss', '.css', $fileName);
+
+ return substr($this->urlGenerator->linkToRoute('core.Css.getCss', array('fileName' => $fileName, 'appName' => $appName)), strlen(\OC::$WEBROOT) + 1);
+ }
+}
diff --git a/lib/private/TemplateLayout.php b/lib/private/TemplateLayout.php
index 8919f14216e..7ded109f76b 100644
--- a/lib/private/TemplateLayout.php
+++ b/lib/private/TemplateLayout.php
@@ -35,15 +35,8 @@
*/
namespace OC;
-use Assetic\Asset\AssetCollection;
-use Assetic\Asset\FileAsset;
-use Assetic\AssetWriter;
-use Assetic\Filter\CssImportFilter;
-use Assetic\Filter\CssMinFilter;
-use Assetic\Filter\CssRewriteFilter;
-use Assetic\Filter\JSqueezeFilter;
-use Assetic\Filter\SeparatorFilter;
use OC\Template\JSConfigHelper;
+use OC\Template\SCSSCacher;
class TemplateLayout extends \OC_Template {
@@ -164,11 +157,18 @@ class TemplateLayout extends \OC_Template {
foreach($jsFiles as $info) {
$web = $info[1];
$file = $info[2];
- $this->append( 'jsfiles', $web.'/'.$file . '?v=' . self::$versionHash);
+ $this->append( 'jsfiles', $web.'/'.$file . $this->getVersionHashSuffix() );
}
- // Add the css files
- $cssFiles = self::findStylesheetFiles(\OC_Util::$styles);
+ // Do not initialise scss appdata until we have a fully installed instance
+ // Do not load scss for update, errors, installation or login page
+ if(\OC::$server->getSystemConfig()->getValue('installed', false)
+ && !\OCP\Util::needUpgrade()
+ && strpos(\OC::$server->getRequest()->getRequestUri(), \OC::$server->getURLGenerator()->linkToRoute('core.login.tryLogin')) !== 0) {
+ $cssFiles = self::findStylesheetFiles(\OC_Util::$styles);
+ } else {
+ $cssFiles = self::findStylesheetFiles(\OC_Util::$styles, false);
+ }
$this->assign('cssfiles', array());
$this->assign('printcssfiles', []);
$this->assign('versionHash', self::$versionHash);
@@ -177,26 +177,47 @@ class TemplateLayout extends \OC_Template {
$file = $info[2];
if (substr($file, -strlen('print.css')) === 'print.css') {
- $this->append( 'printcssfiles', $web.'/'.$file . '?v=' . self::$versionHash);
+ $this->append( 'printcssfiles', $web.'/'.$file . $this->getVersionHashSuffix() );
} else {
- $this->append( 'cssfiles', $web.'/'.$file . '?v=' . self::$versionHash);
+ $this->append( 'cssfiles', $web.'/'.$file . $this->getVersionHashSuffix() );
}
}
}
+ protected function getVersionHashSuffix() {
+ if(\OC::$server->getConfig()->getSystemValue('debug', false)) {
+ // allows chrome workspace mapping in debug mode
+ return "";
+ }
+
+ return '?v=' . self::$versionHash;
+ }
+
/**
* @param array $styles
* @return array
*/
- static public function findStylesheetFiles($styles) {
+ static public function findStylesheetFiles($styles, $compileScss = true) {
// Read the selected theme from the config file
$theme = \OC_Util::getTheme();
+ if($compileScss) {
+ $SCSSCacher = new SCSSCacher(
+ \OC::$server->getLogger(),
+ \OC::$server->getAppDataDir('css'),
+ \OC::$server->getURLGenerator(),
+ \OC::$server->getSystemConfig()
+ );
+ } else {
+ $SCSSCacher = null;
+ }
+
$locator = new \OC\Template\CSSResourceLocator(
\OC::$server->getLogger(),
$theme,
array( \OC::$SERVERROOT => \OC::$WEBROOT ),
- array( \OC::$SERVERROOT => \OC::$WEBROOT ));
+ array( \OC::$SERVERROOT => \OC::$WEBROOT ),
+ $SCSSCacher);
$locator->find($styles);
return $locator->getResources();
}
diff --git a/lib/private/Updater.php b/lib/private/Updater.php
index e30777227cc..a66d49941cd 100644
--- a/lib/private/Updater.php
+++ b/lib/private/Updater.php
@@ -82,6 +82,12 @@ class Updater extends BasicEmitter {
$this->log = $log;
$this->config = $config;
$this->checker = $checker;
+
+ // If at least PHP 7.0.0 is used we don't need to disable apps as we catch
+ // fatal errors and exceptions and disable the app just instead.
+ if(version_compare(phpversion(), '7.0.0', '>=')) {
+ $this->skip3rdPartyAppsDisable = true;
+ }
}
/**
diff --git a/lib/private/User/Database.php b/lib/private/User/Database.php
index 28cb3302858..a281572ad55 100644
--- a/lib/private/User/Database.php
+++ b/lib/private/User/Database.php
@@ -238,6 +238,12 @@ class Database extends Backend implements IUserBackend {
*/
private function loadUser($uid) {
if (!isset($this->cache[$uid])) {
+ //guests $uid could be NULL or ''
+ if ($uid === null || $uid === '') {
+ $this->cache[$uid]=false;
+ return true;
+ }
+
$query = \OC_DB::prepare('SELECT `uid`, `displayname` FROM `*PREFIX*users` WHERE LOWER(`uid`) = LOWER(?)');
$result = $query->execute(array($uid));
diff --git a/lib/private/User/Session.php b/lib/private/User/Session.php
index 36bd45521cf..2ebe895a592 100644
--- a/lib/private/User/Session.php
+++ b/lib/private/User/Session.php
@@ -317,7 +317,7 @@ class Session implements IUserSession, Emitter {
$password,
IRequest $request,
OC\Security\Bruteforce\Throttler $throttler) {
- $currentDelay = $throttler->sleepDelay($request->getRemoteAddress());
+ $currentDelay = $throttler->sleepDelay($request->getRemoteAddress(), 'login');
if ($this->manager instanceof PublicEmitter) {
$this->manager->emit('\OC\User', 'preLogin', array($user, $password));
@@ -338,7 +338,7 @@ class Session implements IUserSession, Emitter {
$throttler->registerAttempt('login', $request->getRemoteAddress(), ['uid' => $user]);
if($currentDelay === 0) {
- $throttler->sleepDelay($request->getRemoteAddress());
+ $throttler->sleepDelay($request->getRemoteAddress(), 'login');
}
return false;
}
@@ -744,6 +744,7 @@ class Session implements IUserSession, Emitter {
//login
$this->setUser($user);
+ $this->setLoginName($this->tokenProvider->getToken($sessionId)->getLoginName());
$user->updateLastLoginTimestamp();
$this->manager->emit('\OC\User', 'postRememberedLogin', [$user]);
return true;
@@ -768,7 +769,7 @@ class Session implements IUserSession, Emitter {
try {
$this->tokenProvider->invalidateToken($this->session->getId());
} catch (SessionNotAvailableException $ex) {
-
+
}
}
$this->setUser(null);
diff --git a/lib/private/User/User.php b/lib/private/User/User.php
index 3cc6dc3b7ed..c37bb59028e 100644
--- a/lib/private/User/User.php
+++ b/lib/private/User/User.php
@@ -197,6 +197,8 @@ class User implements IUser {
if ($this->emitter) {
$this->emitter->emit('\OC\User', 'preDelete', array($this));
}
+ // get the home now because it won't return it after user deletion
+ $homePath = $this->getHome();
$result = $this->backend->deleteUser($this->uid);
if ($result) {
@@ -210,7 +212,11 @@ class User implements IUser {
\OC::$server->getConfig()->deleteAllUserValues($this->uid);
// Delete user files in /data/
- \OC_Helper::rmdirr($this->getHome());
+ if ($homePath !== false) {
+ // FIXME: this operates directly on FS, should use View instead...
+ // also this is not testable/mockable...
+ \OC_Helper::rmdirr($homePath);
+ }
// Delete the users entry in the storage table
Storage::remove('home::' . $this->uid);
@@ -261,7 +267,7 @@ class User implements IUser {
if ($this->backend->implementsActions(Backend::GET_HOME) and $home = $this->backend->getHome($this->uid)) {
$this->home = $home;
} elseif ($this->config) {
- $this->home = $this->config->getSystemValue('datadirectory') . '/' . $this->uid;
+ $this->home = $this->config->getSystemValue('datadirectory', \OC::$SERVERROOT . '/data') . '/' . $this->uid;
} else {
$this->home = \OC::$SERVERROOT . '/data/' . $this->uid;
}
diff --git a/lib/private/legacy/app.php b/lib/private/legacy/app.php
index adf29601ac6..a475b895d9f 100644
--- a/lib/private/legacy/app.php
+++ b/lib/private/legacy/app.php
@@ -273,9 +273,17 @@ class OC_App {
$appTypes = implode(',', $appData['types']);
} else {
$appTypes = '';
+ $appData['types'] = [];
}
\OC::$server->getAppConfig()->setValue($app, 'types', $appTypes);
+
+ if (\OC::$server->getAppManager()->hasProtectedAppType($appData['types'])) {
+ $enabled = \OC::$server->getAppConfig()->getValue($app, 'enabled', 'yes');
+ if ($enabled !== 'yes' && $enabled !== 'no') {
+ \OC::$server->getAppConfig()->setValue($app, 'enabled', 'yes');
+ }
+ }
}
/**
@@ -1296,43 +1304,21 @@ class OC_App {
$data['summary'] = self::findBestL10NOption($data['summary'], $lang);
}
if ($lang && isset($data['description']) && is_array($data['description'])) {
- $data['description'] = self::findBestL10NOption($data['description'], $lang);
- }
-
- // just modify the description if it is available
- // otherwise this will create a $data element with an empty 'description'
- if (isset($data['description'])) {
- if (is_string($data['description'])) {
- // sometimes the description contains line breaks and they are then also
- // shown in this way in the app management which isn't wanted as HTML
- // manages line breaks itself
-
- // first of all we split on empty lines
- $paragraphs = preg_split("!\n[[:space:]]*\n!mu", $data['description']);
-
- $result = [];
- foreach ($paragraphs as $value) {
- // replace multiple whitespace (tabs, space, newlines) inside a paragraph
- // with a single space - also trims whitespace
- $result[] = trim(preg_replace('![[:space:]]+!mu', ' ', $value));
- }
-
- // join the single paragraphs with a empty line in between
- $data['description'] = implode("\n\n", $result);
-
- } else {
- $data['description'] = '';
- }
+ $data['description'] = trim(self::findBestL10NOption($data['description'], $lang));
+ } else if (isset($data['description']) && is_string($data['description'])) {
+ $data['description'] = trim($data['description']);
+ } else {
+ $data['description'] = '';
}
return $data;
}
/**
- * @param $config
- * @param $l
- * @param $info
- * @throws Exception
+ * @param \OCP\IConfig $config
+ * @param \OCP\IL10N $l
+ * @param array $info
+ * @throws \Exception
*/
protected static function checkAppDependencies($config, $l, $info) {
$dependencyAnalyzer = new DependencyAnalyzer(new Platform($config), $l);
diff --git a/lib/private/legacy/files.php b/lib/private/legacy/files.php
index b6c6857a1bf..8c9adad0d49 100644
--- a/lib/private/legacy/files.php
+++ b/lib/private/legacy/files.php
@@ -148,6 +148,7 @@ class OC_Files {
$streamer->sendHeaders($name);
$executionTime = intval(OC::$server->getIniWrapper()->getNumeric('max_execution_time'));
set_time_limit(0);
+ ignore_user_abort(true);
if ($getType === self::ZIP_FILES) {
foreach ($files as $file) {
$file = $dir . '/' . $file;
diff --git a/lib/private/legacy/helper.php b/lib/private/legacy/helper.php
index 9c4bc895fb9..dfe2e09afff 100644
--- a/lib/private/legacy/helper.php
+++ b/lib/private/legacy/helper.php
@@ -52,6 +52,7 @@ class OC_Helper {
/**
* Creates an absolute url for public use
+ *
* @param string $service id
* @param bool $add_slash
* @return string the url
@@ -62,13 +63,14 @@ class OC_Helper {
if ($service === 'files') {
$url = OC::$server->getURLGenerator()->getAbsoluteURL('/s');
} else {
- $url = OC::$server->getURLGenerator()->getAbsoluteURL(OC::$server->getURLGenerator()->linkTo('', 'public.php').'?service='.$service);
+ $url = OC::$server->getURLGenerator()->getAbsoluteURL(OC::$server->getURLGenerator()->linkTo('', 'public.php') . '?service=' . $service);
}
return $url . (($add_slash && $service[strlen($service) - 1] != '/') ? '/' : '');
}
/**
* Make a human file size
+ *
* @param int $bytes file size in bytes
* @return string a human readable file size
*
@@ -104,6 +106,7 @@ class OC_Helper {
/**
* Make a php file size
+ *
* @param int $bytes file size in bytes
* @return string a php parseable file size
*
@@ -130,6 +133,7 @@ class OC_Helper {
/**
* Make a computer file size
+ *
* @param string $str file size in human readable format
* @return float a file size in bytes
*
@@ -172,6 +176,7 @@ class OC_Helper {
/**
* Recursive copying of folders
+ *
* @param string $src source folder
* @param string $dest target folder
*
@@ -194,6 +199,7 @@ class OC_Helper {
/**
* Recursive deletion of folders
+ *
* @param string $dir path to the folder
* @param bool $deleteSelf if set to false only the content of the folder will be deleted
* @return bool
@@ -393,6 +399,7 @@ class OC_Helper {
/**
* performs a search in a nested array
+ *
* @param array $haystack the array to be searched
* @param string $needle the search string
* @param string $index optional, only search this key name
@@ -425,7 +432,7 @@ class OC_Helper {
* @return int number of bytes representing
*/
public static function maxUploadFilesize($dir, $freeSpace = null) {
- if (is_null($freeSpace) || $freeSpace < 0){
+ if (is_null($freeSpace) || $freeSpace < 0) {
$freeSpace = self::freeSpace($dir);
}
return min($freeSpace, self::uploadLimit());
@@ -443,7 +450,7 @@ class OC_Helper {
$freeSpace = max($freeSpace, 0);
return $freeSpace;
} else {
- return (INF > 0)? INF: PHP_INT_MAX; // work around https://bugs.php.net/bug.php?id=69188
+ return (INF > 0) ? INF : PHP_INT_MAX; // work around https://bugs.php.net/bug.php?id=69188
}
}
@@ -510,7 +517,7 @@ class OC_Helper {
if (empty($paths)) {
$paths = '/usr/local/bin /usr/bin /opt/bin /bin';
} else {
- $paths = str_replace(':',' ',getenv('PATH'));
+ $paths = str_replace(':', ' ', getenv('PATH'));
}
$command = 'find ' . $paths . ' -name ' . escapeshellarg($program) . ' 2> /dev/null';
exec($command, $output, $returnCode);
@@ -533,6 +540,12 @@ class OC_Helper {
* @throws \OCP\Files\NotFoundException
*/
public static function getStorageInfo($path, $rootInfo = null) {
+ $memcache = \OC::$server->getMemCacheFactory()->create('storageInfo');
+ $cacheKey = $rootInfo ? '__root__' . md5($path) : md5($path);
+ $cached = $memcache->get($cacheKey);
+ if (is_array($cached)) {
+ return $cached;
+ }
// return storage info without adding mount points
$includeExtStorage = \OC::$server->getSystemConfig()->getValue('quota_include_external_storage', false);
@@ -597,10 +610,20 @@ class OC_Helper {
$ownerId = $storage->getOwner($path);
$ownerDisplayName = '';
$owner = \OC::$server->getUserManager()->get($ownerId);
- if($owner) {
+ if ($owner) {
$ownerDisplayName = $owner->getDisplayName();
}
+ $memcache->set($cacheKey, [
+ 'free' => $free,
+ 'used' => $used,
+ 'quota' => $quota,
+ 'total' => $total,
+ 'relative' => $relative,
+ 'owner' => $ownerId,
+ 'ownerDisplayName' => $ownerDisplayName,
+ ], 5 * 60);
+
return [
'free' => $free,
'used' => $used,
@@ -645,6 +668,7 @@ class OC_Helper {
/**
* Returns whether the config file is set manually to read-only
+ *
* @return bool
*/
public static function isReadOnlyConfigEnabled() {
diff --git a/lib/private/legacy/user.php b/lib/private/legacy/user.php
index ed0d14a1ab9..0a52be7565d 100644
--- a/lib/private/legacy/user.php
+++ b/lib/private/legacy/user.php
@@ -125,9 +125,16 @@ class OC_User {
* setup the configured backends in config.php
*/
public static function setupBackends() {
- OC_App::loadApps(array('prelogin'));
- $backends = \OC::$server->getSystemConfig()->getValue('user_backends', array());
+ OC_App::loadApps(['prelogin']);
+ $backends = \OC::$server->getSystemConfig()->getValue('user_backends', []);
+ if (isset($backends['default']) && !$backends['default']) {
+ // clear default backends
+ self::clearBackends();
+ }
foreach ($backends as $i => $config) {
+ if (!is_array($config)) {
+ continue;
+ }
$class = $config['class'];
$arguments = $config['arguments'];
if (class_exists($class)) {
diff --git a/lib/private/legacy/util.php b/lib/private/legacy/util.php
index 55dc5ae7c15..5ef1130d361 100644
--- a/lib/private/legacy/util.php
+++ b/lib/private/legacy/util.php
@@ -1002,27 +1002,6 @@ class OC_Util {
}
/**
- * Check if it is allowed to remember login.
- *
- * @note Every app can set 'rememberlogin' to 'false' to disable the remember login feature
- *
- * @return bool
- */
- public static function rememberLoginAllowed() {
-
- $apps = OC_App::getEnabledApps();
-
- foreach ($apps as $app) {
- $appInfo = OC_App::getAppInfo($app);
- if (isset($appInfo['rememberlogin']) && $appInfo['rememberlogin'] === 'false') {
- return false;
- }
-
- }
- return true;
- }
-
- /**
* Check if the user is a subadmin, redirects to home if not
*
* @return null|boolean $groups where the current user is subadmin
@@ -1381,12 +1360,12 @@ class OC_Util {
}
/**
- * A human readable string is generated based on version, channel and build number
+ * A human readable string is generated based on version and build number
*
* @return string
*/
public static function getHumanVersion() {
- $version = OC_Util::getVersionString() . ' (' . OC_Util::getChannel() . ')';
+ $version = OC_Util::getVersionString();
$build = OC_Util::getBuild();
if (!empty($build) and OC_Util::getChannel() === 'daily') {
$version .= ' Build:' . $build;
diff --git a/lib/public/Activity/IManager.php b/lib/public/Activity/IManager.php
index 2fe38ddb8d8..f5b495807c5 100644
--- a/lib/public/Activity/IManager.php
+++ b/lib/public/Activity/IManager.php
@@ -64,6 +64,7 @@ interface IManager {
* - setSubject()
*
* @param IEvent $event
+ * @throws \BadMethodCallException if required values have not been set
* @since 8.2.0
*/
public function publish(IEvent $event);
diff --git a/lib/public/App/IAppManager.php b/lib/public/App/IAppManager.php
index 057a964ce0a..72c99777124 100644
--- a/lib/public/App/IAppManager.php
+++ b/lib/public/App/IAppManager.php
@@ -62,6 +62,15 @@ interface IAppManager {
public function enableApp($appId);
/**
+ * Whether a list of types contains a protected app type
+ *
+ * @param string[] $types
+ * @return bool
+ * @since 12.0.0
+ */
+ public function hasProtectedAppType($types);
+
+ /**
* Enable an app only for specific groups
*
* @param string $appId
diff --git a/lib/public/AppFramework/Db/Mapper.php b/lib/public/AppFramework/Db/Mapper.php
index aa3d9cdde37..611791a4364 100644
--- a/lib/public/AppFramework/Db/Mapper.php
+++ b/lib/public/AppFramework/Db/Mapper.php
@@ -28,7 +28,6 @@
namespace OCP\AppFramework\Db;
use OCP\IDBConnection;
-use OCP\IDb;
/**
@@ -229,11 +228,7 @@ abstract class Mapper {
* @since 7.0.0
*/
protected function execute($sql, array $params=[], $limit=null, $offset=null){
- if ($this->db instanceof IDb) {
- $query = $this->db->prepareQuery($sql, $limit, $offset);
- } else {
- $query = $this->db->prepare($sql, $limit, $offset);
- }
+ $query = $this->db->prepare($sql, $limit, $offset);
if ($this->isAssocArray($params)) {
foreach ($params as $key => $param) {
@@ -251,15 +246,6 @@ abstract class Mapper {
$result = $query->execute();
- // this is only for backwards compatibility reasons and can be removed
- // in owncloud 10. IDb returns a StatementWrapper from execute, PDO,
- // Doctrine and IDbConnection don't so this needs to be done in order
- // to stay backwards compatible for the things that rely on the
- // StatementWrapper being returned
- if ($result instanceof \OC_DB_StatementWrapper) {
- return $result;
- }
-
return $query;
}
diff --git a/lib/public/AppFramework/Http/Response.php b/lib/public/AppFramework/Http/Response.php
index 8591d6abc68..051e68f3144 100644
--- a/lib/public/AppFramework/Http/Response.php
+++ b/lib/public/AppFramework/Http/Response.php
@@ -43,11 +43,11 @@ use OCP\AppFramework\Http;
class Response {
/**
- * Headers - defaults to ['Cache-Control' => 'no-cache, must-revalidate']
+ * Headers - defaults to ['Cache-Control' => 'no-cache, no-store, must-revalidate']
* @var array
*/
private $headers = array(
- 'Cache-Control' => 'no-cache, must-revalidate'
+ 'Cache-Control' => 'no-cache, no-store, must-revalidate'
);
diff --git a/lib/public/Authentication/Exceptions/CredentialsUnavailableException.php b/lib/public/Authentication/Exceptions/CredentialsUnavailableException.php
new file mode 100644
index 00000000000..9f9e38103f7
--- /dev/null
+++ b/lib/public/Authentication/Exceptions/CredentialsUnavailableException.php
@@ -0,0 +1,34 @@
+<?php
+
+/**
+ * @copyright 2016 Christoph Wurst <christoph@winzerhof-wurst.at>
+ *
+ * @author 2016 Christoph Wurst <christoph@winzerhof-wurst.at>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program 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 program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OCP\Authentication\Exceptions;
+
+use Exception;
+
+/**
+ * @since 12
+ */
+class CredentialsUnavailableException extends Exception {
+
+}
diff --git a/lib/public/Authentication/LoginCredentials/ICredentials.php b/lib/public/Authentication/LoginCredentials/ICredentials.php
new file mode 100644
index 00000000000..c5ef9574398
--- /dev/null
+++ b/lib/public/Authentication/LoginCredentials/ICredentials.php
@@ -0,0 +1,58 @@
+<?php
+
+/**
+ * @copyright 2016 Christoph Wurst <christoph@winzerhof-wurst.at>
+ *
+ * @author 2016 Christoph Wurst <christoph@winzerhof-wurst.at>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program 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 program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OCP\Authentication\LoginCredentials;
+
+/**
+ * @since 12
+ */
+interface ICredentials {
+
+ /**
+ * Get the user UID
+ *
+ * @since 12
+ *
+ * @return string
+ */
+ public function getUID();
+
+ /**
+ * Get the login name the users used to login
+ *
+ * @since 12
+ *
+ * @return string
+ */
+ public function getLoginName();
+
+ /**
+ * Get the password
+ *
+ * @since 12
+ *
+ * @return string
+ */
+ public function getPassword();
+}
diff --git a/lib/public/Authentication/LoginCredentials/IStore.php b/lib/public/Authentication/LoginCredentials/IStore.php
new file mode 100644
index 00000000000..4787b16d982
--- /dev/null
+++ b/lib/public/Authentication/LoginCredentials/IStore.php
@@ -0,0 +1,44 @@
+<?php
+
+/**
+ * @copyright 2016 Christoph Wurst <christoph@winzerhof-wurst.at>
+ *
+ * @author 2016 Christoph Wurst <christoph@winzerhof-wurst.at>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program 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 program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OCP\Authentication\LoginCredentials;
+
+use OCP\Authentication\Exceptions\CredentialsUnavailableException;
+
+/**
+ * @since 12
+ */
+interface IStore {
+
+ /**
+ * Get login credentials of the currently logged in user
+ *
+ * @since 12
+ *
+ * @throws CredentialsUnavailableException
+ * @return ICredentials the login credentials of the current user
+ */
+ public function getLoginCredentials();
+
+}
diff --git a/lib/public/Authentication/TwoFactorAuth/TwoFactorException.php b/lib/public/Authentication/TwoFactorAuth/TwoFactorException.php
new file mode 100644
index 00000000000..76e728b6ab0
--- /dev/null
+++ b/lib/public/Authentication/TwoFactorAuth/TwoFactorException.php
@@ -0,0 +1,38 @@
+<?php
+
+/**
+ * @author Cornelius Kölbel <cornelius.koelbel@netknights.it>
+ * @copyright Copyright (c) 2016, ownCloud GmbH.
+ *
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program 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, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCP\Authentication\TwoFactorAuth;
+
+use Exception;
+
+/**
+ * Two Factor Authentication failed
+ *
+ * It defines an Exception a 2FA app can
+ * throw in case of an error. The 2FA Controller will catch this exception and
+ * display this error.
+ *
+ * @since 12
+ */
+class TwoFactorException extends Exception {
+
+}
diff --git a/lib/public/DB/QueryBuilder/IExpressionBuilder.php b/lib/public/DB/QueryBuilder/IExpressionBuilder.php
index 8164c738ca5..c123875b803 100644
--- a/lib/public/DB/QueryBuilder/IExpressionBuilder.php
+++ b/lib/public/DB/QueryBuilder/IExpressionBuilder.php
@@ -305,6 +305,27 @@ interface IExpressionBuilder {
*/
public function notIn($x, $y, $type = null);
+
+ /**
+ * Creates a bitwise AND comparison
+ *
+ * @param string|ILiteral $x The field or value to check
+ * @param int $y Bitmap that must be set
+ * @return IQueryFunction
+ * @since 12.0.0
+ */
+ public function bitwiseAnd($x, $y);
+
+ /**
+ * Creates a bitwise OR comparison
+ *
+ * @param string|ILiteral $x The field or value to check
+ * @param int $y Bitmap that must be set
+ * @return IQueryFunction
+ * @since 12.0.0
+ */
+ public function bitwiseOr($x, $y);
+
/**
* Quotes a given input parameter.
*
diff --git a/lib/public/Encryption/Keys/IStorage.php b/lib/public/Encryption/Keys/IStorage.php
index e17de04316b..c96d1573b38 100644
--- a/lib/public/Encryption/Keys/IStorage.php
+++ b/lib/public/Encryption/Keys/IStorage.php
@@ -170,4 +170,14 @@ interface IStorage {
*/
public function copyKeys($source, $target);
+ /**
+ * backup keys of a given encryption module
+ *
+ * @param string $encryptionModuleId
+ * @param string $purpose
+ * @param string $uid
+ * @return bool
+ * @since 12.0.0
+ */
+ public function backupUserKeys($encryptionModuleId, $purpose, $uid);
}
diff --git a/lib/public/Files/Cache/IScanner.php b/lib/public/Files/Cache/IScanner.php
index 60282996232..8aa4dc04aa9 100644
--- a/lib/public/Files/Cache/IScanner.php
+++ b/lib/public/Files/Cache/IScanner.php
@@ -32,6 +32,7 @@ interface IScanner {
const SCAN_RECURSIVE = true;
const SCAN_SHALLOW = false;
+ const REUSE_NONE = 0;
const REUSE_ETAG = 1;
const REUSE_SIZE = 2;
diff --git a/lib/public/Files/Notify/IChange.php b/lib/public/Files/Notify/IChange.php
new file mode 100644
index 00000000000..1e6aaa8abe0
--- /dev/null
+++ b/lib/public/Files/Notify/IChange.php
@@ -0,0 +1,56 @@
+<?php
+/**
+ * @copyright Copyright (c) 2017 Robin Appelman <robin@icewind.nl>
+ *
+ * @author Robin Appelman <robin@icewind.nl>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program 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 program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OCP\Files\Notify;
+
+/**
+ * Represents a detected change in the storage
+ *
+ * @since 12.0.0
+ */
+interface IChange {
+ const ADDED = 1;
+ const REMOVED = 2;
+ const MODIFIED = 3;
+ const RENAMED = 4;
+
+ /**
+ * Get the type of the change
+ *
+ * @return int IChange::ADDED, IChange::REMOVED, IChange::MODIFIED or IChange::RENAMED
+ *
+ * @since 12.0.0
+ */
+ public function getType();
+
+ /**
+ * Get the path of the file that was changed relative to the root of the storage
+ *
+ * Note, for rename changes this path is the old path for the file
+ *
+ * @return mixed
+ *
+ * @since 12.0.0
+ */
+ public function getPath();
+}
diff --git a/lib/public/Files/Notify/INotifyHandler.php b/lib/public/Files/Notify/INotifyHandler.php
new file mode 100644
index 00000000000..7e0e6a610d8
--- /dev/null
+++ b/lib/public/Files/Notify/INotifyHandler.php
@@ -0,0 +1,64 @@
+<?php
+/**
+ * @copyright Copyright (c) 2017 Robin Appelman <robin@icewind.nl>
+ *
+ * @author Robin Appelman <robin@icewind.nl>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program 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 program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OCP\Files\Notify;
+
+/**
+ * Provides access to detected changes in the storage by either actively listening
+ * or getting the list of changes that happened in the background
+ *
+ * @since 12.0.0
+ */
+interface INotifyHandler {
+ /**
+ * Start listening for update notifications
+ *
+ * The provided callback will be called for every incoming notification with the following parameters
+ * - IChange|IRenameChange $change
+ *
+ * Note that this call is blocking and will not exit on it's own, to stop listening for notifications return `false` from the callback
+ *
+ * @param callable $callback
+ *
+ * @since 12.0.0
+ */
+ public function listen(callable $callback);
+
+ /**
+ * Get all changes detected since the start of the notify process or the last call to getChanges
+ *
+ * @return IChange[]
+ *
+ * @since 12.0.0
+ */
+ public function getChanges();
+
+ /**
+ * Stop listening for changes
+ *
+ * Note that any pending changes will be discarded
+ *
+ * @since 12.0.0
+ */
+ public function stop();
+}
diff --git a/lib/public/Files/Notify/IRenameChange.php b/lib/public/Files/Notify/IRenameChange.php
new file mode 100644
index 00000000000..c95499a7e74
--- /dev/null
+++ b/lib/public/Files/Notify/IRenameChange.php
@@ -0,0 +1,40 @@
+<?php
+/**
+ * @copyright Copyright (c) 2017 Robin Appelman <robin@icewind.nl>
+ *
+ * @author Robin Appelman <robin@icewind.nl>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program 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 program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OCP\Files\Notify;
+
+/**
+ * Represents a detected rename change
+ *
+ * @since 12.0.0
+ */
+interface IRenameChange extends IChange {
+ /**
+ * Get the new path of the renamed file relative to the storage root
+ *
+ * @return string
+ *
+ * @since 12.0.0
+ */
+ public function getTargetPath();
+}
diff --git a/lib/public/Files/Storage/INotifyStorage.php b/lib/public/Files/Storage/INotifyStorage.php
index e99124abdfd..c6fdd44724f 100644
--- a/lib/public/Files/Storage/INotifyStorage.php
+++ b/lib/public/Files/Storage/INotifyStorage.php
@@ -23,6 +23,8 @@
namespace OCP\Files\Storage;
+use OCP\Files\Notify\INotifyHandler;
+
/**
* Storage backend that support active notifications
*
@@ -48,6 +50,17 @@ interface INotifyStorage {
* @param callable $callback
*
* @since 9.1.0
+ * @deprecated 12.0.0 use INotifyStorage::notify()->listen() instead
*/
public function listen($path, callable $callback);
+
+ /**
+ * Start the notification handler for this storage
+ *
+ * @param $path
+ * @return INotifyHandler
+ *
+ * @since 12.0.0
+ */
+ public function notify($path);
}
diff --git a/lib/public/Files/Storage/IStorage.php b/lib/public/Files/Storage/IStorage.php
index b806dc3b7d1..27b8f1d0697 100644
--- a/lib/public/Files/Storage/IStorage.php
+++ b/lib/public/Files/Storage/IStorage.php
@@ -383,7 +383,7 @@ interface IStorage {
public function verifyPath($path, $fileName);
/**
- * @param \OCP\Files\Storage $sourceStorage
+ * @param \OCP\Files\Storage|\OCP\Files\Storage\IStorage $sourceStorage
* @param string $sourceInternalPath
* @param string $targetInternalPath
* @return bool
@@ -392,7 +392,7 @@ interface IStorage {
public function copyFromStorage(\OCP\Files\Storage $sourceStorage, $sourceInternalPath, $targetInternalPath);
/**
- * @param \OCP\Files\Storage $sourceStorage
+ * @param \OCP\Files\Storage|\OCP\Files\Storage\IStorage $sourceStorage
* @param string $sourceInternalPath
* @param string $targetInternalPath
* @return bool
diff --git a/lib/public/GroupInterface.php b/lib/public/GroupInterface.php
index 6f456f51fd7..97837e50b16 100644
--- a/lib/public/GroupInterface.php
+++ b/lib/public/GroupInterface.php
@@ -41,6 +41,18 @@ namespace OCP;
interface GroupInterface {
/**
+ * actions that user backends can define
+ */
+ const CREATE_GROUP = 0x00000001;
+ const DELETE_GROUP = 0x00000010;
+ const ADD_TO_GROUP = 0x00000100;
+ const REMOVE_FROM_GOUP = 0x00001000; // oops
+ const REMOVE_FROM_GROUP = 0x00001000;
+ //OBSOLETE const GET_DISPLAYNAME = 0x00010000;
+ const COUNT_USERS = 0x00100000;
+ const GROUP_DETAILS = 0x01000000;
+
+ /**
* Check if backend implements actions
* @param int $actions bitwise-or'ed actions
* @return boolean
diff --git a/lib/public/IAppConfig.php b/lib/public/IAppConfig.php
index 01aca47ad81..4a92a224840 100644
--- a/lib/public/IAppConfig.php
+++ b/lib/public/IAppConfig.php
@@ -87,6 +87,15 @@ interface IAppConfig {
public function getValues($app, $key);
/**
+ * get all values of the app or and filters out sensitive data
+ *
+ * @param string $app
+ * @return array
+ * @since 12.0.0
+ */
+ public function getFilteredValues($app);
+
+ /**
* sets a value in the appconfig
* @param string $app app
* @param string $key key
diff --git a/lib/public/IDb.php b/lib/public/IDb.php
deleted file mode 100644
index bb04cf540fa..00000000000
--- a/lib/public/IDb.php
+++ /dev/null
@@ -1,54 +0,0 @@
-<?php
-/**
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- *
- * @author Bernhard Posselt <dev@bernhard-posselt.com>
- * @author Morris Jobke <hey@morrisjobke.de>
- *
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program 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, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
- */
-
-namespace OCP;
-
-
-/**
- * Small Facade for being able to inject the database connection for tests
- * @since 7.0.0 - extends IDBConnection was added in 8.1.0
- */
-interface IDb extends IDBConnection {
-
-
- /**
- * Used to abstract the owncloud database access away
- * @param string $sql the sql query with ? placeholder for params
- * @param int $limit the maximum number of rows
- * @param int $offset from which row we want to start
- * @return \OC_DB_StatementWrapper prepared SQL query
- * @since 7.0.0
- */
- public function prepareQuery($sql, $limit=null, $offset=null);
-
-
- /**
- * Used to get the id of the just inserted element
- * @param string $tableName the name of the table where we inserted the item
- * @return int the id of the inserted element
- * @since 7.0.0
- */
- public function getInsertId($tableName);
-
-
-}
diff --git a/lib/public/IGroup.php b/lib/public/IGroup.php
index d5fcbcc5cd9..0cc62e9a8ed 100644
--- a/lib/public/IGroup.php
+++ b/lib/public/IGroup.php
@@ -4,6 +4,7 @@
*
* @author Morris Jobke <hey@morrisjobke.de>
* @author Robin Appelman <robin@icewind.nl>
+ * @author Vincent Petry <PVince81@owncloud.com>
*
* @license AGPL-3.0
*
@@ -37,6 +38,14 @@ interface IGroup {
public function getGID();
/**
+ * Returns the group display name
+ *
+ * @return string
+ * @since 9.2
+ */
+ public function getDisplayName();
+
+ /**
* get all users in the group
*
* @return \OCP\IUser[]
diff --git a/lib/public/IPreview.php b/lib/public/IPreview.php
index a1a03fee3e1..207539b1170 100644
--- a/lib/public/IPreview.php
+++ b/lib/public/IPreview.php
@@ -86,7 +86,7 @@ interface IPreview {
* @param boolean $scaleUp Scale smaller images up to the thumbnail size or not. Might look ugly
* @return \OCP\IImage
* @since 6.0.0
- * @deprecated 9.2.0 Use getPreview
+ * @deprecated 11 Use getPreview
*/
public function createPreview($file, $maxX = 100, $maxY = 75, $scaleUp = false);
diff --git a/lib/public/IServerContainer.php b/lib/public/IServerContainer.php
index 354e39bd8f9..87628be01f7 100644
--- a/lib/public/IServerContainer.php
+++ b/lib/public/IServerContainer.php
@@ -192,14 +192,6 @@ interface IServerContainer {
public function getCredentialsManager();
/**
- * Returns an instance of the db facade
- * @deprecated 8.1.0 use getDatabaseConnection, will be removed in ownCloud 10
- * @return \OCP\IDb
- * @since 7.0.0
- */
- public function getDb();
-
- /**
* Returns the app config manager
*
* @return \OCP\IAppConfig
diff --git a/lib/public/RichObjectStrings/Definitions.php b/lib/public/RichObjectStrings/Definitions.php
index fbde439c47a..f1208ae0f2c 100644
--- a/lib/public/RichObjectStrings/Definitions.php
+++ b/lib/public/RichObjectStrings/Definitions.php
@@ -152,6 +152,31 @@ class Definitions {
],
],
],
+ 'call' => [
+ 'author' => 'Nextcloud',
+ 'app' => 'spreed',
+ 'since' => '11.0.2',
+ 'parameters' => [
+ 'id' => [
+ 'since' => '11.0.2',
+ 'required' => true,
+ 'description' => 'The id used to identify the call on the instance',
+ 'example' => '42',
+ ],
+ 'name' => [
+ 'since' => '11.0.2',
+ 'required' => true,
+ 'description' => 'The display name of the call which should be used in the visual representation',
+ 'example' => 'Company call',
+ ],
+ 'call-type' => [
+ 'since' => '11.0.2',
+ 'required' => true,
+ 'description' => 'The type of the call: one2one, group or public',
+ 'example' => 'one2one',
+ ],
+ ],
+ ],
'email' => [
'author' => 'Nextcloud',
'app' => 'sharebymail',
@@ -191,7 +216,7 @@ class Definitions {
'path' => [
'since' => '11.0.0',
'required' => true,
- 'description' => 'The full path of the file for the user',
+ 'description' => 'The full path of the file for the user, should not start with a slash',
'example' => 'path/to/file.txt',
],
'link' => [
diff --git a/lib/public/Settings/IIconSection.php b/lib/public/Settings/IIconSection.php
new file mode 100644
index 00000000000..089b9b094e9
--- /dev/null
+++ b/lib/public/Settings/IIconSection.php
@@ -0,0 +1,38 @@
+<?php
+/**
+ * @copyright Copyright (c) 2017, Joas Schilling <coding@schilljs.com>
+ *
+ * @author Joas Schilling <coding@schilljs.com>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program 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 program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OCP\Settings;
+
+/**
+ * @since 12
+ */
+interface IIconSection extends ISection {
+ /**
+ * returns the relative path to an 16*16 icon describing the section.
+ * e.g. '/core/img/places/files.svg'
+ *
+ * @returns string
+ * @since 12
+ */
+ public function getIcon();
+}
diff --git a/lib/public/Settings/ISection.php b/lib/public/Settings/ISection.php
index 5edf5de0ca4..3c08b74bdc9 100644
--- a/lib/public/Settings/ISection.php
+++ b/lib/public/Settings/ISection.php
@@ -24,6 +24,7 @@
namespace OCP\Settings;
/**
+ * @deprecated 12 Use IIconSection instead
* @since 9.1
*/
interface ISection {