diff options
Diffstat (limited to 'lib')
36 files changed, 273 insertions, 21 deletions
diff --git a/lib/composer/composer/autoload_classmap.php b/lib/composer/composer/autoload_classmap.php index 518765507e7..e9fe618f8b6 100644 --- a/lib/composer/composer/autoload_classmap.php +++ b/lib/composer/composer/autoload_classmap.php @@ -1655,6 +1655,7 @@ return array( 'OC\\Repair\\RemoveLinkShares' => $baseDir . '/lib/private/Repair/RemoveLinkShares.php', 'OC\\Repair\\RepairDavShares' => $baseDir . '/lib/private/Repair/RepairDavShares.php', 'OC\\Repair\\RepairInvalidShares' => $baseDir . '/lib/private/Repair/RepairInvalidShares.php', + 'OC\\Repair\\RepairLogoDimension' => $baseDir . '/lib/private/Repair/RepairLogoDimension.php', 'OC\\Repair\\RepairMimeTypes' => $baseDir . '/lib/private/Repair/RepairMimeTypes.php', 'OC\\RichObjectStrings\\Validator' => $baseDir . '/lib/private/RichObjectStrings/Validator.php', 'OC\\Route\\CachingRouter' => $baseDir . '/lib/private/Route/CachingRouter.php', diff --git a/lib/composer/composer/autoload_static.php b/lib/composer/composer/autoload_static.php index 555afe066b5..5f8ea5000ff 100644 --- a/lib/composer/composer/autoload_static.php +++ b/lib/composer/composer/autoload_static.php @@ -1688,6 +1688,7 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2 'OC\\Repair\\RemoveLinkShares' => __DIR__ . '/../../..' . '/lib/private/Repair/RemoveLinkShares.php', 'OC\\Repair\\RepairDavShares' => __DIR__ . '/../../..' . '/lib/private/Repair/RepairDavShares.php', 'OC\\Repair\\RepairInvalidShares' => __DIR__ . '/../../..' . '/lib/private/Repair/RepairInvalidShares.php', + 'OC\\Repair\\RepairLogoDimension' => __DIR__ . '/../../..' . '/lib/private/Repair/RepairLogoDimension.php', 'OC\\Repair\\RepairMimeTypes' => __DIR__ . '/../../..' . '/lib/private/Repair/RepairMimeTypes.php', 'OC\\RichObjectStrings\\Validator' => __DIR__ . '/../../..' . '/lib/private/RichObjectStrings/Validator.php', 'OC\\Route\\CachingRouter' => __DIR__ . '/../../..' . '/lib/private/Route/CachingRouter.php', diff --git a/lib/l10n/br.js b/lib/l10n/br.js index 74b65c80083..9acd6e9a38d 100644 --- a/lib/l10n/br.js +++ b/lib/l10n/br.js @@ -28,6 +28,7 @@ OC.L10N.register( "Apps" : "Meziant", "Settings" : "Arventennoù", "Log out" : "Kuitat", + "Accounts" : "Kontoù", "Email" : "Postel", "Twitter" : "Twitter", "Website" : "Lec'hien web", diff --git a/lib/l10n/br.json b/lib/l10n/br.json index 4c7e7c89929..c7844acba80 100644 --- a/lib/l10n/br.json +++ b/lib/l10n/br.json @@ -26,6 +26,7 @@ "Apps" : "Meziant", "Settings" : "Arventennoù", "Log out" : "Kuitat", + "Accounts" : "Kontoù", "Email" : "Postel", "Twitter" : "Twitter", "Website" : "Lec'hien web", diff --git a/lib/l10n/de_DE.js b/lib/l10n/de_DE.js index cc15b32c111..2ab7e76a79e 100644 --- a/lib/l10n/de_DE.js +++ b/lib/l10n/de_DE.js @@ -38,6 +38,7 @@ OC.L10N.register( "Server version %s or higher is required." : "Server Version %s oder höher wird benötigt.", "Server version %s or lower is required." : "Server Version %s oder niedriger wird benötigt.", "Logged in account must be an admin, a sub admin or gotten special right to access this setting" : "Das angemeldete Konto muss ein Administrator, ein Teil-Administrator sein oder ein Sonderrecht haben, um auf diese Einstellung zuzugreifen", + "Your current IP address doesn’t allow you to perform admin actions" : "Unter Ihrer aktuellen IP-Adresse sind keine Administrationsaktionen erlaubt", "Logged in account must be an admin or sub admin" : "Das angemeldete Konto muss ein (Sub-)Administrator sein", "Logged in account must be an admin" : "Das angemeldete Konto muss ein Administrator sein", "Wiping of device %s has started" : "Löschen von Gerät %s wurde gestartet", @@ -87,6 +88,7 @@ OC.L10N.register( "Invalid path" : "Ungültiger Pfad", "Failed to create file from template" : "Fehler beim Erstellen der Datei aus Vorlage", "Templates" : "Vorlagen", + "Path contains invalid segments" : "Pfad enthält ungültige Segmente", "File name is a reserved word" : "Der Dateiname ist ein reserviertes Wort", "File name contains at least one invalid character" : "Der Dateiname enthält mindestens ein ungültiges Zeichen", "File name is too long" : "Dateiname ist zu lang", diff --git a/lib/l10n/de_DE.json b/lib/l10n/de_DE.json index 33413652199..5d231b0ab0f 100644 --- a/lib/l10n/de_DE.json +++ b/lib/l10n/de_DE.json @@ -36,6 +36,7 @@ "Server version %s or higher is required." : "Server Version %s oder höher wird benötigt.", "Server version %s or lower is required." : "Server Version %s oder niedriger wird benötigt.", "Logged in account must be an admin, a sub admin or gotten special right to access this setting" : "Das angemeldete Konto muss ein Administrator, ein Teil-Administrator sein oder ein Sonderrecht haben, um auf diese Einstellung zuzugreifen", + "Your current IP address doesn’t allow you to perform admin actions" : "Unter Ihrer aktuellen IP-Adresse sind keine Administrationsaktionen erlaubt", "Logged in account must be an admin or sub admin" : "Das angemeldete Konto muss ein (Sub-)Administrator sein", "Logged in account must be an admin" : "Das angemeldete Konto muss ein Administrator sein", "Wiping of device %s has started" : "Löschen von Gerät %s wurde gestartet", @@ -85,6 +86,7 @@ "Invalid path" : "Ungültiger Pfad", "Failed to create file from template" : "Fehler beim Erstellen der Datei aus Vorlage", "Templates" : "Vorlagen", + "Path contains invalid segments" : "Pfad enthält ungültige Segmente", "File name is a reserved word" : "Der Dateiname ist ein reserviertes Wort", "File name contains at least one invalid character" : "Der Dateiname enthält mindestens ein ungültiges Zeichen", "File name is too long" : "Dateiname ist zu lang", diff --git a/lib/l10n/en_GB.js b/lib/l10n/en_GB.js index 839d46e241d..fe293098c00 100644 --- a/lib/l10n/en_GB.js +++ b/lib/l10n/en_GB.js @@ -38,6 +38,7 @@ OC.L10N.register( "Server version %s or higher is required." : "Server version %s or higher is required.", "Server version %s or lower is required." : "Server version %s or lower is required.", "Logged in account must be an admin, a sub admin or gotten special right to access this setting" : "Logged in account must be an admin, a sub admin or gotten special right to access this setting", + "Your current IP address doesn’t allow you to perform admin actions" : "Your current IP address doesn’t allow you to perform admin actions", "Logged in account must be an admin or sub admin" : "Logged in account must be an admin or sub admin", "Logged in account must be an admin" : "Logged in account must be an admin", "Wiping of device %s has started" : "Wiping of device %s has started", @@ -87,6 +88,7 @@ OC.L10N.register( "Invalid path" : "Invalid path", "Failed to create file from template" : "Failed to create file from template", "Templates" : "Templates", + "Path contains invalid segments" : "Path contains invalid segments", "File name is a reserved word" : "File name is a reserved word", "File name contains at least one invalid character" : "File name contains at least one invalid character", "File name is too long" : "File name is too long", diff --git a/lib/l10n/en_GB.json b/lib/l10n/en_GB.json index 90d48cec7e7..331038ba6db 100644 --- a/lib/l10n/en_GB.json +++ b/lib/l10n/en_GB.json @@ -36,6 +36,7 @@ "Server version %s or higher is required." : "Server version %s or higher is required.", "Server version %s or lower is required." : "Server version %s or lower is required.", "Logged in account must be an admin, a sub admin or gotten special right to access this setting" : "Logged in account must be an admin, a sub admin or gotten special right to access this setting", + "Your current IP address doesn’t allow you to perform admin actions" : "Your current IP address doesn’t allow you to perform admin actions", "Logged in account must be an admin or sub admin" : "Logged in account must be an admin or sub admin", "Logged in account must be an admin" : "Logged in account must be an admin", "Wiping of device %s has started" : "Wiping of device %s has started", @@ -85,6 +86,7 @@ "Invalid path" : "Invalid path", "Failed to create file from template" : "Failed to create file from template", "Templates" : "Templates", + "Path contains invalid segments" : "Path contains invalid segments", "File name is a reserved word" : "File name is a reserved word", "File name contains at least one invalid character" : "File name contains at least one invalid character", "File name is too long" : "File name is too long", diff --git a/lib/l10n/ga.js b/lib/l10n/ga.js index fdc5016267b..eb6ba637453 100644 --- a/lib/l10n/ga.js +++ b/lib/l10n/ga.js @@ -38,6 +38,7 @@ OC.L10N.register( "Server version %s or higher is required." : "Tá leagan freastalaí %s nó níos airde ag teastáil.", "Server version %s or lower is required." : "Tá leagan freastalaí %s nó níos ísle ag teastáil.", "Logged in account must be an admin, a sub admin or gotten special right to access this setting" : "Ní mór gur riarthóir, fo-riarthóir é cuntas logáilte isteach nó go bhfuil ceart speisialta faighte aige chun an socrú seo a rochtain", + "Your current IP address doesn’t allow you to perform admin actions" : "Ní cheadaíonn do sheoladh IP reatha duit gníomhartha riaracháin a dhéanamh", "Logged in account must be an admin or sub admin" : "Ní mór gur riarthóir nó fo-riarthóir é cuntas logáilte isteach", "Logged in account must be an admin" : "Ní mór gur riarthóir é cuntas logáilte isteach", "Wiping of device %s has started" : "Tá tús curtha le glanadh an ghléis %s", @@ -87,6 +88,7 @@ OC.L10N.register( "Invalid path" : "Conair neamhbhailí", "Failed to create file from template" : "Theip ar chruthú comhad ón teimpléad", "Templates" : "Teimpléid", + "Path contains invalid segments" : "Tá míreanna neamhbhailí sa chonair", "File name is a reserved word" : "Focal in áirithe is ea ainm comhaid", "File name contains at least one invalid character" : "Tá carachtar neamhbhailí amháin ar a laghad san ainm comhaid", "File name is too long" : "Tá ainm an chomhaid rófhada", diff --git a/lib/l10n/ga.json b/lib/l10n/ga.json index 31a35e2c55c..ee5f47e7aec 100644 --- a/lib/l10n/ga.json +++ b/lib/l10n/ga.json @@ -36,6 +36,7 @@ "Server version %s or higher is required." : "Tá leagan freastalaí %s nó níos airde ag teastáil.", "Server version %s or lower is required." : "Tá leagan freastalaí %s nó níos ísle ag teastáil.", "Logged in account must be an admin, a sub admin or gotten special right to access this setting" : "Ní mór gur riarthóir, fo-riarthóir é cuntas logáilte isteach nó go bhfuil ceart speisialta faighte aige chun an socrú seo a rochtain", + "Your current IP address doesn’t allow you to perform admin actions" : "Ní cheadaíonn do sheoladh IP reatha duit gníomhartha riaracháin a dhéanamh", "Logged in account must be an admin or sub admin" : "Ní mór gur riarthóir nó fo-riarthóir é cuntas logáilte isteach", "Logged in account must be an admin" : "Ní mór gur riarthóir é cuntas logáilte isteach", "Wiping of device %s has started" : "Tá tús curtha le glanadh an ghléis %s", @@ -85,6 +86,7 @@ "Invalid path" : "Conair neamhbhailí", "Failed to create file from template" : "Theip ar chruthú comhad ón teimpléad", "Templates" : "Teimpléid", + "Path contains invalid segments" : "Tá míreanna neamhbhailí sa chonair", "File name is a reserved word" : "Focal in áirithe is ea ainm comhaid", "File name contains at least one invalid character" : "Tá carachtar neamhbhailí amháin ar a laghad san ainm comhaid", "File name is too long" : "Tá ainm an chomhaid rófhada", diff --git a/lib/l10n/gl.js b/lib/l10n/gl.js index 3f981a253d5..9ee4a4e50d4 100644 --- a/lib/l10n/gl.js +++ b/lib/l10n/gl.js @@ -38,6 +38,7 @@ OC.L10N.register( "Server version %s or higher is required." : "Precísase da versión %s ou superior do servidor.", "Server version %s or lower is required." : "Precísase da versión %s ou inferior do servidor.", "Logged in account must be an admin, a sub admin or gotten special right to access this setting" : "A conta que accede debe ser de administración, de subadministración ou ter dereitos especiais para acceder a este axuste", + "Your current IP address doesn’t allow you to perform admin actions" : "O seu enderezo IP actual non lle permite realizar accións de administración", "Logged in account must be an admin or sub admin" : "A conta que accede debe ser de administración ou de subadministración", "Logged in account must be an admin" : "A conta que accede debe ser de administración", "Wiping of device %s has started" : "Iniciouse a limpeza do dispositivo %s", @@ -87,6 +88,7 @@ OC.L10N.register( "Invalid path" : "Ruta incorrecta.", "Failed to create file from template" : "Produciuse un fallo ao crear un ficheiro a partir do modelo", "Templates" : "Modelos", + "Path contains invalid segments" : "A ruta contén segmentos non válidos", "File name is a reserved word" : "O nome de ficheiro é unha palabra reservada", "File name contains at least one invalid character" : "O nome de ficheiro contén algún carácter incorrecto", "File name is too long" : "O nome de ficheiro é longo de máis", diff --git a/lib/l10n/gl.json b/lib/l10n/gl.json index 120cb46fad5..01577f16265 100644 --- a/lib/l10n/gl.json +++ b/lib/l10n/gl.json @@ -36,6 +36,7 @@ "Server version %s or higher is required." : "Precísase da versión %s ou superior do servidor.", "Server version %s or lower is required." : "Precísase da versión %s ou inferior do servidor.", "Logged in account must be an admin, a sub admin or gotten special right to access this setting" : "A conta que accede debe ser de administración, de subadministración ou ter dereitos especiais para acceder a este axuste", + "Your current IP address doesn’t allow you to perform admin actions" : "O seu enderezo IP actual non lle permite realizar accións de administración", "Logged in account must be an admin or sub admin" : "A conta que accede debe ser de administración ou de subadministración", "Logged in account must be an admin" : "A conta que accede debe ser de administración", "Wiping of device %s has started" : "Iniciouse a limpeza do dispositivo %s", @@ -85,6 +86,7 @@ "Invalid path" : "Ruta incorrecta.", "Failed to create file from template" : "Produciuse un fallo ao crear un ficheiro a partir do modelo", "Templates" : "Modelos", + "Path contains invalid segments" : "A ruta contén segmentos non válidos", "File name is a reserved word" : "O nome de ficheiro é unha palabra reservada", "File name contains at least one invalid character" : "O nome de ficheiro contén algún carácter incorrecto", "File name is too long" : "O nome de ficheiro é longo de máis", diff --git a/lib/l10n/hu.js b/lib/l10n/hu.js index 6f5b7aaa15f..174501303fd 100644 --- a/lib/l10n/hu.js +++ b/lib/l10n/hu.js @@ -89,6 +89,7 @@ OC.L10N.register( "App \"%s\" cannot be installed because it is not compatible with this version of the server." : "A(z) „%s” alkalmazást nem lehet telepíteni, mert nem kompatibilis ezzel a kiszolgálóverzióval.", "__language_name__" : "Magyar", "This is an automatically sent email, please do not reply." : "Ez egy automatikusan küldött levél, ne válaszoljon rá.", + "Help & privacy" : "Súgó és adatvédelem", "Appearance and accessibility" : "Megjelenés és akadálymentesítés", "Apps" : "Alkalmazások", "Personal settings" : "Személyes beállítások", diff --git a/lib/l10n/hu.json b/lib/l10n/hu.json index d1cd54bac41..45e3ebfccb2 100644 --- a/lib/l10n/hu.json +++ b/lib/l10n/hu.json @@ -87,6 +87,7 @@ "App \"%s\" cannot be installed because it is not compatible with this version of the server." : "A(z) „%s” alkalmazást nem lehet telepíteni, mert nem kompatibilis ezzel a kiszolgálóverzióval.", "__language_name__" : "Magyar", "This is an automatically sent email, please do not reply." : "Ez egy automatikusan küldött levél, ne válaszoljon rá.", + "Help & privacy" : "Súgó és adatvédelem", "Appearance and accessibility" : "Megjelenés és akadálymentesítés", "Apps" : "Alkalmazások", "Personal settings" : "Személyes beállítások", diff --git a/lib/l10n/nb.js b/lib/l10n/nb.js index f62bcfd18fa..0c465bcd81b 100644 --- a/lib/l10n/nb.js +++ b/lib/l10n/nb.js @@ -38,6 +38,7 @@ OC.L10N.register( "Server version %s or higher is required." : "Serverversjon %s eller høyere kreves.", "Server version %s or lower is required." : "Serverversjon %s eller lavere kreves.", "Logged in account must be an admin, a sub admin or gotten special right to access this setting" : "Innlogget konto må være administrator, underadministrator eller ha fått spesiell rett til å få tilgang til denne innstillingen.", + "Your current IP address doesn’t allow you to perform admin actions" : "Den nåværende IP-adressen din lar deg ikke utføre administratorhandlinger", "Logged in account must be an admin or sub admin" : "Innlogget konto må være administrator eller en underadministrator.", "Logged in account must be an admin" : "Innlogget konto må være administrator", "Wiping of device %s has started" : "Sikker sletting av enhet %s er startet", @@ -87,6 +88,7 @@ OC.L10N.register( "Invalid path" : "Ugyldig filbane", "Failed to create file from template" : "Oppretting av fil fra mal feilet", "Templates" : "Maler", + "Path contains invalid segments" : "Banen inneholder ugyldige segmenter", "File name is a reserved word" : "Filnavnet er et reservert ord", "File name contains at least one invalid character" : "Filnavnet inneholder minst ett ulovlig tegn", "File name is too long" : "Filnavnet er for langt", diff --git a/lib/l10n/nb.json b/lib/l10n/nb.json index bb6c97d6006..c3e66f6fa7d 100644 --- a/lib/l10n/nb.json +++ b/lib/l10n/nb.json @@ -36,6 +36,7 @@ "Server version %s or higher is required." : "Serverversjon %s eller høyere kreves.", "Server version %s or lower is required." : "Serverversjon %s eller lavere kreves.", "Logged in account must be an admin, a sub admin or gotten special right to access this setting" : "Innlogget konto må være administrator, underadministrator eller ha fått spesiell rett til å få tilgang til denne innstillingen.", + "Your current IP address doesn’t allow you to perform admin actions" : "Den nåværende IP-adressen din lar deg ikke utføre administratorhandlinger", "Logged in account must be an admin or sub admin" : "Innlogget konto må være administrator eller en underadministrator.", "Logged in account must be an admin" : "Innlogget konto må være administrator", "Wiping of device %s has started" : "Sikker sletting av enhet %s er startet", @@ -85,6 +86,7 @@ "Invalid path" : "Ugyldig filbane", "Failed to create file from template" : "Oppretting av fil fra mal feilet", "Templates" : "Maler", + "Path contains invalid segments" : "Banen inneholder ugyldige segmenter", "File name is a reserved word" : "Filnavnet er et reservert ord", "File name contains at least one invalid character" : "Filnavnet inneholder minst ett ulovlig tegn", "File name is too long" : "Filnavnet er for langt", diff --git a/lib/l10n/pt_BR.js b/lib/l10n/pt_BR.js index 07572e10cb5..5edc4c57c84 100644 --- a/lib/l10n/pt_BR.js +++ b/lib/l10n/pt_BR.js @@ -38,6 +38,7 @@ OC.L10N.register( "Server version %s or higher is required." : "É requerido um servidor da versão %s ou superior.", "Server version %s or lower is required." : "É requerido um servidor da versão %s ou abaixo.", "Logged in account must be an admin, a sub admin or gotten special right to access this setting" : "A conta conectada deve ser um administrador, um subadministrador ou ter direito especial para acessar esta configuração", + "Your current IP address doesn’t allow you to perform admin actions" : "Seu endereço IP atual não permite que você execute ações administrativas", "Logged in account must be an admin or sub admin" : "A conta conectada deve ser de um administrador ou subadministrador", "Logged in account must be an admin" : "A conta logada deve ser de um administrador", "Wiping of device %s has started" : "Limpeza do dispositivo %s iniciou", @@ -87,6 +88,7 @@ OC.L10N.register( "Invalid path" : "Diretório inválido", "Failed to create file from template" : "Falha ao criar arquivo do modelo ", "Templates" : "Modelos ", + "Path contains invalid segments" : "O caminho contém segmentos inválidos", "File name is a reserved word" : "O nome do arquivo é uma palavra reservada", "File name contains at least one invalid character" : "O nome do arquivo contém pelo menos um caracter inválido", "File name is too long" : "O nome do arquivo é muito longo", diff --git a/lib/l10n/pt_BR.json b/lib/l10n/pt_BR.json index cd3f55ce20d..1305041a586 100644 --- a/lib/l10n/pt_BR.json +++ b/lib/l10n/pt_BR.json @@ -36,6 +36,7 @@ "Server version %s or higher is required." : "É requerido um servidor da versão %s ou superior.", "Server version %s or lower is required." : "É requerido um servidor da versão %s ou abaixo.", "Logged in account must be an admin, a sub admin or gotten special right to access this setting" : "A conta conectada deve ser um administrador, um subadministrador ou ter direito especial para acessar esta configuração", + "Your current IP address doesn’t allow you to perform admin actions" : "Seu endereço IP atual não permite que você execute ações administrativas", "Logged in account must be an admin or sub admin" : "A conta conectada deve ser de um administrador ou subadministrador", "Logged in account must be an admin" : "A conta logada deve ser de um administrador", "Wiping of device %s has started" : "Limpeza do dispositivo %s iniciou", @@ -85,6 +86,7 @@ "Invalid path" : "Diretório inválido", "Failed to create file from template" : "Falha ao criar arquivo do modelo ", "Templates" : "Modelos ", + "Path contains invalid segments" : "O caminho contém segmentos inválidos", "File name is a reserved word" : "O nome do arquivo é uma palavra reservada", "File name contains at least one invalid character" : "O nome do arquivo contém pelo menos um caracter inválido", "File name is too long" : "O nome do arquivo é muito longo", diff --git a/lib/l10n/sr@latin.js b/lib/l10n/sr@latin.js index 3487200ee85..2d322157d37 100644 --- a/lib/l10n/sr@latin.js +++ b/lib/l10n/sr@latin.js @@ -1,6 +1,8 @@ OC.L10N.register( "lib", { + "Unknown filetype" : "Nepoznati tip fajla", + "Invalid image" : "Neispravna slika", "Files" : "Фајлови", "View profile" : "Vidi profil", "seconds ago" : "pre par sekundi", diff --git a/lib/l10n/sr@latin.json b/lib/l10n/sr@latin.json index 84ad4559b0a..0300634c077 100644 --- a/lib/l10n/sr@latin.json +++ b/lib/l10n/sr@latin.json @@ -1,4 +1,6 @@ { "translations": { + "Unknown filetype" : "Nepoznati tip fajla", + "Invalid image" : "Neispravna slika", "Files" : "Фајлови", "View profile" : "Vidi profil", "seconds ago" : "pre par sekundi", diff --git a/lib/l10n/sv.js b/lib/l10n/sv.js index 1bc47ffa0ba..d210f36901c 100644 --- a/lib/l10n/sv.js +++ b/lib/l10n/sv.js @@ -38,6 +38,7 @@ OC.L10N.register( "Server version %s or higher is required." : "Serverversion %s eller nyare krävs.", "Server version %s or lower is required." : "Serverversion %s eller äldre krävs.", "Logged in account must be an admin, a sub admin or gotten special right to access this setting" : "Inloggat konto måste vara en admin, underadministratör eller ha tilldelats speciella rättigheter för att komma åt denna inställning", + "Your current IP address doesn’t allow you to perform admin actions" : "Din nuvarande IP-adress tillåter dig inte att utföra administratörsåtgärder", "Logged in account must be an admin or sub admin" : "Inloggat konto måste vara en admin eller underadministratör", "Logged in account must be an admin" : "Inloggat konto måste vara admin", "Wiping of device %s has started" : "Rensning av enhet %s har startat", @@ -87,6 +88,7 @@ OC.L10N.register( "Invalid path" : "Ogiltig sökväg", "Failed to create file from template" : "Kunde skapa fil från mall", "Templates" : "Mallar", + "Path contains invalid segments" : "Sökvägen innehåller ogiltiga segment", "File name is a reserved word" : "Filnamnet är ett reserverat ord", "File name contains at least one invalid character" : "Filnamnet innehåller minst ett ogiltigt tecken", "File name is too long" : "Filnamnet är för långt", diff --git a/lib/l10n/sv.json b/lib/l10n/sv.json index 2b918b35dc4..3882f550ccb 100644 --- a/lib/l10n/sv.json +++ b/lib/l10n/sv.json @@ -36,6 +36,7 @@ "Server version %s or higher is required." : "Serverversion %s eller nyare krävs.", "Server version %s or lower is required." : "Serverversion %s eller äldre krävs.", "Logged in account must be an admin, a sub admin or gotten special right to access this setting" : "Inloggat konto måste vara en admin, underadministratör eller ha tilldelats speciella rättigheter för att komma åt denna inställning", + "Your current IP address doesn’t allow you to perform admin actions" : "Din nuvarande IP-adress tillåter dig inte att utföra administratörsåtgärder", "Logged in account must be an admin or sub admin" : "Inloggat konto måste vara en admin eller underadministratör", "Logged in account must be an admin" : "Inloggat konto måste vara admin", "Wiping of device %s has started" : "Rensning av enhet %s har startat", @@ -85,6 +86,7 @@ "Invalid path" : "Ogiltig sökväg", "Failed to create file from template" : "Kunde skapa fil från mall", "Templates" : "Mallar", + "Path contains invalid segments" : "Sökvägen innehåller ogiltiga segment", "File name is a reserved word" : "Filnamnet är ett reserverat ord", "File name contains at least one invalid character" : "Filnamnet innehåller minst ett ogiltigt tecken", "File name is too long" : "Filnamnet är för långt", diff --git a/lib/l10n/zh_TW.js b/lib/l10n/zh_TW.js index cb5bf6eddc3..4fac3736cac 100644 --- a/lib/l10n/zh_TW.js +++ b/lib/l10n/zh_TW.js @@ -38,6 +38,7 @@ OC.L10N.register( "Server version %s or higher is required." : "需要伺服器版本 %s 或更高", "Server version %s or lower is required." : "需要伺服器版本 %s 或更低", "Logged in account must be an admin, a sub admin or gotten special right to access this setting" : "登入帳號必須為管理員、子管理員或有可存取此設定的特殊權限的使用者", + "Your current IP address doesn’t allow you to perform admin actions" : "您目前的 IP 位置不允許您執行管理動作", "Logged in account must be an admin or sub admin" : "登入的帳號必須要是管理員或是子管理員", "Logged in account must be an admin" : "登入的帳號必須有管理員權限", "Wiping of device %s has started" : "已開始抹除裝置 %s ", @@ -87,6 +88,7 @@ OC.L10N.register( "Invalid path" : "無效的路徑", "Failed to create file from template" : "無法從範本建立檔案", "Templates" : "範本", + "Path contains invalid segments" : "路徑包含無效的部份", "File name is a reserved word" : "檔案名稱是保留字", "File name contains at least one invalid character" : "檔案名稱含有不允許的字元", "File name is too long" : "檔案名稱太長", diff --git a/lib/l10n/zh_TW.json b/lib/l10n/zh_TW.json index cd5c36d72b8..5fe0528c607 100644 --- a/lib/l10n/zh_TW.json +++ b/lib/l10n/zh_TW.json @@ -36,6 +36,7 @@ "Server version %s or higher is required." : "需要伺服器版本 %s 或更高", "Server version %s or lower is required." : "需要伺服器版本 %s 或更低", "Logged in account must be an admin, a sub admin or gotten special right to access this setting" : "登入帳號必須為管理員、子管理員或有可存取此設定的特殊權限的使用者", + "Your current IP address doesn’t allow you to perform admin actions" : "您目前的 IP 位置不允許您執行管理動作", "Logged in account must be an admin or sub admin" : "登入的帳號必須要是管理員或是子管理員", "Logged in account must be an admin" : "登入的帳號必須有管理員權限", "Wiping of device %s has started" : "已開始抹除裝置 %s ", @@ -85,6 +86,7 @@ "Invalid path" : "無效的路徑", "Failed to create file from template" : "無法從範本建立檔案", "Templates" : "範本", + "Path contains invalid segments" : "路徑包含無效的部份", "File name is a reserved word" : "檔案名稱是保留字", "File name contains at least one invalid character" : "檔案名稱含有不允許的字元", "File name is too long" : "檔案名稱太長", diff --git a/lib/private/DB/Connection.php b/lib/private/DB/Connection.php index ab0b35c11b0..b4e447940ea 100644 --- a/lib/private/DB/Connection.php +++ b/lib/private/DB/Connection.php @@ -79,6 +79,9 @@ class Connection extends \Doctrine\DBAL\Connection { /** @var DbDataCollector|null */ protected $dbDataCollector = null; + protected bool $logDbException = false; + private ?array $transactionBacktrace = null; + protected bool $logRequestId; protected string $requestId; @@ -110,6 +113,7 @@ class Connection extends \Doctrine\DBAL\Connection { $this->logger = \OC::$server->get(LoggerInterface::class); $this->logRequestId = $this->systemConfig->getValue('db.log_request_id', false); + $this->logDbException = $this->systemConfig->getValue('db.log_exceptions', false); $this->requestId = Server::get(IRequestId::class)->getId(); /** @var \OCP\Profiler\IProfiler */ @@ -263,7 +267,12 @@ class Connection extends \Doctrine\DBAL\Connection { $sql = $this->finishQuery($sql); $this->queriesExecuted++; $this->logQueryToFile($sql); - return parent::executeQuery($sql, $params, $types, $qcp); + try { + return parent::executeQuery($sql, $params, $types, $qcp); + } catch (\Exception $e) { + $this->logDatabaseException($e); + throw $e; + } } /** @@ -294,7 +303,12 @@ class Connection extends \Doctrine\DBAL\Connection { $sql = $this->finishQuery($sql); $this->queriesExecuted++; $this->logQueryToFile($sql); - return (int)parent::executeStatement($sql, $params, $types); + try { + return (int)parent::executeStatement($sql, $params, $types); + } catch (\Exception $e) { + $this->logDatabaseException($e); + throw $e; + } } protected function logQueryToFile(string $sql): void { @@ -356,11 +370,21 @@ class Connection extends \Doctrine\DBAL\Connection { * @deprecated 15.0.0 - use unique index and "try { $db->insert() } catch (UniqueConstraintViolationException $e) {}" instead, because it is more reliable and does not have the risk for deadlocks - see https://github.com/nextcloud/server/pull/12371 */ public function insertIfNotExist($table, $input, array $compare = null) { - return $this->adapter->insertIfNotExist($table, $input, $compare); + try { + return $this->adapter->insertIfNotExist($table, $input, $compare); + } catch (\Exception $e) { + $this->logDatabaseException($e); + throw $e; + } } public function insertIgnoreConflict(string $table, array $values) : int { - return $this->adapter->insertIgnoreConflict($table, $values); + try { + return $this->adapter->insertIgnoreConflict($table, $values); + } catch (\Exception $e) { + $this->logDatabaseException($e); + throw $e; + } } private function getType($value) { @@ -616,4 +640,43 @@ class Connection extends \Doctrine\DBAL\Connection { return new Migrator($this, $config, $dispatcher); } } + + public function beginTransaction() { + if (!$this->inTransaction()) { + $this->transactionBacktrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); + } + return parent::beginTransaction(); + } + + public function commit() { + $result = parent::commit(); + if ($this->getTransactionNestingLevel() === 0) { + $this->transactionBacktrace = null; + } + return $result; + } + + public function rollBack() { + $result = parent::rollBack(); + if ($this->getTransactionNestingLevel() === 0) { + $this->transactionBacktrace = null; + } + return $result; + } + + /** + * Log a database exception if enabled + * + * @param \Exception $exception + * @return void + */ + public function logDatabaseException(\Exception $exception): void { + if ($this->logDbException) { + if ($exception instanceof Exception\UniqueConstraintViolationException) { + $this->logger->info($exception->getMessage(), ['exception' => $exception, 'transaction' => $this->transactionBacktrace]); + } else { + $this->logger->error($exception->getMessage(), ['exception' => $exception, 'transaction' => $this->transactionBacktrace]); + } + } + } } diff --git a/lib/private/DB/ConnectionAdapter.php b/lib/private/DB/ConnectionAdapter.php index e27c98194fb..71be59c4d35 100644 --- a/lib/private/DB/ConnectionAdapter.php +++ b/lib/private/DB/ConnectionAdapter.php @@ -261,4 +261,8 @@ class ConnectionAdapter implements IDBConnection { throw new \Exception('Database ' . $platform::class . ' not supported'); } } + + public function logDatabaseException(\Exception $exception) { + $this->inner->logDatabaseException($exception); + } } diff --git a/lib/private/DirectEditing/Manager.php b/lib/private/DirectEditing/Manager.php index d1be1f50330..a527dcd6c9e 100644 --- a/lib/private/DirectEditing/Manager.php +++ b/lib/private/DirectEditing/Manager.php @@ -272,13 +272,11 @@ class Manager implements IManager { } public function invokeTokenScope($userId): void { - \OC_User::setIncognitoMode(true); \OC_User::setUserId($userId); } public function revertTokenScope(): void { $this->userSession->setUser(null); - \OC_User::setIncognitoMode(false); } public function createToken($editorId, File $file, string $filePath, IShare $share = null): string { diff --git a/lib/private/Files/View.php b/lib/private/Files/View.php index 1fa14501047..890dcfe20e1 100644 --- a/lib/private/Files/View.php +++ b/lib/private/Files/View.php @@ -1388,6 +1388,10 @@ class View { if ($mount instanceof MoveableMount && $internalPath === '') { $data['permissions'] |= \OCP\Constants::PERMISSION_DELETE; } + if ($internalPath === '' && $data['name']) { + $data['name'] = basename($path); + } + $ownerId = $storage->getOwner($internalPath); $owner = null; if ($ownerId !== null && $ownerId !== false) { diff --git a/lib/private/Mail/EMailTemplate.php b/lib/private/Mail/EMailTemplate.php index bb60f761450..54a16e99ba9 100644 --- a/lib/private/Mail/EMailTemplate.php +++ b/lib/private/Mail/EMailTemplate.php @@ -106,7 +106,7 @@ EOF; <tbody> <tr style="padding:0;text-align:left;vertical-align:top"> <center data-parsed="" style="background-color:%s;min-width:175px;max-height:175px; padding:35px 0px;border-radius:200px"> - <img class="logo float-center" src="%s" alt="%s" align="center" style="-ms-interpolation-mode:bicubic;clear:both;display:block;float:none;margin:0 auto;outline:0;text-align:center;text-decoration:none;max-height:105px;max-width:105px;width:auto;height:auto"> + <img class="logo float-center" src="%s" alt="%s" align="center" style="-ms-interpolation-mode:bicubic;clear:both;display:block;float:none;margin:0 auto;outline:0;text-align:center;text-decoration:none;max-height:105px;max-width:105px;width:auto;height:auto"%s> </center> </tr> </tbody> @@ -338,6 +338,8 @@ EOF; protected Defaults $themingDefaults, protected IURLGenerator $urlGenerator, protected IFactory $l10nFactory, + protected ?int $logoWidth, + protected ?int $logoHeight, protected string $emailId, protected array $data, ) { @@ -360,8 +362,14 @@ EOF; } $this->headerAdded = true; + $logoSizeDimensions = ''; + if ($this->logoWidth && $this->logoHeight) { + // Provide a logo size when we have the dimensions so that it displays nicely in Outlook + $logoSizeDimensions = ' width="' . $this->logoWidth . '" height="' . $this->logoHeight . '"'; + } + $logoUrl = $this->urlGenerator->getAbsoluteURL($this->themingDefaults->getLogo(false)); - $this->htmlBody .= vsprintf($this->header, [$this->themingDefaults->getDefaultColorPrimary(), $logoUrl, $this->themingDefaults->getName()]); + $this->htmlBody .= vsprintf($this->header, [$this->themingDefaults->getDefaultColorPrimary(), $logoUrl, $this->themingDefaults->getName(), $logoSizeDimensions]); } /** diff --git a/lib/private/Mail/Mailer.php b/lib/private/Mail/Mailer.php index 750a5ee80e5..77ba12c4852 100644 --- a/lib/private/Mail/Mailer.php +++ b/lib/private/Mail/Mailer.php @@ -79,6 +79,12 @@ use Symfony\Component\Mime\Exception\RfcComplianceException; * @package OC\Mail */ class Mailer implements IMailer { + // Do not move this block or change it's content without contacting the release crew + public const DEFAULT_DIMENSIONS = '252x120'; + // Do not move this block or change it's content without contacting the release crew + + public const MAX_LOGO_SIZE = 105; + private ?MailerInterface $instance = null; public function __construct( @@ -136,10 +142,37 @@ class Mailer implements IMailer { ); } + $logoDimensions = $this->config->getAppValue('theming', 'logoDimensions', self::DEFAULT_DIMENSIONS); + if (str_contains($logoDimensions, 'x')) { + [$width, $height] = explode('x', $logoDimensions); + $width = (int) $width; + $height = (int) $height; + + if ($width > self::MAX_LOGO_SIZE || $height > self::MAX_LOGO_SIZE) { + if ($width === $height) { + $logoWidth = self::MAX_LOGO_SIZE; + $logoHeight = self::MAX_LOGO_SIZE; + } elseif ($width > $height) { + $logoWidth = self::MAX_LOGO_SIZE; + $logoHeight = (int) (($height / $width) * self::MAX_LOGO_SIZE); + } else { + $logoWidth = (int) (($width / $height) * self::MAX_LOGO_SIZE); + $logoHeight = self::MAX_LOGO_SIZE; + } + } else { + $logoWidth = $width; + $logoHeight = $height; + } + } else { + $logoWidth = $logoHeight = null; + } + return new EMailTemplate( $this->defaults, $this->urlGenerator, $this->l10nFactory, + $logoWidth, + $logoHeight, $emailId, $data ); diff --git a/lib/private/RedisFactory.php b/lib/private/RedisFactory.php index b657a0a83af..32be326d46f 100644 --- a/lib/private/RedisFactory.php +++ b/lib/private/RedisFactory.php @@ -74,6 +74,7 @@ class RedisFactory { // # TLS support // # https://github.com/phpredis/phpredis/issues/1600 $connectionParameters = $this->getSslContext($config); + $persistent = $this->config->getValue('redis.persistent', true); // cluster config if ($isCluster) { @@ -83,9 +84,9 @@ class RedisFactory { // Support for older phpredis versions not supporting connectionParameters if ($connectionParameters !== null) { - $this->instance = new \RedisCluster(null, $config['seeds'], $timeout, $readTimeout, true, $auth, $connectionParameters); + $this->instance = new \RedisCluster(null, $config['seeds'], $timeout, $readTimeout, $persistent, $auth, $connectionParameters); } else { - $this->instance = new \RedisCluster(null, $config['seeds'], $timeout, $readTimeout, true, $auth); + $this->instance = new \RedisCluster(null, $config['seeds'], $timeout, $readTimeout, $persistent, $auth); } if (isset($config['failover_mode'])) { @@ -104,17 +105,25 @@ class RedisFactory { $connectionParameters = [ 'stream' => $this->getSslContext($config) ]; - /** - * even though the stubs and documentation don't want you to know this, - * pconnect does have the same $connectionParameters argument connect has - * - * https://github.com/phpredis/phpredis/blob/0264de1824b03fb2d0ad515b4d4ec019cd2dae70/redis.c#L710-L730 - * - * @psalm-suppress TooManyArguments - */ - $this->instance->pconnect($host, $port, $timeout, null, 0, $readTimeout, $connectionParameters); + if ($persistent) { + /** + * even though the stubs and documentation don't want you to know this, + * pconnect does have the same $connectionParameters argument connect has + * + * https://github.com/phpredis/phpredis/blob/0264de1824b03fb2d0ad515b4d4ec019cd2dae70/redis.c#L710-L730 + * + * @psalm-suppress TooManyArguments + */ + $this->instance->pconnect($host, $port, $timeout, null, 0, $readTimeout, $connectionParameters); + } else { + $this->instance->connect($host, $port, $timeout, null, 0, $readTimeout, $connectionParameters); + } } else { - $this->instance->pconnect($host, $port, $timeout, null, 0, $readTimeout); + if ($persistent) { + $this->instance->pconnect($host, $port, $timeout, null, 0, $readTimeout); + } else { + $this->instance->connect($host, $port, $timeout, null, 0, $readTimeout); + } } diff --git a/lib/private/Repair.php b/lib/private/Repair.php index fa06274ed3c..fe1925bddfe 100644 --- a/lib/private/Repair.php +++ b/lib/private/Repair.php @@ -78,6 +78,7 @@ use OC\Repair\Owncloud\UpdateLanguageCodes; use OC\Repair\RemoveLinkShares; use OC\Repair\RepairDavShares; use OC\Repair\RepairInvalidShares; +use OC\Repair\RepairLogoDimension; use OC\Repair\RepairMimeTypes; use OC\Template\JSCombiner; use OCA\DAV\Migration\DeleteSchedulingObjects; @@ -213,6 +214,7 @@ class Repair implements IOutput { \OCP\Server::get(AddMissingSecretJob::class), \OCP\Server::get(AddRemoveOldTasksBackgroundJob::class), \OCP\Server::get(AddMetadataGenerationJob::class), + \OCP\Server::get(RepairLogoDimension::class), ]; } diff --git a/lib/private/Repair/RepairLogoDimension.php b/lib/private/Repair/RepairLogoDimension.php new file mode 100644 index 00000000000..122da205986 --- /dev/null +++ b/lib/private/Repair/RepairLogoDimension.php @@ -0,0 +1,71 @@ +<?php + +declare(strict_types=1); + +/** + * SPDX-FileCopyrightText: 2024 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ +namespace OC\Repair; + +use OCA\Theming\ImageManager; +use OCP\IConfig; +use OCP\Migration\IOutput; +use OCP\Migration\IRepairStep; +use OCP\Server; + +class RepairLogoDimension implements IRepairStep { + public function __construct( + protected IConfig $config, + ) { + } + + public function getName(): string { + return 'Cache logo dimension to fix size in emails on Outlook'; + } + + public function run(IOutput $output): void { + $logoDimensions = $this->config->getAppValue('theming', 'logoDimensions'); + if (preg_match('/^\d+x\d+$/', $logoDimensions)) { + $output->info('Logo dimensions are already known'); + return; + } + + try { + /** @var ImageManager $imageManager */ + $imageManager = Server::get(ImageManager::class); + } catch (\Throwable) { + $output->info('Theming is disabled'); + return; + } + + if (!$imageManager->hasImage('logo')) { + $output->info('Theming is not used to provide a logo'); + return; + } + + $simpleFile = $imageManager->getImage('logo', false); + + $image = @imagecreatefromstring($simpleFile->getContent()); + + $dimensions = ''; + if ($image !== false) { + $dimensions = imagesx($image) . 'x' . imagesy($image); + } elseif (str_starts_with($simpleFile->getMimeType(), 'image/svg')) { + $matched = preg_match('/viewbox=["\']\d* \d* (\d*\.?\d*) (\d*\.?\d*)["\']/i', $simpleFile->getContent(), $matches); + if ($matched) { + $dimensions = $matches[1] . 'x' . $matches[2]; + } + } + + if (!$dimensions) { + $output->warning('Failed to read dimensions from logo'); + $this->config->deleteAppValue('theming', 'logoDimensions'); + return; + } + + $dimensions = imagesx($image) . 'x' . imagesy($image); + $this->config->setAppValue('theming', 'logoDimensions', $dimensions); + $output->info('Updated logo dimensions: ' . $dimensions); + } +} diff --git a/lib/private/User/Session.php b/lib/private/User/Session.php index dff3cefd0b9..c5a00aedcc6 100644 --- a/lib/private/User/Session.php +++ b/lib/private/User/Session.php @@ -183,6 +183,15 @@ class Session implements IUserSession, Emitter { } /** + * Temporarily set the currently active user without persisting in the session + * + * @param IUser|null $user + */ + public function setVolatileActiveUser(?IUser $user): void { + $this->activeUser = $user; + } + + /** * get the current active user * * @return IUser|null Current user, otherwise null diff --git a/lib/private/legacy/OC_User.php b/lib/private/legacy/OC_User.php index 3d958814988..1174c492fef 100644 --- a/lib/private/legacy/OC_User.php +++ b/lib/private/legacy/OC_User.php @@ -39,6 +39,7 @@ use OC\Authentication\Token\IProvider; use OC\User\LoginException; use OCP\EventDispatcher\IEventDispatcher; use OCP\IGroupManager; +use OCP\ISession; use OCP\IUser; use OCP\IUserManager; use OCP\Server; @@ -349,7 +350,7 @@ class OC_User { * @return string|false uid or false */ public static function getUser() { - $uid = \OC::$server->getSession() ? \OC::$server->getSession()->get('user_id') : null; + $uid = Server::get(ISession::class)?->get('user_id'); if (!is_null($uid) && self::$incognitoMode === false) { return $uid; } else { diff --git a/lib/public/IUserSession.php b/lib/public/IUserSession.php index 7bc37cc67c6..dc6094550bc 100644 --- a/lib/public/IUserSession.php +++ b/lib/public/IUserSession.php @@ -64,6 +64,14 @@ interface IUserSession { public function setUser($user); /** + * Temporarily set the currently active user without persisting in the session + * + * @param IUser|null $user + * @since 29.0.0 + */ + public function setVolatileActiveUser(?IUser $user): void; + + /** * get the current active user * * @return \OCP\IUser|null Current user, otherwise null |