]> source.dussan.org Git - nextcloud-server.git/commitdiff
Also check the scope when reading operations from the database 36819/head
authorJoas Schilling <coding@schilljs.com>
Wed, 15 Feb 2023 14:36:32 +0000 (15:36 +0100)
committerJoas Schilling <coding@schilljs.com>
Thu, 23 Feb 2023 05:23:53 +0000 (06:23 +0100)
Signed-off-by: Joas Schilling <coding@schilljs.com>
apps/workflowengine/lib/Manager.php
apps/workflowengine/tests/ManagerTest.php

index c2e78ad85cf79384f67d096a13a4a6f6afd88dea..e2a107ebe189f5712c533f0bd3bfcaee1ee9118d 100644 (file)
@@ -181,6 +181,13 @@ class Manager implements IManager {
                        return $scopesByOperation[$operationClass];
                }
 
+               try {
+                       /** @var IOperation $operation */
+                       $operation = $this->container->query($operationClass);
+               } catch (QueryException $e) {
+                       return [];
+               }
+
                $query = $this->connection->getQueryBuilder();
 
                $query->selectDistinct('s.type')
@@ -195,6 +202,11 @@ class Manager implements IManager {
                $scopesByOperation[$operationClass] = [];
                while ($row = $result->fetch()) {
                        $scope = new ScopeContext($row['type'], $row['value']);
+
+                       if (!$operation->isAvailableForScope((int) $row['type'])) {
+                               continue;
+                       }
+
                        $scopesByOperation[$operationClass][$scope->getHash()] = $scope;
                }
 
@@ -224,6 +236,17 @@ class Manager implements IManager {
 
                $this->operations[$scopeContext->getHash()] = [];
                while ($row = $result->fetch()) {
+                       try {
+                               /** @var IOperation $operation */
+                               $operation = $this->container->query($row['class']);
+                       } catch (QueryException $e) {
+                               continue;
+                       }
+
+                       if (!$operation->isAvailableForScope((int) $row['scope_type'])) {
+                               continue;
+                       }
+
                        if (!isset($this->operations[$scopeContext->getHash()][$row['class']])) {
                                $this->operations[$scopeContext->getHash()][$row['class']] = [];
                        }
index 97772eeadb84478036befde322237ac0d766935e..1cf933856fe5d37653c3dc34e89ee55f08b7bbaf 100644 (file)
@@ -25,6 +25,7 @@ use OC\L10N\L10N;
 use OCA\WorkflowEngine\Entity\File;
 use OCA\WorkflowEngine\Helper\ScopeContext;
 use OCA\WorkflowEngine\Manager;
+use OCP\AppFramework\QueryException;
 use OCP\EventDispatcher\IEventDispatcher;
 use OCP\Files\IRootFolder;
 use OCP\IConfig;
@@ -194,6 +195,32 @@ class ManagerTest extends TestCase {
                $userScope = $this->buildScope('jackie');
                $entity = File::class;
 
+               $adminOperation = $this->createMock(IOperation::class);
+               $adminOperation->expects($this->any())
+                       ->method('isAvailableForScope')
+                       ->willReturnMap([
+                               [IManager::SCOPE_ADMIN, true],
+                               [IManager::SCOPE_USER, false],
+                       ]);
+               $userOperation = $this->createMock(IOperation::class);
+               $userOperation->expects($this->any())
+                       ->method('isAvailableForScope')
+                       ->willReturnMap([
+                               [IManager::SCOPE_ADMIN, false],
+                               [IManager::SCOPE_USER, true],
+                       ]);
+
+               $this->container->expects($this->any())
+                       ->method('query')
+                       ->willReturnCallback(function ($className) use ($adminOperation, $userOperation) {
+                               switch ($className) {
+                                       case 'OCA\WFE\TestAdminOp':
+                                               return $adminOperation;
+                                       case 'OCA\WFE\TestUserOp':
+                                               return $userOperation;
+                               }
+                       });
+
                $opId1 = $this->invokePrivate(
                        $this->manager,
                        'insertOperation',
@@ -214,6 +241,13 @@ class ManagerTest extends TestCase {
                );
                $this->invokePrivate($this->manager, 'addScope', [$opId3, $userScope]);
 
+               $opId4 = $this->invokePrivate(
+                       $this->manager,
+                       'insertOperation',
+                       ['OCA\WFE\TestAdminOp', 'Test04', [41, 10, 4], 'NoBar', $entity, []]
+               );
+               $this->invokePrivate($this->manager, 'addScope', [$opId4, $userScope]);
+
                $adminOps = $this->manager->getAllOperations($adminScope);
                $userOps = $this->manager->getAllOperations($userScope);
 
@@ -264,6 +298,25 @@ class ManagerTest extends TestCase {
                );
                $this->invokePrivate($this->manager, 'addScope', [$opId5, $userScope]);
 
+               $operation = $this->createMock(IOperation::class);
+               $operation->expects($this->any())
+                       ->method('isAvailableForScope')
+                       ->willReturnMap([
+                               [IManager::SCOPE_ADMIN, true],
+                               [IManager::SCOPE_USER, true],
+                       ]);
+
+               $this->container->expects($this->any())
+                       ->method('query')
+                       ->willReturnCallback(function ($className) use ($operation) {
+                               switch ($className) {
+                                       case 'OCA\WFE\TestOp':
+                                               return $operation;
+                                       case 'OCA\WFE\OtherTestOp':
+                                               throw new QueryException();
+                               }
+                       });
+
                $adminOps = $this->manager->getOperations('OCA\WFE\TestOp', $adminScope);
                $userOps = $this->manager->getOperations('OCA\WFE\TestOp', $userScope);