]> source.dussan.org Git - nextcloud-server.git/commitdiff
fix(psalm): systemtags 37609/head
authorJohn Molakvoæ <skjnldsv@protonmail.com>
Fri, 28 Apr 2023 08:59:34 +0000 (10:59 +0200)
committerJohn Molakvoæ <skjnldsv@protonmail.com>
Fri, 28 Apr 2023 10:23:52 +0000 (12:23 +0200)
Signed-off-by: John Molakvoæ <skjnldsv@protonmail.com>
apps/dav/lib/SystemTag/SystemTagList.php
apps/dav/lib/SystemTag/SystemTagMappingNode.php
apps/dav/lib/SystemTag/SystemTagNode.php
apps/dav/lib/SystemTag/SystemTagPlugin.php
apps/dav/lib/SystemTag/SystemTagsByIdCollection.php
apps/dav/lib/SystemTag/SystemTagsObjectMappingCollection.php
apps/dav/lib/SystemTag/SystemTagsObjectTypeCollection.php
apps/dav/tests/unit/SystemTag/SystemTagPluginTest.php
lib/public/SystemTag/ISystemTagManager.php

index 67d33b9701ead85f10686a4a113e8f5a3322202d..678c8042a394b557b24ae3e63ba18f34f8abf457 100644 (file)
@@ -1,10 +1,8 @@
 <?php
 /**
- * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @copyright Copyright (c) 2023 Robin Appelman <robin@icewind.nl>
  *
- * @author Christoph Wurst <christoph@winzerhof-wurst.at>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- * @author Vincent Petry <vincent@nextcloud.com>
+ * @author Robin Appelman <robin@icewind.nl>
  *
  * @license AGPL-3.0
  *
@@ -19,7 +17,6 @@
  *
  * You should have received a copy of the GNU Affero General Public License, version 3,
  * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
  */
 namespace OCA\DAV\SystemTag;
 
@@ -49,7 +46,10 @@ class SystemTagList implements Element {
                $this->user = $user;
        }
 
-       public function getTags() {
+       /**
+        * @return ISystemTag[]
+        */
+       public function getTags(): array {
                return $this->tags;
        }
 
index 344ff1dbc70a903c953778aca1198de83197e781..9762b6e1db931f67953e7619dddb6477931acc65 100644 (file)
@@ -137,6 +137,8 @@ class SystemTagMappingNode implements \Sabre\DAV\INode {
         * @param string $name The new name
         *
         * @throws MethodNotAllowed not allowed to rename node
+        *
+        * @return never
         */
        public function setName($name) {
                throw new MethodNotAllowed();
@@ -145,6 +147,7 @@ class SystemTagMappingNode implements \Sabre\DAV\INode {
        /**
         * Returns null, not supported
         *
+        * @return null
         */
        public function getLastModified() {
                return null;
@@ -152,6 +155,8 @@ class SystemTagMappingNode implements \Sabre\DAV\INode {
 
        /**
         * Delete tag to object association
+        *
+        * @return void
         */
        public function delete() {
                try {
index a31deb59a93a8ebfea2ee5ff647fc2ffebc316a6..7310cdb19a2e5b9baf44975b1cb626d40ceba5c3 100644 (file)
@@ -103,6 +103,8 @@ class SystemTagNode implements \Sabre\DAV\INode {
         * @param string $name The new name
         *
         * @throws MethodNotAllowed not allowed to rename node
+        *
+        * @return never
         */
        public function setName($name) {
                throw new MethodNotAllowed();
@@ -114,11 +116,12 @@ class SystemTagNode implements \Sabre\DAV\INode {
         * @param string $name new tag name
         * @param bool $userVisible user visible
         * @param bool $userAssignable user assignable
+        *
         * @throws NotFound whenever the given tag id does not exist
         * @throws Forbidden whenever there is no permission to update said tag
         * @throws Conflict whenever a tag already exists with the given attributes
         */
-       public function update($name, $userVisible, $userAssignable) {
+       public function update($name, $userVisible, $userAssignable): void {
                try {
                        if (!$this->tagManager->canUserSeeTag($this->tag, $this->user)) {
                                throw new NotFound('Tag with id ' . $this->tag->getId() . ' does not exist');
@@ -151,11 +154,15 @@ class SystemTagNode implements \Sabre\DAV\INode {
        /**
         * Returns null, not supported
         *
+        * @return null
         */
        public function getLastModified() {
                return null;
        }
 
+       /**
+        * @return void
+        */
        public function delete() {
                try {
                        if (!$this->isAdmin) {
index 5fe1c013571037d4644c646e3e341e941d28da57..c5c828cfbff30618bad7da65cb12b9e9c42bc498 100644 (file)
@@ -28,6 +28,7 @@ namespace OCA\DAV\SystemTag;
 use OCA\DAV\Connector\Sabre\Directory;
 use OCA\DAV\Connector\Sabre\Node;
 use OCP\IGroupManager;
+use OCP\IUser;
 use OCP\IUserSession;
 use OCP\SystemTag\ISystemTag;
 use OCP\SystemTag\ISystemTagManager;
@@ -81,9 +82,9 @@ class SystemTagPlugin extends \Sabre\DAV\ServerPlugin {
         */
        protected $groupManager;
 
-       /** @var array<int, int[]> */
+       /** @var array<int, string[]> */
        private array $cachedTagMappings = [];
-       /** @var array<int, ISystemTag> */
+       /** @var array<string, ISystemTag> */
        private array $cachedTags = [];
 
        private ISystemTagObjectMapper $tagMapper;
@@ -225,6 +226,8 @@ class SystemTagPlugin extends \Sabre\DAV\ServerPlugin {
         *
         * @param PropFind $propFind
         * @param \Sabre\DAV\INode $node
+        *
+        * @return void
         */
        public function handleGetProperties(
                PropFind $propFind,
@@ -279,16 +282,19 @@ class SystemTagPlugin extends \Sabre\DAV\ServerPlugin {
                if ($node instanceof Directory
                        && $propFind->getDepth() !== 0
                        && !is_null($propFind->getStatus(self::SYSTEM_TAGS_PROPERTYNAME))) {
+                       $fileIds = [$node->getId()];
+
                        // note: pre-fetching only supported for depth <= 1
                        $folderContent = $node->getNode()->getDirectoryListing();
-                       $fileIds[] = (int)$node->getId();
                        foreach ($folderContent as $info) {
-                               $fileIds[] = (int)$info->getId();
+                               $fileIds[] = $info->getId();
                        }
+
                        $tags = $this->tagMapper->getTagIdsForObjects($fileIds, 'files');
 
                        $this->cachedTagMappings = $this->cachedTagMappings + $tags;
                        $emptyFileIds = array_diff($fileIds, array_keys($tags));
+
                        // also cache the ones that were not found
                        foreach ($emptyFileIds as $fileId) {
                                $this->cachedTagMappings[$fileId] = [];
@@ -296,8 +302,13 @@ class SystemTagPlugin extends \Sabre\DAV\ServerPlugin {
                }
 
                $propFind->handle(self::SYSTEM_TAGS_PROPERTYNAME, function () use ($node) {
-                       $tags = $this->getTagsForFile($node->getId());
-                       return new SystemTagList($tags, $this->tagManager, $this->userSession->getUser());
+                       $user = $this->userSession->getUser();
+                       if ($user === null) {
+                               return;
+                       }
+       
+                       $tags = $this->getTagsForFile($node->getId(), $user);
+                       return new SystemTagList($tags, $this->tagManager, $user);
                });
        }
 
@@ -305,8 +316,8 @@ class SystemTagPlugin extends \Sabre\DAV\ServerPlugin {
         * @param int $fileId
         * @return ISystemTag[]
         */
-       private function getTagsForFile(int $fileId): array {
-               $user = $this->userSession->getUser();
+       private function getTagsForFile(int $fileId, IUser $user): array {
+
                if (isset($this->cachedTagMappings[$fileId])) {
                        $tagIds = $this->cachedTagMappings[$fileId];
                } else {
@@ -318,13 +329,15 @@ class SystemTagPlugin extends \Sabre\DAV\ServerPlugin {
                                $tagIds = [];
                        }
                }
-               $tags = array_filter(array_map(function($tagId) {
+
+               $tags = array_filter(array_map(function(string $tagId) {
                        return $this->cachedTags[$tagId] ?? null;
                }, $tagIds));
 
-               $uncachedTagIds = array_filter($tagIds, function($tagId): bool {
+               $uncachedTagIds = array_filter($tagIds, function(string $tagId): bool {
                        return !isset($this->cachedTags[$tagId]);
                });
+
                if (count($uncachedTagIds)) {
                        $retrievedTags = $this->tagManager->getTagsByIds($uncachedTagIds);
                        foreach ($retrievedTags as $tag) {
@@ -332,6 +345,7 @@ class SystemTagPlugin extends \Sabre\DAV\ServerPlugin {
                        }
                        $tags += $retrievedTags;
                }
+
                return array_filter($tags, function(ISystemTag $tag) use ($user) {
                        return $this->tagManager->canUserSeeTag($tag, $user);
                });
index 1256c58921e8f920c99cc3df580ddd7e7ead880d..86ccadf5f56d90587e073f0dcf57c56dbb0cb4f1 100644 (file)
@@ -84,7 +84,10 @@ class SystemTagsByIdCollection implements ICollection {
        /**
         * @param string $name
         * @param resource|string $data Initial payload
+        *
         * @throws Forbidden
+        *
+        * @return never
         */
        public function createFile($name, $data = null) {
                throw new Forbidden('Cannot create tags by id');
@@ -92,6 +95,8 @@ class SystemTagsByIdCollection implements ICollection {
 
        /**
         * @param string $name
+        *
+        * @return never
         */
        public function createDirectory($name) {
                throw new Forbidden('Permission denied to create collections');
@@ -99,6 +104,8 @@ class SystemTagsByIdCollection implements ICollection {
 
        /**
         * @param string $name
+        *
+        * @return SystemTagNode
         */
        public function getChild($name) {
                try {
@@ -115,6 +122,11 @@ class SystemTagsByIdCollection implements ICollection {
                }
        }
 
+       /**
+        * @return SystemTagNode[]
+        *
+        * @psalm-return array<SystemTagNode>
+        */
        public function getChildren() {
                $visibilityFilter = true;
                if ($this->isAdmin()) {
@@ -145,14 +157,25 @@ class SystemTagsByIdCollection implements ICollection {
                }
        }
 
+       /**
+        * @return never
+        */
        public function delete() {
                throw new Forbidden('Permission denied to delete this collection');
        }
 
+       /**
+        * @return string
+        *
+        * @psalm-return 'systemtags'
+        */
        public function getName() {
                return 'systemtags';
        }
 
+       /**
+        * @return never
+        */
        public function setName($name) {
                throw new Forbidden('Permission denied to rename this collection');
        }
@@ -160,7 +183,7 @@ class SystemTagsByIdCollection implements ICollection {
        /**
         * Returns the last modification time, as a unix timestamp
         *
-        * @return int
+        * @return null
         */
        public function getLastModified() {
                return null;
index 8bb34182b0c2b39525ee403cf9593d99a4f94884..4d73c17d7dd19ba324d682be3918160e29aa2f6e 100644 (file)
@@ -92,6 +92,9 @@ class SystemTagsObjectMappingCollection implements ICollection {
                $this->user = $user;
        }
 
+       /**
+        * @return void
+        */
        public function createFile($name, $data = null) {
                $tagId = $name;
                try {
@@ -110,10 +113,16 @@ class SystemTagsObjectMappingCollection implements ICollection {
                }
        }
 
+       /**
+        * @return never
+        */
        public function createDirectory($name) {
                throw new Forbidden('Permission denied to create collections');
        }
 
+       /**
+        * @return SystemTagMappingNode
+        */
        public function getChild($tagName) {
                try {
                        if ($this->tagMapper->haveTag([$this->objectId], $this->objectType, $tagName, true)) {
@@ -131,6 +140,11 @@ class SystemTagsObjectMappingCollection implements ICollection {
                }
        }
 
+       /**
+        * @return SystemTagMappingNode[]
+        *
+        * @psalm-return list<SystemTagMappingNode>
+        */
        public function getChildren() {
                $tagIds = current($this->tagMapper->getTagIdsForObjects([$this->objectId], $this->objectType));
                if (empty($tagIds)) {
@@ -168,6 +182,9 @@ class SystemTagsObjectMappingCollection implements ICollection {
                }
        }
 
+       /**
+        * @return never
+        */
        public function delete() {
                throw new Forbidden('Permission denied to delete this collection');
        }
@@ -176,6 +193,9 @@ class SystemTagsObjectMappingCollection implements ICollection {
                return $this->objectId;
        }
 
+       /**
+        * @return never
+        */
        public function setName($name) {
                throw new Forbidden('Permission denied to rename this collection');
        }
@@ -183,7 +203,7 @@ class SystemTagsObjectMappingCollection implements ICollection {
        /**
         * Returns the last modification time, as a unix timestamp
         *
-        * @return int
+        * @return null
         */
        public function getLastModified() {
                return null;
index 1ca45c32ce46b36ae664acd1b6c8d63995cf7531..3fa40278cdbfb4535fdad2f0ac3456eabd030528 100644 (file)
@@ -98,7 +98,9 @@ class SystemTagsObjectTypeCollection implements ICollection {
        /**
         * @param string $name
         * @param resource|string $data Initial payload
-        * @return null|string
+        *
+        * @return never
+        *
         * @throws Forbidden
         */
        public function createFile($name, $data = null) {
@@ -107,7 +109,10 @@ class SystemTagsObjectTypeCollection implements ICollection {
 
        /**
         * @param string $name
+        *
         * @throws Forbidden
+        *
+        * @return never
         */
        public function createDirectory($name) {
                throw new Forbidden('Permission denied to create collections');
@@ -133,6 +138,9 @@ class SystemTagsObjectTypeCollection implements ICollection {
                );
        }
 
+       /**
+        * @return never
+        */
        public function getChildren() {
                // do not list object ids
                throw new MethodNotAllowed();
@@ -148,6 +156,9 @@ class SystemTagsObjectTypeCollection implements ICollection {
                return call_user_func($this->childExistsFunction, $name);
        }
 
+       /**
+        * @return never
+        */
        public function delete() {
                throw new Forbidden('Permission denied to delete this collection');
        }
@@ -158,7 +169,10 @@ class SystemTagsObjectTypeCollection implements ICollection {
 
        /**
         * @param string $name
+        *
         * @throws Forbidden
+        *
+        * @return never
         */
        public function setName($name) {
                throw new Forbidden('Permission denied to rename this collection');
@@ -167,7 +181,7 @@ class SystemTagsObjectTypeCollection implements ICollection {
        /**
         * Returns the last modification time, as a unix timestamp
         *
-        * @return int
+        * @return null
         */
        public function getLastModified() {
                return null;
index 199bf28fb7da2e4258339c182143e7196f38161f..8341c6ca0092239ff38f457c685980b73ca3e481 100644 (file)
@@ -85,7 +85,10 @@ class SystemTagPluginTest extends \Test\TestCase {
         */
        private $plugin;
 
-       private ISystemTagObjectMapper $tagMapper;
+       /**
+        * @var ISystemTagObjectMapper
+        */
+       private $tagMapper;
 
        protected function setUp(): void {
                parent::setUp();
@@ -111,7 +114,8 @@ class SystemTagPluginTest extends \Test\TestCase {
                        ->expects($this->any())
                        ->method('isLoggedIn')
                        ->willReturn(true);
-               $this->tagMapper = $this->getMockBuilder(ISystemTagObjectMapper::class);
+               $this->tagMapper = $this->getMockBuilder(ISystemTagObjectMapper::class)
+                       ->getMock();
 
                $this->plugin = new \OCA\DAV\SystemTag\SystemTagPlugin(
                        $this->tagManager,
index 9918e3a4f9964177463f618388fb3f55c807c013..1cf7263b456190f47518215a52827d05536fd3e6 100644 (file)
@@ -125,7 +125,7 @@ interface ISystemTagManager {
         * @param ISystemTag $tag tag to check permission for
         * @param IUser $user user to check permission for
         *
-        * @return true if the user is allowed to assign/unassign the tag, false otherwise
+        * @return bool true if the user is allowed to assign/unassign the tag, false otherwise
         *
         * @since 9.1.0
         */
@@ -137,7 +137,7 @@ interface ISystemTagManager {
         * @param ISystemTag $tag tag to check permission for
         * @param IUser $user user to check permission for
         *
-        * @return true if the user can see the tag, false otherwise
+        * @return bool true if the user can see the tag, false otherwise
         *
         * @since 9.1.0
         */