Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/server.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVincent Petry <pvince81@owncloud.com>2016-04-27 13:47:04 +0300
committerVincent Petry <pvince81@owncloud.com>2016-05-20 18:56:02 +0300
commit8343cfb64b8297035987bc4980ec72015c8e1a04 (patch)
tree812f44ba113313e7537779bcce4c04cf736e4cad /lib/private/SystemTag
parent59a85a4c76b80658d9373e3acf4f71b872b244a0 (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.php2
-rw-r--r--lib/private/SystemTag/SystemTagManager.php74
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']);
}