diff --git a/apps/files/ajax/upload.php b/apps/files/ajax/upload.php index 0a61ff72d4..dde5d3c50a 100644 --- a/apps/files/ajax/upload.php +++ b/apps/files/ajax/upload.php @@ -18,7 +18,6 @@ if (empty($_POST['dirToken'])) { } } else { $linkItem = OCP\Share::getShareByToken($_POST['dirToken']); - if ($linkItem === false) { OCP\JSON::error(array('data' => array_merge(array('message' => $l->t('Invalid Token'))))); die(); @@ -31,6 +30,7 @@ if (empty($_POST['dirToken'])) { $rootLinkItem = OCP\Share::resolveReShare($linkItem); // Setup FS with owner + OC_Util::tearDownFS(); OC_Util::setupFS($rootLinkItem['uid_owner']); // The token defines the target directory (security reasons) diff --git a/apps/files_encryption/hooks/hooks.php b/apps/files_encryption/hooks/hooks.php index 197982010f..b2a17f6bca 100644 --- a/apps/files_encryption/hooks/hooks.php +++ b/apps/files_encryption/hooks/hooks.php @@ -476,10 +476,19 @@ class Hooks { $util = new Util($view, $userId); // Format paths to be relative to user files dir - $oldKeyfilePath = \OC\Files\Filesystem::normalizePath( - $userId . '/' . 'files_encryption' . '/' . 'keyfiles' . '/' . $params['oldpath']); - $newKeyfilePath = \OC\Files\Filesystem::normalizePath( - $userId . '/' . 'files_encryption' . '/' . 'keyfiles' . '/' . $params['newpath']); + if ($util->isSystemWideMountPoint($params['oldpath'])) { + $baseDir = 'files_encryption/'; + $oldKeyfilePath = $baseDir . 'keyfiles/' . $params['oldpath']; + } else { + $baseDir = $userId . '/' . 'files_encryption/'; + $oldKeyfilePath = $baseDir . 'keyfiles/' . $params['oldpath']; + } + + if ($util->isSystemWideMountPoint($params['newpath'])) { + $newKeyfilePath = $baseDir . 'keyfiles/' . $params['newpath']; + } else { + $newKeyfilePath = $baseDir . 'keyfiles/' . $params['newpath']; + } // add key ext if this is not an folder if (!$view->is_dir($oldKeyfilePath)) { @@ -487,8 +496,9 @@ class Hooks { $newKeyfilePath .= '.key'; // handle share-keys - $localKeyPath = $view->getLocalFile($userId . '/files_encryption/share-keys/' . $params['oldpath']); - $matches = glob(preg_quote($localKeyPath) . '*.shareKey'); + $localKeyPath = $view->getLocalFile($baseDir . 'share-keys/' . $params['oldpath']); + $escapedPath = Helper::escapeGlobPattern($localKeyPath); + $matches = glob($escapedPath . '*.shareKey'); foreach ($matches as $src) { $dst = \OC\Files\Filesystem::normalizePath(str_replace($params['oldpath'], $params['newpath'], $src)); @@ -502,10 +512,8 @@ class Hooks { } else { // handle share-keys folders - $oldShareKeyfilePath = \OC\Files\Filesystem::normalizePath( - $userId . '/' . 'files_encryption' . '/' . 'share-keys' . '/' . $params['oldpath']); - $newShareKeyfilePath = \OC\Files\Filesystem::normalizePath( - $userId . '/' . 'files_encryption' . '/' . 'share-keys' . '/' . $params['newpath']); + $oldShareKeyfilePath = $baseDir . 'share-keys/' . $params['oldpath']; + $newShareKeyfilePath = $baseDir . 'share-keys/' . $params['newpath']; // create destination folder if not exists if (!$view->file_exists(dirname($newShareKeyfilePath))) { diff --git a/apps/files_encryption/lib/helper.php b/apps/files_encryption/lib/helper.php index 31cf48a039..6eee8fed6a 100755 --- a/apps/files_encryption/lib/helper.php +++ b/apps/files_encryption/lib/helper.php @@ -218,7 +218,6 @@ class Helper { exit(); } - /** * check requirements for encryption app. * @return bool true if requirements are met @@ -233,4 +232,14 @@ class Helper { return (bool) $result; } + + /** + * @brief glob uses different pattern than regular expressions, escape glob pattern only + * @param unescaped path + * @return escaped path + */ + public static function escapeGlobPattern($path) { + return preg_replace('/(\*|\?|\[)/', '[$1]', $path); + } } + diff --git a/apps/files_encryption/lib/keymanager.php b/apps/files_encryption/lib/keymanager.php index e911c1785d..b2fd650f18 100755 --- a/apps/files_encryption/lib/keymanager.php +++ b/apps/files_encryption/lib/keymanager.php @@ -126,7 +126,12 @@ class Keymanager { $util = new Util($view, \OCP\User::getUser()); list($owner, $filename) = $util->getUidAndFilename($path); - $basePath = '/' . $owner . '/files_encryption/keyfiles'; + // in case of system wide mount points the keys are stored directly in the data directory + if ($util->isSystemWideMountPoint($filename)) { + $basePath = '/files_encryption/keyfiles'; + } else { + $basePath = '/' . $owner . '/files_encryption/keyfiles'; + } $targetPath = self::keySetPreparation($view, $filename, $basePath, $owner); @@ -233,7 +238,12 @@ class Keymanager { list($owner, $filename) = $util->getUidAndFilename($filePath); $filePath_f = ltrim($filename, '/'); - $keyfilePath = '/' . $owner . '/files_encryption/keyfiles/' . $filePath_f . '.key'; + // in case of system wide mount points the keys are stored directly in the data directory + if ($util->isSystemWideMountPoint($filename)) { + $keyfilePath = '/files_encryption/keyfiles/' . $filePath_f . '.key'; + } else { + $keyfilePath = '/' . $owner . '/files_encryption/keyfiles/' . $filePath_f . '.key'; + } $proxyStatus = \OC_FileProxy::$enabled; \OC_FileProxy::$enabled = false; @@ -267,7 +277,14 @@ class Keymanager { public static function deleteFileKey(\OC_FilesystemView $view, $userId, $path) { $trimmed = ltrim($path, '/'); - $keyPath = '/' . $userId . '/files_encryption/keyfiles/' . $trimmed; + + $util = new Util($view, \OCP\User::getUser()); + + if($util->isSystemWideMountPoint($path)) { + $keyPath = '/files_encryption/keyfiles/' . $trimmed; + } else { + $keyPath = '/' . $userId . '/files_encryption/keyfiles/' . $trimmed; + } $result = false; @@ -325,57 +342,26 @@ class Keymanager { * @brief store share key * * @param \OC_FilesystemView $view - * @param string $path relative path of the file, including filename - * @param $userId + * @param string $path where the share key is stored * @param $shareKey - * @internal param string $key - * @internal param string $dbClassName * @return bool true/false * @note The keyfile is not encrypted here. Client code must * asymmetrically encrypt the keyfile before passing it to this method */ - public static function setShareKey(\OC_FilesystemView $view, $path, $userId, $shareKey) { - - // Here we need the currently logged in user, while userId can be a different user - $util = new Util($view, \OCP\User::getUser()); - - list($owner, $filename) = $util->getUidAndFilename($path); - - $basePath = '/' . $owner . '/files_encryption/share-keys'; - - $shareKeyPath = self::keySetPreparation($view, $filename, $basePath, $owner); - - // try reusing key file if part file - if (self::isPartialFilePath($shareKeyPath)) { - - $writePath = $basePath . '/' . self::fixPartialFilePath($shareKeyPath) . '.' . $userId . '.shareKey'; - - } else { - - $writePath = $basePath . '/' . $shareKeyPath . '.' . $userId . '.shareKey'; - - } + private static function setShareKey(\OC_FilesystemView $view, $path, $shareKey) { $proxyStatus = \OC_FileProxy::$enabled; \OC_FileProxy::$enabled = false; - $result = $view->file_put_contents($writePath, $shareKey); + $result = $view->file_put_contents($path, $shareKey); \OC_FileProxy::$enabled = $proxyStatus; - if ( - is_int($result) - && $result > 0 - ) { - + if (is_int($result) && $result > 0) { return true; - } else { - return false; - } - } /** @@ -389,23 +375,40 @@ class Keymanager { // $shareKeys must be an array with the following format: // [userId] => [encrypted key] + // Here we need the currently logged in user, while userId can be a different user + $util = new Util($view, \OCP\User::getUser()); + + list($owner, $filename) = $util->getUidAndFilename($path); + + // in case of system wide mount points the keys are stored directly in the data directory + if ($util->isSystemWideMountPoint($filename)) { + $basePath = '/files_encryption/share-keys'; + } else { + $basePath = '/' . $owner . '/files_encryption/share-keys'; + } + + $shareKeyPath = self::keySetPreparation($view, $filename, $basePath, $owner); $result = true; foreach ($shareKeys as $userId => $shareKey) { - if (!self::setShareKey($view, $path, $userId, $shareKey)) { + // try reusing key file if part file + if (self::isPartialFilePath($shareKeyPath)) { + $writePath = $basePath . '/' . self::fixPartialFilePath($shareKeyPath) . '.' . $userId . '.shareKey'; + } else { + $writePath = $basePath . '/' . $shareKeyPath . '.' . $userId . '.shareKey'; + } + + if (!self::setShareKey($view, $writePath, $shareKey)) { // If any of the keys are not set, flag false $result = false; - } - } // Returns false if any of the keys weren't set return $result; - } /** @@ -440,8 +443,13 @@ class Keymanager { $util = new Util($view, \OCP\User::getUser()); list($owner, $filename) = $util->getUidAndFilename($filePath); - $shareKeyPath = \OC\Files\Filesystem::normalizePath( - '/' . $owner . '/files_encryption/share-keys/' . $filename . '.' . $userId . '.shareKey'); + + // in case of system wide mount points the keys are stored directly in the data directory + if ($util->isSystemWideMountPoint($filename)) { + $shareKeyPath = '/files_encryption/share-keys/' . $filename . '.' . $userId . '.shareKey'; + } else { + $shareKeyPath = '/' . $owner . '/files_encryption/share-keys/' . $filename . '.' . $userId . '.shareKey'; + } if ($view->file_exists($shareKeyPath)) { @@ -467,11 +475,21 @@ class Keymanager { */ public static function delAllShareKeys(\OC_FilesystemView $view, $userId, $filePath) { - if ($view->is_dir($userId . '/files/' . $filePath)) { - $view->unlink($userId . '/files_encryption/share-keys/' . $filePath); + $util = new util($view, $userId); + + if ($util->isSystemWideMountPoint($filePath)) { + $baseDir = '/files_encryption/share-keys/'; } else { - $localKeyPath = $view->getLocalFile($userId . '/files_encryption/share-keys/' . $filePath); - $matches = glob(preg_quote($localKeyPath) . '*.shareKey'); + $baseDir = $userId . '/files_encryption/share-keys/'; + } + + + if ($view->is_dir($userId . '/files/' . $filePath)) { + $view->unlink($baseDir . $filePath); + } else { + $localKeyPath = $view->getLocalFile($baseDir . $filePath); + $escapedPath = Helper::escapeGlobPattern($localKeyPath); + $matches = glob($escapedPath . '*.shareKey'); foreach ($matches as $ma) { $result = unlink($ma); if (!$result) { @@ -495,7 +513,11 @@ class Keymanager { list($owner, $filename) = $util->getUidAndFilename($filePath); - $shareKeyPath = \OC\Files\Filesystem::normalizePath('/' . $owner . '/files_encryption/share-keys/' . $filename); + if ($util->isSystemWideMountPoint($filename)) { + $shareKeyPath = \OC\Files\Filesystem::normalizePath('/files_encryption/share-keys/' . $filename); + } else { + $shareKeyPath = \OC\Files\Filesystem::normalizePath('/' . $owner . '/files_encryption/share-keys/' . $filename); + } if ($view->is_dir($shareKeyPath)) { @@ -526,7 +548,10 @@ class Keymanager { */ private static function recursiveDelShareKeys($dir, $userIds) { foreach ($userIds as $userId) { - $matches = glob(preg_quote($dir) . '/*' . preg_quote('.' . $userId . '.shareKey')); + $extension = '.' . $userId . '.shareKey'; + $escapedDir = Helper::escapeGlobPattern($dir); + $escapedExtension = Helper::escapeGlobPattern($extension); + $matches = glob($escapedDir . '/*' . $escapedExtension); } /** @var $matches array */ foreach ($matches as $ma) { @@ -535,7 +560,7 @@ class Keymanager { 'Could not delete shareKey; does not exist: "' . $ma . '"', \OCP\Util::ERROR); } } - $subdirs = $directories = glob(preg_quote($dir) . '/*', GLOB_ONLYDIR); + $subdirs = $directories = glob($escapedDir . '/*', GLOB_ONLYDIR); foreach ($subdirs as $subdir) { self::recursiveDelShareKeys($subdir, $userIds); } diff --git a/apps/files_encryption/lib/util.php b/apps/files_encryption/lib/util.php index b3de85254e..50e823585d 100644 --- a/apps/files_encryption/lib/util.php +++ b/apps/files_encryption/lib/util.php @@ -992,13 +992,9 @@ class Util { \OC_Appconfig::getValue('files_encryption', 'recoveryAdminEnabled') && $this->recoveryEnabledForUser() ) { - $recoveryEnabled = true; - } else { - $recoveryEnabled = false; - } // Make sure that a share key is generated for the owner too @@ -1019,20 +1015,25 @@ class Util { // If recovery is enabled, add the // Admin UID to list of users to share to if ($recoveryEnabled) { - // Find recoveryAdmin user ID $recoveryKeyId = \OC_Appconfig::getValue('files_encryption', 'recoveryKeyId'); - // Add recoveryAdmin to list of users sharing $userIds[] = $recoveryKeyId; - } // add current user if given if ($currentUserId !== false) { - $userIds[] = $currentUserId; + } + // check if it is a group mount + if (\OCP\App::isEnabled("files_external")) { + $mount = \OC_Mount_Config::getSystemMountPoints(); + foreach ($mount as $mountPoint => $data) { + if ($mountPoint == substr($ownerPath, 1, strlen($mountPoint))) { + $userIds = array_merge($userIds, $this->getUserWithAccessToMountPoint($data['applicable']['users'], $data['applicable']['groups'])); + } + } } // Remove duplicate UIDs @@ -1042,6 +1043,20 @@ class Util { } + private function getUserWithAccessToMountPoint($users, $groups) { + $result = array(); + if (in_array('all', $users)) { + $result = \OCP\User::getUsers(); + } else { + $result = array_merge($result, $users); + foreach ($groups as $group) { + $result = array_merge($result, \OC_Group::usersInGroup($group)); + } + } + + return $result; + } + /** * @brief start migration mode to initially encrypt users data * @return boolean @@ -1179,7 +1194,7 @@ class Util { return array( $fileOwnerUid, - $filename + \OC_Filesystem::normalizePath($filename) ); } @@ -1547,4 +1562,21 @@ class Util { return $relativePath; } + /** + * @brief check if the file is stored on a system wide mount point + * @param $path relative to /data/user with leading '/' + * @return boolean + */ + public function isSystemWideMountPoint($path) { + if (\OCP\App::isEnabled("files_external")) { + $mount = \OC_Mount_Config::getSystemMountPoints(); + foreach ($mount as $mountPoint => $data) { + if ($mountPoint == substr($path, 1, strlen($mountPoint))) { + return true; + } + } + } + return false; + } + } diff --git a/apps/files_encryption/tests/util.php b/apps/files_encryption/tests/util.php index cb10befc8e..368b7b3dc3 100755 --- a/apps/files_encryption/tests/util.php +++ b/apps/files_encryption/tests/util.php @@ -219,7 +219,7 @@ class Test_Encryption_Util extends \PHPUnit_Framework_TestCase { \OC_User::setUserId(\Test_Encryption_Util::TEST_ENCRYPTION_UTIL_USER1); - $filename = 'tmp-' . time() . '.test'; + $filename = '/tmp-' . time() . '.test'; // Disable encryption proxy to prevent recursive calls $proxyStatus = \OC_FileProxy::$enabled; diff --git a/apps/files_sharing/js/public.js b/apps/files_sharing/js/public.js index 0244f392a0..294223aa09 100644 --- a/apps/files_sharing/js/public.js +++ b/apps/files_sharing/js/public.js @@ -11,6 +11,8 @@ var form_data; $(document).ready(function() { + $('#data-upload-form').tipsy({gravity:'ne', fade:true}); + if (typeof FileActions !== 'undefined') { var mimetype = $('#mimetype').val(); // Show file preview if previewer is available, images are already handled by the template diff --git a/apps/files_sharing/public.php b/apps/files_sharing/public.php index 7c9158d800..0c3d6fb7b2 100644 --- a/apps/files_sharing/public.php +++ b/apps/files_sharing/public.php @@ -137,6 +137,9 @@ if (isset($path)) { if (\OCP\App::isEnabled('files_encryption')) { $allowPublicUploadEnabled = false; } + if (isset($file)) { + $allowPublicUploadEnabled = false; + } $tmpl->assign('allowPublicUploadEnabled', $allowPublicUploadEnabled); $tmpl->assign('uploadMaxFilesize', $maxUploadFilesize); $tmpl->assign('uploadMaxHumanFilesize', OCP\Util::humanFileSize($maxUploadFilesize)); diff --git a/apps/files_sharing/templates/public.php b/apps/files_sharing/templates/public.php index 56ed4ca168..e8bf80b872 100644 --- a/apps/files_sharing/templates/public.php +++ b/apps/files_sharing/templates/public.php @@ -1,5 +1,5 @@
- +
@@ -9,88 +9,92 @@
+ +
-
- - - - -
- -
- -
- -
+
+ + - + +
+ +
+ +
+ +
+ + + - -
-
-

- getLongFooter()); ?> -

-
+
+ diff --git a/apps/files_trashbin/lib/trash.php b/apps/files_trashbin/lib/trash.php index 1235d9d2ee..b9d900dfab 100644 --- a/apps/files_trashbin/lib/trash.php +++ b/apps/files_trashbin/lib/trash.php @@ -171,13 +171,19 @@ class Trashbin { list($owner, $ownerPath) = self::getUidAndFilename($file_path); + $util = new \OCA\Encryption\Util(new \OC_FilesystemView('/'), $user); // disable proxy to prevent recursive calls $proxyStatus = \OC_FileProxy::$enabled; \OC_FileProxy::$enabled = false; - // retain key files - $keyfile = \OC\Files\Filesystem::normalizePath($owner . '/files_encryption/keyfiles/' . $ownerPath); + if ($util->isSystemWideMountPoint($ownerPath)) { + $baseDir = '/files_encryption/'; + } else { + $baseDir = $owner . '/files_encryption/'; + } + + $keyfile = \OC\Files\Filesystem::normalizePath($baseDir . '/keyfiles/' . $ownerPath); if ($rootView->is_dir($keyfile) || $rootView->file_exists($keyfile . '.key')) { // move keyfiles @@ -191,7 +197,7 @@ class Trashbin { } // retain share keys - $sharekeys = \OC\Files\Filesystem::normalizePath($owner . '/files_encryption/share-keys/' . $ownerPath); + $sharekeys = \OC\Files\Filesystem::normalizePath($baseDir . '/share-keys/' . $ownerPath); if ($rootView->is_dir($sharekeys)) { $size += self::calculateSize(new \OC\Files\View($sharekeys)); @@ -403,6 +409,14 @@ class Trashbin { list($owner, $ownerPath) = self::getUidAndFilename($target); + $util = new \OCA\Encryption\Util(new \OC_FilesystemView('/'), $user); + + if ($util->isSystemWideMountPoint($ownerPath)) { + $baseDir = '/files_encryption/'; + } else { + $baseDir = $owner . '/files_encryption/'; + } + $path_parts = pathinfo($file); $source_location = $path_parts['dirname']; @@ -432,18 +446,18 @@ class Trashbin { // handle keyfiles $size += self::calculateSize(new \OC\Files\View($keyfile)); - $rootView->rename($keyfile, $owner . '/files_encryption/keyfiles/' . $ownerPath); + $rootView->rename($keyfile, $baseDir . '/keyfiles/' . $ownerPath); // handle share-keys if ($timestamp) { $sharekey .= '.d' . $timestamp; } $size += self::calculateSize(new \OC\Files\View($sharekey)); - $rootView->rename($sharekey, $owner . '/files_encryption/share-keys/' . $ownerPath); + $rootView->rename($sharekey, $baseDir . '/share-keys/' . $ownerPath); } else { // handle keyfiles $size += $rootView->filesize($keyfile); - $rootView->rename($keyfile, $owner . '/files_encryption/keyfiles/' . $ownerPath . '.key'); + $rootView->rename($keyfile, $baseDir . '/keyfiles/' . $ownerPath . '.key'); // handle share-keys $ownerShareKey = \OC\Files\Filesystem::normalizePath($user . '/files_trashbin/share-keys/' . $source_location . '/' . $filename . '.' . $user . '.shareKey'); @@ -454,7 +468,7 @@ class Trashbin { $size += $rootView->filesize($ownerShareKey); // move only owners key - $rootView->rename($ownerShareKey, $owner . '/files_encryption/share-keys/' . $ownerPath . '.' . $user . '.shareKey'); + $rootView->rename($ownerShareKey, $baseDir . '/share-keys/' . $ownerPath . '.' . $user . '.shareKey'); // try to re-share if file is shared $filesystemView = new \OC_FilesystemView('/'); diff --git a/core/js/share.js b/core/js/share.js index 588202d227..21e352ee1c 100644 --- a/core/js/share.js +++ b/core/js/share.js @@ -163,10 +163,10 @@ OC.Share={ var allowPublicUploadStatus = false; $.each(data.shares, function(key, value) { - if (allowPublicUploadStatus) { - return true; - } - allowPublicUploadStatus = (value.permissions & OC.PERMISSION_CREATE) ? true : false; + if (allowPublicUploadStatus) { + return true; + } + allowPublicUploadStatus = (value.permissions & OC.PERMISSION_CREATE) ? true : false; }); html += ''; @@ -181,11 +181,13 @@ OC.Share={ html += '
'; html += ''; html += '
'; - html += '
'; - html += ''; diff --git a/core/templates/altmail.php b/core/templates/altmail.php index 37dc8eee94..a7df29a244 100644 --- a/core/templates/altmail.php +++ b/core/templates/altmail.php @@ -1,9 +1,9 @@ t("Hey there,\n\njust letting you know that %s shared %s with you.\nView it: %s\n\nCheers!", array($_['user_displayname'], $_['filename'], $_['link']))); ?> -- -ownCloud - t("web services under your control")); -?> -http://ownCloud.org +getName() . ' - ' . $defaults->getSlogan()); ?> +getBaseUrl()); diff --git a/core/templates/mail.php b/core/templates/mail.php index ebeefd5c7e..562ad82e95 100644 --- a/core/templates/mail.php +++ b/core/templates/mail.php @@ -1,3 +1,4 @@ +
@@ -20,10 +21,9 @@ print_unescaped($l->t('Hey there,

just letting you know that %s shared ยป +getName()); ?> - +getSlogan()); ?> +
getBaseUrl());?> diff --git a/lib/config.php b/lib/config.php index fcd0a9d7c3..f1c139f22b 100644 --- a/lib/config.php +++ b/lib/config.php @@ -132,6 +132,9 @@ class OC_Config{ // read all file in config dir ending by config.php $config_files = glob( OC::$SERVERROOT."/config/*.config.php"); + if (!is_array($config_files)) { + $config_files = array(); + } //Filter only regular files $config_files = array_filter($config_files, 'is_file'); diff --git a/lib/public/share.php b/lib/public/share.php index 69e6f35b47..468026d3d9 100644 --- a/lib/public/share.php +++ b/lib/public/share.php @@ -335,11 +335,22 @@ class Share { * @return Return depends on format */ public static function getItemShared($itemType, $itemSource, $format = self::FORMAT_NONE, - $parameters = null, $includeCollections = false) { + $parameters = null, $includeCollections = false) { return self::getItems($itemType, $itemSource, null, null, \OC_User::getUser(), $format, $parameters, -1, $includeCollections); } + /** + * @param $itemType + * @param $itemSource + * @param $uid_owner + * @return mixed + */ + public static function getSharedItem($itemType, $itemSource, $uid_owner) { + return self::getItems($itemType, $itemSource, null, null, $uid_owner, self::FORMAT_NONE, + null, 1, false); + } + /** * Get all users an item is shared with * @param string Item type diff --git a/tests/lib/files/cache/scanner.php b/tests/lib/files/cache/scanner.php index 042bf8991f..263ceadccc 100644 --- a/tests/lib/files/cache/scanner.php +++ b/tests/lib/files/cache/scanner.php @@ -132,6 +132,7 @@ class Scanner extends \PHPUnit_Framework_TestCase { $this->scanner->scan(''); $oldData = $this->cache->get(''); $this->storage->unlink('folder/bar.txt'); + $this->cache->put('folder', array('mtime' => $this->storage->filemtime('folder'))); $this->scanner->scan('', \OC\Files\Cache\Scanner::SCAN_SHALLOW, \OC\Files\Cache\Scanner::REUSE_SIZE); $newData = $this->cache->get(''); $this->assertNotEquals($oldData['etag'], $newData['etag']);
  --
-ownCloud - t('web services under your control')); -?> -
http://ownCloud.org