aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/composer/autoload.php5
-rw-r--r--lib/composer/composer/autoload_classmap.php2
-rw-r--r--lib/composer/composer/autoload_static.php2
-rw-r--r--lib/l10n/de.js2
-rw-r--r--lib/l10n/de.json2
-rw-r--r--lib/l10n/de_DE.js4
-rw-r--r--lib/l10n/de_DE.json4
-rw-r--r--lib/l10n/et_EE.js22
-rw-r--r--lib/l10n/et_EE.json22
-rw-r--r--lib/l10n/tr.js2
-rw-r--r--lib/l10n/tr.json2
-rw-r--r--lib/l10n/uk.js1
-rw-r--r--lib/l10n/uk.json1
-rw-r--r--lib/l10n/uz.js1
-rw-r--r--lib/l10n/uz.json1
-rw-r--r--lib/private/AppConfig.php12
-rw-r--r--lib/private/AppFramework/Http/Dispatcher.php8
-rw-r--r--lib/private/DB/Connection.php11
-rw-r--r--lib/private/Federation/CloudIdManager.php5
-rw-r--r--lib/private/Files/ObjectStore/S3ConnectionTrait.php4
-rw-r--r--lib/private/NavigationManager.php19
-rw-r--r--lib/private/Preview/Generator.php2
-rw-r--r--lib/private/Preview/Movie.php13
-rw-r--r--lib/private/Preview/Watcher.php3
-rw-r--r--lib/private/Preview/WatcherConnector.php32
-rw-r--r--lib/private/Profile/ProfileManager.php6
-rw-r--r--lib/private/Security/Normalizer/IpAddress.php15
-rw-r--r--lib/private/Server.php3
-rw-r--r--lib/private/TaskProcessing/Manager.php1
-rw-r--r--lib/private/Template/JSResourceLocator.php2
-rw-r--r--lib/private/TemplateLayout.php9
-rw-r--r--lib/private/URLGenerator.php5
-rw-r--r--lib/public/Profile/IProfileManager.php4
-rw-r--r--lib/public/TaskProcessing/TaskTypes/TextToSpeech.php92
34 files changed, 246 insertions, 73 deletions
diff --git a/lib/composer/autoload.php b/lib/composer/autoload.php
index 7b1481e876c..b3b39129e7a 100644
--- a/lib/composer/autoload.php
+++ b/lib/composer/autoload.php
@@ -14,7 +14,10 @@ if (PHP_VERSION_ID < 50600) {
echo $err;
}
}
- throw new RuntimeException($err);
+ trigger_error(
+ $err,
+ E_USER_ERROR
+ );
}
require_once __DIR__ . '/composer/autoload_real.php';
diff --git a/lib/composer/composer/autoload_classmap.php b/lib/composer/composer/autoload_classmap.php
index 1f3d9d3813b..6264126b028 100644
--- a/lib/composer/composer/autoload_classmap.php
+++ b/lib/composer/composer/autoload_classmap.php
@@ -837,6 +837,7 @@ return array(
'OCP\\TaskProcessing\\TaskTypes\\ContextWrite' => $baseDir . '/lib/public/TaskProcessing/TaskTypes/ContextWrite.php',
'OCP\\TaskProcessing\\TaskTypes\\GenerateEmoji' => $baseDir . '/lib/public/TaskProcessing/TaskTypes/GenerateEmoji.php',
'OCP\\TaskProcessing\\TaskTypes\\TextToImage' => $baseDir . '/lib/public/TaskProcessing/TaskTypes/TextToImage.php',
+ 'OCP\\TaskProcessing\\TaskTypes\\TextToSpeech' => $baseDir . '/lib/public/TaskProcessing/TaskTypes/TextToSpeech.php',
'OCP\\TaskProcessing\\TaskTypes\\TextToText' => $baseDir . '/lib/public/TaskProcessing/TaskTypes/TextToText.php',
'OCP\\TaskProcessing\\TaskTypes\\TextToTextChangeTone' => $baseDir . '/lib/public/TaskProcessing/TaskTypes/TextToTextChangeTone.php',
'OCP\\TaskProcessing\\TaskTypes\\TextToTextChat' => $baseDir . '/lib/public/TaskProcessing/TaskTypes/TextToTextChat.php',
@@ -1371,6 +1372,7 @@ return array(
'OC\\Core\\Db\\ProfileConfigMapper' => $baseDir . '/core/Db/ProfileConfigMapper.php',
'OC\\Core\\Events\\BeforePasswordResetEvent' => $baseDir . '/core/Events/BeforePasswordResetEvent.php',
'OC\\Core\\Events\\PasswordResetEvent' => $baseDir . '/core/Events/PasswordResetEvent.php',
+ 'OC\\Core\\Exception\\LoginFlowV2ClientForbiddenException' => $baseDir . '/core/Exception/LoginFlowV2ClientForbiddenException.php',
'OC\\Core\\Exception\\LoginFlowV2NotFoundException' => $baseDir . '/core/Exception/LoginFlowV2NotFoundException.php',
'OC\\Core\\Exception\\ResetPasswordException' => $baseDir . '/core/Exception/ResetPasswordException.php',
'OC\\Core\\Listener\\BeforeMessageLoggedEventListener' => $baseDir . '/core/Listener/BeforeMessageLoggedEventListener.php',
diff --git a/lib/composer/composer/autoload_static.php b/lib/composer/composer/autoload_static.php
index 8c87d90156d..5771a621afe 100644
--- a/lib/composer/composer/autoload_static.php
+++ b/lib/composer/composer/autoload_static.php
@@ -878,6 +878,7 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2
'OCP\\TaskProcessing\\TaskTypes\\ContextWrite' => __DIR__ . '/../../..' . '/lib/public/TaskProcessing/TaskTypes/ContextWrite.php',
'OCP\\TaskProcessing\\TaskTypes\\GenerateEmoji' => __DIR__ . '/../../..' . '/lib/public/TaskProcessing/TaskTypes/GenerateEmoji.php',
'OCP\\TaskProcessing\\TaskTypes\\TextToImage' => __DIR__ . '/../../..' . '/lib/public/TaskProcessing/TaskTypes/TextToImage.php',
+ 'OCP\\TaskProcessing\\TaskTypes\\TextToSpeech' => __DIR__ . '/../../..' . '/lib/public/TaskProcessing/TaskTypes/TextToSpeech.php',
'OCP\\TaskProcessing\\TaskTypes\\TextToText' => __DIR__ . '/../../..' . '/lib/public/TaskProcessing/TaskTypes/TextToText.php',
'OCP\\TaskProcessing\\TaskTypes\\TextToTextChangeTone' => __DIR__ . '/../../..' . '/lib/public/TaskProcessing/TaskTypes/TextToTextChangeTone.php',
'OCP\\TaskProcessing\\TaskTypes\\TextToTextChat' => __DIR__ . '/../../..' . '/lib/public/TaskProcessing/TaskTypes/TextToTextChat.php',
@@ -1412,6 +1413,7 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2
'OC\\Core\\Db\\ProfileConfigMapper' => __DIR__ . '/../../..' . '/core/Db/ProfileConfigMapper.php',
'OC\\Core\\Events\\BeforePasswordResetEvent' => __DIR__ . '/../../..' . '/core/Events/BeforePasswordResetEvent.php',
'OC\\Core\\Events\\PasswordResetEvent' => __DIR__ . '/../../..' . '/core/Events/PasswordResetEvent.php',
+ 'OC\\Core\\Exception\\LoginFlowV2ClientForbiddenException' => __DIR__ . '/../../..' . '/core/Exception/LoginFlowV2ClientForbiddenException.php',
'OC\\Core\\Exception\\LoginFlowV2NotFoundException' => __DIR__ . '/../../..' . '/core/Exception/LoginFlowV2NotFoundException.php',
'OC\\Core\\Exception\\ResetPasswordException' => __DIR__ . '/../../..' . '/core/Exception/ResetPasswordException.php',
'OC\\Core\\Listener\\BeforeMessageLoggedEventListener' => __DIR__ . '/../../..' . '/core/Listener/BeforeMessageLoggedEventListener.php',
diff --git a/lib/l10n/de.js b/lib/l10n/de.js
index 565432632e8..cf3ea1d59ba 100644
--- a/lib/l10n/de.js
+++ b/lib/l10n/de.js
@@ -101,7 +101,7 @@ OC.L10N.register(
"Invalid parent path" : "Ungültiger übergeordneter Pfad",
"File already exists" : "Datei bereits vorhanden",
"Invalid path" : "Ungültiger Pfad",
- "Failed to create file from template" : "Fehler beim Erstellen der Datei aus Vorlage",
+ "Failed to create file from template" : "Datei konnte nicht aus Vorlage erstellt werden",
"Templates" : "Vorlagen",
"Storage %s cannot be moved" : "Speicherplatz %s kann nicht verschoben werden",
"Moving a share (%s) into a shared folder is not allowed" : "Verschieben einer Freigabe (%s) in einen freigegebenen Ordner ist unzulässig",
diff --git a/lib/l10n/de.json b/lib/l10n/de.json
index f9b01867ab0..b40c32376cd 100644
--- a/lib/l10n/de.json
+++ b/lib/l10n/de.json
@@ -99,7 +99,7 @@
"Invalid parent path" : "Ungültiger übergeordneter Pfad",
"File already exists" : "Datei bereits vorhanden",
"Invalid path" : "Ungültiger Pfad",
- "Failed to create file from template" : "Fehler beim Erstellen der Datei aus Vorlage",
+ "Failed to create file from template" : "Datei konnte nicht aus Vorlage erstellt werden",
"Templates" : "Vorlagen",
"Storage %s cannot be moved" : "Speicherplatz %s kann nicht verschoben werden",
"Moving a share (%s) into a shared folder is not allowed" : "Verschieben einer Freigabe (%s) in einen freigegebenen Ordner ist unzulässig",
diff --git a/lib/l10n/de_DE.js b/lib/l10n/de_DE.js
index d43d052a549..80b0ee32bd4 100644
--- a/lib/l10n/de_DE.js
+++ b/lib/l10n/de_DE.js
@@ -101,7 +101,7 @@ OC.L10N.register(
"Invalid parent path" : "Ungültiger übergeordneter Pfad",
"File already exists" : "Datei bereits vorhanden",
"Invalid path" : "Ungültiger Pfad",
- "Failed to create file from template" : "Fehler beim Erstellen der Datei aus Vorlage",
+ "Failed to create file from template" : "Datei konnte nicht aus Vorlage erstellt werden",
"Templates" : "Vorlagen",
"Storage %s cannot be moved" : "Speicherplatz %s kann nicht verschoben werden",
"Moving a share (%s) into a shared folder is not allowed" : "Verschieben einer Freigabe (%s) in einen freigegebenen Ordner ist unzulässig",
@@ -313,7 +313,7 @@ OC.L10N.register(
"Your data directory is invalid." : "Ihr Datenverzeichnis ist ungültig.",
"Ensure there is a file called \"%1$s\" in the root of the data directory. It should have the content: \"%2$s\"" : "Stellen Sie sicher, dass eine Datei \"%1$s\" im Wurzelverzeichnis des Datenverzeichnisses existiert. Sie sollte folgenden Inhalt haben: \"%2$s\"",
"Action \"%s\" not supported or implemented." : "Aktion \"%s\" wird nicht unterstützt oder ist nicht implementiert.",
- "Authentication failed, wrong token or provider ID given" : "Authentifizierung ist fehlgeschlagen. Falsches Token oder Provider-ID wurde übertragen.",
+ "Authentication failed, wrong token or provider ID given" : "Authentifizierung fehlgeschlagen, falsches Token oder falsche Provider-ID angegeben",
"Parameters missing in order to complete the request. Missing Parameters: \"%s\"" : "Es fehlen Parameter um die Anfrage zu bearbeiten. Fehlende Parameter: \"%s\"",
"ID \"%1$s\" already used by cloud federation provider \"%2$s\"" : "ID \"%1$s\" wird bereits von Cloud-Federation-Provider \"%2$s\" verwendet.",
"Cloud Federation Provider with ID: \"%s\" does not exist." : "Cloud-Federation-Provider mit ID: \"%s\" ist nicht vorhanden.",
diff --git a/lib/l10n/de_DE.json b/lib/l10n/de_DE.json
index 9e974ad5fac..9354b0bcdf6 100644
--- a/lib/l10n/de_DE.json
+++ b/lib/l10n/de_DE.json
@@ -99,7 +99,7 @@
"Invalid parent path" : "Ungültiger übergeordneter Pfad",
"File already exists" : "Datei bereits vorhanden",
"Invalid path" : "Ungültiger Pfad",
- "Failed to create file from template" : "Fehler beim Erstellen der Datei aus Vorlage",
+ "Failed to create file from template" : "Datei konnte nicht aus Vorlage erstellt werden",
"Templates" : "Vorlagen",
"Storage %s cannot be moved" : "Speicherplatz %s kann nicht verschoben werden",
"Moving a share (%s) into a shared folder is not allowed" : "Verschieben einer Freigabe (%s) in einen freigegebenen Ordner ist unzulässig",
@@ -311,7 +311,7 @@
"Your data directory is invalid." : "Ihr Datenverzeichnis ist ungültig.",
"Ensure there is a file called \"%1$s\" in the root of the data directory. It should have the content: \"%2$s\"" : "Stellen Sie sicher, dass eine Datei \"%1$s\" im Wurzelverzeichnis des Datenverzeichnisses existiert. Sie sollte folgenden Inhalt haben: \"%2$s\"",
"Action \"%s\" not supported or implemented." : "Aktion \"%s\" wird nicht unterstützt oder ist nicht implementiert.",
- "Authentication failed, wrong token or provider ID given" : "Authentifizierung ist fehlgeschlagen. Falsches Token oder Provider-ID wurde übertragen.",
+ "Authentication failed, wrong token or provider ID given" : "Authentifizierung fehlgeschlagen, falsches Token oder falsche Provider-ID angegeben",
"Parameters missing in order to complete the request. Missing Parameters: \"%s\"" : "Es fehlen Parameter um die Anfrage zu bearbeiten. Fehlende Parameter: \"%s\"",
"ID \"%1$s\" already used by cloud federation provider \"%2$s\"" : "ID \"%1$s\" wird bereits von Cloud-Federation-Provider \"%2$s\" verwendet.",
"Cloud Federation Provider with ID: \"%s\" does not exist." : "Cloud-Federation-Provider mit ID: \"%s\" ist nicht vorhanden.",
diff --git a/lib/l10n/et_EE.js b/lib/l10n/et_EE.js
index 7a32b1cec33..3940c73112c 100644
--- a/lib/l10n/et_EE.js
+++ b/lib/l10n/et_EE.js
@@ -2,9 +2,13 @@ OC.L10N.register(
"lib",
{
"Cannot write into \"config\" directory!" : "Ei saa kirjutada „config“ kausta!!",
+ "This can usually be fixed by giving the web server write access to the config directory." : "Tavaliselt saad selle lahendada andes veebiserverile õigused seadistuse kausta kirjutamiseks",
+ "But, if you prefer to keep config.php file read only, set the option \"config_is_read_only\" to true in it." : "Aga kui soovid, et seadistuste fail ei peaks olema veebiserveri poolt muudetav, siis palun määra seadistusvõtme „config_is_read_only“ väärtuseks true.",
"See %s" : "Vaata %s",
+ "Application %1$s is not present or has a non-compatible version with this server. Please check the apps directory." : "Rakendust „%1$s“ pole serverisse paigaldatud või pole tema versioon ühilduv selle serveriga. Palun kontrolli paigaldatud rakendusi.",
"Sample configuration detected" : "Tuvastati näidisseaded",
"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" : "Tuvastati, et kopeeriti näidisseaded. See võib lõhkuda sinu saidi ja see pole toetatud. Palun loe enne faili config.php muutmist dokumentatsiooni",
+ "The page could not be found on the server." : "Seda lehte ei õnnestunud serverist leida.",
"%s email verification" : "E-postiaadressi kinnitamine: %s",
"Email verification" : "E-postiaadressi kinnitamine",
"Click the following button to confirm your email." : "Oma e-postiaadressi kinnitamiseks klõpsi järgmisel nupul.",
@@ -17,6 +21,7 @@ OC.L10N.register(
"%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s ja %5$s",
"PHP %s or higher is required." : "PHP %s või uuem on nõutav.",
"PHP with a version lower than %s is required." : "Nõutud on PHP madalama versiooniga kui %s.",
+ "%sbit or higher PHP required." : "Vajalik on %s-bitine või parem PHP versioon.",
"The following architectures are supported: %s" : "Toetatud on järgnevad arhitektuurid: %s",
"The following databases are supported: %s" : "Toetatud on järgnevad andmebaasid: %s",
"The command line tool %s could not be found" : "Käsurea töövahendit %s ei leitud",
@@ -31,9 +36,11 @@ OC.L10N.register(
"Wiping of device %s has started" : "Andmete kustutamine seadmes „%s“ algas",
"Wiping of device »%s« has started" : "Andmete kustutamine seadmes „%s“ algas",
"»%s« started remote wipe" : "„%s“ alustas kaugseadme andmete kustutamist",
+ "Device or application »%s« has started the remote wipe process. You will receive another email once the process has finished" : "„%s“ seade või rakendus on alustanud kaugkustutamise protsessi. Selle lõppemisel saad veel ühe teavitava e-kirja",
"Wiping of device %s has finished" : "Andmete kustutamine seadmes „%s“ lõppes",
"Wiping of device »%s« has finished" : "Andmete kustutamine seadmes „%s“ lõppes",
"»%s« finished remote wipe" : "„%s“ lõpetas kaugseadme andmete kustutamise",
+ "Device or application »%s« has finished the remote wipe process." : "„%s“ seade või rakendus on lõpetanud kaugkustutamise protsessi.",
"Remote wipe started" : "Kaugkustutamine on alanud",
"A remote wipe was started on device %s" : "„%s“ seadme kaugkustutamine on alanud",
"Remote wipe finished" : "Kaugkustutamine on lõppenud",
@@ -99,6 +106,7 @@ OC.L10N.register(
"Filename contains at least one invalid character" : "Failinimes on vähemalt üks keelatud märk",
"Filename is too long" : "Failinimi on liiga pikk",
"Empty filename is not allowed" : "Tühi failinimi pole lubatud",
+ "App \"%s\" cannot be installed because appinfo file cannot be read." : "Kuna „appinfo“ faili pole võimalik lugeda, siis „%s“ rakendust ei saa paigaldada.",
"App \"%s\" cannot be installed because it is not compatible with this version of the server." : "Kuna ta pole ühilduv selle serveri versiooniga, siis „%s“ rakendust ei saa paigaldada.",
"__language_name__" : "Eesti",
"This is an automatically sent email, please do not reply." : "See on automaatselt saadetud e-kiri, palun ära vasta.",
@@ -130,6 +138,7 @@ OC.L10N.register(
"Pronouns" : "Asesõnad pöördumisel",
"Unknown account" : "Tundmatu kasutajakonto",
"Additional settings" : "Lisaseaded",
+ "Enter the database Login and name for %s" : "Andmebaasi kasutajanimi ning nimi %si jaoks",
"Enter the database Login for %s" : "Sisesta andmebaasi %s kasutajatunnus",
"Enter the database name for %s" : "Sisesta andmebaasi %s nimi",
"You cannot use dots in the database name %s" : "Sa ei tohi kasutada „%s“ andmebaasi nimes punkte",
@@ -153,6 +162,7 @@ OC.L10N.register(
"%1$s shared %2$s with you and wants to add:" : "%1$s jagas sinuga %2$s ning soovib lisada:",
"%1$s shared %2$s with you and wants to add" : "%1$s jagas sinuga %2$s ning soovib lisada",
"%s added a note to a file shared with you" : "%s jagas koos sulle jagatud failiga ka märget",
+ "Passwords are enforced for link and mail shares" : "Linkide ja e-posti teel levitatava jaosmeedia puhul on salasõnade kasutamine nõutav",
"Share recipient is not a valid user" : "Jaosmeedia vastuvõtja pole korrektne kasutaja",
"Share recipient is not a valid group" : "Jaosmeedia vastuvõtja pole korrektne grupp",
"Share recipient should be empty" : "Jaosmeedia vastuvõtja peaks jääma tühjaks",
@@ -176,6 +186,7 @@ OC.L10N.register(
"Sharing is only allowed with group members" : "Jagamine on lubatud vaid grupi liikmetega",
"Sharing %s failed, because this item is already shared with the account %s" : "%s jagamine ebaõnnestus, kuna seda üksust on juba jagatud kontoga %s",
"Group sharing is now allowed" : "Grupile jagamine on nüüd lubatud",
+ "Sharing is only allowed within your own groups" : "Jagamine on lubatud vaid sinu oma grupi liikmetega",
"Path is already shared with this group" : "Asukoht on selle grupiga juba jagatud",
"Link sharing is not allowed" : "Lingi jagamine pole lubatud",
"Public upload is not allowed" : "Avalik üleslaadimine pole lubatud",
@@ -187,7 +198,7 @@ OC.L10N.register(
"Invalid share recipient" : "Vigane jaosmeedia vastuvõtja",
"Group \"%s\" does not exist" : "„%s“ gruppi pole olemas",
"The requested share does not exist anymore" : "Soovitud jagamist enam ei eksisteeri",
- "Could not find category \"%s\"" : "Ei leia kategooriat \"%s\"",
+ "Could not find category \"%s\"" : "Ei leia kategooriat „%s“",
"Input text" : "Sisendtekst",
"The input text" : "Sisendtekst",
"Sunday" : "Pühapäev",
@@ -238,7 +249,13 @@ OC.L10N.register(
"A valid password must be provided" : "Sisesta nõuetele vastav parool",
"The Login is already being used" : "See kasutajanimi on juba kasutusel",
"Could not create account" : "Kasutajakonto loomine ei õnnestunud",
+ "Only the following characters are allowed in an Login: \"a-z\", \"A-Z\", \"0-9\", spaces and \"_.@-'\"" : "Kasutajanimes on lubatud ainult järgmised tähemärgid: „a-z“, „A-Z“, „0-9“, ja „_.@-'“",
+ "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",
"App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "„%1$s“ rakendust ei saa paigaldada, sest järgnev sõltuvus on puudu: %2$s",
"a safe home for all your data" : "turvaline koht sinu andmetele",
@@ -252,13 +269,14 @@ OC.L10N.register(
"Please install one of these locales on your system and restart your web server." : "Palun paigalda mõni neist lokaatidest oma serverisse ning taaskäivita veebiserver.",
"PHP module %s not installed." : "PHP moodulit %s pole paigaldatud.",
"Please ask your server administrator to install the module." : "Palu oma serveri haldajal moodul paigadalda.",
- "PHP setting \"%s\" is not set to \"%s\"." : "PHP seade \"%s\" ei ole \"%s\".",
+ "PHP setting \"%s\" is not set to \"%s\"." : "PHP seadistuse „%s“ väärtuseks ei ole „%s“.",
"Adjusting this setting in php.ini will make Nextcloud run again" : "Selle seadistuse kohendamine php.ini failis võimaldab sul Nextcloudi uuesti tööle saada",
"This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "See on tõenäoliselt põhjustatud puhver/kiirendist nagu Zend OPcache või eAccelerator.",
"PHP modules have been installed, but they are still listed as missing?" : "PHP moodulid on paigaldatud, kuid neid näitatakse endiselt kui puuduolevad?",
"Please ask your server administrator to restart the web server." : "Palu oma serveri haldajal veebiserver taaskäivitada.",
"Your data directory must be an absolute path." : "Andmekausta asukoht peab olema absoluutne aadress.",
"Your data directory is invalid." : "Sinu andmekataloog on vigane",
+ "Ensure there is a file called \"%1$s\" in the root of the data directory. It should have the content: \"%2$s\"" : "Palun taga, et andmete juurkaustas leidub fail „%1$s“, mille sisuks on „%2$s“",
"Action \"%s\" not supported or implemented." : "„%s“ tegevus pole toetatud või implementeeritud.",
"Parameters missing in order to complete the request. Missing Parameters: \"%s\"" : "Päringu lõpetamiseks on puudu järgmised parameetrid; „%s“",
"Cloud Federation Provider with ID: \"%s\" does not exist." : "Liitpilve teenusepakkujat tunnusega „%s“ pole olemas.",
diff --git a/lib/l10n/et_EE.json b/lib/l10n/et_EE.json
index e8db1891012..3a9716b4719 100644
--- a/lib/l10n/et_EE.json
+++ b/lib/l10n/et_EE.json
@@ -1,8 +1,12 @@
{ "translations": {
"Cannot write into \"config\" directory!" : "Ei saa kirjutada „config“ kausta!!",
+ "This can usually be fixed by giving the web server write access to the config directory." : "Tavaliselt saad selle lahendada andes veebiserverile õigused seadistuse kausta kirjutamiseks",
+ "But, if you prefer to keep config.php file read only, set the option \"config_is_read_only\" to true in it." : "Aga kui soovid, et seadistuste fail ei peaks olema veebiserveri poolt muudetav, siis palun määra seadistusvõtme „config_is_read_only“ väärtuseks true.",
"See %s" : "Vaata %s",
+ "Application %1$s is not present or has a non-compatible version with this server. Please check the apps directory." : "Rakendust „%1$s“ pole serverisse paigaldatud või pole tema versioon ühilduv selle serveriga. Palun kontrolli paigaldatud rakendusi.",
"Sample configuration detected" : "Tuvastati näidisseaded",
"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" : "Tuvastati, et kopeeriti näidisseaded. See võib lõhkuda sinu saidi ja see pole toetatud. Palun loe enne faili config.php muutmist dokumentatsiooni",
+ "The page could not be found on the server." : "Seda lehte ei õnnestunud serverist leida.",
"%s email verification" : "E-postiaadressi kinnitamine: %s",
"Email verification" : "E-postiaadressi kinnitamine",
"Click the following button to confirm your email." : "Oma e-postiaadressi kinnitamiseks klõpsi järgmisel nupul.",
@@ -15,6 +19,7 @@
"%1$s, %2$s, %3$s, %4$s and %5$s" : "%1$s, %2$s, %3$s, %4$s ja %5$s",
"PHP %s or higher is required." : "PHP %s või uuem on nõutav.",
"PHP with a version lower than %s is required." : "Nõutud on PHP madalama versiooniga kui %s.",
+ "%sbit or higher PHP required." : "Vajalik on %s-bitine või parem PHP versioon.",
"The following architectures are supported: %s" : "Toetatud on järgnevad arhitektuurid: %s",
"The following databases are supported: %s" : "Toetatud on järgnevad andmebaasid: %s",
"The command line tool %s could not be found" : "Käsurea töövahendit %s ei leitud",
@@ -29,9 +34,11 @@
"Wiping of device %s has started" : "Andmete kustutamine seadmes „%s“ algas",
"Wiping of device »%s« has started" : "Andmete kustutamine seadmes „%s“ algas",
"»%s« started remote wipe" : "„%s“ alustas kaugseadme andmete kustutamist",
+ "Device or application »%s« has started the remote wipe process. You will receive another email once the process has finished" : "„%s“ seade või rakendus on alustanud kaugkustutamise protsessi. Selle lõppemisel saad veel ühe teavitava e-kirja",
"Wiping of device %s has finished" : "Andmete kustutamine seadmes „%s“ lõppes",
"Wiping of device »%s« has finished" : "Andmete kustutamine seadmes „%s“ lõppes",
"»%s« finished remote wipe" : "„%s“ lõpetas kaugseadme andmete kustutamise",
+ "Device or application »%s« has finished the remote wipe process." : "„%s“ seade või rakendus on lõpetanud kaugkustutamise protsessi.",
"Remote wipe started" : "Kaugkustutamine on alanud",
"A remote wipe was started on device %s" : "„%s“ seadme kaugkustutamine on alanud",
"Remote wipe finished" : "Kaugkustutamine on lõppenud",
@@ -97,6 +104,7 @@
"Filename contains at least one invalid character" : "Failinimes on vähemalt üks keelatud märk",
"Filename is too long" : "Failinimi on liiga pikk",
"Empty filename is not allowed" : "Tühi failinimi pole lubatud",
+ "App \"%s\" cannot be installed because appinfo file cannot be read." : "Kuna „appinfo“ faili pole võimalik lugeda, siis „%s“ rakendust ei saa paigaldada.",
"App \"%s\" cannot be installed because it is not compatible with this version of the server." : "Kuna ta pole ühilduv selle serveri versiooniga, siis „%s“ rakendust ei saa paigaldada.",
"__language_name__" : "Eesti",
"This is an automatically sent email, please do not reply." : "See on automaatselt saadetud e-kiri, palun ära vasta.",
@@ -128,6 +136,7 @@
"Pronouns" : "Asesõnad pöördumisel",
"Unknown account" : "Tundmatu kasutajakonto",
"Additional settings" : "Lisaseaded",
+ "Enter the database Login and name for %s" : "Andmebaasi kasutajanimi ning nimi %si jaoks",
"Enter the database Login for %s" : "Sisesta andmebaasi %s kasutajatunnus",
"Enter the database name for %s" : "Sisesta andmebaasi %s nimi",
"You cannot use dots in the database name %s" : "Sa ei tohi kasutada „%s“ andmebaasi nimes punkte",
@@ -151,6 +160,7 @@
"%1$s shared %2$s with you and wants to add:" : "%1$s jagas sinuga %2$s ning soovib lisada:",
"%1$s shared %2$s with you and wants to add" : "%1$s jagas sinuga %2$s ning soovib lisada",
"%s added a note to a file shared with you" : "%s jagas koos sulle jagatud failiga ka märget",
+ "Passwords are enforced for link and mail shares" : "Linkide ja e-posti teel levitatava jaosmeedia puhul on salasõnade kasutamine nõutav",
"Share recipient is not a valid user" : "Jaosmeedia vastuvõtja pole korrektne kasutaja",
"Share recipient is not a valid group" : "Jaosmeedia vastuvõtja pole korrektne grupp",
"Share recipient should be empty" : "Jaosmeedia vastuvõtja peaks jääma tühjaks",
@@ -174,6 +184,7 @@
"Sharing is only allowed with group members" : "Jagamine on lubatud vaid grupi liikmetega",
"Sharing %s failed, because this item is already shared with the account %s" : "%s jagamine ebaõnnestus, kuna seda üksust on juba jagatud kontoga %s",
"Group sharing is now allowed" : "Grupile jagamine on nüüd lubatud",
+ "Sharing is only allowed within your own groups" : "Jagamine on lubatud vaid sinu oma grupi liikmetega",
"Path is already shared with this group" : "Asukoht on selle grupiga juba jagatud",
"Link sharing is not allowed" : "Lingi jagamine pole lubatud",
"Public upload is not allowed" : "Avalik üleslaadimine pole lubatud",
@@ -185,7 +196,7 @@
"Invalid share recipient" : "Vigane jaosmeedia vastuvõtja",
"Group \"%s\" does not exist" : "„%s“ gruppi pole olemas",
"The requested share does not exist anymore" : "Soovitud jagamist enam ei eksisteeri",
- "Could not find category \"%s\"" : "Ei leia kategooriat \"%s\"",
+ "Could not find category \"%s\"" : "Ei leia kategooriat „%s“",
"Input text" : "Sisendtekst",
"The input text" : "Sisendtekst",
"Sunday" : "Pühapäev",
@@ -236,7 +247,13 @@
"A valid password must be provided" : "Sisesta nõuetele vastav parool",
"The Login is already being used" : "See kasutajanimi on juba kasutusel",
"Could not create account" : "Kasutajakonto loomine ei õnnestunud",
+ "Only the following characters are allowed in an Login: \"a-z\", \"A-Z\", \"0-9\", spaces and \"_.@-'\"" : "Kasutajanimes on lubatud ainult järgmised tähemärgid: „a-z“, „A-Z“, „0-9“, ja „_.@-'“",
+ "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",
"App \"%1$s\" cannot be installed because the following dependencies are not fulfilled: %2$s" : "„%1$s“ rakendust ei saa paigaldada, sest järgnev sõltuvus on puudu: %2$s",
"a safe home for all your data" : "turvaline koht sinu andmetele",
@@ -250,13 +267,14 @@
"Please install one of these locales on your system and restart your web server." : "Palun paigalda mõni neist lokaatidest oma serverisse ning taaskäivita veebiserver.",
"PHP module %s not installed." : "PHP moodulit %s pole paigaldatud.",
"Please ask your server administrator to install the module." : "Palu oma serveri haldajal moodul paigadalda.",
- "PHP setting \"%s\" is not set to \"%s\"." : "PHP seade \"%s\" ei ole \"%s\".",
+ "PHP setting \"%s\" is not set to \"%s\"." : "PHP seadistuse „%s“ väärtuseks ei ole „%s“.",
"Adjusting this setting in php.ini will make Nextcloud run again" : "Selle seadistuse kohendamine php.ini failis võimaldab sul Nextcloudi uuesti tööle saada",
"This is probably caused by a cache/accelerator such as Zend OPcache or eAccelerator." : "See on tõenäoliselt põhjustatud puhver/kiirendist nagu Zend OPcache või eAccelerator.",
"PHP modules have been installed, but they are still listed as missing?" : "PHP moodulid on paigaldatud, kuid neid näitatakse endiselt kui puuduolevad?",
"Please ask your server administrator to restart the web server." : "Palu oma serveri haldajal veebiserver taaskäivitada.",
"Your data directory must be an absolute path." : "Andmekausta asukoht peab olema absoluutne aadress.",
"Your data directory is invalid." : "Sinu andmekataloog on vigane",
+ "Ensure there is a file called \"%1$s\" in the root of the data directory. It should have the content: \"%2$s\"" : "Palun taga, et andmete juurkaustas leidub fail „%1$s“, mille sisuks on „%2$s“",
"Action \"%s\" not supported or implemented." : "„%s“ tegevus pole toetatud või implementeeritud.",
"Parameters missing in order to complete the request. Missing Parameters: \"%s\"" : "Päringu lõpetamiseks on puudu järgmised parameetrid; „%s“",
"Cloud Federation Provider with ID: \"%s\" does not exist." : "Liitpilve teenusepakkujat tunnusega „%s“ pole olemas.",
diff --git a/lib/l10n/tr.js b/lib/l10n/tr.js
index a03970a1c3b..ad607e4b9cc 100644
--- a/lib/l10n/tr.js
+++ b/lib/l10n/tr.js
@@ -201,6 +201,7 @@ OC.L10N.register(
"Path is already shared with this group" : "Bu yol bu grup ile zaten paylaşılmış",
"Link sharing is not allowed" : "Bağlantı paylaşımına izin verilmiyor",
"Public upload is not allowed" : "Herkese açık yüklemeye izin verilmiyor",
+ "You cannot share a folder that contains other shares" : "Başka paylaşımların bulunduğu bir klasörü paylaşamazsınız",
"Sharing is disabled" : "Paylaşım kullanımdan kaldırılmış",
"Sharing is disabled for you" : "Paylaşım sizin için kullanımdan kaldırılmış",
"Cannot share with the share owner" : "Paylaşımı sahibi ile paylaşamazsınız",
@@ -272,6 +273,7 @@ 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",
diff --git a/lib/l10n/tr.json b/lib/l10n/tr.json
index a066cd1a337..9a89aab5b92 100644
--- a/lib/l10n/tr.json
+++ b/lib/l10n/tr.json
@@ -199,6 +199,7 @@
"Path is already shared with this group" : "Bu yol bu grup ile zaten paylaşılmış",
"Link sharing is not allowed" : "Bağlantı paylaşımına izin verilmiyor",
"Public upload is not allowed" : "Herkese açık yüklemeye izin verilmiyor",
+ "You cannot share a folder that contains other shares" : "Başka paylaşımların bulunduğu bir klasörü paylaşamazsınız",
"Sharing is disabled" : "Paylaşım kullanımdan kaldırılmış",
"Sharing is disabled for you" : "Paylaşım sizin için kullanımdan kaldırılmış",
"Cannot share with the share owner" : "Paylaşımı sahibi ile paylaşamazsınız",
@@ -270,6 +271,7 @@
"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",
diff --git a/lib/l10n/uk.js b/lib/l10n/uk.js
index 3d29de9a772..f63a5bda6bb 100644
--- a/lib/l10n/uk.js
+++ b/lib/l10n/uk.js
@@ -336,6 +336,7 @@ OC.L10N.register(
"Generate image" : "Зґенерувати зображення",
"Prompt" : "Запрошення",
"Chat" : "Чат",
+ "Available tools" : "Доступні інструменти",
"Generates a possible headline for a text." : "Створює ймовірний заголовок тексту.",
"Text" : "Текст",
"Summarize" : "Підсумок",
diff --git a/lib/l10n/uk.json b/lib/l10n/uk.json
index 4a4fba617b4..dec967a6c07 100644
--- a/lib/l10n/uk.json
+++ b/lib/l10n/uk.json
@@ -334,6 +334,7 @@
"Generate image" : "Зґенерувати зображення",
"Prompt" : "Запрошення",
"Chat" : "Чат",
+ "Available tools" : "Доступні інструменти",
"Generates a possible headline for a text." : "Створює ймовірний заголовок тексту.",
"Text" : "Текст",
"Summarize" : "Підсумок",
diff --git a/lib/l10n/uz.js b/lib/l10n/uz.js
index b3d7be96b38..10dc2ccabf5 100644
--- a/lib/l10n/uz.js
+++ b/lib/l10n/uz.js
@@ -31,6 +31,7 @@ OC.L10N.register(
"Authentication error" : "Authentication error",
"Storage is temporarily not available" : "Storage is temporarily not available",
"Confirmation" : "Tasdiqlash",
+ "Text" : "Matn",
"Translate" : "Tarjima",
"File name is too long" : "File name is too long",
"Users" : "Users",
diff --git a/lib/l10n/uz.json b/lib/l10n/uz.json
index d032d72f931..6a9b2008a78 100644
--- a/lib/l10n/uz.json
+++ b/lib/l10n/uz.json
@@ -29,6 +29,7 @@
"Authentication error" : "Authentication error",
"Storage is temporarily not available" : "Storage is temporarily not available",
"Confirmation" : "Tasdiqlash",
+ "Text" : "Matn",
"Translate" : "Tarjima",
"File name is too long" : "File name is too long",
"Users" : "Users",
diff --git a/lib/private/AppConfig.php b/lib/private/AppConfig.php
index 1228b9c20e3..092d37c3338 100644
--- a/lib/private/AppConfig.php
+++ b/lib/private/AppConfig.php
@@ -1423,6 +1423,9 @@ class AppConfig implements IAppConfig {
'globalsiteselector' => [
'/^gss\.jwt\.key$/',
],
+ 'gpgmailer' => [
+ '/^GpgServerKey$/',
+ ],
'integration_discourse' => [
'/^private_key$/',
'/^public_key$/',
@@ -1477,6 +1480,9 @@ class AppConfig implements IAppConfig {
'/^client_secret$/',
'/^oauth_instance_url$/',
],
+ 'maps' => [
+ '/^mapboxAPIKEY$/',
+ ],
'notify_push' => [
'/^cookie$/',
],
@@ -1514,12 +1520,12 @@ class AppConfig implements IAppConfig {
'/^slogan$/',
'/^url$/',
],
- 'user_ldap' => [
- '/^(s..)?ldap_agent_password$/',
- ],
'twofactor_gateway' => [
'/^.*token$/',
],
+ 'user_ldap' => [
+ '/^(s..)?ldap_agent_password$/',
+ ],
'user_saml' => [
'/^idp-x509cert$/',
],
diff --git a/lib/private/AppFramework/Http/Dispatcher.php b/lib/private/AppFramework/Http/Dispatcher.php
index d63a9108b47..d129a7d770b 100644
--- a/lib/private/AppFramework/Http/Dispatcher.php
+++ b/lib/private/AppFramework/Http/Dispatcher.php
@@ -90,9 +90,11 @@ class Dispatcher {
* @param Controller $controller the controller which will be called
* @param string $methodName the method name which will be called on
* the controller
- * @return array $array[0] contains a string with the http main header,
- * $array[1] contains headers in the form: $key => value, $array[2] contains
- * the response output
+ * @return array $array[0] contains the http status header as a string,
+ * $array[1] contains response headers as an array,
+ * $array[2] contains response cookies as an array,
+ * $array[3] contains the response output as a string,
+ * $array[4] contains the response object
* @throws \Exception
*/
public function dispatch(Controller $controller, string $methodName): array {
diff --git a/lib/private/DB/Connection.php b/lib/private/DB/Connection.php
index eecf83ace95..96dd578b2ef 100644
--- a/lib/private/DB/Connection.php
+++ b/lib/private/DB/Connection.php
@@ -414,7 +414,7 @@ class Connection extends PrimaryReadReplicaConnection {
$sql = $this->finishQuery($sql);
$this->queriesExecuted++;
- $this->logQueryToFile($sql);
+ $this->logQueryToFile($sql, $params);
try {
return parent::executeQuery($sql, $params, $types, $qcp);
} catch (\Exception $e) {
@@ -461,7 +461,7 @@ class Connection extends PrimaryReadReplicaConnection {
}
$sql = $this->finishQuery($sql);
$this->queriesExecuted++;
- $this->logQueryToFile($sql);
+ $this->logQueryToFile($sql, $params);
try {
return (int)parent::executeStatement($sql, $params, $types);
} catch (\Exception $e) {
@@ -470,14 +470,19 @@ class Connection extends PrimaryReadReplicaConnection {
}
}
- protected function logQueryToFile(string $sql): void {
+ protected function logQueryToFile(string $sql, array $params): void {
$logFile = $this->systemConfig->getValue('query_log_file');
if ($logFile !== '' && is_writable(dirname($logFile)) && (!file_exists($logFile) || is_writable($logFile))) {
$prefix = '';
if ($this->systemConfig->getValue('query_log_file_requestid') === 'yes') {
$prefix .= Server::get(IRequestId::class)->getId() . "\t";
}
+
$postfix = '';
+ if ($this->systemConfig->getValue('query_log_file_parameters') === 'yes') {
+ $postfix .= '; ' . json_encode($params);
+ }
+
if ($this->systemConfig->getValue('query_log_file_backtrace') === 'yes') {
$trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
array_pop($trace);
diff --git a/lib/private/Federation/CloudIdManager.php b/lib/private/Federation/CloudIdManager.php
index a7d36eda4a0..7e7adda3d39 100644
--- a/lib/private/Federation/CloudIdManager.php
+++ b/lib/private/Federation/CloudIdManager.php
@@ -106,7 +106,10 @@ class CloudIdManager implements ICloudIdManager {
$user = substr($id, 0, $lastValidAtPos);
$remote = substr($id, $lastValidAtPos + 1);
- $this->userManager->validateUserId($user);
+ // We accept slightly more chars when working with federationId than with a local userId.
+ // We remove those eventual chars from the UserId before using
+ // the IUserManager API to confirm its format.
+ $this->userManager->validateUserId(str_replace('=', '-', $user));
if (!empty($user) && !empty($remote)) {
$remote = $this->ensureDefaultProtocol($remote);
diff --git a/lib/private/Files/ObjectStore/S3ConnectionTrait.php b/lib/private/Files/ObjectStore/S3ConnectionTrait.php
index 7ddf2abed1d..b7017583dc2 100644
--- a/lib/private/Files/ObjectStore/S3ConnectionTrait.php
+++ b/lib/private/Files/ObjectStore/S3ConnectionTrait.php
@@ -106,6 +106,10 @@ trait S3ConnectionTrait {
'connect_timeout' => 5
],
'use_aws_shared_config_files' => false,
+ 'retries' => [
+ 'mode' => 'standard',
+ 'max_attempts' => 5,
+ ],
];
if ($this->params['s3-accelerate']) {
diff --git a/lib/private/NavigationManager.php b/lib/private/NavigationManager.php
index c2125bc6f8a..fb0795376bb 100644
--- a/lib/private/NavigationManager.php
+++ b/lib/private/NavigationManager.php
@@ -77,7 +77,7 @@ class NavigationManager implements INavigationManager {
$this->closureEntries[] = $entry;
return;
}
- $this->init();
+ $this->init(false);
$id = $entry['id'];
@@ -123,10 +123,6 @@ class NavigationManager implements INavigationManager {
*/
public function getAll(string $type = 'link'): array {
$this->init();
- foreach ($this->closureEntries as $c) {
- $this->add($c());
- }
- $this->closureEntries = [];
$result = $this->entries;
if ($type !== 'all') {
@@ -212,7 +208,13 @@ class NavigationManager implements INavigationManager {
return $this->activeEntry;
}
- private function init() {
+ private function init(bool $resolveClosures = true): void {
+ if ($resolveClosures) {
+ while ($c = array_pop($this->closureEntries)) {
+ $this->add($c());
+ }
+ }
+
if ($this->init) {
return;
}
@@ -420,11 +422,6 @@ class NavigationManager implements INavigationManager {
public function get(string $id): ?array {
$this->init();
- foreach ($this->closureEntries as $c) {
- $this->add($c());
- }
- $this->closureEntries = [];
-
return $this->entries[$id];
}
diff --git a/lib/private/Preview/Generator.php b/lib/private/Preview/Generator.php
index 66069beaecc..b95971d0085 100644
--- a/lib/private/Preview/Generator.php
+++ b/lib/private/Preview/Generator.php
@@ -119,7 +119,7 @@ class Generator {
$maxPreviewImage = null; // only load the image when we need it
if ($maxPreview->getSize() === 0) {
$maxPreview->delete();
- $this->logger->error("Max preview generated for file {$file->getPath()} has size 0, deleting and throwing exception.");
+ $this->logger->error('Max preview generated for file {path} has size 0, deleting and throwing exception.', ['path' => $file->getPath()]);
throw new NotFoundException('Max preview size 0, invalid!');
}
diff --git a/lib/private/Preview/Movie.php b/lib/private/Preview/Movie.php
index 46462dfa592..7de543198f4 100644
--- a/lib/private/Preview/Movie.php
+++ b/lib/private/Preview/Movie.php
@@ -54,10 +54,15 @@ class Movie extends ProviderV2 {
$result = null;
if ($this->useTempFile($file)) {
- // try downloading 5 MB first as it's likely that the first frames are present there
- // in some cases this doesn't work for example when the moov atom is at the
- // end of the file, so if it fails we fall back to getting the full file
- $sizeAttempts = [5242880, null];
+ // Try downloading 5 MB first, as it's likely that the first frames are present there.
+ // In some cases this doesn't work, for example when the moov atom is at the
+ // end of the file, so if it fails we fall back to getting the full file.
+ // Unless the file is not local (e.g. S3) as we do not want to download the whole (e.g. 37Gb) file
+ if ($file->getStorage()->isLocal()) {
+ $sizeAttempts = [5242880, null];
+ } else {
+ $sizeAttempts = [5242880];
+ }
} else {
// size is irrelevant, only attempt once
$sizeAttempts = [null];
diff --git a/lib/private/Preview/Watcher.php b/lib/private/Preview/Watcher.php
index abddd7b5acb..21f040d8342 100644
--- a/lib/private/Preview/Watcher.php
+++ b/lib/private/Preview/Watcher.php
@@ -8,6 +8,7 @@ declare(strict_types=1);
*/
namespace OC\Preview;
+use OCP\Files\FileInfo;
use OCP\Files\Folder;
use OCP\Files\IAppData;
use OCP\Files\Node;
@@ -37,7 +38,7 @@ class Watcher {
$this->deleteNode($node);
}
- protected function deleteNode(Node $node) {
+ protected function deleteNode(FileInfo $node) {
// We only handle files
if ($node instanceof Folder) {
return;
diff --git a/lib/private/Preview/WatcherConnector.php b/lib/private/Preview/WatcherConnector.php
index ae2a136ca78..c34dd1dde4d 100644
--- a/lib/private/Preview/WatcherConnector.php
+++ b/lib/private/Preview/WatcherConnector.php
@@ -9,43 +9,33 @@ declare(strict_types=1);
namespace OC\Preview;
use OC\SystemConfig;
+use OCA\Files_Versions\Events\VersionRestoredEvent;
+use OCP\EventDispatcher\IEventDispatcher;
use OCP\Files\IRootFolder;
use OCP\Files\Node;
class WatcherConnector {
- /** @var IRootFolder */
- private $root;
-
- /** @var SystemConfig */
- private $config;
-
- /**
- * WatcherConnector constructor.
- *
- * @param IRootFolder $root
- * @param SystemConfig $config
- */
- public function __construct(IRootFolder $root,
- SystemConfig $config) {
- $this->root = $root;
- $this->config = $config;
+ public function __construct(
+ private IRootFolder $root,
+ private SystemConfig $config,
+ private IEventDispatcher $dispatcher,
+ ) {
}
- /**
- * @return Watcher
- */
private function getWatcher(): Watcher {
return \OCP\Server::get(Watcher::class);
}
- public function connectWatcher() {
+ public function connectWatcher(): void {
// Do not connect if we are not setup yet!
if ($this->config->getValue('instanceid', null) !== null) {
$this->root->listen('\OC\Files', 'postWrite', function (Node $node) {
$this->getWatcher()->postWrite($node);
});
- \OC_Hook::connect('\OCP\Versions', 'rollback', $this->getWatcher(), 'versionRollback');
+ $this->dispatcher->addListener(VersionRestoredEvent::class, function (VersionRestoredEvent $event) {
+ $this->getWatcher()->versionRollback(['node' => $event->getVersion()->getSourceFile()]);
+ });
}
}
}
diff --git a/lib/private/Profile/ProfileManager.php b/lib/private/Profile/ProfileManager.php
index 9d3d94fab21..13860286356 100644
--- a/lib/private/Profile/ProfileManager.php
+++ b/lib/private/Profile/ProfileManager.php
@@ -12,6 +12,7 @@ namespace OC\Profile;
use OC\AppFramework\Bootstrap\Coordinator;
use OC\Core\Db\ProfileConfig;
use OC\Core\Db\ProfileConfigMapper;
+use OC\Core\ResponseDefinitions;
use OC\KnownUser\KnownUserService;
use OC\Profile\Actions\EmailAction;
use OC\Profile\Actions\FediverseAction;
@@ -33,6 +34,9 @@ use Psr\Log\LoggerInterface;
use function array_flip;
use function usort;
+/**
+ * @psalm-import-type CoreProfileFields from ResponseDefinitions
+ */
class ProfileManager implements IProfileManager {
/** @var ILinkAction[] */
private array $actions = [];
@@ -223,7 +227,7 @@ class ProfileManager implements IProfileManager {
/**
* Return the profile parameters of the target user that are visible to the visiting user
* in an associative array
- * @return array{userId: string, address?: string|null, biography?: string|null, displayname?: string|null, headline?: string|null, isUserAvatarVisible?: bool, organisation?: string|null, pronouns?: string|null, role?: string|null, actions: list<array{id: string, icon: string, title: string, target: ?string}>}
+ * @psalm-return CoreProfileFields
*/
public function getProfileFields(IUser $targetUser, ?IUser $visitingUser): array {
$account = $this->accountManager->getAccount($targetUser);
diff --git a/lib/private/Security/Normalizer/IpAddress.php b/lib/private/Security/Normalizer/IpAddress.php
index e40dc9ba96b..4d33a7bd632 100644
--- a/lib/private/Security/Normalizer/IpAddress.php
+++ b/lib/private/Security/Normalizer/IpAddress.php
@@ -41,10 +41,21 @@ class IpAddress {
$config = \OCP\Server::get(IConfig::class);
$maskSize = min(64, $config->getSystemValueInt('security.ipv6_normalized_subnet_size', 56));
$maskSize = max(32, $maskSize);
- $mask = pack('VVP', (1 << 32) - 1, (1 << $maskSize - 32) - 1, 0);
+ if (PHP_INT_SIZE === 4) {
+ if ($maskSize === 64) {
+ $value = -1;
+ } elseif ($maskSize === 63) {
+ $value = PHP_INT_MAX;
+ } else {
+ $value = (1 << $maskSize - 32) - 1;
+ }
+ // as long as we support 32bit PHP we cannot use the `P` pack formatter (and not overflow 32bit integer)
+ $mask = pack('VVVV', -1, $value, 0, 0);
+ } else {
+ $mask = pack('VVP', (1 << 32) - 1, (1 << $maskSize - 32) - 1, 0);
+ }
$binary = \inet_pton($ip);
-
return inet_ntop($binary & $mask) . '/' . $maskSize;
}
diff --git a/lib/private/Server.php b/lib/private/Server.php
index 4d79fefd261..545ceacbe81 100644
--- a/lib/private/Server.php
+++ b/lib/private/Server.php
@@ -411,7 +411,8 @@ class Server extends ServerContainer implements IServerContainer {
$previewConnector = new \OC\Preview\WatcherConnector(
$root,
- $c->get(SystemConfig::class)
+ $c->get(SystemConfig::class),
+ $this->get(IEventDispatcher::class)
);
$previewConnector->connectWatcher();
diff --git a/lib/private/TaskProcessing/Manager.php b/lib/private/TaskProcessing/Manager.php
index a701c23d56f..9992310dbbb 100644
--- a/lib/private/TaskProcessing/Manager.php
+++ b/lib/private/TaskProcessing/Manager.php
@@ -584,6 +584,7 @@ class Manager implements IManager {
\OCP\TaskProcessing\TaskTypes\TextToTextChatWithTools::ID => \OCP\Server::get(\OCP\TaskProcessing\TaskTypes\TextToTextChatWithTools::class),
\OCP\TaskProcessing\TaskTypes\ContextAgentInteraction::ID => \OCP\Server::get(\OCP\TaskProcessing\TaskTypes\ContextAgentInteraction::class),
\OCP\TaskProcessing\TaskTypes\TextToTextProofread::ID => \OCP\Server::get(\OCP\TaskProcessing\TaskTypes\TextToTextProofread::class),
+ \OCP\TaskProcessing\TaskTypes\TextToSpeech::ID => \OCP\Server::get(\OCP\TaskProcessing\TaskTypes\TextToSpeech::class),
];
foreach ($context->getTaskProcessingTaskTypes() as $providerServiceRegistration) {
diff --git a/lib/private/Template/JSResourceLocator.php b/lib/private/Template/JSResourceLocator.php
index aad999f939a..a6d2d13a2ad 100644
--- a/lib/private/Template/JSResourceLocator.php
+++ b/lib/private/Template/JSResourceLocator.php
@@ -69,7 +69,7 @@ class JSResourceLocator extends ResourceLocator {
|| $this->appendScriptIfExist($this->serverroot, "dist/$app-$scriptName")
|| $this->appendScriptIfExist($appRoot, $script, $appWebRoot)
|| $this->cacheAndAppendCombineJsonIfExist($this->serverroot, $script . '.json')
- || $this->cacheAndAppendCombineJsonIfExist($appRoot, $script . '.json', $appWebRoot)
+ || $this->cacheAndAppendCombineJsonIfExist($appRoot, $script . '.json', $app)
|| $this->appendScriptIfExist($this->serverroot, $theme_dir . 'core/' . $script)
|| $this->appendScriptIfExist($this->serverroot, 'core/' . $script)
|| (strpos($scriptName, '/') === -1 && ($this->appendScriptIfExist($this->serverroot, $theme_dir . "dist/core-$scriptName")
diff --git a/lib/private/TemplateLayout.php b/lib/private/TemplateLayout.php
index 374972ece22..caffbfceefa 100644
--- a/lib/private/TemplateLayout.php
+++ b/lib/private/TemplateLayout.php
@@ -144,12 +144,6 @@ class TemplateLayout {
$userDisplayName = $user->getDisplayName();
}
- $page->assign('enabledThemes', []);
- if ($this->appManager->isEnabledForUser('theming') && class_exists('\OCA\Theming\Service\ThemesService')) {
- $themesService = Server::get(\OCA\Theming\Service\ThemesService::class);
- $page->assign('enabledThemes', $themesService->getEnabledThemes());
- }
-
$page->assign('user_displayname', $userDisplayName);
$page->assign('user_uid', \OC_User::getUser());
break;
@@ -200,10 +194,9 @@ class TemplateLayout {
// Set body data-theme
try {
$themesService = Server::get(\OCA\Theming\Service\ThemesService::class);
- } catch (\OCP\AppFramework\QueryException) {
+ } catch (\Exception) {
$themesService = null;
}
-
$page->assign('enabledThemes', $themesService?->getEnabledThemes() ?? []);
if ($this->config->getSystemValueBool('installed', false)) {
diff --git a/lib/private/URLGenerator.php b/lib/private/URLGenerator.php
index ad12fae5144..c78ecac0903 100644
--- a/lib/private/URLGenerator.php
+++ b/lib/private/URLGenerator.php
@@ -304,6 +304,11 @@ class URLGenerator implements IURLGenerator {
if ($href === '') {
throw new \InvalidArgumentException('Default navigation entry is missing href: ' . $entryId);
}
+
+ if (str_starts_with($href, $this->getBaseUrl())) {
+ return $href;
+ }
+
if (str_starts_with($href, '/index.php/') && ($this->config->getSystemValueBool('htaccess.IgnoreFrontController', false) || getenv('front_controller_active') === 'true')) {
$href = substr($href, 10);
}
diff --git a/lib/public/Profile/IProfileManager.php b/lib/public/Profile/IProfileManager.php
index 0a1e6733e58..f4e90e39d12 100644
--- a/lib/public/Profile/IProfileManager.php
+++ b/lib/public/Profile/IProfileManager.php
@@ -9,10 +9,12 @@ declare(strict_types=1);
namespace OCP\Profile;
+use OC\Core\ResponseDefinitions;
use OCP\Accounts\IAccountManager;
use OCP\IUser;
/**
+ * @psalm-import-type CoreProfileFields from ResponseDefinitions
* @since 28.0.0
*/
interface IProfileManager {
@@ -83,7 +85,7 @@ interface IProfileManager {
* Return the profile parameters of the target user that are visible to the visiting user
* in an associative array
*
- * @return array{userId: string, address?: string|null, biography?: string|null, displayname?: string|null, headline?: string|null, isUserAvatarVisible?: bool, organisation?: string|null, pronouns?: string|null, role?: string|null, actions: list<array{id: string, icon: string, title: string, target: ?string}>}
+ * @psalm-return CoreProfileFields
* @since 28.0.0
*/
public function getProfileFields(IUser $targetUser, ?IUser $visitingUser): array;
diff --git a/lib/public/TaskProcessing/TaskTypes/TextToSpeech.php b/lib/public/TaskProcessing/TaskTypes/TextToSpeech.php
new file mode 100644
index 00000000000..ce35be32a6f
--- /dev/null
+++ b/lib/public/TaskProcessing/TaskTypes/TextToSpeech.php
@@ -0,0 +1,92 @@
+<?php
+
+declare(strict_types=1);
+
+/**
+ * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+
+namespace OCP\TaskProcessing\TaskTypes;
+
+use OCP\IL10N;
+use OCP\L10N\IFactory;
+use OCP\TaskProcessing\EShapeType;
+use OCP\TaskProcessing\ITaskType;
+use OCP\TaskProcessing\ShapeDescriptor;
+
+/**
+ * This is the task processing task type for speech generation
+ * @since 32.0.0
+ */
+class TextToSpeech implements ITaskType {
+ /**
+ * @since 32.0.0
+ */
+ public const ID = 'core:text2speech';
+
+ private IL10N $l;
+
+ /**
+ * @param IFactory $l10nFactory
+ * @since 32.0.0
+ */
+ public function __construct(
+ IFactory $l10nFactory,
+ ) {
+ $this->l = $l10nFactory->get('lib');
+ }
+
+
+ /**
+ * @inheritDoc
+ * @since 32.0.0
+ */
+ public function getName(): string {
+ return $this->l->t('Generate speech');
+ }
+
+ /**
+ * @inheritDoc
+ * @since 32.0.0
+ */
+ public function getDescription(): string {
+ return $this->l->t('Generate speech from a transcript');
+ }
+
+ /**
+ * @return string
+ * @since 32.0.0
+ */
+ public function getId(): string {
+ return self::ID;
+ }
+
+ /**
+ * @return ShapeDescriptor[]
+ * @since 32.0.0
+ */
+ public function getInputShape(): array {
+ return [
+ 'input' => new ShapeDescriptor(
+ $this->l->t('Prompt'),
+ $this->l->t('Write transcript that you want the assistant to generate speech from'),
+ EShapeType::Text
+ ),
+ ];
+ }
+
+ /**
+ * @return ShapeDescriptor[]
+ * @since 32.0.0
+ */
+ public function getOutputShape(): array {
+ return [
+ 'speech' => new ShapeDescriptor(
+ $this->l->t('Output speech'),
+ $this->l->t('The generated speech'),
+ EShapeType::Audio
+ ),
+ ];
+ }
+}