diff options
author | Michael Gapczynski <mtgap@owncloud.com> | 2013-02-26 01:21:48 -0500 |
---|---|---|
committer | Michael Gapczynski <mtgap@owncloud.com> | 2013-02-26 01:21:48 -0500 |
commit | 8983465210c9dcd91cc178a072775efbcda85ca8 (patch) | |
tree | bf8b83b3a98fd30bc7a2f7fa0fbd8e29ff5e963c | |
parent | 36827d15498f443819b3aceb503d6cc1b071e041 (diff) | |
download | nextcloud-server-8983465210c9dcd91cc178a072775efbcda85ca8.tar.gz nextcloud-server-8983465210c9dcd91cc178a072775efbcda85ca8.zip |
Correct parent folders' ETags for all users with access to a shared file
-rw-r--r-- | apps/files_sharing/appinfo/app.php | 1 | ||||
-rw-r--r-- | apps/files_sharing/lib/cache.php | 4 | ||||
-rw-r--r-- | apps/files_sharing/lib/sharedstorage.php | 3 | ||||
-rw-r--r-- | apps/files_sharing/lib/updater.php | 77 | ||||
-rw-r--r-- | lib/public/share.php | 23 |
5 files changed, 106 insertions, 2 deletions
diff --git a/apps/files_sharing/appinfo/app.php b/apps/files_sharing/appinfo/app.php index d3e05cc62d8..f8326db45bb 100644 --- a/apps/files_sharing/appinfo/app.php +++ b/apps/files_sharing/appinfo/app.php @@ -5,6 +5,7 @@ OC::$CLASSPATH['OC_Share_Backend_Folder'] = 'apps/files_sharing/lib/share/folder OC::$CLASSPATH['OC\Files\Storage\Shared'] = "apps/files_sharing/lib/sharedstorage.php"; OC::$CLASSPATH['OC\Files\Cache\Shared_Cache'] = 'apps/files_sharing/lib/cache.php'; OC::$CLASSPATH['OC\Files\Cache\Shared_Permissions'] = 'apps/files_sharing/lib/permissions.php'; +OC::$CLASSPATH['OC\Files\Cache\Shared_Updater'] = 'apps/files_sharing/lib/updater.php'; OC::$CLASSPATH['OC\Files\Cache\Shared_Watcher'] = 'apps/files_sharing/lib/watcher.php'; OCP\Util::connectHook('OC_Filesystem', 'setup', '\OC\Files\Storage\Shared', 'setup'); OCP\Share::registerBackend('file', 'OC_Share_Backend_File'); diff --git a/apps/files_sharing/lib/cache.php b/apps/files_sharing/lib/cache.php index 5309ec78969..851e958f686 100644 --- a/apps/files_sharing/lib/cache.php +++ b/apps/files_sharing/lib/cache.php @@ -125,8 +125,8 @@ class Shared_Cache extends Cache { * @return int file id */ public function put($file, array $data) { - if ($file == '' && isset($data['etag'])) { - \OCP\Config::setUserValue(\OCP\User::getUser(), 'files_sharing', 'etag', $data['etag']); + if ($file === '' && isset($data['etag'])) { + return \OCP\Config::setUserValue(\OCP\User::getUser(), 'files_sharing', 'etag', $data['etag']); } else if ($cache = $this->getSourceCache($file)) { return $cache->put($this->files[$file], $data); } diff --git a/apps/files_sharing/lib/sharedstorage.php b/apps/files_sharing/lib/sharedstorage.php index 1e82d04ec23..0163f2e00b4 100644 --- a/apps/files_sharing/lib/sharedstorage.php +++ b/apps/files_sharing/lib/sharedstorage.php @@ -412,6 +412,9 @@ class Shared extends \OC\Files\Storage\Common { if (!\OCP\User::isLoggedIn() || \OCP\User::getUser() != $options['user'] || \OCP\Share::getItemsSharedWith('file')) { $user_dir = $options['user_dir']; \OC\Files\Filesystem::mount('\OC\Files\Storage\Shared', array('sharedFolder' => '/Shared'), $user_dir.'/Shared/'); + \OC_Hook::connect('OC_Filesystem', 'post_write', '\OC\Files\Cache\Shared_Updater', 'writeHook'); + \OC_Hook::connect('OC_Filesystem', 'post_delete', '\OC\Files\Cache\Shared_Updater', 'deleteHook'); + \OC_Hook::connect('OC_Filesystem', 'post_rename', '\OC\Files\Cache\Shared_Updater', 'renameHook'); } } diff --git a/apps/files_sharing/lib/updater.php b/apps/files_sharing/lib/updater.php new file mode 100644 index 00000000000..af6f9215598 --- /dev/null +++ b/apps/files_sharing/lib/updater.php @@ -0,0 +1,77 @@ +<?php +/** + * ownCloud + * + * @author Michael Gapczynski + * @copyright 2013 Michael Gapczynski mtgap@owncloud.com + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU AFFERO GENERAL PUBLIC LICENSE for more details. + * + * You should have received a copy of the GNU Affero General Public + * License along with this library. If not, see <http://www.gnu.org/licenses/>. + */ + +namespace OC\Files\Cache; + +class Shared_Updater { + + /** + * Correct the parent folders' ETags for all users shared the file at $target + * + * @param string $target + */ + static public function correctFolders($target) { + $uid = \OCP\User::getUser(); + $uidOwner = \OC\Files\Filesystem::getOwner($target); + $info = \OC\Files\Filesystem::getFileInfo($target); + // Correct Shared folders of other users shared with + $users = \OCP\Share::getUsersItemShared('file', $info['fileid'], $uidOwner, true); + if (!empty($users)) { + foreach ($users as $user) { + // The ETag of the logged in user should already be updated + if ($user !== $uid) { + $etag = \OC\Files\Filesystem::getETag(''); + \OCP\Config::setUserValue($user, 'files_sharing', 'etag', $etag); + } + } + // Correct folders of shared file owner + if ($uidOwner !== $uid && $source = \OC_Share_Backend_File::getSource($target)) { + \OC\Files\Filesystem::initMountPoints($source['uid_owner']); + $source = '/'.$source['uid_owner'].'/'.$source['path']; + $mtime = \OC\Files\Filesystem::filemtime($target); + \OC\Files\Cache\Updater::correctFolder($source, $mtime); + } + } + } + + /** + * @param array $params + */ + static public function writeHook($params) { + self::correctFolders($params['path']); + } + + /** + * @param array $params + */ + static public function renameHook($params) { + self::correctFolders($params['oldpath']); + self::correctFolders($params['newpath']); + } + + /** + * @param array $params + */ + static public function deleteHook($params) { + self::correctFolders($params['path']); + } + +}
\ No newline at end of file diff --git a/lib/public/share.php b/lib/public/share.php index c0f35333e83..3d157b1a5f9 100644 --- a/lib/public/share.php +++ b/lib/public/share.php @@ -198,6 +198,29 @@ class Share { } /** + * Get all users an item is shared with + * @param string Item type + * @param string Item source + * @param string Owner + * @param bool Include collections + * @return Return array of users + */ + public static function getUsersItemShared($itemType, $itemSource, $uidOwner, $includeCollections = false) { + $users = array(); + $items = self::getItems($itemType, $itemSource, null, null, $uidOwner, self::FORMAT_NONE, null, -1, $includeCollections); + if ($items) { + foreach ($items as $item) { + if ((int)$item['share_type'] === self::SHARE_TYPE_USER) { + $users[] = $item['share_with']; + } else if ((int)$item['share_type'] === self::SHARE_TYPE_GROUP) { + $users = array_merge($users, \OC_Group::usersInGroup($item['share_with'])); + } + } + } + return $users; + } + + /** * @brief Share an item with a user, group, or via private link * @param string Item type * @param string Item source |