Mark shares as dirty when changing permissions

This commit is contained in:
Robin Appelman 2015-10-01 15:37:26 +02:00 committed by Thomas Müller
parent d9ffb09479
commit 0817024e6f
4 changed files with 35 additions and 4 deletions

View file

@ -99,4 +99,12 @@ class ChangeWatcher {
$propagator->propagateChanges(); $propagator->propagateChanges();
} }
} }
public function permissionsHook($params) {
$share = $params['share'];
if ($share['item_type'] === 'file' || $share['item_type'] === 'folder') {
$this->recipientPropagator->markDirty($share, time());
}
}
} }

View file

@ -25,6 +25,7 @@ use OC\Files\Filesystem;
use OC\Files\View; use OC\Files\View;
use OCP\IConfig; use OCP\IConfig;
use OCP\IUserSession; use OCP\IUserSession;
use OCP\Util;
/** /**
@ -119,8 +120,9 @@ class PropagationManager {
// for marking shares owned by the active user as dirty when a file inside them changes // for marking shares owned by the active user as dirty when a file inside them changes
$this->listenToOwnerChanges($user->getUID(), $user->getUID()); $this->listenToOwnerChanges($user->getUID(), $user->getUID());
\OC_Hook::connect('OC_Filesystem', 'post_write', $watcher, 'writeHook'); Util::connectHook('OC_Filesystem', 'post_write', $watcher, 'writeHook');
\OC_Hook::connect('OC_Filesystem', 'post_delete', $watcher, 'writeHook'); Util::connectHook('OC_Filesystem', 'post_delete', $watcher, 'writeHook');
\OC_Hook::connect('OC_Filesystem', 'post_rename', $watcher, 'renameHook'); Util::connectHook('OC_Filesystem', 'post_rename', $watcher, 'renameHook');
Util::connectHook('OCP\Share', 'post_update_permissions', $watcher, 'permissionsHook');
} }
} }

View file

@ -406,4 +406,17 @@ class EtagPropagation extends TestCase {
$this->assertAllUnchaged(); $this->assertAllUnchaged();
} }
public function testEtagChangeOnPermissionsChange() {
$this->loginAsUser(self::TEST_FILES_SHARING_API_USER1);
$view = new View('/' . self::TEST_FILES_SHARING_API_USER1 . '/files');
$folderInfo = $view->getFileInfo('/sub1/sub2/folder');
\OCP\Share::setPermissions('folder', $folderInfo->getId(), \OCP\Share::SHARE_TYPE_USER, self::TEST_FILES_SHARING_API_USER2, 17);
$this->assertEtagsForFoldersChanged([self::TEST_FILES_SHARING_API_USER2, self::TEST_FILES_SHARING_API_USER4]);
$this->assertAllUnchaged();
}
} }

View file

@ -1099,6 +1099,7 @@ class Share extends Constants {
'uidOwner' => \OC_User::getUser(), 'uidOwner' => \OC_User::getUser(),
'permissions' => $permissions, 'permissions' => $permissions,
'path' => $item['path'], 'path' => $item['path'],
'share' => $item
)); ));
} }
// Check if permissions were removed // Check if permissions were removed
@ -1109,16 +1110,18 @@ class Share extends Constants {
Helper::delete($item['id'], true, null, null, true); Helper::delete($item['id'], true, null, null, true);
} else { } else {
$ids = array(); $ids = array();
$items = [];
$parents = array($item['id']); $parents = array($item['id']);
while (!empty($parents)) { while (!empty($parents)) {
$parents = "'".implode("','", $parents)."'"; $parents = "'".implode("','", $parents)."'";
$query = \OC_DB::prepare('SELECT `id`, `permissions` FROM `*PREFIX*share`' $query = \OC_DB::prepare('SELECT `id`, `permissions`, `item_type` FROM `*PREFIX*share`'
.' WHERE `parent` IN ('.$parents.')'); .' WHERE `parent` IN ('.$parents.')');
$result = $query->execute(); $result = $query->execute();
// Reset parents array, only go through loop again if // Reset parents array, only go through loop again if
// items are found that need permissions removed // items are found that need permissions removed
$parents = array(); $parents = array();
while ($item = $result->fetchRow()) { while ($item = $result->fetchRow()) {
$items[] = $item;
// Check if permissions need to be removed // Check if permissions need to be removed
if ($item['permissions'] & ~$permissions) { if ($item['permissions'] & ~$permissions) {
// Add to list of items that need permissions removed // Add to list of items that need permissions removed
@ -1140,8 +1143,13 @@ class Share extends Constants {
.' WHERE `id` IN ('.$ids.')'); .' WHERE `id` IN ('.$ids.')');
$query->execute(array($permissions)); $query->execute(array($permissions));
} }
foreach ($items as $item) {
\OC_Hook::emit('OCP\Share', 'post_update_permissions', ['share' => $item]);
} }
} }
}
return true; return true;
} }
$message = 'Setting permissions for %s failed, because the item was not found'; $message = 'Setting permissions for %s failed, because the item was not found';