aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/autoloader.php4
-rw-r--r--lib/base.php3
-rw-r--r--lib/composer/composer/autoload_classmap.php1
-rw-r--r--lib/composer/composer/autoload_static.php1
-rw-r--r--lib/l10n/cs.js4
-rw-r--r--lib/l10n/cs.json4
-rw-r--r--lib/l10n/da.js4
-rw-r--r--lib/l10n/da.json4
-rw-r--r--lib/l10n/de.js4
-rw-r--r--lib/l10n/de.json4
-rw-r--r--lib/l10n/de_DE.js4
-rw-r--r--lib/l10n/de_DE.json4
-rw-r--r--lib/l10n/en_GB.js4
-rw-r--r--lib/l10n/en_GB.json4
-rw-r--r--lib/l10n/es.js4
-rw-r--r--lib/l10n/es.json4
-rw-r--r--lib/l10n/et_EE.js4
-rw-r--r--lib/l10n/et_EE.json4
-rw-r--r--lib/l10n/ga.js4
-rw-r--r--lib/l10n/ga.json4
-rw-r--r--lib/l10n/ja.js4
-rw-r--r--lib/l10n/ja.json4
-rw-r--r--lib/l10n/ko.js2
-rw-r--r--lib/l10n/ko.json2
-rw-r--r--lib/l10n/lv.js4
-rw-r--r--lib/l10n/lv.json4
-rw-r--r--lib/l10n/pt_BR.js4
-rw-r--r--lib/l10n/pt_BR.json4
-rw-r--r--lib/l10n/sr.js4
-rw-r--r--lib/l10n/sr.json4
-rw-r--r--lib/l10n/sv.js4
-rw-r--r--lib/l10n/sv.json4
-rw-r--r--lib/l10n/tr.js4
-rw-r--r--lib/l10n/tr.json4
-rw-r--r--lib/l10n/uk.js4
-rw-r--r--lib/l10n/uk.json4
-rw-r--r--lib/l10n/zh_CN.js4
-rw-r--r--lib/l10n/zh_CN.json4
-rw-r--r--lib/l10n/zh_HK.js4
-rw-r--r--lib/l10n/zh_HK.json4
-rw-r--r--lib/l10n/zh_TW.js4
-rw-r--r--lib/l10n/zh_TW.json4
-rw-r--r--lib/private/AppFramework/Bootstrap/RegistrationContext.php2
-rw-r--r--lib/private/Blurhash/Listener/GenerateBlurhashMetadata.php5
-rw-r--r--lib/private/Collaboration/Reference/File/FileReferenceEventListener.php5
-rw-r--r--lib/private/Files/Mount/ObjectHomeMountProvider.php110
-rw-r--r--lib/private/Files/Mount/RootMountProvider.php62
-rw-r--r--lib/private/Files/ObjectStore/PrimaryObjectStoreConfig.php140
-rw-r--r--lib/private/Files/View.php4
-rw-r--r--lib/private/Log/ErrorHandler.php4
-rw-r--r--lib/private/Server.php6
-rw-r--r--lib/private/Settings/DeclarativeManager.php71
-rw-r--r--lib/private/User/Manager.php3
-rw-r--r--lib/public/Calendar/ICalendar.php72
-rw-r--r--lib/public/Settings/IDeclarativeSettingsForm.php1
55 files changed, 400 insertions, 242 deletions
diff --git a/lib/autoloader.php b/lib/autoloader.php
index 7084eb93c89..2a95f5944a3 100644
--- a/lib/autoloader.php
+++ b/lib/autoloader.php
@@ -95,10 +95,6 @@ class Autoloader {
} catch (AppPathNotFoundException) {
// App not found, ignore
}
- } elseif ($class === 'Test\\TestCase') {
- // This File is considered public API, so we make sure that the class
- // can still be loaded, although the PSR-4 paths have not been loaded.
- $paths[] = \OC::$SERVERROOT . '/tests/lib/TestCase.php';
}
return $paths;
}
diff --git a/lib/base.php b/lib/base.php
index 639568cf640..75f5cfee3e8 100644
--- a/lib/base.php
+++ b/lib/base.php
@@ -601,9 +601,6 @@ class OC {
self::$loader = new \OC\Autoloader([
OC::$SERVERROOT . '/lib/private/legacy',
]);
- if (defined('PHPUNIT_RUN')) {
- self::$loader->addValidRoot(OC::$SERVERROOT . '/tests');
- }
spl_autoload_register([self::$loader, 'load']);
$loaderEnd = microtime(true);
diff --git a/lib/composer/composer/autoload_classmap.php b/lib/composer/composer/autoload_classmap.php
index 61c06939d15..9f4321129af 100644
--- a/lib/composer/composer/autoload_classmap.php
+++ b/lib/composer/composer/autoload_classmap.php
@@ -1644,6 +1644,7 @@ return array(
'OC\\Files\\ObjectStore\\Mapper' => $baseDir . '/lib/private/Files/ObjectStore/Mapper.php',
'OC\\Files\\ObjectStore\\ObjectStoreScanner' => $baseDir . '/lib/private/Files/ObjectStore/ObjectStoreScanner.php',
'OC\\Files\\ObjectStore\\ObjectStoreStorage' => $baseDir . '/lib/private/Files/ObjectStore/ObjectStoreStorage.php',
+ 'OC\\Files\\ObjectStore\\PrimaryObjectStoreConfig' => $baseDir . '/lib/private/Files/ObjectStore/PrimaryObjectStoreConfig.php',
'OC\\Files\\ObjectStore\\S3' => $baseDir . '/lib/private/Files/ObjectStore/S3.php',
'OC\\Files\\ObjectStore\\S3ConfigTrait' => $baseDir . '/lib/private/Files/ObjectStore/S3ConfigTrait.php',
'OC\\Files\\ObjectStore\\S3ConnectionTrait' => $baseDir . '/lib/private/Files/ObjectStore/S3ConnectionTrait.php',
diff --git a/lib/composer/composer/autoload_static.php b/lib/composer/composer/autoload_static.php
index f6da9ef7382..26e0a34275d 100644
--- a/lib/composer/composer/autoload_static.php
+++ b/lib/composer/composer/autoload_static.php
@@ -1685,6 +1685,7 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2
'OC\\Files\\ObjectStore\\Mapper' => __DIR__ . '/../../..' . '/lib/private/Files/ObjectStore/Mapper.php',
'OC\\Files\\ObjectStore\\ObjectStoreScanner' => __DIR__ . '/../../..' . '/lib/private/Files/ObjectStore/ObjectStoreScanner.php',
'OC\\Files\\ObjectStore\\ObjectStoreStorage' => __DIR__ . '/../../..' . '/lib/private/Files/ObjectStore/ObjectStoreStorage.php',
+ 'OC\\Files\\ObjectStore\\PrimaryObjectStoreConfig' => __DIR__ . '/../../..' . '/lib/private/Files/ObjectStore/PrimaryObjectStoreConfig.php',
'OC\\Files\\ObjectStore\\S3' => __DIR__ . '/../../..' . '/lib/private/Files/ObjectStore/S3.php',
'OC\\Files\\ObjectStore\\S3ConfigTrait' => __DIR__ . '/../../..' . '/lib/private/Files/ObjectStore/S3ConfigTrait.php',
'OC\\Files\\ObjectStore\\S3ConnectionTrait' => __DIR__ . '/../../..' . '/lib/private/Files/ObjectStore/S3ConnectionTrait.php',
diff --git a/lib/l10n/cs.js b/lib/l10n/cs.js
index ec1e76e1471..ae17a582e39 100644
--- a/lib/l10n/cs.js
+++ b/lib/l10n/cs.js
@@ -275,7 +275,6 @@ OC.L10N.register(
"A valid Login must be provided" : "Je třeba zadat platné přihlašovací jméno",
"Login contains whitespace at the beginning or at the end" : "Přihlašovací jméno je chybné – na jeho začátku či konci se nachází prázdný znak (mezera, tabulátor, atp.)",
"Login must not consist of dots only" : "Přihlašovací jméno se nemůže skládat pouze ze samých teček",
- "Login is too long" : "Přihlašovací jméno je příliš dlouhé",
"Login is invalid because files already exist for this user" : "Přihlašovací jméno není platné, protože protože pro tohoto uživatele už existují soubory",
"Account disabled" : "Účet znepřístupněn",
"Login canceled by app" : "Přihlášení zrušeno aplikací",
@@ -451,6 +450,7 @@ OC.L10N.register(
"Summarizes text by reducing its length without losing key information." : "Vytvoří stručný souhrn textu tím, že zkrátí jeho délku aniž by byly ztraceny klíčové informace",
"Extracts topics from a text and outputs them separated by commas." : "Vyzíská témata z textu a vypíše je oddělované čárkami.",
"File is currently busy, please try again later" : "Soubor je nyní používán, zkuste to později",
- "Cannot download file" : "Soubor se nedaří stáhnout"
+ "Cannot download file" : "Soubor se nedaří stáhnout",
+ "Login is too long" : "Přihlašovací jméno je příliš dlouhé"
},
"nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;");
diff --git a/lib/l10n/cs.json b/lib/l10n/cs.json
index 0075e7f087c..59deb2babce 100644
--- a/lib/l10n/cs.json
+++ b/lib/l10n/cs.json
@@ -273,7 +273,6 @@
"A valid Login must be provided" : "Je třeba zadat platné přihlašovací jméno",
"Login contains whitespace at the beginning or at the end" : "Přihlašovací jméno je chybné – na jeho začátku či konci se nachází prázdný znak (mezera, tabulátor, atp.)",
"Login must not consist of dots only" : "Přihlašovací jméno se nemůže skládat pouze ze samých teček",
- "Login is too long" : "Přihlašovací jméno je příliš dlouhé",
"Login is invalid because files already exist for this user" : "Přihlašovací jméno není platné, protože protože pro tohoto uživatele už existují soubory",
"Account disabled" : "Účet znepřístupněn",
"Login canceled by app" : "Přihlášení zrušeno aplikací",
@@ -449,6 +448,7 @@
"Summarizes text by reducing its length without losing key information." : "Vytvoří stručný souhrn textu tím, že zkrátí jeho délku aniž by byly ztraceny klíčové informace",
"Extracts topics from a text and outputs them separated by commas." : "Vyzíská témata z textu a vypíše je oddělované čárkami.",
"File is currently busy, please try again later" : "Soubor je nyní používán, zkuste to později",
- "Cannot download file" : "Soubor se nedaří stáhnout"
+ "Cannot download file" : "Soubor se nedaří stáhnout",
+ "Login is too long" : "Přihlašovací jméno je příliš dlouhé"
},"pluralForm" :"nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;"
} \ No newline at end of file
diff --git a/lib/l10n/da.js b/lib/l10n/da.js
index b7c05641888..e1ed6d62bcd 100644
--- a/lib/l10n/da.js
+++ b/lib/l10n/da.js
@@ -273,7 +273,6 @@ OC.L10N.register(
"A valid Login must be provided" : "Et gyldigt login skal angives",
"Login contains whitespace at the beginning or at the end" : "Login indeholder mellemrum i begyndelsen eller slutningen",
"Login must not consist of dots only" : "Login må ikke kun bestå af prikker",
- "Login is too long" : "Login er for lang",
"Login is invalid because files already exist for this user" : "Login er ugyldigt, fordi filer allerede eksisterer for denne bruger",
"Account disabled" : "Konto deaktiveret",
"Login canceled by app" : "Login annulleret af app",
@@ -444,6 +443,7 @@ OC.L10N.register(
"Summarizes text by reducing its length without losing key information." : "Opsummerer tekst ved at reducere dens længde uden at miste nøgleinformation.",
"Extracts topics from a text and outputs them separated by commas." : "Uddrager emner fra en tekst og skriver dem adskilt af kommaer.",
"File is currently busy, please try again later" : "Filen er i øjeblikket optaget - forsøg igen senere",
- "Cannot download file" : "Kan ikke downloade filen"
+ "Cannot download file" : "Kan ikke downloade filen",
+ "Login is too long" : "Login er for lang"
},
"nplurals=2; plural=(n != 1);");
diff --git a/lib/l10n/da.json b/lib/l10n/da.json
index 0dd4df01090..36bd40121d8 100644
--- a/lib/l10n/da.json
+++ b/lib/l10n/da.json
@@ -271,7 +271,6 @@
"A valid Login must be provided" : "Et gyldigt login skal angives",
"Login contains whitespace at the beginning or at the end" : "Login indeholder mellemrum i begyndelsen eller slutningen",
"Login must not consist of dots only" : "Login må ikke kun bestå af prikker",
- "Login is too long" : "Login er for lang",
"Login is invalid because files already exist for this user" : "Login er ugyldigt, fordi filer allerede eksisterer for denne bruger",
"Account disabled" : "Konto deaktiveret",
"Login canceled by app" : "Login annulleret af app",
@@ -442,6 +441,7 @@
"Summarizes text by reducing its length without losing key information." : "Opsummerer tekst ved at reducere dens længde uden at miste nøgleinformation.",
"Extracts topics from a text and outputs them separated by commas." : "Uddrager emner fra en tekst og skriver dem adskilt af kommaer.",
"File is currently busy, please try again later" : "Filen er i øjeblikket optaget - forsøg igen senere",
- "Cannot download file" : "Kan ikke downloade filen"
+ "Cannot download file" : "Kan ikke downloade filen",
+ "Login is too long" : "Login er for lang"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/lib/l10n/de.js b/lib/l10n/de.js
index ef4da64d96f..798a450f2ab 100644
--- a/lib/l10n/de.js
+++ b/lib/l10n/de.js
@@ -275,7 +275,6 @@ OC.L10N.register(
"A valid Login must be provided" : "Ein gültiger Anmeldename muss eingegeben werden.",
"Login contains whitespace at the beginning or at the end" : "Anmeldename enthält Leerzeichen am Anfang oder am Ende",
"Login must not consist of dots only" : "Der Anmeldename darf nicht nur aus Punkten bestehen",
- "Login is too long" : "Die Anmeldung dauert zu lange",
"Login is invalid because files already exist for this user" : "Der Anmeldename ist ungültig, da bereits Dateien von diesem Konto existieren",
"Account disabled" : "Konto deaktiviert",
"Login canceled by app" : "Anmeldung durch die App abgebrochen",
@@ -451,6 +450,7 @@ OC.L10N.register(
"Summarizes text by reducing its length without losing key information." : "Fasst Text zusammen, indem die Länge reduziert wird, ohne dass wichtige Informationen verloren gehen.",
"Extracts topics from a text and outputs them separated by commas." : "Extrahiert Themen aus einem Text und gibt sie durch Kommas getrennt aus.",
"File is currently busy, please try again later" : "Die Datei ist in Benutzung, bitte versuche es später noch einmal",
- "Cannot download file" : "Datei kann nicht heruntergeladen werden."
+ "Cannot download file" : "Datei kann nicht heruntergeladen werden.",
+ "Login is too long" : "Die Anmeldung dauert zu lange"
},
"nplurals=2; plural=(n != 1);");
diff --git a/lib/l10n/de.json b/lib/l10n/de.json
index de85210572d..284aa28507c 100644
--- a/lib/l10n/de.json
+++ b/lib/l10n/de.json
@@ -273,7 +273,6 @@
"A valid Login must be provided" : "Ein gültiger Anmeldename muss eingegeben werden.",
"Login contains whitespace at the beginning or at the end" : "Anmeldename enthält Leerzeichen am Anfang oder am Ende",
"Login must not consist of dots only" : "Der Anmeldename darf nicht nur aus Punkten bestehen",
- "Login is too long" : "Die Anmeldung dauert zu lange",
"Login is invalid because files already exist for this user" : "Der Anmeldename ist ungültig, da bereits Dateien von diesem Konto existieren",
"Account disabled" : "Konto deaktiviert",
"Login canceled by app" : "Anmeldung durch die App abgebrochen",
@@ -449,6 +448,7 @@
"Summarizes text by reducing its length without losing key information." : "Fasst Text zusammen, indem die Länge reduziert wird, ohne dass wichtige Informationen verloren gehen.",
"Extracts topics from a text and outputs them separated by commas." : "Extrahiert Themen aus einem Text und gibt sie durch Kommas getrennt aus.",
"File is currently busy, please try again later" : "Die Datei ist in Benutzung, bitte versuche es später noch einmal",
- "Cannot download file" : "Datei kann nicht heruntergeladen werden."
+ "Cannot download file" : "Datei kann nicht heruntergeladen werden.",
+ "Login is too long" : "Die Anmeldung dauert zu lange"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/lib/l10n/de_DE.js b/lib/l10n/de_DE.js
index 835e6af7269..e0fde7f927f 100644
--- a/lib/l10n/de_DE.js
+++ b/lib/l10n/de_DE.js
@@ -275,7 +275,6 @@ OC.L10N.register(
"A valid Login must be provided" : "Ein gültiger Anmeldename muss angegeben werden.",
"Login contains whitespace at the beginning or at the end" : "Anmeldename enthält Leerzeichen am Anfang oder am Ende",
"Login must not consist of dots only" : "Der Anmeldename darf nicht nur aus Punkten bestehen",
- "Login is too long" : "Der Kontenname ist zu lang",
"Login is invalid because files already exist for this user" : "Der Anmeldename ist ungültig, da bereits Dateien von diesem Benutzer existieren",
"Account disabled" : "Konto deaktiviert",
"Login canceled by app" : "Anmeldung durch die App abgebrochen",
@@ -451,6 +450,7 @@ OC.L10N.register(
"Summarizes text by reducing its length without losing key information." : "Fasst Text zusammen, indem die Länge reduziert wird, ohne dass wichtige Informationen verloren gehen.",
"Extracts topics from a text and outputs them separated by commas." : "Extrahiert Themen aus einem Text und gibt sie durch Kommas getrennt aus.",
"File is currently busy, please try again later" : "Die Datei ist in Benutzung, bitte später erneut versuchen.",
- "Cannot download file" : "Datei kann nicht heruntergeladen werden"
+ "Cannot download file" : "Datei kann nicht heruntergeladen werden",
+ "Login is too long" : "Der Kontenname ist zu lang"
},
"nplurals=2; plural=(n != 1);");
diff --git a/lib/l10n/de_DE.json b/lib/l10n/de_DE.json
index 6225e659833..7f29be37b83 100644
--- a/lib/l10n/de_DE.json
+++ b/lib/l10n/de_DE.json
@@ -273,7 +273,6 @@
"A valid Login must be provided" : "Ein gültiger Anmeldename muss angegeben werden.",
"Login contains whitespace at the beginning or at the end" : "Anmeldename enthält Leerzeichen am Anfang oder am Ende",
"Login must not consist of dots only" : "Der Anmeldename darf nicht nur aus Punkten bestehen",
- "Login is too long" : "Der Kontenname ist zu lang",
"Login is invalid because files already exist for this user" : "Der Anmeldename ist ungültig, da bereits Dateien von diesem Benutzer existieren",
"Account disabled" : "Konto deaktiviert",
"Login canceled by app" : "Anmeldung durch die App abgebrochen",
@@ -449,6 +448,7 @@
"Summarizes text by reducing its length without losing key information." : "Fasst Text zusammen, indem die Länge reduziert wird, ohne dass wichtige Informationen verloren gehen.",
"Extracts topics from a text and outputs them separated by commas." : "Extrahiert Themen aus einem Text und gibt sie durch Kommas getrennt aus.",
"File is currently busy, please try again later" : "Die Datei ist in Benutzung, bitte später erneut versuchen.",
- "Cannot download file" : "Datei kann nicht heruntergeladen werden"
+ "Cannot download file" : "Datei kann nicht heruntergeladen werden",
+ "Login is too long" : "Der Kontenname ist zu lang"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/lib/l10n/en_GB.js b/lib/l10n/en_GB.js
index 21731cb3516..74524d2087c 100644
--- a/lib/l10n/en_GB.js
+++ b/lib/l10n/en_GB.js
@@ -275,7 +275,6 @@ OC.L10N.register(
"A valid Login must be provided" : "A valid Login must be provided",
"Login contains whitespace at the beginning or at the end" : "Login contains whitespace at the beginning or at the end",
"Login must not consist of dots only" : "Login must not consist of dots only",
- "Login is too long" : "Login is too long",
"Login is invalid because files already exist for this user" : "Login is invalid because files already exist for this user",
"Account disabled" : "Account disabled",
"Login canceled by app" : "Login cancelled by app",
@@ -451,6 +450,7 @@ OC.L10N.register(
"Summarizes text by reducing its length without losing key information." : "Summarizes text by reducing its length without losing key information.",
"Extracts topics from a text and outputs them separated by commas." : "Extracts topics from a text and outputs them separated by commas.",
"File is currently busy, please try again later" : "File is currently busy, please try again later",
- "Cannot download file" : "Cannot download file"
+ "Cannot download file" : "Cannot download file",
+ "Login is too long" : "Login is too long"
},
"nplurals=2; plural=(n != 1);");
diff --git a/lib/l10n/en_GB.json b/lib/l10n/en_GB.json
index 043cb98581e..2e8d0aea166 100644
--- a/lib/l10n/en_GB.json
+++ b/lib/l10n/en_GB.json
@@ -273,7 +273,6 @@
"A valid Login must be provided" : "A valid Login must be provided",
"Login contains whitespace at the beginning or at the end" : "Login contains whitespace at the beginning or at the end",
"Login must not consist of dots only" : "Login must not consist of dots only",
- "Login is too long" : "Login is too long",
"Login is invalid because files already exist for this user" : "Login is invalid because files already exist for this user",
"Account disabled" : "Account disabled",
"Login canceled by app" : "Login cancelled by app",
@@ -449,6 +448,7 @@
"Summarizes text by reducing its length without losing key information." : "Summarizes text by reducing its length without losing key information.",
"Extracts topics from a text and outputs them separated by commas." : "Extracts topics from a text and outputs them separated by commas.",
"File is currently busy, please try again later" : "File is currently busy, please try again later",
- "Cannot download file" : "Cannot download file"
+ "Cannot download file" : "Cannot download file",
+ "Login is too long" : "Login is too long"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/lib/l10n/es.js b/lib/l10n/es.js
index 4346343d733..f53ec599a0b 100644
--- a/lib/l10n/es.js
+++ b/lib/l10n/es.js
@@ -275,7 +275,6 @@ OC.L10N.register(
"A valid Login must be provided" : "Se debe proporcionar un usuario válido",
"Login contains whitespace at the beginning or at the end" : "El usuario contiene espacios en blanco al inicio o al final",
"Login must not consist of dots only" : "El usuario no debe consistir sólo de puntos",
- "Login is too long" : "El nombre de inicio de sesión es demasiado largo",
"Login is invalid because files already exist for this user" : "El nombre de inicio de sesión es inválido porque ya existen archivos para este usuario",
"Account disabled" : "Cuenta deshabilitada",
"Login canceled by app" : "Login cancelado por la app",
@@ -451,6 +450,7 @@ OC.L10N.register(
"Summarizes text by reducing its length without losing key information." : "Resume el texto reduciendo su longitud sin perder información clave.",
"Extracts topics from a text and outputs them separated by commas." : "Extrae los tópicos de un texto y genera una salida separada por comas. ",
"File is currently busy, please try again later" : "El archivo se encuentra actualmente ocupado, por favor inténtelo de nuevo más tarde",
- "Cannot download file" : "No se puede descargar el archivo"
+ "Cannot download file" : "No se puede descargar el archivo",
+ "Login is too long" : "El nombre de inicio de sesión es demasiado largo"
},
"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
diff --git a/lib/l10n/es.json b/lib/l10n/es.json
index 03fab3069cd..a88b6c22513 100644
--- a/lib/l10n/es.json
+++ b/lib/l10n/es.json
@@ -273,7 +273,6 @@
"A valid Login must be provided" : "Se debe proporcionar un usuario válido",
"Login contains whitespace at the beginning or at the end" : "El usuario contiene espacios en blanco al inicio o al final",
"Login must not consist of dots only" : "El usuario no debe consistir sólo de puntos",
- "Login is too long" : "El nombre de inicio de sesión es demasiado largo",
"Login is invalid because files already exist for this user" : "El nombre de inicio de sesión es inválido porque ya existen archivos para este usuario",
"Account disabled" : "Cuenta deshabilitada",
"Login canceled by app" : "Login cancelado por la app",
@@ -449,6 +448,7 @@
"Summarizes text by reducing its length without losing key information." : "Resume el texto reduciendo su longitud sin perder información clave.",
"Extracts topics from a text and outputs them separated by commas." : "Extrae los tópicos de un texto y genera una salida separada por comas. ",
"File is currently busy, please try again later" : "El archivo se encuentra actualmente ocupado, por favor inténtelo de nuevo más tarde",
- "Cannot download file" : "No se puede descargar el archivo"
+ "Cannot download file" : "No se puede descargar el archivo",
+ "Login is too long" : "El nombre de inicio de sesión es demasiado largo"
},"pluralForm" :"nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
} \ No newline at end of file
diff --git a/lib/l10n/et_EE.js b/lib/l10n/et_EE.js
index 6039d601449..96fa9d5e82c 100644
--- a/lib/l10n/et_EE.js
+++ b/lib/l10n/et_EE.js
@@ -268,7 +268,6 @@ OC.L10N.register(
"A valid Login must be provided" : "Palun sisesta korrektne kasutajanimi",
"Login contains whitespace at the beginning or at the end" : "Kasutajanime alguses või lõpus on tühik",
"Login must not consist of dots only" : "Kasutajanimi ei tohi koosneda ainult punktidest",
- "Login is too long" : "Kasutajanimi on liiga pikk",
"Login is invalid because files already exist for this user" : "See kasutajanimi ei sobi, kuna sellise kasutaja faile on juba olemas",
"Account disabled" : "Konto pole kasutusel",
"Login canceled by app" : "Rakendus katkestas sisselogimise",
@@ -401,6 +400,7 @@ OC.L10N.register(
"Result" : "Tulemus",
"The translated text" : "Tõlgitud tekst",
"File is currently busy, please try again later" : "Fail on hetkel kasutuses, proovi hiljem uuesti",
- "Cannot download file" : "Faili pole võimalik alla laadida"
+ "Cannot download file" : "Faili pole võimalik alla laadida",
+ "Login is too long" : "Kasutajanimi on liiga pikk"
},
"nplurals=2; plural=(n != 1);");
diff --git a/lib/l10n/et_EE.json b/lib/l10n/et_EE.json
index 4f41a7963b0..eb1b726ff4e 100644
--- a/lib/l10n/et_EE.json
+++ b/lib/l10n/et_EE.json
@@ -266,7 +266,6 @@
"A valid Login must be provided" : "Palun sisesta korrektne kasutajanimi",
"Login contains whitespace at the beginning or at the end" : "Kasutajanime alguses või lõpus on tühik",
"Login must not consist of dots only" : "Kasutajanimi ei tohi koosneda ainult punktidest",
- "Login is too long" : "Kasutajanimi on liiga pikk",
"Login is invalid because files already exist for this user" : "See kasutajanimi ei sobi, kuna sellise kasutaja faile on juba olemas",
"Account disabled" : "Konto pole kasutusel",
"Login canceled by app" : "Rakendus katkestas sisselogimise",
@@ -399,6 +398,7 @@
"Result" : "Tulemus",
"The translated text" : "Tõlgitud tekst",
"File is currently busy, please try again later" : "Fail on hetkel kasutuses, proovi hiljem uuesti",
- "Cannot download file" : "Faili pole võimalik alla laadida"
+ "Cannot download file" : "Faili pole võimalik alla laadida",
+ "Login is too long" : "Kasutajanimi on liiga pikk"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/lib/l10n/ga.js b/lib/l10n/ga.js
index 42607da43bc..a2d3355d7b1 100644
--- a/lib/l10n/ga.js
+++ b/lib/l10n/ga.js
@@ -275,7 +275,6 @@ OC.L10N.register(
"A valid Login must be provided" : "Ní mór Logáil Isteach bailí a sholáthar",
"Login contains whitespace at the beginning or at the end" : "Tá spás bán sa logáil isteach ag an tús nó ag an deireadh",
"Login must not consist of dots only" : "Níor cheart go gcuimseodh logáil isteach poncanna amháin",
- "Login is too long" : "Tá logáil isteach ró-fhada",
"Login is invalid because files already exist for this user" : "Tá logáil isteach neamhbhailí toisc go bhfuil comhaid ann cheana don úsáideoir seo",
"Account disabled" : "Díchumasaíodh an cuntas",
"Login canceled by app" : "Cealaíodh logáil isteach ag an aip",
@@ -451,6 +450,7 @@ OC.L10N.register(
"Summarizes text by reducing its length without losing key information." : "Déanann sé achoimre ar théacs trína fhad a laghdú gan eochairfhaisnéis a chailliúint.",
"Extracts topics from a text and outputs them separated by commas." : "Sliocht topaicí as téacs agus aschuir iad scartha le camóga.",
"File is currently busy, please try again later" : "Tá an comhad gnóthach faoi láthair, bain triail eile as ar ball le do thoil",
- "Cannot download file" : "Ní féidir an comhad a íoslódáil"
+ "Cannot download file" : "Ní féidir an comhad a íoslódáil",
+ "Login is too long" : "Tá logáil isteach ró-fhada"
},
"nplurals=5; plural=(n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : 4);");
diff --git a/lib/l10n/ga.json b/lib/l10n/ga.json
index e1367c8b5bd..82357708353 100644
--- a/lib/l10n/ga.json
+++ b/lib/l10n/ga.json
@@ -273,7 +273,6 @@
"A valid Login must be provided" : "Ní mór Logáil Isteach bailí a sholáthar",
"Login contains whitespace at the beginning or at the end" : "Tá spás bán sa logáil isteach ag an tús nó ag an deireadh",
"Login must not consist of dots only" : "Níor cheart go gcuimseodh logáil isteach poncanna amháin",
- "Login is too long" : "Tá logáil isteach ró-fhada",
"Login is invalid because files already exist for this user" : "Tá logáil isteach neamhbhailí toisc go bhfuil comhaid ann cheana don úsáideoir seo",
"Account disabled" : "Díchumasaíodh an cuntas",
"Login canceled by app" : "Cealaíodh logáil isteach ag an aip",
@@ -449,6 +448,7 @@
"Summarizes text by reducing its length without losing key information." : "Déanann sé achoimre ar théacs trína fhad a laghdú gan eochairfhaisnéis a chailliúint.",
"Extracts topics from a text and outputs them separated by commas." : "Sliocht topaicí as téacs agus aschuir iad scartha le camóga.",
"File is currently busy, please try again later" : "Tá an comhad gnóthach faoi láthair, bain triail eile as ar ball le do thoil",
- "Cannot download file" : "Ní féidir an comhad a íoslódáil"
+ "Cannot download file" : "Ní féidir an comhad a íoslódáil",
+ "Login is too long" : "Tá logáil isteach ró-fhada"
},"pluralForm" :"nplurals=5; plural=(n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : 4);"
} \ No newline at end of file
diff --git a/lib/l10n/ja.js b/lib/l10n/ja.js
index 56a3f7327fc..72510fd20f7 100644
--- a/lib/l10n/ja.js
+++ b/lib/l10n/ja.js
@@ -275,7 +275,6 @@ OC.L10N.register(
"A valid Login must be provided" : "ログイン名を提供する必要があります",
"Login contains whitespace at the beginning or at the end" : "ログイン名の最初か最後に空白が含まれています",
"Login must not consist of dots only" : "ログイン名はドットのみで構成されてはいけません",
- "Login is too long" : "ログインが長すぎます",
"Login is invalid because files already exist for this user" : "このユーザのファイルが既に存在するため、このログイン名は使用できません",
"Account disabled" : "アカウントは無効",
"Login canceled by app" : "アプリによりログインが中止されました",
@@ -451,6 +450,7 @@ OC.L10N.register(
"Summarizes text by reducing its length without losing key information." : "重要な情報を失わずにテキストの長さを要約して短縮する。",
"Extracts topics from a text and outputs them separated by commas." : "テキストからトピックを抽出し、カンマ区切りで出力します。",
"File is currently busy, please try again later" : "現在ファイルはビジーです。後でもう一度試してください。",
- "Cannot download file" : "ファイルをダウンロードできません"
+ "Cannot download file" : "ファイルをダウンロードできません",
+ "Login is too long" : "ログインが長すぎます"
},
"nplurals=1; plural=0;");
diff --git a/lib/l10n/ja.json b/lib/l10n/ja.json
index ea04d3f522b..f690cf83ac9 100644
--- a/lib/l10n/ja.json
+++ b/lib/l10n/ja.json
@@ -273,7 +273,6 @@
"A valid Login must be provided" : "ログイン名を提供する必要があります",
"Login contains whitespace at the beginning or at the end" : "ログイン名の最初か最後に空白が含まれています",
"Login must not consist of dots only" : "ログイン名はドットのみで構成されてはいけません",
- "Login is too long" : "ログインが長すぎます",
"Login is invalid because files already exist for this user" : "このユーザのファイルが既に存在するため、このログイン名は使用できません",
"Account disabled" : "アカウントは無効",
"Login canceled by app" : "アプリによりログインが中止されました",
@@ -449,6 +448,7 @@
"Summarizes text by reducing its length without losing key information." : "重要な情報を失わずにテキストの長さを要約して短縮する。",
"Extracts topics from a text and outputs them separated by commas." : "テキストからトピックを抽出し、カンマ区切りで出力します。",
"File is currently busy, please try again later" : "現在ファイルはビジーです。後でもう一度試してください。",
- "Cannot download file" : "ファイルをダウンロードできません"
+ "Cannot download file" : "ファイルをダウンロードできません",
+ "Login is too long" : "ログインが長すぎます"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/lib/l10n/ko.js b/lib/l10n/ko.js
index 375f75f4583..41178d953f3 100644
--- a/lib/l10n/ko.js
+++ b/lib/l10n/ko.js
@@ -245,6 +245,8 @@ OC.L10N.register(
"Change Tone" : "톤을 변경",
"Write a text that you want the assistant to rewrite in another tone." : "어시스턴트에 다른 톤으로 다시 쓰고 싶은 텍스트를 쓰기",
"Desired tone" : "희망하는 톤",
+ "In which tone should your text be rewritten?" : "텍스트를 어떤 어조로 다시 씁니까?",
+ "The rewritten text in the desired tone, written by the assistant:" : "원하는 톤으로 어시스턴트에 의해서 다시 쓴 텍스트:",
"Chat" : "대화",
"Generates a possible headline for a text." : "내용에 대한 헤드라인을 생성하십시오.",
"Text" : "텍스트",
diff --git a/lib/l10n/ko.json b/lib/l10n/ko.json
index 3fe9b3cdebd..409bc07408d 100644
--- a/lib/l10n/ko.json
+++ b/lib/l10n/ko.json
@@ -243,6 +243,8 @@
"Change Tone" : "톤을 변경",
"Write a text that you want the assistant to rewrite in another tone." : "어시스턴트에 다른 톤으로 다시 쓰고 싶은 텍스트를 쓰기",
"Desired tone" : "희망하는 톤",
+ "In which tone should your text be rewritten?" : "텍스트를 어떤 어조로 다시 씁니까?",
+ "The rewritten text in the desired tone, written by the assistant:" : "원하는 톤으로 어시스턴트에 의해서 다시 쓴 텍스트:",
"Chat" : "대화",
"Generates a possible headline for a text." : "내용에 대한 헤드라인을 생성하십시오.",
"Text" : "텍스트",
diff --git a/lib/l10n/lv.js b/lib/l10n/lv.js
index f0ffc6f3235..13a169c3fd2 100644
--- a/lib/l10n/lv.js
+++ b/lib/l10n/lv.js
@@ -5,7 +5,7 @@ OC.L10N.register(
"See %s" : "Skatīt %s",
"Application %1$s is not present or has a non-compatible version with this server. Please check the apps directory." : "Lietotne %1$s nav pieejama vai tai ir ar šo serveri nesaderīga versija. Lūgums pārbaudīt lietotņu mapi.",
"Sample configuration detected" : "Atrasta konfigurācijas paraugs",
- "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Konstatēts, ka paraug konfigurācija ir nokopēta. Tas var izjaukt jūsu instalāciju un nav atbalstīts. Lūdzu, izlasiet dokumentāciju, pirms veicat izmaiņas config.php",
+ "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Tika noteikts, ka tika kopēta paraugkonfigurācija. Tas var salauzt uzstādīto un netiek atbalstīts. Lūgums pirms izmaiņu veikšanas config.php izlasīt dokumentāciju",
"%s email verification" : "%s e-pasta pārbaude",
"Email verification" : "E-pasta pārbaude",
"Click the following button to confirm your email." : "Jāklikšķina zemā esošā poga, lai apstiprinātu savu e-pasta adresi.",
@@ -68,7 +68,7 @@ OC.L10N.register(
"Set an admin password." : "Iestatīt pārvaldītāja paroli.",
"Open %s" : "Atvērt %s",
"Unknown share type" : "Nezināms kopīgošanas veids",
- "You are not allowed to share %s" : "Tev nav ļauts dalīties ar %s",
+ "You are not allowed to share %s" : "Tev nav ļauts kopīgot %s",
"Could not find category \"%s\"" : "Nevarēja atrast kategoriju “%s”",
"Sunday" : "Svētdiena",
"Monday" : "Pirmdiena",
diff --git a/lib/l10n/lv.json b/lib/l10n/lv.json
index 5400ea39460..0540c50ad27 100644
--- a/lib/l10n/lv.json
+++ b/lib/l10n/lv.json
@@ -3,7 +3,7 @@
"See %s" : "Skatīt %s",
"Application %1$s is not present or has a non-compatible version with this server. Please check the apps directory." : "Lietotne %1$s nav pieejama vai tai ir ar šo serveri nesaderīga versija. Lūgums pārbaudīt lietotņu mapi.",
"Sample configuration detected" : "Atrasta konfigurācijas paraugs",
- "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Konstatēts, ka paraug konfigurācija ir nokopēta. Tas var izjaukt jūsu instalāciju un nav atbalstīts. Lūdzu, izlasiet dokumentāciju, pirms veicat izmaiņas config.php",
+ "It has been detected that the sample configuration has been copied. This can break your installation and is unsupported. Please read the documentation before performing changes on config.php" : "Tika noteikts, ka tika kopēta paraugkonfigurācija. Tas var salauzt uzstādīto un netiek atbalstīts. Lūgums pirms izmaiņu veikšanas config.php izlasīt dokumentāciju",
"%s email verification" : "%s e-pasta pārbaude",
"Email verification" : "E-pasta pārbaude",
"Click the following button to confirm your email." : "Jāklikšķina zemā esošā poga, lai apstiprinātu savu e-pasta adresi.",
@@ -66,7 +66,7 @@
"Set an admin password." : "Iestatīt pārvaldītāja paroli.",
"Open %s" : "Atvērt %s",
"Unknown share type" : "Nezināms kopīgošanas veids",
- "You are not allowed to share %s" : "Tev nav ļauts dalīties ar %s",
+ "You are not allowed to share %s" : "Tev nav ļauts kopīgot %s",
"Could not find category \"%s\"" : "Nevarēja atrast kategoriju “%s”",
"Sunday" : "Svētdiena",
"Monday" : "Pirmdiena",
diff --git a/lib/l10n/pt_BR.js b/lib/l10n/pt_BR.js
index 3c654ddd844..15befc5d9f7 100644
--- a/lib/l10n/pt_BR.js
+++ b/lib/l10n/pt_BR.js
@@ -275,7 +275,6 @@ OC.L10N.register(
"A valid Login must be provided" : "Um Login válido deve ser fornecido",
"Login contains whitespace at the beginning or at the end" : "O login contém espaços em branco no início ou no final",
"Login must not consist of dots only" : "O login não deve consistir apenas de pontos",
- "Login is too long" : "Login é muito longo",
"Login is invalid because files already exist for this user" : "O login é inválido porque já existem arquivos para este usuário",
"Account disabled" : "Conta desativada",
"Login canceled by app" : "Login cancelado pelo aplicativo",
@@ -451,6 +450,7 @@ OC.L10N.register(
"Summarizes text by reducing its length without losing key information." : "Resume o texto reduzindo seu comprimento sem perder informações importantes.",
"Extracts topics from a text and outputs them separated by commas." : "Extrai tópicos de um texto e os gera separados por vírgulas.",
"File is currently busy, please try again later" : "O arquivo está ocupado, tente novamente mais tarde",
- "Cannot download file" : "Não é possível baixar o arquivo"
+ "Cannot download file" : "Não é possível baixar o arquivo",
+ "Login is too long" : "Login é muito longo"
},
"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;");
diff --git a/lib/l10n/pt_BR.json b/lib/l10n/pt_BR.json
index cf58327d3ee..16bef963824 100644
--- a/lib/l10n/pt_BR.json
+++ b/lib/l10n/pt_BR.json
@@ -273,7 +273,6 @@
"A valid Login must be provided" : "Um Login válido deve ser fornecido",
"Login contains whitespace at the beginning or at the end" : "O login contém espaços em branco no início ou no final",
"Login must not consist of dots only" : "O login não deve consistir apenas de pontos",
- "Login is too long" : "Login é muito longo",
"Login is invalid because files already exist for this user" : "O login é inválido porque já existem arquivos para este usuário",
"Account disabled" : "Conta desativada",
"Login canceled by app" : "Login cancelado pelo aplicativo",
@@ -449,6 +448,7 @@
"Summarizes text by reducing its length without losing key information." : "Resume o texto reduzindo seu comprimento sem perder informações importantes.",
"Extracts topics from a text and outputs them separated by commas." : "Extrai tópicos de um texto e os gera separados por vírgulas.",
"File is currently busy, please try again later" : "O arquivo está ocupado, tente novamente mais tarde",
- "Cannot download file" : "Não é possível baixar o arquivo"
+ "Cannot download file" : "Não é possível baixar o arquivo",
+ "Login is too long" : "Login é muito longo"
},"pluralForm" :"nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;"
} \ No newline at end of file
diff --git a/lib/l10n/sr.js b/lib/l10n/sr.js
index 6760be8e4a9..d376cce293b 100644
--- a/lib/l10n/sr.js
+++ b/lib/l10n/sr.js
@@ -275,7 +275,6 @@ OC.L10N.register(
"A valid Login must be provided" : "Морате да унесете исправно име за пријаву",
"Login contains whitespace at the beginning or at the end" : "Име за пријаву садржи белине на почетку или на крају",
"Login must not consist of dots only" : "Име за пријаву не може да се састоји само од тачака",
- "Login is too long" : "Име за пријаву је сувише дугачко",
"Login is invalid because files already exist for this user" : "Име за пријаву није исправно пошто већ постоје фајлови овог корисника",
"Account disabled" : "Налог је искључен",
"Login canceled by app" : "Пријава отказана од стране апликације",
@@ -451,6 +450,7 @@ OC.L10N.register(
"Summarizes text by reducing its length without losing key information." : "Резимира текст тако што га скраћује без губитка кључних информација.",
"Extracts topics from a text and outputs them separated by commas." : "Издваја теме из текста и исписује их раздвојене запетама.",
"File is currently busy, please try again later" : "Фајл је тренутно заузет, покушајте поново касније",
- "Cannot download file" : "Фајл не може да се преузме"
+ "Cannot download file" : "Фајл не може да се преузме",
+ "Login is too long" : "Име за пријаву је сувише дугачко"
},
"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);");
diff --git a/lib/l10n/sr.json b/lib/l10n/sr.json
index 42ad00dc46d..8c0e5e07626 100644
--- a/lib/l10n/sr.json
+++ b/lib/l10n/sr.json
@@ -273,7 +273,6 @@
"A valid Login must be provided" : "Морате да унесете исправно име за пријаву",
"Login contains whitespace at the beginning or at the end" : "Име за пријаву садржи белине на почетку или на крају",
"Login must not consist of dots only" : "Име за пријаву не може да се састоји само од тачака",
- "Login is too long" : "Име за пријаву је сувише дугачко",
"Login is invalid because files already exist for this user" : "Име за пријаву није исправно пошто већ постоје фајлови овог корисника",
"Account disabled" : "Налог је искључен",
"Login canceled by app" : "Пријава отказана од стране апликације",
@@ -449,6 +448,7 @@
"Summarizes text by reducing its length without losing key information." : "Резимира текст тако што га скраћује без губитка кључних информација.",
"Extracts topics from a text and outputs them separated by commas." : "Издваја теме из текста и исписује их раздвојене запетама.",
"File is currently busy, please try again later" : "Фајл је тренутно заузет, покушајте поново касније",
- "Cannot download file" : "Фајл не може да се преузме"
+ "Cannot download file" : "Фајл не може да се преузме",
+ "Login is too long" : "Име за пријаву је сувише дугачко"
},"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"
} \ No newline at end of file
diff --git a/lib/l10n/sv.js b/lib/l10n/sv.js
index 121a87b137b..a3728e33a1f 100644
--- a/lib/l10n/sv.js
+++ b/lib/l10n/sv.js
@@ -275,7 +275,6 @@ OC.L10N.register(
"A valid Login must be provided" : "En giltig inloggning måste anges",
"Login contains whitespace at the beginning or at the end" : "Inloggningen innehåller blanksteg i början eller slutet",
"Login must not consist of dots only" : "Inloggningen får inte innehålla enbart punkter",
- "Login is too long" : "Inloggningen är för lång",
"Login is invalid because files already exist for this user" : "Inloggningen är ogiltigt eftersom det redan finns filer för den här användaren",
"Account disabled" : "Konto inaktiverat",
"Login canceled by app" : "Inloggningen avbruten av appen",
@@ -451,6 +450,7 @@ OC.L10N.register(
"Summarizes text by reducing its length without losing key information." : "Sammanfattar text genom att minska dess längd utan att förlora viktig information.",
"Extracts topics from a text and outputs them separated by commas." : "Extraherar ämnen från en text och matar ut dem separerade med kommatecken.",
"File is currently busy, please try again later" : "Filen är för tillfället upptagen, försök igen senare",
- "Cannot download file" : "Kan inte ladda ner fil"
+ "Cannot download file" : "Kan inte ladda ner fil",
+ "Login is too long" : "Inloggningen är för lång"
},
"nplurals=2; plural=(n != 1);");
diff --git a/lib/l10n/sv.json b/lib/l10n/sv.json
index 7c44fef111a..c8c18513770 100644
--- a/lib/l10n/sv.json
+++ b/lib/l10n/sv.json
@@ -273,7 +273,6 @@
"A valid Login must be provided" : "En giltig inloggning måste anges",
"Login contains whitespace at the beginning or at the end" : "Inloggningen innehåller blanksteg i början eller slutet",
"Login must not consist of dots only" : "Inloggningen får inte innehålla enbart punkter",
- "Login is too long" : "Inloggningen är för lång",
"Login is invalid because files already exist for this user" : "Inloggningen är ogiltigt eftersom det redan finns filer för den här användaren",
"Account disabled" : "Konto inaktiverat",
"Login canceled by app" : "Inloggningen avbruten av appen",
@@ -449,6 +448,7 @@
"Summarizes text by reducing its length without losing key information." : "Sammanfattar text genom att minska dess längd utan att förlora viktig information.",
"Extracts topics from a text and outputs them separated by commas." : "Extraherar ämnen från en text och matar ut dem separerade med kommatecken.",
"File is currently busy, please try again later" : "Filen är för tillfället upptagen, försök igen senare",
- "Cannot download file" : "Kan inte ladda ner fil"
+ "Cannot download file" : "Kan inte ladda ner fil",
+ "Login is too long" : "Inloggningen är för lång"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/lib/l10n/tr.js b/lib/l10n/tr.js
index 76f8d0b1e1b..05ea0d25177 100644
--- a/lib/l10n/tr.js
+++ b/lib/l10n/tr.js
@@ -273,7 +273,6 @@ OC.L10N.register(
"A valid Login must be provided" : "Geçerli bir kullanıcı adı yazmalısınız",
"Login contains whitespace at the beginning or at the end" : "Kullanıcı adının başında ya da sonunda boşluk var",
"Login must not consist of dots only" : "Kullanıcı adı yalnızca noktalardan oluşamaz",
- "Login is too long" : "Kullanıcı adı çok uzun",
"Login is invalid because files already exist for this user" : "Kullanıcı adı geçersiz, bu kullanıcı için zaten bazı dosyalar var",
"Account disabled" : "Hesap kullanımdan kaldırılmış",
"Login canceled by app" : "Oturum açma uygulama tarafından iptal edildi",
@@ -444,6 +443,7 @@ OC.L10N.register(
"Summarizes text by reducing its length without losing key information." : "Temel içeriği kaybetmeden uzunluğunu kısaltarak metni özetler.",
"Extracts topics from a text and outputs them separated by commas." : "Bir metindeki konuları ayıklar ve bunları virgül ile ayırarak sıralar.",
"File is currently busy, please try again later" : "Dosya şu anda meşgul. Lütfen bir süre sonra yeniden deneyin",
- "Cannot download file" : "Dosya indirilemedi"
+ "Cannot download file" : "Dosya indirilemedi",
+ "Login is too long" : "Kullanıcı adı çok uzun"
},
"nplurals=2; plural=(n > 1);");
diff --git a/lib/l10n/tr.json b/lib/l10n/tr.json
index 5161808df23..9b8aa8cfeac 100644
--- a/lib/l10n/tr.json
+++ b/lib/l10n/tr.json
@@ -271,7 +271,6 @@
"A valid Login must be provided" : "Geçerli bir kullanıcı adı yazmalısınız",
"Login contains whitespace at the beginning or at the end" : "Kullanıcı adının başında ya da sonunda boşluk var",
"Login must not consist of dots only" : "Kullanıcı adı yalnızca noktalardan oluşamaz",
- "Login is too long" : "Kullanıcı adı çok uzun",
"Login is invalid because files already exist for this user" : "Kullanıcı adı geçersiz, bu kullanıcı için zaten bazı dosyalar var",
"Account disabled" : "Hesap kullanımdan kaldırılmış",
"Login canceled by app" : "Oturum açma uygulama tarafından iptal edildi",
@@ -442,6 +441,7 @@
"Summarizes text by reducing its length without losing key information." : "Temel içeriği kaybetmeden uzunluğunu kısaltarak metni özetler.",
"Extracts topics from a text and outputs them separated by commas." : "Bir metindeki konuları ayıklar ve bunları virgül ile ayırarak sıralar.",
"File is currently busy, please try again later" : "Dosya şu anda meşgul. Lütfen bir süre sonra yeniden deneyin",
- "Cannot download file" : "Dosya indirilemedi"
+ "Cannot download file" : "Dosya indirilemedi",
+ "Login is too long" : "Kullanıcı adı çok uzun"
},"pluralForm" :"nplurals=2; plural=(n > 1);"
} \ No newline at end of file
diff --git a/lib/l10n/uk.js b/lib/l10n/uk.js
index 21ba04ce6dc..bce5040826f 100644
--- a/lib/l10n/uk.js
+++ b/lib/l10n/uk.js
@@ -273,7 +273,6 @@ OC.L10N.register(
"A valid Login must be provided" : "Зазначте дійсне ім'я користувача",
"Login contains whitespace at the beginning or at the end" : "Ім'я користувача містить символ пробілу на початку або наприкінці",
"Login must not consist of dots only" : "Ім'я користувача не може складатися лише з крапок",
- "Login is too long" : "Ім'я користувача для авторизації задовге",
"Login is invalid because files already exist for this user" : "Недійсне ім'я облікового запису, оскільки файли для цього користувача вже присутні",
"Account disabled" : "Обліковий запис вимкнено",
"Login canceled by app" : "Вхід скасовано застосунком",
@@ -355,6 +354,7 @@ OC.L10N.register(
"Summarizes text by reducing its length without losing key information." : "Викокремлює головне у тексті шляхом зменшення довжини тексту без втрати ключової інформації.",
"Extracts topics from a text and outputs them separated by commas." : "Виділяє теми, які висвітлює текст, зводить їх у перелік, що розділено комами.",
"File is currently busy, please try again later" : "Файл на разі зайнятий, будь ласка, спробуйте пізніше",
- "Cannot download file" : "Неможливо звантажити файл"
+ "Cannot download file" : "Неможливо звантажити файл",
+ "Login is too long" : "Ім'я користувача для авторизації задовге"
},
"nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);");
diff --git a/lib/l10n/uk.json b/lib/l10n/uk.json
index 208494144e3..1f6870816f2 100644
--- a/lib/l10n/uk.json
+++ b/lib/l10n/uk.json
@@ -271,7 +271,6 @@
"A valid Login must be provided" : "Зазначте дійсне ім'я користувача",
"Login contains whitespace at the beginning or at the end" : "Ім'я користувача містить символ пробілу на початку або наприкінці",
"Login must not consist of dots only" : "Ім'я користувача не може складатися лише з крапок",
- "Login is too long" : "Ім'я користувача для авторизації задовге",
"Login is invalid because files already exist for this user" : "Недійсне ім'я облікового запису, оскільки файли для цього користувача вже присутні",
"Account disabled" : "Обліковий запис вимкнено",
"Login canceled by app" : "Вхід скасовано застосунком",
@@ -353,6 +352,7 @@
"Summarizes text by reducing its length without losing key information." : "Викокремлює головне у тексті шляхом зменшення довжини тексту без втрати ключової інформації.",
"Extracts topics from a text and outputs them separated by commas." : "Виділяє теми, які висвітлює текст, зводить їх у перелік, що розділено комами.",
"File is currently busy, please try again later" : "Файл на разі зайнятий, будь ласка, спробуйте пізніше",
- "Cannot download file" : "Неможливо звантажити файл"
+ "Cannot download file" : "Неможливо звантажити файл",
+ "Login is too long" : "Ім'я користувача для авторизації задовге"
},"pluralForm" :"nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);"
} \ No newline at end of file
diff --git a/lib/l10n/zh_CN.js b/lib/l10n/zh_CN.js
index d4684c4b96a..2e64abae53e 100644
--- a/lib/l10n/zh_CN.js
+++ b/lib/l10n/zh_CN.js
@@ -275,7 +275,6 @@ OC.L10N.register(
"A valid Login must be provided" : "必须提供有效的登录名",
"Login contains whitespace at the beginning or at the end" : "登录名开头或结尾包含空格",
"Login must not consist of dots only" : "登录名不能仅由点组成",
- "Login is too long" : "登录名太长",
"Login is invalid because files already exist for this user" : "登录无效,因为此用户的文件已存在",
"Account disabled" : "帐户已禁用",
"Login canceled by app" : "已通过应用取消登录",
@@ -451,6 +450,7 @@ OC.L10N.register(
"Summarizes text by reducing its length without losing key information." : "总结一段文本以减少长度而不丢失关键信息",
"Extracts topics from a text and outputs them separated by commas." : "从文本中摘出主题,输出逗号分隔的结果",
"File is currently busy, please try again later" : "文件当前正忙,请稍后再试",
- "Cannot download file" : "无法下载文件"
+ "Cannot download file" : "无法下载文件",
+ "Login is too long" : "登录名太长"
},
"nplurals=1; plural=0;");
diff --git a/lib/l10n/zh_CN.json b/lib/l10n/zh_CN.json
index 75250cad139..342857f2114 100644
--- a/lib/l10n/zh_CN.json
+++ b/lib/l10n/zh_CN.json
@@ -273,7 +273,6 @@
"A valid Login must be provided" : "必须提供有效的登录名",
"Login contains whitespace at the beginning or at the end" : "登录名开头或结尾包含空格",
"Login must not consist of dots only" : "登录名不能仅由点组成",
- "Login is too long" : "登录名太长",
"Login is invalid because files already exist for this user" : "登录无效,因为此用户的文件已存在",
"Account disabled" : "帐户已禁用",
"Login canceled by app" : "已通过应用取消登录",
@@ -449,6 +448,7 @@
"Summarizes text by reducing its length without losing key information." : "总结一段文本以减少长度而不丢失关键信息",
"Extracts topics from a text and outputs them separated by commas." : "从文本中摘出主题,输出逗号分隔的结果",
"File is currently busy, please try again later" : "文件当前正忙,请稍后再试",
- "Cannot download file" : "无法下载文件"
+ "Cannot download file" : "无法下载文件",
+ "Login is too long" : "登录名太长"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/lib/l10n/zh_HK.js b/lib/l10n/zh_HK.js
index 7e94d5fb9cc..5655ddc40fc 100644
--- a/lib/l10n/zh_HK.js
+++ b/lib/l10n/zh_HK.js
@@ -275,7 +275,6 @@ OC.L10N.register(
"A valid Login must be provided" : "必須提供有效帳戶",
"Login contains whitespace at the beginning or at the end" : "帳戶的開頭或結尾有空白",
"Login must not consist of dots only" : "帳戶不能只包含小數點",
- "Login is too long" : "帳號太長了",
"Login is invalid because files already exist for this user" : "帳戶無效,因為此用戶的檔案已經存在",
"Account disabled" : "帳戶已停用",
"Login canceled by app" : "登入已被應用程式取消",
@@ -451,6 +450,7 @@ OC.L10N.register(
"Summarizes text by reducing its length without losing key information." : "通過減少文字長度來總結而不丟失關鍵資訊。",
"Extracts topics from a text and outputs them separated by commas." : "從文字中提取主題並輸出,並用逗號分隔。",
"File is currently busy, please try again later" : "檔案目前忙碌中,請稍候再試",
- "Cannot download file" : "無法下載檔案"
+ "Cannot download file" : "無法下載檔案",
+ "Login is too long" : "帳號太長了"
},
"nplurals=1; plural=0;");
diff --git a/lib/l10n/zh_HK.json b/lib/l10n/zh_HK.json
index fd28486dccb..532dfe23b29 100644
--- a/lib/l10n/zh_HK.json
+++ b/lib/l10n/zh_HK.json
@@ -273,7 +273,6 @@
"A valid Login must be provided" : "必須提供有效帳戶",
"Login contains whitespace at the beginning or at the end" : "帳戶的開頭或結尾有空白",
"Login must not consist of dots only" : "帳戶不能只包含小數點",
- "Login is too long" : "帳號太長了",
"Login is invalid because files already exist for this user" : "帳戶無效,因為此用戶的檔案已經存在",
"Account disabled" : "帳戶已停用",
"Login canceled by app" : "登入已被應用程式取消",
@@ -449,6 +448,7 @@
"Summarizes text by reducing its length without losing key information." : "通過減少文字長度來總結而不丟失關鍵資訊。",
"Extracts topics from a text and outputs them separated by commas." : "從文字中提取主題並輸出,並用逗號分隔。",
"File is currently busy, please try again later" : "檔案目前忙碌中,請稍候再試",
- "Cannot download file" : "無法下載檔案"
+ "Cannot download file" : "無法下載檔案",
+ "Login is too long" : "帳號太長了"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/lib/l10n/zh_TW.js b/lib/l10n/zh_TW.js
index 39bf221f009..c0c6f291bfc 100644
--- a/lib/l10n/zh_TW.js
+++ b/lib/l10n/zh_TW.js
@@ -275,7 +275,6 @@ OC.L10N.register(
"A valid Login must be provided" : "必須提供有效帳號",
"Login contains whitespace at the beginning or at the end" : "帳號的開頭或結尾有空白",
"Login must not consist of dots only" : "帳號不能只包含小數點",
- "Login is too long" : "帳號太長了",
"Login is invalid because files already exist for this user" : "帳號無效,因為使用者的檔案已經存在",
"Account disabled" : "帳號已停用",
"Login canceled by app" : "應用程式取消了登入",
@@ -451,6 +450,7 @@ OC.L10N.register(
"Summarizes text by reducing its length without losing key information." : "寫成摘要,減少文字長度而不丟失關鍵資訊。",
"Extracts topics from a text and outputs them separated by commas." : "從文字中取出涵蓋的主題並輸出,然後用逗號分隔。",
"File is currently busy, please try again later" : "檔案目前忙碌中,請稍候再試",
- "Cannot download file" : "無法下載檔案"
+ "Cannot download file" : "無法下載檔案",
+ "Login is too long" : "帳號太長了"
},
"nplurals=1; plural=0;");
diff --git a/lib/l10n/zh_TW.json b/lib/l10n/zh_TW.json
index 101da41381b..8f2cef7fc9d 100644
--- a/lib/l10n/zh_TW.json
+++ b/lib/l10n/zh_TW.json
@@ -273,7 +273,6 @@
"A valid Login must be provided" : "必須提供有效帳號",
"Login contains whitespace at the beginning or at the end" : "帳號的開頭或結尾有空白",
"Login must not consist of dots only" : "帳號不能只包含小數點",
- "Login is too long" : "帳號太長了",
"Login is invalid because files already exist for this user" : "帳號無效,因為使用者的檔案已經存在",
"Account disabled" : "帳號已停用",
"Login canceled by app" : "應用程式取消了登入",
@@ -449,6 +448,7 @@
"Summarizes text by reducing its length without losing key information." : "寫成摘要,減少文字長度而不丟失關鍵資訊。",
"Extracts topics from a text and outputs them separated by commas." : "從文字中取出涵蓋的主題並輸出,然後用逗號分隔。",
"File is currently busy, please try again later" : "檔案目前忙碌中,請稍候再試",
- "Cannot download file" : "無法下載檔案"
+ "Cannot download file" : "無法下載檔案",
+ "Login is too long" : "帳號太長了"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/lib/private/AppFramework/Bootstrap/RegistrationContext.php b/lib/private/AppFramework/Bootstrap/RegistrationContext.php
index c3b829825c2..95ad129c466 100644
--- a/lib/private/AppFramework/Bootstrap/RegistrationContext.php
+++ b/lib/private/AppFramework/Bootstrap/RegistrationContext.php
@@ -157,7 +157,7 @@ class RegistrationContext {
/** @var ServiceRegistration<\OCP\Files\Conversion\IConversionProvider>[] */
private array $fileConversionProviders = [];
-
+
/** @var ServiceRegistration<IMailProvider>[] */
private $mailProviders = [];
diff --git a/lib/private/Blurhash/Listener/GenerateBlurhashMetadata.php b/lib/private/Blurhash/Listener/GenerateBlurhashMetadata.php
index 982693bcfe8..8faf4627251 100644
--- a/lib/private/Blurhash/Listener/GenerateBlurhashMetadata.php
+++ b/lib/private/Blurhash/Listener/GenerateBlurhashMetadata.php
@@ -68,6 +68,11 @@ class GenerateBlurhashMetadata implements IEventListener {
return;
}
+ // Preview are disabled, so we skip generating the blurhash.
+ if (!$this->preview->isAvailable($file)) {
+ return;
+ }
+
$preview = $this->preview->getPreview($file, 64, 64, cacheResult: false);
$image = @imagecreatefromstring($preview->getContent());
diff --git a/lib/private/Collaboration/Reference/File/FileReferenceEventListener.php b/lib/private/Collaboration/Reference/File/FileReferenceEventListener.php
index e468ad4eb4c..9c18531c8e7 100644
--- a/lib/private/Collaboration/Reference/File/FileReferenceEventListener.php
+++ b/lib/private/Collaboration/Reference/File/FileReferenceEventListener.php
@@ -15,6 +15,7 @@ use OCP\EventDispatcher\Event;
use OCP\EventDispatcher\IEventDispatcher;
use OCP\EventDispatcher\IEventListener;
use OCP\Files\Events\Node\NodeDeletedEvent;
+use OCP\Files\Events\Node\NodeRenamedEvent;
use OCP\Share\Events\ShareCreatedEvent;
use OCP\Share\Events\ShareDeletedEvent;
@@ -27,6 +28,7 @@ class FileReferenceEventListener implements IEventListener {
public static function register(IEventDispatcher $eventDispatcher): void {
$eventDispatcher->addServiceListener(NodeDeletedEvent::class, FileReferenceEventListener::class);
+ $eventDispatcher->addServiceListener(NodeRenamedEvent::class, FileReferenceEventListener::class);
$eventDispatcher->addServiceListener(ShareDeletedEvent::class, FileReferenceEventListener::class);
$eventDispatcher->addServiceListener(ShareCreatedEvent::class, FileReferenceEventListener::class);
}
@@ -42,6 +44,9 @@ class FileReferenceEventListener implements IEventListener {
$this->manager->invalidateCache((string)$event->getNode()->getId());
}
+ if ($event instanceof NodeRenamedEvent) {
+ $this->manager->invalidateCache((string)$event->getTarget()->getId());
+ }
if ($event instanceof ShareDeletedEvent) {
$this->manager->invalidateCache((string)$event->getShare()->getNodeId());
}
diff --git a/lib/private/Files/Mount/ObjectHomeMountProvider.php b/lib/private/Files/Mount/ObjectHomeMountProvider.php
index 99c52108fa8..4b088f2c808 100644
--- a/lib/private/Files/Mount/ObjectHomeMountProvider.php
+++ b/lib/private/Files/Mount/ObjectHomeMountProvider.php
@@ -7,117 +7,39 @@
*/
namespace OC\Files\Mount;
+use OC\Files\ObjectStore\HomeObjectStoreStorage;
+use OC\Files\ObjectStore\PrimaryObjectStoreConfig;
use OCP\Files\Config\IHomeMountProvider;
+use OCP\Files\Mount\IMountPoint;
use OCP\Files\Storage\IStorageFactory;
-use OCP\IConfig;
use OCP\IUser;
-use Psr\Log\LoggerInterface;
/**
* Mount provider for object store home storages
*/
class ObjectHomeMountProvider implements IHomeMountProvider {
- /**
- * @var IConfig
- */
- private $config;
-
- /**
- * ObjectStoreHomeMountProvider constructor.
- *
- * @param IConfig $config
- */
- public function __construct(IConfig $config) {
- $this->config = $config;
+ public function __construct(
+ private PrimaryObjectStoreConfig $objectStoreConfig,
+ ) {
}
/**
- * Get the cache mount for a user
+ * Get the home mount for a user
*
* @param IUser $user
* @param IStorageFactory $loader
- * @return \OCP\Files\Mount\IMountPoint
+ * @return ?IMountPoint
*/
- public function getHomeMountForUser(IUser $user, IStorageFactory $loader) {
- $config = $this->getMultiBucketObjectStoreConfig($user);
- if ($config === null) {
- $config = $this->getSingleBucketObjectStoreConfig($user);
- }
-
- if ($config === null) {
+ public function getHomeMountForUser(IUser $user, IStorageFactory $loader): ?IMountPoint {
+ $objectStoreConfig = $this->objectStoreConfig->getObjectStoreConfigForUser($user);
+ if ($objectStoreConfig === null) {
return null;
}
+ $arguments = array_merge($objectStoreConfig['arguments'], [
+ 'objectstore' => $this->objectStoreConfig->buildObjectStore($objectStoreConfig),
+ 'user' => $user,
+ ]);
- return new HomeMountPoint($user, '\OC\Files\ObjectStore\HomeObjectStoreStorage', '/' . $user->getUID(), $config['arguments'], $loader, null, null, self::class);
- }
-
- /**
- * @param IUser $user
- * @return array|null
- */
- private function getSingleBucketObjectStoreConfig(IUser $user) {
- $config = $this->config->getSystemValue('objectstore');
- if (!is_array($config)) {
- return null;
- }
-
- // sanity checks
- if (empty($config['class'])) {
- \OC::$server->get(LoggerInterface::class)->error('No class given for objectstore', ['app' => 'files']);
- }
- if (!isset($config['arguments'])) {
- $config['arguments'] = [];
- }
- // instantiate object store implementation
- $config['arguments']['objectstore'] = new $config['class']($config['arguments']);
-
- $config['arguments']['user'] = $user;
-
- return $config;
- }
-
- /**
- * @param IUser $user
- * @return array|null
- */
- private function getMultiBucketObjectStoreConfig(IUser $user) {
- $config = $this->config->getSystemValue('objectstore_multibucket');
- if (!is_array($config)) {
- return null;
- }
-
- // sanity checks
- if (empty($config['class'])) {
- \OC::$server->get(LoggerInterface::class)->error('No class given for objectstore', ['app' => 'files']);
- }
- if (!isset($config['arguments'])) {
- $config['arguments'] = [];
- }
-
- $bucket = $this->config->getUserValue($user->getUID(), 'homeobjectstore', 'bucket', null);
-
- if ($bucket === null) {
- /*
- * Use any provided bucket argument as prefix
- * and add the mapping from username => bucket
- */
- if (!isset($config['arguments']['bucket'])) {
- $config['arguments']['bucket'] = '';
- }
- $mapper = new \OC\Files\ObjectStore\Mapper($user, $this->config);
- $numBuckets = $config['arguments']['num_buckets'] ?? 64;
- $config['arguments']['bucket'] .= $mapper->getBucket($numBuckets);
-
- $this->config->setUserValue($user->getUID(), 'homeobjectstore', 'bucket', $config['arguments']['bucket']);
- } else {
- $config['arguments']['bucket'] = $bucket;
- }
-
- // instantiate object store implementation
- $config['arguments']['objectstore'] = new $config['class']($config['arguments']);
-
- $config['arguments']['user'] = $user;
-
- return $config;
+ return new HomeMountPoint($user, HomeObjectStoreStorage::class, '/' . $user->getUID(), $arguments, $loader, null, null, self::class);
}
}
diff --git a/lib/private/Files/Mount/RootMountProvider.php b/lib/private/Files/Mount/RootMountProvider.php
index 86f8188978f..5e0c924ad38 100644
--- a/lib/private/Files/Mount/RootMountProvider.php
+++ b/lib/private/Files/Mount/RootMountProvider.php
@@ -10,79 +10,41 @@ namespace OC\Files\Mount;
use OC;
use OC\Files\ObjectStore\ObjectStoreStorage;
+use OC\Files\ObjectStore\PrimaryObjectStoreConfig;
use OC\Files\Storage\LocalRootStorage;
-use OC_App;
use OCP\Files\Config\IRootMountProvider;
use OCP\Files\Storage\IStorageFactory;
use OCP\IConfig;
-use Psr\Log\LoggerInterface;
class RootMountProvider implements IRootMountProvider {
+ private PrimaryObjectStoreConfig $objectStoreConfig;
private IConfig $config;
- private LoggerInterface $logger;
- public function __construct(IConfig $config, LoggerInterface $logger) {
+ public function __construct(PrimaryObjectStoreConfig $objectStoreConfig, IConfig $config) {
+ $this->objectStoreConfig = $objectStoreConfig;
$this->config = $config;
- $this->logger = $logger;
}
public function getRootMounts(IStorageFactory $loader): array {
- $objectStore = $this->config->getSystemValue('objectstore', null);
- $objectStoreMultiBucket = $this->config->getSystemValue('objectstore_multibucket', null);
+ $objectStoreConfig = $this->objectStoreConfig->getObjectStoreConfigForRoot();
- if ($objectStoreMultiBucket) {
- return [$this->getMultiBucketStoreRootMount($loader, $objectStoreMultiBucket)];
- } elseif ($objectStore) {
- return [$this->getObjectStoreRootMount($loader, $objectStore)];
+ if ($objectStoreConfig) {
+ return [$this->getObjectStoreRootMount($loader, $objectStoreConfig)];
} else {
return [$this->getLocalRootMount($loader)];
}
}
- private function validateObjectStoreConfig(array &$config) {
- if (empty($config['class'])) {
- $this->logger->error('No class given for objectstore', ['app' => 'files']);
- }
- if (!isset($config['arguments'])) {
- $config['arguments'] = [];
- }
-
- // instantiate object store implementation
- $name = $config['class'];
- if (str_starts_with($name, 'OCA\\') && substr_count($name, '\\') >= 2) {
- $segments = explode('\\', $name);
- OC_App::loadApp(strtolower($segments[1]));
- }
- }
-
private function getLocalRootMount(IStorageFactory $loader): MountPoint {
$configDataDirectory = $this->config->getSystemValue('datadirectory', OC::$SERVERROOT . '/data');
return new MountPoint(LocalRootStorage::class, '/', ['datadir' => $configDataDirectory], $loader, null, null, self::class);
}
- private function getObjectStoreRootMount(IStorageFactory $loader, array $config): MountPoint {
- $this->validateObjectStoreConfig($config);
-
- $config['arguments']['objectstore'] = new $config['class']($config['arguments']);
- // mount with plain / root object store implementation
- $config['class'] = ObjectStoreStorage::class;
-
- return new MountPoint($config['class'], '/', $config['arguments'], $loader, null, null, self::class);
- }
-
- private function getMultiBucketStoreRootMount(IStorageFactory $loader, array $config): MountPoint {
- $this->validateObjectStoreConfig($config);
-
- if (!isset($config['arguments']['bucket'])) {
- $config['arguments']['bucket'] = '';
- }
- // put the root FS always in first bucket for multibucket configuration
- $config['arguments']['bucket'] .= '0';
-
- $config['arguments']['objectstore'] = new $config['class']($config['arguments']);
- // mount with plain / root object store implementation
- $config['class'] = ObjectStoreStorage::class;
+ private function getObjectStoreRootMount(IStorageFactory $loader, array $objectStoreConfig): MountPoint {
+ $arguments = array_merge($objectStoreConfig['arguments'], [
+ 'objectstore' => $this->objectStoreConfig->buildObjectStore($objectStoreConfig),
+ ]);
- return new MountPoint($config['class'], '/', $config['arguments'], $loader, null, null, self::class);
+ return new MountPoint(ObjectStoreStorage::class, '/', $arguments, $loader, null, null, self::class);
}
}
diff --git a/lib/private/Files/ObjectStore/PrimaryObjectStoreConfig.php b/lib/private/Files/ObjectStore/PrimaryObjectStoreConfig.php
new file mode 100644
index 00000000000..fdfe989addc
--- /dev/null
+++ b/lib/private/Files/ObjectStore/PrimaryObjectStoreConfig.php
@@ -0,0 +1,140 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+namespace OC\Files\ObjectStore;
+
+use OCP\App\IAppManager;
+use OCP\Files\ObjectStore\IObjectStore;
+use OCP\IConfig;
+use OCP\IUser;
+
+/**
+ * @psalm-type ObjectStoreConfig array{class: class-string<IObjectStore>, arguments: array{multibucket: bool, ...}}
+ */
+class PrimaryObjectStoreConfig {
+ public function __construct(
+ private readonly IConfig $config,
+ private readonly IAppManager $appManager,
+ ) {
+ }
+
+ /**
+ * @param ObjectStoreConfig $config
+ */
+ public function buildObjectStore(array $config): IObjectStore {
+ return new $config['class']($config['arguments']);
+ }
+
+ /**
+ * @return ?ObjectStoreConfig
+ */
+ public function getObjectStoreConfigForRoot(): ?array {
+ $config = $this->getObjectStoreConfig();
+
+ if ($config && $config['arguments']['multibucket']) {
+ if (!isset($config['arguments']['bucket'])) {
+ $config['arguments']['bucket'] = '';
+ }
+
+ // put the root FS always in first bucket for multibucket configuration
+ $config['arguments']['bucket'] .= '0';
+ }
+ return $config;
+ }
+
+ /**
+ * @return ?ObjectStoreConfig
+ */
+ public function getObjectStoreConfigForUser(IUser $user): ?array {
+ $config = $this->getObjectStoreConfig();
+
+ if ($config && $config['arguments']['multibucket']) {
+ $config['arguments']['bucket'] = $this->getBucketForUser($user, $config);
+ }
+ return $config;
+ }
+
+ /**
+ * @return ?ObjectStoreConfig
+ */
+ private function getObjectStoreConfig(): ?array {
+ $objectStore = $this->config->getSystemValue('objectstore', null);
+ $objectStoreMultiBucket = $this->config->getSystemValue('objectstore_multibucket', null);
+
+ // new-style multibucket config uses the same 'objectstore' key but sets `'multibucket' => true`, transparently upgrade older style config
+ if ($objectStoreMultiBucket) {
+ $objectStoreMultiBucket['arguments']['multibucket'] = true;
+ return $this->validateObjectStoreConfig($objectStoreMultiBucket);
+ } elseif ($objectStore) {
+ return $this->validateObjectStoreConfig($objectStore);
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * @return ObjectStoreConfig
+ */
+ private function validateObjectStoreConfig(array $config) {
+ if (!isset($config['class'])) {
+ throw new \Exception('No class configured for object store');
+ }
+ if (!isset($config['arguments'])) {
+ $config['arguments'] = [];
+ }
+ $class = $config['class'];
+ $arguments = $config['arguments'];
+ if (!is_array($arguments)) {
+ throw new \Exception('Configured object store arguments are not an array');
+ }
+ if (!isset($arguments['multibucket'])) {
+ $arguments['multibucket'] = false;
+ }
+ if (!is_bool($arguments['multibucket'])) {
+ throw new \Exception('arguments.multibucket must be a boolean in object store configuration');
+ }
+
+ if (!is_string($class)) {
+ throw new \Exception('Configured class for object store is not a string');
+ }
+
+ if (str_starts_with($class, 'OCA\\') && substr_count($class, '\\') >= 2) {
+ [$appId] = explode('\\', $class);
+ $this->appManager->loadApp(strtolower($appId));
+ }
+
+ if (!is_a($class, IObjectStore::class, true)) {
+ throw new \Exception('Configured class for object store is not an object store');
+ }
+ return [
+ 'class' => $class,
+ 'arguments' => $arguments,
+ ];
+ }
+
+ private function getBucketForUser(IUser $user, array $config): string {
+ $bucket = $this->config->getUserValue($user->getUID(), 'homeobjectstore', 'bucket', null);
+
+ if ($bucket === null) {
+ /*
+ * Use any provided bucket argument as prefix
+ * and add the mapping from username => bucket
+ */
+ if (!isset($config['arguments']['bucket'])) {
+ $config['arguments']['bucket'] = '';
+ }
+ $mapper = new Mapper($user, $this->config);
+ $numBuckets = isset($config['arguments']['num_buckets']) ? $config['arguments']['num_buckets'] : 64;
+ $bucket = $config['arguments']['bucket'] . $mapper->getBucket($numBuckets);
+
+ $this->config->setUserValue($user->getUID(), 'homeobjectstore', 'bucket', $bucket);
+ }
+
+ return $bucket;
+ }
+}
diff --git a/lib/private/Files/View.php b/lib/private/Files/View.php
index 6832b4e1551..63eecf5e1d6 100644
--- a/lib/private/Files/View.php
+++ b/lib/private/Files/View.php
@@ -938,7 +938,7 @@ class View {
try {
$exists = $this->file_exists($target);
- if ($this->shouldEmitHooks()) {
+ if ($this->shouldEmitHooks($target)) {
\OC_Hook::emit(
Filesystem::CLASSNAME,
Filesystem::signal_copy,
@@ -978,7 +978,7 @@ class View {
$this->changeLock($target, ILockingProvider::LOCK_SHARED);
$lockTypePath2 = ILockingProvider::LOCK_SHARED;
- if ($this->shouldEmitHooks() && $result !== false) {
+ if ($this->shouldEmitHooks($target) && $result !== false) {
\OC_Hook::emit(
Filesystem::CLASSNAME,
Filesystem::signal_post_copy,
diff --git a/lib/private/Log/ErrorHandler.php b/lib/private/Log/ErrorHandler.php
index e1faf336118..6597274a868 100644
--- a/lib/private/Log/ErrorHandler.php
+++ b/lib/private/Log/ErrorHandler.php
@@ -72,9 +72,9 @@ class ErrorHandler {
private static function errnoToLogLevel(int $errno): int {
return match ($errno) {
- E_USER_WARNING => ILogger::WARN,
+ E_WARNING, E_USER_WARNING => ILogger::WARN,
E_DEPRECATED, E_USER_DEPRECATED => ILogger::DEBUG,
- E_USER_NOTICE => ILogger::INFO,
+ E_NOTICE, E_USER_NOTICE => ILogger::INFO,
default => ILogger::ERROR,
};
}
diff --git a/lib/private/Server.php b/lib/private/Server.php
index ea8c1ce3797..bf07ee355ea 100644
--- a/lib/private/Server.php
+++ b/lib/private/Server.php
@@ -55,6 +55,7 @@ use OC\Files\Mount\RootMountProvider;
use OC\Files\Node\HookConnector;
use OC\Files\Node\LazyRoot;
use OC\Files\Node\Root;
+use OC\Files\ObjectStore\PrimaryObjectStoreConfig;
use OC\Files\SetupManager;
use OC\Files\Storage\StorageFactory;
use OC\Files\Template\TemplateManager;
@@ -819,10 +820,11 @@ class Server extends ServerContainer implements IServerContainer {
$config = $c->get(\OCP\IConfig::class);
$logger = $c->get(LoggerInterface::class);
+ $objectStoreConfig = $c->get(PrimaryObjectStoreConfig::class);
$manager->registerProvider(new CacheMountProvider($config));
$manager->registerHomeProvider(new LocalHomeMountProvider());
- $manager->registerHomeProvider(new ObjectHomeMountProvider($config));
- $manager->registerRootProvider(new RootMountProvider($config, $c->get(LoggerInterface::class)));
+ $manager->registerHomeProvider(new ObjectHomeMountProvider($objectStoreConfig));
+ $manager->registerRootProvider(new RootMountProvider($objectStoreConfig, $config));
$manager->registerRootProvider(new ObjectStorePreviewCacheMountProvider($logger, $config));
return $manager;
diff --git a/lib/private/Settings/DeclarativeManager.php b/lib/private/Settings/DeclarativeManager.php
index dea0c678f20..534b4b19984 100644
--- a/lib/private/Settings/DeclarativeManager.php
+++ b/lib/private/Settings/DeclarativeManager.php
@@ -15,6 +15,7 @@ use OCP\IAppConfig;
use OCP\IConfig;
use OCP\IGroupManager;
use OCP\IUser;
+use OCP\Security\ICrypto;
use OCP\Server;
use OCP\Settings\DeclarativeSettingsTypes;
use OCP\Settings\Events\DeclarativeSettingsGetValueEvent;
@@ -49,6 +50,7 @@ class DeclarativeManager implements IDeclarativeManager {
private IConfig $config,
private IAppConfig $appConfig,
private LoggerInterface $logger,
+ private ICrypto $crypto,
) {
}
@@ -266,7 +268,7 @@ class DeclarativeManager implements IDeclarativeManager {
$this->eventDispatcher->dispatchTyped(new DeclarativeSettingsSetValueEvent($user, $app, $formId, $fieldId, $value));
break;
case DeclarativeSettingsTypes::STORAGE_TYPE_INTERNAL:
- $this->saveInternalValue($user, $app, $fieldId, $value);
+ $this->saveInternalValue($user, $app, $formId, $fieldId, $value);
break;
default:
throw new Exception('Unknown storage type "' . $storageType . '"');
@@ -290,18 +292,52 @@ class DeclarativeManager implements IDeclarativeManager {
private function getInternalValue(IUser $user, string $app, string $formId, string $fieldId): mixed {
$sectionType = $this->getSectionType($app, $fieldId);
$defaultValue = $this->getDefaultValue($app, $formId, $fieldId);
+
+ $field = $this->getSchemaField($app, $formId, $fieldId);
+ $isSensitive = $field !== null && isset($field['sensitive']) && $field['sensitive'] === true;
+
switch ($sectionType) {
case DeclarativeSettingsTypes::SECTION_TYPE_ADMIN:
- return $this->config->getAppValue($app, $fieldId, $defaultValue);
+ $value = $this->config->getAppValue($app, $fieldId, $defaultValue);
+ break;
case DeclarativeSettingsTypes::SECTION_TYPE_PERSONAL:
- return $this->config->getUserValue($user->getUID(), $app, $fieldId, $defaultValue);
+ $value = $this->config->getUserValue($user->getUID(), $app, $fieldId, $defaultValue);
+ break;
default:
throw new Exception('Unknown section type "' . $sectionType . '"');
}
+ if ($isSensitive && $value !== '') {
+ try {
+ $value = $this->crypto->decrypt($value);
+ } catch (Exception $e) {
+ $this->logger->warning('Failed to decrypt sensitive value for field {field} in app {app}: {message}', [
+ 'field' => $fieldId,
+ 'app' => $app,
+ 'message' => $e->getMessage(),
+ ]);
+ $value = $defaultValue;
+ }
+ }
+ return $value;
}
- private function saveInternalValue(IUser $user, string $app, string $fieldId, mixed $value): void {
+ private function saveInternalValue(IUser $user, string $app, string $formId, string $fieldId, mixed $value): void {
$sectionType = $this->getSectionType($app, $fieldId);
+
+ $field = $this->getSchemaField($app, $formId, $fieldId);
+ if ($field !== null && isset($field['sensitive']) && $field['sensitive'] === true && $value !== '' && $value !== 'dummySecret') {
+ try {
+ $value = $this->crypto->encrypt($value);
+ } catch (Exception $e) {
+ $this->logger->warning('Failed to decrypt sensitive value for field {field} in app {app}: {message}', [
+ 'field' => $fieldId,
+ 'app' => $app,
+ 'message' => $e->getMessage()]
+ );
+ throw new Exception('Failed to encrypt sensitive value');
+ }
+ }
+
switch ($sectionType) {
case DeclarativeSettingsTypes::SECTION_TYPE_ADMIN:
$this->appConfig->setValueString($app, $fieldId, $value);
@@ -314,6 +350,27 @@ class DeclarativeManager implements IDeclarativeManager {
}
}
+ private function getSchemaField(string $app, string $formId, string $fieldId): ?array {
+ $form = $this->getForm($app, $formId);
+ if ($form !== null) {
+ foreach ($form->getSchema()['fields'] as $field) {
+ if ($field['id'] === $fieldId) {
+ return $field;
+ }
+ }
+ }
+ foreach ($this->appSchemas[$app] ?? [] as $schema) {
+ if ($schema['id'] === $formId) {
+ foreach ($schema['fields'] as $field) {
+ if ($field['id'] === $fieldId) {
+ return $field;
+ }
+ }
+ }
+ }
+ return null;
+ }
+
private function getDefaultValue(string $app, string $formId, string $fieldId): mixed {
foreach ($this->appSchemas[$app] as $schema) {
if ($schema['id'] === $formId) {
@@ -391,6 +448,12 @@ class DeclarativeManager implements IDeclarativeManager {
]);
return false;
}
+ if (isset($field['sensitive']) && $field['sensitive'] === true && !in_array($field['type'], [DeclarativeSettingsTypes::TEXT, DeclarativeSettingsTypes::PASSWORD])) {
+ $this->logger->warning('Declarative settings: sensitive field type is supported only for TEXT and PASSWORD types ({app}, {form_id}, {field_id})', [
+ 'app' => $appId, 'form_id' => $formId, 'field_id' => $fieldId,
+ ]);
+ return false;
+ }
if (!$this->validateField($appId, $formId, $field)) {
return false;
}
diff --git a/lib/private/User/Manager.php b/lib/private/User/Manager.php
index ca5d90f8c00..229f3138e6d 100644
--- a/lib/private/User/Manager.php
+++ b/lib/private/User/Manager.php
@@ -724,7 +724,8 @@ class Manager extends PublicEmitter implements IUserManager {
// User ID is too long
if (strlen($uid) > IUser::MAX_USERID_LENGTH) {
- throw new \InvalidArgumentException($l->t('Login is too long'));
+ // TRANSLATORS User ID is too long
+ throw new \InvalidArgumentException($l->t('Username is too long'));
}
if (!$this->verifyUid($uid, $checkDataDirectory)) {
diff --git a/lib/public/Calendar/ICalendar.php b/lib/public/Calendar/ICalendar.php
index 2dfc1ca632f..50152d1240b 100644
--- a/lib/public/Calendar/ICalendar.php
+++ b/lib/public/Calendar/ICalendar.php
@@ -8,10 +8,18 @@ declare(strict_types=1);
*/
namespace OCP\Calendar;
+use DateTimeInterface;
+
/**
* Interface ICalendar
*
* @since 13.0.0
+ *
+ * @psalm-type CalendarSearchOptions = array{
+ * timerange?: array{start?: DateTimeInterface, end?: DateTimeInterface},
+ * uid?: string,
+ * types?: string[],
+ * }
*/
interface ICalendar {
/**
@@ -41,13 +49,63 @@ interface ICalendar {
public function getDisplayColor(): ?string;
/**
- * @param string $pattern which should match within the $searchProperties
- * @param array $searchProperties defines the properties within the query pattern should match
- * @param array $options - optional parameters:
- * ['timerange' => ['start' => new DateTime(...), 'end' => new DateTime(...)]]
- * @param int|null $limit - limit number of search results
- * @param int|null $offset - offset for paging of search results
- * @return array an array of events/journals/todos which are arrays of key-value-pairs. the events are sorted by start date (closest first, furthest last)
+ * Search the current calendar for matching events.
+ *
+ * This method searches for events in the calendar that match a given pattern within specified properties.
+ * The search is case-insensitive. It supports optional parameters such as a time range, limit, and offset.
+ * The results are sorted by start date, with the closest events appearing first.
+ *
+ * @param string $pattern A string to search for within the events. The search is done case-insensitive.
+ * @param array $searchProperties Defines the properties within which the pattern should match.
+ * @param array $options Optional parameters for the search:
+ * - 'timerange' element that can have 'start' (DateTimeInterface), 'end' (DateTimeInterface), or both.
+ * - 'uid' element to look for events with a given uid.
+ * - 'types' element to only return events for a given type (e.g. VEVENT or VTODO)
+ * @psalm-param CalendarSearchOptions $options
+ * @param int|null $limit Limit the number of search results.
+ * @param int|null $offset For paging of search results.
+ * @return array An array of events/journals/todos which are arrays of key-value-pairs. The events are sorted by start date (closest first, furthest last).
+ *
+ * Implementation Details:
+ *
+ * An event can consist of many sub-events, typically the case for events with recurrence rules. On a database level,
+ * there's only one event stored (with a matching first occurrence and last occurrence timestamp). Expanding an event
+ * into sub-events is done on the backend level. Using limit, offset, and timerange comes with some drawbacks.
+ * When asking the database for events, the result is ordered by the primary key to guarantee a stable order.
+ * After expanding the events into sub-events, they are sorted by the date (closest to furthest).
+ *
+ * Usage Examples:
+ *
+ * 1) Find 7 events within the next two weeks:
+ *
+ * $dateTime = (new DateTimeImmutable())->setTimestamp($this->timeFactory->getTime());
+ * $inTwoWeeks = $dateTime->add(new DateInterval('P14D'));
+ *
+ * $calendar->search(
+ * '',
+ * [],
+ * ['timerange' => ['start' => $dateTime, 'end' => $inTwoWeeks]],
+ * 7
+ * );
+ *
+ * Note: When combining timerange and limit, it's possible that the expected outcome is not in the order you would expect.
+ *
+ * Example: Create 7 events for tomorrow, starting from 11:00, 30 minutes each. Then create an 8th event for tomorrow at 10:00.
+ * The above code will list the event at 11:00 first, missing the event at 10:00. The reason is the ordering by the primary key
+ * and expanding on the backend level. This is a technical limitation. The easiest workaround is to fetch more events
+ * than you actually need, with the downside of needing more resources.
+ *
+ * Related:
+ * - https://github.com/nextcloud/server/pull/45222
+ * - https://github.com/nextcloud/server/issues/53002
+ *
+ * 2) Find all events where the location property contains the string 'Berlin':
+ *
+ * $calendar->search(
+ * 'Berlin',
+ * ['LOCATION']
+ * );
+ *
* @since 13.0.0
*/
public function search(string $pattern, array $searchProperties = [], array $options = [], ?int $limit = null, ?int $offset = null): array;
diff --git a/lib/public/Settings/IDeclarativeSettingsForm.php b/lib/public/Settings/IDeclarativeSettingsForm.php
index d471cdf4a93..419905b7b23 100644
--- a/lib/public/Settings/IDeclarativeSettingsForm.php
+++ b/lib/public/Settings/IDeclarativeSettingsForm.php
@@ -27,6 +27,7 @@ namespace OCP\Settings;
* label?: string,
* default: mixed,
* options?: list<string|array{name: string, value: mixed}>,
+ * sensitive?: boolean,
* }
*
* @psalm-type DeclarativeSettingsFormFieldWithValue = DeclarativeSettingsFormField&array{