diff options
author | Vincent Petry <pvince81@owncloud.com> | 2016-04-27 13:47:04 +0300 |
---|---|---|
committer | Vincent Petry <pvince81@owncloud.com> | 2016-05-20 18:56:02 +0300 |
commit | 8343cfb64b8297035987bc4980ec72015c8e1a04 (patch) | |
tree | 812f44ba113313e7537779bcce4c04cf736e4cad /lib/private/SystemTag | |
parent | 59a85a4c76b80658d9373e3acf4f71b872b244a0 (diff) |
Add interface methods for permission check
Instead of checking for admin perm, use interface method
canUserAssignTag and canUserSeeTag to check for permissions.
Allows for more flexible implementation.
Diffstat (limited to 'lib/private/SystemTag')
-rw-r--r-- | lib/private/SystemTag/ManagerFactory.php | 2 | ||||
-rw-r--r-- | lib/private/SystemTag/SystemTagManager.php | 74 |
2 files changed, 75 insertions, 1 deletions
diff --git a/lib/private/SystemTag/ManagerFactory.php b/lib/private/SystemTag/ManagerFactory.php index d9acf327f8a..e6938e494bc 100644 --- a/lib/private/SystemTag/ManagerFactory.php +++ b/lib/private/SystemTag/ManagerFactory.php @@ -59,6 +59,8 @@ class ManagerFactory implements ISystemTagManagerFactory { public function getManager() { return new SystemTagManager( $this->serverContainer->getDatabaseConnection(), + $this->serverContainer->getUserManager(), + $this->serverContainer->getGroupManager(), $this->serverContainer->getEventDispatcher() ); } diff --git a/lib/private/SystemTag/SystemTagManager.php b/lib/private/SystemTag/SystemTagManager.php index 76a60a91328..0e4bdad078e 100644 --- a/lib/private/SystemTag/SystemTagManager.php +++ b/lib/private/SystemTag/SystemTagManager.php @@ -30,7 +30,14 @@ use OCP\SystemTag\ManagerEvent; use OCP\SystemTag\TagAlreadyExistsException; use OCP\SystemTag\TagNotFoundException; use Symfony\Component\EventDispatcher\EventDispatcherInterface; +use OCP\IUserManager; +use OCP\IGroupManager; +use OCP\SystemTag\ISystemTag; +use OCP\UserNotFoundException; +/** + * Manager class for system tags + */ class SystemTagManager implements ISystemTagManager { const TAG_TABLE = 'systemtag'; @@ -41,6 +48,12 @@ class SystemTagManager implements ISystemTagManager { /** @var EventDispatcherInterface */ protected $dispatcher; + /** @var IUserManager */ + protected $userManager; + + /** @var IGroupManager */ + protected $groupManager; + /** * Prepared query for selecting tags directly * @@ -54,8 +67,15 @@ class SystemTagManager implements ISystemTagManager { * @param IDBConnection $connection database connection * @param EventDispatcherInterface $dispatcher */ - public function __construct(IDBConnection $connection, EventDispatcherInterface $dispatcher) { + public function __construct( + IDBConnection $connection, + IUserManager $userManager, + IGroupManager $groupManager, + EventDispatcherInterface $dispatcher + ) { $this->connection = $connection; + $this->userManager = $userManager; + $this->groupManager = $groupManager; $this->dispatcher = $dispatcher; $query = $this->connection->getQueryBuilder(); @@ -316,6 +336,58 @@ class SystemTagManager implements ISystemTagManager { } } + /** + * {@inheritdoc} + */ + public function canUserAssignTag($tag, $userId) { + if (!$tag instanceof ISystemTag) { + $tags = $this->getTagsByIds([$tag]); + /** @var ISystemTag $tag */ + $tag = current($tags); + } + + if ($tag->isUserAssignable()) { + return true; + } + + $user = $this->userManager->get($userId); + if ($user === null) { + throw new UserNotFoundException($userId); + } + + if ($this->groupManager->isAdmin($userId)) { + return true; + } + + return false; + } + + /** + * {@inheritdoc} + */ + public function canUserSeeTag($tag, $userId) { + if (!$tag instanceof ISystemTag) { + $tags = $this->getTagsByIds([$tag]); + /** @var ISystemTag $tag */ + $tag = current($tags); + } + + if ($tag->isUserVisible()) { + return true; + } + + $user = $this->userManager->get($userId); + if ($user === null) { + throw new UserNotFoundException($userId); + } + + if ($this->groupManager->isAdmin($userId)) { + return true; + } + + return false; + } + private function createSystemTagFromRow($row) { return new SystemTag((int)$row['id'], $row['name'], (bool)$row['visibility'], (bool)$row['editable']); } |