]> source.dussan.org Git - nextcloud-server.git/commitdiff
finally fix the paths for the OCS Share API
authorBjoern Schiessle <schiessle@owncloud.com>
Wed, 12 Mar 2014 10:00:30 +0000 (11:00 +0100)
committerBjoern Schiessle <schiessle@owncloud.com>
Thu, 13 Mar 2014 14:16:59 +0000 (15:16 +0100)
apps/files_sharing/lib/api.php
apps/files_sharing/tests/api.php
lib/public/share.php

index 7adbcab2f9b93e8ea679f416b707769e456acf4e..de3c1cd2630a3d9f0dd932eab28b57e26732b554 100644 (file)
@@ -98,8 +98,14 @@ class Api {
                                                break;
                                        }
                                }
+                       } else {
+                               $path = $params['path'];
+                               foreach ($shares as $key => $share) {
+                                       $shares[$key]['path'] = $path;
+                               }
                        }
 
+
                        // include also reshares in the lists. This means that the result
                        // will contain every user with access to the file.
                        if (isset($params['reshares']) && $params['reshares'] === true) {
@@ -107,8 +113,10 @@ class Api {
                        }
 
                        if ($receivedFrom) {
-                               $shares['received_from'] = $receivedFrom['uid_owner'];
-                               $shares['received_from_displayname'] = \OCP\User::getDisplayName($receivedFrom['uid_owner']);
+                               foreach ($shares as $key => $share) {
+                                       $shares[$key]['received_from'] = $receivedFrom['uid_owner'];
+                                       $shares[$key]['received_from_displayname'] = \OCP\User::getDisplayName($receivedFrom['uid_owner']);
+                               }
                        }
                } else {
                        $shares = null;
@@ -174,9 +182,10 @@ class Api {
                        $share = \OCP\Share::getItemShared($itemType, $file['fileid']);
                        if($share) {
                                $receivedFrom =  \OCP\Share::getItemSharedWithBySource($itemType, $file['fileid']);
+                               reset($share);
+                               $key = key($share);
+                               $share[$key]['path'] = self::correctPath($share[$key]['path'], $path);
                                if ($receivedFrom) {
-                                       reset($share);
-                                       $key = key($share);
                                        $share[$key]['received_from'] = $receivedFrom['uid_owner'];
                                        $share[$key]['received_from_displayname'] = \OCP\User::getDisplayName($receivedFrom['uid_owner']);
                                }
@@ -522,4 +531,15 @@ class Api {
 
        }
 
+       /**
+        * @brief make sure that the path has the correct root
+        *
+        * @param string $path path returned from the share API
+        * @param string $folder current root folder
+        * @return string the correct path
+        */
+       protected static function correctPath($path, $folder) {
+               return \OC_Filesystem::normalizePath('/' . $folder . '/' . basename($path));
+       }
+
 }
index 30deb07c5b958da2f2814d913ad05413a1a2db41..e2bbb548182498f8c08b6d3c551cefb45fd3a91f 100644 (file)
@@ -477,7 +477,90 @@ class Test_Files_Sharing_Api extends Test_Files_Sharing_Base {
 
        }
 
-               /**
+       /**
+        * @brief test multiple shared folder if the path gets constructed correctly
+        * @medium
+        */
+       function testGetShareMultipleSharedFolder() {
+
+               self::loginHelper(self::TEST_FILES_SHARING_API_USER1);
+
+               $fileInfo1 = $this->view->getFileInfo($this->folder);
+               $fileInfo2 = $this->view->getFileInfo($this->folder . $this->subfolder);
+
+
+               // share sub-folder to user2
+               $result = \OCP\Share::shareItem('folder', $fileInfo2['fileid'], \OCP\Share::SHARE_TYPE_USER,
+                               \Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2, 31);
+
+               // share was successful?
+               $this->assertTrue($result);
+
+               // share folder to user2
+               $result = \OCP\Share::shareItem('folder', $fileInfo1['fileid'], \OCP\Share::SHARE_TYPE_USER,
+                               \Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2, 31);
+
+               // share was successful?
+               $this->assertTrue($result);
+
+
+               // login as user2
+               self::loginHelper(self::TEST_FILES_SHARING_API_USER2);
+
+               $result = \OCP\Share::shareItem('folder', $fileInfo2['fileid'], \OCP\Share::SHARE_TYPE_LINK, null, 1);
+               // share was successful?
+               $this->assertTrue(is_string($result));
+
+
+               // ask for shared/subfolder
+               $expectedPath1 = '/Shared' . $this->subfolder;
+               $_GET['path'] = $expectedPath1;
+
+               $result1 = Share\Api::getAllShares(array());
+
+               $this->assertTrue($result1->succeeded());
+
+               // test should return one share within $this->folder
+               $data1 = $result1->getData();
+               $share1 = reset($data1);
+
+               // ask for shared/folder/subfolder
+               $expectedPath2 = '/Shared' . $this->folder . $this->subfolder;
+               $_GET['path'] = $expectedPath2;
+
+               $result2 = Share\Api::getAllShares(array());
+
+               $this->assertTrue($result2->succeeded());
+
+               // test should return one share within $this->folder
+               $data2 = $result2->getData();
+               $share2 = reset($data2);
+
+
+               // validate results
+               // we should get exactly one result each time
+               $this->assertEquals(1, count($data1));
+               $this->assertEquals(1, count($data2));
+
+               $this->assertEquals($expectedPath1, $share1['path']);
+               $this->assertEquals($expectedPath2, $share2['path']);
+
+
+               // cleanup
+               $result = \OCP\Share::unshare('folder', $fileInfo2['fileid'], \OCP\Share::SHARE_TYPE_LINK, null);
+               $this->assertTrue($result);
+
+               self::loginHelper(self::TEST_FILES_SHARING_API_USER1);
+               $result = \OCP\Share::unshare('folder', $fileInfo1['fileid'], \OCP\Share::SHARE_TYPE_USER,
+                               \Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2);
+               $this->assertTrue($result);
+               $result = \OCP\Share::unshare('folder', $fileInfo2['fileid'], \OCP\Share::SHARE_TYPE_USER,
+                               \Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2);
+               $this->assertTrue($result);
+
+       }
+
+       /**
         * @brief test re-re-share of folder if the path gets constructed correctly
         * @medium
         */
@@ -784,4 +867,24 @@ class Test_Files_Sharing_Api extends Test_Files_Sharing_Base {
                $this->assertTrue($result3->succeeded());
 
        }
+
+       function testCorrectPath() {
+               $path = "/foo/bar/test.txt";
+               $folder = "/correct/path";
+               $expectedResult = "/correct/path/test.txt";
+
+               $shareApiDummy = new TestShareApi();
+
+               $this->assertSame($expectedResult, $shareApiDummy->correctPathTest($path, $folder));
+       }
+
+}
+
+/**
+ * @brief dumnmy class to test protected methods
+ */
+class TestShareApi extends \OCA\Files\Share\Api {
+       public function correctPathTest($path, $folder) {
+               return self::correctPath($path, $folder);
+}
 }
index dd9e1bbf9a95e800a445906044da7e19acf3385d..5066d40354d21b699da27da04a00857383e47445 100644 (file)
@@ -1250,10 +1250,12 @@ class Share {
                        // Remove root from file source paths if retrieving own shared items
                        if (isset($uidOwner) && isset($row['path'])) {
                                if (isset($row['parent'])) {
+                                       // FIXME: Doesn't always construct the correct path, example:
+                                       // Folder '/a/b', share '/a' and '/a/b' to user2
+                                       // user2 reshares /Shared/b and ask for share status of /Shared/a/b
+                                       // expected result: path=/Shared/a/b; actual result /Shared/b because of the parent
                                        $query = \OC_DB::prepare('SELECT `file_target` FROM `*PREFIX*share` WHERE `id` = ?');
                                        $parentResult = $query->execute(array($row['parent']));
-                                       //$query = \OC_DB::prepare('SELECT `file_target` FROM `*PREFIX*share` WHERE `id` = ?');
-                                       //$parentResult = $query->execute(array($row['id']));
                                        if (\OC_DB::isError($result)) {
                                                \OC_Log::write('OCP\Share', 'Can\'t select parent: ' .
                                                                \OC_DB::getErrorMessage($result) . ', select=' . $select . ' where=' . $where,