summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/composer/composer/autoload_classmap.php5
-rw-r--r--lib/composer/composer/autoload_static.php5
-rw-r--r--lib/l10n/bg.js2
-rw-r--r--lib/l10n/bg.json2
-rw-r--r--lib/l10n/cs.js2
-rw-r--r--lib/l10n/cs.json2
-rw-r--r--lib/l10n/de.js2
-rw-r--r--lib/l10n/de.json2
-rw-r--r--lib/l10n/de_DE.js2
-rw-r--r--lib/l10n/de_DE.json2
-rw-r--r--lib/l10n/el.js2
-rw-r--r--lib/l10n/el.json2
-rw-r--r--lib/l10n/es.js2
-rw-r--r--lib/l10n/es.json2
-rw-r--r--lib/l10n/eu.js2
-rw-r--r--lib/l10n/eu.json2
-rw-r--r--lib/l10n/fi.js2
-rw-r--r--lib/l10n/fi.json2
-rw-r--r--lib/l10n/fr.js2
-rw-r--r--lib/l10n/fr.json2
-rw-r--r--lib/l10n/hr.js2
-rw-r--r--lib/l10n/hr.json2
-rw-r--r--lib/l10n/hu.js2
-rw-r--r--lib/l10n/hu.json2
-rw-r--r--lib/l10n/id.js1
-rw-r--r--lib/l10n/id.json1
-rw-r--r--lib/l10n/it.js2
-rw-r--r--lib/l10n/it.json2
-rw-r--r--lib/l10n/ja.js2
-rw-r--r--lib/l10n/ja.json2
-rw-r--r--lib/l10n/mk.js2
-rw-r--r--lib/l10n/mk.json2
-rw-r--r--lib/l10n/nl.js2
-rw-r--r--lib/l10n/nl.json2
-rw-r--r--lib/l10n/nn_NO.js7
-rw-r--r--lib/l10n/nn_NO.json7
-rw-r--r--lib/l10n/pl.js2
-rw-r--r--lib/l10n/pl.json2
-rw-r--r--lib/l10n/pt_BR.js2
-rw-r--r--lib/l10n/pt_BR.json2
-rw-r--r--lib/l10n/pt_PT.js2
-rw-r--r--lib/l10n/pt_PT.json2
-rw-r--r--lib/l10n/ru.js2
-rw-r--r--lib/l10n/ru.json2
-rw-r--r--lib/l10n/sc.js2
-rw-r--r--lib/l10n/sc.json2
-rw-r--r--lib/l10n/sk.js2
-rw-r--r--lib/l10n/sk.json2
-rw-r--r--lib/l10n/sl.js2
-rw-r--r--lib/l10n/sl.json2
-rw-r--r--lib/l10n/sv.js2
-rw-r--r--lib/l10n/sv.json2
-rw-r--r--lib/l10n/th.js2
-rw-r--r--lib/l10n/th.json2
-rw-r--r--lib/l10n/tr.js2
-rw-r--r--lib/l10n/tr.json2
-rw-r--r--lib/l10n/zh_CN.js2
-rw-r--r--lib/l10n/zh_CN.json2
-rw-r--r--lib/l10n/zh_HK.js2
-rw-r--r--lib/l10n/zh_HK.json2
-rw-r--r--lib/l10n/zh_TW.js2
-rw-r--r--lib/l10n/zh_TW.json2
-rw-r--r--lib/private/AllConfig.php4
-rw-r--r--lib/private/App/AppStore/Bundles/HubBundle.php4
-rw-r--r--lib/private/App/CompareVersion.php2
-rw-r--r--lib/private/AppFramework/Http/Dispatcher.php4
-rw-r--r--lib/private/AppFramework/Http/Request.php35
-rw-r--r--lib/private/AppFramework/Middleware/MiddlewareDispatcher.php2
-rw-r--r--lib/private/Authentication/Listeners/UserDeletedFilesCleanupListener.php2
-rw-r--r--lib/private/Authentication/Token/IProvider.php2
-rw-r--r--lib/private/Authentication/Token/PublicKeyTokenProvider.php2
-rw-r--r--lib/private/Avatar/Avatar.php2
-rw-r--r--lib/private/Config.php8
-rw-r--r--lib/private/Contacts/ContactsMenu/ContactsStore.php2
-rw-r--r--lib/private/DB/QueryBuilder/QueryBuilder.php2
-rw-r--r--lib/private/Files/Cache/Cache.php6
-rw-r--r--lib/private/Files/Cache/Propagator.php2
-rw-r--r--lib/private/Files/Cache/QuerySearchHelper.php2
-rw-r--r--lib/private/Files/Cache/Storage.php4
-rw-r--r--lib/private/Files/Cache/StorageGlobal.php2
-rw-r--r--lib/private/Files/Cache/Updater.php4
-rw-r--r--lib/private/Files/Cache/Wrapper/CacheJail.php2
-rw-r--r--lib/private/Files/Cache/Wrapper/CacheWrapper.php2
-rw-r--r--lib/private/Files/Config/UserMountCache.php2
-rw-r--r--lib/private/Files/FileInfo.php2
-rw-r--r--lib/private/Files/Node/Folder.php2
-rw-r--r--lib/private/Files/Node/Root.php2
-rw-r--r--lib/private/Files/ObjectStore/S3ObjectTrait.php9
-rw-r--r--lib/private/Files/SimpleFS/NewSimpleFile.php2
-rw-r--r--lib/private/Files/SimpleFS/SimpleFile.php2
-rw-r--r--lib/private/Files/View.php4
-rw-r--r--lib/private/HintException.php2
-rw-r--r--lib/private/Http/Client/Client.php2
-rw-r--r--lib/private/Http/Client/LocalAddressChecker.php16
-rw-r--r--lib/private/MemoryInfo.php2
-rw-r--r--lib/private/Metadata/IMetadataManager.php2
-rw-r--r--lib/private/OCS/DiscoveryService.php2
-rw-r--r--lib/private/Profile/ProfileManager.php4
-rw-r--r--lib/private/Repair/RemoveLinkShares.php2
-rw-r--r--lib/private/Route/Router.php2
-rw-r--r--lib/private/Security/Bruteforce/Throttler.php8
-rw-r--r--lib/private/Security/TrustedDomainHelper.php2
-rw-r--r--lib/private/Server.php2
-rw-r--r--lib/private/Session/Internal.php2
-rw-r--r--lib/private/Share/Constants.php2
-rw-r--r--lib/private/Share/Share.php4
-rw-r--r--lib/private/Share20/DefaultShareProvider.php96
-rw-r--r--lib/private/Share20/Manager.php13
-rw-r--r--lib/private/Share20/Share.php29
-rw-r--r--lib/private/Share20/ShareAttributes.php73
-rw-r--r--lib/private/URLGenerator.php2
-rw-r--r--lib/private/legacy/OC_Files.php33
-rw-r--r--lib/public/Files/Cache/ICache.php2
-rw-r--r--lib/public/Files/Events/BeforeDirectFileDownloadEvent.php84
-rw-r--r--lib/public/Files/Events/BeforeZipCreatedEvent.php91
-rw-r--r--lib/public/Security/Bruteforce/IThrottler.php126
-rw-r--r--lib/public/Share/IAttributes.php68
-rw-r--r--lib/public/Share/IManager.php3
-rw-r--r--lib/public/Share/IShare.php31
-rw-r--r--lib/public/Share/IShareProvider.php3
120 files changed, 793 insertions, 173 deletions
diff --git a/lib/composer/composer/autoload_classmap.php b/lib/composer/composer/autoload_classmap.php
index 420bc89c735..c55fb8080b0 100644
--- a/lib/composer/composer/autoload_classmap.php
+++ b/lib/composer/composer/autoload_classmap.php
@@ -266,8 +266,10 @@ return array(
'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\\Events\\BeforeDirectFileDownloadEvent' => $baseDir . '/lib/public/Files/Events/BeforeDirectFileDownloadEvent.php',
'OCP\\Files\\Events\\BeforeFileScannedEvent' => $baseDir . '/lib/public/Files/Events/BeforeFileScannedEvent.php',
'OCP\\Files\\Events\\BeforeFolderScannedEvent' => $baseDir . '/lib/public/Files/Events/BeforeFolderScannedEvent.php',
+ 'OCP\\Files\\Events\\BeforeZipCreatedEvent' => $baseDir . '/lib/public/Files/Events/BeforeZipCreatedEvent.php',
'OCP\\Files\\Events\\FileCacheUpdated' => $baseDir . '/lib/public/Files/Events/FileCacheUpdated.php',
'OCP\\Files\\Events\\FileScannedEvent' => $baseDir . '/lib/public/Files/Events/FileScannedEvent.php',
'OCP\\Files\\Events\\FolderScannedEvent' => $baseDir . '/lib/public/Files/Events/FolderScannedEvent.php',
@@ -510,6 +512,7 @@ return array(
'OCP\\Search\\Result' => $baseDir . '/lib/public/Search/Result.php',
'OCP\\Search\\SearchResult' => $baseDir . '/lib/public/Search/SearchResult.php',
'OCP\\Search\\SearchResultEntry' => $baseDir . '/lib/public/Search/SearchResultEntry.php',
+ 'OCP\\Security\\Bruteforce\\IThrottler' => $baseDir . '/lib/public/Security/Bruteforce/IThrottler.php',
'OCP\\Security\\Bruteforce\\MaxDelayReached' => $baseDir . '/lib/public/Security/Bruteforce/MaxDelayReached.php',
'OCP\\Security\\CSP\\AddContentSecurityPolicyEvent' => $baseDir . '/lib/public/Security/CSP/AddContentSecurityPolicyEvent.php',
'OCP\\Security\\Events\\GenerateSecurePasswordEvent' => $baseDir . '/lib/public/Security/Events/GenerateSecurePasswordEvent.php',
@@ -538,6 +541,7 @@ return array(
'OCP\\Share\\Exceptions\\GenericShareException' => $baseDir . '/lib/public/Share/Exceptions/GenericShareException.php',
'OCP\\Share\\Exceptions\\IllegalIDChangeException' => $baseDir . '/lib/public/Share/Exceptions/IllegalIDChangeException.php',
'OCP\\Share\\Exceptions\\ShareNotFound' => $baseDir . '/lib/public/Share/Exceptions/ShareNotFound.php',
+ 'OCP\\Share\\IAttributes' => $baseDir . '/lib/public/Share/IAttributes.php',
'OCP\\Share\\IManager' => $baseDir . '/lib/public/Share/IManager.php',
'OCP\\Share\\IProviderFactory' => $baseDir . '/lib/public/Share/IProviderFactory.php',
'OCP\\Share\\IShare' => $baseDir . '/lib/public/Share/IShare.php',
@@ -1511,6 +1515,7 @@ return array(
'OC\\Share20\\Manager' => $baseDir . '/lib/private/Share20/Manager.php',
'OC\\Share20\\ProviderFactory' => $baseDir . '/lib/private/Share20/ProviderFactory.php',
'OC\\Share20\\Share' => $baseDir . '/lib/private/Share20/Share.php',
+ 'OC\\Share20\\ShareAttributes' => $baseDir . '/lib/private/Share20/ShareAttributes.php',
'OC\\Share20\\ShareHelper' => $baseDir . '/lib/private/Share20/ShareHelper.php',
'OC\\Share20\\UserRemovedListener' => $baseDir . '/lib/private/Share20/UserRemovedListener.php',
'OC\\Share\\Constants' => $baseDir . '/lib/private/Share/Constants.php',
diff --git a/lib/composer/composer/autoload_static.php b/lib/composer/composer/autoload_static.php
index 9a371b45743..16b147814c4 100644
--- a/lib/composer/composer/autoload_static.php
+++ b/lib/composer/composer/autoload_static.php
@@ -299,8 +299,10 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2
'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\\Events\\BeforeDirectFileDownloadEvent' => __DIR__ . '/../../..' . '/lib/public/Files/Events/BeforeDirectFileDownloadEvent.php',
'OCP\\Files\\Events\\BeforeFileScannedEvent' => __DIR__ . '/../../..' . '/lib/public/Files/Events/BeforeFileScannedEvent.php',
'OCP\\Files\\Events\\BeforeFolderScannedEvent' => __DIR__ . '/../../..' . '/lib/public/Files/Events/BeforeFolderScannedEvent.php',
+ 'OCP\\Files\\Events\\BeforeZipCreatedEvent' => __DIR__ . '/../../..' . '/lib/public/Files/Events/BeforeZipCreatedEvent.php',
'OCP\\Files\\Events\\FileCacheUpdated' => __DIR__ . '/../../..' . '/lib/public/Files/Events/FileCacheUpdated.php',
'OCP\\Files\\Events\\FileScannedEvent' => __DIR__ . '/../../..' . '/lib/public/Files/Events/FileScannedEvent.php',
'OCP\\Files\\Events\\FolderScannedEvent' => __DIR__ . '/../../..' . '/lib/public/Files/Events/FolderScannedEvent.php',
@@ -543,6 +545,7 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2
'OCP\\Search\\Result' => __DIR__ . '/../../..' . '/lib/public/Search/Result.php',
'OCP\\Search\\SearchResult' => __DIR__ . '/../../..' . '/lib/public/Search/SearchResult.php',
'OCP\\Search\\SearchResultEntry' => __DIR__ . '/../../..' . '/lib/public/Search/SearchResultEntry.php',
+ 'OCP\\Security\\Bruteforce\\IThrottler' => __DIR__ . '/../../..' . '/lib/public/Security/Bruteforce/IThrottler.php',
'OCP\\Security\\Bruteforce\\MaxDelayReached' => __DIR__ . '/../../..' . '/lib/public/Security/Bruteforce/MaxDelayReached.php',
'OCP\\Security\\CSP\\AddContentSecurityPolicyEvent' => __DIR__ . '/../../..' . '/lib/public/Security/CSP/AddContentSecurityPolicyEvent.php',
'OCP\\Security\\Events\\GenerateSecurePasswordEvent' => __DIR__ . '/../../..' . '/lib/public/Security/Events/GenerateSecurePasswordEvent.php',
@@ -571,6 +574,7 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2
'OCP\\Share\\Exceptions\\GenericShareException' => __DIR__ . '/../../..' . '/lib/public/Share/Exceptions/GenericShareException.php',
'OCP\\Share\\Exceptions\\IllegalIDChangeException' => __DIR__ . '/../../..' . '/lib/public/Share/Exceptions/IllegalIDChangeException.php',
'OCP\\Share\\Exceptions\\ShareNotFound' => __DIR__ . '/../../..' . '/lib/public/Share/Exceptions/ShareNotFound.php',
+ 'OCP\\Share\\IAttributes' => __DIR__ . '/../../..' . '/lib/public/Share/IAttributes.php',
'OCP\\Share\\IManager' => __DIR__ . '/../../..' . '/lib/public/Share/IManager.php',
'OCP\\Share\\IProviderFactory' => __DIR__ . '/../../..' . '/lib/public/Share/IProviderFactory.php',
'OCP\\Share\\IShare' => __DIR__ . '/../../..' . '/lib/public/Share/IShare.php',
@@ -1544,6 +1548,7 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2
'OC\\Share20\\Manager' => __DIR__ . '/../../..' . '/lib/private/Share20/Manager.php',
'OC\\Share20\\ProviderFactory' => __DIR__ . '/../../..' . '/lib/private/Share20/ProviderFactory.php',
'OC\\Share20\\Share' => __DIR__ . '/../../..' . '/lib/private/Share20/Share.php',
+ 'OC\\Share20\\ShareAttributes' => __DIR__ . '/../../..' . '/lib/private/Share20/ShareAttributes.php',
'OC\\Share20\\ShareHelper' => __DIR__ . '/../../..' . '/lib/private/Share20/ShareHelper.php',
'OC\\Share20\\UserRemovedListener' => __DIR__ . '/../../..' . '/lib/private/Share20/UserRemovedListener.php',
'OC\\Share\\Constants' => __DIR__ . '/../../..' . '/lib/private/Share/Constants.php',
diff --git a/lib/l10n/bg.js b/lib/l10n/bg.js
index 5bb80037704..172493809dd 100644
--- a/lib/l10n/bg.js
+++ b/lib/l10n/bg.js
@@ -207,7 +207,6 @@ OC.L10N.register(
"App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "Приложението „%1$s“ не може да бъде инсталирано, защото следните зависимости не са изпълнени: %2$s",
"a safe home for all your data" : "безопасен дом за всички ваши данни",
"File is currently busy, please try again later" : "Файлът в момента е зает, моля, опитайте отново по-късно",
- "Cannot read file" : "Не може да се прочете файл",
"Application is not enabled" : "Приложението не е включено",
"Authentication error" : "Грешка при удостоверяването",
"Token expired. Please reload page." : "Изтекла сесия. Моля, презареди страницата.",
@@ -257,6 +256,7 @@ OC.L10N.register(
"Storage is temporarily not available" : "Временно хранилището не е налично",
"Storage connection timeout. %s" : "Време за изчакване при свързването с хранилище. %s",
"This can usually be fixed by giving the webserver write access to the config directory." : "Това обикновено може да бъде оправено като, се даде достъп на уеб сървъра да записва в config директорията.",
+ "Cannot read file" : "Не може да се прочете файл",
"Cannot write into \"config\" directory" : "Неуспешен опит за запис в \"config\" папката.",
"This can usually be fixed by giving the webserver write access to the config directory. See %s" : "Това обикновено може да бъде оправено като, се даде достъп на уеб сървъра да записва в config директорията. Погледнете %s",
"Cannot write into \"apps\" directory" : "Писането в папка приложения не е възможно",
diff --git a/lib/l10n/bg.json b/lib/l10n/bg.json
index fa91716ae01..954c27b98eb 100644
--- a/lib/l10n/bg.json
+++ b/lib/l10n/bg.json
@@ -205,7 +205,6 @@
"App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "Приложението „%1$s“ не може да бъде инсталирано, защото следните зависимости не са изпълнени: %2$s",
"a safe home for all your data" : "безопасен дом за всички ваши данни",
"File is currently busy, please try again later" : "Файлът в момента е зает, моля, опитайте отново по-късно",
- "Cannot read file" : "Не може да се прочете файл",
"Application is not enabled" : "Приложението не е включено",
"Authentication error" : "Грешка при удостоверяването",
"Token expired. Please reload page." : "Изтекла сесия. Моля, презареди страницата.",
@@ -255,6 +254,7 @@
"Storage is temporarily not available" : "Временно хранилището не е налично",
"Storage connection timeout. %s" : "Време за изчакване при свързването с хранилище. %s",
"This can usually be fixed by giving the webserver write access to the config directory." : "Това обикновено може да бъде оправено като, се даде достъп на уеб сървъра да записва в config директорията.",
+ "Cannot read file" : "Не може да се прочете файл",
"Cannot write into \"config\" directory" : "Неуспешен опит за запис в \"config\" папката.",
"This can usually be fixed by giving the webserver write access to the config directory. See %s" : "Това обикновено може да бъде оправено като, се даде достъп на уеб сървъра да записва в config директорията. Погледнете %s",
"Cannot write into \"apps\" directory" : "Писането в папка приложения не е възможно",
diff --git a/lib/l10n/cs.js b/lib/l10n/cs.js
index 9f5de98a9e6..2d5826880c3 100644
--- a/lib/l10n/cs.js
+++ b/lib/l10n/cs.js
@@ -207,7 +207,6 @@ OC.L10N.register(
"App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "Aplikaci „%1$s“ nelze nainstalovat, protože nejsou splněny následující závislosti: %2$s",
"a safe home for all your data" : "bezpečný domov pro všechna vaše data",
"File is currently busy, please try again later" : "Soubor je nyní používán, zkuste to později",
- "Cannot read file" : "Nelze přečíst soubor",
"Application is not enabled" : "Aplikace není povolena",
"Authentication error" : "Chyba při ověřování se",
"Token expired. Please reload page." : "Platnost tokenu skončila. Načtěte stránku znovu.",
@@ -257,6 +256,7 @@ OC.L10N.register(
"Storage is temporarily not available" : "Úložiště je dočasně nedostupné",
"Storage connection timeout. %s" : "Překročen časový limit připojování k úložišti. %s",
"This can usually be fixed by giving the webserver write access to the config directory." : "Toto je obvykle možné vyřešit udělením webovému serveru oprávnění k zápisu do adresáře s nastaveními.",
+ "Cannot read file" : "Nelze přečíst soubor",
"Cannot write into \"config\" directory" : "Nelze zapisovat do adresáře „config“",
"This can usually be fixed by giving the webserver write access to the config directory. See %s" : "Toto obvykle lze vyřešit udělením oprávnění k zápisu do kořenové složky webu pro účet, pod kterým je provozován webový server. Viz %s",
"Cannot write into \"apps\" directory" : "Nedaří se zapisovat do adresáře „apps“",
diff --git a/lib/l10n/cs.json b/lib/l10n/cs.json
index 1401735b826..046cc69627a 100644
--- a/lib/l10n/cs.json
+++ b/lib/l10n/cs.json
@@ -205,7 +205,6 @@
"App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "Aplikaci „%1$s“ nelze nainstalovat, protože nejsou splněny následující závislosti: %2$s",
"a safe home for all your data" : "bezpečný domov pro všechna vaše data",
"File is currently busy, please try again later" : "Soubor je nyní používán, zkuste to později",
- "Cannot read file" : "Nelze přečíst soubor",
"Application is not enabled" : "Aplikace není povolena",
"Authentication error" : "Chyba při ověřování se",
"Token expired. Please reload page." : "Platnost tokenu skončila. Načtěte stránku znovu.",
@@ -255,6 +254,7 @@
"Storage is temporarily not available" : "Úložiště je dočasně nedostupné",
"Storage connection timeout. %s" : "Překročen časový limit připojování k úložišti. %s",
"This can usually be fixed by giving the webserver write access to the config directory." : "Toto je obvykle možné vyřešit udělením webovému serveru oprávnění k zápisu do adresáře s nastaveními.",
+ "Cannot read file" : "Nelze přečíst soubor",
"Cannot write into \"config\" directory" : "Nelze zapisovat do adresáře „config“",
"This can usually be fixed by giving the webserver write access to the config directory. See %s" : "Toto obvykle lze vyřešit udělením oprávnění k zápisu do kořenové složky webu pro účet, pod kterým je provozován webový server. Viz %s",
"Cannot write into \"apps\" directory" : "Nedaří se zapisovat do adresáře „apps“",
diff --git a/lib/l10n/de.js b/lib/l10n/de.js
index c8c03b8028f..1d6ad46dc6c 100644
--- a/lib/l10n/de.js
+++ b/lib/l10n/de.js
@@ -207,7 +207,6 @@ OC.L10N.register(
"App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "Die App „%1$s“ kann nicht installiert werden, da die folgenden Abhängigkeiten nicht erfüllt sind: %2$s",
"a safe home for all your data" : "ein sicherer Ort für all Deine Daten",
"File is currently busy, please try again later" : "Die Datei ist in Benutzung, bitte versuche es später noch einmal",
- "Cannot 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 lade die Seite neu.",
@@ -257,6 +256,7 @@ OC.L10N.register(
"Storage is temporarily not available" : "Speicher ist vorübergehend nicht verfügbar",
"Storage connection timeout. %s" : "Zeitüberschreitung der Verbindung zum Speicherplatz. %s",
"This can usually be fixed by giving the webserver write access to the config directory." : "Dies kann normalerweise behoben werden, indem dem Webserver Schreibzugriff auf das config-Verzeichnis gegeben wird.",
+ "Cannot read file" : "Datei kann nicht gelesen werden",
"Cannot write into \"config\" directory" : "Schreiben in das „config“-Verzeichnis ist nicht möglich",
"This can usually be fixed by giving the webserver write access to the config directory. See %s" : "Dies kann zumeist behoben werden, indem dem Web-Server Schreibzugriff auf das Konfigurationsverzeichnis eingeräumt wird. Siehe auch %s",
"Cannot write into \"apps\" directory" : "Schreiben in das „apps“-Verzeichnis ist nicht möglich",
diff --git a/lib/l10n/de.json b/lib/l10n/de.json
index a3dec1fe691..f15cf1cc343 100644
--- a/lib/l10n/de.json
+++ b/lib/l10n/de.json
@@ -205,7 +205,6 @@
"App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "Die App „%1$s“ kann nicht installiert werden, da die folgenden Abhängigkeiten nicht erfüllt sind: %2$s",
"a safe home for all your data" : "ein sicherer Ort für all Deine Daten",
"File is currently busy, please try again later" : "Die Datei ist in Benutzung, bitte versuche es später noch einmal",
- "Cannot 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 lade die Seite neu.",
@@ -255,6 +254,7 @@
"Storage is temporarily not available" : "Speicher ist vorübergehend nicht verfügbar",
"Storage connection timeout. %s" : "Zeitüberschreitung der Verbindung zum Speicherplatz. %s",
"This can usually be fixed by giving the webserver write access to the config directory." : "Dies kann normalerweise behoben werden, indem dem Webserver Schreibzugriff auf das config-Verzeichnis gegeben wird.",
+ "Cannot read file" : "Datei kann nicht gelesen werden",
"Cannot write into \"config\" directory" : "Schreiben in das „config“-Verzeichnis ist nicht möglich",
"This can usually be fixed by giving the webserver write access to the config directory. See %s" : "Dies kann zumeist behoben werden, indem dem Web-Server Schreibzugriff auf das Konfigurationsverzeichnis eingeräumt wird. Siehe auch %s",
"Cannot write into \"apps\" directory" : "Schreiben in das „apps“-Verzeichnis ist nicht möglich",
diff --git a/lib/l10n/de_DE.js b/lib/l10n/de_DE.js
index d7b983dba66..22236cf9a2a 100644
--- a/lib/l10n/de_DE.js
+++ b/lib/l10n/de_DE.js
@@ -207,7 +207,6 @@ OC.L10N.register(
"App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "Die App „%1$s“ kann nicht installiert werden, da die folgenden Abhängigkeiten nicht erfüllt sind: %2$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 in Benutzung, bitte versuchen Sie es später noch einmal",
- "Cannot 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.",
@@ -257,6 +256,7 @@ OC.L10N.register(
"Storage is temporarily not available" : "Speicher ist vorübergehend nicht verfügbar",
"Storage connection timeout. %s" : "Zeitüberschreitung der Verbindung zum Speicherplatz. %s",
"This can usually be fixed by giving the webserver write access to the config directory." : "Dies kann normalerweise behoben werden, indem dem Webserver Schreibzugriff auf das config-Verzeichnis gegeben wird.",
+ "Cannot read file" : "Datei kann nicht gelesen werden",
"Cannot write into \"config\" directory" : "Schreiben in das „config“-Verzeichnis ist nicht möglich",
"This can usually be fixed by giving the webserver write access to the config directory. See %s" : "Dies kann zumeist behoben werden, indem dem Web-Server Schreibzugriff auf das Konfigurationsverzeichnis eingeräumt wird. Siehe auch %s",
"Cannot write into \"apps\" directory" : "Schreiben in das „apps“-Verzeichnis ist nicht möglich",
diff --git a/lib/l10n/de_DE.json b/lib/l10n/de_DE.json
index c456ac01d75..5ba3f865525 100644
--- a/lib/l10n/de_DE.json
+++ b/lib/l10n/de_DE.json
@@ -205,7 +205,6 @@
"App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "Die App „%1$s“ kann nicht installiert werden, da die folgenden Abhängigkeiten nicht erfüllt sind: %2$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 in Benutzung, bitte versuchen Sie es später noch einmal",
- "Cannot 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.",
@@ -255,6 +254,7 @@
"Storage is temporarily not available" : "Speicher ist vorübergehend nicht verfügbar",
"Storage connection timeout. %s" : "Zeitüberschreitung der Verbindung zum Speicherplatz. %s",
"This can usually be fixed by giving the webserver write access to the config directory." : "Dies kann normalerweise behoben werden, indem dem Webserver Schreibzugriff auf das config-Verzeichnis gegeben wird.",
+ "Cannot read file" : "Datei kann nicht gelesen werden",
"Cannot write into \"config\" directory" : "Schreiben in das „config“-Verzeichnis ist nicht möglich",
"This can usually be fixed by giving the webserver write access to the config directory. See %s" : "Dies kann zumeist behoben werden, indem dem Web-Server Schreibzugriff auf das Konfigurationsverzeichnis eingeräumt wird. Siehe auch %s",
"Cannot write into \"apps\" directory" : "Schreiben in das „apps“-Verzeichnis ist nicht möglich",
diff --git a/lib/l10n/el.js b/lib/l10n/el.js
index 84bd8b77d65..d0011407a62 100644
--- a/lib/l10n/el.js
+++ b/lib/l10n/el.js
@@ -207,7 +207,6 @@ OC.L10N.register(
"App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "Η εφαρμογή \"%1$s\" δεν μπορεί να εγκατασταθεί επειδή δεν πληρούνται τα προαπαιτούμενα: %2$s",
"a safe home for all your data" : "ένα ασφαλές μέρος για όλα τα δεδομένα σας",
"File is currently busy, please try again later" : "Το αρχείο χρησιμοποιείται αυτή τη στιγμή, παρακαλούμε προσπαθήστε αργότερα",
- "Cannot read file" : "Δεν είναι δυνατή η ανάγνωση του αρχείου",
"Application is not enabled" : "Δεν ενεργοποιήθηκε η εφαρμογή",
"Authentication error" : "Σφάλμα πιστοποίησης",
"Token expired. Please reload page." : "Το αναγνωριστικό έληξε. Παρακαλούμε φορτώστε ξανά την σελίδα.",
@@ -255,6 +254,7 @@ OC.L10N.register(
"Storage is temporarily not available" : "Ο χώρος αποθήκευσης δεν είναι διαθέσιμος προσωρινά",
"Storage connection timeout. %s" : "Λήξη χρονικού ορίου σύνδεσης με αποθηκευτικό χώρο.%s",
"This can usually be fixed by giving the webserver write access to the config directory." : "Αυτό μπορεί συνήθως να διορθωθεί παρέχοντας δικαιώματα εγγραφής για το φάκελο config στον διακομιστή ιστού.",
+ "Cannot read file" : "Δεν είναι δυνατή η ανάγνωση του αρχείου",
"Cannot write into \"config\" directory" : "Αδυναμία εγγραφής στον κατάλογο \"config\"",
"This can usually be fixed by giving the webserver write access to the config directory. See %s" : "Αυτό μπορεί συνήθως να διορθωθεί δίνοντας στον διακομιστή ιστού δικαιώματα εγγραφής στον κατάλογο config. Δείτε το%s",
"Cannot write into \"apps\" directory" : "Αδυναμία εγγραφής στον κατάλογο \"apps\"",
diff --git a/lib/l10n/el.json b/lib/l10n/el.json
index 4b947c61b57..d52815ac6f6 100644
--- a/lib/l10n/el.json
+++ b/lib/l10n/el.json
@@ -205,7 +205,6 @@
"App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "Η εφαρμογή \"%1$s\" δεν μπορεί να εγκατασταθεί επειδή δεν πληρούνται τα προαπαιτούμενα: %2$s",
"a safe home for all your data" : "ένα ασφαλές μέρος για όλα τα δεδομένα σας",
"File is currently busy, please try again later" : "Το αρχείο χρησιμοποιείται αυτή τη στιγμή, παρακαλούμε προσπαθήστε αργότερα",
- "Cannot read file" : "Δεν είναι δυνατή η ανάγνωση του αρχείου",
"Application is not enabled" : "Δεν ενεργοποιήθηκε η εφαρμογή",
"Authentication error" : "Σφάλμα πιστοποίησης",
"Token expired. Please reload page." : "Το αναγνωριστικό έληξε. Παρακαλούμε φορτώστε ξανά την σελίδα.",
@@ -253,6 +252,7 @@
"Storage is temporarily not available" : "Ο χώρος αποθήκευσης δεν είναι διαθέσιμος προσωρινά",
"Storage connection timeout. %s" : "Λήξη χρονικού ορίου σύνδεσης με αποθηκευτικό χώρο.%s",
"This can usually be fixed by giving the webserver write access to the config directory." : "Αυτό μπορεί συνήθως να διορθωθεί παρέχοντας δικαιώματα εγγραφής για το φάκελο config στον διακομιστή ιστού.",
+ "Cannot read file" : "Δεν είναι δυνατή η ανάγνωση του αρχείου",
"Cannot write into \"config\" directory" : "Αδυναμία εγγραφής στον κατάλογο \"config\"",
"This can usually be fixed by giving the webserver write access to the config directory. See %s" : "Αυτό μπορεί συνήθως να διορθωθεί δίνοντας στον διακομιστή ιστού δικαιώματα εγγραφής στον κατάλογο config. Δείτε το%s",
"Cannot write into \"apps\" directory" : "Αδυναμία εγγραφής στον κατάλογο \"apps\"",
diff --git a/lib/l10n/es.js b/lib/l10n/es.js
index b35778453e6..efd49e6c020 100644
--- a/lib/l10n/es.js
+++ b/lib/l10n/es.js
@@ -207,7 +207,6 @@ OC.L10N.register(
"App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "No se ha podido instlaar la app «%1$s» porque no se cumplen las siguientes dependencias: %2$s",
"a safe home for all your data" : "un hogar seguro para todos tus datos",
"File is currently busy, please try again later" : "El archivo se encuentra actualmente ocupado, por favor inténtelo de nuevo más tarde",
- "Cannot read file" : "No se puede leer archivo",
"Application is not enabled" : "La aplicación no está habilitada",
"Authentication error" : "Error de autenticación",
"Token expired. Please reload page." : "Token caducado. Por favor, recarge la página.",
@@ -257,6 +256,7 @@ OC.L10N.register(
"Storage is temporarily not available" : "El almacenamiento no esta disponible temporalmente",
"Storage connection timeout. %s" : "Tiempo de conexión de almacenamiento agotado. %s",
"This can usually be fixed by giving the webserver write access to the config directory." : "Se podría solucionar esto dándole al servidor permisos de escritura del directorio de configuración.",
+ "Cannot read file" : "No se puede leer archivo",
"Cannot write into \"config\" directory" : "No se puede escribir el el directorio de configuración",
"This can usually be fixed by giving the webserver write access to the config directory. See %s" : "Se podría solucionar esto dándole al servidor permisos de escritura del directorio de configuración. Ver %s",
"Cannot write into \"apps\" directory" : "No se puede escribir en el directorio de \"apps\"",
diff --git a/lib/l10n/es.json b/lib/l10n/es.json
index 36fd13d858b..ae9b87df314 100644
--- a/lib/l10n/es.json
+++ b/lib/l10n/es.json
@@ -205,7 +205,6 @@
"App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "No se ha podido instlaar la app «%1$s» porque no se cumplen las siguientes dependencias: %2$s",
"a safe home for all your data" : "un hogar seguro para todos tus datos",
"File is currently busy, please try again later" : "El archivo se encuentra actualmente ocupado, por favor inténtelo de nuevo más tarde",
- "Cannot read file" : "No se puede leer archivo",
"Application is not enabled" : "La aplicación no está habilitada",
"Authentication error" : "Error de autenticación",
"Token expired. Please reload page." : "Token caducado. Por favor, recarge la página.",
@@ -255,6 +254,7 @@
"Storage is temporarily not available" : "El almacenamiento no esta disponible temporalmente",
"Storage connection timeout. %s" : "Tiempo de conexión de almacenamiento agotado. %s",
"This can usually be fixed by giving the webserver write access to the config directory." : "Se podría solucionar esto dándole al servidor permisos de escritura del directorio de configuración.",
+ "Cannot read file" : "No se puede leer archivo",
"Cannot write into \"config\" directory" : "No se puede escribir el el directorio de configuración",
"This can usually be fixed by giving the webserver write access to the config directory. See %s" : "Se podría solucionar esto dándole al servidor permisos de escritura del directorio de configuración. Ver %s",
"Cannot write into \"apps\" directory" : "No se puede escribir en el directorio de \"apps\"",
diff --git a/lib/l10n/eu.js b/lib/l10n/eu.js
index ffe6d4d8808..9418aa67788 100644
--- a/lib/l10n/eu.js
+++ b/lib/l10n/eu.js
@@ -207,7 +207,6 @@ OC.L10N.register(
"App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "\"%1$s\" aplikazioa ezin da instalatu, menpekotasun hauek betetzen ez direlako:%2$s",
"a safe home for all your data" : "zure datu guztientzako toki segurua",
"File is currently busy, please try again later" : "Fitxategia lanpetuta dago, saiatu berriro geroago",
- "Cannot read file" : "Ezin da fitxategia irakurri",
"Application is not enabled" : "Aplikazioa ez dago gaituta",
"Authentication error" : "Autentifikazio errorea",
"Token expired. Please reload page." : "Tokena iraungitu da. Mesedez birkargatu orria.",
@@ -257,6 +256,7 @@ OC.L10N.register(
"Storage is temporarily not available" : "Biltegia ez dago erabilgarri aldi baterako",
"Storage connection timeout. %s" : "Biltegiratze-konexioa denboraz kanpo geratu da. %s",
"This can usually be fixed by giving the webserver write access to the config directory." : "Hau normalean web zerbitzarira config karpetan idazteko baimenak emanez konpondu daiteke.",
+ "Cannot read file" : "Ezin da fitxategia irakurri",
"Cannot write into \"config\" directory" : "Ezin da idatzi \"config\" karpetan",
"This can usually be fixed by giving the webserver write access to the config directory. See %s" : "Hau normalean konpondu daiteke web zerbitzariari konfigurazio direktoriorako sarbidea emanez. Ikus %s",
"Cannot write into \"apps\" directory" : "Ezin da idatzi \"apps\" karpetan",
diff --git a/lib/l10n/eu.json b/lib/l10n/eu.json
index 98461448e2d..8445cdb9135 100644
--- a/lib/l10n/eu.json
+++ b/lib/l10n/eu.json
@@ -205,7 +205,6 @@
"App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "\"%1$s\" aplikazioa ezin da instalatu, menpekotasun hauek betetzen ez direlako:%2$s",
"a safe home for all your data" : "zure datu guztientzako toki segurua",
"File is currently busy, please try again later" : "Fitxategia lanpetuta dago, saiatu berriro geroago",
- "Cannot read file" : "Ezin da fitxategia irakurri",
"Application is not enabled" : "Aplikazioa ez dago gaituta",
"Authentication error" : "Autentifikazio errorea",
"Token expired. Please reload page." : "Tokena iraungitu da. Mesedez birkargatu orria.",
@@ -255,6 +254,7 @@
"Storage is temporarily not available" : "Biltegia ez dago erabilgarri aldi baterako",
"Storage connection timeout. %s" : "Biltegiratze-konexioa denboraz kanpo geratu da. %s",
"This can usually be fixed by giving the webserver write access to the config directory." : "Hau normalean web zerbitzarira config karpetan idazteko baimenak emanez konpondu daiteke.",
+ "Cannot read file" : "Ezin da fitxategia irakurri",
"Cannot write into \"config\" directory" : "Ezin da idatzi \"config\" karpetan",
"This can usually be fixed by giving the webserver write access to the config directory. See %s" : "Hau normalean konpondu daiteke web zerbitzariari konfigurazio direktoriorako sarbidea emanez. Ikus %s",
"Cannot write into \"apps\" directory" : "Ezin da idatzi \"apps\" karpetan",
diff --git a/lib/l10n/fi.js b/lib/l10n/fi.js
index 93c4d632aef..62ac7751f43 100644
--- a/lib/l10n/fi.js
+++ b/lib/l10n/fi.js
@@ -189,7 +189,6 @@ OC.L10N.register(
"App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "Sovellusta \"%1$s\" ei voi asentaa, koska seuraavat riippuvuudet eivät täyty: %2$s",
"a safe home for all your data" : "turvallinen koti kaikille tiedostoillesi",
"File is currently busy, please try again later" : "Tiedosto on parhaillaan käytössä, yritä myöhemmin uudelleen",
- "Cannot read file" : "Tiedostoa ei voi lukea",
"Application is not enabled" : "Sovellusta ei ole otettu käyttöön",
"Authentication error" : "Tunnistautumisvirhe",
"Token expired. Please reload page." : "Valtuutus vanheni. Lataa sivu uudelleen.",
@@ -221,6 +220,7 @@ OC.L10N.register(
"Storage connection error. %s" : "Tallennustilan yhteysvirhe. %s",
"Storage is temporarily not available" : "Tallennustila on tilapäisesti pois käytöstä",
"Storage connection timeout. %s" : "Tallennustilan yhteyden aikakatkaisu. %s",
+ "Cannot read file" : "Tiedostoa ei voi lukea",
"Cannot write into \"config\" directory" : "Hakemistoon \"config\" kirjoittaminen ei onnistu",
"Cannot write into \"apps\" directory" : "Hakemistoon \"apps\" kirjoittaminen ei onnistu",
"Cannot create \"data\" directory" : "Hakemiston \"data\" luominen ei onnistu",
diff --git a/lib/l10n/fi.json b/lib/l10n/fi.json
index 02470bb0054..975213c6cdc 100644
--- a/lib/l10n/fi.json
+++ b/lib/l10n/fi.json
@@ -187,7 +187,6 @@
"App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "Sovellusta \"%1$s\" ei voi asentaa, koska seuraavat riippuvuudet eivät täyty: %2$s",
"a safe home for all your data" : "turvallinen koti kaikille tiedostoillesi",
"File is currently busy, please try again later" : "Tiedosto on parhaillaan käytössä, yritä myöhemmin uudelleen",
- "Cannot read file" : "Tiedostoa ei voi lukea",
"Application is not enabled" : "Sovellusta ei ole otettu käyttöön",
"Authentication error" : "Tunnistautumisvirhe",
"Token expired. Please reload page." : "Valtuutus vanheni. Lataa sivu uudelleen.",
@@ -219,6 +218,7 @@
"Storage connection error. %s" : "Tallennustilan yhteysvirhe. %s",
"Storage is temporarily not available" : "Tallennustila on tilapäisesti pois käytöstä",
"Storage connection timeout. %s" : "Tallennustilan yhteyden aikakatkaisu. %s",
+ "Cannot read file" : "Tiedostoa ei voi lukea",
"Cannot write into \"config\" directory" : "Hakemistoon \"config\" kirjoittaminen ei onnistu",
"Cannot write into \"apps\" directory" : "Hakemistoon \"apps\" kirjoittaminen ei onnistu",
"Cannot create \"data\" directory" : "Hakemiston \"data\" luominen ei onnistu",
diff --git a/lib/l10n/fr.js b/lib/l10n/fr.js
index 7a40ad0a772..86f56e69a85 100644
--- a/lib/l10n/fr.js
+++ b/lib/l10n/fr.js
@@ -207,7 +207,6 @@ OC.L10N.register(
"App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "L'application \"%1$s\" ne peut pas être installée à cause des dépendances suivantes non satisfaites : %2$s",
"a safe home for all your data" : "un lieu sûr pour toutes vos données",
"File is currently busy, please try again later" : "Le fichier est actuellement utilisé, veuillez réessayer plus tard",
- "Cannot read file" : "Impossible de lire le fichier",
"Application is not enabled" : "L'application n'est pas activée",
"Authentication error" : "Erreur d'authentification",
"Token expired. Please reload page." : "La session a expiré. Veuillez recharger la page.",
@@ -257,6 +256,7 @@ OC.L10N.register(
"Storage is temporarily not available" : "Le support de stockage est temporairement indisponible",
"Storage connection timeout. %s" : "Le délai d'attente pour la connexion à l'espace de stockage a été dépassé. %s",
"This can usually be fixed by giving the webserver write access to the config directory." : "Ce problème est généralement résolu en donnant au serveur web un accès en écriture au répertoire de configuration.",
+ "Cannot read file" : "Impossible de lire le fichier",
"Cannot write into \"config\" directory" : "Impossible d’écrire dans le répertoire \"config\"",
"This can usually be fixed by giving the webserver write access to the config directory. See %s" : "Ce problème est généralement résolu en donnant au serveur web un accès en écriture au répertoire \"config\". Voir %s",
"Cannot write into \"apps\" directory" : "Impossible d’écrire dans le répertoire \"apps\"",
diff --git a/lib/l10n/fr.json b/lib/l10n/fr.json
index 39541e997cf..f3b85ba4ac2 100644
--- a/lib/l10n/fr.json
+++ b/lib/l10n/fr.json
@@ -205,7 +205,6 @@
"App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "L'application \"%1$s\" ne peut pas être installée à cause des dépendances suivantes non satisfaites : %2$s",
"a safe home for all your data" : "un lieu sûr pour toutes vos données",
"File is currently busy, please try again later" : "Le fichier est actuellement utilisé, veuillez réessayer plus tard",
- "Cannot read file" : "Impossible de lire le fichier",
"Application is not enabled" : "L'application n'est pas activée",
"Authentication error" : "Erreur d'authentification",
"Token expired. Please reload page." : "La session a expiré. Veuillez recharger la page.",
@@ -255,6 +254,7 @@
"Storage is temporarily not available" : "Le support de stockage est temporairement indisponible",
"Storage connection timeout. %s" : "Le délai d'attente pour la connexion à l'espace de stockage a été dépassé. %s",
"This can usually be fixed by giving the webserver write access to the config directory." : "Ce problème est généralement résolu en donnant au serveur web un accès en écriture au répertoire de configuration.",
+ "Cannot read file" : "Impossible de lire le fichier",
"Cannot write into \"config\" directory" : "Impossible d’écrire dans le répertoire \"config\"",
"This can usually be fixed by giving the webserver write access to the config directory. See %s" : "Ce problème est généralement résolu en donnant au serveur web un accès en écriture au répertoire \"config\". Voir %s",
"Cannot write into \"apps\" directory" : "Impossible d’écrire dans le répertoire \"apps\"",
diff --git a/lib/l10n/hr.js b/lib/l10n/hr.js
index 60e5aa3e240..e448f3fd030 100644
--- a/lib/l10n/hr.js
+++ b/lib/l10n/hr.js
@@ -206,7 +206,6 @@ OC.L10N.register(
"App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "Aplikaciju „%1$s” nije moguće instalirati jer nisu ispunjene sljedeće ovisnosti: %2$s",
"a safe home for all your data" : "siguran dom za sve vaše podatke",
"File is currently busy, please try again later" : "Datoteka je trenutno zauzeta, pokušajte ponovo kasnije",
- "Cannot read file" : "Datoteku nije moguće pročitati",
"Application is not enabled" : "Aplikacija nije omogućena",
"Authentication error" : "Pogrešna autentifikacija",
"Token expired. Please reload page." : "Token je istekao. Ponovno učitajte stranicu.",
@@ -236,6 +235,7 @@ OC.L10N.register(
"Storage is temporarily not available" : "Pohrana privremeno nije dostupna",
"Storage connection timeout. %s" : "Istek veze pohrane. %s",
"This can usually be fixed by giving the webserver write access to the config directory." : "Ovo se obično može ispraviti tako da se web-poslužitelju dopusti pristup za pisanje u direktoriju config.",
+ "Cannot read file" : "Datoteku nije moguće pročitati",
"Cannot write into \"config\" directory" : "Pisanje u direktorij „config” nije moguće",
"This can usually be fixed by giving the webserver write access to the config directory. See %s" : "Ovo se obično može popraviti tako da se web poslužitelju dopusti pristup za pisanje u konfiguracijski direktorij. Pogledajte %s",
"Cannot write into \"apps\" directory" : "Nije moguće pisati u direktorij „apps”",
diff --git a/lib/l10n/hr.json b/lib/l10n/hr.json
index d78f720c81f..2760ab38adb 100644
--- a/lib/l10n/hr.json
+++ b/lib/l10n/hr.json
@@ -204,7 +204,6 @@
"App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "Aplikaciju „%1$s” nije moguće instalirati jer nisu ispunjene sljedeće ovisnosti: %2$s",
"a safe home for all your data" : "siguran dom za sve vaše podatke",
"File is currently busy, please try again later" : "Datoteka je trenutno zauzeta, pokušajte ponovo kasnije",
- "Cannot read file" : "Datoteku nije moguće pročitati",
"Application is not enabled" : "Aplikacija nije omogućena",
"Authentication error" : "Pogrešna autentifikacija",
"Token expired. Please reload page." : "Token je istekao. Ponovno učitajte stranicu.",
@@ -234,6 +233,7 @@
"Storage is temporarily not available" : "Pohrana privremeno nije dostupna",
"Storage connection timeout. %s" : "Istek veze pohrane. %s",
"This can usually be fixed by giving the webserver write access to the config directory." : "Ovo se obično može ispraviti tako da se web-poslužitelju dopusti pristup za pisanje u direktoriju config.",
+ "Cannot read file" : "Datoteku nije moguće pročitati",
"Cannot write into \"config\" directory" : "Pisanje u direktorij „config” nije moguće",
"This can usually be fixed by giving the webserver write access to the config directory. See %s" : "Ovo se obično može popraviti tako da se web poslužitelju dopusti pristup za pisanje u konfiguracijski direktorij. Pogledajte %s",
"Cannot write into \"apps\" directory" : "Nije moguće pisati u direktorij „apps”",
diff --git a/lib/l10n/hu.js b/lib/l10n/hu.js
index 6e4113507b5..ed3cc9f82ce 100644
--- a/lib/l10n/hu.js
+++ b/lib/l10n/hu.js
@@ -207,7 +207,6 @@ OC.L10N.register(
"App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "A(z) „%1$s” alkalmazást nem lehet telepíteni, mert a következő függőségek nem teljesülnek: %2$s",
"a safe home for all your data" : "egy biztonságos hely az adataidnak",
"File is currently busy, please try again later" : "A fájl jelenleg foglalt, próbálja újra később",
- "Cannot read file" : "A fájl nem olvasható",
"Application is not enabled" : "Az alkalmazás nincs engedélyezve",
"Authentication error" : "Hitelesítési hiba",
"Token expired. Please reload page." : "A token lejárt. Frissítse az oldalt.",
@@ -257,6 +256,7 @@ OC.L10N.register(
"Storage is temporarily not available" : "A tároló átmenetileg nem érhető el",
"Storage connection timeout. %s" : "Időtúllépés a tárolókapcsolatban. %s",
"This can usually be fixed by giving the webserver write access to the config directory." : "Ez általában úgy javítható, hogy a webkiszolgálónak írási hozzáférést biztosít a konfigurációs könyvtárhoz.",
+ "Cannot read file" : "A fájl nem olvasható",
"Cannot write into \"config\" directory" : "A „config” könyvtár nem írható",
"This can usually be fixed by giving the webserver write access to the config directory. See %s" : "Ez általában úgy javítható, hogy a webkiszolgálónak írási hozzáférést biztosít a konfigurációs könyvtárhoz. Lásd: %s.",
"Cannot write into \"apps\" directory" : "Az „apps” könyvtár nem írható",
diff --git a/lib/l10n/hu.json b/lib/l10n/hu.json
index 01d41e53248..99ed551f74e 100644
--- a/lib/l10n/hu.json
+++ b/lib/l10n/hu.json
@@ -205,7 +205,6 @@
"App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "A(z) „%1$s” alkalmazást nem lehet telepíteni, mert a következő függőségek nem teljesülnek: %2$s",
"a safe home for all your data" : "egy biztonságos hely az adataidnak",
"File is currently busy, please try again later" : "A fájl jelenleg foglalt, próbálja újra később",
- "Cannot read file" : "A fájl nem olvasható",
"Application is not enabled" : "Az alkalmazás nincs engedélyezve",
"Authentication error" : "Hitelesítési hiba",
"Token expired. Please reload page." : "A token lejárt. Frissítse az oldalt.",
@@ -255,6 +254,7 @@
"Storage is temporarily not available" : "A tároló átmenetileg nem érhető el",
"Storage connection timeout. %s" : "Időtúllépés a tárolókapcsolatban. %s",
"This can usually be fixed by giving the webserver write access to the config directory." : "Ez általában úgy javítható, hogy a webkiszolgálónak írási hozzáférést biztosít a konfigurációs könyvtárhoz.",
+ "Cannot read file" : "A fájl nem olvasható",
"Cannot write into \"config\" directory" : "A „config” könyvtár nem írható",
"This can usually be fixed by giving the webserver write access to the config directory. See %s" : "Ez általában úgy javítható, hogy a webkiszolgálónak írási hozzáférést biztosít a konfigurációs könyvtárhoz. Lásd: %s.",
"Cannot write into \"apps\" directory" : "Az „apps” könyvtár nem írható",
diff --git a/lib/l10n/id.js b/lib/l10n/id.js
index fe5faa7baba..2f03d5e814f 100644
--- a/lib/l10n/id.js
+++ b/lib/l10n/id.js
@@ -16,6 +16,7 @@ OC.L10N.register(
"Authentication" : "Otentikasi",
"Unknown filetype" : "Tipe berkas tak dikenal",
"Invalid image" : "Gambar tidak sah",
+ "View profile" : "Tampilkan profil",
"today" : "hari ini",
"yesterday" : "kemarin",
"_%n day ago_::_%n days ago_" : ["%n hari yang lalu"],
diff --git a/lib/l10n/id.json b/lib/l10n/id.json
index 737bf890755..1cae9975fe3 100644
--- a/lib/l10n/id.json
+++ b/lib/l10n/id.json
@@ -14,6 +14,7 @@
"Authentication" : "Otentikasi",
"Unknown filetype" : "Tipe berkas tak dikenal",
"Invalid image" : "Gambar tidak sah",
+ "View profile" : "Tampilkan profil",
"today" : "hari ini",
"yesterday" : "kemarin",
"_%n day ago_::_%n days ago_" : ["%n hari yang lalu"],
diff --git a/lib/l10n/it.js b/lib/l10n/it.js
index 608db04d9da..9c5ff2d767b 100644
--- a/lib/l10n/it.js
+++ b/lib/l10n/it.js
@@ -207,7 +207,6 @@ OC.L10N.register(
"App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "L'applicazione \"%1$s\" non può essere installata poiché le seguenti dipendenze non sono soddisfatte: %2$s",
"a safe home for all your data" : "un posto sicuro per tutti i tuoi dati",
"File is currently busy, please try again later" : "Il file è attualmente occupato, riprova più tardi",
- "Cannot read file" : "Impossibile leggere il file",
"Application is not enabled" : "L'applicazione non è abilitata",
"Authentication error" : "Errore di autenticazione",
"Token expired. Please reload page." : "Token scaduto. Ricarica la pagina.",
@@ -255,6 +254,7 @@ OC.L10N.register(
"Storage is temporarily not available" : "L'archiviazione è temporaneamente non disponibile",
"Storage connection timeout. %s" : "Timeout di connessione all'archiviazione. %s",
"This can usually be fixed by giving the webserver write access to the config directory." : "Ciò può essere normalmente corretto fornendo al server web accesso in scrittura alla cartella \"config\".",
+ "Cannot read file" : "Impossibile leggere il file",
"Cannot write into \"config\" directory" : "Impossibile scrivere nella cartella \"config\"",
"This can usually be fixed by giving the webserver write access to the config directory. See %s" : "Ciò può essere normalmente corretto fornendo al server web accesso in scrittura alla cartella di configurazione. Vedi %s",
"Cannot write into \"apps\" directory" : "Impossibile scrivere nella cartella \"apps\"",
diff --git a/lib/l10n/it.json b/lib/l10n/it.json
index f7c10f383fc..2f664a14281 100644
--- a/lib/l10n/it.json
+++ b/lib/l10n/it.json
@@ -205,7 +205,6 @@
"App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "L'applicazione \"%1$s\" non può essere installata poiché le seguenti dipendenze non sono soddisfatte: %2$s",
"a safe home for all your data" : "un posto sicuro per tutti i tuoi dati",
"File is currently busy, please try again later" : "Il file è attualmente occupato, riprova più tardi",
- "Cannot read file" : "Impossibile leggere il file",
"Application is not enabled" : "L'applicazione non è abilitata",
"Authentication error" : "Errore di autenticazione",
"Token expired. Please reload page." : "Token scaduto. Ricarica la pagina.",
@@ -253,6 +252,7 @@
"Storage is temporarily not available" : "L'archiviazione è temporaneamente non disponibile",
"Storage connection timeout. %s" : "Timeout di connessione all'archiviazione. %s",
"This can usually be fixed by giving the webserver write access to the config directory." : "Ciò può essere normalmente corretto fornendo al server web accesso in scrittura alla cartella \"config\".",
+ "Cannot read file" : "Impossibile leggere il file",
"Cannot write into \"config\" directory" : "Impossibile scrivere nella cartella \"config\"",
"This can usually be fixed by giving the webserver write access to the config directory. See %s" : "Ciò può essere normalmente corretto fornendo al server web accesso in scrittura alla cartella di configurazione. Vedi %s",
"Cannot write into \"apps\" directory" : "Impossibile scrivere nella cartella \"apps\"",
diff --git a/lib/l10n/ja.js b/lib/l10n/ja.js
index 38c6547a63c..68e95d1ae47 100644
--- a/lib/l10n/ja.js
+++ b/lib/l10n/ja.js
@@ -207,7 +207,6 @@ OC.L10N.register(
"App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "次の依存関係を満たしていないため、アプリ \"%1$s\" をインストールできません: %2$s",
"a safe home for all your data" : "すべてのデータを安全に保管します",
"File is currently busy, please try again later" : "現在ファイルはビジーです。後でもう一度試してください。",
- "Cannot read file" : "ファイルを読み込めません",
"Application is not enabled" : "アプリケーションは無効です",
"Authentication error" : "認証エラー",
"Token expired. Please reload page." : "トークンが無効になりました。ページを再読込してください。",
@@ -257,6 +256,7 @@ OC.L10N.register(
"Storage is temporarily not available" : "ストレージは一時的に利用できません",
"Storage connection timeout. %s" : "ストレージへの接続がタイムアウト。 %s",
"This can usually be fixed by giving the webserver write access to the config directory." : "Webサーバーにconfigディレクトリへの書き込み権限を与えることで解決する可能性があります。",
+ "Cannot read file" : "ファイルを読み込めません",
"Cannot write into \"config\" directory" : "\"config\" ディレクトリに書き込みができません",
"This can usually be fixed by giving the webserver write access to the config directory. See %s" : "多くの場合、Webサーバーの configディレクトリ に書き込み権限を与えることで直ります。%s を見てください",
"Cannot write into \"apps\" directory" : "\"apps\" ディレクトリに書き込みができません",
diff --git a/lib/l10n/ja.json b/lib/l10n/ja.json
index 878f4fbdd13..96fed748e63 100644
--- a/lib/l10n/ja.json
+++ b/lib/l10n/ja.json
@@ -205,7 +205,6 @@
"App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "次の依存関係を満たしていないため、アプリ \"%1$s\" をインストールできません: %2$s",
"a safe home for all your data" : "すべてのデータを安全に保管します",
"File is currently busy, please try again later" : "現在ファイルはビジーです。後でもう一度試してください。",
- "Cannot read file" : "ファイルを読み込めません",
"Application is not enabled" : "アプリケーションは無効です",
"Authentication error" : "認証エラー",
"Token expired. Please reload page." : "トークンが無効になりました。ページを再読込してください。",
@@ -255,6 +254,7 @@
"Storage is temporarily not available" : "ストレージは一時的に利用できません",
"Storage connection timeout. %s" : "ストレージへの接続がタイムアウト。 %s",
"This can usually be fixed by giving the webserver write access to the config directory." : "Webサーバーにconfigディレクトリへの書き込み権限を与えることで解決する可能性があります。",
+ "Cannot read file" : "ファイルを読み込めません",
"Cannot write into \"config\" directory" : "\"config\" ディレクトリに書き込みができません",
"This can usually be fixed by giving the webserver write access to the config directory. See %s" : "多くの場合、Webサーバーの configディレクトリ に書き込み権限を与えることで直ります。%s を見てください",
"Cannot write into \"apps\" directory" : "\"apps\" ディレクトリに書き込みができません",
diff --git a/lib/l10n/mk.js b/lib/l10n/mk.js
index 6a94177fd32..bffc6debf01 100644
--- a/lib/l10n/mk.js
+++ b/lib/l10n/mk.js
@@ -206,7 +206,6 @@ OC.L10N.register(
"App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "Апликацијата \"%1$s\" не може да се инсталира затоа што следниве зависности не се исполнети: %2$s",
"a safe home for all your data" : "безбеден дом за сите ваши податоци",
"File is currently busy, please try again later" : "Датотеката моментално е зафатена, обидете се повторно",
- "Cannot read file" : "Неможе да се прочита датотеката",
"Application is not enabled" : "Апликацијата не е овозможена",
"Authentication error" : "Грешка во автентикација",
"Token expired. Please reload page." : "Жетонот е истечен. Ве молам превчитајте ја страницата.",
@@ -236,6 +235,7 @@ OC.L10N.register(
"Storage is temporarily not available" : "Складиштето моментално не е достапно",
"Storage connection timeout. %s" : "Поврзувањето со складиштето не успеа. %s",
"This can usually be fixed by giving the webserver write access to the config directory." : "Ова најчесто се поправа со давање на дозвола веб серверот за запишување во config папката.",
+ "Cannot read file" : "Неможе да се прочита датотеката",
"Cannot write into \"config\" directory" : "Не може да зе запишува во \"config\" директориумот",
"This can usually be fixed by giving the webserver write access to the config directory. See %s" : "Ова најчесто се поправа со давање дозвола на веб серверот за запишување во config папката. Видете %s",
"Cannot write into \"apps\" directory" : "Не може да зе запишува во \"apps\" директориумот",
diff --git a/lib/l10n/mk.json b/lib/l10n/mk.json
index 6fe249d9c17..f86bfb14998 100644
--- a/lib/l10n/mk.json
+++ b/lib/l10n/mk.json
@@ -204,7 +204,6 @@
"App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "Апликацијата \"%1$s\" не може да се инсталира затоа што следниве зависности не се исполнети: %2$s",
"a safe home for all your data" : "безбеден дом за сите ваши податоци",
"File is currently busy, please try again later" : "Датотеката моментално е зафатена, обидете се повторно",
- "Cannot read file" : "Неможе да се прочита датотеката",
"Application is not enabled" : "Апликацијата не е овозможена",
"Authentication error" : "Грешка во автентикација",
"Token expired. Please reload page." : "Жетонот е истечен. Ве молам превчитајте ја страницата.",
@@ -234,6 +233,7 @@
"Storage is temporarily not available" : "Складиштето моментално не е достапно",
"Storage connection timeout. %s" : "Поврзувањето со складиштето не успеа. %s",
"This can usually be fixed by giving the webserver write access to the config directory." : "Ова најчесто се поправа со давање на дозвола веб серверот за запишување во config папката.",
+ "Cannot read file" : "Неможе да се прочита датотеката",
"Cannot write into \"config\" directory" : "Не може да зе запишува во \"config\" директориумот",
"This can usually be fixed by giving the webserver write access to the config directory. See %s" : "Ова најчесто се поправа со давање дозвола на веб серверот за запишување во config папката. Видете %s",
"Cannot write into \"apps\" directory" : "Не може да зе запишува во \"apps\" директориумот",
diff --git a/lib/l10n/nl.js b/lib/l10n/nl.js
index 76423ca4486..f1787eff27d 100644
--- a/lib/l10n/nl.js
+++ b/lib/l10n/nl.js
@@ -207,7 +207,6 @@ OC.L10N.register(
"App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "App \"%1$s\" kan niet worden geïnstalleerd, omdat de volgende afhankelijkheden niet zijn ingevuld: %2$s",
"a safe home for all your data" : "een veilige plek voor al je gegevens",
"File is currently busy, please try again later" : "Bestandsverwerking bezig, probeer het later opnieuw",
- "Cannot read file" : "Kan bestand niet lezen",
"Application is not enabled" : "De applicatie is niet ingeschakeld",
"Authentication error" : "Authenticatiefout",
"Token expired. Please reload page." : "Token verlopen. Herlaad de pagina.",
@@ -253,6 +252,7 @@ OC.L10N.register(
"Storage is temporarily not available" : "Opslag is tijdelijk niet beschikbaar",
"Storage connection timeout. %s" : "Opslag verbinding time-out. %s",
"This can usually be fixed by giving the webserver write access to the config directory." : "Dit kan opgelost worden door de config map op de webserver schrijfrechten te geven.",
+ "Cannot read file" : "Kan bestand niet lezen",
"Cannot write into \"config\" directory" : "Kan niet schrijven naar de \"config\" directory",
"This can usually be fixed by giving the webserver write access to the config directory. See %s" : "Dit kan opgelost worden door de config map op de webserver schrijf rechten te geven. See %s",
"Cannot write into \"apps\" directory" : "Kan niet schrijven naar de \"apps\" directory",
diff --git a/lib/l10n/nl.json b/lib/l10n/nl.json
index 79b39acd2c1..5c1eff0b199 100644
--- a/lib/l10n/nl.json
+++ b/lib/l10n/nl.json
@@ -205,7 +205,6 @@
"App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "App \"%1$s\" kan niet worden geïnstalleerd, omdat de volgende afhankelijkheden niet zijn ingevuld: %2$s",
"a safe home for all your data" : "een veilige plek voor al je gegevens",
"File is currently busy, please try again later" : "Bestandsverwerking bezig, probeer het later opnieuw",
- "Cannot read file" : "Kan bestand niet lezen",
"Application is not enabled" : "De applicatie is niet ingeschakeld",
"Authentication error" : "Authenticatiefout",
"Token expired. Please reload page." : "Token verlopen. Herlaad de pagina.",
@@ -251,6 +250,7 @@
"Storage is temporarily not available" : "Opslag is tijdelijk niet beschikbaar",
"Storage connection timeout. %s" : "Opslag verbinding time-out. %s",
"This can usually be fixed by giving the webserver write access to the config directory." : "Dit kan opgelost worden door de config map op de webserver schrijfrechten te geven.",
+ "Cannot read file" : "Kan bestand niet lezen",
"Cannot write into \"config\" directory" : "Kan niet schrijven naar de \"config\" directory",
"This can usually be fixed by giving the webserver write access to the config directory. See %s" : "Dit kan opgelost worden door de config map op de webserver schrijf rechten te geven. See %s",
"Cannot write into \"apps\" directory" : "Kan niet schrijven naar de \"apps\" directory",
diff --git a/lib/l10n/nn_NO.js b/lib/l10n/nn_NO.js
index 33a31973071..924adc60a85 100644
--- a/lib/l10n/nn_NO.js
+++ b/lib/l10n/nn_NO.js
@@ -1,6 +1,7 @@
OC.L10N.register(
"lib",
{
+ "Authentication" : "Godkjenning",
"Unknown filetype" : "Ukjend filtype",
"Invalid image" : "Ugyldig bilete",
"today" : "i dag",
@@ -13,9 +14,10 @@ OC.L10N.register(
"_%n hour ago_::_%n hours ago_" : ["%n time sidan","%n timar sidan"],
"_%n minute ago_::_%n minutes ago_" : ["%n minutt sidan","%n minutt sidan"],
"seconds ago" : "sekund sidan",
+ "File name is too long" : "Filnamnet er for langt",
"__language_name__" : "Nynorsk",
"Help" : "Hjelp",
- "Apps" : "Program",
+ "Apps" : "Appar",
"Settings" : "Instillingar",
"Log out" : "Logg ut",
"Users" : "Brukarar",
@@ -27,6 +29,7 @@ OC.L10N.register(
"Full name" : "Fult namn",
"Unknown user" : "Ukjend brukar",
"Additional settings" : "Tilleggsinnstillingar",
+ "Set an admin password." : "Vel eit admin-passord.",
"Open »%s«" : "Opna »%s«",
"Sunday" : "Søndag",
"Monday" : "Måndag",
@@ -75,6 +78,8 @@ OC.L10N.register(
"Dec." : "Des.",
"A valid username must be provided" : "Du må oppgje eit gyldig brukarnamn",
"A valid password must be provided" : "Du må oppgje eit gyldig passord",
+ "User disabled" : "Brukar deaktivert",
+ "Login canceled by app" : "Innlogging avbroten av app",
"Authentication error" : "Feil i autentisering"
},
"nplurals=2; plural=(n != 1);");
diff --git a/lib/l10n/nn_NO.json b/lib/l10n/nn_NO.json
index 53b50337a17..219148e7b1b 100644
--- a/lib/l10n/nn_NO.json
+++ b/lib/l10n/nn_NO.json
@@ -1,4 +1,5 @@
{ "translations": {
+ "Authentication" : "Godkjenning",
"Unknown filetype" : "Ukjend filtype",
"Invalid image" : "Ugyldig bilete",
"today" : "i dag",
@@ -11,9 +12,10 @@
"_%n hour ago_::_%n hours ago_" : ["%n time sidan","%n timar sidan"],
"_%n minute ago_::_%n minutes ago_" : ["%n minutt sidan","%n minutt sidan"],
"seconds ago" : "sekund sidan",
+ "File name is too long" : "Filnamnet er for langt",
"__language_name__" : "Nynorsk",
"Help" : "Hjelp",
- "Apps" : "Program",
+ "Apps" : "Appar",
"Settings" : "Instillingar",
"Log out" : "Logg ut",
"Users" : "Brukarar",
@@ -25,6 +27,7 @@
"Full name" : "Fult namn",
"Unknown user" : "Ukjend brukar",
"Additional settings" : "Tilleggsinnstillingar",
+ "Set an admin password." : "Vel eit admin-passord.",
"Open »%s«" : "Opna »%s«",
"Sunday" : "Søndag",
"Monday" : "Måndag",
@@ -73,6 +76,8 @@
"Dec." : "Des.",
"A valid username must be provided" : "Du må oppgje eit gyldig brukarnamn",
"A valid password must be provided" : "Du må oppgje eit gyldig passord",
+ "User disabled" : "Brukar deaktivert",
+ "Login canceled by app" : "Innlogging avbroten av app",
"Authentication error" : "Feil i autentisering"
},"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 1cea063ff4f..afb8cb82f6c 100644
--- a/lib/l10n/pl.js
+++ b/lib/l10n/pl.js
@@ -207,7 +207,6 @@ OC.L10N.register(
"App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "Nie można zainstalować aplikacji \"%1$s\", ponieważ nie są spełnione następujące zależności: %2$s",
"a safe home for all your data" : "bezpieczny dom dla wszystkich danych",
"File is currently busy, please try again later" : "Plik jest obecnie niedostępny, spróbuj później",
- "Cannot read file" : "Nie można odczytać pliku",
"Application is not enabled" : "Aplikacja nie jest włączona",
"Authentication error" : "Błąd uwierzytelniania",
"Token expired. Please reload page." : "Token wygasł. Przeładuj stronę.",
@@ -257,6 +256,7 @@ OC.L10N.register(
"Storage is temporarily not available" : "Magazyn jest tymczasowo niedostępny",
"Storage connection timeout. %s" : "Limit czasu połączenia do magazynu. %s",
"This can usually be fixed by giving the webserver write access to the config directory." : "Zwykle można to naprawić, nadając serwerowi WWW dostęp do zapisu do katalogu config.",
+ "Cannot read file" : "Nie można odczytać pliku",
"Cannot write into \"config\" directory" : "Nie można zapisać do katalogu \"config\"",
"This can usually be fixed by giving the webserver write access to the config directory. See %s" : "Zwykle można to naprawić, nadając serwerowi WWW dostęp do zapisu do katalogu config. Zobacz %s",
"Cannot write into \"apps\" directory" : "Nie można zapisać do katalogu \"apps\"",
diff --git a/lib/l10n/pl.json b/lib/l10n/pl.json
index 89ca47e5d33..b5b85f653c0 100644
--- a/lib/l10n/pl.json
+++ b/lib/l10n/pl.json
@@ -205,7 +205,6 @@
"App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "Nie można zainstalować aplikacji \"%1$s\", ponieważ nie są spełnione następujące zależności: %2$s",
"a safe home for all your data" : "bezpieczny dom dla wszystkich danych",
"File is currently busy, please try again later" : "Plik jest obecnie niedostępny, spróbuj później",
- "Cannot read file" : "Nie można odczytać pliku",
"Application is not enabled" : "Aplikacja nie jest włączona",
"Authentication error" : "Błąd uwierzytelniania",
"Token expired. Please reload page." : "Token wygasł. Przeładuj stronę.",
@@ -255,6 +254,7 @@
"Storage is temporarily not available" : "Magazyn jest tymczasowo niedostępny",
"Storage connection timeout. %s" : "Limit czasu połączenia do magazynu. %s",
"This can usually be fixed by giving the webserver write access to the config directory." : "Zwykle można to naprawić, nadając serwerowi WWW dostęp do zapisu do katalogu config.",
+ "Cannot read file" : "Nie można odczytać pliku",
"Cannot write into \"config\" directory" : "Nie można zapisać do katalogu \"config\"",
"This can usually be fixed by giving the webserver write access to the config directory. See %s" : "Zwykle można to naprawić, nadając serwerowi WWW dostęp do zapisu do katalogu config. Zobacz %s",
"Cannot write into \"apps\" directory" : "Nie można zapisać do katalogu \"apps\"",
diff --git a/lib/l10n/pt_BR.js b/lib/l10n/pt_BR.js
index fa592b6cc4d..a37815a937f 100644
--- a/lib/l10n/pt_BR.js
+++ b/lib/l10n/pt_BR.js
@@ -207,7 +207,6 @@ OC.L10N.register(
"App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "O aplicativo \"%1$s\" não pode ser instalado devido à estas dependências: %2$s",
"a safe home for all your data" : "Um lar seguro para todos os seus dados",
"File is currently busy, please try again later" : "O arquivo está ocupado, tente novamente mais tarde",
- "Cannot read file" : "Não foi possível ler o arquivo",
"Application is not enabled" : "O aplicativo não está habilitado",
"Authentication error" : "Erro de autenticação",
"Token expired. Please reload page." : "O token expirou. Por favor recarregue a página.",
@@ -257,6 +256,7 @@ OC.L10N.register(
"Storage is temporarily not available" : "Armazenamento temporariamente indisponível",
"Storage connection timeout. %s" : "Atingido o tempo limite de conexão ao armazenamento. %s",
"This can usually be fixed by giving the webserver write access to the config directory." : "Geralmente, isso pode ser corrigido concedendo ao servidor web acesso de gravação ao diretório de configuração.",
+ "Cannot read file" : "Não foi possível ler o arquivo",
"Cannot write into \"config\" directory" : "Não foi possível gravar no diretório \"config\"",
"This can usually be fixed by giving the webserver write access to the config directory. See %s" : "Normalmente isso pode ser resolvido dando ao webserver permissão de escritura no diretório config. Veja %s",
"Cannot write into \"apps\" directory" : "Não foi possível gravar no diretório \"apps\"",
diff --git a/lib/l10n/pt_BR.json b/lib/l10n/pt_BR.json
index 206f786d991..bfd04236078 100644
--- a/lib/l10n/pt_BR.json
+++ b/lib/l10n/pt_BR.json
@@ -205,7 +205,6 @@
"App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "O aplicativo \"%1$s\" não pode ser instalado devido à estas dependências: %2$s",
"a safe home for all your data" : "Um lar seguro para todos os seus dados",
"File is currently busy, please try again later" : "O arquivo está ocupado, tente novamente mais tarde",
- "Cannot read file" : "Não foi possível ler o arquivo",
"Application is not enabled" : "O aplicativo não está habilitado",
"Authentication error" : "Erro de autenticação",
"Token expired. Please reload page." : "O token expirou. Por favor recarregue a página.",
@@ -255,6 +254,7 @@
"Storage is temporarily not available" : "Armazenamento temporariamente indisponível",
"Storage connection timeout. %s" : "Atingido o tempo limite de conexão ao armazenamento. %s",
"This can usually be fixed by giving the webserver write access to the config directory." : "Geralmente, isso pode ser corrigido concedendo ao servidor web acesso de gravação ao diretório de configuração.",
+ "Cannot read file" : "Não foi possível ler o arquivo",
"Cannot write into \"config\" directory" : "Não foi possível gravar no diretório \"config\"",
"This can usually be fixed by giving the webserver write access to the config directory. See %s" : "Normalmente isso pode ser resolvido dando ao webserver permissão de escritura no diretório config. Veja %s",
"Cannot write into \"apps\" directory" : "Não foi possível gravar no diretório \"apps\"",
diff --git a/lib/l10n/pt_PT.js b/lib/l10n/pt_PT.js
index 651e0fe4b9e..81bc932c91a 100644
--- a/lib/l10n/pt_PT.js
+++ b/lib/l10n/pt_PT.js
@@ -178,7 +178,6 @@ OC.L10N.register(
"Login canceled by app" : "Sessão cancelada pela app",
"a safe home for all your data" : "Um lugar seguro para todos os seus dados",
"File is currently busy, please try again later" : "O ficheiro está ocupado, por favor, tente mais tarde",
- "Cannot read file" : "Não é possível ler o ficheiro",
"Application is not enabled" : "A aplicação não está activada",
"Authentication error" : "Erro na autenticação",
"Token expired. Please reload page." : "O token expirou. Por favor recarregue a página.",
@@ -207,6 +206,7 @@ OC.L10N.register(
"Storage connection error. %s" : "Erro de ligação ao armazenamento. %s",
"Storage is temporarily not available" : "Armazenamento temporariamente indisponível",
"Storage connection timeout. %s" : "Tempo de ligação ao armazenamento expirou. %s",
+ "Cannot read file" : "Não é possível ler o ficheiro",
"Cannot write into \"config\" directory" : "Não é possível escrever na directoria \"configurar\"",
"This can usually be fixed by giving the webserver write access to the config directory. See %s" : "Isto pode geralmente ser corrigido ao adicionar permissões de escrita à pasta de configuração ao servidor web. Ver %s.",
"Cannot write into \"apps\" directory" : "Não é possivel escrever na directoria \"aplicações\"",
diff --git a/lib/l10n/pt_PT.json b/lib/l10n/pt_PT.json
index 8abe9f8c6a0..e3fc3a345ef 100644
--- a/lib/l10n/pt_PT.json
+++ b/lib/l10n/pt_PT.json
@@ -176,7 +176,6 @@
"Login canceled by app" : "Sessão cancelada pela app",
"a safe home for all your data" : "Um lugar seguro para todos os seus dados",
"File is currently busy, please try again later" : "O ficheiro está ocupado, por favor, tente mais tarde",
- "Cannot read file" : "Não é possível ler o ficheiro",
"Application is not enabled" : "A aplicação não está activada",
"Authentication error" : "Erro na autenticação",
"Token expired. Please reload page." : "O token expirou. Por favor recarregue a página.",
@@ -205,6 +204,7 @@
"Storage connection error. %s" : "Erro de ligação ao armazenamento. %s",
"Storage is temporarily not available" : "Armazenamento temporariamente indisponível",
"Storage connection timeout. %s" : "Tempo de ligação ao armazenamento expirou. %s",
+ "Cannot read file" : "Não é possível ler o ficheiro",
"Cannot write into \"config\" directory" : "Não é possível escrever na directoria \"configurar\"",
"This can usually be fixed by giving the webserver write access to the config directory. See %s" : "Isto pode geralmente ser corrigido ao adicionar permissões de escrita à pasta de configuração ao servidor web. Ver %s.",
"Cannot write into \"apps\" directory" : "Não é possivel escrever na directoria \"aplicações\"",
diff --git a/lib/l10n/ru.js b/lib/l10n/ru.js
index c6f8bc4018e..85f11c1a5ea 100644
--- a/lib/l10n/ru.js
+++ b/lib/l10n/ru.js
@@ -207,7 +207,6 @@ OC.L10N.register(
"App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "Приложение «%1$s» не может быть установлено, так как не удовлетворены следующие зависимости: %2$s",
"a safe home for all your data" : "надёжный дом для всех ваших данных",
"File is currently busy, please try again later" : "Файл в данный момент используется, повторите попытку позже.",
- "Cannot read file" : "Не удается прочитать файл",
"Application is not enabled" : "Приложение не разрешено",
"Authentication error" : "Ошибка аутентификации",
"Token expired. Please reload page." : "Токен просрочен. Перезагрузите страницу.",
@@ -257,6 +256,7 @@ OC.L10N.register(
"Storage is temporarily not available" : "Хранилище временно недоступно",
"Storage connection timeout. %s" : "Истекло время ожидания подключения к хранилищу. %s",
"This can usually be fixed by giving the webserver write access to the config directory." : "Обычно это можно исправить, предоставив веб-серверу права на запись в каталог конфигурации.",
+ "Cannot read file" : "Не удается прочитать файл",
"Cannot write into \"config\" directory" : "Запись в каталог «config» невозможна",
"This can usually be fixed by giving the webserver write access to the config directory. See %s" : "Обычно это можно исправить, предоставив веб-серверу права на запись в каталог конфигурации. Изучите %s.",
"Cannot write into \"apps\" directory" : "Запись в каталог «app» невозможна",
diff --git a/lib/l10n/ru.json b/lib/l10n/ru.json
index 9fa87752164..e5e20754874 100644
--- a/lib/l10n/ru.json
+++ b/lib/l10n/ru.json
@@ -205,7 +205,6 @@
"App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "Приложение «%1$s» не может быть установлено, так как не удовлетворены следующие зависимости: %2$s",
"a safe home for all your data" : "надёжный дом для всех ваших данных",
"File is currently busy, please try again later" : "Файл в данный момент используется, повторите попытку позже.",
- "Cannot read file" : "Не удается прочитать файл",
"Application is not enabled" : "Приложение не разрешено",
"Authentication error" : "Ошибка аутентификации",
"Token expired. Please reload page." : "Токен просрочен. Перезагрузите страницу.",
@@ -255,6 +254,7 @@
"Storage is temporarily not available" : "Хранилище временно недоступно",
"Storage connection timeout. %s" : "Истекло время ожидания подключения к хранилищу. %s",
"This can usually be fixed by giving the webserver write access to the config directory." : "Обычно это можно исправить, предоставив веб-серверу права на запись в каталог конфигурации.",
+ "Cannot read file" : "Не удается прочитать файл",
"Cannot write into \"config\" directory" : "Запись в каталог «config» невозможна",
"This can usually be fixed by giving the webserver write access to the config directory. See %s" : "Обычно это можно исправить, предоставив веб-серверу права на запись в каталог конфигурации. Изучите %s.",
"Cannot write into \"apps\" directory" : "Запись в каталог «app» невозможна",
diff --git a/lib/l10n/sc.js b/lib/l10n/sc.js
index c6e13e64a56..2417ed4b2f3 100644
--- a/lib/l10n/sc.js
+++ b/lib/l10n/sc.js
@@ -194,7 +194,6 @@ OC.L10N.register(
"App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "Non faghet a installare s'aplicatzione %1$s ca is dipendèntzias in fatu non sunt satisfatos:%2$s",
"a safe home for all your data" : "unu logu siguru pro totu is datos tuos",
"File is currently busy, please try again later" : "Pro immoe s'archìviu est impreadu, torra a proare a coa",
- "Cannot read file" : "Impossìbile a lèghere s'archìviu",
"Application is not enabled" : "S'aplicatzione no est ativada",
"Authentication error" : "Errore de autenticatzione",
"Token expired. Please reload page." : "Token iscadidu. Torra a carrigare sa pàgina.",
@@ -224,6 +223,7 @@ OC.L10N.register(
"Storage is temporarily not available" : "S'archiviatzione no est disponìbile pro immoe.",
"Storage connection timeout. %s" : "Tempus de connessione a s'archiviatzione iscadidu. %s",
"This can usually be fixed by giving the webserver write access to the config directory." : "Custu in generale si podet assentare dende a su serbidore atzessu a s'iscritura in sa cartella config.",
+ "Cannot read file" : "Impossìbile a lèghere s'archìviu",
"Cannot write into \"config\" directory" : "No faghet a iscriere in sa cartella \"config\"",
"This can usually be fixed by giving the webserver write access to the config directory. See %s" : "Custu in generale si podet assentare dende a su serbidore atzessu a s'iscritura in sa cartella config. Càstia %s",
"Cannot write into \"apps\" directory" : "No faghet a iscriere in sa cartella \"apps\"",
diff --git a/lib/l10n/sc.json b/lib/l10n/sc.json
index 7f3eabbd6fd..482152a4e87 100644
--- a/lib/l10n/sc.json
+++ b/lib/l10n/sc.json
@@ -192,7 +192,6 @@
"App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "Non faghet a installare s'aplicatzione %1$s ca is dipendèntzias in fatu non sunt satisfatos:%2$s",
"a safe home for all your data" : "unu logu siguru pro totu is datos tuos",
"File is currently busy, please try again later" : "Pro immoe s'archìviu est impreadu, torra a proare a coa",
- "Cannot read file" : "Impossìbile a lèghere s'archìviu",
"Application is not enabled" : "S'aplicatzione no est ativada",
"Authentication error" : "Errore de autenticatzione",
"Token expired. Please reload page." : "Token iscadidu. Torra a carrigare sa pàgina.",
@@ -222,6 +221,7 @@
"Storage is temporarily not available" : "S'archiviatzione no est disponìbile pro immoe.",
"Storage connection timeout. %s" : "Tempus de connessione a s'archiviatzione iscadidu. %s",
"This can usually be fixed by giving the webserver write access to the config directory." : "Custu in generale si podet assentare dende a su serbidore atzessu a s'iscritura in sa cartella config.",
+ "Cannot read file" : "Impossìbile a lèghere s'archìviu",
"Cannot write into \"config\" directory" : "No faghet a iscriere in sa cartella \"config\"",
"This can usually be fixed by giving the webserver write access to the config directory. See %s" : "Custu in generale si podet assentare dende a su serbidore atzessu a s'iscritura in sa cartella config. Càstia %s",
"Cannot write into \"apps\" directory" : "No faghet a iscriere in sa cartella \"apps\"",
diff --git a/lib/l10n/sk.js b/lib/l10n/sk.js
index 9a9999f230b..c9bbfd28aa9 100644
--- a/lib/l10n/sk.js
+++ b/lib/l10n/sk.js
@@ -207,7 +207,6 @@ OC.L10N.register(
"App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "Aplikáciu \"%1$s\" nie je možné inštalovať, pretože nie sú splnené nasledovné závislosti: %2$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",
- "Cannot 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.",
@@ -257,6 +256,7 @@ OC.L10N.register(
"Storage is temporarily not available" : "Úložisko je dočasne nedostupné",
"Storage connection timeout. %s" : "Vypršanie pripojenia k úložisku. %s",
"This can usually be fixed by giving the webserver write access to the config directory." : "Toto sa zvyčajne dá opraviť poskytnutím práva webového servera na zápis do priečinka s nastaveniami.",
+ "Cannot read file" : "Nemožno čítať súbor.",
"Cannot write into \"config\" directory" : "Nie je možné zapisovať do priečinka \"config\"",
"This can usually be fixed by giving the webserver write access to the config directory. See %s" : "To je zvyčajne možné opraviť tým, že udelíte webovému serveru oprávnenie na zápis do adresára s konfiguráciou. Viď %s",
"Cannot write into \"apps\" directory" : "Nie je možné zapisovať do priečinka \"apps\"",
diff --git a/lib/l10n/sk.json b/lib/l10n/sk.json
index 4cc681cb466..bdc26a5cef4 100644
--- a/lib/l10n/sk.json
+++ b/lib/l10n/sk.json
@@ -205,7 +205,6 @@
"App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "Aplikáciu \"%1$s\" nie je možné inštalovať, pretože nie sú splnené nasledovné závislosti: %2$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",
- "Cannot 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.",
@@ -255,6 +254,7 @@
"Storage is temporarily not available" : "Úložisko je dočasne nedostupné",
"Storage connection timeout. %s" : "Vypršanie pripojenia k úložisku. %s",
"This can usually be fixed by giving the webserver write access to the config directory." : "Toto sa zvyčajne dá opraviť poskytnutím práva webového servera na zápis do priečinka s nastaveniami.",
+ "Cannot read file" : "Nemožno čítať súbor.",
"Cannot write into \"config\" directory" : "Nie je možné zapisovať do priečinka \"config\"",
"This can usually be fixed by giving the webserver write access to the config directory. See %s" : "To je zvyčajne možné opraviť tým, že udelíte webovému serveru oprávnenie na zápis do adresára s konfiguráciou. Viď %s",
"Cannot write into \"apps\" directory" : "Nie je možné zapisovať do priečinka \"apps\"",
diff --git a/lib/l10n/sl.js b/lib/l10n/sl.js
index 6bf62591ffd..eb2fe3434ba 100644
--- a/lib/l10n/sl.js
+++ b/lib/l10n/sl.js
@@ -200,7 +200,6 @@ OC.L10N.register(
"App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "Programa »%1$s« ni mogoče namestiti zaradi nerešenih odvisnosti: %2$s",
"a safe home for all your data" : "Varno okolje za vaše podatke!",
"File is currently busy, please try again later" : "Datoteka je trenutno v uporabi. Poskusite znova kasneje.",
- "Cannot read file" : "Datoteke ni mogoče prebrati.",
"Application is not enabled" : "Program ni omogočen",
"Authentication error" : "Napaka overjanja",
"Token expired. Please reload page." : "Žeton je pretekel. Stran je treba ponovno naložiti.",
@@ -230,6 +229,7 @@ OC.L10N.register(
"Storage is temporarily not available" : "Shramba trenutno ni na voljo",
"Storage connection timeout. %s" : "Povezava do shrambe je časovno potekla. %s",
"This can usually be fixed by giving the webserver write access to the config directory." : "Napako je mogoče odpraviti z dodelitvijo dovoljenja spletnemu strežniku za pisanje v nastavitveno mapo.",
+ "Cannot read file" : "Datoteke ni mogoče prebrati.",
"Cannot write into \"config\" directory" : "Mapa »config« nima nastavljenih ustreznih dovoljenj za pisanje!",
"This can usually be fixed by giving the webserver write access to the config directory. See %s" : "Napako je mogoče odpraviti z dodelitvijo dovoljenja spletnemu strežniku za pisanje v nastavitveno mapo. Poglejte %s",
"Cannot write into \"apps\" directory" : "V mapo »apps« ni mogoče zapisovati!",
diff --git a/lib/l10n/sl.json b/lib/l10n/sl.json
index ecafd64721c..175d8246b3c 100644
--- a/lib/l10n/sl.json
+++ b/lib/l10n/sl.json
@@ -198,7 +198,6 @@
"App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "Programa »%1$s« ni mogoče namestiti zaradi nerešenih odvisnosti: %2$s",
"a safe home for all your data" : "Varno okolje za vaše podatke!",
"File is currently busy, please try again later" : "Datoteka je trenutno v uporabi. Poskusite znova kasneje.",
- "Cannot read file" : "Datoteke ni mogoče prebrati.",
"Application is not enabled" : "Program ni omogočen",
"Authentication error" : "Napaka overjanja",
"Token expired. Please reload page." : "Žeton je pretekel. Stran je treba ponovno naložiti.",
@@ -228,6 +227,7 @@
"Storage is temporarily not available" : "Shramba trenutno ni na voljo",
"Storage connection timeout. %s" : "Povezava do shrambe je časovno potekla. %s",
"This can usually be fixed by giving the webserver write access to the config directory." : "Napako je mogoče odpraviti z dodelitvijo dovoljenja spletnemu strežniku za pisanje v nastavitveno mapo.",
+ "Cannot read file" : "Datoteke ni mogoče prebrati.",
"Cannot write into \"config\" directory" : "Mapa »config« nima nastavljenih ustreznih dovoljenj za pisanje!",
"This can usually be fixed by giving the webserver write access to the config directory. See %s" : "Napako je mogoče odpraviti z dodelitvijo dovoljenja spletnemu strežniku za pisanje v nastavitveno mapo. Poglejte %s",
"Cannot write into \"apps\" directory" : "V mapo »apps« ni mogoče zapisovati!",
diff --git a/lib/l10n/sv.js b/lib/l10n/sv.js
index 901bf146efe..cf59cbb3954 100644
--- a/lib/l10n/sv.js
+++ b/lib/l10n/sv.js
@@ -206,7 +206,6 @@ OC.L10N.register(
"App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "Appen \"%1$s\" kan inte installeras eftersom följande beroenden inte är uppfyllda: %2$s",
"a safe home for all your data" : "ett säkert hem för all din data",
"File is currently busy, please try again later" : "Filen är för tillfället upptagen, försök igen senare",
- "Cannot read file" : "Kan inte läsa fil",
"Application is not enabled" : "Applikationen är inte aktiverad",
"Authentication error" : "Fel vid autentisering",
"Token expired. Please reload page." : "Token har löpt ut. Uppdatera sidan.",
@@ -236,6 +235,7 @@ OC.L10N.register(
"Storage is temporarily not available" : "Lagringsutrymme är för tillfället inte tillgängligt",
"Storage connection timeout. %s" : "Lagringsutrymme lyckas inte ansluta \"timeout\". %s",
"This can usually be fixed by giving the webserver write access to the config directory." : "Detta kan vanligtvis åtgärdas genom att ge webbservern skrivåtkomst till config-katalogen.",
+ "Cannot read file" : "Kan inte läsa fil",
"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. See %s" : "Detta kan vanligtvis åtgärda genom att ge webbservern skrivåtkomst till konfigureringsmappen. Se %s",
"Cannot write into \"apps\" directory" : "Kan inte skriva till \"apps\" katalogen!",
diff --git a/lib/l10n/sv.json b/lib/l10n/sv.json
index 8bce5388bc6..4181ff7620b 100644
--- a/lib/l10n/sv.json
+++ b/lib/l10n/sv.json
@@ -204,7 +204,6 @@
"App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "Appen \"%1$s\" kan inte installeras eftersom följande beroenden inte är uppfyllda: %2$s",
"a safe home for all your data" : "ett säkert hem för all din data",
"File is currently busy, please try again later" : "Filen är för tillfället upptagen, försök igen senare",
- "Cannot read file" : "Kan inte läsa fil",
"Application is not enabled" : "Applikationen är inte aktiverad",
"Authentication error" : "Fel vid autentisering",
"Token expired. Please reload page." : "Token har löpt ut. Uppdatera sidan.",
@@ -234,6 +233,7 @@
"Storage is temporarily not available" : "Lagringsutrymme är för tillfället inte tillgängligt",
"Storage connection timeout. %s" : "Lagringsutrymme lyckas inte ansluta \"timeout\". %s",
"This can usually be fixed by giving the webserver write access to the config directory." : "Detta kan vanligtvis åtgärdas genom att ge webbservern skrivåtkomst till config-katalogen.",
+ "Cannot read file" : "Kan inte läsa fil",
"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. See %s" : "Detta kan vanligtvis åtgärda genom att ge webbservern skrivåtkomst till konfigureringsmappen. Se %s",
"Cannot write into \"apps\" directory" : "Kan inte skriva till \"apps\" katalogen!",
diff --git a/lib/l10n/th.js b/lib/l10n/th.js
index 687a78ecf07..c0d7cad0c25 100644
--- a/lib/l10n/th.js
+++ b/lib/l10n/th.js
@@ -127,7 +127,6 @@ OC.L10N.register(
"User disabled" : "ผู้ใช้ถูกปิดใช้งาน",
"a safe home for all your data" : "บ้านที่ปลอดภัยสำหรับข้อมูลของคุณ",
"File is currently busy, please try again later" : "ขณะนี้ไฟล์กำลังใช้งานอยู่ โปรดลองอีกครั้งในภายหลัง",
- "Cannot read file" : "ไม่สามารถอ่านไฟล์",
"Application is not enabled" : "แอพพลิเคชั่นดังกล่าวยังไม่ได้เปิดใช้งาน",
"Authentication error" : "เกิดข้อผิดพลาดในสิทธิ์การเข้าใช้งาน",
"Token expired. Please reload page." : "รหัสยืนยันความถูกต้องหมดอายุ กรุณาโหลดหน้าเว็บใหม่",
@@ -147,6 +146,7 @@ OC.L10N.register(
"Storage connection error. %s" : "ข้อผิดพลาดการเชื่อมต่อพื้นที่จัดเก็บข้อมูล %s",
"Storage is temporarily not available" : "พื้นที่จัดเก็บข้อมูลไม่สามารถใช้งานได้ชั่วคราว",
"Storage connection timeout. %s" : "หมดเวลาการเชื่อมต่อพื้นที่จัดเก็บข้อมูล %s",
+ "Cannot read file" : "ไม่สามารถอ่านไฟล์",
"Cannot write into \"config\" directory" : "ไม่สามารถเขียนลงในไดเรกทอรี \"config\"",
"Cannot write into \"apps\" directory" : "ไม่สามารถเขียนลงในไดเรกทอรี \"apps\"",
"Setting locale to %s failed" : "ตั้งค่าตำแหน่งที่ตั้งเป็น %s ล้มเหลว",
diff --git a/lib/l10n/th.json b/lib/l10n/th.json
index 70eb589442c..7c08e27d33d 100644
--- a/lib/l10n/th.json
+++ b/lib/l10n/th.json
@@ -125,7 +125,6 @@
"User disabled" : "ผู้ใช้ถูกปิดใช้งาน",
"a safe home for all your data" : "บ้านที่ปลอดภัยสำหรับข้อมูลของคุณ",
"File is currently busy, please try again later" : "ขณะนี้ไฟล์กำลังใช้งานอยู่ โปรดลองอีกครั้งในภายหลัง",
- "Cannot read file" : "ไม่สามารถอ่านไฟล์",
"Application is not enabled" : "แอพพลิเคชั่นดังกล่าวยังไม่ได้เปิดใช้งาน",
"Authentication error" : "เกิดข้อผิดพลาดในสิทธิ์การเข้าใช้งาน",
"Token expired. Please reload page." : "รหัสยืนยันความถูกต้องหมดอายุ กรุณาโหลดหน้าเว็บใหม่",
@@ -145,6 +144,7 @@
"Storage connection error. %s" : "ข้อผิดพลาดการเชื่อมต่อพื้นที่จัดเก็บข้อมูล %s",
"Storage is temporarily not available" : "พื้นที่จัดเก็บข้อมูลไม่สามารถใช้งานได้ชั่วคราว",
"Storage connection timeout. %s" : "หมดเวลาการเชื่อมต่อพื้นที่จัดเก็บข้อมูล %s",
+ "Cannot read file" : "ไม่สามารถอ่านไฟล์",
"Cannot write into \"config\" directory" : "ไม่สามารถเขียนลงในไดเรกทอรี \"config\"",
"Cannot write into \"apps\" directory" : "ไม่สามารถเขียนลงในไดเรกทอรี \"apps\"",
"Setting locale to %s failed" : "ตั้งค่าตำแหน่งที่ตั้งเป็น %s ล้มเหลว",
diff --git a/lib/l10n/tr.js b/lib/l10n/tr.js
index ee49e1c2092..cd95a5fb184 100644
--- a/lib/l10n/tr.js
+++ b/lib/l10n/tr.js
@@ -207,7 +207,6 @@ OC.L10N.register(
"App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "\"%1$s\" uygulaması, şu gereklilikler sağlanmadığı için kurulamıyor: %2$s",
"a safe home for all your data" : "verileriniz için güvenli bir barınak",
"File is currently busy, please try again later" : "Dosya şu anda meşgul. Lütfen bir süre sonra yeniden deneyin",
- "Cannot read file" : "Dosya okunamadı",
"Application is not enabled" : "Uygulama etkinleştirilmemiş",
"Authentication error" : "Kimlik doğrulama sorunu",
"Token expired. Please reload page." : "Kodun süresi dolmuş. Lütfen sayfayı yenileyin.",
@@ -257,6 +256,7 @@ OC.L10N.register(
"Storage is temporarily not available" : "Depolama geçici olarak kullanılamıyor",
"Storage connection timeout. %s" : "Depolama bağlantısı zaman aşımı. %s",
"This can usually be fixed by giving the webserver write access to the config directory." : "Bu sorun genellikle, web sunucusuna config klasörüne yazma izni verilerek çözülebilir.",
+ "Cannot read file" : "Dosya okunamadı",
"Cannot write into \"config\" directory" : "\"config\" klasörüne yazılamıyor",
"This can usually be fixed by giving the webserver write access to the config directory. See %s" : "Bu sorun genellikle, web sunucusuna config klasörüne yazma izni verilerek çözülebilir. %s bölümüne bakın",
"Cannot write into \"apps\" directory" : "\"apps\" klasörüne yazılamıyor",
diff --git a/lib/l10n/tr.json b/lib/l10n/tr.json
index 63edf7b0219..7acbc8a4805 100644
--- a/lib/l10n/tr.json
+++ b/lib/l10n/tr.json
@@ -205,7 +205,6 @@
"App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "\"%1$s\" uygulaması, şu gereklilikler sağlanmadığı için kurulamıyor: %2$s",
"a safe home for all your data" : "verileriniz için güvenli bir barınak",
"File is currently busy, please try again later" : "Dosya şu anda meşgul. Lütfen bir süre sonra yeniden deneyin",
- "Cannot read file" : "Dosya okunamadı",
"Application is not enabled" : "Uygulama etkinleştirilmemiş",
"Authentication error" : "Kimlik doğrulama sorunu",
"Token expired. Please reload page." : "Kodun süresi dolmuş. Lütfen sayfayı yenileyin.",
@@ -255,6 +254,7 @@
"Storage is temporarily not available" : "Depolama geçici olarak kullanılamıyor",
"Storage connection timeout. %s" : "Depolama bağlantısı zaman aşımı. %s",
"This can usually be fixed by giving the webserver write access to the config directory." : "Bu sorun genellikle, web sunucusuna config klasörüne yazma izni verilerek çözülebilir.",
+ "Cannot read file" : "Dosya okunamadı",
"Cannot write into \"config\" directory" : "\"config\" klasörüne yazılamıyor",
"This can usually be fixed by giving the webserver write access to the config directory. See %s" : "Bu sorun genellikle, web sunucusuna config klasörüne yazma izni verilerek çözülebilir. %s bölümüne bakın",
"Cannot write into \"apps\" directory" : "\"apps\" klasörüne yazılamıyor",
diff --git a/lib/l10n/zh_CN.js b/lib/l10n/zh_CN.js
index 45137513e09..ba27df9184b 100644
--- a/lib/l10n/zh_CN.js
+++ b/lib/l10n/zh_CN.js
@@ -206,7 +206,6 @@ OC.L10N.register(
"App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "应用 \"%1$s\" 无法安装,因为不能满足以下依赖: %2$s",
"a safe home for all your data" : "给您所有数据一个安全的家",
"File is currently busy, please try again later" : "文件当前正忙,请稍后再试",
- "Cannot read file" : "无法读取文件",
"Application is not enabled" : "应用程序未启用",
"Authentication error" : "认证出错",
"Token expired. Please reload page." : "Token 过期,请刷新页面。",
@@ -237,6 +236,7 @@ OC.L10N.register(
"Storage is temporarily not available" : "存储暂时不可用",
"Storage connection timeout. %s" : "存储连接超时。%s",
"This can usually be fixed by giving the webserver write access to the config directory." : "通常可以通过授予 Web 服务器对 config 目录的写访问权限来解决此问题。",
+ "Cannot read file" : "无法读取文件",
"Cannot write into \"config\" directory" : "无法写入“config”目录",
"This can usually be fixed by giving the webserver write access to the config directory. See %s" : "这个通常可以通过赋予写入权限到 config 目录来修复。查看:%s",
"Cannot write into \"apps\" directory" : "无法写入“apps”目录",
diff --git a/lib/l10n/zh_CN.json b/lib/l10n/zh_CN.json
index afd4a0e70dc..f05d7446af2 100644
--- a/lib/l10n/zh_CN.json
+++ b/lib/l10n/zh_CN.json
@@ -204,7 +204,6 @@
"App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "应用 \"%1$s\" 无法安装,因为不能满足以下依赖: %2$s",
"a safe home for all your data" : "给您所有数据一个安全的家",
"File is currently busy, please try again later" : "文件当前正忙,请稍后再试",
- "Cannot read file" : "无法读取文件",
"Application is not enabled" : "应用程序未启用",
"Authentication error" : "认证出错",
"Token expired. Please reload page." : "Token 过期,请刷新页面。",
@@ -235,6 +234,7 @@
"Storage is temporarily not available" : "存储暂时不可用",
"Storage connection timeout. %s" : "存储连接超时。%s",
"This can usually be fixed by giving the webserver write access to the config directory." : "通常可以通过授予 Web 服务器对 config 目录的写访问权限来解决此问题。",
+ "Cannot read file" : "无法读取文件",
"Cannot write into \"config\" directory" : "无法写入“config”目录",
"This can usually be fixed by giving the webserver write access to the config directory. See %s" : "这个通常可以通过赋予写入权限到 config 目录来修复。查看:%s",
"Cannot write into \"apps\" directory" : "无法写入“apps”目录",
diff --git a/lib/l10n/zh_HK.js b/lib/l10n/zh_HK.js
index cbc133fbe3e..564a6b0766a 100644
--- a/lib/l10n/zh_HK.js
+++ b/lib/l10n/zh_HK.js
@@ -207,7 +207,6 @@ OC.L10N.register(
"App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "應用程式 \"%1$s\" 無法被安裝,缺少下列所需元件: %2$s",
"a safe home for all your data" : "您資料的安全屋",
"File is currently busy, please try again later" : "檔案目前忙碌中,請稍候再試",
- "Cannot read file" : "無法讀取檔案",
"Application is not enabled" : "應用程式未啟用",
"Authentication error" : "認證錯誤",
"Token expired. Please reload page." : "Token 過期,請重新整理頁面。",
@@ -257,6 +256,7 @@ OC.L10N.register(
"Storage is temporarily not available" : "儲存空間暫時無法使用",
"Storage connection timeout. %s" : "儲存空間連線逾時。%s",
"This can usually be fixed by giving the webserver write access to the config directory." : "允許網頁伺服器寫入 \"config\" 目錄通常可以解決這個問題",
+ "Cannot read file" : "無法讀取檔案",
"Cannot write into \"config\" directory" : "無法寫入 config 目錄",
"This can usually be fixed by giving the webserver write access to the config directory. See %s" : "允許網頁伺服器寫入 \"config\" 目錄通常可以解決這個問題,詳見 %s",
"Cannot write into \"apps\" directory" : "無法寫入 apps 目錄",
diff --git a/lib/l10n/zh_HK.json b/lib/l10n/zh_HK.json
index 36fdc2cbaf7..57b632a3bce 100644
--- a/lib/l10n/zh_HK.json
+++ b/lib/l10n/zh_HK.json
@@ -205,7 +205,6 @@
"App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "應用程式 \"%1$s\" 無法被安裝,缺少下列所需元件: %2$s",
"a safe home for all your data" : "您資料的安全屋",
"File is currently busy, please try again later" : "檔案目前忙碌中,請稍候再試",
- "Cannot read file" : "無法讀取檔案",
"Application is not enabled" : "應用程式未啟用",
"Authentication error" : "認證錯誤",
"Token expired. Please reload page." : "Token 過期,請重新整理頁面。",
@@ -255,6 +254,7 @@
"Storage is temporarily not available" : "儲存空間暫時無法使用",
"Storage connection timeout. %s" : "儲存空間連線逾時。%s",
"This can usually be fixed by giving the webserver write access to the config directory." : "允許網頁伺服器寫入 \"config\" 目錄通常可以解決這個問題",
+ "Cannot read file" : "無法讀取檔案",
"Cannot write into \"config\" directory" : "無法寫入 config 目錄",
"This can usually be fixed by giving the webserver write access to the config directory. See %s" : "允許網頁伺服器寫入 \"config\" 目錄通常可以解決這個問題,詳見 %s",
"Cannot write into \"apps\" directory" : "無法寫入 apps 目錄",
diff --git a/lib/l10n/zh_TW.js b/lib/l10n/zh_TW.js
index d8c668d8f41..0547b6a6354 100644
--- a/lib/l10n/zh_TW.js
+++ b/lib/l10n/zh_TW.js
@@ -207,7 +207,6 @@ OC.L10N.register(
"App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "應用程式 \"%1$s\" 無法被安裝,缺少下列所需元件: %2$s",
"a safe home for all your data" : "您資料的安全屋",
"File is currently busy, please try again later" : "檔案目前忙碌中,請稍候再試",
- "Cannot read file" : "無法讀取檔案",
"Application is not enabled" : "應用程式未啟用",
"Authentication error" : "認證錯誤",
"Token expired. Please reload page." : "Token 過期,請重新整理頁面。",
@@ -257,6 +256,7 @@ OC.L10N.register(
"Storage is temporarily not available" : "儲存空間暫時無法使用",
"Storage connection timeout. %s" : "儲存空間連線逾時。%s",
"This can usually be fixed by giving the webserver write access to the config directory." : "允許網頁伺服器寫入 \"config\" 目錄通常可以解決這個問題",
+ "Cannot read file" : "無法讀取檔案",
"Cannot write into \"config\" directory" : "無法寫入 config 目錄",
"This can usually be fixed by giving the webserver write access to the config directory. See %s" : "允許網頁伺服器寫入 \"config\" 目錄通常可以解決這個問題,詳見 %s",
"Cannot write into \"apps\" directory" : "無法寫入 apps 目錄",
diff --git a/lib/l10n/zh_TW.json b/lib/l10n/zh_TW.json
index feac90fc2d9..a47f606d260 100644
--- a/lib/l10n/zh_TW.json
+++ b/lib/l10n/zh_TW.json
@@ -205,7 +205,6 @@
"App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "應用程式 \"%1$s\" 無法被安裝,缺少下列所需元件: %2$s",
"a safe home for all your data" : "您資料的安全屋",
"File is currently busy, please try again later" : "檔案目前忙碌中,請稍候再試",
- "Cannot read file" : "無法讀取檔案",
"Application is not enabled" : "應用程式未啟用",
"Authentication error" : "認證錯誤",
"Token expired. Please reload page." : "Token 過期,請重新整理頁面。",
@@ -255,6 +254,7 @@
"Storage is temporarily not available" : "儲存空間暫時無法使用",
"Storage connection timeout. %s" : "儲存空間連線逾時。%s",
"This can usually be fixed by giving the webserver write access to the config directory." : "允許網頁伺服器寫入 \"config\" 目錄通常可以解決這個問題",
+ "Cannot read file" : "無法讀取檔案",
"Cannot write into \"config\" directory" : "無法寫入 config 目錄",
"This can usually be fixed by giving the webserver write access to the config directory. See %s" : "允許網頁伺服器寫入 \"config\" 目錄通常可以解決這個問題,詳見 %s",
"Cannot write into \"apps\" directory" : "無法寫入 apps 目錄",
diff --git a/lib/private/AllConfig.php b/lib/private/AllConfig.php
index 7e01e0ca815..2a0e8f53b14 100644
--- a/lib/private/AllConfig.php
+++ b/lib/private/AllConfig.php
@@ -353,8 +353,8 @@ class AllConfig implements IConfig {
$qb = $this->connection->getQueryBuilder();
$qb->delete('preferences')
->where($qb->expr()->eq('userid', $qb->createNamedParameter($userId, IQueryBuilder::PARAM_STR)))
- ->where($qb->expr()->eq('appid', $qb->createNamedParameter($appName, IQueryBuilder::PARAM_STR)))
- ->where($qb->expr()->eq('configkey', $qb->createNamedParameter($key, IQueryBuilder::PARAM_STR)))
+ ->andWhere($qb->expr()->eq('appid', $qb->createNamedParameter($appName, IQueryBuilder::PARAM_STR)))
+ ->andWhere($qb->expr()->eq('configkey', $qb->createNamedParameter($key, IQueryBuilder::PARAM_STR)))
->executeStatement();
if (isset($this->userCache[$userId][$appName])) {
diff --git a/lib/private/App/AppStore/Bundles/HubBundle.php b/lib/private/App/AppStore/Bundles/HubBundle.php
index a52de1dfbd4..d5d236a1855 100644
--- a/lib/private/App/AppStore/Bundles/HubBundle.php
+++ b/lib/private/App/AppStore/Bundles/HubBundle.php
@@ -39,8 +39,8 @@ class HubBundle extends Bundle {
'mail',
];
- $architecture = php_uname('m');
- if (PHP_OS_FAMILY === 'Linux' && in_array($architecture, ['x86_64', 'aarch64'])) {
+ $architecture = function_exists('php_uname') ? php_uname('m') : null;
+ if (isset($architecture) && PHP_OS_FAMILY === 'Linux' && in_array($architecture, ['x86_64', 'aarch64'])) {
$hubApps[] = 'richdocuments';
$hubApps[] = 'richdocumentscode' . ($architecture === 'aarch64' ? '_arm64' : '');
}
diff --git a/lib/private/App/CompareVersion.php b/lib/private/App/CompareVersion.php
index d155945fff1..a349c7aa6f2 100644
--- a/lib/private/App/CompareVersion.php
+++ b/lib/private/App/CompareVersion.php
@@ -41,7 +41,7 @@ class CompareVersion {
* so '13.0.1', '13.0' and '13' are valid.
*
* @param string $actual version as major.minor.patch notation
- * @param string $required version where major is requried and minor and patch are optional
+ * @param string $required version where major is required and minor and patch are optional
* @param string $comparator passed to `version_compare`
* @return bool whether the requirement is fulfilled
* @throws InvalidArgumentException if versions specified in an invalid format
diff --git a/lib/private/AppFramework/Http/Dispatcher.php b/lib/private/AppFramework/Http/Dispatcher.php
index 21d61bc95aa..c1a203a7165 100644
--- a/lib/private/AppFramework/Http/Dispatcher.php
+++ b/lib/private/AppFramework/Http/Dispatcher.php
@@ -118,7 +118,7 @@ class Dispatcher {
$out = [null, [], null];
try {
- // prefill reflector with everything thats needed for the
+ // prefill reflector with everything that's needed for the
// middlewares
$this->reflector->reflect($controller, $methodName);
@@ -156,7 +156,7 @@ class Dispatcher {
// if an exception appears, the middleware checks if it can handle the
// exception and creates a response. If no response is created, it is
- // assumed that theres no middleware who can handle it and the error is
+ // assumed that there's no middleware who can handle it and the error is
// thrown again
} catch (\Exception $exception) {
$response = $this->middlewareDispatcher->afterException(
diff --git a/lib/private/AppFramework/Http/Request.php b/lib/private/AppFramework/Http/Request.php
index 010d889070e..496a845dd4a 100644
--- a/lib/private/AppFramework/Http/Request.php
+++ b/lib/private/AppFramework/Http/Request.php
@@ -25,6 +25,7 @@ declare(strict_types=1);
* @author Thomas Müller <thomas.mueller@tmit.eu>
* @author Thomas Tanghus <thomas@tanghus.net>
* @author Vincent Petry <vincent@nextcloud.com>
+ * @author Simon Leiner <simon@leiner.me>
*
* @license AGPL-3.0
*
@@ -50,6 +51,7 @@ use OCP\IConfig;
use OCP\IRequest;
use OCP\IRequestId;
use OCP\Security\ICrypto;
+use Symfony\Component\HttpFoundation\IpUtils;
/**
* Class for accessing variables in the request.
@@ -342,7 +344,7 @@ class Request implements \ArrayAccess, \Countable, IRequest {
/**
* Returns all params that were received, be it from the request
- * (as GET or POST) or throuh the URL by the route
+ * (as GET or POST) or through the URL by the route
* @return array the array with all parameters
*/
public function getParams(): array {
@@ -573,41 +575,12 @@ class Request implements \ArrayAccess, \Countable, IRequest {
}
/**
- * Checks if given $remoteAddress matches given $trustedProxy.
- * If $trustedProxy is an IPv4 IP range given in CIDR notation, true will be returned if
- * $remoteAddress is an IPv4 address within that IP range.
- * Otherwise $remoteAddress will be compared to $trustedProxy literally and the result
- * will be returned.
- * @return boolean true if $remoteAddress matches $trustedProxy, false otherwise
- */
- protected function matchesTrustedProxy($trustedProxy, $remoteAddress) {
- $cidrre = '/^([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})\/([0-9]{1,2})$/';
-
- if (preg_match($cidrre, $trustedProxy, $match)) {
- $net = $match[1];
- $shiftbits = min(32, max(0, 32 - intval($match[2])));
- $netnum = ip2long($net) >> $shiftbits;
- $ipnum = ip2long($remoteAddress) >> $shiftbits;
-
- return $ipnum === $netnum;
- }
-
- return $trustedProxy === $remoteAddress;
- }
-
- /**
* Checks if given $remoteAddress matches any entry in the given array $trustedProxies.
* For details regarding what "match" means, refer to `matchesTrustedProxy`.
* @return boolean true if $remoteAddress matches any entry in $trustedProxies, false otherwise
*/
protected function isTrustedProxy($trustedProxies, $remoteAddress) {
- foreach ($trustedProxies as $tp) {
- if ($this->matchesTrustedProxy($tp, $remoteAddress)) {
- return true;
- }
- }
-
- return false;
+ return IpUtils::checkIp($remoteAddress, $trustedProxies);
}
/**
diff --git a/lib/private/AppFramework/Middleware/MiddlewareDispatcher.php b/lib/private/AppFramework/Middleware/MiddlewareDispatcher.php
index 950ef8a13a3..adf17e53caa 100644
--- a/lib/private/AppFramework/Middleware/MiddlewareDispatcher.php
+++ b/lib/private/AppFramework/Middleware/MiddlewareDispatcher.php
@@ -46,7 +46,7 @@ class MiddlewareDispatcher {
private $middlewares;
/**
- * @var int counter which tells us what middlware was executed once an
+ * @var int counter which tells us what middleware was executed once an
* exception occurs
*/
private $middlewareCounter;
diff --git a/lib/private/Authentication/Listeners/UserDeletedFilesCleanupListener.php b/lib/private/Authentication/Listeners/UserDeletedFilesCleanupListener.php
index 2fb05159d09..5e657be0763 100644
--- a/lib/private/Authentication/Listeners/UserDeletedFilesCleanupListener.php
+++ b/lib/private/Authentication/Listeners/UserDeletedFilesCleanupListener.php
@@ -72,12 +72,12 @@ class UserDeletedFilesCleanupListener implements IEventListener {
}
$storage = $this->homeStorageCache[$event->getUser()->getUID()];
$cache = $storage->getCache();
+ $storage->rmdir('');
if ($cache instanceof Cache) {
$cache->clear();
} else {
throw new \Exception("Home storage has invalid cache");
}
- $storage->rmdir('');
}
}
}
diff --git a/lib/private/Authentication/Token/IProvider.php b/lib/private/Authentication/Token/IProvider.php
index 0a145bfd7e6..33e0ad46263 100644
--- a/lib/private/Authentication/Token/IProvider.php
+++ b/lib/private/Authentication/Token/IProvider.php
@@ -158,7 +158,7 @@ interface IProvider {
public function setPassword(IToken $token, string $tokenId, string $password);
/**
- * Rotate the token. Usefull for for example oauth tokens
+ * Rotate the token. Useful for for example oauth tokens
*
* @param IToken $token
* @param string $oldTokenId
diff --git a/lib/private/Authentication/Token/PublicKeyTokenProvider.php b/lib/private/Authentication/Token/PublicKeyTokenProvider.php
index d21179a35c1..f9ebe90c890 100644
--- a/lib/private/Authentication/Token/PublicKeyTokenProvider.php
+++ b/lib/private/Authentication/Token/PublicKeyTokenProvider.php
@@ -401,7 +401,7 @@ class PublicKeyTokenProvider implements IProvider {
$this->cache->clear();
// prevent setting an empty pw as result of pw-less-login
- if ($password === '') {
+ if ($password === '' || !$this->config->getSystemValueBool('auth.storeCryptedPassword', true)) {
return;
}
diff --git a/lib/private/Avatar/Avatar.php b/lib/private/Avatar/Avatar.php
index 25099a4f139..0eb8f8816d8 100644
--- a/lib/private/Avatar/Avatar.php
+++ b/lib/private/Avatar/Avatar.php
@@ -236,7 +236,7 @@ abstract class Avatar implements IAvatar {
}
/**
- * @return Color Object containting r g b int in the range [0, 255]
+ * @return Color Object containing r g b int in the range [0, 255]
*/
public function avatarBackgroundColor(string $hash): Color {
// Normalize hash
diff --git a/lib/private/Config.php b/lib/private/Config.php
index b044d0731a3..37708357339 100644
--- a/lib/private/Config.php
+++ b/lib/private/Config.php
@@ -231,6 +231,14 @@ class Config {
unset($CONFIG);
include $file;
+ if (!defined('PHPUNIT_RUN') && headers_sent()) {
+ // syntax issues in the config file like leading spaces causing PHP to send output
+ $errorMessage = sprintf('Config file has leading content, please remove everything before "<?php" in %s', basename($file));
+ if (!defined('OC_CONSOLE')) {
+ print(\OCP\Util::sanitizeHTML($errorMessage));
+ }
+ throw new \Exception($errorMessage);
+ }
if (isset($CONFIG) && is_array($CONFIG)) {
$this->cache = array_merge($this->cache, $CONFIG);
}
diff --git a/lib/private/Contacts/ContactsMenu/ContactsStore.php b/lib/private/Contacts/ContactsMenu/ContactsStore.php
index 4d7fda39c6a..dd4bd973fa9 100644
--- a/lib/private/Contacts/ContactsMenu/ContactsStore.php
+++ b/lib/private/Contacts/ContactsMenu/ContactsStore.php
@@ -123,7 +123,7 @@ class ContactsStore implements IContactsStore {
* 2. if the `shareapi_exclude_groups` config option is enabled and the
* current user is in an excluded group it will filter all local users.
* 3. if the `shareapi_only_share_with_group_members` config option is
- * enabled it will filter all users which doens't have a common group
+ * enabled it will filter all users which doesn't have a common group
* with the current user.
*
* @param IUser $self
diff --git a/lib/private/DB/QueryBuilder/QueryBuilder.php b/lib/private/DB/QueryBuilder/QueryBuilder.php
index 8fc66755a99..d991cbd1dd5 100644
--- a/lib/private/DB/QueryBuilder/QueryBuilder.php
+++ b/lib/private/DB/QueryBuilder/QueryBuilder.php
@@ -852,7 +852,7 @@ class QueryBuilder implements IQueryBuilder {
* ->from('users', 'u')
* ->where('u.id = ?');
*
- * // You can optionally programatically build and/or expressions
+ * // You can optionally programmatically build and/or expressions
* $qb = $conn->getQueryBuilder();
*
* $or = $qb->expr()->orx();
diff --git a/lib/private/Files/Cache/Cache.php b/lib/private/Files/Cache/Cache.php
index 33a07e9b9e5..f23635aa01b 100644
--- a/lib/private/Files/Cache/Cache.php
+++ b/lib/private/Files/Cache/Cache.php
@@ -64,7 +64,7 @@ use Psr\Log\LoggerInterface;
/**
* Metadata cache for a storage
*
- * The cache stores the metadata for all files and folders in a storage and is kept up to date trough the following mechanisms:
+ * The cache stores the metadata for all files and folders in a storage and is kept up to date through the following mechanisms:
*
* - Scanner: scans the storage and updates the cache where needed
* - Watcher: checks for changes made to the filesystem outside of the Nextcloud instance and rescans files and folder when a change is detected
@@ -582,7 +582,7 @@ class Cache implements ICache {
$parentIds = [$entry->getId()];
$queue = [$entry->getId()];
- // we walk depth first trough the file tree, removing all filecache_extended attributes while we walk
+ // we walk depth first through the file tree, removing all filecache_extended attributes while we walk
// and collecting all folder ids to later use to delete the filecache entries
while ($entryId = array_pop($queue)) {
$children = $this->getFolderContentsById($entryId);
@@ -952,7 +952,7 @@ class Cache implements ICache {
* use the one with the highest id gives the best result with the background scanner, since that is most
* likely the folder where we stopped scanning previously
*
- * @return string|bool the path of the folder or false when no folder matched
+ * @return string|false the path of the folder or false when no folder matched
*/
public function getIncomplete() {
$query = $this->getQueryBuilder();
diff --git a/lib/private/Files/Cache/Propagator.php b/lib/private/Files/Cache/Propagator.php
index afff2fb51ff..a0953baa785 100644
--- a/lib/private/Files/Cache/Propagator.php
+++ b/lib/private/Files/Cache/Propagator.php
@@ -66,7 +66,7 @@ class Propagator implements IPropagator {
* @param int $sizeDifference number of bytes the file has grown
*/
public function propagateChange($internalPath, $time, $sizeDifference = 0) {
- // Do not propogate changes in ignored paths
+ // Do not propagate changes in ignored paths
foreach ($this->ignore as $ignore) {
if (strpos($internalPath, $ignore) === 0) {
return;
diff --git a/lib/private/Files/Cache/QuerySearchHelper.php b/lib/private/Files/Cache/QuerySearchHelper.php
index 69a2944b2dd..3529ede9746 100644
--- a/lib/private/Files/Cache/QuerySearchHelper.php
+++ b/lib/private/Files/Cache/QuerySearchHelper.php
@@ -158,7 +158,7 @@ class QuerySearchHelper {
$result->closeCursor();
- // loop trough all caches for each result to see if the result matches that storage
+ // loop through all caches for each result to see if the result matches that storage
// results are grouped by the same array keys as the caches argument to allow the caller to distringuish the source of the results
$results = array_fill_keys(array_keys($caches), []);
foreach ($rawEntries as $rawEntry) {
diff --git a/lib/private/Files/Cache/Storage.php b/lib/private/Files/Cache/Storage.php
index fb9e5500658..f77c9b71dd7 100644
--- a/lib/private/Files/Cache/Storage.php
+++ b/lib/private/Files/Cache/Storage.php
@@ -40,7 +40,7 @@ use Psr\Log\LoggerInterface;
* a string id which is generated by the storage backend and reflects the configuration of the storage (e.g. 'smb://user@host/share')
* and a numeric storage id which is referenced in the file cache
*
- * A mapping between the two storage ids is stored in the database and accessible trough this class
+ * A mapping between the two storage ids is stored in the database and accessible through this class
*
* @package OC\Files\Cache
*/
@@ -135,7 +135,7 @@ class Storage {
* Get the numeric of the storage with the provided string id
*
* @param $storageId
- * @return int|null either the numeric storage id or null if the storage id is not knwon
+ * @return int|null either the numeric storage id or null if the storage id is not known
*/
public static function getNumericStorageId($storageId) {
$storageId = self::adjustStorageId($storageId);
diff --git a/lib/private/Files/Cache/StorageGlobal.php b/lib/private/Files/Cache/StorageGlobal.php
index a898c435415..74cbd5abdb2 100644
--- a/lib/private/Files/Cache/StorageGlobal.php
+++ b/lib/private/Files/Cache/StorageGlobal.php
@@ -33,7 +33,7 @@ use OCP\IDBConnection;
* a string id which is generated by the storage backend and reflects the configuration of the storage (e.g. 'smb://user@host/share')
* and a numeric storage id which is referenced in the file cache
*
- * A mapping between the two storage ids is stored in the database and accessible trough this class
+ * A mapping between the two storage ids is stored in the database and accessible through this class
*
* @package OC\Files\Cache
*/
diff --git a/lib/private/Files/Cache/Updater.php b/lib/private/Files/Cache/Updater.php
index 98fb51fe264..f8c187996e6 100644
--- a/lib/private/Files/Cache/Updater.php
+++ b/lib/private/Files/Cache/Updater.php
@@ -73,14 +73,14 @@ class Updater implements IUpdater {
}
/**
- * Disable updating the cache trough this updater
+ * Disable updating the cache through this updater
*/
public function disable() {
$this->enabled = false;
}
/**
- * Re-enable the updating of the cache trough this updater
+ * Re-enable the updating of the cache through this updater
*/
public function enable() {
$this->enabled = true;
diff --git a/lib/private/Files/Cache/Wrapper/CacheJail.php b/lib/private/Files/Cache/Wrapper/CacheJail.php
index 7183a6c0d2a..4053042edd9 100644
--- a/lib/private/Files/Cache/Wrapper/CacheJail.php
+++ b/lib/private/Files/Cache/Wrapper/CacheJail.php
@@ -267,7 +267,7 @@ class CacheJail extends CacheWrapper {
* use the one with the highest id gives the best result with the background scanner, since that is most
* likely the folder where we stopped scanning previously
*
- * @return string|bool the path of the folder or false when no folder matched
+ * @return string|false the path of the folder or false when no folder matched
*/
public function getIncomplete() {
// not supported
diff --git a/lib/private/Files/Cache/Wrapper/CacheWrapper.php b/lib/private/Files/Cache/Wrapper/CacheWrapper.php
index e5300dc75f5..66ae83fd144 100644
--- a/lib/private/Files/Cache/Wrapper/CacheWrapper.php
+++ b/lib/private/Files/Cache/Wrapper/CacheWrapper.php
@@ -267,7 +267,7 @@ class CacheWrapper extends Cache {
* use the one with the highest id gives the best result with the background scanner, since that is most
* likely the folder where we stopped scanning previously
*
- * @return string|bool the path of the folder or false when no folder matched
+ * @return string|false the path of the folder or false when no folder matched
*/
public function getIncomplete() {
return $this->getCache()->getIncomplete();
diff --git a/lib/private/Files/Config/UserMountCache.php b/lib/private/Files/Config/UserMountCache.php
index f26c42938d3..685057a7860 100644
--- a/lib/private/Files/Config/UserMountCache.php
+++ b/lib/private/Files/Config/UserMountCache.php
@@ -42,7 +42,7 @@ use OCP\IUserManager;
use Psr\Log\LoggerInterface;
/**
- * Cache mounts points per user in the cache so we can easilly look them up
+ * Cache mounts points per user in the cache so we can easily look them up
*/
class UserMountCache implements IUserMountCache {
private IDBConnection $connection;
diff --git a/lib/private/Files/FileInfo.php b/lib/private/Files/FileInfo.php
index 7a984429d1f..47c893ebbf1 100644
--- a/lib/private/Files/FileInfo.php
+++ b/lib/private/Files/FileInfo.php
@@ -414,7 +414,7 @@ class FileInfo implements \OCP\Files\FileInfo, \ArrayAccess {
if (isset($data['etag'])) {
// prefix the etag with the relative path of the subentry to propagate etag on mount moves
$relativeEntryPath = substr($entryPath, strlen($this->getPath()));
- // attach the permissions to propagate etag on permision changes of submounts
+ // attach the permissions to propagate etag on permission changes of submounts
$permissions = isset($data['permissions']) ? $data['permissions'] : 0;
$this->childEtags[] = $relativeEntryPath . '/' . $data['etag'] . $permissions;
}
diff --git a/lib/private/Files/Node/Folder.php b/lib/private/Files/Node/Folder.php
index b56b7e0f851..42562c99bcb 100644
--- a/lib/private/Files/Node/Folder.php
+++ b/lib/private/Files/Node/Folder.php
@@ -262,7 +262,7 @@ class Folder extends Node implements \OCP\Files\Folder {
$searchHelper = \OC::$server->get(QuerySearchHelper::class);
$resultsPerCache = $searchHelper->searchInCaches($query, $caches);
- // loop trough all results per-cache, constructing the FileInfo object from the CacheEntry and merge them all
+ // loop through all results per-cache, constructing the FileInfo object from the CacheEntry and merge them all
$files = array_merge(...array_map(function (array $results, $relativeMountPoint) use ($mountByMountPoint) {
$mount = $mountByMountPoint[$relativeMountPoint];
return array_map(function (ICacheEntry $result) use ($relativeMountPoint, $mount) {
diff --git a/lib/private/Files/Node/Root.php b/lib/private/Files/Node/Root.php
index 9e3d4afd8d8..ca930c1002c 100644
--- a/lib/private/Files/Node/Root.php
+++ b/lib/private/Files/Node/Root.php
@@ -427,7 +427,7 @@ class Root extends Folder implements IRootFolder {
$mountsContainingFile = $mountCache->getMountsForFileId($id, $user);
}
- // when a user has access trough the same storage trough multiple paths
+ // when a user has access through the same storage through multiple paths
// (such as an external storage that is both mounted for a user and shared to the user)
// the mount cache will only hold a single entry for the storage
// this can lead to issues as the different ways the user has access to a storage can have different permissions
diff --git a/lib/private/Files/ObjectStore/S3ObjectTrait.php b/lib/private/Files/ObjectStore/S3ObjectTrait.php
index 0b2fd95c652..9d692e01a23 100644
--- a/lib/private/Files/ObjectStore/S3ObjectTrait.php
+++ b/lib/private/Files/ObjectStore/S3ObjectTrait.php
@@ -69,11 +69,14 @@ trait S3ObjectTrait {
'http' => [
'protocol_version' => $request->getProtocolVersion(),
'header' => $headers,
- ],
- 'ssl' => [
- 'cafile' => $this->getCertificateBundlePath()
]
];
+ $bundle = $this->getCertificateBundlePath();
+ if ($bundle) {
+ $opts['ssl'] = [
+ 'cafile' => $bundle
+ ];
+ }
if ($this->getProxy()) {
$opts['http']['proxy'] = $this->getProxy();
diff --git a/lib/private/Files/SimpleFS/NewSimpleFile.php b/lib/private/Files/SimpleFS/NewSimpleFile.php
index 5fdd794ba98..b2a183b7d29 100644
--- a/lib/private/Files/SimpleFS/NewSimpleFile.php
+++ b/lib/private/Files/SimpleFS/NewSimpleFile.php
@@ -127,7 +127,7 @@ class NewSimpleFile implements ISimpleFile {
/**
* Sometimes there are some issues with the AppData. Most of them are from
- * user error. But we should handle them gracefull anyway.
+ * user error. But we should handle them gracefully anyway.
*
* If for some reason the current file can't be found. We remove it.
* Then traverse up and check all folders if they exists. This so that the
diff --git a/lib/private/Files/SimpleFS/SimpleFile.php b/lib/private/Files/SimpleFS/SimpleFile.php
index a07871337a6..a2571ac50e8 100644
--- a/lib/private/Files/SimpleFS/SimpleFile.php
+++ b/lib/private/Files/SimpleFS/SimpleFile.php
@@ -97,7 +97,7 @@ class SimpleFile implements ISimpleFile {
/**
* Sometimes there are some issues with the AppData. Most of them are from
- * user error. But we should handle them gracefull anyway.
+ * user error. But we should handle them gracefully anyway.
*
* If for some reason the current file can't be found. We remove it.
* Then traverse up and check all folders if they exists. This so that the
diff --git a/lib/private/Files/View.php b/lib/private/Files/View.php
index 2b6732e2ba0..d12869fbdaa 100644
--- a/lib/private/Files/View.php
+++ b/lib/private/Files/View.php
@@ -1164,7 +1164,7 @@ class View {
try {
$this->changeLock($path, ILockingProvider::LOCK_EXCLUSIVE);
} catch (LockedException $e) {
- // release the shared lock we acquired before quiting
+ // release the shared lock we acquired before quitting
$this->unlockFile($path, ILockingProvider::LOCK_SHARED);
throw $e;
}
@@ -1725,7 +1725,7 @@ class View {
/**
* Get the path of a file by id, relative to the view
*
- * Note that the resulting path is not guarantied to be unique for the id, multiple paths can point to the same file
+ * Note that the resulting path is not guaranteed to be unique for the id, multiple paths can point to the same file
*
* @param int $id
* @param int|null $storageId
diff --git a/lib/private/HintException.php b/lib/private/HintException.php
index 735832266cf..20f7142d1c0 100644
--- a/lib/private/HintException.php
+++ b/lib/private/HintException.php
@@ -31,7 +31,7 @@ namespace OC;
* An Exception class with the intention to be presented to the end user
*
* @package OC
- * @depreacted 23.0.0 Use \OCP\HintException
+ * @deprecated 23.0.0 Use \OCP\HintException
*/
class HintException extends \OCP\HintException {
}
diff --git a/lib/private/Http/Client/Client.php b/lib/private/Http/Client/Client.php
index 3ba85a2dd9f..4bf7fd02400 100644
--- a/lib/private/Http/Client/Client.php
+++ b/lib/private/Http/Client/Client.php
@@ -128,7 +128,7 @@ class Client implements IClient {
}
/**
- * Returns a null or an associative array specifiying the proxy URI for
+ * Returns a null or an associative array specifying the proxy URI for
* 'http' and 'https' schemes, in addition to a 'no' key value pair
* providing a list of host names that should not be proxied to.
*
diff --git a/lib/private/Http/Client/LocalAddressChecker.php b/lib/private/Http/Client/LocalAddressChecker.php
index c69d1007a16..f4fea503ab9 100644
--- a/lib/private/Http/Client/LocalAddressChecker.php
+++ b/lib/private/Http/Client/LocalAddressChecker.php
@@ -27,6 +27,7 @@ namespace OC\Http\Client;
use OCP\Http\Client\LocalServerException;
use Psr\Log\LoggerInterface;
+use Symfony\Component\HttpFoundation\IpUtils;
class LocalAddressChecker {
private LoggerInterface $logger;
@@ -36,7 +37,16 @@ class LocalAddressChecker {
}
public function ThrowIfLocalIp(string $ip) : void {
- if ((bool)filter_var($ip, FILTER_VALIDATE_IP) && !filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
+ $localRanges = [
+ '100.64.0.0/10', // See RFC 6598
+ '192.0.0.0/24', // See RFC 6890
+ ];
+ if (
+ (bool)filter_var($ip, FILTER_VALIDATE_IP) &&
+ (
+ !filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) ||
+ IpUtils::checkIp($ip, $localRanges)
+ )) {
$this->logger->warning("Host $ip was not connected to because it violates local access rules");
throw new LocalServerException('Host violates local access rules');
}
@@ -46,7 +56,9 @@ class LocalAddressChecker {
$delimiter = strrpos($ip, ':'); // Get last colon
$ipv4Address = substr($ip, $delimiter + 1);
- if (!filter_var($ipv4Address, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
+ if (
+ !filter_var($ipv4Address, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE) ||
+ IpUtils::checkIp($ip, $localRanges)) {
$this->logger->warning("Host $ip was not connected to because it violates local access rules");
throw new LocalServerException('Host violates local access rules');
}
diff --git a/lib/private/MemoryInfo.php b/lib/private/MemoryInfo.php
index 074e9f915fe..ed6617d879d 100644
--- a/lib/private/MemoryInfo.php
+++ b/lib/private/MemoryInfo.php
@@ -68,7 +68,7 @@ class MemoryInfo {
$last = strtolower(substr($memoryLimit, -1));
$memoryLimit = (int)substr($memoryLimit, 0, -1);
- // intended fall trough
+ // intended fall through
switch ($last) {
case 'g':
$memoryLimit *= 1024;
diff --git a/lib/private/Metadata/IMetadataManager.php b/lib/private/Metadata/IMetadataManager.php
index d2d37f15c25..fa0bcc22801 100644
--- a/lib/private/Metadata/IMetadataManager.php
+++ b/lib/private/Metadata/IMetadataManager.php
@@ -29,7 +29,7 @@ interface IMetadataManager {
public function fetchMetadataFor(string $group, array $fileIds): array;
/**
- * Get the capabilites as an array of mimetype regex to the type provided
+ * Get the capabilities as an array of mimetype regex to the type provided
*/
public function getCapabilities(): array;
}
diff --git a/lib/private/OCS/DiscoveryService.php b/lib/private/OCS/DiscoveryService.php
index 1d10bbac870..7ab876811e7 100644
--- a/lib/private/OCS/DiscoveryService.php
+++ b/lib/private/OCS/DiscoveryService.php
@@ -62,7 +62,7 @@ class DiscoveryService implements IDiscoveryService {
*
* @param string $remote
* @param string $service the service you want to discover
- * @param bool $skipCache We won't check if the data is in the cache. This is usefull if a background job is updating the status
+ * @param bool $skipCache We won't check if the data is in the cache. This is useful if a background job is updating the status
* @return array
*/
public function discover(string $remote, string $service, bool $skipCache = false): array {
diff --git a/lib/private/Profile/ProfileManager.php b/lib/private/Profile/ProfileManager.php
index edb51458c66..f2eacd1ef25 100644
--- a/lib/private/Profile/ProfileManager.php
+++ b/lib/private/Profile/ProfileManager.php
@@ -348,13 +348,13 @@ class ProfileManager {
* Return the default profile config
*/
private function getDefaultProfileConfig(IUser $targetUser, ?IUser $visitingUser): array {
- // Contruct the default config for actions
+ // Construct the default config for actions
$actionsConfig = [];
foreach ($this->getActions($targetUser, $visitingUser) as $action) {
$actionsConfig[$action->getId()] = ['visibility' => ProfileConfig::DEFAULT_VISIBILITY];
}
- // Contruct the default config for account properties
+ // Construct the default config for account properties
$propertiesConfig = [];
foreach (ProfileConfig::DEFAULT_PROPERTY_VISIBILITY as $property => $visibility) {
$propertiesConfig[$property] = ['visibility' => $visibility];
diff --git a/lib/private/Repair/RemoveLinkShares.php b/lib/private/Repair/RemoveLinkShares.php
index 1b0270e928d..e1ce78cdbf3 100644
--- a/lib/private/Repair/RemoveLinkShares.php
+++ b/lib/private/Repair/RemoveLinkShares.php
@@ -217,7 +217,7 @@ class RemoveLinkShares implements IRepairStep {
$output->finishProgress();
$shareResult->closeCursor();
- // Notifiy all admins
+ // Notify all admins
$adminGroup = $this->groupManager->get('admin');
$adminUsers = $adminGroup->getUsers();
foreach ($adminUsers as $user) {
diff --git a/lib/private/Route/Router.php b/lib/private/Route/Router.php
index b957173cacc..7e1acd49800 100644
--- a/lib/private/Route/Router.php
+++ b/lib/private/Route/Router.php
@@ -409,7 +409,7 @@ class Router implements IRouter {
* register the routes for the app. The application class will be chosen by
* camelcasing the appname, e.g.: my_app will be turned into
* \OCA\MyApp\AppInfo\Application. If that class does not exist, a default
- * App will be intialized. This makes it optional to ship an
+ * App will be initialized. This makes it optional to ship an
* appinfo/application.php by using the built in query resolver
*
* @param array $routes the application routes
diff --git a/lib/private/Security/Bruteforce/Throttler.php b/lib/private/Security/Bruteforce/Throttler.php
index e37746eb6a2..299cab93eb3 100644
--- a/lib/private/Security/Bruteforce/Throttler.php
+++ b/lib/private/Security/Bruteforce/Throttler.php
@@ -36,6 +36,7 @@ use OC\Security\Normalizer\IpAddress;
use OCP\AppFramework\Utility\ITimeFactory;
use OCP\IConfig;
use OCP\IDBConnection;
+use OCP\Security\Bruteforce\IThrottler;
use OCP\Security\Bruteforce\MaxDelayReached;
use Psr\Log\LoggerInterface;
@@ -52,11 +53,8 @@ use Psr\Log\LoggerInterface;
*
* @package OC\Security\Bruteforce
*/
-class Throttler {
+class Throttler implements IThrottler {
public const LOGIN_ACTION = 'login';
- public const MAX_DELAY = 25;
- public const MAX_DELAY_MS = 25000; // in milliseconds
- public const MAX_ATTEMPTS = 10;
/** @var IDBConnection */
private $db;
@@ -311,7 +309,7 @@ class Throttler {
*
* @param string $ip
*/
- public function resetDelayForIP($ip) {
+ public function resetDelayForIP(string $ip): void {
$cutoffTime = $this->getCutoffTimestamp();
$qb = $this->db->getQueryBuilder();
diff --git a/lib/private/Security/TrustedDomainHelper.php b/lib/private/Security/TrustedDomainHelper.php
index 0688ebba5b3..1927af9cb1d 100644
--- a/lib/private/Security/TrustedDomainHelper.php
+++ b/lib/private/Security/TrustedDomainHelper.php
@@ -97,7 +97,7 @@ class TrustedDomainHelper implements ITrustedDomainHelper {
if (preg_match(Request::REGEX_LOCALHOST, $domain) === 1) {
return true;
}
- // Reject misformed domains in any case
+ // Reject malformed domains in any case
if (strpos($domain, '-') === 0 || strpos($domain, '..') !== false) {
return false;
}
diff --git a/lib/private/Server.php b/lib/private/Server.php
index bcbb6ef6b00..842f72fa1d0 100644
--- a/lib/private/Server.php
+++ b/lib/private/Server.php
@@ -231,6 +231,7 @@ use OCP\Remote\Api\IApiFactory;
use OCP\Remote\IInstanceFactory;
use OCP\RichObjectStrings\IValidator;
use OCP\Route\IRouter;
+use OCP\Security\Bruteforce\IThrottler;
use OCP\Security\IContentSecurityPolicyManager;
use OCP\Security\ICredentialsManager;
use OCP\Security\ICrypto;
@@ -1002,6 +1003,7 @@ class Server extends ServerContainer implements IServerContainer {
$this->registerAlias(ITrustedDomainHelper::class, TrustedDomainHelper::class);
/** @deprecated 19.0.0 */
$this->registerDeprecatedAlias('Throttler', Throttler::class);
+ $this->registerAlias(IThrottler::class, Throttler::class);
$this->registerService('IntegrityCodeChecker', function (ContainerInterface $c) {
// IConfig and IAppManager requires a working database. This code
// might however be called when ownCloud is not yet setup.
diff --git a/lib/private/Session/Internal.php b/lib/private/Session/Internal.php
index 285b6fd7960..6e0c54c6fab 100644
--- a/lib/private/Session/Internal.php
+++ b/lib/private/Session/Internal.php
@@ -172,7 +172,7 @@ class Internal extends Session {
* @throws \Exception
*/
public function reopen() {
- throw new \Exception('The session cannot be reopened - reopen() is ony to be used in unit testing.');
+ throw new \Exception('The session cannot be reopened - reopen() is only to be used in unit testing.');
}
/**
diff --git a/lib/private/Share/Constants.php b/lib/private/Share/Constants.php
index 31c734f94aa..3632a2a26d1 100644
--- a/lib/private/Share/Constants.php
+++ b/lib/private/Share/Constants.php
@@ -79,7 +79,7 @@ class Constants {
public const FORMAT_STATUSES = -2;
public const FORMAT_SOURCES = -3; // ToDo Check if it is still in use otherwise remove it
- public const RESPONSE_FORMAT = 'json'; // default resonse format for ocs calls
+ public const RESPONSE_FORMAT = 'json'; // default response format for ocs calls
public const TOKEN_LENGTH = 15; // old (oc7) length is 32, keep token length in db at least that for compatibility
diff --git a/lib/private/Share/Share.php b/lib/private/Share/Share.php
index 9018f35ac2a..f47c042df29 100644
--- a/lib/private/Share/Share.php
+++ b/lib/private/Share/Share.php
@@ -732,7 +732,7 @@ class Share extends Constants {
foreach ($result as $key => $r) {
// for file/folder shares we need to compare file_source, otherwise we compare item_source
// only group shares if they already point to the same target, otherwise the file where shared
- // before grouping of shares was added. In this case we don't group them toi avoid confusions
+ // before grouping of shares was added. In this case we don't group them to avoid confusions
if (($fileSharing && $item['file_source'] === $r['file_source'] && $item['file_target'] === $r['file_target']) ||
(!$fileSharing && $item['item_source'] === $r['item_source'] && $item['item_target'] === $r['item_target'])) {
// add the first item to the list of grouped shares
@@ -757,7 +757,7 @@ class Share extends Constants {
/**
* construct select statement
* @param int $format
- * @param boolean $fileDependent ist it a file/folder share or a generla share
+ * @param boolean $fileDependent ist it a file/folder share or a general share
* @param string $uidOwner
* @return string select statement
*/
diff --git a/lib/private/Share20/DefaultShareProvider.php b/lib/private/Share20/DefaultShareProvider.php
index 520bd17d3cf..70f9b8665f9 100644
--- a/lib/private/Share20/DefaultShareProvider.php
+++ b/lib/private/Share20/DefaultShareProvider.php
@@ -52,6 +52,7 @@ use OCP\IUserManager;
use OCP\L10N\IFactory;
use OCP\Mail\IMailer;
use OCP\Share\Exceptions\ShareNotFound;
+use OCP\Share\IAttributes;
use OCP\Share\IShare;
use OCP\Share\IShareProvider;
@@ -174,6 +175,8 @@ class DefaultShareProvider implements IShareProvider {
if (method_exists($share, 'getParent')) {
$qb->setValue('parent', $qb->createNamedParameter($share->getParent()));
}
+
+ $qb->setValue('hide_download', $qb->createNamedParameter($share->getHideDownload() ? 1 : 0, IQueryBuilder::PARAM_INT));
} else {
throw new \Exception('invalid share type!');
}
@@ -193,6 +196,12 @@ class DefaultShareProvider implements IShareProvider {
// set the permissions
$qb->setValue('permissions', $qb->createNamedParameter($share->getPermissions()));
+ // set share attributes
+ $shareAttributes = $this->formatShareAttributes(
+ $share->getAttributes()
+ );
+ $qb->setValue('attributes', $qb->createNamedParameter($shareAttributes));
+
// Set who created this share
$qb->setValue('uid_initiator', $qb->createNamedParameter($share->getSharedBy()));
@@ -248,6 +257,8 @@ class DefaultShareProvider implements IShareProvider {
public function update(\OCP\Share\IShare $share) {
$originalShare = $this->getShareById($share->getId());
+ $shareAttributes = $this->formatShareAttributes($share->getAttributes());
+
if ($share->getShareType() === IShare::TYPE_USER) {
/*
* We allow updating the recipient on user shares.
@@ -259,6 +270,7 @@ class DefaultShareProvider implements IShareProvider {
->set('uid_owner', $qb->createNamedParameter($share->getShareOwner()))
->set('uid_initiator', $qb->createNamedParameter($share->getSharedBy()))
->set('permissions', $qb->createNamedParameter($share->getPermissions()))
+ ->set('attributes', $qb->createNamedParameter($shareAttributes))
->set('item_source', $qb->createNamedParameter($share->getNode()->getId()))
->set('file_source', $qb->createNamedParameter($share->getNode()->getId()))
->set('expiration', $qb->createNamedParameter($share->getExpirationDate(), IQueryBuilder::PARAM_DATE))
@@ -272,6 +284,7 @@ class DefaultShareProvider implements IShareProvider {
->set('uid_owner', $qb->createNamedParameter($share->getShareOwner()))
->set('uid_initiator', $qb->createNamedParameter($share->getSharedBy()))
->set('permissions', $qb->createNamedParameter($share->getPermissions()))
+ ->set('attributes', $qb->createNamedParameter($shareAttributes))
->set('item_source', $qb->createNamedParameter($share->getNode()->getId()))
->set('file_source', $qb->createNamedParameter($share->getNode()->getId()))
->set('expiration', $qb->createNamedParameter($share->getExpirationDate(), IQueryBuilder::PARAM_DATE))
@@ -301,6 +314,7 @@ class DefaultShareProvider implements IShareProvider {
->where($qb->expr()->eq('parent', $qb->createNamedParameter($share->getId())))
->andWhere($qb->expr()->neq('permissions', $qb->createNamedParameter(0)))
->set('permissions', $qb->createNamedParameter($share->getPermissions()))
+ ->set('attributes', $qb->createNamedParameter($shareAttributes))
->execute();
} elseif ($share->getShareType() === IShare::TYPE_LINK) {
$qb = $this->dbConn->getQueryBuilder();
@@ -311,6 +325,7 @@ class DefaultShareProvider implements IShareProvider {
->set('uid_owner', $qb->createNamedParameter($share->getShareOwner()))
->set('uid_initiator', $qb->createNamedParameter($share->getSharedBy()))
->set('permissions', $qb->createNamedParameter($share->getPermissions()))
+ ->set('attributes', $qb->createNamedParameter($shareAttributes))
->set('item_source', $qb->createNamedParameter($share->getNode()->getId()))
->set('file_source', $qb->createNamedParameter($share->getNode()->getId()))
->set('token', $qb->createNamedParameter($share->getToken()))
@@ -611,6 +626,10 @@ class DefaultShareProvider implements IShareProvider {
$data = $stmt->fetch();
$stmt->closeCursor();
+ $shareAttributes = $this->formatShareAttributes(
+ $share->getAttributes()
+ );
+
if ($data === false) {
// No usergroup share yet. Create one.
$qb = $this->dbConn->getQueryBuilder();
@@ -626,6 +645,7 @@ class DefaultShareProvider implements IShareProvider {
'file_source' => $qb->createNamedParameter($share->getNodeId()),
'file_target' => $qb->createNamedParameter($share->getTarget()),
'permissions' => $qb->createNamedParameter($share->getPermissions()),
+ 'attributes' => $qb->createNamedParameter($shareAttributes),
'stime' => $qb->createNamedParameter($share->getShareTime()->getTimestamp()),
])->execute();
} else {
@@ -641,9 +661,12 @@ class DefaultShareProvider implements IShareProvider {
return $share;
}
- public function getSharesInFolder($userId, Folder $node, $reshares) {
+ public function getSharesInFolder($userId, Folder $node, $reshares, $shallow = true) {
$qb = $this->dbConn->getQueryBuilder();
- $qb->select('*')
+ $qb->select('s.*',
+ 'f.fileid', 'f.path', 'f.permissions AS f_permissions', 'f.storage', 'f.path_hash',
+ 'f.parent AS f_parent', 'f.name', 'f.mimetype', 'f.mimepart', 'f.size', 'f.mtime', 'f.storage_mtime',
+ 'f.encrypted', 'f.unencrypted_size', 'f.etag', 'f.checksum')
->from('share', 's')
->andWhere($qb->expr()->orX(
$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
@@ -679,12 +702,21 @@ class DefaultShareProvider implements IShareProvider {
}, $childMountNodes);
$qb->innerJoin('s', 'filecache', 'f', $qb->expr()->eq('s.file_source', 'f.fileid'));
- $qb->andWhere(
- $qb->expr()->orX(
- $qb->expr()->eq('f.parent', $qb->createNamedParameter($node->getId())),
- $qb->expr()->in('f.fileid', $qb->createParameter('chunk'))
- )
- );
+ if ($shallow) {
+ $qb->andWhere(
+ $qb->expr()->orX(
+ $qb->expr()->eq('f.parent', $qb->createNamedParameter($node->getId())),
+ $qb->expr()->in('f.fileid', $qb->createParameter('chunk'))
+ )
+ );
+ } else {
+ $qb->andWhere(
+ $qb->expr()->orX(
+ $qb->expr()->like('f.path', $qb->createNamedParameter($this->dbConn->escapeLikeParameter($node->getInternalPath()) . '/%')),
+ $qb->expr()->in('f.fileid', $qb->createParameter('chunk'))
+ )
+ );
+ }
$qb->orderBy('id');
@@ -1061,6 +1093,8 @@ class DefaultShareProvider implements IShareProvider {
$share->setToken($data['token']);
}
+ $share = $this->updateShareAttributes($share, $data['attributes']);
+
$share->setSharedBy($data['uid_initiator']);
$share->setShareOwner($data['uid_owner']);
@@ -1282,7 +1316,7 @@ class DefaultShareProvider implements IShareProvider {
$chunks = array_chunk($ids, 100);
foreach ($chunks as $chunk) {
/*
- * Delete all special shares wit this users for the found group shares
+ * Delete all special shares with this users for the found group shares
*/
$qb->delete('share')
->where($qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_USERGROUP)))
@@ -1528,4 +1562,48 @@ class DefaultShareProvider implements IShareProvider {
}
$cursor->closeCursor();
}
+
+ /**
+ * Load from database format (JSON string) to IAttributes
+ *
+ * @return IShare the modified share
+ */
+ private function updateShareAttributes(IShare $share, ?string $data): IShare {
+ if ($data !== null && $data !== '') {
+ $attributes = new ShareAttributes();
+ $compressedAttributes = \json_decode($data, true);
+ if ($compressedAttributes === false || $compressedAttributes === null) {
+ return $share;
+ }
+ foreach ($compressedAttributes as $compressedAttribute) {
+ $attributes->setAttribute(
+ $compressedAttribute[0],
+ $compressedAttribute[1],
+ $compressedAttribute[2]
+ );
+ }
+ $share->setAttributes($attributes);
+ }
+
+ return $share;
+ }
+
+ /**
+ * Format IAttributes to database format (JSON string)
+ */
+ private function formatShareAttributes(?IAttributes $attributes): ?string {
+ if ($attributes === null || empty($attributes->toArray())) {
+ return null;
+ }
+
+ $compressedAttributes = [];
+ foreach ($attributes->toArray() as $attribute) {
+ $compressedAttributes[] = [
+ 0 => $attribute['scope'],
+ 1 => $attribute['key'],
+ 2 => $attribute['enabled']
+ ];
+ }
+ return \json_encode($compressedAttributes);
+ }
}
diff --git a/lib/private/Share20/Manager.php b/lib/private/Share20/Manager.php
index 905a006372f..2ef61cf3404 100644
--- a/lib/private/Share20/Manager.php
+++ b/lib/private/Share20/Manager.php
@@ -650,7 +650,7 @@ class Manager implements IManager {
}
// Check if public upload is allowed
- if (!$this->shareApiLinkAllowPublicUpload() &&
+ if ($share->getNodeType() === 'folder' && !$this->shareApiLinkAllowPublicUpload() &&
($share->getPermissions() & (\OCP\Constants::PERMISSION_CREATE | \OCP\Constants::PERMISSION_UPDATE | \OCP\Constants::PERMISSION_DELETE))) {
throw new \InvalidArgumentException('Public upload is not allowed');
}
@@ -1093,6 +1093,7 @@ class Manager implements IManager {
'shareWith' => $share->getSharedWith(),
'uidOwner' => $share->getSharedBy(),
'permissions' => $share->getPermissions(),
+ 'attributes' => $share->getAttributes() !== null ? $share->getAttributes()->toArray() : null,
'path' => $userFolder->getRelativePath($share->getNode()->getPath()),
]);
}
@@ -1303,11 +1304,11 @@ class Manager implements IManager {
return $provider->move($share, $recipientId);
}
- public function getSharesInFolder($userId, Folder $node, $reshares = false) {
+ public function getSharesInFolder($userId, Folder $node, $reshares = false, $shallow = true) {
$providers = $this->factory->getAllProviders();
- return array_reduce($providers, function ($shares, IShareProvider $provider) use ($userId, $node, $reshares) {
- $newShares = $provider->getSharesInFolder($userId, $node, $reshares);
+ return array_reduce($providers, function ($shares, IShareProvider $provider) use ($userId, $node, $reshares, $shallow) {
+ $newShares = $provider->getSharesInFolder($userId, $node, $reshares, $shallow);
foreach ($newShares as $fid => $data) {
if (!isset($shares[$fid])) {
$shares[$fid] = [];
@@ -1543,7 +1544,7 @@ class Manager implements IManager {
* Reduce the permissions for link or email shares if public upload is not enabled
*/
if (($share->getShareType() === IShare::TYPE_LINK || $share->getShareType() === IShare::TYPE_EMAIL)
- && !$this->shareApiLinkAllowPublicUpload()) {
+ && $share->getNodeType() === 'folder' && !$this->shareApiLinkAllowPublicUpload()) {
$share->setPermissions($share->getPermissions() & ~(\OCP\Constants::PERMISSION_CREATE | \OCP\Constants::PERMISSION_UPDATE));
}
@@ -2010,7 +2011,7 @@ class Manager implements IManager {
/**
* Copied from \OC_Util::isSharingDisabledForUser
*
- * TODO: Deprecate fuction from OC_Util
+ * TODO: Deprecate function from OC_Util
*
* @param string $userId
* @return bool
diff --git a/lib/private/Share20/Share.php b/lib/private/Share20/Share.php
index 7ed03832e4c..c2d45503696 100644
--- a/lib/private/Share20/Share.php
+++ b/lib/private/Share20/Share.php
@@ -37,6 +37,7 @@ use OCP\Files\Node;
use OCP\Files\NotFoundException;
use OCP\IUserManager;
use OCP\Share\Exceptions\IllegalIDChangeException;
+use OCP\Share\IAttributes;
use OCP\Share\IShare;
class Share implements IShare {
@@ -65,6 +66,8 @@ class Share implements IShare {
private $shareOwner;
/** @var int */
private $permissions;
+ /** @var IAttributes */
+ private $attributes;
/** @var int */
private $status;
/** @var string */
@@ -319,7 +322,7 @@ class Share implements IShare {
* @inheritdoc
*/
public function setPermissions($permissions) {
- //TODO checkes
+ //TODO checks
$this->permissions = $permissions;
return $this;
@@ -335,6 +338,28 @@ class Share implements IShare {
/**
* @inheritdoc
*/
+ public function newAttributes(): IAttributes {
+ return new ShareAttributes();
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function setAttributes(?IAttributes $attributes) {
+ $this->attributes = $attributes;
+ return $this;
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getAttributes(): ?IAttributes {
+ return $this->attributes;
+ }
+
+ /**
+ * @inheritdoc
+ */
public function setStatus(int $status): IShare {
$this->status = $status;
return $this;
@@ -511,7 +536,7 @@ class Share implements IShare {
* Set the parent of this share
*
* @param int parent
- * @return \OCP\Share\IShare
+ * @return IShare
* @deprecated The new shares do not have parents. This is just here for legacy reasons.
*/
public function setParent($parent) {
diff --git a/lib/private/Share20/ShareAttributes.php b/lib/private/Share20/ShareAttributes.php
new file mode 100644
index 00000000000..92f034e6783
--- /dev/null
+++ b/lib/private/Share20/ShareAttributes.php
@@ -0,0 +1,73 @@
+<?php
+/**
+ * @author Piotr Mrowczynski <piotr@owncloud.com>
+ *
+ * @copyright Copyright (c) 2019, 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 OC\Share20;
+
+use OCP\Share\IAttributes;
+
+class ShareAttributes implements IAttributes {
+
+ /** @var array */
+ private $attributes;
+
+ public function __construct() {
+ $this->attributes = [];
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function setAttribute($scope, $key, $enabled) {
+ if (!\array_key_exists($scope, $this->attributes)) {
+ $this->attributes[$scope] = [];
+ }
+ $this->attributes[$scope][$key] = $enabled;
+ return $this;
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function getAttribute($scope, $key) {
+ if (\array_key_exists($scope, $this->attributes) &&
+ \array_key_exists($key, $this->attributes[$scope])) {
+ return $this->attributes[$scope][$key];
+ }
+ return null;
+ }
+
+ /**
+ * @inheritdoc
+ */
+ public function toArray() {
+ $result = [];
+ foreach ($this->attributes as $scope => $keys) {
+ foreach ($keys as $key => $enabled) {
+ $result[] = [
+ "scope" => $scope,
+ "key" => $key,
+ "enabled" => $enabled
+ ];
+ }
+ }
+
+ return $result;
+ }
+}
diff --git a/lib/private/URLGenerator.php b/lib/private/URLGenerator.php
index 753a4a217d1..47979a038ba 100644
--- a/lib/private/URLGenerator.php
+++ b/lib/private/URLGenerator.php
@@ -320,7 +320,7 @@ class URLGenerator implements IURLGenerator {
* @return string base url of the current request
*/
public function getBaseUrl(): string {
- // BaseUrl can be equal to 'http(s)://' during the first steps of the intial setup.
+ // BaseUrl can be equal to 'http(s)://' during the first steps of the initial setup.
if ($this->baseUrl === null || $this->baseUrl === "http://" || $this->baseUrl === "https://") {
$this->baseUrl = $this->request->getServerProtocol() . '://' . $this->request->getServerHost() . \OC::$WEBROOT;
}
diff --git a/lib/private/legacy/OC_Files.php b/lib/private/legacy/OC_Files.php
index 02e15fd08d5..6a3a44d6cc0 100644
--- a/lib/private/legacy/OC_Files.php
+++ b/lib/private/legacy/OC_Files.php
@@ -44,10 +44,12 @@ use bantu\IniGetWrapper\IniGetWrapper;
use OC\Files\View;
use OC\Streamer;
use OCP\Lock\ILockingProvider;
+use OCP\Files\Events\BeforeZipCreatedEvent;
+use OCP\Files\Events\BeforeDirectFileDownloadEvent;
+use OCP\EventDispatcher\IEventDispatcher;
/**
* Class for file server access
- *
*/
class OC_Files {
public const FILE = 1;
@@ -167,6 +169,14 @@ class OC_Files {
}
}
+ //Dispatch an event to see if any apps have problem with download
+ $event = new BeforeZipCreatedEvent($dir, is_array($files) ? $files : [$files]);
+ $dispatcher = \OCP\Server::get(IEventDispatcher::class);
+ $dispatcher->dispatchTyped($event);
+ if ((!$event->isSuccessful()) || $event->getErrorMessage() !== null) {
+ throw new \OC\ForbiddenException($event->getErrorMessage());
+ }
+
$streamer = new Streamer(\OC::$server->getRequest(), $fileSize, $numberOfFiles);
OC_Util::obEnd();
@@ -222,13 +232,16 @@ class OC_Files {
self::unlockAllTheFiles($dir, $files, $getType, $view, $filename);
OC::$server->getLogger()->logException($ex);
$l = \OC::$server->getL10N('lib');
- \OC_Template::printErrorPage($l->t('Cannot read file'), $ex->getMessage(), 200);
+ \OC_Template::printErrorPage($l->t('Cannot download file'), $ex->getMessage(), 200);
} catch (\Exception $ex) {
self::unlockAllTheFiles($dir, $files, $getType, $view, $filename);
OC::$server->getLogger()->logException($ex);
$l = \OC::$server->getL10N('lib');
$hint = method_exists($ex, 'getHint') ? $ex->getHint() : '';
- \OC_Template::printErrorPage($l->t('Cannot read file'), $hint, 200);
+ if ($event && $event->getErrorMessage() !== null) {
+ $hint .= ' ' . $event->getErrorMessage();
+ }
+ \OC_Template::printErrorPage($l->t('Cannot download file'), $hint, 200);
}
}
@@ -287,6 +300,7 @@ class OC_Files {
* @param string $name
* @param string $dir
* @param array $params ; 'head' boolean to only send header of the request ; 'range' http range header
+ * @throws \OC\ForbiddenException
*/
private static function getSingleFile($view, $dir, $name, $params) {
$filename = $dir . '/' . $name;
@@ -322,6 +336,19 @@ class OC_Files {
$rangeArray = self::parseHttpRangeHeader(substr($params['range'], 6), $fileSize);
}
+ $dispatcher = \OC::$server->query(IEventDispatcher::class);
+ $event = new BeforeDirectFileDownloadEvent($filename);
+ $dispatcher->dispatchTyped($event);
+
+ if (!\OC\Files\Filesystem::isReadable($filename) || $event->getErrorMessage()) {
+ if ($event->getErrorMessage()) {
+ $msg = $event->getErrorMessage();
+ } else {
+ $msg = 'Access denied';
+ }
+ throw new \OC\ForbiddenException($msg);
+ }
+
self::sendHeaders($filename, $name, $rangeArray);
if (isset($params['head']) && $params['head']) {
diff --git a/lib/public/Files/Cache/ICache.php b/lib/public/Files/Cache/ICache.php
index e27f4207f1e..37e71f3ac79 100644
--- a/lib/public/Files/Cache/ICache.php
+++ b/lib/public/Files/Cache/ICache.php
@@ -243,7 +243,7 @@ interface ICache {
* use the one with the highest id gives the best result with the background scanner, since that is most
* likely the folder where we stopped scanning previously
*
- * @return string|bool the path of the folder or false when no folder matched
+ * @return string|false the path of the folder or false when no folder matched
* @since 9.0.0
*/
public function getIncomplete();
diff --git a/lib/public/Files/Events/BeforeDirectFileDownloadEvent.php b/lib/public/Files/Events/BeforeDirectFileDownloadEvent.php
new file mode 100644
index 00000000000..a32c95c6408
--- /dev/null
+++ b/lib/public/Files/Events/BeforeDirectFileDownloadEvent.php
@@ -0,0 +1,84 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright 2022 Carl Schwan <carl@carlschwan.eu>
+ *
+ * @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\Events;
+
+use OCP\EventDispatcher\Event;
+
+/**
+ * This event is triggered when a user tries to download a file
+ * directly.
+ *
+ * @since 25.0.0
+ */
+class BeforeDirectFileDownloadEvent extends Event {
+ private string $path;
+ private bool $successful = true;
+ private ?string $errorMessage = null;
+
+ /**
+ * @since 25.0.0
+ */
+ public function __construct(string $path) {
+ parent::__construct();
+ $this->path = $path;
+ }
+
+ /**
+ * @since 25.0.0
+ */
+ public function getPath(): string {
+ return $this->path;
+ }
+
+ /**
+ * @since 25.0.0
+ */
+ public function isSuccessful(): bool {
+ return $this->successful;
+ }
+
+ /**
+ * Set if the event was successful
+ *
+ * @since 25.0.0
+ */
+ public function setSuccessful(bool $successful): void {
+ $this->successful = $successful;
+ }
+
+ /**
+ * Get the error message, if any
+ * @since 25.0.0
+ */
+ public function getErrorMessage(): ?string {
+ return $this->errorMessage;
+ }
+
+ /**
+ * @since 25.0.0
+ */
+ public function setErrorMessage(string $errorMessage): void {
+ $this->errorMessage = $errorMessage;
+ }
+}
diff --git a/lib/public/Files/Events/BeforeZipCreatedEvent.php b/lib/public/Files/Events/BeforeZipCreatedEvent.php
new file mode 100644
index 00000000000..18f41a42899
--- /dev/null
+++ b/lib/public/Files/Events/BeforeZipCreatedEvent.php
@@ -0,0 +1,91 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * @copyright 2022 Carl Schwan <carl@carlschwan.eu>
+ *
+ * @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\Events;
+
+use OCP\EventDispatcher\Event;
+
+/**
+ * @since 25.0.0
+ */
+class BeforeZipCreatedEvent extends Event {
+ private string $directory;
+ private array $files;
+ private bool $successful = true;
+ private ?string $errorMessage = null;
+
+ /**
+ * @since 25.0.0
+ */
+ public function __construct(string $directory, array $files) {
+ parent::__construct();
+ $this->directory = $directory;
+ $this->files = $files;
+ }
+
+ /**
+ * @since 25.0.0
+ */
+ public function getDirectory(): string {
+ return $this->directory;
+ }
+
+ /**
+ * @since 25.0.0
+ */
+ public function getFiles(): array {
+ return $this->files;
+ }
+
+ /**
+ * @since 25.0.0
+ */
+ public function isSuccessful(): bool {
+ return $this->successful;
+ }
+
+ /**
+ * Set if the event was successful
+ *
+ * @since 25.0.0
+ */
+ public function setSuccessful(bool $successful): void {
+ $this->successful = $successful;
+ }
+
+ /**
+ * Get the error message, if any
+ * @since 25.0.0
+ */
+ public function getErrorMessage(): ?string {
+ return $this->errorMessage;
+ }
+
+ /**
+ * @since 25.0.0
+ */
+ public function setErrorMessage(string $errorMessage): void {
+ $this->errorMessage = $errorMessage;
+ }
+}
diff --git a/lib/public/Security/Bruteforce/IThrottler.php b/lib/public/Security/Bruteforce/IThrottler.php
new file mode 100644
index 00000000000..6f492d6c59d
--- /dev/null
+++ b/lib/public/Security/Bruteforce/IThrottler.php
@@ -0,0 +1,126 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * @copyright Copyright (c) 2022 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\Security\Bruteforce;
+
+/**
+ * Class Throttler implements the bruteforce protection for security actions in
+ * Nextcloud.
+ *
+ * It is working by logging invalid login attempts to the database and slowing
+ * down all login attempts from the same subnet. The max delay is 30 seconds and
+ * the starting delay are 200 milliseconds. (after the first failed login)
+ *
+ * This is based on Paragonie's AirBrake for Airship CMS. You can find the original
+ * code at https://github.com/paragonie/airship/blob/7e5bad7e3c0fbbf324c11f963fd1f80e59762606/src/Engine/Security/AirBrake.php
+ *
+ * @package OC\Security\Bruteforce
+ * @since 25.0.0
+ */
+interface IThrottler {
+ /**
+ * @since 25.0.0
+ */
+ public const MAX_DELAY = 25;
+
+ /**
+ * @since 25.0.0
+ */
+ public const MAX_DELAY_MS = 25000; // in milliseconds
+
+ /**
+ * @since 25.0.0
+ */
+ public const MAX_ATTEMPTS = 10;
+
+ /**
+ * Register a failed attempt to bruteforce a security control
+ *
+ * @param string $action
+ * @param string $ip
+ * @param array $metadata Optional metadata logged to the database
+ * @since 25.0.0
+ */
+ public function registerAttempt(string $action, string $ip, array $metadata = []): void;
+
+ /**
+ * Get the throttling delay (in milliseconds)
+ *
+ * @param string $ip
+ * @param string $action optionally filter by action
+ * @param float $maxAgeHours
+ * @return int
+ * @since 25.0.0
+ */
+ public function getAttempts(string $ip, string $action = '', float $maxAgeHours = 12): int;
+
+ /**
+ * Get the throttling delay (in milliseconds)
+ *
+ * @param string $ip
+ * @param string $action optionally filter by action
+ * @return int
+ * @since 25.0.0
+ */
+ public function getDelay(string $ip, string $action = ''): int;
+
+ /**
+ * Reset the throttling delay for an IP address, action and metadata
+ *
+ * @param string $ip
+ * @param string $action
+ * @param array $metadata
+ * @since 25.0.0
+ */
+ public function resetDelay(string $ip, string $action, array $metadata): void;
+
+ /**
+ * Reset the throttling delay for an IP address
+ *
+ * @param string $ip
+ * @since 25.0.0
+ */
+ public function resetDelayForIP(string $ip): void;
+
+ /**
+ * Will sleep for the defined amount of time
+ *
+ * @param string $ip
+ * @param string $action optionally filter by action
+ * @return int the time spent sleeping
+ * @since 25.0.0
+ */
+ public function sleepDelay(string $ip, string $action = ''): int;
+
+ /**
+ * Will sleep for the defined amount of time unless maximum was reached in the last 30 minutes
+ * In this case a "429 Too Many Request" exception is thrown
+ *
+ * @param string $ip
+ * @param string $action optionally filter by action
+ * @return int the time spent sleeping
+ * @throws MaxDelayReached when reached the maximum
+ * @since 25.0.0
+ */
+ public function sleepDelayOrThrowOnMax(string $ip, string $action = ''): int;
+}
diff --git a/lib/public/Share/IAttributes.php b/lib/public/Share/IAttributes.php
new file mode 100644
index 00000000000..6e4cee08b12
--- /dev/null
+++ b/lib/public/Share/IAttributes.php
@@ -0,0 +1,68 @@
+<?php
+/**
+ * @author Piotr Mrowczynski <piotr@owncloud.com>
+ *
+ * @copyright Copyright (c) 2019, 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\Share;
+
+/**
+ * Interface IAttributes
+ *
+ * @package OCP\Share
+ * @since 25.0.0
+ */
+interface IAttributes {
+
+ /**
+ * Sets an attribute enabled/disabled. If the key did not exist before it will be created.
+ *
+ * @param string $scope scope
+ * @param string $key key
+ * @param bool $enabled enabled
+ * @return IAttributes The modified object
+ * @since 25.0.0
+ */
+ public function setAttribute($scope, $key, $enabled);
+
+ /**
+ * Returns if attribute is enabled/disabled for given scope id and key.
+ * If attribute does not exist, returns null
+ *
+ * @param string $scope scope
+ * @param string $key key
+ * @return bool|null
+ * @since 25.0.0
+ */
+ public function getAttribute($scope, $key);
+
+ /**
+ * Formats the IAttributes object to array with the following format:
+ * [
+ * 0 => [
+ * "scope" => <string>,
+ * "key" => <string>,
+ * "enabled" => <bool>
+ * ],
+ * ...
+ * ]
+ *
+ * @return array formatted IAttributes
+ * @since 25.0.0
+ */
+ public function toArray();
+}
diff --git a/lib/public/Share/IManager.php b/lib/public/Share/IManager.php
index f207ca87a2c..0810acc673a 100644
--- a/lib/public/Share/IManager.php
+++ b/lib/public/Share/IManager.php
@@ -135,10 +135,11 @@ interface IManager {
* @param string $userId
* @param Folder $node
* @param bool $reshares
+ * @param bool $shallow Whether the method should stop at the first level, or look into sub-folders.
* @return IShare[][] [$fileId => IShare[], ...]
* @since 11.0.0
*/
- public function getSharesInFolder($userId, Folder $node, $reshares = false);
+ public function getSharesInFolder($userId, Folder $node, $reshares = false, $shallow = true);
/**
* Get shares shared by (initiated) by the provided user.
diff --git a/lib/public/Share/IShare.php b/lib/public/Share/IShare.php
index 1d3cf9bbbdf..5a825552e26 100644
--- a/lib/public/Share/IShare.php
+++ b/lib/public/Share/IShare.php
@@ -36,7 +36,9 @@ use OCP\Files\NotFoundException;
use OCP\Share\Exceptions\IllegalIDChangeException;
/**
- * Interface IShare
+ * This interface allows to represent a share object.
+ *
+ * This interface must not be implemented in your application.
*
* @since 9.0.0
*/
@@ -300,7 +302,7 @@ interface IShare {
* See \OCP\Constants::PERMISSION_*
*
* @param int $permissions
- * @return \OCP\Share\IShare The modified object
+ * @return IShare The modified object
* @since 9.0.0
*/
public function setPermissions($permissions);
@@ -315,6 +317,31 @@ interface IShare {
public function getPermissions();
/**
+ * Create share attributes object
+ *
+ * @since 25.0.0
+ * @return IAttributes
+ */
+ public function newAttributes(): IAttributes;
+
+ /**
+ * Set share attributes
+ *
+ * @param ?IAttributes $attributes
+ * @since 25.0.0
+ * @return IShare The modified object
+ */
+ public function setAttributes(?IAttributes $attributes);
+
+ /**
+ * Get share attributes
+ *
+ * @since 25.0.0
+ * @return ?IAttributes
+ */
+ public function getAttributes(): ?IAttributes;
+
+ /**
* Set the accepted status
* See self::STATUS_*
*
diff --git a/lib/public/Share/IShareProvider.php b/lib/public/Share/IShareProvider.php
index 6af513360fe..c549592d6f6 100644
--- a/lib/public/Share/IShareProvider.php
+++ b/lib/public/Share/IShareProvider.php
@@ -123,10 +123,11 @@ interface IShareProvider {
* @param string $userId
* @param Folder $node
* @param bool $reshares Also get the shares where $user is the owner instead of just the shares where $user is the initiator
+ * @param bool $shallow Whether the method should stop at the first level, or look into sub-folders.
* @return \OCP\Share\IShare[][]
* @since 11.0.0
*/
- public function getSharesInFolder($userId, Folder $node, $reshares);
+ public function getSharesInFolder($userId, Folder $node, $reshares, $shallow = true);
/**
* Get all shares by the given user