diff options
Diffstat (limited to 'lib')
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 + ), + ]; + } +} |