Mark shares as dirty when changing permissions
This commit is contained in:
parent
d9ffb09479
commit
0817024e6f
4 changed files with 35 additions and 4 deletions
|
@ -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());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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';
|
||||||
|
|
Loading…
Reference in a new issue