diff options
Diffstat (limited to 'apps/files_sharing/lib/propagation/recipientpropagator.php')
-rw-r--r-- | apps/files_sharing/lib/propagation/recipientpropagator.php | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/apps/files_sharing/lib/propagation/recipientpropagator.php b/apps/files_sharing/lib/propagation/recipientpropagator.php new file mode 100644 index 00000000000..5b7651f2ce7 --- /dev/null +++ b/apps/files_sharing/lib/propagation/recipientpropagator.php @@ -0,0 +1,118 @@ +<?php +/** + * Copyright (c) 2015 Robin Appelman <icewind@owncloud.com> + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +namespace OCA\Files_Sharing\Propagation; + +use OC\Files\Cache\ChangePropagator; +use OC\Files\View; +use OC\Share\Share; + +/** + * Propagate etags for share recipients + */ +class RecipientPropagator { + /** + * @var string + */ + protected $userId; + + /** + * @var \OC\Files\Cache\ChangePropagator + */ + protected $changePropagator; + + /** + * @var \OCP\IConfig + */ + protected $config; + + /** + * @param string $userId current user, must match the propagator's + * user + * @param \OC\Files\Cache\ChangePropagator $changePropagator change propagator + * initialized with a view for $user + * @param \OCP\IConfig $config + */ + public function __construct($userId, $changePropagator, $config) { + $this->userId = $userId; + $this->changePropagator = $changePropagator; + $this->config = $config; + } + + /** + * Propagate the etag changes for all shares marked as dirty and mark the shares as clean + * + * @param array $shares the shares for the users + * @param int $time + */ + public function propagateDirtyMountPoints(array $shares, $time = null) { + if ($time === null) { + $time = microtime(true); + } + $dirtyShares = $this->getDirtyShares($shares); + foreach ($dirtyShares as $share) { + $this->changePropagator->addChange($share['file_target']); + } + if (count($dirtyShares)) { + $this->config->setUserValue($this->userId, 'files_sharing', 'last_propagate', $time); + $this->changePropagator->propagateChanges(floor($time)); + } + } + + /** + * Get all shares we need to update the etag for + * + * @param array $shares the shares for the users + * @return string[] + */ + protected function getDirtyShares($shares) { + $dirty = []; + $userTime = $this->config->getUserValue($this->userId, 'files_sharing', 'last_propagate', 0); + foreach ($shares as $share) { + $updateTime = $this->config->getAppValue('files_sharing', $share['id'], 0); + if ($updateTime >= $userTime) { + $dirty[] = $share; + } + } + return $dirty; + } + + /** + * @param array $share + * @param int $time + */ + public function markDirty($share, $time = null) { + if ($time === null) { + $time = microtime(true); + } + $this->config->setAppValue('files_sharing', $share['id'], $time); + } + + /** + * Listen on the propagator for updates made to shares owned by a user + * + * @param \OC\Files\Cache\ChangePropagator $propagator + * @param string $owner + */ + public function attachToPropagator(ChangePropagator $propagator, $owner) { + $propagator->listen('\OC\Files', 'propagate', function ($path, $entry) use ($owner) { + $shares = Share::getAllSharesForFileId($entry['fileid']); + foreach ($shares as $share) { + // propagate down the share tree + $this->markDirty($share, microtime(true)); + + // propagate up the share tree + $user = $share['uid_owner']; + $view = new View('/' . $user . '/files'); + $path = $view->getPath($share['file_source']); + $watcher = new ChangeWatcher($view); + $watcher->writeHook(['path' => $path]); + } + }); + } +} |