diff options
Diffstat (limited to 'lib')
54 files changed, 401 insertions, 241 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 c65c26af2f2..9f4321129af 100644 --- a/lib/composer/composer/autoload_classmap.php +++ b/lib/composer/composer/autoload_classmap.php @@ -1387,6 +1387,7 @@ return array( 'OC\\Core\\Exception\\ResetPasswordException' => $baseDir . '/core/Exception/ResetPasswordException.php', 'OC\\Core\\Listener\\BeforeMessageLoggedEventListener' => $baseDir . '/core/Listener/BeforeMessageLoggedEventListener.php', 'OC\\Core\\Listener\\BeforeTemplateRenderedListener' => $baseDir . '/core/Listener/BeforeTemplateRenderedListener.php', + 'OC\\Core\\Listener\\FeedBackHandler' => $baseDir . '/core/Listener/FeedBackHandler.php', 'OC\\Core\\Middleware\\TwoFactorMiddleware' => $baseDir . '/core/Middleware/TwoFactorMiddleware.php', 'OC\\Core\\Migrations\\Version13000Date20170705121758' => $baseDir . '/core/Migrations/Version13000Date20170705121758.php', 'OC\\Core\\Migrations\\Version13000Date20170718121200' => $baseDir . '/core/Migrations/Version13000Date20170718121200.php', @@ -1643,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 b1e162bf71e..26e0a34275d 100644 --- a/lib/composer/composer/autoload_static.php +++ b/lib/composer/composer/autoload_static.php @@ -1428,6 +1428,7 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2 'OC\\Core\\Exception\\ResetPasswordException' => __DIR__ . '/../../..' . '/core/Exception/ResetPasswordException.php', 'OC\\Core\\Listener\\BeforeMessageLoggedEventListener' => __DIR__ . '/../../..' . '/core/Listener/BeforeMessageLoggedEventListener.php', 'OC\\Core\\Listener\\BeforeTemplateRenderedListener' => __DIR__ . '/../../..' . '/core/Listener/BeforeTemplateRenderedListener.php', + 'OC\\Core\\Listener\\FeedBackHandler' => __DIR__ . '/../../..' . '/core/Listener/FeedBackHandler.php', 'OC\\Core\\Middleware\\TwoFactorMiddleware' => __DIR__ . '/../../..' . '/core/Middleware/TwoFactorMiddleware.php', 'OC\\Core\\Migrations\\Version13000Date20170705121758' => __DIR__ . '/../../..' . '/core/Migrations/Version13000Date20170705121758.php', 'OC\\Core\\Migrations\\Version13000Date20170718121200' => __DIR__ . '/../../..' . '/core/Migrations/Version13000Date20170718121200.php', @@ -1684,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/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..c872b439331 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{ |