Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/server.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
Diffstat (limited to 'apps')
-rw-r--r--apps/accessibility/l10n/zh_CN.js2
-rw-r--r--apps/accessibility/l10n/zh_CN.json2
-rw-r--r--apps/dav/l10n/de.js9
-rw-r--r--apps/dav/l10n/de.json9
-rw-r--r--apps/dav/l10n/de_DE.js11
-rw-r--r--apps/dav/l10n/de_DE.json11
-rw-r--r--apps/dav/l10n/fr.js13
-rw-r--r--apps/dav/l10n/fr.json13
-rw-r--r--apps/dav/l10n/it.js3
-rw-r--r--apps/dav/l10n/it.json3
-rw-r--r--apps/dav/l10n/zh_HK.js17
-rw-r--r--apps/dav/l10n/zh_HK.json17
-rw-r--r--apps/dav/lib/Connector/Sabre/File.php18
-rw-r--r--apps/dav/tests/unit/Connector/Sabre/ObjectTreeTest.php9
-rw-r--r--apps/files/l10n/ro.js11
-rw-r--r--apps/files/l10n/ro.json11
-rw-r--r--apps/files_external/tests/PersonalMountTest.php7
-rw-r--r--apps/files_sharing/l10n/eu.js6
-rw-r--r--apps/files_sharing/l10n/eu.json6
-rw-r--r--apps/files_sharing/l10n/pl.js2
-rw-r--r--apps/files_sharing/l10n/pl.json2
-rw-r--r--apps/files_sharing/lib/Activity/Providers/Base.php13
-rw-r--r--apps/files_sharing/lib/Activity/Providers/Downloads.php25
-rw-r--r--apps/files_sharing/lib/Activity/Providers/Groups.php7
-rw-r--r--apps/files_sharing/lib/Activity/Providers/PublicLinks.php3
-rw-r--r--apps/files_sharing/lib/Activity/Providers/RemoteShares.php10
-rw-r--r--apps/files_sharing/lib/Activity/Providers/Users.php3
-rw-r--r--apps/files_sharing/lib/Controller/ShareController.php6
-rw-r--r--apps/files_sharing/lib/External/Manager.php6
-rw-r--r--apps/files_sharing/lib/Updater.php2
-rw-r--r--apps/files_sharing/tests/CacheTest.php8
-rw-r--r--apps/files_sharing/tests/External/ManagerTest.php18
-rw-r--r--apps/files_trashbin/l10n/nb.js14
-rw-r--r--apps/files_trashbin/l10n/nb.json14
-rw-r--r--apps/files_trashbin/tests/StorageTest.php4
-rw-r--r--apps/files_versions/l10n/nb.js2
-rw-r--r--apps/files_versions/l10n/nb.json2
-rw-r--r--apps/oauth2/l10n/nb.js5
-rw-r--r--apps/oauth2/l10n/nb.json5
-rw-r--r--apps/settings/l10n/de.js1
-rw-r--r--apps/settings/l10n/de.json1
-rw-r--r--apps/settings/l10n/de_DE.js1
-rw-r--r--apps/settings/l10n/de_DE.json1
-rw-r--r--apps/settings/l10n/es.js1
-rw-r--r--apps/settings/l10n/es.json1
-rw-r--r--apps/settings/l10n/zh_HK.js1
-rw-r--r--apps/settings/l10n/zh_HK.json1
-rw-r--r--apps/settings/lib/Controller/CheckSetupController.php60
-rw-r--r--apps/settings/src/store/index.js5
-rw-r--r--apps/settings/tests/Controller/CheckSetupControllerTest.php15
-rw-r--r--apps/theming/css/theming.scss13
-rw-r--r--apps/theming/l10n/nb.js7
-rw-r--r--apps/theming/l10n/nb.json7
-rw-r--r--apps/user_ldap/lib/Migration/Version1130Date20211102154716.php20
54 files changed, 375 insertions, 89 deletions
diff --git a/apps/accessibility/l10n/zh_CN.js b/apps/accessibility/l10n/zh_CN.js
index e0397935e14..c2fcf620956 100644
--- a/apps/accessibility/l10n/zh_CN.js
+++ b/apps/accessibility/l10n/zh_CN.js
@@ -3,7 +3,7 @@ OC.L10N.register(
{
"Dark theme" : "深色主题",
"Enable dark theme" : "启用深色主题",
- "A dark theme to ease your eyes by reducing the overall luminosity and brightness. It is still under development, so please report any issues you may find." : "一款通过降低整体亮度来使您的眼睛放松的深色主题。该主题目前还在开发中,请您及时向我们反馈您可能发现的任何问题。",
+ "A dark theme to ease your eyes by reducing the overall luminosity and brightness. It is still under development, so please report any issues you may find." : "深色主题通过降低色彩的明度和亮度来使您的眼睛保持舒适。这个功能还在完善中,所以请您随时向我们反馈所发现的问题。",
"High contrast mode" : "高对比度模式",
"Enable high contrast mode" : "启用高对比度模式",
"A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "使用高对比度模式。图像质量会下降,但清晰度会提升。",
diff --git a/apps/accessibility/l10n/zh_CN.json b/apps/accessibility/l10n/zh_CN.json
index f06f85dc3a8..932435e6ba1 100644
--- a/apps/accessibility/l10n/zh_CN.json
+++ b/apps/accessibility/l10n/zh_CN.json
@@ -1,7 +1,7 @@
{ "translations": {
"Dark theme" : "深色主题",
"Enable dark theme" : "启用深色主题",
- "A dark theme to ease your eyes by reducing the overall luminosity and brightness. It is still under development, so please report any issues you may find." : "一款通过降低整体亮度来使您的眼睛放松的深色主题。该主题目前还在开发中,请您及时向我们反馈您可能发现的任何问题。",
+ "A dark theme to ease your eyes by reducing the overall luminosity and brightness. It is still under development, so please report any issues you may find." : "深色主题通过降低色彩的明度和亮度来使您的眼睛保持舒适。这个功能还在完善中,所以请您随时向我们反馈所发现的问题。",
"High contrast mode" : "高对比度模式",
"Enable high contrast mode" : "启用高对比度模式",
"A high contrast mode to ease your navigation. Visual quality will be reduced but clarity will be increased." : "使用高对比度模式。图像质量会下降,但清晰度会提升。",
diff --git a/apps/dav/l10n/de.js b/apps/dav/l10n/de.js
index a92583101fd..a1556055ba7 100644
--- a/apps/dav/l10n/de.js
+++ b/apps/dav/l10n/de.js
@@ -109,12 +109,21 @@ OC.L10N.register(
"You updated contact {card} in address book {addressbook}" : "Du hast den Kontakt {card} im Adressbuch {addressbook} aktualisiert",
"A <strong>contact</strong> or <strong>address book</strong> was modified" : "Ein <strong>Kontakt</strong> oder ein <strong>Adressbuch</strong> wurde geändert",
"File is not updatable: %1$s" : "Datei kann nicht aktualisiert werden: %1$s",
+ "Could not write to final file, canceled by hook" : "In die endgültige Datei konnte nicht geschrieben werden, wurde durch einen Hook abgebrochen",
"Could not write file contents" : "Dateiinhalt konnte nicht geschrieben werden",
"_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
+ "Error while copying file to target location (copied: %1$s, expected filesize: %2$s)" : "Fehler beim Kopieren der Datei in den Zielspeicherort (kopiert: %1$s, erwartete Dateigröße: %2$s)",
+ "Expected filesize of %1$s but read (from Nextcloud client) and wrote (to Nextcloud storage) %2$s. Could either be a network problem on the sending side or a problem writing to the storage on the server side." : "Erwartete Dateigröße von %1$s, aber %2$s gelesen (vom Nextcloud-Client) und geschrieben (in den Nextcloud-Speicher). Dies kann entweder ein Netzwerkproblem auf der sendenden Seite oder ein Problem beim Schreiben in den Speicher auf der Serverseite sein.",
+ "Could not rename part file to final file, canceled by hook" : "Konnte temporäre Datei nicht in die endgültige Datei umbenennen, wurde durch einen Hook abgebrochen",
+ "Could not rename part file to final file" : "Konnte temporäre Datei nicht in die endgültige Datei umbenennen",
"Failed to check file size: %1$s" : "Dateigröße konnte nicht überprüft werden: %1$s",
"Could not open file" : "Datei konnte nicht geöffnet werden",
"Encryption not ready: %1$s" : "Verschlüsselung nicht bereit: %1$s",
"Failed to open file: %1$s" : "Datei konnte nicht geöffnet werden: %1$s",
+ "Failed to unlink: %1$s" : "Fehler beim Aufheben der Verknüpfung: %1$s",
+ "Invalid chunk name" : "Ungültiger Chunk-Name",
+ "Could not rename part file assembled from chunks" : "Aus Chunks zusammengesetzte temporäre Datei konnte nicht umbenannt werden",
+ "Failed to write file contents: %1$s" : "Fehler beim Schreiben des Dateiinhaltes: %1$s",
"File not found: %1$s" : "Datei nicht gefunden: %1$s",
"System is in maintenance mode." : "Das System befindet sich im Wartungsmodus.",
"Upgrade needed" : "Aktualisierung erforderlich",
diff --git a/apps/dav/l10n/de.json b/apps/dav/l10n/de.json
index e62b15261ca..619e22c6bd8 100644
--- a/apps/dav/l10n/de.json
+++ b/apps/dav/l10n/de.json
@@ -107,12 +107,21 @@
"You updated contact {card} in address book {addressbook}" : "Du hast den Kontakt {card} im Adressbuch {addressbook} aktualisiert",
"A <strong>contact</strong> or <strong>address book</strong> was modified" : "Ein <strong>Kontakt</strong> oder ein <strong>Adressbuch</strong> wurde geändert",
"File is not updatable: %1$s" : "Datei kann nicht aktualisiert werden: %1$s",
+ "Could not write to final file, canceled by hook" : "In die endgültige Datei konnte nicht geschrieben werden, wurde durch einen Hook abgebrochen",
"Could not write file contents" : "Dateiinhalt konnte nicht geschrieben werden",
"_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
+ "Error while copying file to target location (copied: %1$s, expected filesize: %2$s)" : "Fehler beim Kopieren der Datei in den Zielspeicherort (kopiert: %1$s, erwartete Dateigröße: %2$s)",
+ "Expected filesize of %1$s but read (from Nextcloud client) and wrote (to Nextcloud storage) %2$s. Could either be a network problem on the sending side or a problem writing to the storage on the server side." : "Erwartete Dateigröße von %1$s, aber %2$s gelesen (vom Nextcloud-Client) und geschrieben (in den Nextcloud-Speicher). Dies kann entweder ein Netzwerkproblem auf der sendenden Seite oder ein Problem beim Schreiben in den Speicher auf der Serverseite sein.",
+ "Could not rename part file to final file, canceled by hook" : "Konnte temporäre Datei nicht in die endgültige Datei umbenennen, wurde durch einen Hook abgebrochen",
+ "Could not rename part file to final file" : "Konnte temporäre Datei nicht in die endgültige Datei umbenennen",
"Failed to check file size: %1$s" : "Dateigröße konnte nicht überprüft werden: %1$s",
"Could not open file" : "Datei konnte nicht geöffnet werden",
"Encryption not ready: %1$s" : "Verschlüsselung nicht bereit: %1$s",
"Failed to open file: %1$s" : "Datei konnte nicht geöffnet werden: %1$s",
+ "Failed to unlink: %1$s" : "Fehler beim Aufheben der Verknüpfung: %1$s",
+ "Invalid chunk name" : "Ungültiger Chunk-Name",
+ "Could not rename part file assembled from chunks" : "Aus Chunks zusammengesetzte temporäre Datei konnte nicht umbenannt werden",
+ "Failed to write file contents: %1$s" : "Fehler beim Schreiben des Dateiinhaltes: %1$s",
"File not found: %1$s" : "Datei nicht gefunden: %1$s",
"System is in maintenance mode." : "Das System befindet sich im Wartungsmodus.",
"Upgrade needed" : "Aktualisierung erforderlich",
diff --git a/apps/dav/l10n/de_DE.js b/apps/dav/l10n/de_DE.js
index 73d336afe47..66f183e5219 100644
--- a/apps/dav/l10n/de_DE.js
+++ b/apps/dav/l10n/de_DE.js
@@ -109,12 +109,21 @@ OC.L10N.register(
"You updated contact {card} in address book {addressbook}" : "Sie haben den Kontakt {card} im Adressbuch {addressbook} aktualisiert",
"A <strong>contact</strong> or <strong>address book</strong> was modified" : "Ein <strong>Kontakt</strong> oder ein <strong>Adressbuch</strong> wurde geändert",
"File is not updatable: %1$s" : "Datei kann nicht aktualisiert werden: %1$s",
- "Could not write file contents" : "Dateiinhalt konnte nicht geschrieben werden",
+ "Could not write to final file, canceled by hook" : "Konnte nicht in die endgültige Datei schreiben, wurde durch Hook abgebrochen.",
+ "Could not write file contents" : "Dateiinhalt konnte nicht geschrieben werden",
"_%n byte_::_%n bytes_" : ["%n Byte","%n Bytes"],
+ "Error while copying file to target location (copied: %1$s, expected filesize: %2$s)" : "Fehler beim Kopieren der Datei in den Zielspeicherort (kopiert: %1$s, erwartete Dateigröße: %2$s)",
+ "Expected filesize of %1$s but read (from Nextcloud client) and wrote (to Nextcloud storage) %2$s. Could either be a network problem on the sending side or a problem writing to the storage on the server side." : "Erwartete Dateigröße von %1$s, aber %2$s gelesen (vom Nextcloud-Client) und geschrieben (in den Nextcloud-Speicher). Dies kann entweder ein Netzwerkproblem auf der sendenden Seite oder ein Problem beim Schreiben in den Speicher auf der Serverseite sein.",
+ "Could not rename part file to final file, canceled by hook" : "Konnte Teildatei nicht in endgültige Datei umbenennen, wurde durch Hook abgebrochen.",
+ "Could not rename part file to final file" : "Konnte Teildatei nicht in endgültige Datei umbenennen",
"Failed to check file size: %1$s" : "Dateigröße konnte nicht überprüft werden: %1$s",
"Could not open file" : "Datei konnte nicht geöffnet werden",
"Encryption not ready: %1$s" : "Verschlüsselung nicht bereit: %1$s",
"Failed to open file: %1$s" : "Datei konnte nicht geöffnet werden: %1$s",
+ "Failed to unlink: %1$s" : "Fehler beim Aufheben der Verknüpfung: %1$s",
+ "Invalid chunk name" : "Ungültiger Chunk-Name",
+ "Could not rename part file assembled from chunks" : "Aus Chunks zusammengesetzte Teildatei konnte nicht umbenannt werden",
+ "Failed to write file contents: %1$s" : "Fehler beim Schreiben des Dateiinhalts: %1$s",
"File not found: %1$s" : "Datei nicht gefunden: %1$s",
"System is in maintenance mode." : "Das System befindet sich im Wartungsmodus.",
"Upgrade needed" : "Aktualisierung erforderlich",
diff --git a/apps/dav/l10n/de_DE.json b/apps/dav/l10n/de_DE.json
index 2e97759ef19..f5627a45076 100644
--- a/apps/dav/l10n/de_DE.json
+++ b/apps/dav/l10n/de_DE.json
@@ -107,12 +107,21 @@
"You updated contact {card} in address book {addressbook}" : "Sie haben den Kontakt {card} im Adressbuch {addressbook} aktualisiert",
"A <strong>contact</strong> or <strong>address book</strong> was modified" : "Ein <strong>Kontakt</strong> oder ein <strong>Adressbuch</strong> wurde geändert",
"File is not updatable: %1$s" : "Datei kann nicht aktualisiert werden: %1$s",
- "Could not write file contents" : "Dateiinhalt konnte nicht geschrieben werden",
+ "Could not write to final file, canceled by hook" : "Konnte nicht in die endgültige Datei schreiben, wurde durch Hook abgebrochen.",
+ "Could not write file contents" : "Dateiinhalt konnte nicht geschrieben werden",
"_%n byte_::_%n bytes_" : ["%n Byte","%n Bytes"],
+ "Error while copying file to target location (copied: %1$s, expected filesize: %2$s)" : "Fehler beim Kopieren der Datei in den Zielspeicherort (kopiert: %1$s, erwartete Dateigröße: %2$s)",
+ "Expected filesize of %1$s but read (from Nextcloud client) and wrote (to Nextcloud storage) %2$s. Could either be a network problem on the sending side or a problem writing to the storage on the server side." : "Erwartete Dateigröße von %1$s, aber %2$s gelesen (vom Nextcloud-Client) und geschrieben (in den Nextcloud-Speicher). Dies kann entweder ein Netzwerkproblem auf der sendenden Seite oder ein Problem beim Schreiben in den Speicher auf der Serverseite sein.",
+ "Could not rename part file to final file, canceled by hook" : "Konnte Teildatei nicht in endgültige Datei umbenennen, wurde durch Hook abgebrochen.",
+ "Could not rename part file to final file" : "Konnte Teildatei nicht in endgültige Datei umbenennen",
"Failed to check file size: %1$s" : "Dateigröße konnte nicht überprüft werden: %1$s",
"Could not open file" : "Datei konnte nicht geöffnet werden",
"Encryption not ready: %1$s" : "Verschlüsselung nicht bereit: %1$s",
"Failed to open file: %1$s" : "Datei konnte nicht geöffnet werden: %1$s",
+ "Failed to unlink: %1$s" : "Fehler beim Aufheben der Verknüpfung: %1$s",
+ "Invalid chunk name" : "Ungültiger Chunk-Name",
+ "Could not rename part file assembled from chunks" : "Aus Chunks zusammengesetzte Teildatei konnte nicht umbenannt werden",
+ "Failed to write file contents: %1$s" : "Fehler beim Schreiben des Dateiinhalts: %1$s",
"File not found: %1$s" : "Datei nicht gefunden: %1$s",
"System is in maintenance mode." : "Das System befindet sich im Wartungsmodus.",
"Upgrade needed" : "Aktualisierung erforderlich",
diff --git a/apps/dav/l10n/fr.js b/apps/dav/l10n/fr.js
index e82d25bdd4c..b626481677f 100644
--- a/apps/dav/l10n/fr.js
+++ b/apps/dav/l10n/fr.js
@@ -108,6 +108,19 @@ OC.L10N.register(
"{actor} updated contact {card} in address book {addressbook}" : "{actor} a mis à jour le contact {card} dans le carnet d'adresses {addressbook}",
"You updated contact {card} in address book {addressbook}" : "Vous avez mis à jour le contact {card} dans le carnet d'adresses {addressbook}",
"A <strong>contact</strong> or <strong>address book</strong> was modified" : "Un <strong>contact</strong> ou <strong>carnet d'adresses</strong> a été modifié",
+ "File is not updatable: %1$s" : "Ce fichier ne peut pas être mis à jour : %1$s",
+ "Could not write file contents" : "Impossible d'écrire le contenu du fichier",
+ "_%n byte_::_%n bytes_" : ["%n octet","%n octets"],
+ "Error while copying file to target location (copied: %1$s, expected filesize: %2$s)" : "Erreur en copiant le fichier à destination (copié : %1$s, taille du fichier attendue : %2$s)",
+ "Expected filesize of %1$s but read (from Nextcloud client) and wrote (to Nextcloud storage) %2$s. Could either be a network problem on the sending side or a problem writing to the storage on the server side." : "Taille du fichier attendue : %1$s mais taille du fichier lue (depuis le client Nextcloud) et écrit (dans le stockage Nextcloud) : %2$s. Cela peut être un problème de réseau au niveau du client ou un problème de stockage au niveau du serveur.",
+ "Could not rename part file to final file" : "Impossible de renommer le fichier partiel en fichier définitif.",
+ "Failed to check file size: %1$s" : "Échec à la vérification de la taille du fichier : %1$s",
+ "Could not open file" : "Impossible d'ouvrir le fichier",
+ "Encryption not ready: %1$s" : "Encryption pas prête : %1$s",
+ "Failed to open file: %1$s" : "Échec à l'ouverture du fichier : %1$s",
+ "Failed to unlink: %1$s" : "Échec à la suppression :%1$s",
+ "Failed to write file contents: %1$s" : "Échec à l'écriture du contenu du fichier : %1$s",
+ "File not found: %1$s" : "Fichier non trouvé : %1$s",
"System is in maintenance mode." : "Le système est en mode maintenance.",
"Upgrade needed" : "Mise à jour requise",
"Your %s needs to be configured to use HTTPS in order to use CalDAV and CardDAV with iOS/macOS." : "Votre %s a besoin d'être configuré pour utiliser le HTTPS dans le but d'utiliser CalDAV et CardDAV avec iOS/macOS.",
diff --git a/apps/dav/l10n/fr.json b/apps/dav/l10n/fr.json
index d82ec7c70ee..4d4cc4d950a 100644
--- a/apps/dav/l10n/fr.json
+++ b/apps/dav/l10n/fr.json
@@ -106,6 +106,19 @@
"{actor} updated contact {card} in address book {addressbook}" : "{actor} a mis à jour le contact {card} dans le carnet d'adresses {addressbook}",
"You updated contact {card} in address book {addressbook}" : "Vous avez mis à jour le contact {card} dans le carnet d'adresses {addressbook}",
"A <strong>contact</strong> or <strong>address book</strong> was modified" : "Un <strong>contact</strong> ou <strong>carnet d'adresses</strong> a été modifié",
+ "File is not updatable: %1$s" : "Ce fichier ne peut pas être mis à jour : %1$s",
+ "Could not write file contents" : "Impossible d'écrire le contenu du fichier",
+ "_%n byte_::_%n bytes_" : ["%n octet","%n octets"],
+ "Error while copying file to target location (copied: %1$s, expected filesize: %2$s)" : "Erreur en copiant le fichier à destination (copié : %1$s, taille du fichier attendue : %2$s)",
+ "Expected filesize of %1$s but read (from Nextcloud client) and wrote (to Nextcloud storage) %2$s. Could either be a network problem on the sending side or a problem writing to the storage on the server side." : "Taille du fichier attendue : %1$s mais taille du fichier lue (depuis le client Nextcloud) et écrit (dans le stockage Nextcloud) : %2$s. Cela peut être un problème de réseau au niveau du client ou un problème de stockage au niveau du serveur.",
+ "Could not rename part file to final file" : "Impossible de renommer le fichier partiel en fichier définitif.",
+ "Failed to check file size: %1$s" : "Échec à la vérification de la taille du fichier : %1$s",
+ "Could not open file" : "Impossible d'ouvrir le fichier",
+ "Encryption not ready: %1$s" : "Encryption pas prête : %1$s",
+ "Failed to open file: %1$s" : "Échec à l'ouverture du fichier : %1$s",
+ "Failed to unlink: %1$s" : "Échec à la suppression :%1$s",
+ "Failed to write file contents: %1$s" : "Échec à l'écriture du contenu du fichier : %1$s",
+ "File not found: %1$s" : "Fichier non trouvé : %1$s",
"System is in maintenance mode." : "Le système est en mode maintenance.",
"Upgrade needed" : "Mise à jour requise",
"Your %s needs to be configured to use HTTPS in order to use CalDAV and CardDAV with iOS/macOS." : "Votre %s a besoin d'être configuré pour utiliser le HTTPS dans le but d'utiliser CalDAV et CardDAV avec iOS/macOS.",
diff --git a/apps/dav/l10n/it.js b/apps/dav/l10n/it.js
index 94c1447ef08..bd1d1271c99 100644
--- a/apps/dav/l10n/it.js
+++ b/apps/dav/l10n/it.js
@@ -113,6 +113,7 @@ OC.L10N.register(
"Could not write file contents" : "Impossibile scrivere il contenuto del file",
"_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
"Error while copying file to target location (copied: %1$s, expected filesize: %2$s)" : "Errore durante la copia del file nella destinazione (copiato: %1$s, dimensione prevista del file: %2$s)",
+ "Expected filesize of %1$s but read (from Nextcloud client) and wrote (to Nextcloud storage) %2$s. Could either be a network problem on the sending side or a problem writing to the storage on the server side." : "Dimensione prevista del file %1$s, letto (dal client Nextcloud) e scritto (nell'archivio Nextcloud) %2$s. Potrebbe trattarsi di un problema di rete sul lato d'invio o di un problema di scrittura nell'archivio sul lato server.",
"Could not rename part file to final file, canceled by hook" : "Impossibile rinominare il file di parte in file finale, annullato da hook",
"Could not rename part file to final file" : "Impossibile rinominare il file di parte in file finale",
"Failed to check file size: %1$s" : "Verifica della dimensione del file non riuscito: %1$s",
@@ -120,6 +121,8 @@ OC.L10N.register(
"Encryption not ready: %1$s" : "Crittografia non pronta: %1$s",
"Failed to open file: %1$s" : "Apertura del file non riuscito: %1$s",
"Failed to unlink: %1$s" : "Scollegamento fallito: %1$s",
+ "Invalid chunk name" : "Nome non valido per lo spezzone",
+ "Could not rename part file assembled from chunks" : "Non è possibile rinominare il file assemblato da più spezzoni",
"Failed to write file contents: %1$s" : "Scrittura del contenuto del file non riuscita: %1$s",
"File not found: %1$s" : "File non trovato: %1$s",
"System is in maintenance mode." : "Il sistema è in modalità di manutenzione.",
diff --git a/apps/dav/l10n/it.json b/apps/dav/l10n/it.json
index fb38472b200..5baa75e0ee4 100644
--- a/apps/dav/l10n/it.json
+++ b/apps/dav/l10n/it.json
@@ -111,6 +111,7 @@
"Could not write file contents" : "Impossibile scrivere il contenuto del file",
"_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
"Error while copying file to target location (copied: %1$s, expected filesize: %2$s)" : "Errore durante la copia del file nella destinazione (copiato: %1$s, dimensione prevista del file: %2$s)",
+ "Expected filesize of %1$s but read (from Nextcloud client) and wrote (to Nextcloud storage) %2$s. Could either be a network problem on the sending side or a problem writing to the storage on the server side." : "Dimensione prevista del file %1$s, letto (dal client Nextcloud) e scritto (nell'archivio Nextcloud) %2$s. Potrebbe trattarsi di un problema di rete sul lato d'invio o di un problema di scrittura nell'archivio sul lato server.",
"Could not rename part file to final file, canceled by hook" : "Impossibile rinominare il file di parte in file finale, annullato da hook",
"Could not rename part file to final file" : "Impossibile rinominare il file di parte in file finale",
"Failed to check file size: %1$s" : "Verifica della dimensione del file non riuscito: %1$s",
@@ -118,6 +119,8 @@
"Encryption not ready: %1$s" : "Crittografia non pronta: %1$s",
"Failed to open file: %1$s" : "Apertura del file non riuscito: %1$s",
"Failed to unlink: %1$s" : "Scollegamento fallito: %1$s",
+ "Invalid chunk name" : "Nome non valido per lo spezzone",
+ "Could not rename part file assembled from chunks" : "Non è possibile rinominare il file assemblato da più spezzoni",
"Failed to write file contents: %1$s" : "Scrittura del contenuto del file non riuscita: %1$s",
"File not found: %1$s" : "File non trovato: %1$s",
"System is in maintenance mode." : "Il sistema è in modalità di manutenzione.",
diff --git a/apps/dav/l10n/zh_HK.js b/apps/dav/l10n/zh_HK.js
index 99b4ae9bd6b..e6f0d18230d 100644
--- a/apps/dav/l10n/zh_HK.js
+++ b/apps/dav/l10n/zh_HK.js
@@ -108,6 +108,23 @@ OC.L10N.register(
"{actor} updated contact {card} in address book {addressbook}" : "{actor} 更新了通訊錄 {addressbook} 中的聯絡人 {card}",
"You updated contact {card} in address book {addressbook}" : "您更新了通訊錄 {addressbook} 中的聯絡人 {card}",
"A <strong>contact</strong> or <strong>address book</strong> was modified" : "聯絡人或通訊錄被修改",
+ "File is not updatable: %1$s" : "檔案無法更新:%1$s",
+ "Could not write to final file, canceled by hook" : "無法寫入最終檔案,被掛勾取消",
+ "Could not write file contents" : "無法寫入檔案內容",
+ "_%n byte_::_%n bytes_" : ["%n 位元組"],
+ "Error while copying file to target location (copied: %1$s, expected filesize: %2$s)" : "將檔案複製到目標位置時發生錯誤(已複製:%1$s,預期的檔案大小:%2$s)",
+ "Expected filesize of %1$s but read (from Nextcloud client) and wrote (to Nextcloud storage) %2$s. Could either be a network problem on the sending side or a problem writing to the storage on the server side." : "預期的檔案大小為 %1$s,但讀取(從 Nextcloud 客戶端)與寫入(至 Nextcloud 儲存空間)%2$s。可能是傳送端的網路問題或是伺服器端的儲存空間寫入問題。",
+ "Could not rename part file to final file, canceled by hook" : "無法將部份檔案重新命名為最終檔案,被掛勾取消",
+ "Could not rename part file to final file" : "無法將部份檔案重新命名為最終檔案",
+ "Failed to check file size: %1$s" : "檢查檔案大小失敗:%1$s",
+ "Could not open file" : "無法開啟檔案",
+ "Encryption not ready: %1$s" : "尚未準備好加密:%1$s",
+ "Failed to open file: %1$s" : "開啟檔案失敗:%1$s",
+ "Failed to unlink: %1$s" : "解除連結失敗:%1$s",
+ "Invalid chunk name" : "無效的區塊名稱",
+ "Could not rename part file assembled from chunks" : "無法重新命名從區塊組合成的部份檔案",
+ "Failed to write file contents: %1$s" : "寫入檔案內容失敗:%1$s",
+ "File not found: %1$s" : "找不到檔案:%1$s",
"System is in maintenance mode." : "系統處於維護模式。",
"Upgrade needed" : "需要升級",
"Your %s needs to be configured to use HTTPS in order to use CalDAV and CardDAV with iOS/macOS." : "您的 %s 必須要設定 HTTPS ,才能在 iOS/macOS 上使用 CalDAV 和 CardDAV",
diff --git a/apps/dav/l10n/zh_HK.json b/apps/dav/l10n/zh_HK.json
index ecbd4434731..fb5a5a101f7 100644
--- a/apps/dav/l10n/zh_HK.json
+++ b/apps/dav/l10n/zh_HK.json
@@ -106,6 +106,23 @@
"{actor} updated contact {card} in address book {addressbook}" : "{actor} 更新了通訊錄 {addressbook} 中的聯絡人 {card}",
"You updated contact {card} in address book {addressbook}" : "您更新了通訊錄 {addressbook} 中的聯絡人 {card}",
"A <strong>contact</strong> or <strong>address book</strong> was modified" : "聯絡人或通訊錄被修改",
+ "File is not updatable: %1$s" : "檔案無法更新:%1$s",
+ "Could not write to final file, canceled by hook" : "無法寫入最終檔案,被掛勾取消",
+ "Could not write file contents" : "無法寫入檔案內容",
+ "_%n byte_::_%n bytes_" : ["%n 位元組"],
+ "Error while copying file to target location (copied: %1$s, expected filesize: %2$s)" : "將檔案複製到目標位置時發生錯誤(已複製:%1$s,預期的檔案大小:%2$s)",
+ "Expected filesize of %1$s but read (from Nextcloud client) and wrote (to Nextcloud storage) %2$s. Could either be a network problem on the sending side or a problem writing to the storage on the server side." : "預期的檔案大小為 %1$s,但讀取(從 Nextcloud 客戶端)與寫入(至 Nextcloud 儲存空間)%2$s。可能是傳送端的網路問題或是伺服器端的儲存空間寫入問題。",
+ "Could not rename part file to final file, canceled by hook" : "無法將部份檔案重新命名為最終檔案,被掛勾取消",
+ "Could not rename part file to final file" : "無法將部份檔案重新命名為最終檔案",
+ "Failed to check file size: %1$s" : "檢查檔案大小失敗:%1$s",
+ "Could not open file" : "無法開啟檔案",
+ "Encryption not ready: %1$s" : "尚未準備好加密:%1$s",
+ "Failed to open file: %1$s" : "開啟檔案失敗:%1$s",
+ "Failed to unlink: %1$s" : "解除連結失敗:%1$s",
+ "Invalid chunk name" : "無效的區塊名稱",
+ "Could not rename part file assembled from chunks" : "無法重新命名從區塊組合成的部份檔案",
+ "Failed to write file contents: %1$s" : "寫入檔案內容失敗:%1$s",
+ "File not found: %1$s" : "找不到檔案:%1$s",
"System is in maintenance mode." : "系統處於維護模式。",
"Upgrade needed" : "需要升級",
"Your %s needs to be configured to use HTTPS in order to use CalDAV and CardDAV with iOS/macOS." : "您的 %s 必須要設定 HTTPS ,才能在 iOS/macOS 上使用 CalDAV 和 CardDAV",
diff --git a/apps/dav/lib/Connector/Sabre/File.php b/apps/dav/lib/Connector/Sabre/File.php
index 3a13dba5df6..4768fc3dc44 100644
--- a/apps/dav/lib/Connector/Sabre/File.php
+++ b/apps/dav/lib/Connector/Sabre/File.php
@@ -183,7 +183,23 @@ class File extends Node implements IFile {
[$storage, $internalPath] = $this->fileView->resolvePath($this->path);
try {
if (!$needsPartFile) {
- $this->changeLock(ILockingProvider::LOCK_EXCLUSIVE);
+ try {
+ $this->changeLock(ILockingProvider::LOCK_EXCLUSIVE);
+ } catch (LockedException $e) {
+ // during very large uploads, the shared lock we got at the start might have been expired
+ // meaning that the above lock can fail not just only because somebody else got a shared lock
+ // or because there is no existing shared lock to make exclusive
+ //
+ // Thus we try to get a new exclusive lock, if the original lock failed because of a different shared
+ // lock this will still fail, if our original shared lock expired the new lock will be successful and
+ // the entire operation will be safe
+
+ try {
+ $this->acquireLock(ILockingProvider::LOCK_EXCLUSIVE);
+ } catch (LockedException $ex) {
+ throw new FileLocked($e->getMessage(), $e->getCode(), $e);
+ }
+ }
}
if (!is_resource($data)) {
diff --git a/apps/dav/tests/unit/Connector/Sabre/ObjectTreeTest.php b/apps/dav/tests/unit/Connector/Sabre/ObjectTreeTest.php
index d77f65b33f5..7416cf7a3f7 100644
--- a/apps/dav/tests/unit/Connector/Sabre/ObjectTreeTest.php
+++ b/apps/dav/tests/unit/Connector/Sabre/ObjectTreeTest.php
@@ -34,6 +34,7 @@ use OC\Files\Storage\Temporary;
use OC\Files\View;
use OCA\DAV\Connector\Sabre\Directory;
use OCA\DAV\Connector\Sabre\ObjectTree;
+use OCP\Files\Mount\IMountManager;
/**
* Class ObjectTreeTest
@@ -266,7 +267,7 @@ class ObjectTreeTest extends \Test\TestCase {
];
}
-
+
public function testGetNodeForPathInvalidPath() {
$this->expectException(\OCA\DAV\Connector\Sabre\Exception\InvalidPath::class);
@@ -287,8 +288,7 @@ class ObjectTreeTest extends \Test\TestCase {
$rootNode = $this->getMockBuilder(Directory::class)
->disableOriginalConstructor()
->getMock();
- $mountManager = $this->getMockBuilder(Manager::class)
- ->getMock();
+ $mountManager = $this->createMock(IMountManager::class);
$tree = new \OCA\DAV\Connector\Sabre\ObjectTree();
$tree->init($rootNode, $view, $mountManager);
@@ -314,8 +314,7 @@ class ObjectTreeTest extends \Test\TestCase {
$rootNode = $this->getMockBuilder(Directory::class)
->disableOriginalConstructor()
->getMock();
- $mountManager = $this->getMockBuilder(Manager::class)
- ->getMock();
+ $mountManager = $this->createMock(IMountManager::class);
$tree = new \OCA\DAV\Connector\Sabre\ObjectTree();
$tree->init($rootNode, $view, $mountManager);
diff --git a/apps/files/l10n/ro.js b/apps/files/l10n/ro.js
index 099c2df240b..e381d6b1214 100644
--- a/apps/files/l10n/ro.js
+++ b/apps/files/l10n/ro.js
@@ -58,6 +58,7 @@ OC.L10N.register(
"Could not create folder \"{dir}\" because it already exists" : "Nu s-a putut crea directorul \"{dir}\" deoarece există deja unul cu același nume",
"Error deleting file \"{fileName}\"." : "Eroare la ștergerea fișierului \"{fileName}\".",
"No search results in other folders for {tag}{filter}{endtag}" : "Nu au fost găsite rezultate în alte directoare pentru {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Introduceți mai mult de două caractere pentru a căuta în alte dosare",
"Name" : "Nume",
"Size" : "Mărime",
"Modified" : "Modificat",
@@ -75,6 +76,7 @@ OC.L10N.register(
"File name cannot be empty." : "Numele fișierului nu poate rămâne gol.",
"\"/\" is not allowed inside a file name." : "\"/\" nu este permis în denumirea fișierului.",
"\"{name}\" is not an allowed filetype" : "\"{name}\" ",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Spațiul de stocare alocat {owner} este plin, drept urmare fișierele nu mai pot fi sincronizate sau updatate !",
"View in folder" : "Vizualizează în director",
"Copied!" : "S-a copiat!",
"Copy direct link (only works for users who have access to this file/folder)" : "Copiază link direct (funcționeză numai pentru utilizatorii care au acces la acest fișier/director)",
@@ -130,12 +132,20 @@ OC.L10N.register(
"in %s" : "în %s",
"File Management" : "Management fișiere",
"Tags" : "Etichete",
+ "Cancel" : "Anulare",
+ "Create" : "Crează",
+ "Create a new file with the selected template" : "Crează un fișier nou cu șablonul selectat",
+ "Creating file" : "Se crează fișierul",
+ "Blank" : "Gol",
"%s used" : "%s folosiți",
"%s%% of %s used" : "%s%%din %sfolosiți",
"%1$s of %2$s used" : "%1$s din %2$s utilizat",
"Settings" : "Setări",
"Show hidden files" : "Arată fișierele ascunse",
+ "Crop image previews" : "Previzualizarea imaginii decupate",
"WebDAV" : "WebDAV",
+ "Use this address to access your Files via WebDAV" : "Folosiți această adresă pentru a accesa fișierele dumneavoastră folosind WebDAV",
+ "Toggle %1$s sublist" : "Comută %1$s sublistă",
"Toggle grid view" : "Comută vizualizarea grilă",
"No files in here" : "Niciun fișier aici",
"Upload some content or sync with your devices!" : "Încarcă ceva conținut sau sincronizează cu dispozitivele tale!",
@@ -151,6 +161,7 @@ OC.L10N.register(
"Shared with you" : "Partajat cu tine",
"Shared by link" : "Partajat prin link",
"Deleted shares" : "Partajări șterse",
+ "Pending shares" : "Partajări in asteptare",
"Text file" : "Fișier text",
"New text file.txt" : "Fișier nou.txt",
"Storage of {owner} is full, files can not be updated or synced anymore!" : "Spațiul de stocare pentru {owner} este plin, fișierele nu mai pot fi incărcate sau sincronizate!",
diff --git a/apps/files/l10n/ro.json b/apps/files/l10n/ro.json
index 8ceba57ffc2..fc1f938832d 100644
--- a/apps/files/l10n/ro.json
+++ b/apps/files/l10n/ro.json
@@ -56,6 +56,7 @@
"Could not create folder \"{dir}\" because it already exists" : "Nu s-a putut crea directorul \"{dir}\" deoarece există deja unul cu același nume",
"Error deleting file \"{fileName}\"." : "Eroare la ștergerea fișierului \"{fileName}\".",
"No search results in other folders for {tag}{filter}{endtag}" : "Nu au fost găsite rezultate în alte directoare pentru {tag}{filter}{endtag}",
+ "Enter more than two characters to search in other folders" : "Introduceți mai mult de două caractere pentru a căuta în alte dosare",
"Name" : "Nume",
"Size" : "Mărime",
"Modified" : "Modificat",
@@ -73,6 +74,7 @@
"File name cannot be empty." : "Numele fișierului nu poate rămâne gol.",
"\"/\" is not allowed inside a file name." : "\"/\" nu este permis în denumirea fișierului.",
"\"{name}\" is not an allowed filetype" : "\"{name}\" ",
+ "Storage of {owner} is full, files cannot be updated or synced anymore!" : "Spațiul de stocare alocat {owner} este plin, drept urmare fișierele nu mai pot fi sincronizate sau updatate !",
"View in folder" : "Vizualizează în director",
"Copied!" : "S-a copiat!",
"Copy direct link (only works for users who have access to this file/folder)" : "Copiază link direct (funcționeză numai pentru utilizatorii care au acces la acest fișier/director)",
@@ -128,12 +130,20 @@
"in %s" : "în %s",
"File Management" : "Management fișiere",
"Tags" : "Etichete",
+ "Cancel" : "Anulare",
+ "Create" : "Crează",
+ "Create a new file with the selected template" : "Crează un fișier nou cu șablonul selectat",
+ "Creating file" : "Se crează fișierul",
+ "Blank" : "Gol",
"%s used" : "%s folosiți",
"%s%% of %s used" : "%s%%din %sfolosiți",
"%1$s of %2$s used" : "%1$s din %2$s utilizat",
"Settings" : "Setări",
"Show hidden files" : "Arată fișierele ascunse",
+ "Crop image previews" : "Previzualizarea imaginii decupate",
"WebDAV" : "WebDAV",
+ "Use this address to access your Files via WebDAV" : "Folosiți această adresă pentru a accesa fișierele dumneavoastră folosind WebDAV",
+ "Toggle %1$s sublist" : "Comută %1$s sublistă",
"Toggle grid view" : "Comută vizualizarea grilă",
"No files in here" : "Niciun fișier aici",
"Upload some content or sync with your devices!" : "Încarcă ceva conținut sau sincronizează cu dispozitivele tale!",
@@ -149,6 +159,7 @@
"Shared with you" : "Partajat cu tine",
"Shared by link" : "Partajat prin link",
"Deleted shares" : "Partajări șterse",
+ "Pending shares" : "Partajări in asteptare",
"Text file" : "Fișier text",
"New text file.txt" : "Fișier nou.txt",
"Storage of {owner} is full, files can not be updated or synced anymore!" : "Spațiul de stocare pentru {owner} este plin, fișierele nu mai pot fi incărcate sau sincronizate!",
diff --git a/apps/files_external/tests/PersonalMountTest.php b/apps/files_external/tests/PersonalMountTest.php
index b8a57657f9d..024695b0188 100644
--- a/apps/files_external/tests/PersonalMountTest.php
+++ b/apps/files_external/tests/PersonalMountTest.php
@@ -25,8 +25,13 @@
namespace OCA\Files_External\Tests;
use OC\Files\Mount\Manager;
+use OC\Files\SetupManagerFactory;
use OCA\Files_External\Lib\PersonalMount;
use OCA\Files_External\Lib\StorageConfig;
+use OCP\Diagnostics\IEventLogger;
+use OCP\EventDispatcher\IEventDispatcher;
+use OCP\Files\Config\IMountProviderCollection;
+use OCP\IUserManager;
use Test\TestCase;
class PersonalMountTest extends TestCase {
@@ -47,7 +52,7 @@ class PersonalMountTest extends TestCase {
$mount = new PersonalMount($storageService, $storageConfig, 10, $storage, '/foo');
- $mountManager = new Manager();
+ $mountManager = new Manager($this->createMock(SetupManagerFactory::class));
$mountManager->addMount($mount);
$this->assertEquals([$mount], $mountManager->findByStorageId('dummy'));
diff --git a/apps/files_sharing/l10n/eu.js b/apps/files_sharing/l10n/eu.js
index faf1ad66257..c7e2baa4be0 100644
--- a/apps/files_sharing/l10n/eu.js
+++ b/apps/files_sharing/l10n/eu.js
@@ -123,6 +123,8 @@ OC.L10N.register(
"Could not lock node" : "Ezin izan da nodoa blokeatu",
"Could not lock path" : "Ezin izan da bidea blokeatu",
"Wrong or no update parameter given" : "Eguneraketa parametrorik ez da eman edo okerra da",
+ "Share must at least have READ or CREATE permissions" : "Partekatzeak gutxienez IRAKURRI edo SORTU egiteko baimenak behar ditu",
+ "Share must have READ permission if UPDATE or DELETE permission is set." : "Partekatzeak IRAKURRI egiteko baimenak behar ditu, EGUNERATU edo EZABATU baimenak baldin badauzka.",
"\"Sending the password by Nextcloud Talk\" for sharing a file or folder failed because Nextcloud Talk is not enabled." : "\"Nextcloud Talk-ek pasahitza bidaltzeak\" huts egin du ez dagoelako Nextcloud Talk gaituta fitxategi edo karpeta bat partekatzeko.",
"shared by %s" : "%s erabiltzaileak partekatua",
"Download all files" : "Deskargatu fitxategi guztiak",
@@ -151,6 +153,10 @@ OC.L10N.register(
"Read only" : "Irakurtzeko soilik",
"Allow upload and editing" : "Onartu kargatzea eta edizioa",
"File drop (upload only)" : "Fitxategia jaregin (kargatzeko soilik)",
+ "Custom permissions" : "Baimen pertsonalizatuak",
+ "Read" : "Irakurri",
+ "Upload" : "Kargatu",
+ "Edit" : "Aldatu",
"Allow creating" : "Baimendu sortzea",
"Allow deleting" : "Baimendu ezabatzea",
"Allow resharing" : "Baimendu birpartekatzea",
diff --git a/apps/files_sharing/l10n/eu.json b/apps/files_sharing/l10n/eu.json
index 77b2414f01d..813338441ad 100644
--- a/apps/files_sharing/l10n/eu.json
+++ b/apps/files_sharing/l10n/eu.json
@@ -121,6 +121,8 @@
"Could not lock node" : "Ezin izan da nodoa blokeatu",
"Could not lock path" : "Ezin izan da bidea blokeatu",
"Wrong or no update parameter given" : "Eguneraketa parametrorik ez da eman edo okerra da",
+ "Share must at least have READ or CREATE permissions" : "Partekatzeak gutxienez IRAKURRI edo SORTU egiteko baimenak behar ditu",
+ "Share must have READ permission if UPDATE or DELETE permission is set." : "Partekatzeak IRAKURRI egiteko baimenak behar ditu, EGUNERATU edo EZABATU baimenak baldin badauzka.",
"\"Sending the password by Nextcloud Talk\" for sharing a file or folder failed because Nextcloud Talk is not enabled." : "\"Nextcloud Talk-ek pasahitza bidaltzeak\" huts egin du ez dagoelako Nextcloud Talk gaituta fitxategi edo karpeta bat partekatzeko.",
"shared by %s" : "%s erabiltzaileak partekatua",
"Download all files" : "Deskargatu fitxategi guztiak",
@@ -149,6 +151,10 @@
"Read only" : "Irakurtzeko soilik",
"Allow upload and editing" : "Onartu kargatzea eta edizioa",
"File drop (upload only)" : "Fitxategia jaregin (kargatzeko soilik)",
+ "Custom permissions" : "Baimen pertsonalizatuak",
+ "Read" : "Irakurri",
+ "Upload" : "Kargatu",
+ "Edit" : "Aldatu",
"Allow creating" : "Baimendu sortzea",
"Allow deleting" : "Baimendu ezabatzea",
"Allow resharing" : "Baimendu birpartekatzea",
diff --git a/apps/files_sharing/l10n/pl.js b/apps/files_sharing/l10n/pl.js
index 3bd184ad952..75c7fa50845 100644
--- a/apps/files_sharing/l10n/pl.js
+++ b/apps/files_sharing/l10n/pl.js
@@ -154,7 +154,7 @@ OC.L10N.register(
"Allow upload and editing" : "Zezwalaj na wysyłanie i edytowanie",
"File drop (upload only)" : "Upuszczanie pliku (tylko wysyłanie)",
"Custom permissions" : "Uprawnienia niestandardowe",
- "Read" : "Odczytaj",
+ "Read" : "Czytaj",
"Upload" : "Wyślij",
"Edit" : "Edytuj",
"Bundled permissions" : "Uprawnienia w pakiecie",
diff --git a/apps/files_sharing/l10n/pl.json b/apps/files_sharing/l10n/pl.json
index a7d8ae1a06a..910ad1c6eae 100644
--- a/apps/files_sharing/l10n/pl.json
+++ b/apps/files_sharing/l10n/pl.json
@@ -152,7 +152,7 @@
"Allow upload and editing" : "Zezwalaj na wysyłanie i edytowanie",
"File drop (upload only)" : "Upuszczanie pliku (tylko wysyłanie)",
"Custom permissions" : "Uprawnienia niestandardowe",
- "Read" : "Odczytaj",
+ "Read" : "Czytaj",
"Upload" : "Wyślij",
"Edit" : "Edytuj",
"Bundled permissions" : "Uprawnienia w pakiecie",
diff --git a/apps/files_sharing/lib/Activity/Providers/Base.php b/apps/files_sharing/lib/Activity/Providers/Base.php
index e61bdffadcd..cbd16c134cc 100644
--- a/apps/files_sharing/lib/Activity/Providers/Base.php
+++ b/apps/files_sharing/lib/Activity/Providers/Base.php
@@ -24,6 +24,7 @@
namespace OCA\Files_Sharing\Activity\Providers;
use OCP\Activity\IEvent;
+use OCP\Activity\IEventMerger;
use OCP\Activity\IManager;
use OCP\Activity\IProvider;
use OCP\Contacts\IManager as IContactsManager;
@@ -51,6 +52,9 @@ abstract class Base implements IProvider {
/** @var IUserManager */
protected $userManager;
+ /** @var IEventMerger */
+ protected $eventMerger;
+
/** @var IContactsManager */
protected $contactsManager;
@@ -65,13 +69,15 @@ abstract class Base implements IProvider {
IManager $activityManager,
IUserManager $userManager,
ICloudIdManager $cloudIdManager,
- IContactsManager $contactsManager) {
+ IContactsManager $contactsManager,
+ IEventMerger $eventMerger) {
$this->languageFactory = $languageFactory;
$this->url = $url;
$this->activityManager = $activityManager;
$this->userManager = $userManager;
$this->cloudIdManager = $cloudIdManager;
$this->contactsManager = $contactsManager;
+ $this->eventMerger = $eventMerger;
}
/**
@@ -97,7 +103,7 @@ abstract class Base implements IProvider {
}
}
- return $this->parseLongVersion($event);
+ return $this->parseLongVersion($event, $previousEvent);
}
/**
@@ -110,11 +116,12 @@ abstract class Base implements IProvider {
/**
* @param IEvent $event
+ * @param IEvent|null $previousEvent
* @return IEvent
* @throws \InvalidArgumentException
* @since 11.0.0
*/
- abstract protected function parseLongVersion(IEvent $event);
+ abstract protected function parseLongVersion(IEvent $event, IEvent $previousEvent = null);
/**
* @param IEvent $event
diff --git a/apps/files_sharing/lib/Activity/Providers/Downloads.php b/apps/files_sharing/lib/Activity/Providers/Downloads.php
index a6bbe9a4118..8152e0b0885 100644
--- a/apps/files_sharing/lib/Activity/Providers/Downloads.php
+++ b/apps/files_sharing/lib/Activity/Providers/Downloads.php
@@ -63,19 +63,28 @@ class Downloads extends Base {
/**
* @param IEvent $event
+ * @param IEvent|null $previousEvent
* @return IEvent
* @throws \InvalidArgumentException
* @since 11.0.0
*/
- public function parseLongVersion(IEvent $event) {
+ public function parseLongVersion(IEvent $event, IEvent $previousEvent = null) {
$parsedParameters = $this->getParsedParameters($event);
if ($event->getSubject() === self::SUBJECT_PUBLIC_SHARED_FILE_DOWNLOADED ||
$event->getSubject() === self::SUBJECT_PUBLIC_SHARED_FOLDER_DOWNLOADED) {
- $subject = $this->l->t('{file} downloaded via public link');
+ if (!isset($parsedParameters['remote-address-hash']['type'])) {
+ $subject = $this->l->t('{file} downloaded via public link');
+ $this->setSubjects($event, $subject, $parsedParameters);
+ } else {
+ $subject = $this->l->t('{file} downloaded via public link');
+ $this->setSubjects($event, $subject, $parsedParameters);
+ $event = $this->eventMerger->mergeEvents('file', $event, $previousEvent);
+ }
} elseif ($event->getSubject() === self::SUBJECT_SHARED_FILE_BY_EMAIL_DOWNLOADED ||
$event->getSubject() === self::SUBJECT_SHARED_FOLDER_BY_EMAIL_DOWNLOADED) {
$subject = $this->l->t('{email} downloaded {file}');
+ $this->setSubjects($event, $subject, $parsedParameters);
} else {
throw new \InvalidArgumentException();
}
@@ -85,7 +94,6 @@ class Downloads extends Base {
} else {
$event->setIcon($this->url->getAbsoluteURL($this->url->imagePath('core', 'actions/download.svg')));
}
- $this->setSubjects($event, $subject, $parsedParameters);
return $event;
}
@@ -102,6 +110,17 @@ class Downloads extends Base {
switch ($subject) {
case self::SUBJECT_PUBLIC_SHARED_FILE_DOWNLOADED:
case self::SUBJECT_PUBLIC_SHARED_FOLDER_DOWNLOADED:
+ if (isset($parameters[1])) {
+ return [
+ 'file' => $this->getFile($parameters[0], $event),
+ 'remote-address-hash' => [
+ 'type' => 'highlight',
+ 'id' => $parameters[1],
+ 'name' => $parameters[1],
+ 'link' => '',
+ ],
+ ];
+ }
return [
'file' => $this->getFile($parameters[0], $event),
];
diff --git a/apps/files_sharing/lib/Activity/Providers/Groups.php b/apps/files_sharing/lib/Activity/Providers/Groups.php
index 71b1dc65f56..b9cc2e6b579 100644
--- a/apps/files_sharing/lib/Activity/Providers/Groups.php
+++ b/apps/files_sharing/lib/Activity/Providers/Groups.php
@@ -25,6 +25,7 @@
namespace OCA\Files_Sharing\Activity\Providers;
use OCP\Activity\IEvent;
+use OCP\Activity\IEventMerger;
use OCP\Activity\IManager;
use OCP\Contacts\IManager as IContactsManager;
use OCP\Federation\ICloudIdManager;
@@ -55,8 +56,9 @@ class Groups extends Base {
IUserManager $userManager,
ICloudIdManager $cloudIdManager,
IContactsManager $contactsManager,
+ IEventMerger $eventMerger,
IGroupManager $groupManager) {
- parent::__construct($languageFactory, $url, $activityManager, $userManager, $cloudIdManager, $contactsManager);
+ parent::__construct($languageFactory, $url, $activityManager, $userManager, $cloudIdManager, $contactsManager, $eventMerger);
$this->groupManager = $groupManager;
}
@@ -95,11 +97,12 @@ class Groups extends Base {
/**
* @param IEvent $event
+ * @param IEvent|null $previousEvent
* @return IEvent
* @throws \InvalidArgumentException
* @since 11.0.0
*/
- public function parseLongVersion(IEvent $event) {
+ public function parseLongVersion(IEvent $event, IEvent $previousEvent = null) {
$parsedParameters = $this->getParsedParameters($event);
if ($event->getSubject() === self::SUBJECT_SHARED_GROUP_SELF) {
diff --git a/apps/files_sharing/lib/Activity/Providers/PublicLinks.php b/apps/files_sharing/lib/Activity/Providers/PublicLinks.php
index 5782166704f..c09b9baa951 100644
--- a/apps/files_sharing/lib/Activity/Providers/PublicLinks.php
+++ b/apps/files_sharing/lib/Activity/Providers/PublicLinks.php
@@ -70,11 +70,12 @@ class PublicLinks extends Base {
/**
* @param IEvent $event
+ * @param IEvent|null $previousEvent
* @return IEvent
* @throws \InvalidArgumentException
* @since 11.0.0
*/
- public function parseLongVersion(IEvent $event) {
+ public function parseLongVersion(IEvent $event, IEvent $previousEvent = null) {
$parsedParameters = $this->getParsedParameters($event);
if ($event->getSubject() === self::SUBJECT_SHARED_LINK_SELF) {
diff --git a/apps/files_sharing/lib/Activity/Providers/RemoteShares.php b/apps/files_sharing/lib/Activity/Providers/RemoteShares.php
index 29f7c0a298e..f1cc90f5e65 100644
--- a/apps/files_sharing/lib/Activity/Providers/RemoteShares.php
+++ b/apps/files_sharing/lib/Activity/Providers/RemoteShares.php
@@ -25,6 +25,7 @@
namespace OCA\Files_Sharing\Activity\Providers;
use OCP\Activity\IEvent;
+use OCP\Activity\IEventMerger;
use OCP\Activity\IManager;
use OCP\Contacts\IManager as IContactsManager;
use OCP\Federation\ICloudIdManager;
@@ -42,10 +43,10 @@ class RemoteShares extends Base {
IURLGenerator $url,
IManager $activityManager,
IUserManager $userManager,
+ ICloudIdManager $cloudIdManager,
IContactsManager $contactsManager,
- ICloudIdManager $cloudIdManager
- ) {
- parent::__construct($languageFactory, $url, $activityManager, $userManager, $cloudIdManager, $contactsManager);
+ IEventMerger $eventMerger) {
+ parent::__construct($languageFactory, $url, $activityManager, $userManager, $cloudIdManager, $contactsManager, $eventMerger);
}
/**
@@ -77,11 +78,12 @@ class RemoteShares extends Base {
/**
* @param IEvent $event
+ * @param IEvent|null $previousEvent
* @return IEvent
* @throws \InvalidArgumentException
* @since 11.0.0
*/
- public function parseLongVersion(IEvent $event) {
+ public function parseLongVersion(IEvent $event, IEvent $previousEvent = null) {
$parsedParameters = $this->getParsedParameters($event);
if ($event->getSubject() === self::SUBJECT_REMOTE_SHARE_RECEIVED) {
diff --git a/apps/files_sharing/lib/Activity/Providers/Users.php b/apps/files_sharing/lib/Activity/Providers/Users.php
index 8b90ac8ee9d..ce873eb5f77 100644
--- a/apps/files_sharing/lib/Activity/Providers/Users.php
+++ b/apps/files_sharing/lib/Activity/Providers/Users.php
@@ -86,11 +86,12 @@ class Users extends Base {
/**
* @param IEvent $event
+ * @param IEvent|null $previousEvent
* @return IEvent
* @throws \InvalidArgumentException
* @since 11.0.0
*/
- public function parseLongVersion(IEvent $event) {
+ public function parseLongVersion(IEvent $event, IEvent $previousEvent = null) {
$parsedParameters = $this->getParsedParameters($event);
if ($event->getSubject() === self::SUBJECT_SHARED_USER_SELF) {
diff --git a/apps/files_sharing/lib/Controller/ShareController.php b/apps/files_sharing/lib/Controller/ShareController.php
index 614dae7ffba..411873c9c86 100644
--- a/apps/files_sharing/lib/Controller/ShareController.php
+++ b/apps/files_sharing/lib/Controller/ShareController.php
@@ -729,6 +729,10 @@ class ShareController extends AuthPublicShareController {
$ownerFolder = $this->rootFolder->getUserFolder($share->getShareOwner());
$userPath = $userFolder->getRelativePath($userNode->getPath());
$ownerPath = $ownerFolder->getRelativePath($node->getPath());
+ $remoteAddress = $this->request->getRemoteAddress();
+ $dateTime = new \DateTime();
+ $dateTime = $dateTime->format('Y-m-d H');
+ $remoteAddressHash = md5($dateTime . '-' . $remoteAddress);
$parameters = [$userPath];
@@ -742,8 +746,10 @@ class ShareController extends AuthPublicShareController {
} else {
if ($node instanceof \OCP\Files\File) {
$subject = Downloads::SUBJECT_PUBLIC_SHARED_FILE_DOWNLOADED;
+ $parameters[] = $remoteAddressHash;
} else {
$subject = Downloads::SUBJECT_PUBLIC_SHARED_FOLDER_DOWNLOADED;
+ $parameters[] = $remoteAddressHash;
}
}
diff --git a/apps/files_sharing/lib/External/Manager.php b/apps/files_sharing/lib/External/Manager.php
index a48e2a63ae4..a8510321a5a 100644
--- a/apps/files_sharing/lib/External/Manager.php
+++ b/apps/files_sharing/lib/External/Manager.php
@@ -43,6 +43,7 @@ use OCP\EventDispatcher\IEventDispatcher;
use OCP\Federation\ICloudFederationFactory;
use OCP\Federation\ICloudFederationProviderManager;
use OCP\Files;
+use OCP\Files\NotFoundException;
use OCP\Files\Storage\IStorageFactory;
use OCP\Http\Client\IClientService;
use OCP\IDBConnection;
@@ -599,8 +600,9 @@ class Manager {
}
public function removeShare($mountPoint): bool {
- $mountPointObj = $this->mountManager->find($mountPoint);
- if ($mountPointObj === null) {
+ try {
+ $mountPointObj = $this->mountManager->find($mountPoint);
+ } catch (NotFoundException $e) {
$this->logger->error('Mount point to remove share not found', ['mountPoint' => $mountPoint]);
return false;
}
diff --git a/apps/files_sharing/lib/Updater.php b/apps/files_sharing/lib/Updater.php
index 9ce114f495d..ad194dde016 100644
--- a/apps/files_sharing/lib/Updater.php
+++ b/apps/files_sharing/lib/Updater.php
@@ -26,6 +26,7 @@
*/
namespace OCA\Files_Sharing;
+use OC\Files\Mount\MountPoint;
use OCP\Constants;
use OCP\Share\IShare;
@@ -105,6 +106,7 @@ class Updater {
$mountManager = \OC\Files\Filesystem::getMountManager();
$mountedShares = $mountManager->findIn('/' . \OC_User::getUser() . '/files/' . $oldPath);
foreach ($mountedShares as $mount) {
+ /** @var MountPoint $mount */
if ($mount->getStorage()->instanceOfStorage(ISharedStorage::class)) {
$mountPoint = $mount->getMountPoint();
$target = str_replace($absOldPath, $absNewPath, $mountPoint);
diff --git a/apps/files_sharing/tests/CacheTest.php b/apps/files_sharing/tests/CacheTest.php
index 2623b4c34b5..f4f64bc6a32 100644
--- a/apps/files_sharing/tests/CacheTest.php
+++ b/apps/files_sharing/tests/CacheTest.php
@@ -243,6 +243,9 @@ class CacheTest extends TestCase {
public function testGetFolderContentsInRoot() {
$results = $this->user2View->getDirectoryContent('/');
+ $results = (array_filter($results, function($file) {
+ return $file->getName() !== 'welcome.txt';
+ }));
// we should get the shared items "shareddir" and "shared single file.txt"
// additional root will always contain the example file "welcome.txt",
@@ -250,11 +253,6 @@ class CacheTest extends TestCase {
$this->verifyFiles(
[
[
- 'name' => 'welcome.txt',
- 'path' => 'files/welcome.txt',
- 'mimetype' => 'text/plain',
- ],
- [
'name' => 'shareddir',
'path' => 'files/shareddir',
'mimetype' => 'httpd/unix-directory',
diff --git a/apps/files_sharing/tests/External/ManagerTest.php b/apps/files_sharing/tests/External/ManagerTest.php
index ab7c682c3a6..307b630970f 100644
--- a/apps/files_sharing/tests/External/ManagerTest.php
+++ b/apps/files_sharing/tests/External/ManagerTest.php
@@ -31,14 +31,19 @@
namespace OCA\Files_Sharing\Tests\External;
use OC\Federation\CloudIdManager;
+use OC\Files\SetupManager;
+use OC\Files\SetupManagerFactory;
use OC\Files\Storage\StorageFactory;
use OCA\Files_Sharing\External\Manager;
use OCA\Files_Sharing\External\MountProvider;
use OCA\Files_Sharing\Tests\TestCase;
use OCP\Contacts\IManager;
+use OCP\Diagnostics\IEventLogger;
use OCP\EventDispatcher\IEventDispatcher;
use OCP\Federation\ICloudFederationFactory;
use OCP\Federation\ICloudFederationProviderManager;
+use OCP\Files\Config\IMountProviderCollection;
+use OCP\Files\NotFoundException;
use OCP\Http\Client\IClientService;
use OCP\Http\Client\IResponse;
use OCP\IGroup;
@@ -102,9 +107,8 @@ class ManagerTest extends TestCase {
parent::setUp();
$this->uid = $this->getUniqueID('user');
- $this->createUser($this->uid, '');
- $this->user = \OC::$server->getUserManager()->get($this->uid);
- $this->mountManager = new \OC\Files\Mount\Manager();
+ $this->user = $this->createUser($this->uid, '');
+ $this->mountManager = new \OC\Files\Mount\Manager($this->createMock(SetupManagerFactory::class));
$this->clientService = $this->getMockBuilder(IClientService::class)
->disableOriginalConstructor()->getMock();
$this->cloudFederationProviderManager = $this->createMock(ICloudFederationProviderManager::class);
@@ -740,12 +744,12 @@ class ManagerTest extends TestCase {
private function assertNotMount($mountPoint) {
$mountPoint = rtrim($mountPoint, '/');
- $mount = $this->mountManager->find($this->getFullPath($mountPoint));
- if ($mount) {
+ try {
+ $mount = $this->mountManager->find($this->getFullPath($mountPoint));
$this->assertInstanceOf('\OCP\Files\Mount\IMountPoint', $mount);
$this->assertNotEquals($this->getFullPath($mountPoint), rtrim($mount->getMountPoint(), '/'));
- } else {
- $this->assertNull($mount);
+ } catch (NotFoundException $e) {
+
}
}
diff --git a/apps/files_trashbin/l10n/nb.js b/apps/files_trashbin/l10n/nb.js
index 8a9e7020346..718ef5a0bc7 100644
--- a/apps/files_trashbin/l10n/nb.js
+++ b/apps/files_trashbin/l10n/nb.js
@@ -3,8 +3,15 @@ OC.L10N.register(
{
"Deleted files" : "Slettede filer",
"restored" : "gjenopprettet",
+ "This application enables users to restore files that were deleted from the system." : "Denne appen gjør så brukere kan gjenopprette filer som har blitt slettet fra systemet.",
+ "This application enables users to restore files that were deleted from the system. It displays a list of deleted files in the web interface, and has options to restore those deleted files back to the users file directories or remove them permanently from the system. Restoring a file also restores related file versions, if the versions application is enabled. When a file is deleted from a share, it can be restored in the same manner, though it is no longer shared. By default, these files remain in the trash bin for 30 days.\nTo prevent a user from running out of disk space, the Deleted files app will not utilize more than 50% of the currently available free quota for deleted files. If the deleted files exceed this limit, the app deletes the oldest files until it gets below this limit. More information is available in the Deleted Files documentation." : "Denne appen gjør så brukere kan gjenopprette filer som har blitt slettet fra systemet. Den viser en liste med slettede filer i web-grensesnittet hvor man kan gjenopprette de slettede filene tilbake til brukernes mapper, eller fjerne de permanent fra systemet. Gjenoppretting av en fil gjenoppretter også relaterte fil-versjoner, hvis versjonerings-appen er aktivert. Når en fil slettes fra en deling, kan den gjenopprettes på samme måte, men er da ikke lenger delt. Som standard bevares disse filene i søppelbøtten i 30 dager. For å forhindre en bruker fra å fylle opp disken, vil ikke Deleted Files-appen bruke mer enn 50% av den tilgjengelige diskkvoten til slettede filer. Hvis de slettede filene går over denne grensen sletter appen de aldste filene til den kommer under grensen. Mer informasjon er tilgjengelig i Deleted Files' dokumentasjon.",
"Restore" : "Gjenopprett",
"Delete permanently" : "Slett permanent",
+ "Error while restoring file from trash bin" : "Feil ved gjenoppretting av fil fra søppelbøtten",
+ "Error while removing file from trash bin" : "Feil ved fjerning av fil fra søppelbøtten",
+ "Error while restoring files from trash bin" : "Feil ved gjenoppretting av filer fra søppelbøtten",
+ "Error while emptying trash bin" : "Feil ved tømming av søppelbøtten",
+ "Error while removing files from trash bin" : "Feil ved fjerning av filer fra søppelbøtten",
"This operation is forbidden" : "Operasjonen er forbudt",
"This directory is unavailable, please check the logs or contact the administrator" : "Denne mappen er utilgjengelig. Sjekk loggene eller kontakt administrator",
"No deleted files" : "Ingen slettede filer",
@@ -14,6 +21,11 @@ OC.L10N.register(
"Name" : "Navn",
"Actions" : "Handlinger",
"Deleted" : "Slettet",
- "Delete" : "Slett"
+ "Delete" : "Slett",
+ "Error while restoring file from trashbin" : "Feil ved gjenoppretting av fil fra søppelbøtten",
+ "Error while removing file from trashbin" : "Feil ved fjerning av fil fra søppelbøtten",
+ "Error while restoring files from trashbin" : "Feil ved gjenoppretting av filer fra søppelbøtten",
+ "Error while emptying trashbin" : "Feil ved tømming av søppelbøtten",
+ "Error while removing files from trashbin" : "Feil ved fjerning av filer fra søppelbøtten"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_trashbin/l10n/nb.json b/apps/files_trashbin/l10n/nb.json
index ad35880f979..949b6b7bba2 100644
--- a/apps/files_trashbin/l10n/nb.json
+++ b/apps/files_trashbin/l10n/nb.json
@@ -1,8 +1,15 @@
{ "translations": {
"Deleted files" : "Slettede filer",
"restored" : "gjenopprettet",
+ "This application enables users to restore files that were deleted from the system." : "Denne appen gjør så brukere kan gjenopprette filer som har blitt slettet fra systemet.",
+ "This application enables users to restore files that were deleted from the system. It displays a list of deleted files in the web interface, and has options to restore those deleted files back to the users file directories or remove them permanently from the system. Restoring a file also restores related file versions, if the versions application is enabled. When a file is deleted from a share, it can be restored in the same manner, though it is no longer shared. By default, these files remain in the trash bin for 30 days.\nTo prevent a user from running out of disk space, the Deleted files app will not utilize more than 50% of the currently available free quota for deleted files. If the deleted files exceed this limit, the app deletes the oldest files until it gets below this limit. More information is available in the Deleted Files documentation." : "Denne appen gjør så brukere kan gjenopprette filer som har blitt slettet fra systemet. Den viser en liste med slettede filer i web-grensesnittet hvor man kan gjenopprette de slettede filene tilbake til brukernes mapper, eller fjerne de permanent fra systemet. Gjenoppretting av en fil gjenoppretter også relaterte fil-versjoner, hvis versjonerings-appen er aktivert. Når en fil slettes fra en deling, kan den gjenopprettes på samme måte, men er da ikke lenger delt. Som standard bevares disse filene i søppelbøtten i 30 dager. For å forhindre en bruker fra å fylle opp disken, vil ikke Deleted Files-appen bruke mer enn 50% av den tilgjengelige diskkvoten til slettede filer. Hvis de slettede filene går over denne grensen sletter appen de aldste filene til den kommer under grensen. Mer informasjon er tilgjengelig i Deleted Files' dokumentasjon.",
"Restore" : "Gjenopprett",
"Delete permanently" : "Slett permanent",
+ "Error while restoring file from trash bin" : "Feil ved gjenoppretting av fil fra søppelbøtten",
+ "Error while removing file from trash bin" : "Feil ved fjerning av fil fra søppelbøtten",
+ "Error while restoring files from trash bin" : "Feil ved gjenoppretting av filer fra søppelbøtten",
+ "Error while emptying trash bin" : "Feil ved tømming av søppelbøtten",
+ "Error while removing files from trash bin" : "Feil ved fjerning av filer fra søppelbøtten",
"This operation is forbidden" : "Operasjonen er forbudt",
"This directory is unavailable, please check the logs or contact the administrator" : "Denne mappen er utilgjengelig. Sjekk loggene eller kontakt administrator",
"No deleted files" : "Ingen slettede filer",
@@ -12,6 +19,11 @@
"Name" : "Navn",
"Actions" : "Handlinger",
"Deleted" : "Slettet",
- "Delete" : "Slett"
+ "Delete" : "Slett",
+ "Error while restoring file from trashbin" : "Feil ved gjenoppretting av fil fra søppelbøtten",
+ "Error while removing file from trashbin" : "Feil ved fjerning av fil fra søppelbøtten",
+ "Error while restoring files from trashbin" : "Feil ved gjenoppretting av filer fra søppelbøtten",
+ "Error while emptying trashbin" : "Feil ved tømming av søppelbøtten",
+ "Error while removing files from trashbin" : "Feil ved fjerning av filer fra søppelbøtten"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_trashbin/tests/StorageTest.php b/apps/files_trashbin/tests/StorageTest.php
index 448c3a6adb1..0a7a129ca28 100644
--- a/apps/files_trashbin/tests/StorageTest.php
+++ b/apps/files_trashbin/tests/StorageTest.php
@@ -33,6 +33,7 @@ namespace OCA\Files_Trashbin\Tests;
use OC\Files\Filesystem;
use OC\Files\Storage\Common;
+use OC\Files\Storage\Local;
use OC\Files\Storage\Temporary;
use OCA\Files_Trashbin\AppInfo\Application;
use OCA\Files_Trashbin\Events\MoveToTrashEvent;
@@ -661,6 +662,9 @@ class StorageTest extends \Test\TestCase {
}
public function testMoveFromStoragePreserveFileId() {
+ if (!$this->userView->getMount('')->getStorage()->instanceOfStorage(Local::class)) {
+ $this->markTestSkipped("Skipping on non-local users storage");
+ }
$this->userView->file_put_contents('test.txt', 'foo');
$fileId = $this->userView->getFileInfo('test.txt')->getId();
diff --git a/apps/files_versions/l10n/nb.js b/apps/files_versions/l10n/nb.js
index c76a1bdb06a..5943c227d62 100644
--- a/apps/files_versions/l10n/nb.js
+++ b/apps/files_versions/l10n/nb.js
@@ -2,6 +2,8 @@ OC.L10N.register(
"files_versions",
{
"Versions" : "Versjoner",
+ "This application automatically maintains older versions of files that are changed." : "Dette programmet vedlikeholder eldre versjoner av endrede filer.",
+ "This application automatically maintains older versions of files that are changed. When enabled, a hidden versions folder is provisioned in every user’s directory and is used to store old file versions. A user can revert to an older version through the web interface at any time, with the replaced file becoming a version. The app automatically manages the versions folder to ensure the user doesn’t run out of Quota because of versions.\n\t\tIn addition to the expiry of versions, the versions app makes certain never to use more than 50% of the user’s currently available free space. If stored versions exceed this limit, the app will delete the oldest versions first until it meets this limit. More information is available in the Versions documentation." : "Dette programmet vedlikeholder eldre versjoner av endrede filer. Når den aktiveres, legges det inn en skjult mappe i alle brukeres kataloger og brukes til å lagre eldre filversjoner. En bruker kan når som helst gjenopprette til en eldre versjon gjennom web-grensesnittet, og gjøre den erstattede filen til en versjon. Programmet vedlikeholder automatisk versjonsmappen for å sikre at brukeren ikke går tom for kvoten på grunn av for mange versjoner av en fil.\n\n\t\tI tillegg til at versjoner opphører, passer programmet på at den aldri bruker mer enn 50% av brukerens tilgjengelige plass. Hvis lagrede filversjoner går over denne grensen, vil appen slette de eldste versjonene først til det treffer grensen. Mer informasjon er tilgjengelig i Versions dokumentasjon.",
"Failed to revert {file} to revision {timestamp}." : "Klarte ikke å tilbakeføre {file} til revisjon {timestamp}.",
"_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
"Restore" : "Gjenopprett",
diff --git a/apps/files_versions/l10n/nb.json b/apps/files_versions/l10n/nb.json
index 3e58b2e2639..963c83239ac 100644
--- a/apps/files_versions/l10n/nb.json
+++ b/apps/files_versions/l10n/nb.json
@@ -1,5 +1,7 @@
{ "translations": {
"Versions" : "Versjoner",
+ "This application automatically maintains older versions of files that are changed." : "Dette programmet vedlikeholder eldre versjoner av endrede filer.",
+ "This application automatically maintains older versions of files that are changed. When enabled, a hidden versions folder is provisioned in every user’s directory and is used to store old file versions. A user can revert to an older version through the web interface at any time, with the replaced file becoming a version. The app automatically manages the versions folder to ensure the user doesn’t run out of Quota because of versions.\n\t\tIn addition to the expiry of versions, the versions app makes certain never to use more than 50% of the user’s currently available free space. If stored versions exceed this limit, the app will delete the oldest versions first until it meets this limit. More information is available in the Versions documentation." : "Dette programmet vedlikeholder eldre versjoner av endrede filer. Når den aktiveres, legges det inn en skjult mappe i alle brukeres kataloger og brukes til å lagre eldre filversjoner. En bruker kan når som helst gjenopprette til en eldre versjon gjennom web-grensesnittet, og gjøre den erstattede filen til en versjon. Programmet vedlikeholder automatisk versjonsmappen for å sikre at brukeren ikke går tom for kvoten på grunn av for mange versjoner av en fil.\n\n\t\tI tillegg til at versjoner opphører, passer programmet på at den aldri bruker mer enn 50% av brukerens tilgjengelige plass. Hvis lagrede filversjoner går over denne grensen, vil appen slette de eldste versjonene først til det treffer grensen. Mer informasjon er tilgjengelig i Versions dokumentasjon.",
"Failed to revert {file} to revision {timestamp}." : "Klarte ikke å tilbakeføre {file} til revisjon {timestamp}.",
"_%n byte_::_%n bytes_" : ["%n byte","%n bytes"],
"Restore" : "Gjenopprett",
diff --git a/apps/oauth2/l10n/nb.js b/apps/oauth2/l10n/nb.js
index cc06892be99..2fb1f83ba15 100644
--- a/apps/oauth2/l10n/nb.js
+++ b/apps/oauth2/l10n/nb.js
@@ -1,15 +1,20 @@
OC.L10N.register(
"oauth2",
{
+ "Your client is not authorized to connect. Please inform the administrator of your client." : "Din klient er ikke autorisert til å koble til. Vennligst informer din klients administrator.",
"Your redirect URL needs to be a full URL for example: https://yourdomain.com/path" : "URL for videresending må være en fullstendig URL. For eksempel https://yourdomain.com/path",
"OAuth 2.0" : "OAuth 2.0",
+ "Allows OAuth2 compatible authentication from other web applications." : "Tillater OAuth2-kompatibel autentisering fra andre nettapplikasjoner.",
+ "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "OAuth2-appen gir administratorer mulighet til å konfigurere den innebygde arbeidsflyten for autentisering til å også tillate OAuth2-kompatibel autentisering fra andre nett-applikasjoner.",
"OAuth 2.0 clients" : "OAuth 2.0-klienter",
+ "OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 gir eksterne tjenester tillatelse til å be om tilgang til {instanceName}.",
"Add client" : "Legg til klient",
"Name" : "Navn",
"Redirection URI" : "Videresendings-URI",
"Add" : "Legg til",
"Client Identifier" : "Klient-identifikator",
"Secret" : "Hemmelighet",
+ "Show client secret" : "Vis klients hemmelighet",
"Delete" : "Slett"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/oauth2/l10n/nb.json b/apps/oauth2/l10n/nb.json
index c7bdb2f0f36..ff0b4b735df 100644
--- a/apps/oauth2/l10n/nb.json
+++ b/apps/oauth2/l10n/nb.json
@@ -1,13 +1,18 @@
{ "translations": {
+ "Your client is not authorized to connect. Please inform the administrator of your client." : "Din klient er ikke autorisert til å koble til. Vennligst informer din klients administrator.",
"Your redirect URL needs to be a full URL for example: https://yourdomain.com/path" : "URL for videresending må være en fullstendig URL. For eksempel https://yourdomain.com/path",
"OAuth 2.0" : "OAuth 2.0",
+ "Allows OAuth2 compatible authentication from other web applications." : "Tillater OAuth2-kompatibel autentisering fra andre nettapplikasjoner.",
+ "The OAuth2 app allows administrators to configure the built-in authentication workflow to also allow OAuth2 compatible authentication from other web applications." : "OAuth2-appen gir administratorer mulighet til å konfigurere den innebygde arbeidsflyten for autentisering til å også tillate OAuth2-kompatibel autentisering fra andre nett-applikasjoner.",
"OAuth 2.0 clients" : "OAuth 2.0-klienter",
+ "OAuth 2.0 allows external services to request access to {instanceName}." : "OAuth 2.0 gir eksterne tjenester tillatelse til å be om tilgang til {instanceName}.",
"Add client" : "Legg til klient",
"Name" : "Navn",
"Redirection URI" : "Videresendings-URI",
"Add" : "Legg til",
"Client Identifier" : "Klient-identifikator",
"Secret" : "Hemmelighet",
+ "Show client secret" : "Vis klients hemmelighet",
"Delete" : "Slett"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/settings/l10n/de.js b/apps/settings/l10n/de.js
index 8095d6fa243..7232c7ada96 100644
--- a/apps/settings/l10n/de.js
+++ b/apps/settings/l10n/de.js
@@ -469,6 +469,7 @@ OC.L10N.register(
"Remove image" : "Bild entfernen",
"png or jpg, max. 20 MB" : "png oder jpg, max. 20 MB",
"Picture provided by original account" : "Bild von Original-Konto zur Verfügung gestellt",
+ "Please note that it can take up to 24 hours for the avatar to get updated everywhere." : "Bitte beachte, dass es bis zu 24 Stunden dauern kann, bis der Avatar überall aktualisiert wird.",
"Choose as profile picture" : "Als Profilbild auswählen",
"You are a member of the following groups:" : "Du bist Mitglied folgender Gruppen:",
"You are using <strong>%s</strong>" : "Du benutzt <strong>%s</strong>",
diff --git a/apps/settings/l10n/de.json b/apps/settings/l10n/de.json
index 484f7efe21d..e109fb18fb8 100644
--- a/apps/settings/l10n/de.json
+++ b/apps/settings/l10n/de.json
@@ -467,6 +467,7 @@
"Remove image" : "Bild entfernen",
"png or jpg, max. 20 MB" : "png oder jpg, max. 20 MB",
"Picture provided by original account" : "Bild von Original-Konto zur Verfügung gestellt",
+ "Please note that it can take up to 24 hours for the avatar to get updated everywhere." : "Bitte beachte, dass es bis zu 24 Stunden dauern kann, bis der Avatar überall aktualisiert wird.",
"Choose as profile picture" : "Als Profilbild auswählen",
"You are a member of the following groups:" : "Du bist Mitglied folgender Gruppen:",
"You are using <strong>%s</strong>" : "Du benutzt <strong>%s</strong>",
diff --git a/apps/settings/l10n/de_DE.js b/apps/settings/l10n/de_DE.js
index 85c44843397..4a2927e0184 100644
--- a/apps/settings/l10n/de_DE.js
+++ b/apps/settings/l10n/de_DE.js
@@ -469,6 +469,7 @@ OC.L10N.register(
"Remove image" : "Bild entfernen",
"png or jpg, max. 20 MB" : "png oder jpg, max. 20 MB",
"Picture provided by original account" : "Bild von Original-Konto zur Verfügung gestellt",
+ "Please note that it can take up to 24 hours for the avatar to get updated everywhere." : "Bitte beachten Sie, dass es bis zu 24 Stunden dauern kann, bis der Avatar überall aktualisiert wird.",
"Choose as profile picture" : "Als Profilbild auswählen",
"You are a member of the following groups:" : "Sie sind Mitglied folgender Gruppen:",
"You are using <strong>%s</strong>" : "Sie benutzen <strong>%s</strong>",
diff --git a/apps/settings/l10n/de_DE.json b/apps/settings/l10n/de_DE.json
index ce37c3f3b27..71107fdd1b9 100644
--- a/apps/settings/l10n/de_DE.json
+++ b/apps/settings/l10n/de_DE.json
@@ -467,6 +467,7 @@
"Remove image" : "Bild entfernen",
"png or jpg, max. 20 MB" : "png oder jpg, max. 20 MB",
"Picture provided by original account" : "Bild von Original-Konto zur Verfügung gestellt",
+ "Please note that it can take up to 24 hours for the avatar to get updated everywhere." : "Bitte beachten Sie, dass es bis zu 24 Stunden dauern kann, bis der Avatar überall aktualisiert wird.",
"Choose as profile picture" : "Als Profilbild auswählen",
"You are a member of the following groups:" : "Sie sind Mitglied folgender Gruppen:",
"You are using <strong>%s</strong>" : "Sie benutzen <strong>%s</strong>",
diff --git a/apps/settings/l10n/es.js b/apps/settings/l10n/es.js
index 65fcadfa103..d848b65fcbb 100644
--- a/apps/settings/l10n/es.js
+++ b/apps/settings/l10n/es.js
@@ -469,6 +469,7 @@ OC.L10N.register(
"Remove image" : "Borrar imagen",
"png or jpg, max. 20 MB" : "png o jpg, max. 20 MB",
"Picture provided by original account" : "Imagen provista por la cuenta original",
+ "Please note that it can take up to 24 hours for the avatar to get updated everywhere." : "Ten en cuenta que el avatar puede tardar hasta 24 horas en actualizarse en todas partes.",
"Choose as profile picture" : "Seleccionar como imagen de perfil",
"You are a member of the following groups:" : "Eres miembro de los siguientes grupos:",
"You are using <strong>%s</strong>" : "Estás usando <strong>%s</strong>",
diff --git a/apps/settings/l10n/es.json b/apps/settings/l10n/es.json
index a0a8096f771..65ab289dc40 100644
--- a/apps/settings/l10n/es.json
+++ b/apps/settings/l10n/es.json
@@ -467,6 +467,7 @@
"Remove image" : "Borrar imagen",
"png or jpg, max. 20 MB" : "png o jpg, max. 20 MB",
"Picture provided by original account" : "Imagen provista por la cuenta original",
+ "Please note that it can take up to 24 hours for the avatar to get updated everywhere." : "Ten en cuenta que el avatar puede tardar hasta 24 horas en actualizarse en todas partes.",
"Choose as profile picture" : "Seleccionar como imagen de perfil",
"You are a member of the following groups:" : "Eres miembro de los siguientes grupos:",
"You are using <strong>%s</strong>" : "Estás usando <strong>%s</strong>",
diff --git a/apps/settings/l10n/zh_HK.js b/apps/settings/l10n/zh_HK.js
index d900e2624ae..6793320569d 100644
--- a/apps/settings/l10n/zh_HK.js
+++ b/apps/settings/l10n/zh_HK.js
@@ -469,6 +469,7 @@ OC.L10N.register(
"Remove image" : "移除圖像",
"png or jpg, max. 20 MB" : "png 或 jpg,最大 20 MB",
"Picture provided by original account" : "原始賬戶提供的圖片",
+ "Please note that it can take up to 24 hours for the avatar to get updated everywhere." : "請注意,頭像最長可能需要24小時才能在所有地方更新。",
"Choose as profile picture" : "設定為個人資料圖片",
"You are a member of the following groups:" : "你是下列群組的成員︰",
"You are using <strong>%s</strong>" : "您已使用了 <strong>%s</strong> 的存儲空間",
diff --git a/apps/settings/l10n/zh_HK.json b/apps/settings/l10n/zh_HK.json
index 076c87d4440..f26b4325f64 100644
--- a/apps/settings/l10n/zh_HK.json
+++ b/apps/settings/l10n/zh_HK.json
@@ -467,6 +467,7 @@
"Remove image" : "移除圖像",
"png or jpg, max. 20 MB" : "png 或 jpg,最大 20 MB",
"Picture provided by original account" : "原始賬戶提供的圖片",
+ "Please note that it can take up to 24 hours for the avatar to get updated everywhere." : "請注意,頭像最長可能需要24小時才能在所有地方更新。",
"Choose as profile picture" : "設定為個人資料圖片",
"You are a member of the following groups:" : "你是下列群組的成員︰",
"You are using <strong>%s</strong>" : "您已使用了 <strong>%s</strong> 的存儲空間",
diff --git a/apps/settings/lib/Controller/CheckSetupController.php b/apps/settings/lib/Controller/CheckSetupController.php
index eeaf45d0ec5..5225cd04f09 100644
--- a/apps/settings/lib/Controller/CheckSetupController.php
+++ b/apps/settings/lib/Controller/CheckSetupController.php
@@ -198,19 +198,24 @@ class CheckSetupController extends Controller {
}
/**
- * Checks if the Nextcloud server can connect to a specific URL using both HTTPS and HTTP
+ * Checks if the Nextcloud server can connect to a specific URL
+ * @param string $site site domain or full URL with http/https protocol
* @return bool
*/
- private function isSiteReachable($sitename) {
- $httpSiteName = 'http://' . $sitename . '/';
- $httpsSiteName = 'https://' . $sitename . '/';
-
+ private function isSiteReachable(string $site): bool {
try {
$client = $this->clientService->newClient();
- $client->get($httpSiteName);
- $client->get($httpsSiteName);
+ // if there is no protocol, test http:// AND https://
+ if (preg_match('/^https?:\/\//', $site) !== 1) {
+ $httpSite = 'http://' . $site . '/';
+ $client->get($httpSite);
+ $httpsSite = 'https://' . $site . '/';
+ $client->get($httpsSite);
+ } else {
+ $client->get($site);
+ }
} catch (\Exception $e) {
- $this->logger->error('Cannot connect to: ' . $sitename, [
+ $this->logger->error('Cannot connect to: ' . $site, [
'app' => 'internet_connection_check',
'exception' => $e,
]);
@@ -469,7 +474,7 @@ Raw output
protected function getOpcacheSetupRecommendations(): array {
// If the module is not loaded, return directly to skip inapplicable checks
if (!extension_loaded('Zend OPcache')) {
- return ['The PHP OPcache module is not loaded. <a target="_blank" rel="noreferrer noopener" class="external" href="' . $this->urlGenerator->linkToDocs('admin-php-opcache') . '">For better performance it is recommended</a> to load it into your PHP installation.'];
+ return ['The PHP OPcache module is not loaded. For better performance it is recommended to load it into your PHP installation.'];
}
$recommendations = [];
@@ -477,7 +482,7 @@ Raw output
// Check whether Nextcloud is allowed to use the OPcache API
$isPermitted = true;
$permittedPath = $this->iniGetWrapper->getString('opcache.restrict_api');
- if (isset($permittedPath) && $permittedPath !== '' && !str_starts_with(\OC::$SERVERROOT, $permittedPath)) {
+ if (isset($permittedPath) && $permittedPath !== '' && !str_starts_with(\OC::$SERVERROOT, rtrim($permittedPath, '/'))) {
$isPermitted = false;
}
@@ -708,20 +713,6 @@ Raw output
$recommendedPHPModules[] = 'intl';
}
- if (!extension_loaded('bcmath')) {
- $recommendedPHPModules[] = 'bcmath';
- }
-
- if (!extension_loaded('gmp')) {
- $recommendedPHPModules[] = 'gmp';
- }
-
- if ($this->config->getAppValue('theming', 'enabled', 'no') === 'yes') {
- if (!extension_loaded('imagick')) {
- $recommendedPHPModules[] = 'imagick';
- }
- }
-
if (!defined('PASSWORD_ARGON2I') && PHP_VERSION_ID >= 70400) {
// Installing php-sodium on >=php7.4 will provide PASSWORD_ARGON2I
// on previous version argon2 wasn't part of the "standard" extension
@@ -733,6 +724,25 @@ Raw output
return $recommendedPHPModules;
}
+ protected function isImagickEnabled(): bool {
+ if ($this->config->getAppValue('theming', 'enabled', 'no') === 'yes') {
+ if (!extension_loaded('imagick')) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ protected function areWebauthnExtensionsEnabled(): bool {
+ if (!extension_loaded('bcmath')) {
+ return false;
+ }
+ if (!extension_loaded('gmp')) {
+ return false;
+ }
+ return true;
+ }
+
protected function isMysqlUsedWithoutUTF8MB4(): bool {
return ($this->config->getSystemValue('dbtype', 'sqlite') === 'mysql') && ($this->config->getSystemValue('mysql.utf8mb4', false) === false);
}
@@ -864,6 +874,8 @@ Raw output
'databaseConversionDocumentation' => $this->urlGenerator->linkToDocs('admin-db-conversion'),
'isMemoryLimitSufficient' => $this->memoryInfo->isMemoryLimitSufficient(),
'appDirsWithDifferentOwner' => $this->getAppDirsWithDifferentOwner(),
+ 'isImagickEnabled' => $this->isImagickEnabled(),
+ 'areWebauthnExtensionsEnabled' => $this->areWebauthnExtensionsEnabled(),
'recommendedPHPModules' => $this->hasRecommendedPHPModules(),
'pendingBigIntConversionColumns' => $this->hasBigIntConversionPendingColumns(),
'isMysqlUsedWithoutUTF8MB4' => $this->isMysqlUsedWithoutUTF8MB4(),
diff --git a/apps/settings/src/store/index.js b/apps/settings/src/store/index.js
index f30e114b6d0..9d8733d430e 100644
--- a/apps/settings/src/store/index.js
+++ b/apps/settings/src/store/index.js
@@ -27,6 +27,7 @@ import users from './users'
import apps from './apps'
import settings from './settings'
import oc from './oc'
+import { showError } from '@nextcloud/dialogs'
Vue.use(Vuex)
@@ -36,9 +37,9 @@ const mutations = {
API_FAILURE(state, error) {
try {
const message = error.error.response.data.ocs.meta.message
- OC.Notification.showHtml(t('settings', 'An error occured during the request. Unable to proceed.') + '<br>' + message, { timeout: 7 })
+ showError(t('settings', 'An error occured during the request. Unable to proceed.') + '<br>' + message, { isHTML: true })
} catch (e) {
- OC.Notification.showTemporary(t('settings', 'An error occured during the request. Unable to proceed.'))
+ showError(t('settings', 'An error occured during the request. Unable to proceed.'))
}
console.error(state, error)
},
diff --git a/apps/settings/tests/Controller/CheckSetupControllerTest.php b/apps/settings/tests/Controller/CheckSetupControllerTest.php
index 20cf2b01069..8a1e062f58b 100644
--- a/apps/settings/tests/Controller/CheckSetupControllerTest.php
+++ b/apps/settings/tests/Controller/CheckSetupControllerTest.php
@@ -550,6 +550,16 @@ class CheckSetupControllerTest extends TestCase {
$this->checkSetupController
->expects($this->once())
+ ->method('isImagickEnabled')
+ ->willReturn(false);
+
+ $this->checkSetupController
+ ->expects($this->once())
+ ->method('areWebauthnExtensionsEnabled')
+ ->willReturn(false);
+
+ $this->checkSetupController
+ ->expects($this->once())
->method('hasRecommendedPHPModules')
->willReturn([]);
@@ -582,9 +592,6 @@ class CheckSetupControllerTest extends TestCase {
if ($key === 'admin-code-integrity') {
return 'http://docs.example.org/server/go.php?to=admin-code-integrity';
}
- if ($key === 'admin-php-opcache') {
- return 'http://docs.example.org/server/go.php?to=admin-php-opcache';
- }
if ($key === 'admin-db-conversion') {
return 'http://docs.example.org/server/go.php?to=admin-db-conversion';
}
@@ -645,6 +652,8 @@ class CheckSetupControllerTest extends TestCase {
'missingColumns' => [],
'isMemoryLimitSufficient' => true,
'appDirsWithDifferentOwner' => [],
+ 'isImagickEnabled' => false,
+ 'areWebauthnExtensionsEnabled' => false,
'recommendedPHPModules' => [],
'pendingBigIntConversionColumns' => [],
'isMysqlUsedWithoutUTF8MB4' => false,
diff --git a/apps/theming/css/theming.scss b/apps/theming/css/theming.scss
index 81b1b1a87ec..52337d2105f 100644
--- a/apps/theming/css/theming.scss
+++ b/apps/theming/css/theming.scss
@@ -167,8 +167,7 @@ $invert: luma($color-primary) > 0.6;
}
}
-input.primary,
-.alternative-logins a, {
+input.primary {
background-color: $color-primary-element;
border: 1px solid $color-primary-text;
color: $color-primary-text;
@@ -202,17 +201,15 @@ input.primary,
}
}
- input,
- .alternative-logins a {
+ input {
border: 1px solid nc-lighten($color-primary-text, 50%);
}
input.primary,
- button.primary,
- .alternative-logins a {
+ button.primary {
background-color: $color-primary;
color: $color-primary-text;
}
- a,
+ :not(div.alternative-logins) > a,
label,
footer p,
.alternative-logins legend,
@@ -257,7 +254,7 @@ input.primary,
}
#body-login {
- a, label, p {
+ :not(.alternative-logins) a, label, p {
color: $color-primary-text;
}
diff --git a/apps/theming/l10n/nb.js b/apps/theming/l10n/nb.js
index 97a643394c2..681599712d3 100644
--- a/apps/theming/l10n/nb.js
+++ b/apps/theming/l10n/nb.js
@@ -8,8 +8,11 @@ OC.L10N.register(
"Name cannot be empty" : "Navn kan ikke være tom",
"The given name is too long" : "Navnet er for langt",
"The given web address is too long" : "Nettadressen er for lang",
- "The given legal notice address is too long" : "Den oppgitte juridiske varslingsadressen er for lang",
- "The given privacy policy address is too long" : "Personvernerklæring-addressen er for lang",
+ "The given web address is not a valid URL" : "Nettadressen er ikke en gyldig URL",
+ "The given legal notice address is too long" : "Adressen for juridiske varsel er for lang",
+ "The given legal notice address is not a valid URL" : "Adressen til den juridiske varslingen er ikke en gyldig URL",
+ "The given privacy policy address is too long" : "Adressen til personvernerklæringen er for lang ",
+ "The given privacy policy address is not a valid URL" : "Addressen til personvernerklæringen er ikke en gyldig url",
"The given slogan is too long" : "Slagordet er for langt",
"The given color is invalid" : "Fargen er ugyldig",
"The file was uploaded" : "Filen ble lastet opp",
diff --git a/apps/theming/l10n/nb.json b/apps/theming/l10n/nb.json
index 6bad8a1b754..6f0547c4be0 100644
--- a/apps/theming/l10n/nb.json
+++ b/apps/theming/l10n/nb.json
@@ -6,8 +6,11 @@
"Name cannot be empty" : "Navn kan ikke være tom",
"The given name is too long" : "Navnet er for langt",
"The given web address is too long" : "Nettadressen er for lang",
- "The given legal notice address is too long" : "Den oppgitte juridiske varslingsadressen er for lang",
- "The given privacy policy address is too long" : "Personvernerklæring-addressen er for lang",
+ "The given web address is not a valid URL" : "Nettadressen er ikke en gyldig URL",
+ "The given legal notice address is too long" : "Adressen for juridiske varsel er for lang",
+ "The given legal notice address is not a valid URL" : "Adressen til den juridiske varslingen er ikke en gyldig URL",
+ "The given privacy policy address is too long" : "Adressen til personvernerklæringen er for lang ",
+ "The given privacy policy address is not a valid URL" : "Addressen til personvernerklæringen er ikke en gyldig url",
"The given slogan is too long" : "Slagordet er for langt",
"The given color is invalid" : "Fargen er ugyldig",
"The file was uploaded" : "Filen ble lastet opp",
diff --git a/apps/user_ldap/lib/Migration/Version1130Date20211102154716.php b/apps/user_ldap/lib/Migration/Version1130Date20211102154716.php
index 27f5f5ce504..2cca72ac493 100644
--- a/apps/user_ldap/lib/Migration/Version1130Date20211102154716.php
+++ b/apps/user_ldap/lib/Migration/Version1130Date20211102154716.php
@@ -43,6 +43,8 @@ class Version1130Date20211102154716 extends SimpleMigrationStep {
private $dbc;
/** @var LoggerInterface */
private $logger;
+ /** @var string[] */
+ private $hashColumnAddedToTables = [];
public function __construct(IDBConnection $dbc, LoggerInterface $logger) {
$this->dbc = $dbc;
@@ -89,6 +91,7 @@ class Version1130Date20211102154716 extends SimpleMigrationStep {
'length' => 64,
]);
$changeSchema = true;
+ $this->hashColumnAddedToTables[] = $tableName;
}
$column = $table->getColumn('ldap_dn');
if ($tableName === 'ldap_user_mapping') {
@@ -109,7 +112,7 @@ class Version1130Date20211102154716 extends SimpleMigrationStep {
$table->addUniqueIndex(['directory_uuid'], 'ldap_user_directory_uuid');
$changeSchema = true;
}
- } else if (!$schema->hasTable('ldap_group_mapping_backup')) {
+ } elseif (!$schema->hasTable('ldap_group_mapping_backup')) {
// We need to copy the table twice to be able to change primary key, prepare the backup table
$table2 = $schema->createTable('ldap_group_mapping_backup');
$table2->addColumn('ldap_dn', Types::STRING, [
@@ -177,9 +180,16 @@ class Version1130Date20211102154716 extends SimpleMigrationStep {
protected function getSelectQuery(string $table): IQueryBuilder {
$qb = $this->dbc->getQueryBuilder();
- $qb->select('owncloud_name', 'ldap_dn', 'ldap_dn_hash')
- ->from($table)
- ->where($qb->expr()->isNull('ldap_dn_hash'));
+ $qb->select('owncloud_name', 'ldap_dn')
+ ->from($table);
+
+ // when added we may run into risk that it's read from a DB node
+ // where the column is not present. Then the where clause is also
+ // not necessary since all rows qualify.
+ if (!in_array($table, $this->hashColumnAddedToTables, true)) {
+ $qb->where($qb->expr()->isNull('ldap_dn_hash'));
+ }
+
return $qb;
}
@@ -260,7 +270,7 @@ class Version1130Date20211102154716 extends SimpleMigrationStep {
* @return Generator<string>
* @throws \OCP\DB\Exception
*/
- protected function getDuplicatedUuids(string $table): Generator{
+ protected function getDuplicatedUuids(string $table): Generator {
$select = $this->dbc->getQueryBuilder();
$select->select('directory_uuid')
->from($table)