diff options
Diffstat (limited to 'apps')
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 |