diff options
Diffstat (limited to 'lib')
58 files changed, 375 insertions, 70 deletions
diff --git a/lib/composer/composer/autoload_classmap.php b/lib/composer/composer/autoload_classmap.php index 8c485fe53d9..47ffd81f751 100644 --- a/lib/composer/composer/autoload_classmap.php +++ b/lib/composer/composer/autoload_classmap.php @@ -145,6 +145,7 @@ return array( 'OCP\\Collaboration\\Reference\\IReference' => $baseDir . '/lib/public/Collaboration/Reference/IReference.php', 'OCP\\Collaboration\\Reference\\IReferenceManager' => $baseDir . '/lib/public/Collaboration/Reference/IReferenceManager.php', 'OCP\\Collaboration\\Reference\\IReferenceProvider' => $baseDir . '/lib/public/Collaboration/Reference/IReferenceProvider.php', + 'OCP\\Collaboration\\Reference\\RenderReferenceEvent' => $baseDir . '/lib/public/Collaboration/Reference/RenderReferenceEvent.php', 'OCP\\Collaboration\\Resources\\CollectionException' => $baseDir . '/lib/public/Collaboration/Resources/CollectionException.php', 'OCP\\Collaboration\\Resources\\ICollection' => $baseDir . '/lib/public/Collaboration/Resources/ICollection.php', 'OCP\\Collaboration\\Resources\\IManager' => $baseDir . '/lib/public/Collaboration/Resources/IManager.php', diff --git a/lib/composer/composer/autoload_static.php b/lib/composer/composer/autoload_static.php index 0dd18e5ddbf..a84bab472a5 100644 --- a/lib/composer/composer/autoload_static.php +++ b/lib/composer/composer/autoload_static.php @@ -178,6 +178,7 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2 'OCP\\Collaboration\\Reference\\IReference' => __DIR__ . '/../../..' . '/lib/public/Collaboration/Reference/IReference.php', 'OCP\\Collaboration\\Reference\\IReferenceManager' => __DIR__ . '/../../..' . '/lib/public/Collaboration/Reference/IReferenceManager.php', 'OCP\\Collaboration\\Reference\\IReferenceProvider' => __DIR__ . '/../../..' . '/lib/public/Collaboration/Reference/IReferenceProvider.php', + 'OCP\\Collaboration\\Reference\\RenderReferenceEvent' => __DIR__ . '/../../..' . '/lib/public/Collaboration/Reference/RenderReferenceEvent.php', 'OCP\\Collaboration\\Resources\\CollectionException' => __DIR__ . '/../../..' . '/lib/public/Collaboration/Resources/CollectionException.php', 'OCP\\Collaboration\\Resources\\ICollection' => __DIR__ . '/../../..' . '/lib/public/Collaboration/Resources/ICollection.php', 'OCP\\Collaboration\\Resources\\IManager' => __DIR__ . '/../../..' . '/lib/public/Collaboration/Resources/IManager.php', diff --git a/lib/l10n/an.js b/lib/l10n/an.js index 8ddba74c09f..49222b95d78 100644 --- a/lib/l10n/an.js +++ b/lib/l10n/an.js @@ -1,6 +1,19 @@ OC.L10N.register( "lib", { - "Settings" : "Configurazión" + "See %s" : "Veyer %s", + "Unknown filetype" : "Tipo de fichero esconoxiu", + "Invalid image" : "Imachen no valida", + "today" : "Hue", + "yesterday" : "Ayer", + "last month" : "Zaguero mes", + "last year" : "Zaguero año", + "Help" : "Aduya", + "Apps" : "Aplicazions", + "Settings" : "Configurazión", + "Users" : "Usuarios", + "Email" : "Correu electronico", + "Full name" : "Nombre completo", + "PostgreSQL >= 9 required" : "PostgreSQL >= 9 requeriu" }, "nplurals=2; plural=(n != 1);"); diff --git a/lib/l10n/an.json b/lib/l10n/an.json index 08fd0a1abf7..3ee3c9bb029 100644 --- a/lib/l10n/an.json +++ b/lib/l10n/an.json @@ -1,4 +1,17 @@ { "translations": { - "Settings" : "Configurazión" + "See %s" : "Veyer %s", + "Unknown filetype" : "Tipo de fichero esconoxiu", + "Invalid image" : "Imachen no valida", + "today" : "Hue", + "yesterday" : "Ayer", + "last month" : "Zaguero mes", + "last year" : "Zaguero año", + "Help" : "Aduya", + "Apps" : "Aplicazions", + "Settings" : "Configurazión", + "Users" : "Usuarios", + "Email" : "Correu electronico", + "Full name" : "Nombre completo", + "PostgreSQL >= 9 required" : "PostgreSQL >= 9 requeriu" },"pluralForm" :"nplurals=2; plural=(n != 1);" }
\ No newline at end of file diff --git a/lib/l10n/bg.js b/lib/l10n/bg.js index 1f31e9e0504..4081facf7e8 100644 --- a/lib/l10n/bg.js +++ b/lib/l10n/bg.js @@ -91,6 +91,8 @@ OC.L10N.register( "This is an automatically sent email, please do not reply." : "Имейлът е генериран автоматично, моля не отговаряйте.", "Help" : "Помощ", "Apps" : "Приложения", + "Personal settings" : "Лични настройки", + "Administration settings" : "Административни настройки", "Settings" : "Настройки", "Log out" : "Отписване", "Users" : "Потребители", diff --git a/lib/l10n/bg.json b/lib/l10n/bg.json index 41507e49a44..35a4bf1a7a9 100644 --- a/lib/l10n/bg.json +++ b/lib/l10n/bg.json @@ -89,6 +89,8 @@ "This is an automatically sent email, please do not reply." : "Имейлът е генериран автоматично, моля не отговаряйте.", "Help" : "Помощ", "Apps" : "Приложения", + "Personal settings" : "Лични настройки", + "Administration settings" : "Административни настройки", "Settings" : "Настройки", "Log out" : "Отписване", "Users" : "Потребители", diff --git a/lib/l10n/cs.js b/lib/l10n/cs.js index c772b9db74a..f10d57e78ff 100644 --- a/lib/l10n/cs.js +++ b/lib/l10n/cs.js @@ -91,6 +91,8 @@ OC.L10N.register( "This is an automatically sent email, please do not reply." : "Toto je automaticky odesílaný e-mail, neodpovídejte na něj.", "Help" : "Nápověda", "Apps" : "Aplikace", + "Personal settings" : "Osobní nastavení", + "Administration settings" : "Nastavení pro správu", "Settings" : "Nastavení", "Log out" : "Odhlásit se", "Users" : "Uživatelé", diff --git a/lib/l10n/cs.json b/lib/l10n/cs.json index a2e89fae911..7ed239f07af 100644 --- a/lib/l10n/cs.json +++ b/lib/l10n/cs.json @@ -89,6 +89,8 @@ "This is an automatically sent email, please do not reply." : "Toto je automaticky odesílaný e-mail, neodpovídejte na něj.", "Help" : "Nápověda", "Apps" : "Aplikace", + "Personal settings" : "Osobní nastavení", + "Administration settings" : "Nastavení pro správu", "Settings" : "Nastavení", "Log out" : "Odhlásit se", "Users" : "Uživatelé", diff --git a/lib/l10n/de.js b/lib/l10n/de.js index f7f736b8d24..941beea683a 100644 --- a/lib/l10n/de.js +++ b/lib/l10n/de.js @@ -91,6 +91,7 @@ OC.L10N.register( "This is an automatically sent email, please do not reply." : "Dies ist eine automatisch versandte E-Mail, bitte nicht antworten.", "Help" : "Hilfe", "Apps" : "Apps", + "Personal settings" : "Persönliche Einstellungen", "Settings" : "Einstellungen", "Log out" : "Abmelden", "Users" : "Benutzer", diff --git a/lib/l10n/de.json b/lib/l10n/de.json index c24b6770eac..0c59b2523c6 100644 --- a/lib/l10n/de.json +++ b/lib/l10n/de.json @@ -89,6 +89,7 @@ "This is an automatically sent email, please do not reply." : "Dies ist eine automatisch versandte E-Mail, bitte nicht antworten.", "Help" : "Hilfe", "Apps" : "Apps", + "Personal settings" : "Persönliche Einstellungen", "Settings" : "Einstellungen", "Log out" : "Abmelden", "Users" : "Benutzer", diff --git a/lib/l10n/de_DE.js b/lib/l10n/de_DE.js index 2fc511f01fc..929b6adc36d 100644 --- a/lib/l10n/de_DE.js +++ b/lib/l10n/de_DE.js @@ -91,6 +91,8 @@ OC.L10N.register( "This is an automatically sent email, please do not reply." : "Dies ist eine automatisch versandte E-Mail, bitte nicht antworten.", "Help" : "Hilfe", "Apps" : "Apps", + "Personal settings" : "Persönliche Einstellungen", + "Administration settings" : "Administrationseinstellungen", "Settings" : "Einstellungen", "Log out" : "Abmelden", "Users" : "Benutzer", diff --git a/lib/l10n/de_DE.json b/lib/l10n/de_DE.json index 95f217f8968..149a5429896 100644 --- a/lib/l10n/de_DE.json +++ b/lib/l10n/de_DE.json @@ -89,6 +89,8 @@ "This is an automatically sent email, please do not reply." : "Dies ist eine automatisch versandte E-Mail, bitte nicht antworten.", "Help" : "Hilfe", "Apps" : "Apps", + "Personal settings" : "Persönliche Einstellungen", + "Administration settings" : "Administrationseinstellungen", "Settings" : "Einstellungen", "Log out" : "Abmelden", "Users" : "Benutzer", diff --git a/lib/l10n/el.js b/lib/l10n/el.js index d0011407a62..1d758d80473 100644 --- a/lib/l10n/el.js +++ b/lib/l10n/el.js @@ -91,6 +91,7 @@ OC.L10N.register( "This is an automatically sent email, please do not reply." : "Αυτό είναι ένα μήνυμα ηλεκτρονικού ταχυδρομείου που στάλθηκε αυτόματα, παρακαλούμε μην απαντήσετε.", "Help" : "Βοήθεια", "Apps" : "Εφαρμογές", + "Personal settings" : "Προσωπικές ρυθμίσεις", "Settings" : "Ρυθμίσεις", "Log out" : "Έξοδος", "Users" : "Χρήστες", diff --git a/lib/l10n/el.json b/lib/l10n/el.json index d52815ac6f6..88b0022aa60 100644 --- a/lib/l10n/el.json +++ b/lib/l10n/el.json @@ -89,6 +89,7 @@ "This is an automatically sent email, please do not reply." : "Αυτό είναι ένα μήνυμα ηλεκτρονικού ταχυδρομείου που στάλθηκε αυτόματα, παρακαλούμε μην απαντήσετε.", "Help" : "Βοήθεια", "Apps" : "Εφαρμογές", + "Personal settings" : "Προσωπικές ρυθμίσεις", "Settings" : "Ρυθμίσεις", "Log out" : "Έξοδος", "Users" : "Χρήστες", diff --git a/lib/l10n/es.js b/lib/l10n/es.js index efd49e6c020..ffa65189c8e 100644 --- a/lib/l10n/es.js +++ b/lib/l10n/es.js @@ -91,6 +91,7 @@ OC.L10N.register( "This is an automatically sent email, please do not reply." : "Este es un correo enviado automáticamente, por favor no responda.", "Help" : "Ayuda", "Apps" : "Aplicaciones", + "Personal settings" : "Ajustes personales", "Settings" : "Ajustes", "Log out" : "Cerrar sesión", "Users" : "Usuarios", diff --git a/lib/l10n/es.json b/lib/l10n/es.json index ae9b87df314..24809243385 100644 --- a/lib/l10n/es.json +++ b/lib/l10n/es.json @@ -89,6 +89,7 @@ "This is an automatically sent email, please do not reply." : "Este es un correo enviado automáticamente, por favor no responda.", "Help" : "Ayuda", "Apps" : "Aplicaciones", + "Personal settings" : "Ajustes personales", "Settings" : "Ajustes", "Log out" : "Cerrar sesión", "Users" : "Usuarios", diff --git a/lib/l10n/eu.js b/lib/l10n/eu.js index 94244be5607..bbef4fead98 100644 --- a/lib/l10n/eu.js +++ b/lib/l10n/eu.js @@ -91,6 +91,7 @@ OC.L10N.register( "This is an automatically sent email, please do not reply." : "Hau automatikoki bidalitako e-posta bat da, ez erantzun mesedez.", "Help" : "Laguntza", "Apps" : "Aplikazioak", + "Personal settings" : "Ezarpen pertsonalak", "Settings" : "Ezarpenak", "Log out" : "Amaitu saioa", "Users" : "Erabiltzaileak", diff --git a/lib/l10n/eu.json b/lib/l10n/eu.json index 0eac90e1da9..1afbdf9cf14 100644 --- a/lib/l10n/eu.json +++ b/lib/l10n/eu.json @@ -89,6 +89,7 @@ "This is an automatically sent email, please do not reply." : "Hau automatikoki bidalitako e-posta bat da, ez erantzun mesedez.", "Help" : "Laguntza", "Apps" : "Aplikazioak", + "Personal settings" : "Ezarpen pertsonalak", "Settings" : "Ezarpenak", "Log out" : "Amaitu saioa", "Users" : "Erabiltzaileak", diff --git a/lib/l10n/fi.js b/lib/l10n/fi.js index 13ebcfcffeb..f01cae12c98 100644 --- a/lib/l10n/fi.js +++ b/lib/l10n/fi.js @@ -79,6 +79,7 @@ OC.L10N.register( "This is an automatically sent email, please do not reply." : "Tämä on automaattisesti lähetetty viesti. Älä vastaa tähän viestiin.", "Help" : "Ohje", "Apps" : "Sovellukset", + "Personal settings" : "Henkilökohtaiset asetukset", "Settings" : "Asetukset", "Log out" : "Kirjaudu ulos", "Users" : "Käyttäjät", diff --git a/lib/l10n/fi.json b/lib/l10n/fi.json index 2aa4fdcd0d5..fc4606693d9 100644 --- a/lib/l10n/fi.json +++ b/lib/l10n/fi.json @@ -77,6 +77,7 @@ "This is an automatically sent email, please do not reply." : "Tämä on automaattisesti lähetetty viesti. Älä vastaa tähän viestiin.", "Help" : "Ohje", "Apps" : "Sovellukset", + "Personal settings" : "Henkilökohtaiset asetukset", "Settings" : "Asetukset", "Log out" : "Kirjaudu ulos", "Users" : "Käyttäjät", diff --git a/lib/l10n/fr.js b/lib/l10n/fr.js index fce71090c61..7a2c82ebbbf 100644 --- a/lib/l10n/fr.js +++ b/lib/l10n/fr.js @@ -91,6 +91,7 @@ OC.L10N.register( "This is an automatically sent email, please do not reply." : "Ceci est un e-mail envoyé automatiquement, veuillez ne pas y répondre.", "Help" : "Aide", "Apps" : "Applications", + "Personal settings" : "Paramètres personnels", "Settings" : "Paramètres", "Log out" : "Se déconnecter", "Users" : "Utilisateurs", diff --git a/lib/l10n/fr.json b/lib/l10n/fr.json index f9ff67188b0..3c560d11f55 100644 --- a/lib/l10n/fr.json +++ b/lib/l10n/fr.json @@ -89,6 +89,7 @@ "This is an automatically sent email, please do not reply." : "Ceci est un e-mail envoyé automatiquement, veuillez ne pas y répondre.", "Help" : "Aide", "Apps" : "Applications", + "Personal settings" : "Paramètres personnels", "Settings" : "Paramètres", "Log out" : "Se déconnecter", "Users" : "Utilisateurs", diff --git a/lib/l10n/hu.js b/lib/l10n/hu.js index 6d37257854c..fc3561d2169 100644 --- a/lib/l10n/hu.js +++ b/lib/l10n/hu.js @@ -91,6 +91,8 @@ OC.L10N.register( "This is an automatically sent email, please do not reply." : "Ez egy automatikusan küldött levél, ne válaszoljon rá.", "Help" : "Súgó", "Apps" : "Alkalmazások", + "Personal settings" : "Személyes beállítások", + "Administration settings" : "Rendszergazdai beállítások", "Settings" : "Beállítások", "Log out" : "Kijelentkezés", "Users" : "Felhasználók", diff --git a/lib/l10n/hu.json b/lib/l10n/hu.json index 09245fbe1e5..9b262142578 100644 --- a/lib/l10n/hu.json +++ b/lib/l10n/hu.json @@ -89,6 +89,8 @@ "This is an automatically sent email, please do not reply." : "Ez egy automatikusan küldött levél, ne válaszoljon rá.", "Help" : "Súgó", "Apps" : "Alkalmazások", + "Personal settings" : "Személyes beállítások", + "Administration settings" : "Rendszergazdai beállítások", "Settings" : "Beállítások", "Log out" : "Kijelentkezés", "Users" : "Felhasználók", diff --git a/lib/l10n/pl.js b/lib/l10n/pl.js index eb9255cda36..e29e83d3c51 100644 --- a/lib/l10n/pl.js +++ b/lib/l10n/pl.js @@ -91,6 +91,8 @@ OC.L10N.register( "This is an automatically sent email, please do not reply." : "Jest to wiadomość e-mail wysłana automatycznie, prosimy nie odpowiadać na nią.", "Help" : "Pomoc", "Apps" : "Aplikacje", + "Personal settings" : "Ustawienia osobiste", + "Administration settings" : "Ustawienia administracyjne", "Settings" : "Ustawienia", "Log out" : "Wyloguj", "Users" : "Użytkownicy", diff --git a/lib/l10n/pl.json b/lib/l10n/pl.json index 208cfee7853..c9d619331d7 100644 --- a/lib/l10n/pl.json +++ b/lib/l10n/pl.json @@ -89,6 +89,8 @@ "This is an automatically sent email, please do not reply." : "Jest to wiadomość e-mail wysłana automatycznie, prosimy nie odpowiadać na nią.", "Help" : "Pomoc", "Apps" : "Aplikacje", + "Personal settings" : "Ustawienia osobiste", + "Administration settings" : "Ustawienia administracyjne", "Settings" : "Ustawienia", "Log out" : "Wyloguj", "Users" : "Użytkownicy", diff --git a/lib/l10n/pt_BR.js b/lib/l10n/pt_BR.js index 68f00800412..71deeea2397 100644 --- a/lib/l10n/pt_BR.js +++ b/lib/l10n/pt_BR.js @@ -91,6 +91,7 @@ OC.L10N.register( "This is an automatically sent email, please do not reply." : "Este e-mail é enviado automaticamente. Por favor, não responda.", "Help" : "Ajuda", "Apps" : "Aplicativos", + "Personal settings" : "Configurações pessoais", "Settings" : "Configurações", "Log out" : "Sair", "Users" : "Usuários", diff --git a/lib/l10n/pt_BR.json b/lib/l10n/pt_BR.json index 4e4bf30845b..80b7285aa26 100644 --- a/lib/l10n/pt_BR.json +++ b/lib/l10n/pt_BR.json @@ -89,6 +89,7 @@ "This is an automatically sent email, please do not reply." : "Este e-mail é enviado automaticamente. Por favor, não responda.", "Help" : "Ajuda", "Apps" : "Aplicativos", + "Personal settings" : "Configurações pessoais", "Settings" : "Configurações", "Log out" : "Sair", "Users" : "Usuários", diff --git a/lib/l10n/sl.js b/lib/l10n/sl.js index eb2fe3434ba..cf0a09ce781 100644 --- a/lib/l10n/sl.js +++ b/lib/l10n/sl.js @@ -85,6 +85,7 @@ OC.L10N.register( "This is an automatically sent email, please do not reply." : "To sporočilo je samodejno poslano, nanj se nima smisla odzvati.", "Help" : "Pomoč", "Apps" : "Programi", + "Personal settings" : "Osebne nastavitve", "Settings" : "Nastavitve", "Log out" : "Odjava", "Users" : "Uporabniki", diff --git a/lib/l10n/sl.json b/lib/l10n/sl.json index 175d8246b3c..8b3d781934d 100644 --- a/lib/l10n/sl.json +++ b/lib/l10n/sl.json @@ -83,6 +83,7 @@ "This is an automatically sent email, please do not reply." : "To sporočilo je samodejno poslano, nanj se nima smisla odzvati.", "Help" : "Pomoč", "Apps" : "Programi", + "Personal settings" : "Osebne nastavitve", "Settings" : "Nastavitve", "Log out" : "Odjava", "Users" : "Uporabniki", diff --git a/lib/l10n/tr.js b/lib/l10n/tr.js index 53de08e4f73..96d2e08716a 100644 --- a/lib/l10n/tr.js +++ b/lib/l10n/tr.js @@ -91,6 +91,8 @@ OC.L10N.register( "This is an automatically sent email, please do not reply." : "Bu ileti otomatik olarak gönderildiğinden lütfen yanıtlamayın.", "Help" : "Yardım", "Apps" : "Uygulamalar", + "Personal settings" : "Kişisel ayarlar", + "Administration settings" : "Yönetim ayarları", "Settings" : "Ayarlar", "Log out" : "Oturumu kapat", "Users" : "Kullanıcılar", diff --git a/lib/l10n/tr.json b/lib/l10n/tr.json index eb666c3b364..7bd36c0e54b 100644 --- a/lib/l10n/tr.json +++ b/lib/l10n/tr.json @@ -89,6 +89,8 @@ "This is an automatically sent email, please do not reply." : "Bu ileti otomatik olarak gönderildiğinden lütfen yanıtlamayın.", "Help" : "Yardım", "Apps" : "Uygulamalar", + "Personal settings" : "Kişisel ayarlar", + "Administration settings" : "Yönetim ayarları", "Settings" : "Ayarlar", "Log out" : "Oturumu kapat", "Users" : "Kullanıcılar", diff --git a/lib/l10n/uk.js b/lib/l10n/uk.js index 8f204020c65..c5076a56cb2 100644 --- a/lib/l10n/uk.js +++ b/lib/l10n/uk.js @@ -16,6 +16,7 @@ OC.L10N.register( "The command line tool %s could not be found" : "Утиліту командного рядка %s не знайдено", "The library %s is not available." : "Бібліотека %s недоступна.", "Server version %s or higher is required." : "Потрібна версія сервера %s або вище.", + "Server version %s or lower is required." : "Потрібна версія сервера %s або нижча.", "Remote wipe started" : "Розпочато віддалене стирання", "Remote wipe finished" : "Віддалене стирання завершено", "Authentication" : "Автентифікація", @@ -34,19 +35,24 @@ OC.L10N.register( "last year" : "минулого року", "_%n year ago_::_%n years ago_" : ["%n рік тому","%n років тому","%n років тому","%n років тому"], "_%n hour ago_::_%n hours ago_" : ["%nгодину тому","%n годин тому","%n годин тому","%n годин тому"], + "_%n minute ago_::_%n minutes ago_" : ["%n хвилину тому","%n хвилин тому","%n хвилин тому","%n хвилин тому"], "in a few seconds" : "через кілька секунд", "seconds ago" : "секунди тому", "Empty file" : "Порожній файл", "File already exists" : "Файл вже існує", + "Templates" : "Шаблони", "File name is a reserved word" : "Ім’я файлу є зарезервованим словом", "File name contains at least one invalid character" : "Ім’я файлу містить принаймні один некоректний символ", "File name is too long" : "Ім’я файлу занадто довге", "Dot files are not allowed" : "Файли які починаються з крапки не допустимі", "Empty filename is not allowed" : "Порожні імена файлів не допускаються", "App \"%s\" cannot be installed because appinfo file cannot be read." : "Застосунок \"%s\" не може бути встановлений через те, що файл appinfo не може бути прочитано.", + "App \"%s\" cannot be installed because it is not compatible with this version of the server." : "Програму \"%s\" неможливо встановити, оскільки вона не сумісна з цією версією сервера.", "__language_name__" : "Українська", "Help" : "Допомога", "Apps" : "Застосунки", + "Personal settings" : "Персональні налаштування", + "Administration settings" : "Налаштування адміністрування", "Settings" : "Налаштування", "Log out" : "Вихід", "Users" : "Користувачі", diff --git a/lib/l10n/uk.json b/lib/l10n/uk.json index 24ae8d496ba..51f70256612 100644 --- a/lib/l10n/uk.json +++ b/lib/l10n/uk.json @@ -14,6 +14,7 @@ "The command line tool %s could not be found" : "Утиліту командного рядка %s не знайдено", "The library %s is not available." : "Бібліотека %s недоступна.", "Server version %s or higher is required." : "Потрібна версія сервера %s або вище.", + "Server version %s or lower is required." : "Потрібна версія сервера %s або нижча.", "Remote wipe started" : "Розпочато віддалене стирання", "Remote wipe finished" : "Віддалене стирання завершено", "Authentication" : "Автентифікація", @@ -32,19 +33,24 @@ "last year" : "минулого року", "_%n year ago_::_%n years ago_" : ["%n рік тому","%n років тому","%n років тому","%n років тому"], "_%n hour ago_::_%n hours ago_" : ["%nгодину тому","%n годин тому","%n годин тому","%n годин тому"], + "_%n minute ago_::_%n minutes ago_" : ["%n хвилину тому","%n хвилин тому","%n хвилин тому","%n хвилин тому"], "in a few seconds" : "через кілька секунд", "seconds ago" : "секунди тому", "Empty file" : "Порожній файл", "File already exists" : "Файл вже існує", + "Templates" : "Шаблони", "File name is a reserved word" : "Ім’я файлу є зарезервованим словом", "File name contains at least one invalid character" : "Ім’я файлу містить принаймні один некоректний символ", "File name is too long" : "Ім’я файлу занадто довге", "Dot files are not allowed" : "Файли які починаються з крапки не допустимі", "Empty filename is not allowed" : "Порожні імена файлів не допускаються", "App \"%s\" cannot be installed because appinfo file cannot be read." : "Застосунок \"%s\" не може бути встановлений через те, що файл appinfo не може бути прочитано.", + "App \"%s\" cannot be installed because it is not compatible with this version of the server." : "Програму \"%s\" неможливо встановити, оскільки вона не сумісна з цією версією сервера.", "__language_name__" : "Українська", "Help" : "Допомога", "Apps" : "Застосунки", + "Personal settings" : "Персональні налаштування", + "Administration settings" : "Налаштування адміністрування", "Settings" : "Налаштування", "Log out" : "Вихід", "Users" : "Користувачі", diff --git a/lib/l10n/uz.js b/lib/l10n/uz.js index ff0e1f54a36..41cb4509e83 100644 --- a/lib/l10n/uz.js +++ b/lib/l10n/uz.js @@ -1,17 +1,25 @@ OC.L10N.register( "lib", { - "Cannot write into \"config\" directory!" : "\"Config\" katalogiga yozish mumkin emas!", - "Unknown filetype" : "Noma'lum filetype", - "Invalid image" : "Tasdiqlanmagan tasvir", - "seconds ago" : "soniya oldin", - "Help" : "Yordam", - "Apps" : "Ilovalar", - "Settings" : "Sozlamalar", - "Users" : "Foydalanuvchilar", - "About" : "Biz haqimizda", - "Unknown user" : "Noma'lum foydalanuvchi", - "January" : "Yanvar", - "Storage is temporarily not available" : "Saqlash vaqti-vaqti bilan mavjud emas" + "Cannot write into \"config\" directory!" : "Cannot write into \"config\" directory!", + "Unknown filetype" : "Unknown filetype", + "Invalid image" : "Invalid image", + "View profile" : "View profile", + "last month" : "last month", + "seconds ago" : "seconds ago", + "File name is too long" : "File name is too long", + "Help" : "Help", + "Apps" : "Apps", + "Settings" : "Settings", + "Users" : "Users", + "Address" : "Address", + "Profile picture" : "Profil rasmi", + "About" : "About", + "Full name" : "Full name", + "Unknown user" : "Unknown user", + "Set an admin password." : "Set an admin password.", + "January" : "January", + "Authentication error" : "Authentication error", + "Storage is temporarily not available" : "Storage is temporarily not available" }, "nplurals=1; plural=0;"); diff --git a/lib/l10n/uz.json b/lib/l10n/uz.json index eaf3a38a9b4..bbddc8953c7 100644 --- a/lib/l10n/uz.json +++ b/lib/l10n/uz.json @@ -1,15 +1,23 @@ { "translations": { - "Cannot write into \"config\" directory!" : "\"Config\" katalogiga yozish mumkin emas!", - "Unknown filetype" : "Noma'lum filetype", - "Invalid image" : "Tasdiqlanmagan tasvir", - "seconds ago" : "soniya oldin", - "Help" : "Yordam", - "Apps" : "Ilovalar", - "Settings" : "Sozlamalar", - "Users" : "Foydalanuvchilar", - "About" : "Biz haqimizda", - "Unknown user" : "Noma'lum foydalanuvchi", - "January" : "Yanvar", - "Storage is temporarily not available" : "Saqlash vaqti-vaqti bilan mavjud emas" + "Cannot write into \"config\" directory!" : "Cannot write into \"config\" directory!", + "Unknown filetype" : "Unknown filetype", + "Invalid image" : "Invalid image", + "View profile" : "View profile", + "last month" : "last month", + "seconds ago" : "seconds ago", + "File name is too long" : "File name is too long", + "Help" : "Help", + "Apps" : "Apps", + "Settings" : "Settings", + "Users" : "Users", + "Address" : "Address", + "Profile picture" : "Profil rasmi", + "About" : "About", + "Full name" : "Full name", + "Unknown user" : "Unknown user", + "Set an admin password." : "Set an admin password.", + "January" : "January", + "Authentication error" : "Authentication error", + "Storage is temporarily not available" : "Storage is temporarily not available" },"pluralForm" :"nplurals=1; plural=0;" }
\ No newline at end of file diff --git a/lib/l10n/zh_HK.js b/lib/l10n/zh_HK.js index b83d186a24d..ee5352413f5 100644 --- a/lib/l10n/zh_HK.js +++ b/lib/l10n/zh_HK.js @@ -91,6 +91,8 @@ OC.L10N.register( "This is an automatically sent email, please do not reply." : "此為自動寄送的電子郵件,請勿回覆。", "Help" : "說明", "Apps" : "應用程式", + "Personal settings" : "個人設定", + "Administration settings" : "管理設定", "Settings" : "設定", "Log out" : "登出", "Users" : "用戶", @@ -103,7 +105,7 @@ OC.L10N.register( "Website" : "網站", "Visit %s" : "探訪 %s", "Address" : "地址", - "Profile picture" : "個人檔案圖片", + "Profile picture" : "個人資料圖片", "About" : "關於", "Full name" : "全名", "Headline" : "標題", diff --git a/lib/l10n/zh_HK.json b/lib/l10n/zh_HK.json index b9335c27727..6f2f3e90bfd 100644 --- a/lib/l10n/zh_HK.json +++ b/lib/l10n/zh_HK.json @@ -89,6 +89,8 @@ "This is an automatically sent email, please do not reply." : "此為自動寄送的電子郵件,請勿回覆。", "Help" : "說明", "Apps" : "應用程式", + "Personal settings" : "個人設定", + "Administration settings" : "管理設定", "Settings" : "設定", "Log out" : "登出", "Users" : "用戶", @@ -101,7 +103,7 @@ "Website" : "網站", "Visit %s" : "探訪 %s", "Address" : "地址", - "Profile picture" : "個人檔案圖片", + "Profile picture" : "個人資料圖片", "About" : "關於", "Full name" : "全名", "Headline" : "標題", diff --git a/lib/l10n/zh_TW.js b/lib/l10n/zh_TW.js index 7d04bd7d3e7..80f3aac3a7a 100644 --- a/lib/l10n/zh_TW.js +++ b/lib/l10n/zh_TW.js @@ -91,6 +91,8 @@ OC.L10N.register( "This is an automatically sent email, please do not reply." : "此為自動寄送的電子郵件,請不要回覆。", "Help" : "說明", "Apps" : "應用程式", + "Personal settings" : "個人設定", + "Administration settings" : "管理設定", "Settings" : "設定", "Log out" : "登出", "Users" : "使用者", diff --git a/lib/l10n/zh_TW.json b/lib/l10n/zh_TW.json index c522a9f7277..524c950c704 100644 --- a/lib/l10n/zh_TW.json +++ b/lib/l10n/zh_TW.json @@ -89,6 +89,8 @@ "This is an automatically sent email, please do not reply." : "此為自動寄送的電子郵件,請不要回覆。", "Help" : "說明", "Apps" : "應用程式", + "Personal settings" : "個人設定", + "Administration settings" : "管理設定", "Settings" : "設定", "Log out" : "登出", "Users" : "使用者", diff --git a/lib/private/Calendar/Manager.php b/lib/private/Calendar/Manager.php index f0b8e9fd50d..550ba36dd6b 100644 --- a/lib/private/Calendar/Manager.php +++ b/lib/private/Calendar/Manager.php @@ -330,12 +330,27 @@ class Manager implements IManager { // to the email address in the ORGANIZER. // We don't want to accept a CANCEL request from just anyone $organizer = substr($vEvent->{'ORGANIZER'}->getValue(), 7); - if (strcasecmp($sender, $organizer) !== 0 && strcasecmp($replyTo, $organizer) !== 0) { + $isNotOrganizer = ($replyTo !== null) ? (strcasecmp($sender, $organizer) !== 0 && strcasecmp($replyTo, $organizer) !== 0) : (strcasecmp($sender, $organizer) !== 0); + if ($isNotOrganizer) { $this->logger->warning('Sender must be the ORGANIZER of this event'); return false; } + //check if the event is in the future + /** @var DateTime $eventTime */ + $eventTime = $vEvent->{'DTSTART'}; + if ($eventTime->getDateTime()->getTimeStamp() < $this->timeFactory->getTime()) { // this might cause issues with recurrences + $this->logger->warning('Only events in the future are processed'); + return false; + } + + // Check if we have a calendar to work with $calendars = $this->getCalendarsForPrincipal($principalUri); + if (empty($calendars)) { + $this->logger->warning('Could not find any calendars for principal ' . $principalUri); + return false; + } + $found = null; // if the attendee has been found in at least one calendar event with the UID of the iMIP event // we process it. diff --git a/lib/private/Federation/CloudIdManager.php b/lib/private/Federation/CloudIdManager.php index 77bb9437ba2..e4e42cb1293 100644 --- a/lib/private/Federation/CloudIdManager.php +++ b/lib/private/Federation/CloudIdManager.php @@ -30,11 +30,17 @@ declare(strict_types=1); */ namespace OC\Federation; +use OCA\DAV\Events\CardUpdatedEvent; use OCP\Contacts\IManager; +use OCP\EventDispatcher\Event; +use OCP\EventDispatcher\IEventDispatcher; use OCP\Federation\ICloudId; use OCP\Federation\ICloudIdManager; +use OCP\ICache; +use OCP\ICacheFactory; use OCP\IURLGenerator; use OCP\IUserManager; +use OCP\User\Events\UserChangedEvent; class CloudIdManager implements ICloudIdManager { /** @var IManager */ @@ -43,11 +49,48 @@ class CloudIdManager implements ICloudIdManager { private $urlGenerator; /** @var IUserManager */ private $userManager; - - public function __construct(IManager $contactsManager, IURLGenerator $urlGenerator, IUserManager $userManager) { + private ICache $memCache; + /** @var array[] */ + private array $cache = []; + + public function __construct( + IManager $contactsManager, + IURLGenerator $urlGenerator, + IUserManager $userManager, + ICacheFactory $cacheFactory, + IEventDispatcher $eventDispatcher + ) { $this->contactsManager = $contactsManager; $this->urlGenerator = $urlGenerator; $this->userManager = $userManager; + $this->memCache = $cacheFactory->createDistributed('cloud_id_'); + $eventDispatcher->addListener(UserChangedEvent::class, [$this, 'handleUserEvent']); + $eventDispatcher->addListener(CardUpdatedEvent::class, [$this, 'handleCardEvent']); + } + + public function handleUserEvent(Event $event): void { + if ($event instanceof UserChangedEvent && $event->getFeature() === 'displayName') { + $userId = $event->getUser()->getUID(); + $key = $userId . '@local'; + unset($this->cache[$key]); + $this->memCache->remove($key); + } + } + + public function handleCardEvent(Event $event): void { + if ($event instanceof CardUpdatedEvent) { + $data = $event->getCardData()['carddata']; + foreach (explode("\r\n", $data) as $line) { + if (strpos($line, "CLOUD;") === 0) { + $parts = explode(':', $line, 2); + if (isset($parts[1])) { + $key = $parts[1]; + unset($this->cache[$key]); + $this->memCache->remove($key); + } + } + } + } } /** @@ -120,18 +163,42 @@ class CloudIdManager implements ICloudIdManager { * @return CloudId */ public function getCloudId(string $user, ?string $remote): ICloudId { - if ($remote === null) { + $isLocal = $remote === null; + if ($isLocal) { $remote = rtrim($this->removeProtocolFromUrl($this->urlGenerator->getAbsoluteURL('/')), '/'); $fixedRemote = $this->fixRemoteURL($remote); - $localUser = $this->userManager->get($user); - $displayName = !is_null($localUser) ? $localUser->getDisplayName() : ''; + $host = $fixedRemote; } else { - // TODO check what the correct url is for remote (asking the remote) + // note that for remote id's we don't strip the protocol for the remote we use to construct the CloudId + // this way if a user has an explicit non-https cloud id this will be preserved + // we do still use the version without protocol for looking up the display name $fixedRemote = $this->fixRemoteURL($remote); $host = $this->removeProtocolFromUrl($fixedRemote); + } + + $key = $user . '@' . ($isLocal ? 'local' : $host); + $cached = $this->cache[$key] ?? $this->memCache->get($key); + if ($cached) { + $this->cache[$key] = $cached; // put items from memcache into local cache + return new CloudId($cached['id'], $cached['user'], $cached['remote'], $cached['displayName']); + } + + if ($isLocal) { + $localUser = $this->userManager->get($user); + $displayName = $localUser ? $localUser->getDisplayName() : ''; + } else { $displayName = $this->getDisplayNameFromContact($user . '@' . $host); } $id = $user . '@' . $remote; + + $data = [ + 'id' => $id, + 'user' => $user, + 'remote' => $fixedRemote, + 'displayName' => $displayName, + ]; + $this->cache[$key] = $data; + $this->memCache->set($key, $data, 15 * 60); return new CloudId($id, $user, $fixedRemote, $displayName); } diff --git a/lib/private/Files/SetupManager.php b/lib/private/Files/SetupManager.php index 5782a5a72a6..d52a291cd99 100644 --- a/lib/private/Files/SetupManager.php +++ b/lib/private/Files/SetupManager.php @@ -172,10 +172,10 @@ class SetupManager { */ if ($storage->instanceOfStorage(HomeObjectStoreStorage::class) || $storage->instanceOfStorage(Home::class)) { if (is_object($storage->getUser())) { - $quota = OC_Util::getUserQuota($storage->getUser()); - if ($quota !== \OCP\Files\FileInfo::SPACE_UNLIMITED) { - return new Quota(['storage' => $storage, 'quota' => $quota, 'root' => 'files']); - } + $user = $storage->getUser(); + return new Quota(['storage' => $storage, 'quotaCallback' => function () use ($user) { + return OC_Util::getUserQuota($user); + }, 'root' => 'files']); } } diff --git a/lib/private/Files/Storage/Wrapper/Quota.php b/lib/private/Files/Storage/Wrapper/Quota.php index 4cd0a5e0b4a..8b129472eb0 100644 --- a/lib/private/Files/Storage/Wrapper/Quota.php +++ b/lib/private/Files/Storage/Wrapper/Quota.php @@ -33,40 +33,47 @@ namespace OC\Files\Storage\Wrapper; use OC\Files\Filesystem; +use OC\SystemConfig; use OCP\Files\Cache\ICacheEntry; +use OCP\Files\FileInfo; use OCP\Files\Storage\IStorage; class Quota extends Wrapper { - - /** - * @var int $quota - */ - protected $quota; - - /** - * @var string $sizeRoot - */ - protected $sizeRoot; - - private $config; + /** @var callable|null */ + protected $quotaCallback; + protected ?int $quota; + protected string $sizeRoot; + private SystemConfig $config; /** * @param array $parameters */ public function __construct($parameters) { parent::__construct($parameters); - $this->quota = $parameters['quota']; - $this->sizeRoot = isset($parameters['root']) ? $parameters['root'] : ''; - $this->config = \OC::$server->getSystemConfig(); + $this->quota = $parameters['quota'] ?? null; + $this->quotaCallback = $parameters['quotaCallback'] ?? null; + $this->sizeRoot = $parameters['root'] ?? ''; + $this->config = \OC::$server->get(SystemConfig::class); } /** * @return int quota value */ - public function getQuota() { + public function getQuota(): int { + if ($this->quota === null) { + $quotaCallback = $this->quotaCallback; + if ($quotaCallback === null) { + throw new \Exception("No quota or quota callback provider"); + } + $this->quota = $quotaCallback(); + } return $this->quota; } + private function hasQuota(): bool { + return $this->getQuota() !== FileInfo::SPACE_UNLIMITED; + } + /** * @param string $path * @param \OC\Files\Storage\Storage $storage @@ -100,7 +107,10 @@ class Quota extends Wrapper { * @return int|bool */ public function free_space($path) { - if ($this->quota < 0 || strpos($path, 'cache') === 0 || strpos($path, 'uploads') === 0) { + if (!$this->hasQuota()) { + return $this->storage->free_space($path); + } + if ($this->getQuota() < 0 || strpos($path, 'cache') === 0 || strpos($path, 'uploads') === 0) { return $this->storage->free_space($path); } else { $used = $this->getSize($this->sizeRoot); @@ -108,7 +118,7 @@ class Quota extends Wrapper { return \OCP\Files\FileInfo::SPACE_NOT_COMPUTED; } else { $free = $this->storage->free_space($path); - $quotaFree = max($this->quota - $used, 0); + $quotaFree = max($this->getQuota() - $used, 0); // if free space is known if ($free >= 0) { $free = min($free, $quotaFree); @@ -128,6 +138,9 @@ class Quota extends Wrapper { * @return int|false */ public function file_put_contents($path, $data) { + if (!$this->hasQuota()) { + return $this->storage->file_put_contents($path, $data); + } $free = $this->free_space($path); if ($free < 0 or strlen($data) < $free) { return $this->storage->file_put_contents($path, $data); @@ -144,6 +157,9 @@ class Quota extends Wrapper { * @return bool */ public function copy($source, $target) { + if (!$this->hasQuota()) { + return $this->storage->copy($source, $target); + } $free = $this->free_space($target); if ($free < 0 or $this->getSize($source) < $free) { return $this->storage->copy($source, $target); @@ -160,6 +176,9 @@ class Quota extends Wrapper { * @return resource|bool */ public function fopen($path, $mode) { + if (!$this->hasQuota()) { + return $this->storage->fopen($path, $mode); + } $source = $this->storage->fopen($path, $mode); // don't apply quota for part files @@ -202,6 +221,9 @@ class Quota extends Wrapper { * @return bool */ public function copyFromStorage(IStorage $sourceStorage, $sourceInternalPath, $targetInternalPath) { + if (!$this->hasQuota()) { + return $this->storage->copyFromStorage($sourceStorage, $sourceInternalPath, $targetInternalPath); + } $free = $this->free_space($targetInternalPath); if ($free < 0 or $this->getSize($sourceInternalPath, $sourceStorage) < $free) { return $this->storage->copyFromStorage($sourceStorage, $sourceInternalPath, $targetInternalPath); @@ -217,6 +239,9 @@ class Quota extends Wrapper { * @return bool */ public function moveFromStorage(IStorage $sourceStorage, $sourceInternalPath, $targetInternalPath) { + if (!$this->hasQuota()) { + return $this->storage->moveFromStorage($sourceStorage, $sourceInternalPath, $targetInternalPath); + } $free = $this->free_space($targetInternalPath); if ($free < 0 or $this->getSize($sourceInternalPath, $sourceStorage) < $free) { return $this->storage->moveFromStorage($sourceStorage, $sourceInternalPath, $targetInternalPath); @@ -226,8 +251,11 @@ class Quota extends Wrapper { } public function mkdir($path) { + if (!$this->hasQuota()) { + return $this->storage->mkdir($path); + } $free = $this->free_space($path); - if ($this->shouldApplyQuota($path) && $free === 0.0) { + if ($this->shouldApplyQuota($path) && $free == 0) { return false; } @@ -235,8 +263,11 @@ class Quota extends Wrapper { } public function touch($path, $mtime = null) { + if (!$this->hasQuota()) { + return $this->storage->touch($path, $mtime); + } $free = $this->free_space($path); - if ($free === 0.0) { + if ($free == 0) { return false; } diff --git a/lib/private/Files/Stream/HashWrapper.php b/lib/private/Files/Stream/HashWrapper.php index fd9bb3cdd0b..4060d74de7d 100644 --- a/lib/private/Files/Stream/HashWrapper.php +++ b/lib/private/Files/Stream/HashWrapper.php @@ -67,7 +67,16 @@ class HashWrapper extends Wrapper { public function stream_close() { if (is_callable($this->callback)) { - call_user_func($this->callback, hash_final($this->hash)); + // if the stream is closed as a result of the end-of-request GC, the hash context might be cleaned up before this stream + if ($this->hash instanceof \HashContext) { + try { + $hash = @hash_final($this->hash); + if ($hash) { + call_user_func($this->callback, $hash); + } + } catch (\Throwable $e) { + } + } // prevent further calls by potential PHP 7 GC ghosts $this->callback = null; } diff --git a/lib/private/NavigationManager.php b/lib/private/NavigationManager.php index bbf28d2c142..7fd76850816 100644 --- a/lib/private/NavigationManager.php +++ b/lib/private/NavigationManager.php @@ -228,7 +228,7 @@ class NavigationManager implements INavigationManager { 'id' => 'admin_settings', 'order' => 3, 'href' => $this->urlGenerator->linkToRoute('settings.AdminSettings.index', ['section' => 'overview']), - 'name' => $l->t('Admin settings'), + 'name' => $l->t('Administration settings'), 'icon' => $this->urlGenerator->imagePath('settings', 'admin.svg'), ]); } else { diff --git a/lib/private/Repair/MoveUpdaterStepFile.php b/lib/private/Repair/MoveUpdaterStepFile.php index bc7430d7a7f..020510804d7 100644 --- a/lib/private/Repair/MoveUpdaterStepFile.php +++ b/lib/private/Repair/MoveUpdaterStepFile.php @@ -43,14 +43,14 @@ class MoveUpdaterStepFile implements IRepairStep { } public function run(IOutput $output) { - $dataDir = $this->config->getSystemValue('datadirectory', \OC::$SERVERROOT . '/data'); + $updateDir = $this->config->getSystemValue('updatedirectory') ?? $this->config->getSystemValue('datadirectory', \OC::$SERVERROOT . '/data'); $instanceId = $this->config->getSystemValue('instanceid', null); if (!is_string($instanceId) || empty($instanceId)) { return; } - $updaterFolderPath = $dataDir . '/updater-' . $instanceId; + $updaterFolderPath = $updateDir . '/updater-' . $instanceId; $stepFile = $updaterFolderPath . '/.step'; if (file_exists($stepFile)) { $output->info('.step file exists'); diff --git a/lib/private/Server.php b/lib/private/Server.php index f18ac7b6534..c1a50cfcaff 100644 --- a/lib/private/Server.php +++ b/lib/private/Server.php @@ -1365,7 +1365,13 @@ class Server extends ServerContainer implements IServerContainer { }); $this->registerService(ICloudIdManager::class, function (ContainerInterface $c) { - return new CloudIdManager($c->get(\OCP\Contacts\IManager::class), $c->get(IURLGenerator::class), $c->get(IUserManager::class)); + return new CloudIdManager( + $c->get(\OCP\Contacts\IManager::class), + $c->get(IURLGenerator::class), + $c->get(IUserManager::class), + $c->get(ICacheFactory::class), + $c->get(IEventDispatcher::class), + ); }); $this->registerAlias(\OCP\GlobalScale\IConfig::class, \OC\GlobalScale\Config::class); diff --git a/lib/private/Settings/Manager.php b/lib/private/Settings/Manager.php index 05a286e4758..44f1df09c15 100644 --- a/lib/private/Settings/Manager.php +++ b/lib/private/Settings/Manager.php @@ -150,6 +150,13 @@ class Manager implements IManager { return $this->sections[$type]; } + public function getSection(string $type, string $sectionId): ?IIconSection { + if (isset($this->sections[$type]) && isset($this->sections[$type][$sectionId])) { + return $this->sections[$type][$sectionId]; + } + return null; + } + protected function isKnownDuplicateSectionId(string $sectionID): bool { return in_array($sectionID, [ 'connected-accounts', diff --git a/lib/private/User/Database.php b/lib/private/User/Database.php index 0b38f04bfe3..f106c2e8b6d 100644 --- a/lib/private/User/Database.php +++ b/lib/private/User/Database.php @@ -212,11 +212,13 @@ class Database extends ABackend implements * @param string $displayName The new display name * @return bool * + * @throws \InvalidArgumentException + * * Change the display name of a user */ public function setDisplayName(string $uid, string $displayName): bool { if (mb_strlen($displayName) > 64) { - return false; + throw new \InvalidArgumentException('Invalid displayname'); } $this->fixDI(); diff --git a/lib/private/User/Session.php b/lib/private/User/Session.php index 626ddca2dad..65a213d4bf8 100644 --- a/lib/private/User/Session.php +++ b/lib/private/User/Session.php @@ -865,6 +865,10 @@ class Session implements IUserSession, Emitter { $tokens = $this->config->getUserKeys($uid, 'login_token'); // test cookies token against stored tokens if (!in_array($currentToken, $tokens, true)) { + $this->logger->error('Tried to log in {uid} but could not verify token', [ + 'app' => 'core', + 'uid' => $uid, + ]); return false; } // replace successfully used token with a new one @@ -876,6 +880,10 @@ class Session implements IUserSession, Emitter { $sessionId = $this->session->getId(); $token = $this->tokenProvider->renewSessionToken($oldSessionId, $sessionId); } catch (SessionNotAvailableException $ex) { + $this->logger->warning('Could not renew session token for {uid} because the session is unavailable', [ + 'app' => 'core', + 'uid' => $uid, + ]); return false; } catch (InvalidTokenException $ex) { $this->logger->warning('Renewing session token failed', ['app' => 'core']); diff --git a/lib/private/User/User.php b/lib/private/User/User.php index 7f7d6273e30..f5d93dcd680 100644 --- a/lib/private/User/User.php +++ b/lib/private/User/User.php @@ -154,6 +154,9 @@ class User implements IUser { * * @param string $displayName * @return bool + * + * @since 25.0.0 Throw InvalidArgumentException + * @throws \InvalidArgumentException */ public function setDisplayName($displayName) { $displayName = trim($displayName); @@ -196,7 +199,7 @@ class User implements IUser { $this->setPrimaryEMailAddress(''); } - if ($oldMailAddress !== $mailAddress) { + if ($oldMailAddress !== strtolower($mailAddress)) { $this->triggerChange('eMailAddress', $mailAddress, $oldMailAddress); } } @@ -556,6 +559,9 @@ class User implements IUser { public function getCloudId() { $uid = $this->getUID(); $server = $this->urlGenerator->getAbsoluteURL('/'); + if (substr($server, -10) === '/index.php') { + $server = substr($server, 0, -10); + } $server = rtrim($this->removeProtocolFromUrl($server), '/'); return $uid . '@' . $server; } diff --git a/lib/public/AppFramework/Http/Response.php b/lib/public/AppFramework/Http/Response.php index 6febef838cf..9dd84a16649 100644 --- a/lib/public/AppFramework/Http/Response.php +++ b/lib/public/AppFramework/Http/Response.php @@ -105,8 +105,10 @@ class Response { /** * Caches the response - * @param int $cacheSeconds the amount of seconds that should be cached - * if 0 then caching will be disabled + * + * @param int $cacheSeconds amount of seconds the response is fresh, 0 to disable cache. + * @param bool $public whether the page should be cached by public proxy. Usually should be false, unless this is a static resources. + * @param bool $immutable whether browser should treat the resource as immutable and not ask the server for each page load if the resource changed. * @return $this * @since 6.0.0 - return value was added in 7.0.0 */ diff --git a/lib/public/Collaboration/Reference/RenderReferenceEvent.php b/lib/public/Collaboration/Reference/RenderReferenceEvent.php new file mode 100644 index 00000000000..b6d312636c4 --- /dev/null +++ b/lib/public/Collaboration/Reference/RenderReferenceEvent.php @@ -0,0 +1,36 @@ +<?php + +declare(strict_types=1); +/** + * @copyright Copyright (c) 2022 Julius Härtl <jus@bitgrid.net> + * + * @author Julius Härtl <jus@bitgrid.net> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +namespace OCP\Collaboration\Reference; + +use OCP\EventDispatcher\Event; + +/** + * Event that apps can emit on their page rendering to trigger loading of aditional + * scripts for reference widget rendering + * + * @since 25.0.0 + */ +class RenderReferenceEvent extends Event { +} diff --git a/lib/public/IUser.php b/lib/public/IUser.php index daf993df6cd..bb7bdf3304a 100644 --- a/lib/public/IUser.php +++ b/lib/public/IUser.php @@ -58,6 +58,9 @@ interface IUser { * @param string $displayName * @return bool * @since 8.0.0 + * + * @since 25.0.0 Throw InvalidArgumentException + * @throws \InvalidArgumentException */ public function setDisplayName($displayName); diff --git a/lib/public/Settings/IIconSection.php b/lib/public/Settings/IIconSection.php index c56565fbf85..bb9b2e94b0d 100644 --- a/lib/public/Settings/IIconSection.php +++ b/lib/public/Settings/IIconSection.php @@ -31,7 +31,7 @@ interface IIconSection { * returns the ID of the section. It is supposed to be a lower case string, * e.g. 'ldap' * - * @returns string + * @return string * @since 9.1 */ public function getID(); @@ -59,7 +59,7 @@ interface IIconSection { * returns the relative path to an 16*16 icon describing the section. * e.g. '/core/img/places/files.svg' * - * @returns string + * @return string * @since 12 */ public function getIcon(); diff --git a/lib/public/Settings/IManager.php b/lib/public/Settings/IManager.php index 2ec3fb0fd21..10de596dbea 100644 --- a/lib/public/Settings/IManager.php +++ b/lib/public/Settings/IManager.php @@ -116,4 +116,10 @@ interface IManager { * @since 13.0.0 */ public function getPersonalSettings($section): array; + + /** + * Get a specific section by type and id + * @since 25.0.0 + */ + public function getSection(string $type, string $sectionId): ?IIconSection; } diff --git a/lib/public/User/Backend/ISetDisplayNameBackend.php b/lib/public/User/Backend/ISetDisplayNameBackend.php index 922d356bfd7..db62223ad52 100644 --- a/lib/public/User/Backend/ISetDisplayNameBackend.php +++ b/lib/public/User/Backend/ISetDisplayNameBackend.php @@ -36,6 +36,9 @@ interface ISetDisplayNameBackend { * @param string $uid The username * @param string $displayName The new display name * @return bool + * + * @since 25.0.0 Throw InvalidArgumentException + * @throws \InvalidArgumentException */ public function setDisplayName(string $uid, string $displayName): bool; } |