summaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
Diffstat (limited to 'apps')
-rw-r--r--apps/encryption/l10n/ja.js2
-rw-r--r--apps/encryption/l10n/ja.json2
-rw-r--r--apps/files/l10n/da.js1
-rw-r--r--apps/files/l10n/da.json1
-rw-r--r--apps/files/l10n/es.js8
-rw-r--r--apps/files/l10n/es.json8
-rw-r--r--apps/files/l10n/et_EE.js3
-rw-r--r--apps/files/l10n/et_EE.json3
-rw-r--r--apps/files/l10n/ja.js1
-rw-r--r--apps/files/l10n/ja.json1
-rw-r--r--apps/files_external/l10n/ar.js1
-rw-r--r--apps/files_external/l10n/ar.json1
-rw-r--r--apps/files_external/l10n/id.js6
-rw-r--r--apps/files_external/l10n/id.json6
-rw-r--r--apps/files_external/l10n/lb.js1
-rw-r--r--apps/files_external/l10n/lb.json1
-rw-r--r--apps/files_external/lib/amazons3.php4
-rw-r--r--apps/files_external/lib/api.php2
-rw-r--r--apps/files_external/lib/config.php32
-rw-r--r--apps/files_external/lib/dropbox.php4
-rw-r--r--apps/files_external/lib/google.php4
-rw-r--r--apps/files_external/lib/swift.php4
-rw-r--r--apps/files_external/service/storagesservice.php2
-rw-r--r--apps/files_external/templates/settings.php2
-rw-r--r--apps/files_external/tests/mountconfig.php65
-rw-r--r--apps/files_sharing/ajax/external.php107
-rw-r--r--apps/files_sharing/ajax/publicpreview.php2
-rw-r--r--apps/files_sharing/ajax/shareinfo.php2
-rw-r--r--apps/files_sharing/api/local.php10
-rw-r--r--apps/files_sharing/api/remote.php91
-rw-r--r--apps/files_sharing/api/server2server.php24
-rw-r--r--apps/files_sharing/appinfo/routes.php15
-rw-r--r--apps/files_sharing/appinfo/version2
-rw-r--r--apps/files_sharing/css/public.css2
-rw-r--r--apps/files_sharing/js/share.js6
-rw-r--r--apps/files_sharing/js/sharedfilelist.js2
-rw-r--r--apps/files_sharing/l10n/da.js4
-rw-r--r--apps/files_sharing/l10n/da.json4
-rw-r--r--apps/files_sharing/l10n/es.js1
-rw-r--r--apps/files_sharing/l10n/es.json1
-rw-r--r--apps/files_sharing/l10n/fi_FI.js1
-rw-r--r--apps/files_sharing/l10n/fi_FI.json1
-rw-r--r--apps/files_sharing/l10n/fr.js1
-rw-r--r--apps/files_sharing/l10n/fr.json1
-rw-r--r--apps/files_sharing/l10n/gl.js1
-rw-r--r--apps/files_sharing/l10n/gl.json1
-rw-r--r--apps/files_sharing/l10n/id.js11
-rw-r--r--apps/files_sharing/l10n/id.json11
-rw-r--r--apps/files_sharing/l10n/ja.js4
-rw-r--r--apps/files_sharing/l10n/ja.json4
-rw-r--r--apps/files_sharing/l10n/nl.js1
-rw-r--r--apps/files_sharing/l10n/nl.json1
-rw-r--r--apps/files_sharing/l10n/pt_BR.js1
-rw-r--r--apps/files_sharing/l10n/pt_BR.json1
-rw-r--r--apps/files_sharing/lib/activity.php15
-rw-r--r--apps/files_sharing/lib/external/manager.php10
-rw-r--r--apps/files_sharing/lib/external/scanner.php1
-rw-r--r--apps/files_sharing/lib/readonlywrapper.php74
-rw-r--r--apps/files_sharing/lib/sharedmount.php27
-rw-r--r--apps/files_sharing/lib/sharedstorage.php16
-rw-r--r--apps/files_sharing/publicwebdav.php2
-rw-r--r--apps/files_sharing/templates/public.php2
-rw-r--r--apps/files_sharing/tests/js/shareSpec.js17
-rw-r--r--apps/files_sharing/tests/locking.php101
-rw-r--r--apps/files_sharing/tests/unsharechildren.php8
-rw-r--r--apps/files_trashbin/appinfo/register_command.php29
-rw-r--r--apps/files_trashbin/appinfo/version2
-rw-r--r--apps/files_trashbin/command/cleanup.php118
-rw-r--r--apps/files_trashbin/lib/trashbin.php8
-rw-r--r--apps/files_trashbin/tests/command/cleanuptest.php192
-rw-r--r--apps/files_versions/appinfo/register_command.php28
-rw-r--r--apps/files_versions/appinfo/version2
-rw-r--r--apps/files_versions/command/cleanup.php114
-rw-r--r--apps/files_versions/tests/command/cleanuptest.php162
-rw-r--r--apps/user_ldap/appinfo/version2
-rw-r--r--apps/user_ldap/l10n/da.js1
-rw-r--r--apps/user_ldap/l10n/da.json1
-rw-r--r--apps/user_ldap/l10n/et_EE.js21
-rw-r--r--apps/user_ldap/l10n/et_EE.json21
-rw-r--r--apps/user_ldap/l10n/fr.js1
-rw-r--r--apps/user_ldap/l10n/fr.json1
-rw-r--r--apps/user_ldap/l10n/id.js51
-rw-r--r--apps/user_ldap/l10n/id.json51
-rw-r--r--apps/user_ldap/l10n/lb.js1
-rw-r--r--apps/user_ldap/l10n/lb.json1
-rw-r--r--apps/user_webdavauth/appinfo/version2
86 files changed, 1280 insertions, 280 deletions
diff --git a/apps/encryption/l10n/ja.js b/apps/encryption/l10n/ja.js
index 3919997ed61..f76b215fe1f 100644
--- a/apps/encryption/l10n/ja.js
+++ b/apps/encryption/l10n/ja.js
@@ -16,7 +16,7 @@ OC.L10N.register(
"Could not change the password. Maybe the old password was not correct." : "パスワードを変更できませんでした。古いパスワードが間違っているかもしれません。",
"Recovery Key disabled" : "復旧キーが無効になりました。",
"Recovery Key enabled" : "復旧キーが有効になりました。",
- "Could not enable the recovery key, please try again or contact your administrator" : "復旧キーを有効化できませんでした。もう一度試してみるか、管理者に連絡してください。",
+ "Could not enable the recovery key, please try again or contact your administrator" : "復旧キーを有効化できませんでした。もう一度試してみるか、管理者に問い合わせてください。",
"Could not update the private key password." : "秘密鍵のパスワードを更新できませんでした。",
"The old password was not correct, please try again." : "古いパスワードが一致しませんでした。もう一度入力してください。",
"The current log-in password was not correct, please try again." : "ログインパスワードが一致しませんでした。もう一度入力してください。",
diff --git a/apps/encryption/l10n/ja.json b/apps/encryption/l10n/ja.json
index c8f65e0d7b3..58b32ebdd2e 100644
--- a/apps/encryption/l10n/ja.json
+++ b/apps/encryption/l10n/ja.json
@@ -14,7 +14,7 @@
"Could not change the password. Maybe the old password was not correct." : "パスワードを変更できませんでした。古いパスワードが間違っているかもしれません。",
"Recovery Key disabled" : "復旧キーが無効になりました。",
"Recovery Key enabled" : "復旧キーが有効になりました。",
- "Could not enable the recovery key, please try again or contact your administrator" : "復旧キーを有効化できませんでした。もう一度試してみるか、管理者に連絡してください。",
+ "Could not enable the recovery key, please try again or contact your administrator" : "復旧キーを有効化できませんでした。もう一度試してみるか、管理者に問い合わせてください。",
"Could not update the private key password." : "秘密鍵のパスワードを更新できませんでした。",
"The old password was not correct, please try again." : "古いパスワードが一致しませんでした。もう一度入力してください。",
"The current log-in password was not correct, please try again." : "ログインパスワードが一致しませんでした。もう一度入力してください。",
diff --git a/apps/files/l10n/da.js b/apps/files/l10n/da.js
index af8367560d5..e039bddf6a7 100644
--- a/apps/files/l10n/da.js
+++ b/apps/files/l10n/da.js
@@ -48,6 +48,7 @@ OC.L10N.register(
"Pending" : "Afventer",
"Unable to determine date" : "Kan ikke fastslå datoen",
"This operation is forbidden" : "Denne operation er forbudt",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Denne mappe er utilgængelig - tjek venligst loggene eller kontakt administratoren",
"Error moving file." : "Fejl ved flytning af fil",
"Error moving file" : "Fejl ved flytning af fil",
"Error" : "Fejl",
diff --git a/apps/files/l10n/da.json b/apps/files/l10n/da.json
index 44c2f7aafe1..f8e5b4af457 100644
--- a/apps/files/l10n/da.json
+++ b/apps/files/l10n/da.json
@@ -46,6 +46,7 @@
"Pending" : "Afventer",
"Unable to determine date" : "Kan ikke fastslå datoen",
"This operation is forbidden" : "Denne operation er forbudt",
+ "This directory is unavailable, please check the logs or contact the administrator" : "Denne mappe er utilgængelig - tjek venligst loggene eller kontakt administratoren",
"Error moving file." : "Fejl ved flytning af fil",
"Error moving file" : "Fejl ved flytning af fil",
"Error" : "Fejl",
diff --git a/apps/files/l10n/es.js b/apps/files/l10n/es.js
index 281c0bba516..c7409a25df4 100644
--- a/apps/files/l10n/es.js
+++ b/apps/files/l10n/es.js
@@ -42,7 +42,7 @@ OC.L10N.register(
"Delete" : "Eliminar",
"Disconnect storage" : "Desconectar almacenamiento",
"Unshare" : "Dejar de compartir",
- "No permission to delete" : "Ninguna autorización que borrar",
+ "No permission to delete" : "Permisos insuficientes para borrar",
"Download" : "Descargar",
"Select" : "Seleccionar",
"Pending" : "Pendiente",
@@ -64,13 +64,13 @@ OC.L10N.register(
"_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Subiendo %n archivos"],
"\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo inválido.",
"File name cannot be empty." : "El nombre de archivo no puede estar vacío.",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "El almacen de {owner} está lleno, ¡los archivos no se actualizarán ni sincronizarán más!",
+ "Storage of {owner} is full, files can not be updated or synced anymore!" : "El almacén de {owner} está repleto, ¡los archivos no se actualizarán ni sincronizarán más!",
"Your storage is full, files can not be updated or synced anymore!" : "Su almacenamiento está lleno, ¡los archivos no se actualizarán ni sincronizarán más!",
- "Storage of {owner} is almost full ({usedSpacePercent}%)" : "El almacen de {owner} está casi lleno en un ({usedSpacePercent}%)",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)" : "El almacén de {owner} está casi lleno en un ({usedSpacePercent}%)",
"Your storage is almost full ({usedSpacePercent}%)" : "Su almacenamiento está casi lleno ({usedSpacePercent}%)",
"_matches '{filter}'_::_match '{filter}'_" : ["coincidencias '{filter}'","coincidencia '{filter}'"],
"{dirs} and {files}" : "{dirs} y {files}",
- "Favorited" : "Agregado a favoritos",
+ "Favorited" : "Agregado a Favoritos",
"Favorite" : "Favorito",
"An error occurred while trying to update the tags" : "Se produjo un error al tratar de actualizar las etiquetas",
"A new file or folder has been <strong>created</strong>" : "Se ha <strong>creado</strong> un nuevo archivo o carpeta",
diff --git a/apps/files/l10n/es.json b/apps/files/l10n/es.json
index 40f11037293..fc7a12fdf04 100644
--- a/apps/files/l10n/es.json
+++ b/apps/files/l10n/es.json
@@ -40,7 +40,7 @@
"Delete" : "Eliminar",
"Disconnect storage" : "Desconectar almacenamiento",
"Unshare" : "Dejar de compartir",
- "No permission to delete" : "Ninguna autorización que borrar",
+ "No permission to delete" : "Permisos insuficientes para borrar",
"Download" : "Descargar",
"Select" : "Seleccionar",
"Pending" : "Pendiente",
@@ -62,13 +62,13 @@
"_Uploading %n file_::_Uploading %n files_" : ["Subiendo %n archivo","Subiendo %n archivos"],
"\"{name}\" is an invalid file name." : "\"{name}\" es un nombre de archivo inválido.",
"File name cannot be empty." : "El nombre de archivo no puede estar vacío.",
- "Storage of {owner} is full, files can not be updated or synced anymore!" : "El almacen de {owner} está lleno, ¡los archivos no se actualizarán ni sincronizarán más!",
+ "Storage of {owner} is full, files can not be updated or synced anymore!" : "El almacén de {owner} está repleto, ¡los archivos no se actualizarán ni sincronizarán más!",
"Your storage is full, files can not be updated or synced anymore!" : "Su almacenamiento está lleno, ¡los archivos no se actualizarán ni sincronizarán más!",
- "Storage of {owner} is almost full ({usedSpacePercent}%)" : "El almacen de {owner} está casi lleno en un ({usedSpacePercent}%)",
+ "Storage of {owner} is almost full ({usedSpacePercent}%)" : "El almacén de {owner} está casi lleno en un ({usedSpacePercent}%)",
"Your storage is almost full ({usedSpacePercent}%)" : "Su almacenamiento está casi lleno ({usedSpacePercent}%)",
"_matches '{filter}'_::_match '{filter}'_" : ["coincidencias '{filter}'","coincidencia '{filter}'"],
"{dirs} and {files}" : "{dirs} y {files}",
- "Favorited" : "Agregado a favoritos",
+ "Favorited" : "Agregado a Favoritos",
"Favorite" : "Favorito",
"An error occurred while trying to update the tags" : "Se produjo un error al tratar de actualizar las etiquetas",
"A new file or folder has been <strong>created</strong>" : "Se ha <strong>creado</strong> un nuevo archivo o carpeta",
diff --git a/apps/files/l10n/et_EE.js b/apps/files/l10n/et_EE.js
index 1bf4a0a5aa3..bf9e8574c28 100644
--- a/apps/files/l10n/et_EE.js
+++ b/apps/files/l10n/et_EE.js
@@ -63,11 +63,13 @@ OC.L10N.register(
"_Uploading %n file_::_Uploading %n files_" : ["Laadin üles %n faili","Laadin üles %n faili"],
"\"{name}\" is an invalid file name." : "\"{name}\" on vigane failinimi.",
"File name cannot be empty." : "Faili nimi ei saa olla tühi.",
+ "Storage of {owner} is full, files can not be updated or synced anymore!" : "{owner} andmemaht on täis! Faile ei uuendata ega sünkroniseerita!",
"Your storage is full, files can not be updated or synced anymore!" : "Sinu andmemaht on täis! Faile ei uuendata ega sünkroniseerita!",
"Your storage is almost full ({usedSpacePercent}%)" : "Su andmemaht on peaaegu täis ({usedSpacePercent}%)",
"{dirs} and {files}" : "{dirs} ja {files}",
"Favorited" : "Lemmikud",
"Favorite" : "Lemmik",
+ "An error occurred while trying to update the tags" : "Siltide uuendamisel tekkis tõrge",
"A new file or folder has been <strong>created</strong>" : "Uus fail või kataloog on <strong>loodud</strong>",
"A file or folder has been <strong>changed</strong>" : "Fail või kataloog on <strong>muudetud</strong>",
"A file or folder has been <strong>deleted</strong>" : "Fail või kataloog on <strong>kustutatud</strong>",
@@ -88,6 +90,7 @@ OC.L10N.register(
"Maximum upload size" : "Maksimaalne üleslaadimise suurus",
"max. possible: " : "maks. võimalik: ",
"Save" : "Salvesta",
+ "Can not be edited from here due to insufficient permissions." : "Ei saa õiguste puudumise tõttu muuta.",
"Settings" : "Seaded",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Kasuta seda aadressi <a href=\"%s\" target=\"_blank\">oma failidele ligipääsuks WebDAV kaudu</a>",
diff --git a/apps/files/l10n/et_EE.json b/apps/files/l10n/et_EE.json
index d7b1703dfc5..40fa7efca6b 100644
--- a/apps/files/l10n/et_EE.json
+++ b/apps/files/l10n/et_EE.json
@@ -61,11 +61,13 @@
"_Uploading %n file_::_Uploading %n files_" : ["Laadin üles %n faili","Laadin üles %n faili"],
"\"{name}\" is an invalid file name." : "\"{name}\" on vigane failinimi.",
"File name cannot be empty." : "Faili nimi ei saa olla tühi.",
+ "Storage of {owner} is full, files can not be updated or synced anymore!" : "{owner} andmemaht on täis! Faile ei uuendata ega sünkroniseerita!",
"Your storage is full, files can not be updated or synced anymore!" : "Sinu andmemaht on täis! Faile ei uuendata ega sünkroniseerita!",
"Your storage is almost full ({usedSpacePercent}%)" : "Su andmemaht on peaaegu täis ({usedSpacePercent}%)",
"{dirs} and {files}" : "{dirs} ja {files}",
"Favorited" : "Lemmikud",
"Favorite" : "Lemmik",
+ "An error occurred while trying to update the tags" : "Siltide uuendamisel tekkis tõrge",
"A new file or folder has been <strong>created</strong>" : "Uus fail või kataloog on <strong>loodud</strong>",
"A file or folder has been <strong>changed</strong>" : "Fail või kataloog on <strong>muudetud</strong>",
"A file or folder has been <strong>deleted</strong>" : "Fail või kataloog on <strong>kustutatud</strong>",
@@ -86,6 +88,7 @@
"Maximum upload size" : "Maksimaalne üleslaadimise suurus",
"max. possible: " : "maks. võimalik: ",
"Save" : "Salvesta",
+ "Can not be edited from here due to insufficient permissions." : "Ei saa õiguste puudumise tõttu muuta.",
"Settings" : "Seaded",
"WebDAV" : "WebDAV",
"Use this address to <a href=\"%s\" target=\"_blank\">access your Files via WebDAV</a>" : "Kasuta seda aadressi <a href=\"%s\" target=\"_blank\">oma failidele ligipääsuks WebDAV kaudu</a>",
diff --git a/apps/files/l10n/ja.js b/apps/files/l10n/ja.js
index 6aae198aac6..154fc6d2106 100644
--- a/apps/files/l10n/ja.js
+++ b/apps/files/l10n/ja.js
@@ -48,6 +48,7 @@ OC.L10N.register(
"Pending" : "中断",
"Unable to determine date" : "更新日不明",
"This operation is forbidden" : "この操作は禁止されています",
+ "This directory is unavailable, please check the logs or contact the administrator" : "このディレクトリは利用できません。ログを確認するか管理者に問い合わせてください。",
"Error moving file." : "ファイル移動でエラー",
"Error moving file" : "ファイルの移動エラー",
"Error" : "エラー",
diff --git a/apps/files/l10n/ja.json b/apps/files/l10n/ja.json
index 675edbb6974..e82b9dfc986 100644
--- a/apps/files/l10n/ja.json
+++ b/apps/files/l10n/ja.json
@@ -46,6 +46,7 @@
"Pending" : "中断",
"Unable to determine date" : "更新日不明",
"This operation is forbidden" : "この操作は禁止されています",
+ "This directory is unavailable, please check the logs or contact the administrator" : "このディレクトリは利用できません。ログを確認するか管理者に問い合わせてください。",
"Error moving file." : "ファイル移動でエラー",
"Error moving file" : "ファイルの移動エラー",
"Error" : "エラー",
diff --git a/apps/files_external/l10n/ar.js b/apps/files_external/l10n/ar.js
index a4ded22fae3..174b0d1d547 100644
--- a/apps/files_external/l10n/ar.js
+++ b/apps/files_external/l10n/ar.js
@@ -1,6 +1,7 @@
OC.L10N.register(
"files_external",
{
+ "Local" : "محلي",
"Location" : "المكان",
"Key" : "المفتاح",
"Secret" : "سر",
diff --git a/apps/files_external/l10n/ar.json b/apps/files_external/l10n/ar.json
index 8900ee04f9d..582813959dc 100644
--- a/apps/files_external/l10n/ar.json
+++ b/apps/files_external/l10n/ar.json
@@ -1,4 +1,5 @@
{ "translations": {
+ "Local" : "محلي",
"Location" : "المكان",
"Key" : "المفتاح",
"Secret" : "سر",
diff --git a/apps/files_external/l10n/id.js b/apps/files_external/l10n/id.js
index ff582a863e9..7f153b9f49a 100644
--- a/apps/files_external/l10n/id.js
+++ b/apps/files_external/l10n/id.js
@@ -43,6 +43,7 @@ OC.L10N.register(
"Username as share" : "Nama pengguna berbagi",
"URL" : "URL",
"Secure https://" : "Secure https://",
+ "SFTP with secret key login" : "SFTP dengan kunci rahasia masuk",
"Public key" : "Kunci Public",
"Storage with id \"%i\" not found" : "Penyimpanan dengan id \"%i\" tidak ditemukan",
"Invalid mount point" : "Mount point salah",
@@ -54,6 +55,11 @@ OC.L10N.register(
"Personal" : "Pribadi",
"System" : "Sistem",
"Enable encryption" : "Aktifkan enkripsi",
+ "Enable previews" : "Aktifkan pratinjau",
+ "Check for changes" : "Periksa perubahan",
+ "Never" : "Jangan pernah",
+ "Once every direct access" : "Setiap kali akses langsung",
+ "Every time the filesystem is used" : "Setiap kali sistem berkas digunakan",
"All users. Type to select user or group." : "Semua pengguna. Ketik untuk memilih pengguna atau grup.",
"(group)" : "(grup)",
"Saved" : "Disimpan",
diff --git a/apps/files_external/l10n/id.json b/apps/files_external/l10n/id.json
index 2c1c450e9af..205ac8b210b 100644
--- a/apps/files_external/l10n/id.json
+++ b/apps/files_external/l10n/id.json
@@ -41,6 +41,7 @@
"Username as share" : "Nama pengguna berbagi",
"URL" : "URL",
"Secure https://" : "Secure https://",
+ "SFTP with secret key login" : "SFTP dengan kunci rahasia masuk",
"Public key" : "Kunci Public",
"Storage with id \"%i\" not found" : "Penyimpanan dengan id \"%i\" tidak ditemukan",
"Invalid mount point" : "Mount point salah",
@@ -52,6 +53,11 @@
"Personal" : "Pribadi",
"System" : "Sistem",
"Enable encryption" : "Aktifkan enkripsi",
+ "Enable previews" : "Aktifkan pratinjau",
+ "Check for changes" : "Periksa perubahan",
+ "Never" : "Jangan pernah",
+ "Once every direct access" : "Setiap kali akses langsung",
+ "Every time the filesystem is used" : "Setiap kali sistem berkas digunakan",
"All users. Type to select user or group." : "Semua pengguna. Ketik untuk memilih pengguna atau grup.",
"(group)" : "(grup)",
"Saved" : "Disimpan",
diff --git a/apps/files_external/l10n/lb.js b/apps/files_external/l10n/lb.js
index eb46704c970..4f18f5b6e39 100644
--- a/apps/files_external/l10n/lb.js
+++ b/apps/files_external/l10n/lb.js
@@ -2,6 +2,7 @@ OC.L10N.register(
"files_external",
{
"Location" : "Uert",
+ "Port" : "Port",
"Region" : "Regioun",
"Host" : "Host",
"Username" : "Benotzernumm",
diff --git a/apps/files_external/l10n/lb.json b/apps/files_external/l10n/lb.json
index a1e3e397636..a9acd181800 100644
--- a/apps/files_external/l10n/lb.json
+++ b/apps/files_external/l10n/lb.json
@@ -1,5 +1,6 @@
{ "translations": {
"Location" : "Uert",
+ "Port" : "Port",
"Region" : "Regioun",
"Host" : "Host",
"Username" : "Benotzernumm",
diff --git a/apps/files_external/lib/amazons3.php b/apps/files_external/lib/amazons3.php
index 77918c5507c..02a02710a14 100644
--- a/apps/files_external/lib/amazons3.php
+++ b/apps/files_external/lib/amazons3.php
@@ -373,7 +373,7 @@ class AmazonS3 extends \OC\Files\Storage\Common {
switch ($mode) {
case 'r':
case 'rb':
- $tmpFile = \OCP\Files::tmpFile();
+ $tmpFile = \OC_Helper::tmpFile();
self::$tmpFiles[$tmpFile] = $path;
try {
@@ -405,7 +405,7 @@ class AmazonS3 extends \OC\Files\Storage\Common {
} else {
$ext = '';
}
- $tmpFile = \OCP\Files::tmpFile($ext);
+ $tmpFile = \OC_Helper::tmpFile($ext);
\OC\Files\Stream\Close::registerCallback($tmpFile, array($this, 'writeBack'));
if ($this->file_exists($path)) {
$source = $this->fopen($path, 'r');
diff --git a/apps/files_external/lib/api.php b/apps/files_external/lib/api.php
index 015c15c41ff..b9435e33105 100644
--- a/apps/files_external/lib/api.php
+++ b/apps/files_external/lib/api.php
@@ -71,7 +71,7 @@ class Api {
*/
public static function getUserMounts($params) {
$entries = array();
- $user = \OC::$server->getUserSession()->getUser()->getUID();
+ $user = \OC_User::getUser();
$mounts = \OC_Mount_Config::getAbsoluteMountPoints($user);
foreach($mounts as $mountPoint => $mount) {
diff --git a/apps/files_external/lib/config.php b/apps/files_external/lib/config.php
index 9d8b312e77e..5dc6d06ae06 100644
--- a/apps/files_external/lib/config.php
+++ b/apps/files_external/lib/config.php
@@ -124,9 +124,10 @@ class OC_Mount_Config {
self::addStorageIdToConfig($data['user']);
$user = \OC::$server->getUserManager()->get($data['user']);
if (!$user) {
- \OC::$server->getLogger()->warning(
+ \OCP\Util::writeLog(
+ 'files_external',
'Cannot init external mount points for non-existant user "' . $data['user'] . '".',
- ['app' => 'files_external']
+ \OCP\Util::WARN
);
return;
}
@@ -160,9 +161,6 @@ class OC_Mount_Config {
// Load system mount points
$mountConfig = self::readData();
- $userObject = \OC::$server->getUserManager()->get($user);
- $groupManager = \OC::$server->getGroupManager();
-
// Global mount points (is this redundant?)
if (isset($mountConfig[self::MOUNT_TYPE_GLOBAL])) {
foreach ($mountConfig[self::MOUNT_TYPE_GLOBAL] as $mountPoint => $options) {
@@ -209,7 +207,7 @@ class OC_Mount_Config {
// Group mount points
if (isset($mountConfig[self::MOUNT_TYPE_GROUP])) {
foreach ($mountConfig[self::MOUNT_TYPE_GROUP] as $group => $mounts) {
- if ($groupManager->get($group)->inGroup($userObject)) {
+ if (\OC_Group::inGroup($user, $group)) {
foreach ($mounts as $mountPoint => $options) {
$mountPoint = self::setUserVars($user, $mountPoint);
foreach ($options as &$option) {
@@ -583,7 +581,7 @@ class OC_Mount_Config {
$result = self::getBackendStatus($class, $classOptions, $isPersonal);
if ($result === self::STATUS_SUCCESS && $isNew) {
- \OCP\Util::emitHook(
+ \OC_Hook::emit(
\OC\Files\Filesystem::CLASSNAME,
\OC\Files\Filesystem::signal_create_mount,
array(
@@ -629,7 +627,7 @@ class OC_Mount_Config {
}
}
self::writeData($isPersonal ? OCP\User::getUser() : null, $mountPoints);
- \OCP\Util::emitHook(
+ \OC_Hook::emit(
\OC\Files\Filesystem::CLASSNAME,
\OC\Files\Filesystem::signal_delete_mount,
array(
@@ -671,11 +669,10 @@ class OC_Mount_Config {
*/
public static function readData($user = null) {
if (isset($user)) {
- $jsonFile = \OC::$server->getUserManager()->get($user)->getHome() . '/mount.json';
+ $jsonFile = OC_User::getHome($user) . '/mount.json';
} else {
- $config = \OC::$server->getConfig();
- $datadir = $config->getSystemValue('datadirectory', \OC::$SERVERROOT . '/data/');
- $jsonFile = $config->getSystemValue('mount_file', $datadir . '/mount.json');
+ $datadir = \OC_Config::getValue('datadirectory', \OC::$SERVERROOT . '/data/');
+ $jsonFile = \OC_Config::getValue('mount_file', $datadir . '/mount.json');
}
if (is_file($jsonFile)) {
$mountPoints = json_decode(file_get_contents($jsonFile), true);
@@ -694,11 +691,10 @@ class OC_Mount_Config {
*/
public static function writeData($user, $data) {
if (isset($user)) {
- $file = \OC::$server->getUserManager()->get($user)->getHome() . '/mount.json';
+ $file = OC_User::getHome($user) . '/mount.json';
} else {
- $config = \OC::$server->getConfig();
- $datadir = $config->getSystemValue('datadirectory', \OC::$SERVERROOT . '/data/');
- $file = $config->getSystemValue('mount_file', $datadir . '/mount.json');
+ $datadir = \OC_Config::getValue('datadirectory', \OC::$SERVERROOT . '/data/');
+ $file = \OC_Config::getValue('mount_file', $datadir . '/mount.json');
}
foreach ($data as &$applicables) {
@@ -756,7 +752,7 @@ class OC_Mount_Config {
}
private static function generateDependencyMessage($dependencies) {
- $l = \OC::$server->getL10N('files_external');
+ $l = new \OC_L10N('files_external');
$dependencyMessage = '';
foreach ($dependencies as $module => $backends) {
$dependencyGroup = array();
@@ -793,7 +789,7 @@ class OC_Mount_Config {
* @param string $backend
* @return string
*/
- private static function getSingleDependencyMessage(\OCP\IL10N $l, $module, $backend) {
+ private static function getSingleDependencyMessage(OC_L10N $l, $module, $backend) {
switch (strtolower($module)) {
case 'curl':
return $l->t('<b>Note:</b> The cURL support in PHP is not enabled or installed. Mounting of %s is not possible. Please ask your system administrator to install it.', $backend);
diff --git a/apps/files_external/lib/dropbox.php b/apps/files_external/lib/dropbox.php
index afdf09a676b..78219f8f06e 100644
--- a/apps/files_external/lib/dropbox.php
+++ b/apps/files_external/lib/dropbox.php
@@ -243,7 +243,7 @@ class Dropbox extends \OC\Files\Storage\Common {
switch ($mode) {
case 'r':
case 'rb':
- $tmpFile = \OCP\Files::tmpFile();
+ $tmpFile = \OC_Helper::tmpFile();
try {
$data = $this->dropbox->getFile($path);
file_put_contents($tmpFile, $data);
@@ -269,7 +269,7 @@ class Dropbox extends \OC\Files\Storage\Common {
} else {
$ext = '';
}
- $tmpFile = \OCP\Files::tmpFile($ext);
+ $tmpFile = \OC_Helper::tmpFile($ext);
\OC\Files\Stream\Close::registerCallback($tmpFile, array($this, 'writeBack'));
if ($this->file_exists($path)) {
$source = $this->fopen($path, 'r');
diff --git a/apps/files_external/lib/google.php b/apps/files_external/lib/google.php
index b4cc9bb0eab..8199d97eacb 100644
--- a/apps/files_external/lib/google.php
+++ b/apps/files_external/lib/google.php
@@ -428,7 +428,7 @@ class Google extends \OC\Files\Storage\Common {
$request = new \Google_Http_Request($downloadUrl, 'GET', null, null);
$httpRequest = $this->client->getAuth()->authenticatedRequest($request);
if ($httpRequest->getResponseHttpCode() == 200) {
- $tmpFile = \OCP\Files::tmpFile($ext);
+ $tmpFile = \OC_Helper::tmpFile($ext);
$data = $httpRequest->getResponseBody();
file_put_contents($tmpFile, $data);
return fopen($tmpFile, $mode);
@@ -448,7 +448,7 @@ class Google extends \OC\Files\Storage\Common {
case 'x+':
case 'c':
case 'c+':
- $tmpFile = \OCP\Files::tmpFile($ext);
+ $tmpFile = \OC_Helper::tmpFile($ext);
\OC\Files\Stream\Close::registerCallback($tmpFile, array($this, 'writeBack'));
if ($this->file_exists($path)) {
$source = $this->fopen($path, 'rb');
diff --git a/apps/files_external/lib/swift.php b/apps/files_external/lib/swift.php
index 4104e97fbe6..50f0d40805a 100644
--- a/apps/files_external/lib/swift.php
+++ b/apps/files_external/lib/swift.php
@@ -310,7 +310,7 @@ class Swift extends \OC\Files\Storage\Common {
switch ($mode) {
case 'r':
case 'rb':
- $tmpFile = \OCP\Files::tmpFile();
+ $tmpFile = \OC_Helper::tmpFile();
self::$tmpFiles[$tmpFile] = $path;
try {
$object = $this->getContainer()->getObject($path);
@@ -348,7 +348,7 @@ class Swift extends \OC\Files\Storage\Common {
} else {
$ext = '';
}
- $tmpFile = \OCP\Files::tmpFile($ext);
+ $tmpFile = \OC_Helper::tmpFile($ext);
\OC\Files\Stream\Close::registerCallback($tmpFile, array($this, 'writeBack'));
if ($this->file_exists($path)) {
$source = $this->fopen($path, 'r');
diff --git a/apps/files_external/service/storagesservice.php b/apps/files_external/service/storagesservice.php
index 84ca8a4524d..930f994455e 100644
--- a/apps/files_external/service/storagesservice.php
+++ b/apps/files_external/service/storagesservice.php
@@ -306,7 +306,7 @@ abstract class StoragesService {
*/
protected function triggerApplicableHooks($signal, $mountPoint, $mountType, $applicableArray) {
foreach ($applicableArray as $applicable) {
- \OCP\Util::emitHook(
+ \OC_Hook::emit(
Filesystem::CLASSNAME,
$signal,
[
diff --git a/apps/files_external/templates/settings.php b/apps/files_external/templates/settings.php
index d5aba6fc80b..b886c2e1b1b 100644
--- a/apps/files_external/templates/settings.php
+++ b/apps/files_external/templates/settings.php
@@ -16,7 +16,7 @@
<tbody>
<?php $_['mounts'] = array_merge($_['mounts'], array('' => array('id' => ''))); ?>
<?php foreach ($_['mounts'] as $mount): ?>
- <tr <?php print_unescaped(isset($mount['mountpoint']) ? 'class="'.\OCP\Util::sanitizeHTML($mount['class']).'"' : 'id="addMountPoint"'); ?> data-id="<?php p($mount['id']) ?>">
+ <tr <?php print_unescaped(isset($mount['mountpoint']) ? 'class="'.OC_Util::sanitizeHTML($mount['class']).'"' : 'id="addMountPoint"'); ?> data-id="<?php p($mount['id']) ?>">
<td class="status">
<span></span>
</td>
diff --git a/apps/files_external/tests/mountconfig.php b/apps/files_external/tests/mountconfig.php
index f198b09c089..b76ba0a39a6 100644
--- a/apps/files_external/tests/mountconfig.php
+++ b/apps/files_external/tests/mountconfig.php
@@ -131,9 +131,6 @@ class Test_Mount_Config extends \Test\TestCase {
const TEST_GROUP2 = 'group2';
const TEST_GROUP2B = 'group2b';
- private $users = [];
- private $groups = [];
-
protected function setUp() {
parent::setUp();
@@ -150,43 +147,32 @@ class Test_Mount_Config extends \Test\TestCase {
)
);
- $userManager = \OC::$server->getUserManager();
- $groupManager = \OC::$server->getGroupManager();
-
- $this->users[self::TEST_USER1] = $userManager->createUser(
- self::TEST_USER1,
- self::TEST_USER1
- );
- $this->users[self::TEST_USER2] = $userManager->createUser(
- self::TEST_USER2,
- self::TEST_USER2
- );
+ \OC_User::createUser(self::TEST_USER1, self::TEST_USER1);
+ \OC_User::createUser(self::TEST_USER2, self::TEST_USER2);
- $this->groups[self::TEST_GROUP1] = $groupManager->createGroup(self::TEST_GROUP1);
- $this->groups[self::TEST_GROUP1B] = $groupManager->createGroup(self::TEST_GROUP1B);
- $this->groups[self::TEST_GROUP2] = $groupManager->createGroup(self::TEST_GROUP2);
- $this->groups[self::TEST_GROUP2B] = $groupManager->createGroup(self::TEST_GROUP2B);
+ \OC_Group::createGroup(self::TEST_GROUP1);
+ \OC_Group::createGroup(self::TEST_GROUP1B);
+ \OC_Group::addToGroup(self::TEST_USER1, self::TEST_GROUP1);
+ \OC_Group::addToGroup(self::TEST_USER1, self::TEST_GROUP1B);
+ \OC_Group::createGroup(self::TEST_GROUP2);
+ \OC_Group::createGroup(self::TEST_GROUP2B);
+ \OC_Group::addToGroup(self::TEST_USER2, self::TEST_GROUP2);
+ \OC_Group::addToGroup(self::TEST_USER2, self::TEST_GROUP2B);
- $this->groups[self::TEST_GROUP1]->addUser($this->users[self::TEST_USER1]);
- $this->groups[self::TEST_GROUP1B]->addUser($this->users[self::TEST_USER1]);
- $this->groups[self::TEST_GROUP2]->addUser($this->users[self::TEST_USER2]);
- $this->groups[self::TEST_GROUP2B]->addUser($this->users[self::TEST_USER2]);
-
- \OC::$server->getUserSession()->setUser($this->users[self::TEST_USER1]);
- $this->userHome = $this->users[self::TEST_USER1]->getHome();
+ \OC_User::setUserId(self::TEST_USER1);
+ $this->userHome = \OC_User::getHome(self::TEST_USER1);
@mkdir($this->userHome);
- $config = \OC::$server->getConfig();
- $this->dataDir = $config->getSystemValue(
+ $this->dataDir = \OC_Config::getValue(
'datadirectory',
\OC::$SERVERROOT . '/data/'
);
- $this->oldAllowedBackends = $config->getAppValue(
+ $this->oldAllowedBackends = OCP\Config::getAppValue(
'files_external',
'user_mounting_backends',
''
);
- $config->setAppValue(
+ OCP\Config::setAppValue(
'files_external',
'user_mounting_backends',
'Test_Mount_Config_Dummy_Storage'
@@ -200,19 +186,16 @@ class Test_Mount_Config extends \Test\TestCase {
Test_Mount_Config_Hook_Test::clear();
OC_Mount_Config::$skipTest = false;
- foreach ($this->users as $user) {
- $user->delete();
- }
- foreach ($this->groups as $group) {
- $group->delete();
- }
- $this->users = [];
- $this->groups = [];
+ \OC_User::deleteUser(self::TEST_USER2);
+ \OC_User::deleteUser(self::TEST_USER1);
+ \OC_Group::deleteGroup(self::TEST_GROUP1);
+ \OC_Group::deleteGroup(self::TEST_GROUP1B);
+ \OC_Group::deleteGroup(self::TEST_GROUP2);
+ \OC_Group::deleteGroup(self::TEST_GROUP2B);
@unlink($this->dataDir . '/mount.json');
- $config = \OC::$server->getConfig();
- $config->setAppValue(
+ OCP\Config::setAppValue(
'files_external',
'user_mounting_backends',
$this->oldAllowedBackends
@@ -795,7 +778,7 @@ class Test_Mount_Config extends \Test\TestCase {
);
// check mount points in the perspective of user $testUser
- \OC::$server->getUserSession()->setUser($this->users[$testUser]);
+ \OC_User::setUserId($testUser);
$mountPoints = OC_Mount_Config::getAbsoluteMountPoints($testUser);
if ($expectVisible) {
@@ -1133,7 +1116,7 @@ class Test_Mount_Config extends \Test\TestCase {
);
// Ensure other user can read mount points
- \OC::$server->getUserSession()->setUser($this->users[self::TEST_USER2]);
+ \OC_User::setUserId(self::TEST_USER2);
$mountPointsMe = OC_Mount_Config::getAbsoluteMountPoints(self::TEST_USER2);
$mountPointsOther = OC_Mount_Config::getAbsoluteMountPoints(self::TEST_USER1);
diff --git a/apps/files_sharing/ajax/external.php b/apps/files_sharing/ajax/external.php
index 7bef0c3197a..d26a64d3aec 100644
--- a/apps/files_sharing/ajax/external.php
+++ b/apps/files_sharing/ajax/external.php
@@ -56,71 +56,76 @@ $externalManager = new \OCA\Files_Sharing\External\Manager(
);
// check for ssl cert
-if (substr($remote, 0, 5) === 'https' and !OC_Util::getUrlContent($remote)) {
- \OCP\JSON::error(array('data' => array('message' => $l->t('Invalid or untrusted SSL certificate'))));
- exit;
-} else {
- $mount = $externalManager->addShare($remote, $token, $password, $name, $owner, true);
+if (substr($remote, 0, 5) === 'https') {
+ try {
+ \OC::$server->getHTTPClientService()->newClient()->get($remote)->getBody();
+ } catch (\Exception $e) {
+ \OCP\JSON::error(array('data' => array('message' => $l->t('Invalid or untrusted SSL certificate'))));
+ exit;
+ }
+}
+
+$mount = $externalManager->addShare($remote, $token, $password, $name, $owner, true);
- /**
- * @var \OCA\Files_Sharing\External\Storage $storage
- */
- $storage = $mount->getStorage();
+/**
+ * @var \OCA\Files_Sharing\External\Storage $storage
+ */
+$storage = $mount->getStorage();
+try {
+ // check if storage exists
+ $storage->checkStorageAvailability();
+} catch (\OCP\Files\StorageInvalidException $e) {
+ // note: checkStorageAvailability will already remove the invalid share
+ \OCP\Util::writeLog(
+ 'files_sharing',
+ 'Invalid remote storage: ' . get_class($e) . ': ' . $e->getMessage(),
+ \OCP\Util::DEBUG
+ );
+ \OCP\JSON::error(
+ array(
+ 'data' => array(
+ 'message' => $l->t('Could not authenticate to remote share, password might be wrong')
+ )
+ )
+ );
+ exit();
+} catch (\Exception $e) {
+ \OCP\Util::writeLog(
+ 'files_sharing',
+ 'Invalid remote storage: ' . get_class($e) . ': ' . $e->getMessage(),
+ \OCP\Util::DEBUG
+ );
+ $externalManager->removeShare($mount->getMountPoint());
+ \OCP\JSON::error(array('data' => array('message' => $l->t('Storage not valid'))));
+ exit();
+}
+$result = $storage->file_exists('');
+if ($result) {
try {
- // check if storage exists
- $storage->checkStorageAvailability();
+ $storage->getScanner()->scanAll();
+ \OCP\JSON::success();
} catch (\OCP\Files\StorageInvalidException $e) {
- // note: checkStorageAvailability will already remove the invalid share
\OCP\Util::writeLog(
'files_sharing',
'Invalid remote storage: ' . get_class($e) . ': ' . $e->getMessage(),
\OCP\Util::DEBUG
);
- \OCP\JSON::error(
- array(
- 'data' => array(
- 'message' => $l->t('Could not authenticate to remote share, password might be wrong')
- )
- )
- );
- exit();
+ \OCP\JSON::error(array('data' => array('message' => $l->t('Storage not valid'))));
} catch (\Exception $e) {
\OCP\Util::writeLog(
'files_sharing',
'Invalid remote storage: ' . get_class($e) . ': ' . $e->getMessage(),
\OCP\Util::DEBUG
);
- $externalManager->removeShare($mount->getMountPoint());
- \OCP\JSON::error(array('data' => array('message' => $l->t('Storage not valid'))));
- exit();
- }
- $result = $storage->file_exists('');
- if ($result) {
- try {
- $storage->getScanner()->scanAll();
- \OCP\JSON::success();
- } catch (\OCP\Files\StorageInvalidException $e) {
- \OCP\Util::writeLog(
- 'files_sharing',
- 'Invalid remote storage: ' . get_class($e) . ': ' . $e->getMessage(),
- \OCP\Util::DEBUG
- );
- \OCP\JSON::error(array('data' => array('message' => $l->t('Storage not valid'))));
- } catch (\Exception $e) {
- \OCP\Util::writeLog(
- 'files_sharing',
- 'Invalid remote storage: ' . get_class($e) . ': ' . $e->getMessage(),
- \OCP\Util::DEBUG
- );
- \OCP\JSON::error(array('data' => array('message' => $l->t('Couldn\'t add remote share'))));
- }
- } else {
- $externalManager->removeShare($mount->getMountPoint());
- \OCP\Util::writeLog(
- 'files_sharing',
- 'Couldn\'t add remote share',
- \OCP\Util::DEBUG
- );
\OCP\JSON::error(array('data' => array('message' => $l->t('Couldn\'t add remote share'))));
}
+} else {
+ $externalManager->removeShare($mount->getMountPoint());
+ \OCP\Util::writeLog(
+ 'files_sharing',
+ 'Couldn\'t add remote share',
+ \OCP\Util::DEBUG
+ );
+ \OCP\JSON::error(array('data' => array('message' => $l->t('Couldn\'t add remote share'))));
}
+
diff --git a/apps/files_sharing/ajax/publicpreview.php b/apps/files_sharing/ajax/publicpreview.php
index 99a5bdaa859..6ddd4786c2a 100644
--- a/apps/files_sharing/ajax/publicpreview.php
+++ b/apps/files_sharing/ajax/publicpreview.php
@@ -66,7 +66,7 @@ $path = $view->getPath($pathId);
if($path === null) {
\OC_Response::setStatus(\OC_Response::STATUS_NOT_FOUND);
- \OC_Log::write('core-preview', 'Could not resolve file for shared item', OC_Log::WARN);
+ \OCP\Util::writeLog('core-preview', 'Could not resolve file for shared item', \OCP\Util::WARN);
exit;
}
diff --git a/apps/files_sharing/ajax/shareinfo.php b/apps/files_sharing/ajax/shareinfo.php
index 3ea0fae8522..db6194d3f05 100644
--- a/apps/files_sharing/ajax/shareinfo.php
+++ b/apps/files_sharing/ajax/shareinfo.php
@@ -55,7 +55,7 @@ $path = $data['realPath'];
$isWritable = $linkItem['permissions'] & (\OCP\Constants::PERMISSION_UPDATE | \OCP\Constants::PERMISSION_CREATE);
if (!$isWritable) {
\OC\Files\Filesystem::addStorageWrapper('readonly', function ($mountPoint, $storage) {
- return new \OCA\Files_Sharing\ReadOnlyWrapper(array('storage' => $storage));
+ return new \OC\Files\Storage\Wrapper\PermissionsMask(array('storage' => $storage, 'mask' => \OCP\Constants::PERMISSION_READ + \OCP\Constants::PERMISSION_SHARE));
});
}
diff --git a/apps/files_sharing/api/local.php b/apps/files_sharing/api/local.php
index 84a789f26e4..2b2b475466f 100644
--- a/apps/files_sharing/api/local.php
+++ b/apps/files_sharing/api/local.php
@@ -69,7 +69,6 @@ class Local {
if (\OC::$server->getPreviewManager()->isMimeSupported($share['mimetype'])) {
$share['isPreviewAvailable'] = true;
}
- $share['icon'] = substr(\OC_Helper::mimetypeIcon($share['mimetype']), 0, -3) . 'svg';
}
if (!is_null($share['token'])) {
@@ -260,6 +259,7 @@ class Local {
return new \OC_OCS_Result(null, 400, "please specify a file or folder path");
}
$itemSource = self::getFileId($path);
+ $itemSourceName = $itemSource;
$itemType = self::getItemType($path);
if($itemSource === null) {
@@ -270,9 +270,10 @@ class Local {
$shareType = isset($_POST['shareType']) ? (int)$_POST['shareType'] : null;
switch($shareType) {
+ case \OCP\Share::SHARE_TYPE_REMOTE:
+ $shareWith = rtrim($shareWith, '/');
+ $itemSourceName = basename($path);
case \OCP\Share::SHARE_TYPE_USER:
- $permissions = isset($_POST['permissions']) ? (int)$_POST['permissions'] : 31;
- break;
case \OCP\Share::SHARE_TYPE_GROUP:
$permissions = isset($_POST['permissions']) ? (int)$_POST['permissions'] : 31;
break;
@@ -303,7 +304,8 @@ class Local {
$itemSource,
$shareType,
$shareWith,
- $permissions
+ $permissions,
+ $itemSourceName
);
} catch (HintException $e) {
return new \OC_OCS_Result(null, 400, $e->getHint());
diff --git a/apps/files_sharing/api/remote.php b/apps/files_sharing/api/remote.php
new file mode 100644
index 00000000000..f6cb0a29d8b
--- /dev/null
+++ b/apps/files_sharing/api/remote.php
@@ -0,0 +1,91 @@
+<?php
+/**
+ * @author Joas Schilling <nickvergessen@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * 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, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCA\Files_Sharing\API;
+
+use OC\Files\Filesystem;
+use OCA\Files_Sharing\External\Manager;
+
+class Remote {
+
+ /**
+ * Accept a remote share
+ *
+ * @param array $params contains the shareID 'id' which should be accepted
+ * @return \OC_OCS_Result
+ */
+ public static function getOpenShares($params) {
+ $externalManager = new Manager(
+ \OC::$server->getDatabaseConnection(),
+ Filesystem::getMountManager(),
+ Filesystem::getLoader(),
+ \OC::$server->getHTTPHelper(),
+ \OC_User::getUser()
+ );
+
+ return new \OC_OCS_Result($externalManager->getOpenShares());
+ }
+
+ /**
+ * Accept a remote share
+ *
+ * @param array $params contains the shareID 'id' which should be accepted
+ * @return \OC_OCS_Result
+ */
+ public static function acceptShare($params) {
+ $externalManager = new Manager(
+ \OC::$server->getDatabaseConnection(),
+ Filesystem::getMountManager(),
+ Filesystem::getLoader(),
+ \OC::$server->getHTTPHelper(),
+ \OC_User::getUser()
+ );
+
+ if ($externalManager->acceptShare($params['id'])) {
+ return new \OC_OCS_Result();
+ }
+
+ return new \OC_OCS_Result(null, 404, "wrong share ID, share doesn't exist.");
+ }
+
+ /**
+ * Decline a remote share
+ *
+ * @param array $params contains the shareID 'id' which should be declined
+ * @return \OC_OCS_Result
+ */
+ public static function declineShare($params) {
+ $externalManager = new Manager(
+ \OC::$server->getDatabaseConnection(),
+ Filesystem::getMountManager(),
+ Filesystem::getLoader(),
+ \OC::$server->getHTTPHelper(),
+ \OC_User::getUser()
+ );
+
+ if ($externalManager->declineShare($params['id'])) {
+ return new \OC_OCS_Result();
+ }
+
+ return new \OC_OCS_Result(null, 404, "wrong share ID, share doesn't exist.");
+ }
+
+}
diff --git a/apps/files_sharing/api/server2server.php b/apps/files_sharing/api/server2server.php
index 3ecdf65dc74..8bda0bb8749 100644
--- a/apps/files_sharing/api/server2server.php
+++ b/apps/files_sharing/api/server2server.php
@@ -22,6 +22,8 @@
namespace OCA\Files_Sharing\API;
+use OCA\Files_Sharing\Activity;
+
class Server2Server {
/**
@@ -69,8 +71,8 @@ class Server2Server {
$user = $owner . '@' . $this->cleanupRemote($remote);
\OC::$server->getActivityManager()->publishActivity(
- 'files_sharing', \OCA\Files_Sharing\Activity::SUBJECT_REMOTE_SHARE_RECEIVED, array($user), '', array(),
- '', '', $shareWith, \OCA\Files_Sharing\Activity::TYPE_REMOTE_SHARE, \OCA\Files_Sharing\Activity::PRIORITY_LOW);
+ Activity::FILES_SHARING_APP, Activity::SUBJECT_REMOTE_SHARE_RECEIVED, array($user, trim($name, '/')), '', array(),
+ '', '', $shareWith, Activity::TYPE_REMOTE_SHARE, Activity::PRIORITY_LOW);
return new \OC_OCS_Result();
} catch (\Exception $e) {
@@ -102,8 +104,8 @@ class Server2Server {
list($file, $link) = self::getFile($share['uid_owner'], $share['file_source']);
\OC::$server->getActivityManager()->publishActivity(
- 'files_sharing', \OCA\Files_Sharing\Activity::SUBJECT_REMOTE_SHARE_ACCEPTED, array($share['share_with'], basename($file)), '', array(),
- $file, $link, $share['uid_owner'], \OCA\Files_Sharing\Activity::TYPE_REMOTE_SHARE, \OCA\Files_Sharing\Activity::PRIORITY_LOW);
+ Activity::FILES_SHARING_APP, Activity::SUBJECT_REMOTE_SHARE_ACCEPTED, array($share['share_with'], basename($file)), '', array(),
+ $file, $link, $share['uid_owner'], Activity::TYPE_REMOTE_SHARE, Activity::PRIORITY_LOW);
}
return new \OC_OCS_Result();
@@ -133,8 +135,8 @@ class Server2Server {
list($file, $link) = $this->getFile($share['uid_owner'], $share['file_source']);
\OC::$server->getActivityManager()->publishActivity(
- 'files_sharing', \OCA\Files_Sharing\Activity::SUBJECT_REMOTE_SHARE_DECLINED, array($share['share_with'], basename($file)), '', array(),
- $file, $link, $share['uid_owner'], \OCA\Files_Sharing\Activity::TYPE_REMOTE_SHARE, \OCA\Files_Sharing\Activity::PRIORITY_LOW);
+ Activity::FILES_SHARING_APP, Activity::SUBJECT_REMOTE_SHARE_DECLINED, array($share['share_with'], basename($file)), '', array(),
+ $file, $link, $share['uid_owner'], Activity::TYPE_REMOTE_SHARE, Activity::PRIORITY_LOW);
}
return new \OC_OCS_Result();
@@ -170,9 +172,15 @@ class Server2Server {
$query = \OCP\DB::prepare('DELETE FROM `*PREFIX*share_external` WHERE `remote_id` = ? AND `share_token` = ?');
$query->execute(array($id, $token));
+ if ($share['accepted']) {
+ $path = trim($mountpoint, '/');
+ } else {
+ $path = trim($share['name'], '/');
+ }
+
\OC::$server->getActivityManager()->publishActivity(
- 'files_sharing', \OCA\Files_Sharing\Activity::SUBJECT_REMOTE_SHARE_UNSHARED, array($owner, $mountpoint), '', array(),
- '', '', $user, \OCA\Files_Sharing\Activity::TYPE_REMOTE_SHARE, \OCA\Files_Sharing\Activity::PRIORITY_MEDIUM);
+ Activity::FILES_SHARING_APP, Activity::SUBJECT_REMOTE_SHARE_UNSHARED, array($owner, $path), '', array(),
+ '', '', $user, Activity::TYPE_REMOTE_SHARE, Activity::PRIORITY_MEDIUM);
}
return new \OC_OCS_Result();
diff --git a/apps/files_sharing/appinfo/routes.php b/apps/files_sharing/appinfo/routes.php
index 2686abed0ae..21d21a83441 100644
--- a/apps/files_sharing/appinfo/routes.php
+++ b/apps/files_sharing/appinfo/routes.php
@@ -82,6 +82,21 @@ API::register('delete',
array('\OCA\Files_Sharing\API\Local', 'deleteShare'),
'files_sharing');
+API::register('get',
+ '/apps/files_sharing/api/v1/remote_shares',
+ array('\OCA\Files_Sharing\API\Remote', 'getOpenShares'),
+ 'files_sharing');
+
+API::register('post',
+ '/apps/files_sharing/api/v1/remote_shares/{id}',
+ array('\OCA\Files_Sharing\API\Remote', 'acceptShare'),
+ 'files_sharing');
+
+API::register('delete',
+ '/apps/files_sharing/api/v1/remote_shares/{id}',
+ array('\OCA\Files_Sharing\API\Remote', 'declineShare'),
+ 'files_sharing');
+
// Register with the capabilities API
API::register('get',
'/cloud/capabilities',
diff --git a/apps/files_sharing/appinfo/version b/apps/files_sharing/appinfo/version
index ee6cdce3c29..b6160487433 100644
--- a/apps/files_sharing/appinfo/version
+++ b/apps/files_sharing/appinfo/version
@@ -1 +1 @@
-0.6.1
+0.6.2
diff --git a/apps/files_sharing/css/public.css b/apps/files_sharing/css/public.css
index a649ecfe885..a5cf57d0ac5 100644
--- a/apps/files_sharing/css/public.css
+++ b/apps/files_sharing/css/public.css
@@ -72,7 +72,7 @@ thead {
}
/* keep long file names in one line to not overflow download button on mobile */
-.directDownload #download {
+.directDownload #downloadFile {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
diff --git a/apps/files_sharing/js/share.js b/apps/files_sharing/js/share.js
index 11c3170c2f0..e7823454c53 100644
--- a/apps/files_sharing/js/share.js
+++ b/apps/files_sharing/js/share.js
@@ -25,6 +25,10 @@
* @param {OCA.Files.FileList} fileList file list to be extended
*/
attach: function(fileList) {
+ // core sharing is disabled/not loaded
+ if (!OC.Share) {
+ return;
+ }
if (fileList.id === 'trashbin' || fileList.id === 'files.public') {
return;
}
@@ -151,7 +155,7 @@
var permissions = $tr.data('permissions');
var hasLink = !!(shareStatus && shareStatus.link);
OC.Share.markFileAsShared($tr, true, hasLink);
- if ((permissions & OC.PERMISSION_SHARE) === 0) {
+ if ((permissions & OC.PERMISSION_SHARE) === 0 && $tr.attr('data-share-owner')) {
// if no share action exists because the admin disabled sharing for this user
// we create a share notification action to inform the user about files
// shared with him otherwise we just update the existing share action.
diff --git a/apps/files_sharing/js/sharedfilelist.js b/apps/files_sharing/js/sharedfilelist.js
index ca187940a08..98dbd4c6702 100644
--- a/apps/files_sharing/js/sharedfilelist.js
+++ b/apps/files_sharing/js/sharedfilelist.js
@@ -176,7 +176,7 @@
.map(function(share) {
var file = {
id: share.file_source,
- icon: share.icon,
+ icon: OC.MimeType.getIconUrl(share.mimetype),
mimetype: share.mimetype
};
if (share.item_type === 'folder') {
diff --git a/apps/files_sharing/l10n/da.js b/apps/files_sharing/l10n/da.js
index a31e6363f25..d066f010f53 100644
--- a/apps/files_sharing/l10n/da.js
+++ b/apps/files_sharing/l10n/da.js
@@ -40,6 +40,8 @@ OC.L10N.register(
"%2$s shared %1$s with you" : "%2$s delt %1$s med dig",
"You shared %1$s via link" : "Du delte %1$s via link",
"Shares" : "Delt",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Del med mig gennem min #ownCloud Federated Cloud ID, se %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Del med mig gennem min #ownCloud Federated Cloud ID",
"This share is password-protected" : "Delingen er beskyttet af kodeord",
"The password is wrong. Try again." : "Kodeordet er forkert. Prøv igen.",
"Password" : "Kodeord",
@@ -61,8 +63,10 @@ OC.L10N.register(
"Allow users on this server to send shares to other servers" : "Tillad brugere på denne server, at sende delinger til andre servere",
"Allow users on this server to receive shares from other servers" : "Tillad brugere på denne server, at modtage delinger fra andre servere",
"Federated Cloud" : "Federated Cloud",
+ "Your Federated Cloud ID:" : "Din Federated Cloud ID:",
"Share it:" : "Del:",
"Add it to your website:" : "Tilføj den til din hjemmeside:",
+ "Share with me via ownCloud" : "Del med mig gennem ownCloud",
"HTML Code:" : "HTMLkode:"
},
"nplurals=2; plural=(n != 1);");
diff --git a/apps/files_sharing/l10n/da.json b/apps/files_sharing/l10n/da.json
index b91fbf21eb0..7f4ac9290d0 100644
--- a/apps/files_sharing/l10n/da.json
+++ b/apps/files_sharing/l10n/da.json
@@ -38,6 +38,8 @@
"%2$s shared %1$s with you" : "%2$s delt %1$s med dig",
"You shared %1$s via link" : "Du delte %1$s via link",
"Shares" : "Delt",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Del med mig gennem min #ownCloud Federated Cloud ID, se %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Del med mig gennem min #ownCloud Federated Cloud ID",
"This share is password-protected" : "Delingen er beskyttet af kodeord",
"The password is wrong. Try again." : "Kodeordet er forkert. Prøv igen.",
"Password" : "Kodeord",
@@ -59,8 +61,10 @@
"Allow users on this server to send shares to other servers" : "Tillad brugere på denne server, at sende delinger til andre servere",
"Allow users on this server to receive shares from other servers" : "Tillad brugere på denne server, at modtage delinger fra andre servere",
"Federated Cloud" : "Federated Cloud",
+ "Your Federated Cloud ID:" : "Din Federated Cloud ID:",
"Share it:" : "Del:",
"Add it to your website:" : "Tilføj den til din hjemmeside:",
+ "Share with me via ownCloud" : "Del med mig gennem ownCloud",
"HTML Code:" : "HTMLkode:"
},"pluralForm" :"nplurals=2; plural=(n != 1);"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/es.js b/apps/files_sharing/l10n/es.js
index e6f7c5e6caf..a7dd3ca5705 100644
--- a/apps/files_sharing/l10n/es.js
+++ b/apps/files_sharing/l10n/es.js
@@ -29,6 +29,7 @@ OC.L10N.register(
"A file or folder has been <strong>shared</strong>" : "Se ha <strong>compartido</strong> un archivo o carpeta",
"A file or folder was shared from <strong>another server</strong>" : "Se ha compartido un archivo o carpeta desde <strong>otro servidor</strong>",
"A public shared file or folder was <strong>downloaded</strong>" : "Ha sido <strong>descargado</strong> un archivo (o carpeta) compartido públicamente",
+ "You received a new remote share %2$s from %1$s" : "Recibió un nuevo recurso compartido remoto %2$s de %1$s",
"You received a new remote share from %s" : "Ha recibido un nuevo recurso compartido remoto de %s",
"%1$s accepted remote share %2$s" : "%1$s aceptó el recurso compartido remoto %2$s",
"%1$s declined remote share %2$s" : "%1$s ha rechazado el recurso compartido remoto %2$s",
diff --git a/apps/files_sharing/l10n/es.json b/apps/files_sharing/l10n/es.json
index ece130edb0e..b79640abc08 100644
--- a/apps/files_sharing/l10n/es.json
+++ b/apps/files_sharing/l10n/es.json
@@ -27,6 +27,7 @@
"A file or folder has been <strong>shared</strong>" : "Se ha <strong>compartido</strong> un archivo o carpeta",
"A file or folder was shared from <strong>another server</strong>" : "Se ha compartido un archivo o carpeta desde <strong>otro servidor</strong>",
"A public shared file or folder was <strong>downloaded</strong>" : "Ha sido <strong>descargado</strong> un archivo (o carpeta) compartido públicamente",
+ "You received a new remote share %2$s from %1$s" : "Recibió un nuevo recurso compartido remoto %2$s de %1$s",
"You received a new remote share from %s" : "Ha recibido un nuevo recurso compartido remoto de %s",
"%1$s accepted remote share %2$s" : "%1$s aceptó el recurso compartido remoto %2$s",
"%1$s declined remote share %2$s" : "%1$s ha rechazado el recurso compartido remoto %2$s",
diff --git a/apps/files_sharing/l10n/fi_FI.js b/apps/files_sharing/l10n/fi_FI.js
index 223660dec0c..0e1beda5afa 100644
--- a/apps/files_sharing/l10n/fi_FI.js
+++ b/apps/files_sharing/l10n/fi_FI.js
@@ -29,6 +29,7 @@ OC.L10N.register(
"A file or folder has been <strong>shared</strong>" : "Tiedosto tai kansio on <strong>jaettu</strong>",
"A file or folder was shared from <strong>another server</strong>" : "Tiedosto tai kansio jaettiin <strong>toiselta palvelimelta</strong>",
"A public shared file or folder was <strong>downloaded</strong>" : "Julkisesti jaettu tiedosto tai kansio <strong>ladattiin</strong>",
+ "You received a new remote share %2$s from %1$s" : "Vastaanotit uuden etäjaon %2$s käyttäjältä %1$s",
"You received a new remote share from %s" : "Vastaanotit uuden etäjaon käyttäjältä %s",
"%1$s accepted remote share %2$s" : "%1$s hyväksyi etäjaon %2$s",
"%1$s declined remote share %2$s" : "%1$s kieltäytyi etäjaosta %2$s",
diff --git a/apps/files_sharing/l10n/fi_FI.json b/apps/files_sharing/l10n/fi_FI.json
index b70098d049e..5f87c38f32e 100644
--- a/apps/files_sharing/l10n/fi_FI.json
+++ b/apps/files_sharing/l10n/fi_FI.json
@@ -27,6 +27,7 @@
"A file or folder has been <strong>shared</strong>" : "Tiedosto tai kansio on <strong>jaettu</strong>",
"A file or folder was shared from <strong>another server</strong>" : "Tiedosto tai kansio jaettiin <strong>toiselta palvelimelta</strong>",
"A public shared file or folder was <strong>downloaded</strong>" : "Julkisesti jaettu tiedosto tai kansio <strong>ladattiin</strong>",
+ "You received a new remote share %2$s from %1$s" : "Vastaanotit uuden etäjaon %2$s käyttäjältä %1$s",
"You received a new remote share from %s" : "Vastaanotit uuden etäjaon käyttäjältä %s",
"%1$s accepted remote share %2$s" : "%1$s hyväksyi etäjaon %2$s",
"%1$s declined remote share %2$s" : "%1$s kieltäytyi etäjaosta %2$s",
diff --git a/apps/files_sharing/l10n/fr.js b/apps/files_sharing/l10n/fr.js
index b866739e148..ca10ca211d1 100644
--- a/apps/files_sharing/l10n/fr.js
+++ b/apps/files_sharing/l10n/fr.js
@@ -29,6 +29,7 @@ OC.L10N.register(
"A file or folder has been <strong>shared</strong>" : "Un fichier ou un répertoire a été <strong>partagé</strong>",
"A file or folder was shared from <strong>another server</strong>" : "Un fichier ou un répertoire a été partagé depuis <strong>un autre serveur</strong>",
"A public shared file or folder was <strong>downloaded</strong>" : "Un fichier ou un répertoire partagé publiquement a été <strong>téléchargé</strong>",
+ "You received a new remote share %2$s from %1$s" : "L'utilisateur %1$s a partagé la ressource %2$s avec vous.",
"You received a new remote share from %s" : "Vous avez reçu un partage distant de %s",
"%1$s accepted remote share %2$s" : "%1$s a accepté le partage distant %2$s",
"%1$s declined remote share %2$s" : "%1$s a refusé le partage distant %2$s",
diff --git a/apps/files_sharing/l10n/fr.json b/apps/files_sharing/l10n/fr.json
index b4592edcdcc..ed8b166729a 100644
--- a/apps/files_sharing/l10n/fr.json
+++ b/apps/files_sharing/l10n/fr.json
@@ -27,6 +27,7 @@
"A file or folder has been <strong>shared</strong>" : "Un fichier ou un répertoire a été <strong>partagé</strong>",
"A file or folder was shared from <strong>another server</strong>" : "Un fichier ou un répertoire a été partagé depuis <strong>un autre serveur</strong>",
"A public shared file or folder was <strong>downloaded</strong>" : "Un fichier ou un répertoire partagé publiquement a été <strong>téléchargé</strong>",
+ "You received a new remote share %2$s from %1$s" : "L'utilisateur %1$s a partagé la ressource %2$s avec vous.",
"You received a new remote share from %s" : "Vous avez reçu un partage distant de %s",
"%1$s accepted remote share %2$s" : "%1$s a accepté le partage distant %2$s",
"%1$s declined remote share %2$s" : "%1$s a refusé le partage distant %2$s",
diff --git a/apps/files_sharing/l10n/gl.js b/apps/files_sharing/l10n/gl.js
index 1a5e1d10e77..390befe6ffe 100644
--- a/apps/files_sharing/l10n/gl.js
+++ b/apps/files_sharing/l10n/gl.js
@@ -29,6 +29,7 @@ OC.L10N.register(
"A file or folder has been <strong>shared</strong>" : "<strong>Compartiuse</strong> un ficheiro ou cartafol",
"A file or folder was shared from <strong>another server</strong>" : "Compartiuse un ficheiro ou cartafol desde <strong>outro servidor</strong>",
"A public shared file or folder was <strong>downloaded</strong>" : "Foi <strong>descargado</strong> un ficheiro ou cartafol público",
+ "You received a new remote share %2$s from %1$s" : "Recibiu unha compartición remota %2$s de %1$s",
"You received a new remote share from %s" : "Recibiu unha compartición remota de %s",
"%1$s accepted remote share %2$s" : "%1$s comparticións remotas aceptadas %2$s",
"%1$s declined remote share %2$s" : "%1$s comparticións remotas declinadas %2$s",
diff --git a/apps/files_sharing/l10n/gl.json b/apps/files_sharing/l10n/gl.json
index 25532580e78..b00e3d621b0 100644
--- a/apps/files_sharing/l10n/gl.json
+++ b/apps/files_sharing/l10n/gl.json
@@ -27,6 +27,7 @@
"A file or folder has been <strong>shared</strong>" : "<strong>Compartiuse</strong> un ficheiro ou cartafol",
"A file or folder was shared from <strong>another server</strong>" : "Compartiuse un ficheiro ou cartafol desde <strong>outro servidor</strong>",
"A public shared file or folder was <strong>downloaded</strong>" : "Foi <strong>descargado</strong> un ficheiro ou cartafol público",
+ "You received a new remote share %2$s from %1$s" : "Recibiu unha compartición remota %2$s de %1$s",
"You received a new remote share from %s" : "Recibiu unha compartición remota de %s",
"%1$s accepted remote share %2$s" : "%1$s comparticións remotas aceptadas %2$s",
"%1$s declined remote share %2$s" : "%1$s comparticións remotas declinadas %2$s",
diff --git a/apps/files_sharing/l10n/id.js b/apps/files_sharing/l10n/id.js
index fd8b3dd810e..6322747c9c1 100644
--- a/apps/files_sharing/l10n/id.js
+++ b/apps/files_sharing/l10n/id.js
@@ -21,6 +21,7 @@ OC.L10N.register(
"Remote share password" : "Sandi berbagi remote",
"Cancel" : "Batal",
"Add remote share" : "Tambah berbagi remote",
+ "You can upload into this folder" : "Anda dapat mengunggah kedalam folder ini",
"No ownCloud installation (7 or higher) found at {remote}" : "Tidak ditemukan instalasi ownCloud (7 atau lebih tinggi) pada {remote}",
"Invalid ownCloud url" : "URL ownCloud tidak sah",
"Share" : "Bagikan",
@@ -39,6 +40,8 @@ OC.L10N.register(
"%2$s shared %1$s with you" : "%2$s membagikan %1$s dengan Anda",
"You shared %1$s via link" : "Anda membagikan %1$s via tautan",
"Shares" : "Dibagikan",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Dibagikan pada saya melalui #ownCloud Federated Cloud ID saya, lihat %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Dibagikan pada saya melalui #ownCloud Federated Cloud ID saya",
"This share is password-protected" : "Berbagi ini dilindungi sandi",
"The password is wrong. Try again." : "Sandi salah. Coba lagi",
"Password" : "Sandi",
@@ -58,6 +61,12 @@ OC.L10N.register(
"Federated Cloud Sharing" : "Federated Cloud Sharing",
"Open documentation" : "Buka dokumentasi",
"Allow users on this server to send shares to other servers" : "Izinkan para pengguna di server ini untuk mengirimkan berbagi ke server lainnya.",
- "Allow users on this server to receive shares from other servers" : "Izinkan para pengguna di server ini untuk menerima berbagi ke server lainnya."
+ "Allow users on this server to receive shares from other servers" : "Izinkan para pengguna di server ini untuk menerima berbagi ke server lainnya.",
+ "Federated Cloud" : "Federated Cloud",
+ "Your Federated Cloud ID:" : "Federated Cloud ID Anda:",
+ "Share it:" : "Bagikan:",
+ "Add it to your website:" : "Tambahkan ke situs web Anda:",
+ "Share with me via ownCloud" : "Dibagikan pada saya via ownCloud",
+ "HTML Code:" : "Kode HTML:"
},
"nplurals=1; plural=0;");
diff --git a/apps/files_sharing/l10n/id.json b/apps/files_sharing/l10n/id.json
index e82b6966d24..ed1a6fb7bca 100644
--- a/apps/files_sharing/l10n/id.json
+++ b/apps/files_sharing/l10n/id.json
@@ -19,6 +19,7 @@
"Remote share password" : "Sandi berbagi remote",
"Cancel" : "Batal",
"Add remote share" : "Tambah berbagi remote",
+ "You can upload into this folder" : "Anda dapat mengunggah kedalam folder ini",
"No ownCloud installation (7 or higher) found at {remote}" : "Tidak ditemukan instalasi ownCloud (7 atau lebih tinggi) pada {remote}",
"Invalid ownCloud url" : "URL ownCloud tidak sah",
"Share" : "Bagikan",
@@ -37,6 +38,8 @@
"%2$s shared %1$s with you" : "%2$s membagikan %1$s dengan Anda",
"You shared %1$s via link" : "Anda membagikan %1$s via tautan",
"Shares" : "Dibagikan",
+ "Share with me through my #ownCloud Federated Cloud ID, see %s" : "Dibagikan pada saya melalui #ownCloud Federated Cloud ID saya, lihat %s",
+ "Share with me through my #ownCloud Federated Cloud ID" : "Dibagikan pada saya melalui #ownCloud Federated Cloud ID saya",
"This share is password-protected" : "Berbagi ini dilindungi sandi",
"The password is wrong. Try again." : "Sandi salah. Coba lagi",
"Password" : "Sandi",
@@ -56,6 +59,12 @@
"Federated Cloud Sharing" : "Federated Cloud Sharing",
"Open documentation" : "Buka dokumentasi",
"Allow users on this server to send shares to other servers" : "Izinkan para pengguna di server ini untuk mengirimkan berbagi ke server lainnya.",
- "Allow users on this server to receive shares from other servers" : "Izinkan para pengguna di server ini untuk menerima berbagi ke server lainnya."
+ "Allow users on this server to receive shares from other servers" : "Izinkan para pengguna di server ini untuk menerima berbagi ke server lainnya.",
+ "Federated Cloud" : "Federated Cloud",
+ "Your Federated Cloud ID:" : "Federated Cloud ID Anda:",
+ "Share it:" : "Bagikan:",
+ "Add it to your website:" : "Tambahkan ke situs web Anda:",
+ "Share with me via ownCloud" : "Dibagikan pada saya via ownCloud",
+ "HTML Code:" : "Kode HTML:"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/ja.js b/apps/files_sharing/l10n/ja.js
index dde011c8b4d..bc81dc8dbd4 100644
--- a/apps/files_sharing/l10n/ja.js
+++ b/apps/files_sharing/l10n/ja.js
@@ -29,6 +29,7 @@ OC.L10N.register(
"A file or folder has been <strong>shared</strong>" : "ファイルまたはフォルダーを<strong>共有</strong>したとき",
"A file or folder was shared from <strong>another server</strong>" : "ファイルまたはフォルダーが<strong>他のサーバー</strong>から共有されたとき",
"A public shared file or folder was <strong>downloaded</strong>" : "公開共有ファイルまたはフォルダーが<strong>ダウンロードされた</strong>とき",
+ "You received a new remote share %2$s from %1$s" : "%1$s から新しいリモート共有のリクエスト %2$s を受け取りました。",
"You received a new remote share from %s" : "%sからリモート共有のリクエストは\n届きました。",
"%1$s accepted remote share %2$s" : "%1$s は %2$s のリモート共有を承認しました。",
"%1$s declined remote share %2$s" : "%1$s は %2$s のリモート共有を拒否しました。",
@@ -59,6 +60,7 @@ OC.L10N.register(
"Federated Cloud Sharing" : "統合されたクラウド共有",
"Open documentation" : "ドキュメントを開く",
"Allow users on this server to send shares to other servers" : "ユーザーがこのサーバーから他のサーバーに共有することを許可する",
- "Allow users on this server to receive shares from other servers" : "ユーザーが他のサーバーからこのサーバーに共有することを許可する"
+ "Allow users on this server to receive shares from other servers" : "ユーザーが他のサーバーからこのサーバーに共有することを許可する",
+ "HTML Code:" : "HTMLコード:"
},
"nplurals=1; plural=0;");
diff --git a/apps/files_sharing/l10n/ja.json b/apps/files_sharing/l10n/ja.json
index 76d8d8e8968..9e9018b0ca5 100644
--- a/apps/files_sharing/l10n/ja.json
+++ b/apps/files_sharing/l10n/ja.json
@@ -27,6 +27,7 @@
"A file or folder has been <strong>shared</strong>" : "ファイルまたはフォルダーを<strong>共有</strong>したとき",
"A file or folder was shared from <strong>another server</strong>" : "ファイルまたはフォルダーが<strong>他のサーバー</strong>から共有されたとき",
"A public shared file or folder was <strong>downloaded</strong>" : "公開共有ファイルまたはフォルダーが<strong>ダウンロードされた</strong>とき",
+ "You received a new remote share %2$s from %1$s" : "%1$s から新しいリモート共有のリクエスト %2$s を受け取りました。",
"You received a new remote share from %s" : "%sからリモート共有のリクエストは\n届きました。",
"%1$s accepted remote share %2$s" : "%1$s は %2$s のリモート共有を承認しました。",
"%1$s declined remote share %2$s" : "%1$s は %2$s のリモート共有を拒否しました。",
@@ -57,6 +58,7 @@
"Federated Cloud Sharing" : "統合されたクラウド共有",
"Open documentation" : "ドキュメントを開く",
"Allow users on this server to send shares to other servers" : "ユーザーがこのサーバーから他のサーバーに共有することを許可する",
- "Allow users on this server to receive shares from other servers" : "ユーザーが他のサーバーからこのサーバーに共有することを許可する"
+ "Allow users on this server to receive shares from other servers" : "ユーザーが他のサーバーからこのサーバーに共有することを許可する",
+ "HTML Code:" : "HTMLコード:"
},"pluralForm" :"nplurals=1; plural=0;"
} \ No newline at end of file
diff --git a/apps/files_sharing/l10n/nl.js b/apps/files_sharing/l10n/nl.js
index 91329d6236f..b2dc1f1deab 100644
--- a/apps/files_sharing/l10n/nl.js
+++ b/apps/files_sharing/l10n/nl.js
@@ -29,6 +29,7 @@ OC.L10N.register(
"A file or folder has been <strong>shared</strong>" : "Een bestand of map is <strong>gedeeld</strong>",
"A file or folder was shared from <strong>another server</strong>" : "Een bestand of map werd gedeeld vanaf <strong>een andere server</strong>",
"A public shared file or folder was <strong>downloaded</strong>" : "Een openbaar gedeeld bestand of map werd <strong>gedownloaded</strong>",
+ "You received a new remote share %2$s from %1$s" : "U ontving een nieuwe externe share %2$s van %1$s",
"You received a new remote share from %s" : "U ontving een nieuwe externe share van %s",
"%1$s accepted remote share %2$s" : "%1$s accepteerde externe share %2$s",
"%1$s declined remote share %2$s" : "%1$s weigerde externe share %2$s",
diff --git a/apps/files_sharing/l10n/nl.json b/apps/files_sharing/l10n/nl.json
index 298d0b24380..e4cf032aad2 100644
--- a/apps/files_sharing/l10n/nl.json
+++ b/apps/files_sharing/l10n/nl.json
@@ -27,6 +27,7 @@
"A file or folder has been <strong>shared</strong>" : "Een bestand of map is <strong>gedeeld</strong>",
"A file or folder was shared from <strong>another server</strong>" : "Een bestand of map werd gedeeld vanaf <strong>een andere server</strong>",
"A public shared file or folder was <strong>downloaded</strong>" : "Een openbaar gedeeld bestand of map werd <strong>gedownloaded</strong>",
+ "You received a new remote share %2$s from %1$s" : "U ontving een nieuwe externe share %2$s van %1$s",
"You received a new remote share from %s" : "U ontving een nieuwe externe share van %s",
"%1$s accepted remote share %2$s" : "%1$s accepteerde externe share %2$s",
"%1$s declined remote share %2$s" : "%1$s weigerde externe share %2$s",
diff --git a/apps/files_sharing/l10n/pt_BR.js b/apps/files_sharing/l10n/pt_BR.js
index af80d4b380c..06ab247fc34 100644
--- a/apps/files_sharing/l10n/pt_BR.js
+++ b/apps/files_sharing/l10n/pt_BR.js
@@ -29,6 +29,7 @@ OC.L10N.register(
"A file or folder has been <strong>shared</strong>" : "Um arquivo ou pasta foi <strong>compartilhado</strong> ",
"A file or folder was shared from <strong>another server</strong>" : "Um arquivo ou pasta foi compartilhada a partir de <strong>outro servidor</strong>",
"A public shared file or folder was <strong>downloaded</strong>" : "Um arquivo ou pasta compartilhada publicamente foi <strong>baixado</strong>",
+ "You received a new remote share %2$s from %1$s" : "Você recebeu um novo conpartilhamento remoto %2$s de %1$s",
"You received a new remote share from %s" : "Você recebeu um novo compartilhamento remoto de %s",
"%1$s accepted remote share %2$s" : "%1$s aceitou o compartilhamento remoto %2$s",
"%1$s declined remote share %2$s" : "%1$s declinou o compartilhamento remoto %2$s",
diff --git a/apps/files_sharing/l10n/pt_BR.json b/apps/files_sharing/l10n/pt_BR.json
index cd6e4492f51..76865b34188 100644
--- a/apps/files_sharing/l10n/pt_BR.json
+++ b/apps/files_sharing/l10n/pt_BR.json
@@ -27,6 +27,7 @@
"A file or folder has been <strong>shared</strong>" : "Um arquivo ou pasta foi <strong>compartilhado</strong> ",
"A file or folder was shared from <strong>another server</strong>" : "Um arquivo ou pasta foi compartilhada a partir de <strong>outro servidor</strong>",
"A public shared file or folder was <strong>downloaded</strong>" : "Um arquivo ou pasta compartilhada publicamente foi <strong>baixado</strong>",
+ "You received a new remote share %2$s from %1$s" : "Você recebeu um novo conpartilhamento remoto %2$s de %1$s",
"You received a new remote share from %s" : "Você recebeu um novo compartilhamento remoto de %s",
"%1$s accepted remote share %2$s" : "%1$s aceitou o compartilhamento remoto %2$s",
"%1$s declined remote share %2$s" : "%1$s declinou o compartilhamento remoto %2$s",
diff --git a/apps/files_sharing/lib/activity.php b/apps/files_sharing/lib/activity.php
index a21f57235c9..e531674ddc2 100644
--- a/apps/files_sharing/lib/activity.php
+++ b/apps/files_sharing/lib/activity.php
@@ -150,6 +150,10 @@ class Activity implements IExtension {
if ($app === self::FILES_SHARING_APP) {
switch ($text) {
case self::SUBJECT_REMOTE_SHARE_RECEIVED:
+ if (sizeof($params) === 2) {
+ // New activity ownCloud 8.2+
+ return (string) $l->t('You received a new remote share %2$s from %1$s', $params);
+ }
return (string) $l->t('You received a new remote share from %s', $params);
case self::SUBJECT_REMOTE_SHARE_ACCEPTED:
return (string) $l->t('%1$s accepted remote share %2$s', $params);
@@ -190,14 +194,15 @@ class Activity implements IExtension {
if ($app === self::FILES_SHARING_APP) {
switch ($text) {
case self::SUBJECT_REMOTE_SHARE_RECEIVED:
+ case self::SUBJECT_REMOTE_SHARE_UNSHARED:
return array(
- 0 => '',// We can not use 'username' since the user is in a different ownCloud
+ 0 => 'federated_cloud_id',
+ //1 => 'file', in theory its a file, but it does not exist yet/anymore
);
case self::SUBJECT_REMOTE_SHARE_ACCEPTED:
case self::SUBJECT_REMOTE_SHARE_DECLINED:
- case self::SUBJECT_REMOTE_SHARE_UNSHARED:
return array(
- 0 => '',// We can not use 'username' since the user is in a different ownCloud
+ 0 => 'federated_cloud_id',
1 => 'file',
);
case self::SUBJECT_PUBLIC_SHARED_FOLDER_DOWNLOADED:
@@ -214,7 +219,7 @@ class Activity implements IExtension {
case self::SUBJECT_SHARED_GROUP_SELF:
return [
0 => 'file',
- //1 => 'group', Group does not exist yet
+ 1 => 'group',
];
}
}
@@ -230,7 +235,7 @@ class Activity implements IExtension {
* @return integer|false
*/
public function getGroupParameter($activity) {
- if ($activity['app'] === 'files') {
+ if ($activity['app'] === self::FILES_SHARING_APP) {
switch ($activity['subject']) {
case self::SUBJECT_SHARED_LINK_SELF:
case self::SUBJECT_SHARED_WITH_BY:
diff --git a/apps/files_sharing/lib/external/manager.php b/apps/files_sharing/lib/external/manager.php
index 0246e2d9c80..67a26c096c2 100644
--- a/apps/files_sharing/lib/external/manager.php
+++ b/apps/files_sharing/lib/external/manager.php
@@ -186,6 +186,7 @@ class Manager {
* accept server-to-server share
*
* @param int $id
+ * @return bool True if the share could be accepted, false otherwise
*/
public function acceptShare($id) {
@@ -204,13 +205,18 @@ class Manager {
WHERE `id` = ? AND `user` = ?');
$acceptShare->execute(array(1, $mountPoint, $hash, $id, $this->uid));
$this->sendFeedbackToRemote($share['remote'], $share['share_token'], $share['remote_id'], 'accept');
+
+ return true;
}
+
+ return false;
}
/**
* decline server-to-server share
*
* @param int $id
+ * @return bool True if the share could be declined, false otherwise
*/
public function declineShare($id) {
@@ -221,7 +227,11 @@ class Manager {
DELETE FROM `*PREFIX*share_external` WHERE `id` = ? AND `user` = ?');
$removeShare->execute(array($id, $this->uid));
$this->sendFeedbackToRemote($share['remote'], $share['share_token'], $share['remote_id'], 'decline');
+
+ return true;
}
+
+ return false;
}
/**
diff --git a/apps/files_sharing/lib/external/scanner.php b/apps/files_sharing/lib/external/scanner.php
index 06708452c73..60eb7c8dacd 100644
--- a/apps/files_sharing/lib/external/scanner.php
+++ b/apps/files_sharing/lib/external/scanner.php
@@ -49,7 +49,6 @@ class Scanner extends \OC\Files\Cache\Scanner {
* @param int $parentId
* @param array | null $cacheData existing data in the cache for the file to be scanned
* @param bool $lock set to false to disable getting an additional read lock during scanning
- * @param array | null $cacheData existing data in the cache for the file to be scanned
* @return array an array of metadata of the scanned file
*/
public function scanFile($file, $reuseExisting = 0, $parentId = -1, $cacheData = null, $lock = true) {
diff --git a/apps/files_sharing/lib/readonlywrapper.php b/apps/files_sharing/lib/readonlywrapper.php
deleted file mode 100644
index a5d84f7f5a2..00000000000
--- a/apps/files_sharing/lib/readonlywrapper.php
+++ /dev/null
@@ -1,74 +0,0 @@
-<?php
-/**
- * @author Joas Schilling <nickvergessen@owncloud.com>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Robin Appelman <icewind@owncloud.com>
- *
- * @copyright Copyright (c) 2015, ownCloud, Inc.
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * 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, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
- */
-
-namespace OCA\Files_Sharing;
-
-use OC\Files\Cache\Wrapper\CachePermissionsMask;
-use OC\Files\Storage\Wrapper\Wrapper;
-use OCP\Constants;
-
-class ReadOnlyWrapper extends Wrapper {
- public function isUpdatable($path) {
- return false;
- }
-
- public function isCreatable($path) {
- return false;
- }
-
- public function isDeletable($path) {
- return false;
- }
-
- public function getPermissions($path) {
- return $this->storage->getPermissions($path) & (\OCP\Constants::PERMISSION_READ | \OCP\Constants::PERMISSION_SHARE);
- }
-
- public function rename($path1, $path2) {
- return false;
- }
-
- public function touch($path, $mtime = null) {
- return false;
- }
-
- public function mkdir($path) {
- return false;
- }
-
- public function rmdir($path) {
- return false;
- }
-
- public function unlink($path) {
- return false;
- }
-
- public function getCache($path = '', $storage = null) {
- if (!$storage) {
- $storage = $this;
- }
- $sourceCache = $this->storage->getCache($path, $storage);
- return new CachePermissionsMask($sourceCache, Constants::PERMISSION_READ | Constants::PERMISSION_SHARE);
- }
-}
diff --git a/apps/files_sharing/lib/sharedmount.php b/apps/files_sharing/lib/sharedmount.php
index 2afc0f1f270..fd672d0500c 100644
--- a/apps/files_sharing/lib/sharedmount.php
+++ b/apps/files_sharing/lib/sharedmount.php
@@ -41,34 +41,40 @@ class SharedMount extends MountPoint implements MoveableMount {
*/
protected $ownerPropagator;
+ /**
+ * @var \OC\Files\View
+ */
+ private $recipientView;
+
public function __construct($storage, $mountpoint, $arguments = null, $loader = null) {
// first update the mount point before creating the parent
$this->ownerPropagator = $arguments['propagator'];
- $newMountPoint = $this->verifyMountPoint($arguments['share'], $arguments['user']);
+ $this->recipientView = new View('/' . $arguments['user'] . '/files');
+ $newMountPoint = $this->verifyMountPoint($arguments['share']);
$absMountPoint = '/' . $arguments['user'] . '/files' . $newMountPoint;
+ $arguments['ownerView'] = new View('/' . $arguments['share']['uid_owner'] . '/files');
parent::__construct($storage, $absMountPoint, $arguments, $loader);
}
/**
* check if the parent folder exists otherwise move the mount point up
*/
- private function verifyMountPoint(&$share, $user) {
+ private function verifyMountPoint(&$share) {
$mountPoint = basename($share['file_target']);
$parent = dirname($share['file_target']);
- $view = new View('/' . $user . '/files');
- if (!$view->is_dir($parent)) {
+ if (!$this->recipientView->is_dir($parent)) {
$parent = Helper::getShareFolder();
}
$newMountPoint = \OCA\Files_Sharing\Helper::generateUniqueTarget(
- \OC\Files\Filesystem::normalizePath($parent . '/' . $mountPoint),
- array(),
- new \OC\Files\View('/' . $user . '/files')
- );
+ \OC\Files\Filesystem::normalizePath($parent . '/' . $mountPoint),
+ [],
+ $this->recipientView
+ );
- if($newMountPoint !== $share['file_target']) {
+ if ($newMountPoint !== $share['file_target']) {
self::updateFileTarget($newMountPoint, $share);
$share['file_target'] = $newMountPoint;
$share['unique_name'] = true;
@@ -79,6 +85,7 @@ class SharedMount extends MountPoint implements MoveableMount {
/**
* update fileTarget in the database if the mount point changed
+ *
* @param string $newPath
* @param array $share reference to the share which should be modified
* @return bool
@@ -99,7 +106,7 @@ class SharedMount extends MountPoint implements MoveableMount {
'Update `*PREFIX*share`
SET `file_target` = ?
WHERE `id` = ?'
- );
+ );
$arguments = array($newPath, $share['id']);
}
diff --git a/apps/files_sharing/lib/sharedstorage.php b/apps/files_sharing/lib/sharedstorage.php
index 50957663b34..ff01489d77b 100644
--- a/apps/files_sharing/lib/sharedstorage.php
+++ b/apps/files_sharing/lib/sharedstorage.php
@@ -45,8 +45,14 @@ class Shared extends \OC\Files\Storage\Common implements ISharedStorage {
private $files = array();
private static $isInitialized = array();
+ /**
+ * @var \OC\Files\View
+ */
+ private $ownerView;
+
public function __construct($arguments) {
$this->share = $arguments['share'];
+ $this->ownerView = $arguments['ownerView'];
}
/**
@@ -623,6 +629,11 @@ class Shared extends \OC\Files\Storage\Common implements ISharedStorage {
/** @var \OCP\Files\Storage $targetStorage */
list($targetStorage, $targetInternalPath) = $this->resolvePath($path);
$targetStorage->acquireLock($targetInternalPath, $type, $provider);
+ // lock the parent folders of the owner when locking the share as recipient
+ if ($path === '') {
+ $sourcePath = $this->ownerView->getPath($this->share['file_source']);
+ $this->ownerView->lockFile(dirname($sourcePath), ILockingProvider::LOCK_SHARED, true);
+ }
}
/**
@@ -634,6 +645,11 @@ class Shared extends \OC\Files\Storage\Common implements ISharedStorage {
/** @var \OCP\Files\Storage $targetStorage */
list($targetStorage, $targetInternalPath) = $this->resolvePath($path);
$targetStorage->releaseLock($targetInternalPath, $type, $provider);
+ // unlock the parent folders of the owner when unlocking the share as recipient
+ if ($path === '') {
+ $sourcePath = $this->ownerView->getPath($this->share['file_source']);
+ $this->ownerView->unlockFile(dirname($sourcePath), ILockingProvider::LOCK_SHARED, true);
+ }
}
/**
diff --git a/apps/files_sharing/publicwebdav.php b/apps/files_sharing/publicwebdav.php
index be7530897f6..c0a9dc328d1 100644
--- a/apps/files_sharing/publicwebdav.php
+++ b/apps/files_sharing/publicwebdav.php
@@ -64,7 +64,7 @@ $server->on('beforeMethod', function () use ($server, $objectTree, $authBackend)
if (!$isWritable) {
\OC\Files\Filesystem::addStorageWrapper('readonly', function ($mountPoint, $storage) {
- return new \OCA\Files_Sharing\ReadOnlyWrapper(array('storage' => $storage));
+ return new \OC\Files\Storage\Wrapper\PermissionsMask(array('storage' => $storage, 'mask' => \OCP\Constants::PERMISSION_READ + \OCP\Constants::PERMISSION_SHARE));
});
}
diff --git a/apps/files_sharing/templates/public.php b/apps/files_sharing/templates/public.php
index dd0b2eebe21..ffe0472b2b1 100644
--- a/apps/files_sharing/templates/public.php
+++ b/apps/files_sharing/templates/public.php
@@ -100,7 +100,7 @@ $thumbSize = 1024;
<div id="imgframe"></div>
<?php endif; ?>
<div class="directDownload">
- <a href="<?php p($_['downloadURL']); ?>" id="download" class="button">
+ <a href="<?php p($_['downloadURL']); ?>" id="downloadFile" class="button">
<img class="svg" alt="" src="<?php print_unescaped(OCP\image_path("core", "actions/download.svg")); ?>"/>
<?php p($l->t('Download %s', array($_['filename'])))?> (<?php p($_['fileSize']) ?>)
</a>
diff --git a/apps/files_sharing/tests/js/shareSpec.js b/apps/files_sharing/tests/js/shareSpec.js
index 1b1e363b792..1bbf4ffca09 100644
--- a/apps/files_sharing/tests/js/shareSpec.js
+++ b/apps/files_sharing/tests/js/shareSpec.js
@@ -206,6 +206,23 @@ describe('OCA.Sharing.Util tests', function() {
expect(OC.basename(getImageUrl($tr.find('.filename .thumbnail')))).toEqual('folder-shared.svg');
expect($action.find('img').length).toEqual(1);
});
+ it('do not show static share text when share exists but neither permission nor owner is available', function() {
+ var $action, $tr;
+ fileList.setFiles([{
+ id: 1,
+ type: 'dir',
+ name: 'One',
+ path: '/subdir',
+ mimetype: 'text/plain',
+ size: 12,
+ permissions: OC.PERMISSION_CREATE,
+ etag: 'abc'
+ }]);
+ $tr = fileList.$el.find('tbody tr:first');
+ expect($tr.find('.action-share').length).toEqual(0);
+ $action = $tr.find('.action-share-notification');
+ expect($action.length).toEqual(0);
+ });
});
describe('Share action', function() {
var showDropDownStub;
diff --git a/apps/files_sharing/tests/locking.php b/apps/files_sharing/tests/locking.php
new file mode 100644
index 00000000000..6d13fc1cda5
--- /dev/null
+++ b/apps/files_sharing/tests/locking.php
@@ -0,0 +1,101 @@
+<?php
+/**
+ * @author Morris Jobke <hey@morrisjobke.de>
+ * @author Robin Appelman <icewind@owncloud.com>
+ * @author Vincent Petry <pvince81@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * 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, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCA\Files_sharing\Tests;
+
+use OC\Files\Filesystem;
+use OC\Files\View;
+use OC\Lock\MemcacheLockingProvider;
+use OCP\Lock\ILockingProvider;
+
+class Locking extends TestCase {
+ /**
+ * @var \OC_User_Dummy
+ */
+ private $userBackend;
+
+ private $ownerUid;
+ private $recipientUid;
+
+ public function setUp() {
+ parent::setUp();
+
+ $this->userBackend = new \OC_User_Dummy();
+ \OC::$server->getUserManager()->registerBackend($this->userBackend);
+
+ $this->ownerUid = $this->getUniqueID('owner_');
+ $this->recipientUid = $this->getUniqueID('recipient_');
+ $this->userBackend->createUser($this->ownerUid, '');
+ $this->userBackend->createUser($this->recipientUid, '');
+
+ $this->loginAsUser($this->ownerUid);
+ Filesystem::mkdir('/foo');
+ Filesystem::file_put_contents('/foo/bar.txt', 'asd');
+ $fileId = Filesystem::getFileInfo('/foo/bar.txt')->getId();
+
+ \OCP\Share::shareItem('file', $fileId, \OCP\Share::SHARE_TYPE_USER, $this->recipientUid, 31);
+
+ $this->loginAsUser($this->recipientUid);
+ $this->assertTrue(Filesystem::file_exists('bar.txt'));
+ }
+
+ public function tearDown() {
+ \OC::$server->getUserManager()->removeBackend($this->userBackend);
+ parent::tearDown();
+ }
+
+ /**
+ * @expectedException \OCP\Lock\LockedException
+ */
+ public function testLockAsRecipient() {
+ $this->loginAsUser($this->ownerUid);
+
+ Filesystem::initMountPoints($this->recipientUid);
+ $recipientView = new View('/' . $this->recipientUid . '/files');
+ $recipientView->lockFile('bar.txt', ILockingProvider::LOCK_EXCLUSIVE);
+
+ Filesystem::rename('/foo', '/asd');
+ }
+
+ public function testUnLockAsRecipient() {
+ $this->loginAsUser($this->ownerUid);
+
+ Filesystem::initMountPoints($this->recipientUid);
+ $recipientView = new View('/' . $this->recipientUid . '/files');
+ $recipientView->lockFile('bar.txt', ILockingProvider::LOCK_EXCLUSIVE);
+ $recipientView->unlockFile('bar.txt', ILockingProvider::LOCK_EXCLUSIVE);
+
+ $this->assertTrue(Filesystem::rename('/foo', '/asd'));
+ }
+
+ public function testChangeLock() {
+
+ Filesystem::initMountPoints($this->recipientUid);
+ $recipientView = new View('/' . $this->recipientUid . '/files');
+ $recipientView->lockFile('bar.txt', ILockingProvider::LOCK_SHARED);
+ $recipientView->changeLock('bar.txt', ILockingProvider::LOCK_EXCLUSIVE);
+ $recipientView->unlockFile('bar.txt', ILockingProvider::LOCK_EXCLUSIVE);
+
+ $this->assertTrue(true);
+ }
+}
diff --git a/apps/files_sharing/tests/unsharechildren.php b/apps/files_sharing/tests/unsharechildren.php
index 0cf551c0500..c57070ba641 100644
--- a/apps/files_sharing/tests/unsharechildren.php
+++ b/apps/files_sharing/tests/unsharechildren.php
@@ -40,7 +40,7 @@ class UnshareChildren extends TestCase {
\OCP\Util::connectHook('OC_Filesystem', 'post_delete', '\OCA\Files_Sharing\Hooks', 'unshareChildren');
$this->folder = self::TEST_FOLDER_NAME;
- $this->subfolder = '/subfolder_share_api_test';
+ $this->subfolder = '/subfolder_share_api_test';
$this->subsubfolder = '/subsubfolder_share_api_test';
$this->filename = '/share-api-test';
@@ -49,12 +49,14 @@ class UnshareChildren extends TestCase {
$this->view->mkdir($this->folder);
$this->view->mkdir($this->folder . $this->subfolder);
$this->view->mkdir($this->folder . $this->subfolder . $this->subsubfolder);
- $this->view->file_put_contents($this->folder.$this->filename, $this->data);
+ $this->view->file_put_contents($this->folder . $this->filename, $this->data);
$this->view->file_put_contents($this->folder . $this->subfolder . $this->filename, $this->data);
}
protected function tearDown() {
- $this->view->deleteAll($this->folder);
+ if ($this->view) {
+ $this->view->deleteAll($this->folder);
+ }
self::$tempStorage = null;
diff --git a/apps/files_trashbin/appinfo/register_command.php b/apps/files_trashbin/appinfo/register_command.php
new file mode 100644
index 00000000000..ae4196dd506
--- /dev/null
+++ b/apps/files_trashbin/appinfo/register_command.php
@@ -0,0 +1,29 @@
+<?php
+/**
+ * @author Björn Schießle <schiessle@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * 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, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+
+use OCA\Files_Trashbin\Command\CleanUp;
+
+$userManager = OC::$server->getUserManager();
+$rootFolder = \OC::$server->getRootFolder();
+$dbConnection = \OC::$server->getDatabaseConnection();
+/** @var Symfony\Component\Console\Application $application */
+$application->add(new CleanUp($rootFolder, $userManager, $dbConnection));
diff --git a/apps/files_trashbin/appinfo/version b/apps/files_trashbin/appinfo/version
index b6160487433..844f6a91acb 100644
--- a/apps/files_trashbin/appinfo/version
+++ b/apps/files_trashbin/appinfo/version
@@ -1 +1 @@
-0.6.2
+0.6.3
diff --git a/apps/files_trashbin/command/cleanup.php b/apps/files_trashbin/command/cleanup.php
new file mode 100644
index 00000000000..961f72763ea
--- /dev/null
+++ b/apps/files_trashbin/command/cleanup.php
@@ -0,0 +1,118 @@
+<?php
+/**
+ * @author Björn Schießle <schiessle@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * 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, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCA\Files_Trashbin\Command;
+
+use OCP\Files\IRootFolder;
+use OCP\IDBConnection;
+use OCP\IUserBackend;
+use OCP\IUserManager;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class CleanUp extends Command {
+
+ /** @var IUserManager */
+ protected $userManager;
+
+ /** @var IRootFolder */
+ protected $rootFolder;
+
+ /** @var \OC\DB\Connection */
+ protected $dbConnection;
+
+ /**
+ * @param IRootFolder $rootFolder
+ * @param IUserManager $userManager
+ * @param IDBConnection $dbConnection
+ */
+ function __construct(IRootFolder $rootFolder, IUserManager $userManager, IDBConnection $dbConnection) {
+ parent::__construct();
+ $this->userManager = $userManager;
+ $this->rootFolder = $rootFolder;
+ $this->dbConnection = $dbConnection;
+ }
+
+ protected function configure() {
+ $this
+ ->setName('trashbin:cleanup')
+ ->setDescription('Remove deleted files')
+ ->addArgument(
+ 'user_id',
+ InputArgument::OPTIONAL | InputArgument::IS_ARRAY,
+ 'remove deleted files of the given user(s), if no user is given all deleted files will be removed'
+ );
+ }
+
+ protected function execute(InputInterface $input, OutputInterface $output) {
+ $users = $input->getArgument('user_id');
+ if (!empty($users)) {
+ foreach ($users as $user) {
+ if ($this->userManager->userExists($user)) {
+ $output->writeln("Remove deleted files of <info>$user</info>");
+ $this->removeDeletedFiles($user);
+ } else {
+ $output->writeln("<error>Unknown user $user</error>");
+ }
+ }
+ } else {
+ $output->writeln('Remove all deleted files');
+ foreach ($this->userManager->getBackends() as $backend) {
+ $name = get_class($backend);
+ if ($backend instanceof IUserBackend) {
+ $name = $backend->getBackendName();
+ }
+ $output->writeln("Remove deleted files for users on backend <info>$name</info>");
+ $limit = 500;
+ $offset = 0;
+ do {
+ $users = $backend->getUsers('', $limit, $offset);
+ foreach ($users as $user) {
+ $output->writeln(" <info>$user</info>");
+ $this->removeDeletedFiles($user);
+ }
+ $offset += $limit;
+ } while (count($users) >= $limit);
+ }
+ }
+ }
+
+ /**
+ * remove deleted files for the given user
+ *
+ * @param string $uid
+ */
+ protected function removeDeletedFiles($uid) {
+ \OC_Util::tearDownFS();
+ \OC_Util::setupFS($uid);
+ if ($this->rootFolder->nodeExists('/' . $uid . '/files_trashbin')) {
+ $this->rootFolder->get('/' . $uid . '/files_trashbin')->delete();
+ $query = $this->dbConnection->createQueryBuilder();
+ $query->delete('`*PREFIX*files_trash`')
+ ->where($query->expr()->eq('`user`', ':uid'))
+ ->setParameter('uid', $uid);
+ $query->execute();
+ }
+ }
+
+}
diff --git a/apps/files_trashbin/lib/trashbin.php b/apps/files_trashbin/lib/trashbin.php
index 2d4ea7adc13..8b666c56c66 100644
--- a/apps/files_trashbin/lib/trashbin.php
+++ b/apps/files_trashbin/lib/trashbin.php
@@ -160,7 +160,7 @@ class Trashbin {
$query = \OC_DB::prepare("INSERT INTO `*PREFIX*files_trash` (`id`,`timestamp`,`location`,`user`) VALUES (?,?,?,?)");
$result = $query->execute(array($ownerFilename, $timestamp, $ownerLocation, $owner));
if (!$result) {
- \OCP\Util::writeLog('files_trashbin', 'trash bin database couldn\'t be updated for the files owner', \OC_log::ERROR);
+ \OCP\Util::writeLog('files_trashbin', 'trash bin database couldn\'t be updated for the files owner', \OCP\Util::ERROR);
}
}
}
@@ -216,7 +216,7 @@ class Trashbin {
if ($trashStorage->file_exists($trashInternalPath)) {
$trashStorage->unlink($trashInternalPath);
}
- \OCP\Util::writeLog('files_trashbin', 'Couldn\'t move ' . $file_path . ' to the trash bin', \OC_log::ERROR);
+ \OCP\Util::writeLog('files_trashbin', 'Couldn\'t move ' . $file_path . ' to the trash bin', \OCP\Util::ERROR);
}
if ($sourceStorage->file_exists($sourceInternalPath)) { // failed to delete the original file, abort
@@ -231,7 +231,7 @@ class Trashbin {
$query = \OC_DB::prepare("INSERT INTO `*PREFIX*files_trash` (`id`,`timestamp`,`location`,`user`) VALUES (?,?,?,?)");
$result = $query->execute(array($filename, $timestamp, $location, $user));
if (!$result) {
- \OCP\Util::writeLog('files_trashbin', 'trash bin database couldn\'t be updated', \OC_log::ERROR);
+ \OCP\Util::writeLog('files_trashbin', 'trash bin database couldn\'t be updated', \OCP\Util::ERROR);
}
\OCP\Util::emitHook('\OCA\Files_Trashbin\Trashbin', 'post_moveToTrash', array('filePath' => \OC\Files\Filesystem::normalizePath($file_path),
'trashPath' => \OC\Files\Filesystem::normalizePath($filename . '.d' . $timestamp)));
@@ -675,7 +675,7 @@ class Trashbin {
foreach ($files as $file) {
if ($availableSpace < 0) {
$tmp = self::delete($file['name'], $user, $file['mtime']);
- \OCP\Util::writeLog('files_trashbin', 'remove "' . $file['name'] . '" (' . $tmp . 'B) to meet the limit of trash bin size (50% of available quota)', \OC_log::INFO);
+ \OCP\Util::writeLog('files_trashbin', 'remove "' . $file['name'] . '" (' . $tmp . 'B) to meet the limit of trash bin size (50% of available quota)', \OCP\Util::INFO);
$availableSpace += $tmp;
$size += $tmp;
} else {
diff --git a/apps/files_trashbin/tests/command/cleanuptest.php b/apps/files_trashbin/tests/command/cleanuptest.php
new file mode 100644
index 00000000000..6e2f78093e0
--- /dev/null
+++ b/apps/files_trashbin/tests/command/cleanuptest.php
@@ -0,0 +1,192 @@
+<?php
+/**
+ * @author Björn Schießle <schiessle@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * 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, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+
+namespace OCA\Files_Trashbin\Tests\Command;
+
+
+use OCA\Files_Trashbin\Command\CleanUp;
+use Test\TestCase;
+use OC\User\Manager;
+use OCP\Files\IRootFolder;
+
+class CleanUpTest extends TestCase {
+
+ /** @var CleanUp */
+ protected $cleanup;
+
+ /** @var \PHPUnit_Framework_MockObject_MockObject | Manager */
+ protected $userManager;
+
+ /** @var \PHPUnit_Framework_MockObject_MockObject | IRootFolder */
+ protected $rootFolder;
+
+ /** @var \OC\DB\Connection */
+ protected $dbConnection;
+
+ /** @var string */
+ protected $trashTable = '`*PREFIX*files_trash`';
+
+ /** @var string */
+ protected $user0 = 'user0';
+
+ public function setUp() {
+ parent::setUp();
+ $this->rootFolder = $this->getMockBuilder('OCP\Files\IRootFolder')
+ ->disableOriginalConstructor()->getMock();
+ $this->userManager = $this->getMockBuilder('OC\User\Manager')
+ ->disableOriginalConstructor()->getMock();
+
+ $this->dbConnection = \OC::$server->getDatabaseConnection();
+
+ $this->cleanup = new CleanUp($this->rootFolder, $this->userManager, $this->dbConnection);
+ }
+
+ /**
+ * populate files_trash table with 10 dummy values
+ */
+ public function initTable() {
+ $query = $this->dbConnection->createQueryBuilder();
+ $query->delete($this->trashTable)->execute();
+ for ($i = 0; $i < 10; $i++) {
+ $query->insert($this->trashTable)
+ ->values(array(
+ '`id`' => $query->expr()->literal('file'.$i),
+ '`timestamp`' => $query->expr()->literal($i),
+ '`location`' => $query->expr()->literal('.'),
+ '`user`' => $query->expr()->literal('user'.$i%2)
+ ))->execute();
+ }
+ $getAllQuery = $this->dbConnection->createQueryBuilder();
+ $result = $getAllQuery->select('`id`')->from($this->trashTable)->execute()->fetchAll();
+ $this->assertSame(10, count($result));
+ }
+
+ /**
+ * @dataProvider dataTestRemoveDeletedFiles
+ * @param boolean $nodeExists
+ */
+ public function testRemoveDeletedFiles($nodeExists) {
+ $this->initTable();
+ $this->rootFolder->expects($this->once())
+ ->method('nodeExists')
+ ->with('/' . $this->user0 . '/files_trashbin')
+ ->willReturn($nodeExists);
+ if($nodeExists) {
+ $this->rootFolder->expects($this->once())
+ ->method('get')
+ ->with('/' . $this->user0 . '/files_trashbin')
+ ->willReturn($this->rootFolder);
+ $this->rootFolder->expects($this->once())
+ ->method('delete');
+ } else {
+ $this->rootFolder->expects($this->never())->method('get');
+ $this->rootFolder->expects($this->never())->method('delete');
+ }
+ $this->invokePrivate($this->cleanup, 'removeDeletedFiles', [$this->user0]);
+
+ if ($nodeExists) {
+ // if the delete operation was execute only files from user1
+ // should be left.
+ $query = $this->dbConnection->createQueryBuilder();
+ $result = $query->select('`user`')
+ ->from($this->trashTable)
+ ->execute()->fetchAll();
+ $this->assertSame(5, count($result));
+ foreach ($result as $r) {
+ $this->assertSame('user1', $r['user']);
+ }
+ } else {
+ // if no delete operation was execute we should still have all 10
+ // database entries
+ $getAllQuery = $this->dbConnection->createQueryBuilder();
+ $result = $getAllQuery->select('`id`')->from($this->trashTable)->execute()->fetchAll();
+ $this->assertSame(10, count($result));
+ }
+
+ }
+ public function dataTestRemoveDeletedFiles() {
+ return array(
+ array(true),
+ array(false)
+ );
+ }
+
+ /**
+ * test remove deleted files from users given as parameter
+ */
+ public function testExecuteDeleteListOfUsers() {
+ $userIds = ['user1', 'user2', 'user3'];
+ $instance = $this->getMockBuilder('OCA\Files_Trashbin\Command\CleanUp')
+ ->setMethods(['removeDeletedFiles'])
+ ->setConstructorArgs([$this->rootFolder, $this->userManager, $this->dbConnection])
+ ->getMock();
+ $instance->expects($this->exactly(count($userIds)))
+ ->method('removeDeletedFiles')
+ ->willReturnCallback(function ($user) use ($userIds) {
+ $this->assertTrue(in_array($user, $userIds));
+ });
+ $this->userManager->expects($this->exactly(count($userIds)))
+ ->method('userExists')->willReturn(true);
+ $inputInterface = $this->getMockBuilder('\Symfony\Component\Console\Input\InputInterface')
+ ->disableOriginalConstructor()->getMock();
+ $inputInterface->expects($this->once())->method('getArgument')
+ ->with('user_id')
+ ->willReturn($userIds);
+ $outputInterface = $this->getMockBuilder('\Symfony\Component\Console\Output\OutputInterface')
+ ->disableOriginalConstructor()->getMock();
+ $this->invokePrivate($instance, 'execute', [$inputInterface, $outputInterface]);
+ }
+
+ /**
+ * test remove deleted files of all users
+ */
+ public function testExecuteAllUsers() {
+ $userIds = [];
+ $backendUsers = ['user1', 'user2'];
+ $instance = $this->getMockBuilder('OCA\Files_Trashbin\Command\CleanUp')
+ ->setMethods(['removeDeletedFiles'])
+ ->setConstructorArgs([$this->rootFolder, $this->userManager, $this->dbConnection])
+ ->getMock();
+ $backend = $this->getMockBuilder('OC_User_Interface')
+ ->disableOriginalConstructor()->getMock();
+ $backend->expects($this->once())->method('getUsers')
+ ->with('', 500, 0)
+ ->willReturn($backendUsers);
+ $instance->expects($this->exactly(count($backendUsers)))
+ ->method('removeDeletedFiles')
+ ->willReturnCallback(function ($user) use ($backendUsers) {
+ $this->assertTrue(in_array($user, $backendUsers));
+ });
+ $inputInterface = $this->getMockBuilder('\Symfony\Component\Console\Input\InputInterface')
+ ->disableOriginalConstructor()->getMock();
+ $inputInterface->expects($this->once())->method('getArgument')
+ ->with('user_id')
+ ->willReturn($userIds);
+ $outputInterface = $this->getMockBuilder('\Symfony\Component\Console\Output\OutputInterface')
+ ->disableOriginalConstructor()->getMock();
+ $this->userManager->expects($this->once())
+ ->method('getBackends')
+ ->willReturn([$backend]);
+ $this->invokePrivate($instance, 'execute', [$inputInterface, $outputInterface]);
+ }
+
+}
diff --git a/apps/files_versions/appinfo/register_command.php b/apps/files_versions/appinfo/register_command.php
new file mode 100644
index 00000000000..49efdbe6190
--- /dev/null
+++ b/apps/files_versions/appinfo/register_command.php
@@ -0,0 +1,28 @@
+<?php
+/**
+ * @author Björn Schießle <schiessle@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * 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, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+
+use OCA\Files_Versions\Command\CleanUp;
+
+$userManager = OC::$server->getUserManager();
+$rootFolder = \OC::$server->getRootFolder();
+/** @var Symfony\Component\Console\Application $application */
+$application->add(new CleanUp($rootFolder, $userManager));
diff --git a/apps/files_versions/appinfo/version b/apps/files_versions/appinfo/version
index 90a27f9cea6..af0b7ddbffd 100644
--- a/apps/files_versions/appinfo/version
+++ b/apps/files_versions/appinfo/version
@@ -1 +1 @@
-1.0.5
+1.0.6
diff --git a/apps/files_versions/command/cleanup.php b/apps/files_versions/command/cleanup.php
new file mode 100644
index 00000000000..bed6dd01773
--- /dev/null
+++ b/apps/files_versions/command/cleanup.php
@@ -0,0 +1,114 @@
+<?php
+/**
+ * @author Björn Schießle <schiessle@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * 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, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCA\Files_Versions\Command;
+
+
+use OCP\Files\IRootFolder;
+use OCP\IUserBackend;
+use OCP\IUserManager;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Output\OutputInterface;
+
+class CleanUp extends Command {
+
+ /** @var IUserManager */
+ protected $userManager;
+
+ /** @var IRootFolder */
+ protected $rootFolder;
+
+ /**
+ * @param IRootFolder $rootFolder
+ * @param IUserManager $userManager
+ */
+ function __construct(IRootFolder $rootFolder, IUserManager $userManager) {
+ parent::__construct();
+ $this->userManager = $userManager;
+ $this->rootFolder = $rootFolder;
+ }
+
+ protected function configure() {
+ $this
+ ->setName('versions:cleanup')
+ ->setDescription('Delete versions')
+ ->addArgument(
+ 'user_id',
+ InputArgument::OPTIONAL | InputArgument::IS_ARRAY,
+ 'delete versions of the given user(s), if no user is given all versions will be deleted'
+ );
+ }
+
+
+ protected function execute(InputInterface $input, OutputInterface $output) {
+
+ $users = $input->getArgument('user_id');
+ if (!empty($users)) {
+ foreach ($users as $user) {
+ if ($this->userManager->userExists($user)) {
+ $output->writeln("Delete versions of <info>$user</info>");
+ $this->deleteVersions($user);
+ } else {
+ $output->writeln("<error>Unknown user $user</error>");
+ }
+ }
+ } else {
+ $output->writeln('Delete all versions');
+ foreach ($this->userManager->getBackends() as $backend) {
+ $name = get_class($backend);
+
+ if ($backend instanceof IUserBackend) {
+ $name = $backend->getBackendName();
+ }
+
+ $output->writeln("Delete versions for users on backend <info>$name</info>");
+
+ $limit = 500;
+ $offset = 0;
+ do {
+ $users = $backend->getUsers('', $limit, $offset);
+ foreach ($users as $user) {
+ $output->writeln(" <info>$user</info>");
+ $this->deleteVersions($user);
+ }
+ $offset += $limit;
+ } while (count($users) >= $limit);
+ }
+ }
+ }
+
+
+ /**
+ * delete versions for the given user
+ *
+ * @param string $user
+ */
+ protected function deleteVersions($user) {
+ \OC_Util::tearDownFS();
+ \OC_Util::setupFS($user);
+ if ($this->rootFolder->nodeExists('/' . $user . '/files_versions')) {
+ $this->rootFolder->get('/' . $user . '/files_versions')->delete();
+ }
+ }
+
+}
diff --git a/apps/files_versions/tests/command/cleanuptest.php b/apps/files_versions/tests/command/cleanuptest.php
new file mode 100644
index 00000000000..bfde25d75ce
--- /dev/null
+++ b/apps/files_versions/tests/command/cleanuptest.php
@@ -0,0 +1,162 @@
+<?php
+/**
+ * @author Björn Schießle <schiessle@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * 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, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+
+namespace OCA\Files_Versions\Tests\Command;
+
+
+use OCA\Files_Versions\Command\CleanUp;
+use Test\TestCase;
+use OC\User\Manager;
+use OCP\Files\IRootFolder;
+
+class CleanupTest extends TestCase {
+
+ /** @var CleanUp */
+ protected $cleanup;
+
+ /** @var \PHPUnit_Framework_MockObject_MockObject | Manager */
+ protected $userManager;
+
+ /** @var \PHPUnit_Framework_MockObject_MockObject | IRootFolder */
+ protected $rootFolder;
+
+ public function setUp() {
+ parent::setUp();
+
+ $this->rootFolder = $this->getMockBuilder('OCP\Files\IRootFolder')
+ ->disableOriginalConstructor()->getMock();
+ $this->userManager = $this->getMockBuilder('OC\User\Manager')
+ ->disableOriginalConstructor()->getMock();
+
+
+ $this->cleanup = new CleanUp($this->rootFolder, $this->userManager);
+ }
+
+ /**
+ * @dataProvider dataTestDeleteVersions
+ * @param boolean $nodeExists
+ */
+ public function testDeleteVersions($nodeExists) {
+
+ $this->rootFolder->expects($this->once())
+ ->method('nodeExists')
+ ->with('/testUser/files_versions')
+ ->willReturn($nodeExists);
+
+
+ if($nodeExists) {
+ $this->rootFolder->expects($this->once())
+ ->method('get')
+ ->with('/testUser/files_versions')
+ ->willReturn($this->rootFolder);
+ $this->rootFolder->expects($this->once())
+ ->method('delete');
+ } else {
+ $this->rootFolder->expects($this->never())
+ ->method('get');
+ $this->rootFolder->expects($this->never())
+ ->method('delete');
+ }
+
+ $this->invokePrivate($this->cleanup, 'deleteVersions', ['testUser']);
+ }
+
+ public function dataTestDeleteVersions() {
+ return array(
+ array(true),
+ array(false)
+ );
+ }
+
+
+ /**
+ * test delete versions from users given as parameter
+ */
+ public function testExecuteDeleteListOfUsers() {
+ $userIds = ['user1', 'user2', 'user3'];
+
+ $instance = $this->getMockBuilder('OCA\Files_Versions\Command\CleanUp')
+ ->setMethods(['deleteVersions'])
+ ->setConstructorArgs([$this->rootFolder, $this->userManager])
+ ->getMock();
+ $instance->expects($this->exactly(count($userIds)))
+ ->method('deleteVersions')
+ ->willReturnCallback(function ($user) use ($userIds) {
+ $this->assertTrue(in_array($user, $userIds));
+ });
+
+ $this->userManager->expects($this->exactly(count($userIds)))
+ ->method('userExists')->willReturn(true);
+
+ $inputInterface = $this->getMockBuilder('\Symfony\Component\Console\Input\InputInterface')
+ ->disableOriginalConstructor()->getMock();
+ $inputInterface->expects($this->once())->method('getArgument')
+ ->with('user_id')
+ ->willReturn($userIds);
+
+ $outputInterface = $this->getMockBuilder('\Symfony\Component\Console\Output\OutputInterface')
+ ->disableOriginalConstructor()->getMock();
+
+ $this->invokePrivate($instance, 'execute', [$inputInterface, $outputInterface]);
+ }
+
+ /**
+ * test delete versions of all users
+ */
+ public function testExecuteAllUsers() {
+ $userIds = [];
+ $backendUsers = ['user1', 'user2'];
+
+ $instance = $this->getMockBuilder('OCA\Files_Versions\Command\CleanUp')
+ ->setMethods(['deleteVersions'])
+ ->setConstructorArgs([$this->rootFolder, $this->userManager])
+ ->getMock();
+
+ $backend = $this->getMockBuilder('OC_User_Interface')
+ ->disableOriginalConstructor()->getMock();
+ $backend->expects($this->once())->method('getUsers')
+ ->with('', 500, 0)
+ ->willReturn($backendUsers);
+
+ $instance->expects($this->exactly(count($backendUsers)))
+ ->method('deleteVersions')
+ ->willReturnCallback(function ($user) use ($backendUsers) {
+ $this->assertTrue(in_array($user, $backendUsers));
+ });
+
+ $inputInterface = $this->getMockBuilder('\Symfony\Component\Console\Input\InputInterface')
+ ->disableOriginalConstructor()->getMock();
+ $inputInterface->expects($this->once())->method('getArgument')
+ ->with('user_id')
+ ->willReturn($userIds);
+
+ $outputInterface = $this->getMockBuilder('\Symfony\Component\Console\Output\OutputInterface')
+ ->disableOriginalConstructor()->getMock();
+
+ $this->userManager->expects($this->once())
+ ->method('getBackends')
+ ->willReturn([$backend]);
+
+ $this->invokePrivate($instance, 'execute', [$inputInterface, $outputInterface]);
+ }
+
+}
diff --git a/apps/user_ldap/appinfo/version b/apps/user_ldap/appinfo/version
index a918a2aa18d..ee6cdce3c29 100644
--- a/apps/user_ldap/appinfo/version
+++ b/apps/user_ldap/appinfo/version
@@ -1 +1 @@
-0.6.0
+0.6.1
diff --git a/apps/user_ldap/l10n/da.js b/apps/user_ldap/l10n/da.js
index d029ed1b994..a4fb384b2f1 100644
--- a/apps/user_ldap/l10n/da.js
+++ b/apps/user_ldap/l10n/da.js
@@ -78,6 +78,7 @@ OC.L10N.register(
"Verify settings" : "Verificér indstillinger",
"1. Server" : "1. server",
"%s. Server:" : "%s. server:",
+ "Add a new and blank configuration" : "Tilføj en ny og tom konfiguration",
"Copy current configuration into new directory binding" : "Kopiér nuværende konfiguration ind i en ny mappetildeling",
"Delete the current configuration" : "Slet den aktuelle konfiguration",
"Host" : "Vært",
diff --git a/apps/user_ldap/l10n/da.json b/apps/user_ldap/l10n/da.json
index 28bcfad508f..48611afbcec 100644
--- a/apps/user_ldap/l10n/da.json
+++ b/apps/user_ldap/l10n/da.json
@@ -76,6 +76,7 @@
"Verify settings" : "Verificér indstillinger",
"1. Server" : "1. server",
"%s. Server:" : "%s. server:",
+ "Add a new and blank configuration" : "Tilføj en ny og tom konfiguration",
"Copy current configuration into new directory binding" : "Kopiér nuværende konfiguration ind i en ny mappetildeling",
"Delete the current configuration" : "Slet den aktuelle konfiguration",
"Host" : "Vært",
diff --git a/apps/user_ldap/l10n/et_EE.js b/apps/user_ldap/l10n/et_EE.js
index cfe06cf0d6e..1e0057c2f44 100644
--- a/apps/user_ldap/l10n/et_EE.js
+++ b/apps/user_ldap/l10n/et_EE.js
@@ -10,15 +10,21 @@ OC.L10N.register(
"No configuration specified" : "Seadistust pole määratletud",
"No data specified" : "Andmeid pole määratletud",
" Could not set configuration %s" : "Ei suutnud seadistada %s",
+ "Action does not exist" : "Toimingut pole olemas",
+ "The Base DN appears to be wrong" : "Näib, et Base DN on vale",
"Configuration incorrect" : "Seadistus on vigane",
"Configuration incomplete" : "Seadistus on puudulik",
"Configuration OK" : "Seadistus on korras",
"Select groups" : "Vali grupid",
"Select object classes" : "Vali objekti klassid",
+ "Please check the credentials, they seem to be wrong." : "Palu nkontrolli kasutajaandmeid, need näivad olevat valed.",
"{nthServer}. Server" : "{nthServer}. Server",
+ "More than 1.000 directory entries available." : "Saadaval on rohkem kui 1000 kataloogi sissekannet.",
"Do you really want to delete the current Server Configuration?" : "Oled kindel, et tahad kustutada praegust serveri seadistust?",
"Confirm Deletion" : "Kinnita kustutamine",
+ "Mode switch" : "Režiimi lüliti",
"Select attributes" : "Vali atribuudid",
+ "User found and settings verified." : "Kasutaja leiti ja seaded on kontrollitud.",
"_%s group found_::_%s groups found_" : ["%s grupp leitud","%s gruppi leitud"],
"_%s user found_::_%s users found_" : ["%s kasutaja leitud","%s kasutajat leitud"],
"Could not find the desired feature" : "Ei suuda leida soovitud funktsioonaalsust",
@@ -29,20 +35,35 @@ OC.L10N.register(
"Test Configuration" : "Testi seadistust",
"Help" : "Abiinfo",
"Groups meeting these criteria are available in %s:" : "Kriteeriumiga sobivad grupid on saadaval %s:",
+ "Only these object classes:" : "Ainult neid objektide klasse:",
+ "Only from these groups:" : "Ainult neist gruppidest:",
+ "Search groups" : "Otsi gruppe",
+ "Available groups" : "Saadaolevad grupid",
+ "Selected groups" : "Validut grupid",
+ "Edit LDAP Query" : "Muuda LDAP päringut",
+ "LDAP Filter:" : "LDAP filter:",
"The filter specifies which LDAP groups shall have access to the %s instance." : "Filter määrab millised LDAP grupid saavad ligipääsu sellele %s instantsile.",
+ "Verify settings and count groups" : "Kontrolli seadeid ja loe grupid üle",
"Other Attributes:" : "Muud atribuudid:",
"Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" : "Määrab sisselogimisel kasutatava filtri. %%uid asendab sisselogimistegevuses kasutajanime. Näide: \"uid=%%uid\"",
+ "Test Loginname" : "Testi kasutajanime",
+ "Verify settings" : "Kontrolli seadeid",
"1. Server" : "1. Server",
"%s. Server:" : "%s. Server:",
+ "Add a new and blank configuration" : "Lisa uus ja tühi seadistus",
+ "Delete the current configuration" : "Kustuta praegune seadistus",
"Host" : "Host",
"You can omit the protocol, except you require SSL. Then start with ldaps://" : "Sa ei saa protokolli ära jätta, välja arvatud siis, kui sa nõuad SSL-ühendust. Sel juhul alusta eesliitega ldaps://",
"Port" : "Port",
+ "Detect Port" : "Tuvasta port",
"User DN" : "Kasutaja DN",
"The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "Klientkasutaja DN, kellega seotakse, nt. uid=agent,dc=näidis,dc=com. Anonüümseks ligipääsuks jäta DN ja parool tühjaks.",
"Password" : "Parool",
"For anonymous access, leave DN and Password empty." : "Anonüümseks ligipääsuks jäta DN ja parool tühjaks.",
"One Base DN per line" : "Üks baas-DN rea kohta",
"You can specify Base DN for users and groups in the Advanced tab" : "Sa saad kasutajate ja gruppide baas DN-i määrata lisavalikute vahekaardilt",
+ "Detect Base DN" : "Tuvasta Baas DN",
+ "Test Base DN" : "Testi Baas DN-i",
"Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Väldib automaatseid LDAP päringuid, Parem suurematele saitidele, aga nõuab mõningaid teadmisi LDAP kohta.",
"Manually enter LDAP filters (recommended for large directories)" : "Sisesta LDAP filtrid automaatselt (sooitatav suurtele kataloogidele)",
"Limit %s access to users meeting these criteria:" : "Piira %s liigpääs kriteeriumiga sobivatele kasutajatele:",
diff --git a/apps/user_ldap/l10n/et_EE.json b/apps/user_ldap/l10n/et_EE.json
index b592f01087d..ea93ccb0efd 100644
--- a/apps/user_ldap/l10n/et_EE.json
+++ b/apps/user_ldap/l10n/et_EE.json
@@ -8,15 +8,21 @@
"No configuration specified" : "Seadistust pole määratletud",
"No data specified" : "Andmeid pole määratletud",
" Could not set configuration %s" : "Ei suutnud seadistada %s",
+ "Action does not exist" : "Toimingut pole olemas",
+ "The Base DN appears to be wrong" : "Näib, et Base DN on vale",
"Configuration incorrect" : "Seadistus on vigane",
"Configuration incomplete" : "Seadistus on puudulik",
"Configuration OK" : "Seadistus on korras",
"Select groups" : "Vali grupid",
"Select object classes" : "Vali objekti klassid",
+ "Please check the credentials, they seem to be wrong." : "Palu nkontrolli kasutajaandmeid, need näivad olevat valed.",
"{nthServer}. Server" : "{nthServer}. Server",
+ "More than 1.000 directory entries available." : "Saadaval on rohkem kui 1000 kataloogi sissekannet.",
"Do you really want to delete the current Server Configuration?" : "Oled kindel, et tahad kustutada praegust serveri seadistust?",
"Confirm Deletion" : "Kinnita kustutamine",
+ "Mode switch" : "Režiimi lüliti",
"Select attributes" : "Vali atribuudid",
+ "User found and settings verified." : "Kasutaja leiti ja seaded on kontrollitud.",
"_%s group found_::_%s groups found_" : ["%s grupp leitud","%s gruppi leitud"],
"_%s user found_::_%s users found_" : ["%s kasutaja leitud","%s kasutajat leitud"],
"Could not find the desired feature" : "Ei suuda leida soovitud funktsioonaalsust",
@@ -27,20 +33,35 @@
"Test Configuration" : "Testi seadistust",
"Help" : "Abiinfo",
"Groups meeting these criteria are available in %s:" : "Kriteeriumiga sobivad grupid on saadaval %s:",
+ "Only these object classes:" : "Ainult neid objektide klasse:",
+ "Only from these groups:" : "Ainult neist gruppidest:",
+ "Search groups" : "Otsi gruppe",
+ "Available groups" : "Saadaolevad grupid",
+ "Selected groups" : "Validut grupid",
+ "Edit LDAP Query" : "Muuda LDAP päringut",
+ "LDAP Filter:" : "LDAP filter:",
"The filter specifies which LDAP groups shall have access to the %s instance." : "Filter määrab millised LDAP grupid saavad ligipääsu sellele %s instantsile.",
+ "Verify settings and count groups" : "Kontrolli seadeid ja loe grupid üle",
"Other Attributes:" : "Muud atribuudid:",
"Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" : "Määrab sisselogimisel kasutatava filtri. %%uid asendab sisselogimistegevuses kasutajanime. Näide: \"uid=%%uid\"",
+ "Test Loginname" : "Testi kasutajanime",
+ "Verify settings" : "Kontrolli seadeid",
"1. Server" : "1. Server",
"%s. Server:" : "%s. Server:",
+ "Add a new and blank configuration" : "Lisa uus ja tühi seadistus",
+ "Delete the current configuration" : "Kustuta praegune seadistus",
"Host" : "Host",
"You can omit the protocol, except you require SSL. Then start with ldaps://" : "Sa ei saa protokolli ära jätta, välja arvatud siis, kui sa nõuad SSL-ühendust. Sel juhul alusta eesliitega ldaps://",
"Port" : "Port",
+ "Detect Port" : "Tuvasta port",
"User DN" : "Kasutaja DN",
"The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "Klientkasutaja DN, kellega seotakse, nt. uid=agent,dc=näidis,dc=com. Anonüümseks ligipääsuks jäta DN ja parool tühjaks.",
"Password" : "Parool",
"For anonymous access, leave DN and Password empty." : "Anonüümseks ligipääsuks jäta DN ja parool tühjaks.",
"One Base DN per line" : "Üks baas-DN rea kohta",
"You can specify Base DN for users and groups in the Advanced tab" : "Sa saad kasutajate ja gruppide baas DN-i määrata lisavalikute vahekaardilt",
+ "Detect Base DN" : "Tuvasta Baas DN",
+ "Test Base DN" : "Testi Baas DN-i",
"Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Väldib automaatseid LDAP päringuid, Parem suurematele saitidele, aga nõuab mõningaid teadmisi LDAP kohta.",
"Manually enter LDAP filters (recommended for large directories)" : "Sisesta LDAP filtrid automaatselt (sooitatav suurtele kataloogidele)",
"Limit %s access to users meeting these criteria:" : "Piira %s liigpääs kriteeriumiga sobivatele kasutajatele:",
diff --git a/apps/user_ldap/l10n/fr.js b/apps/user_ldap/l10n/fr.js
index 9b0e871c9f0..0dfba342d31 100644
--- a/apps/user_ldap/l10n/fr.js
+++ b/apps/user_ldap/l10n/fr.js
@@ -78,6 +78,7 @@ OC.L10N.register(
"Verify settings" : "Tester les paramètres",
"1. Server" : "1. Serveur",
"%s. Server:" : "%s. Serveur :",
+ "Add a new and blank configuration" : "Ajouter une nouvelle configuration vierge",
"Copy current configuration into new directory binding" : "Copier la configuration actuelle vers une nouvelle",
"Delete the current configuration" : "Supprimer la configuration actuelle",
"Host" : "Hôte",
diff --git a/apps/user_ldap/l10n/fr.json b/apps/user_ldap/l10n/fr.json
index 6fb93d618e1..32df29372a2 100644
--- a/apps/user_ldap/l10n/fr.json
+++ b/apps/user_ldap/l10n/fr.json
@@ -76,6 +76,7 @@
"Verify settings" : "Tester les paramètres",
"1. Server" : "1. Serveur",
"%s. Server:" : "%s. Serveur :",
+ "Add a new and blank configuration" : "Ajouter une nouvelle configuration vierge",
"Copy current configuration into new directory binding" : "Copier la configuration actuelle vers une nouvelle",
"Delete the current configuration" : "Supprimer la configuration actuelle",
"Host" : "Hôte",
diff --git a/apps/user_ldap/l10n/id.js b/apps/user_ldap/l10n/id.js
index 23170f99864..c20a94e8bb3 100644
--- a/apps/user_ldap/l10n/id.js
+++ b/apps/user_ldap/l10n/id.js
@@ -3,14 +3,16 @@ OC.L10N.register(
{
"Failed to clear the mappings." : "Gagal membersihkan pemetaan.",
"Failed to delete the server configuration" : "Gagal menghapus konfigurasi server",
+ "The configuration is invalid: anonymous bind is not allowed." : "Konfigurasi tidak sah: bind anonim tidak diizinkan",
"The configuration is valid and the connection could be established!" : "Konfigurasi valid dan koneksi dapat dilakukan!",
"The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "Konfigurasi valid, tetapi Bind gagal. Silakan periksa pengaturan server dan kredensial.",
- "The configuration is invalid. Please have a look at the logs for further details." : "Konfigurasi tidak sah. Silakan lihat log untuk rincian lebh lanjut.",
+ "The configuration is invalid. Please have a look at the logs for further details." : "Konfigurasi tidak sah. Silakan lihat log untuk rincian lebih lanjut.",
"No action specified" : "Tidak ada tindakan yang ditetapkan",
"No configuration specified" : "Tidak ada konfigurasi yang ditetapkan",
"No data specified" : "Tidak ada data yang ditetapkan",
" Could not set configuration %s" : "Tidak dapat menyetel konfigurasi %s",
"Action does not exist" : "Tidak ada tindakan",
+ "The Base DN appears to be wrong" : "Base DN tampaknya salah",
"Configuration incorrect" : "Konfigurasi salah",
"Configuration incomplete" : "Konfigurasi tidak lengkap",
"Configuration OK" : "Konfigurasi Oke",
@@ -29,16 +31,20 @@ OC.L10N.register(
"Confirm Deletion" : "Konfirmasi Penghapusan",
"Mappings cleared successfully!" : "Pemetaan berhasil dibersihkan!",
"Error while clearing the mappings." : "Kesalahan saat membersihkan pemetaan.",
+ "Anonymous bind is not allowed. Please provide a User DN and Password." : "Bind anonim tidak diizinkan. Mohon berikan sebuah User DN dan Password.",
+ "LDAP Operations error. Anonymous bind might not be allowed." : "Kesalahan Operasi LDAP. Bind anonim tidak diizinkan.",
"Saving failed. Please make sure the database is in Operation. Reload before continuing." : "Menyimpan gagal. Mohon pastikan basis data di Operasi. Muat Ulang sebelum melanjutkan.",
- "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "Beralih modus akan mengaktifkan kueri LDAP. Hal ini memerlukan beberapa saat tergantung pada ukuran LDAP Anda. Apakah Anda tetap ingin beralih modus?",
+ "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "Beralih modus akan mengaktifkan kueri LDAP secara otomatis. Hal ini memerlukan beberapa saat tergantung pada ukuran LDAP Anda. Apakah Anda tetap ingin beralih modus?",
"Mode switch" : "Beralih modus",
"Select attributes" : "Pilih atribut",
"User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command line validation): <br/>" : "Pengguna tidak ditemukan. Mohon periksa atribut login dan nama pengguna Anda. Penyaring efektif (salin dan tempel berikut untuk validasi baris perintah):\n<br/>",
"User found and settings verified." : "Pengguna ditemukan dan pengaturan terverifikasi.",
+ "Settings verified, but one user found. Only the first will be able to login. Consider a more narrow filter." : "Setelan terverifikasi, tapi ditemukan satu pengguna. Hanya yang pertama yang dapat login. Pertimbangkan dengan penyaringan yang lebih sempit.",
"An unspecified error occurred. Please check the settings and the log." : "Terjadi kesalahan yang tidak disebutkan. Mohon periksa pengaturan dan log.",
"The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "Penyaring pencarian tidak sah, kemungkinan karena masalah sintaks seperti jumlah kurung buka dan tutup tidak sama. Mohon diperiksa.",
"A connection error to LDAP / AD occurred, please check host, port and credentials." : "Terjadi kesalahan sambungan ke LDAP / AD, mohon periksa host, port dan kredensial.",
- "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Kotak grup telah diaktifkan, karena server LDAP / AD tidak mendukung keanggotaan.",
+ "Please provide a login name to test against" : "Mohon berikan nama login untuk mengujinya kembali",
+ "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Kotak grup telah dinonaktifkan, karena server LDAP / AD tidak mendukung keanggotaan.",
"_%s group found_::_%s groups found_" : ["%s grup ditemukan"],
"_%s user found_::_%s users found_" : ["%s pengguna ditemukan"],
"Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "Tidak mendeteksi atribut nama tampilan pengguna. Silakan menentukannya sendiri di pengaturan ldap lanjutan.",
@@ -50,7 +56,7 @@ OC.L10N.register(
"Groups" : "Grup",
"Test Configuration" : "Uji Konfigurasi",
"Help" : "Bantuan",
- "Groups meeting these criteria are available in %s:" : "Grup memenuhi kriteria ini tersedia di %s:",
+ "Groups meeting these criteria are available in %s:" : "Grup yang memenuhi kriteria ini tersedia di %s:",
"Only these object classes:" : "Hanya kelas obyek berikut:",
"Only from these groups:" : "Hanya dari grup berikut:",
"Search groups" : "Pencarian grup",
@@ -58,52 +64,73 @@ OC.L10N.register(
"Selected groups" : "Grup terpilih",
"Edit LDAP Query" : "Sunting Kueri LDAP",
"LDAP Filter:" : "Penyaring LDAP:",
+ "Verify settings and count groups" : "Verifikasi setelan dan hitung grup",
+ "When logging in, %s will find the user based on the following attributes:" : "Pada saat login, %s akan menemukan pengguna berdasarkan atribut berikut:",
"LDAP / AD Username:" : "Nama pengguna LDAP / AD:",
+ "Allows login against the LDAP / AD username, which is either uid or samaccountname and will be detected." : "Izinkan login dengan nama pengguna LDAP / AD, baik berupa uid atau samaccountname, mereka akan terdeteksi.",
"LDAP / AD Email Address:" : "Alamat Email LDAP / AD:",
+ "Allows login against an email attribute. Mail and mailPrimaryAddress will be allowed." : "Izinkan login dengan atribut email. Mail dan mailPrimaryAddress diperbolehkan.",
"Other Attributes:" : "Atribut Lain:",
+ "Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" : "Tetapkan penyaring yang akan diterapkan saat mencoba login. %%uid akan mengganti nama pengguna saat melakukan login. Contoh: \"uid=%%uid\"",
+ "Test Loginname" : "Test Loginname",
+ "Verify settings" : "Verifikasi setelan",
"1. Server" : "1. Server",
"%s. Server:" : "%s. Server:",
+ "Add a new and blank configuration" : "Tambah konfigurasi kosong yang baru",
+ "Copy current configuration into new directory binding" : "Salin konfigurasi saat ini kedalam direktori baru",
+ "Delete the current configuration" : "Hapus konfigurasi saat ini",
"Host" : "Host",
"You can omit the protocol, except you require SSL. Then start with ldaps://" : "Protokol dapat tidak ditulis, kecuali Anda menggunakan SSL. Lalu jalankan dengan ldaps://",
"Port" : "Port",
+ "Detect Port" : "Deteksi Port",
"User DN" : "Pengguna DN",
"The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "DN dari klien pengguna yang dengannya tautan akan diterapkan, mis. uid=agen,dc=contoh,dc=com. Untuk akses anonim, biarkan DN dan kata sandi kosong.",
"Password" : "Sandi",
"For anonymous access, leave DN and Password empty." : "Untuk akses anonim, biarkan DN dan Kata sandi kosong.",
"One Base DN per line" : "Satu Base DN per baris",
"You can specify Base DN for users and groups in the Advanced tab" : "Anda dapat menetapkan Base DN untuk pengguna dan grup dalam tab Lanjutan",
+ "Detect Base DN" : "Deteksi Base DN",
+ "Test Base DN" : "Uji Base DN",
+ "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Mencegah permintaan LDAP otomatis. Berguna untuk setelan yang lebih besar, tapi memerlukan beberapa pengetahuan LDAP.",
"Manually enter LDAP filters (recommended for large directories)" : "Masukkan penyaring LDAP secara manual (direkomendasikan untuk direktori yang besar)",
"Limit %s access to users meeting these criteria:" : "Batasi akses %s untuk pengguna yang sesuai dengan kriteria berikut:",
+ "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "Kelas obyek yang umum untuk pengguna adalah organizationalPerson, person, user, dan inetOrgPerson. Jika Anda tidak yakin kelas obyek mana yang akan dipilih, silakan konsultasi dengan admin direktori Anda.",
+ "The filter specifies which LDAP users shall have access to the %s instance." : "Penyaring menentukan pengguna LDAP mana yang memiliki akses ke %s.",
+ "Verify settings and count users" : "Verifikasi setelan dan jumlah pengguna",
"Saving" : "Menyimpan",
"Back" : "Kembali",
"Continue" : "Lanjutkan",
"LDAP" : "LDAP",
"Expert" : "Lanjutan",
"Advanced" : "Lanjutan",
+ "<b>Warning:</b> Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behavior. Please ask your system administrator to disable one of them." : "<b>Peringatan:</b> Aplikasi user_ldap dan user_webdavauth tidak kompatibel. Anda mungkin akan mengalami perilaku yang tidak terduga. Silakan minta administrator Anda untuk menonaktifkan salah satunya.",
"<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Peringatan:</b> Modul LDAP PHP tidak terpasang, perangkat tidak akan bekerja. Silakan minta administrator sistem untuk memasangnya.",
"Connection Settings" : "Pengaturan Koneksi",
"Configuration Active" : "Konfigurasi Aktif",
- "When unchecked, this configuration will be skipped." : "Jika tidak dicentang, konfigurasi ini dilewati.",
- "Backup (Replica) Host" : "Host Cadangan (Replika)",
+ "When unchecked, this configuration will be skipped." : "Jika tidak dicentang, konfigurasi ini akan dilewati.",
+ "Backup (Replica) Host" : "Cadangkan (Replika) Host",
"Give an optional backup host. It must be a replica of the main LDAP/AD server." : "Berikan pilihan host cadangan. Harus merupakan replika dari server LDAP/AD utama.",
- "Backup (Replica) Port" : "Port Cadangan (Replika)",
+ "Backup (Replica) Port" : "Cadangkan (Replika) Port",
"Disable Main Server" : "Nonaktifkan Server Utama",
- "Turn off SSL certificate validation." : "matikan validasi sertivikat SSL",
- "Cache Time-To-Live" : "Gunakan Tembolok untuk Time-To-Live",
+ "Only connect to the replica server." : "Hanya terhubung ke server replika.",
+ "Case insensitive LDAP server (Windows)" : "Server LDAP tidak sensitif kata (Windows)",
+ "Turn off SSL certificate validation." : "Matikan validasi sertifikat SSL.",
+ "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "Tidak dianjurkan, gunakan ini hanya untuk percobaan! Jika koneksi hanya bekerja dengan opsi ini, impor sertifikat SSL milik server LDAP kedalam server %s Anda.",
+ "Cache Time-To-Live" : "Cache Time-To-Live",
"in seconds. A change empties the cache." : "dalam detik. perubahan mengosongkan cache",
"Directory Settings" : "Pengaturan Direktori",
"User Display Name Field" : "Bidang Tampilan Nama Pengguna",
"The LDAP attribute to use to generate the user's display name." : "Atribut LDAP digunakan untuk menghasilkan nama tampilan pengguna.",
- "Base User Tree" : "Pohon Pengguna Dasar",
+ "Base User Tree" : "Base User Tree",
"One User Base DN per line" : "Satu Pengguna Base DN per baris",
"User Search Attributes" : "Atribut Pencarian Pengguna",
"Optional; one attribute per line" : "Pilihan; satu atribut per baris",
"Group Display Name Field" : "Bidang Tampilan Nama Grup",
"The LDAP attribute to use to generate the groups's display name." : "Atribut LDAP digunakan untuk menghasilkan nama tampilan grup.",
- "Base Group Tree" : "Pohon Grup Dasar",
+ "Base Group Tree" : "Base Group Tree",
"One Group Base DN per line" : "Satu Grup Base DN per baris",
"Group Search Attributes" : "Atribut Pencarian Grup",
- "Group-Member association" : "asosiasi Anggota-Grup",
+ "Group-Member association" : "Asosiasi Anggota-Grup",
"Special Attributes" : "Atribut Khusus",
"Quota Field" : "Bidang Kuota",
"Quota Default" : "Kuota Baku",
diff --git a/apps/user_ldap/l10n/id.json b/apps/user_ldap/l10n/id.json
index fa0a0a7be20..fb356b28ad7 100644
--- a/apps/user_ldap/l10n/id.json
+++ b/apps/user_ldap/l10n/id.json
@@ -1,14 +1,16 @@
{ "translations": {
"Failed to clear the mappings." : "Gagal membersihkan pemetaan.",
"Failed to delete the server configuration" : "Gagal menghapus konfigurasi server",
+ "The configuration is invalid: anonymous bind is not allowed." : "Konfigurasi tidak sah: bind anonim tidak diizinkan",
"The configuration is valid and the connection could be established!" : "Konfigurasi valid dan koneksi dapat dilakukan!",
"The configuration is valid, but the Bind failed. Please check the server settings and credentials." : "Konfigurasi valid, tetapi Bind gagal. Silakan periksa pengaturan server dan kredensial.",
- "The configuration is invalid. Please have a look at the logs for further details." : "Konfigurasi tidak sah. Silakan lihat log untuk rincian lebh lanjut.",
+ "The configuration is invalid. Please have a look at the logs for further details." : "Konfigurasi tidak sah. Silakan lihat log untuk rincian lebih lanjut.",
"No action specified" : "Tidak ada tindakan yang ditetapkan",
"No configuration specified" : "Tidak ada konfigurasi yang ditetapkan",
"No data specified" : "Tidak ada data yang ditetapkan",
" Could not set configuration %s" : "Tidak dapat menyetel konfigurasi %s",
"Action does not exist" : "Tidak ada tindakan",
+ "The Base DN appears to be wrong" : "Base DN tampaknya salah",
"Configuration incorrect" : "Konfigurasi salah",
"Configuration incomplete" : "Konfigurasi tidak lengkap",
"Configuration OK" : "Konfigurasi Oke",
@@ -27,16 +29,20 @@
"Confirm Deletion" : "Konfirmasi Penghapusan",
"Mappings cleared successfully!" : "Pemetaan berhasil dibersihkan!",
"Error while clearing the mappings." : "Kesalahan saat membersihkan pemetaan.",
+ "Anonymous bind is not allowed. Please provide a User DN and Password." : "Bind anonim tidak diizinkan. Mohon berikan sebuah User DN dan Password.",
+ "LDAP Operations error. Anonymous bind might not be allowed." : "Kesalahan Operasi LDAP. Bind anonim tidak diizinkan.",
"Saving failed. Please make sure the database is in Operation. Reload before continuing." : "Menyimpan gagal. Mohon pastikan basis data di Operasi. Muat Ulang sebelum melanjutkan.",
- "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "Beralih modus akan mengaktifkan kueri LDAP. Hal ini memerlukan beberapa saat tergantung pada ukuran LDAP Anda. Apakah Anda tetap ingin beralih modus?",
+ "Switching the mode will enable automatic LDAP queries. Depending on your LDAP size they may take a while. Do you still want to switch the mode?" : "Beralih modus akan mengaktifkan kueri LDAP secara otomatis. Hal ini memerlukan beberapa saat tergantung pada ukuran LDAP Anda. Apakah Anda tetap ingin beralih modus?",
"Mode switch" : "Beralih modus",
"Select attributes" : "Pilih atribut",
"User not found. Please check your login attributes and username. Effective filter (to copy-and-paste for command line validation): <br/>" : "Pengguna tidak ditemukan. Mohon periksa atribut login dan nama pengguna Anda. Penyaring efektif (salin dan tempel berikut untuk validasi baris perintah):\n<br/>",
"User found and settings verified." : "Pengguna ditemukan dan pengaturan terverifikasi.",
+ "Settings verified, but one user found. Only the first will be able to login. Consider a more narrow filter." : "Setelan terverifikasi, tapi ditemukan satu pengguna. Hanya yang pertama yang dapat login. Pertimbangkan dengan penyaringan yang lebih sempit.",
"An unspecified error occurred. Please check the settings and the log." : "Terjadi kesalahan yang tidak disebutkan. Mohon periksa pengaturan dan log.",
"The search filter is invalid, probably due to syntax issues like uneven number of opened and closed brackets. Please revise." : "Penyaring pencarian tidak sah, kemungkinan karena masalah sintaks seperti jumlah kurung buka dan tutup tidak sama. Mohon diperiksa.",
"A connection error to LDAP / AD occurred, please check host, port and credentials." : "Terjadi kesalahan sambungan ke LDAP / AD, mohon periksa host, port dan kredensial.",
- "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Kotak grup telah diaktifkan, karena server LDAP / AD tidak mendukung keanggotaan.",
+ "Please provide a login name to test against" : "Mohon berikan nama login untuk mengujinya kembali",
+ "The group box was disabled, because the LDAP / AD server does not support memberOf." : "Kotak grup telah dinonaktifkan, karena server LDAP / AD tidak mendukung keanggotaan.",
"_%s group found_::_%s groups found_" : ["%s grup ditemukan"],
"_%s user found_::_%s users found_" : ["%s pengguna ditemukan"],
"Could not detect user display name attribute. Please specify it yourself in advanced ldap settings." : "Tidak mendeteksi atribut nama tampilan pengguna. Silakan menentukannya sendiri di pengaturan ldap lanjutan.",
@@ -48,7 +54,7 @@
"Groups" : "Grup",
"Test Configuration" : "Uji Konfigurasi",
"Help" : "Bantuan",
- "Groups meeting these criteria are available in %s:" : "Grup memenuhi kriteria ini tersedia di %s:",
+ "Groups meeting these criteria are available in %s:" : "Grup yang memenuhi kriteria ini tersedia di %s:",
"Only these object classes:" : "Hanya kelas obyek berikut:",
"Only from these groups:" : "Hanya dari grup berikut:",
"Search groups" : "Pencarian grup",
@@ -56,52 +62,73 @@
"Selected groups" : "Grup terpilih",
"Edit LDAP Query" : "Sunting Kueri LDAP",
"LDAP Filter:" : "Penyaring LDAP:",
+ "Verify settings and count groups" : "Verifikasi setelan dan hitung grup",
+ "When logging in, %s will find the user based on the following attributes:" : "Pada saat login, %s akan menemukan pengguna berdasarkan atribut berikut:",
"LDAP / AD Username:" : "Nama pengguna LDAP / AD:",
+ "Allows login against the LDAP / AD username, which is either uid or samaccountname and will be detected." : "Izinkan login dengan nama pengguna LDAP / AD, baik berupa uid atau samaccountname, mereka akan terdeteksi.",
"LDAP / AD Email Address:" : "Alamat Email LDAP / AD:",
+ "Allows login against an email attribute. Mail and mailPrimaryAddress will be allowed." : "Izinkan login dengan atribut email. Mail dan mailPrimaryAddress diperbolehkan.",
"Other Attributes:" : "Atribut Lain:",
+ "Defines the filter to apply, when login is attempted. %%uid replaces the username in the login action. Example: \"uid=%%uid\"" : "Tetapkan penyaring yang akan diterapkan saat mencoba login. %%uid akan mengganti nama pengguna saat melakukan login. Contoh: \"uid=%%uid\"",
+ "Test Loginname" : "Test Loginname",
+ "Verify settings" : "Verifikasi setelan",
"1. Server" : "1. Server",
"%s. Server:" : "%s. Server:",
+ "Add a new and blank configuration" : "Tambah konfigurasi kosong yang baru",
+ "Copy current configuration into new directory binding" : "Salin konfigurasi saat ini kedalam direktori baru",
+ "Delete the current configuration" : "Hapus konfigurasi saat ini",
"Host" : "Host",
"You can omit the protocol, except you require SSL. Then start with ldaps://" : "Protokol dapat tidak ditulis, kecuali Anda menggunakan SSL. Lalu jalankan dengan ldaps://",
"Port" : "Port",
+ "Detect Port" : "Deteksi Port",
"User DN" : "Pengguna DN",
"The DN of the client user with which the bind shall be done, e.g. uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password empty." : "DN dari klien pengguna yang dengannya tautan akan diterapkan, mis. uid=agen,dc=contoh,dc=com. Untuk akses anonim, biarkan DN dan kata sandi kosong.",
"Password" : "Sandi",
"For anonymous access, leave DN and Password empty." : "Untuk akses anonim, biarkan DN dan Kata sandi kosong.",
"One Base DN per line" : "Satu Base DN per baris",
"You can specify Base DN for users and groups in the Advanced tab" : "Anda dapat menetapkan Base DN untuk pengguna dan grup dalam tab Lanjutan",
+ "Detect Base DN" : "Deteksi Base DN",
+ "Test Base DN" : "Uji Base DN",
+ "Avoids automatic LDAP requests. Better for bigger setups, but requires some LDAP knowledge." : "Mencegah permintaan LDAP otomatis. Berguna untuk setelan yang lebih besar, tapi memerlukan beberapa pengetahuan LDAP.",
"Manually enter LDAP filters (recommended for large directories)" : "Masukkan penyaring LDAP secara manual (direkomendasikan untuk direktori yang besar)",
"Limit %s access to users meeting these criteria:" : "Batasi akses %s untuk pengguna yang sesuai dengan kriteria berikut:",
+ "The most common object classes for users are organizationalPerson, person, user, and inetOrgPerson. If you are not sure which object class to select, please consult your directory admin." : "Kelas obyek yang umum untuk pengguna adalah organizationalPerson, person, user, dan inetOrgPerson. Jika Anda tidak yakin kelas obyek mana yang akan dipilih, silakan konsultasi dengan admin direktori Anda.",
+ "The filter specifies which LDAP users shall have access to the %s instance." : "Penyaring menentukan pengguna LDAP mana yang memiliki akses ke %s.",
+ "Verify settings and count users" : "Verifikasi setelan dan jumlah pengguna",
"Saving" : "Menyimpan",
"Back" : "Kembali",
"Continue" : "Lanjutkan",
"LDAP" : "LDAP",
"Expert" : "Lanjutan",
"Advanced" : "Lanjutan",
+ "<b>Warning:</b> Apps user_ldap and user_webdavauth are incompatible. You may experience unexpected behavior. Please ask your system administrator to disable one of them." : "<b>Peringatan:</b> Aplikasi user_ldap dan user_webdavauth tidak kompatibel. Anda mungkin akan mengalami perilaku yang tidak terduga. Silakan minta administrator Anda untuk menonaktifkan salah satunya.",
"<b>Warning:</b> The PHP LDAP module is not installed, the backend will not work. Please ask your system administrator to install it." : "<b>Peringatan:</b> Modul LDAP PHP tidak terpasang, perangkat tidak akan bekerja. Silakan minta administrator sistem untuk memasangnya.",
"Connection Settings" : "Pengaturan Koneksi",
"Configuration Active" : "Konfigurasi Aktif",
- "When unchecked, this configuration will be skipped." : "Jika tidak dicentang, konfigurasi ini dilewati.",
- "Backup (Replica) Host" : "Host Cadangan (Replika)",
+ "When unchecked, this configuration will be skipped." : "Jika tidak dicentang, konfigurasi ini akan dilewati.",
+ "Backup (Replica) Host" : "Cadangkan (Replika) Host",
"Give an optional backup host. It must be a replica of the main LDAP/AD server." : "Berikan pilihan host cadangan. Harus merupakan replika dari server LDAP/AD utama.",
- "Backup (Replica) Port" : "Port Cadangan (Replika)",
+ "Backup (Replica) Port" : "Cadangkan (Replika) Port",
"Disable Main Server" : "Nonaktifkan Server Utama",
- "Turn off SSL certificate validation." : "matikan validasi sertivikat SSL",
- "Cache Time-To-Live" : "Gunakan Tembolok untuk Time-To-Live",
+ "Only connect to the replica server." : "Hanya terhubung ke server replika.",
+ "Case insensitive LDAP server (Windows)" : "Server LDAP tidak sensitif kata (Windows)",
+ "Turn off SSL certificate validation." : "Matikan validasi sertifikat SSL.",
+ "Not recommended, use it for testing only! If connection only works with this option, import the LDAP server's SSL certificate in your %s server." : "Tidak dianjurkan, gunakan ini hanya untuk percobaan! Jika koneksi hanya bekerja dengan opsi ini, impor sertifikat SSL milik server LDAP kedalam server %s Anda.",
+ "Cache Time-To-Live" : "Cache Time-To-Live",
"in seconds. A change empties the cache." : "dalam detik. perubahan mengosongkan cache",
"Directory Settings" : "Pengaturan Direktori",
"User Display Name Field" : "Bidang Tampilan Nama Pengguna",
"The LDAP attribute to use to generate the user's display name." : "Atribut LDAP digunakan untuk menghasilkan nama tampilan pengguna.",
- "Base User Tree" : "Pohon Pengguna Dasar",
+ "Base User Tree" : "Base User Tree",
"One User Base DN per line" : "Satu Pengguna Base DN per baris",
"User Search Attributes" : "Atribut Pencarian Pengguna",
"Optional; one attribute per line" : "Pilihan; satu atribut per baris",
"Group Display Name Field" : "Bidang Tampilan Nama Grup",
"The LDAP attribute to use to generate the groups's display name." : "Atribut LDAP digunakan untuk menghasilkan nama tampilan grup.",
- "Base Group Tree" : "Pohon Grup Dasar",
+ "Base Group Tree" : "Base Group Tree",
"One Group Base DN per line" : "Satu Grup Base DN per baris",
"Group Search Attributes" : "Atribut Pencarian Grup",
- "Group-Member association" : "asosiasi Anggota-Grup",
+ "Group-Member association" : "Asosiasi Anggota-Grup",
"Special Attributes" : "Atribut Khusus",
"Quota Field" : "Bidang Kuota",
"Quota Default" : "Kuota Baku",
diff --git a/apps/user_ldap/l10n/lb.js b/apps/user_ldap/l10n/lb.js
index 78e8ca45c38..b340887548e 100644
--- a/apps/user_ldap/l10n/lb.js
+++ b/apps/user_ldap/l10n/lb.js
@@ -5,6 +5,7 @@ OC.L10N.register(
"Groups" : "Gruppen",
"Help" : "Hëllef",
"Host" : "Host",
+ "Port" : "Port",
"Password" : "Passwuert",
"Back" : "Zeréck",
"Continue" : "Weider",
diff --git a/apps/user_ldap/l10n/lb.json b/apps/user_ldap/l10n/lb.json
index 7776bf5e76a..4b4d46427b8 100644
--- a/apps/user_ldap/l10n/lb.json
+++ b/apps/user_ldap/l10n/lb.json
@@ -3,6 +3,7 @@
"Groups" : "Gruppen",
"Help" : "Hëllef",
"Host" : "Host",
+ "Port" : "Port",
"Password" : "Passwuert",
"Back" : "Zeréck",
"Continue" : "Weider",
diff --git a/apps/user_webdavauth/appinfo/version b/apps/user_webdavauth/appinfo/version
index 238afc2b279..a3fdef3af89 100644
--- a/apps/user_webdavauth/appinfo/version
+++ b/apps/user_webdavauth/appinfo/version
@@ -1 +1 @@
-1.1.0.1
+1.1.0.2