summaryrefslogtreecommitdiffstats
path: root/apps/files_sharing/lib
diff options
context:
space:
mode:
authorMichael Gapczynski <mtgap@owncloud.com>2013-02-26 01:21:48 -0500
committerMichael Gapczynski <mtgap@owncloud.com>2013-02-26 01:21:48 -0500
commit8983465210c9dcd91cc178a072775efbcda85ca8 (patch)
treebf8b83b3a98fd30bc7a2f7fa0fbd8e29ff5e963c /apps/files_sharing/lib
parent36827d15498f443819b3aceb503d6cc1b071e041 (diff)
downloadnextcloud-server-8983465210c9dcd91cc178a072775efbcda85ca8.tar.gz
nextcloud-server-8983465210c9dcd91cc178a072775efbcda85ca8.zip
Correct parent folders' ETags for all users with access to a shared file
Diffstat (limited to 'apps/files_sharing/lib')
-rw-r--r--apps/files_sharing/lib/cache.php4
-rw-r--r--apps/files_sharing/lib/sharedstorage.php3
-rw-r--r--apps/files_sharing/lib/updater.php77
3 files changed, 82 insertions, 2 deletions
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