]> source.dussan.org Git - nextcloud-server.git/commitdiff
perf(federation): Only request root share info for checking availability
authorJulius Härtl <jus@bitgrid.net>
Tue, 31 Jan 2023 07:48:45 +0000 (08:48 +0100)
committerJulius Härtl <jus@bitgrid.net>
Tue, 31 Jan 2023 10:41:34 +0000 (11:41 +0100)
Otherwise this would request a full recursive dirctory listing while the result is never being used

Signed-off-by: Julius Härtl <jus@bitgrid.net>
apps/files_sharing/lib/Controller/ShareInfoController.php
apps/files_sharing/lib/External/Storage.php

index b090e6efcf1832785dab3a423b659e2087f5b6d0..2b8373af1cd769e3dbbc6b28c45db7d82afe401b 100644 (file)
@@ -65,7 +65,7 @@ class ShareInfoController extends ApiController {
         * @param ?string $dir
         * @return JSONResponse
         */
-       public function info(string $t, ?string $password = null, ?string $dir = null) {
+       public function info(string $t, ?string $password = null, ?string $dir = null, int $depth = -1) {
                try {
                        $share = $this->shareManager->getShareByToken($t);
                } catch (ShareNotFound $e) {
@@ -96,28 +96,32 @@ class ShareInfoController extends ApiController {
                        }
                }
 
-               return new JSONResponse($this->parseNode($node, $permissionMask));
+               return new JSONResponse($this->parseNode($node, $permissionMask, $depth));
        }
 
-       private function parseNode(Node $node, int $permissionMask) {
+       private function parseNode(Node $node, int $permissionMask, int $depth) {
                if ($node instanceof File) {
                        return $this->parseFile($node, $permissionMask);
                }
-               return $this->parseFolder($node, $permissionMask);
+               return $this->parseFolder($node, $permissionMask, $depth);
        }
 
        private function parseFile(File $file, int $permissionMask) {
                return $this->format($file, $permissionMask);
        }
 
-       private function parseFolder(Folder $folder, int $permissionMask) {
+       private function parseFolder(Folder $folder, int $permissionMask, int $depth) {
                $data = $this->format($folder, $permissionMask);
 
+               if ($depth === 0) {
+                       return $data;
+               }
+
                $data['children'] = [];
 
                $nodes = $folder->getDirectoryListing();
                foreach ($nodes as $node) {
-                       $data['children'][] = $this->parseNode($node, $permissionMask);
+                       $data['children'][] = $this->parseNode($node, $permissionMask, $depth <= -1 ? -1 : $depth - 1);
                }
 
                return $data;
index 43568ea6a2b01e05ca409e2938a11d63f7a412f1..f33334ca3466dea8f79918d6daa0235a7b15b079 100644 (file)
@@ -214,7 +214,7 @@ class Storage extends DAV implements ISharedStorage, IDisableEncryptionStorage,
        public function checkStorageAvailability() {
                // see if we can find out why the share is unavailable
                try {
-                       $this->getShareInfo();
+                       $this->getShareInfo(0);
                } catch (NotFoundException $e) {
                        // a 404 can either mean that the share no longer exists or there is no Nextcloud on the remote
                        if ($this->testRemote()) {
@@ -308,7 +308,7 @@ class Storage extends DAV implements ISharedStorage, IDisableEncryptionStorage,
         * @throws NotFoundException
         * @throws \Exception
         */
-       public function getShareInfo() {
+       public function getShareInfo(int $depth = -1) {
                $remote = $this->getRemote();
                $token = $this->getToken();
                $password = $this->getPassword();
@@ -331,7 +331,7 @@ class Storage extends DAV implements ISharedStorage, IDisableEncryptionStorage,
                $client = \OC::$server->getHTTPClientService()->newClient();
                try {
                        $response = $client->post($url, [
-                               'body' => ['password' => $password],
+                               'body' => ['password' => $password, 'depth' => $depth],
                                'timeout' => 10,
                                'connect_timeout' => 10,
                        ]);