]> source.dussan.org Git - nextcloud-server.git/commitdiff
make sure that we always create a public share key for remote shares
authorBjoern Schiessle <schiessle@owncloud.com>
Thu, 29 Jan 2015 12:09:44 +0000 (13:09 +0100)
committerBjoern Schiessle <schiessle@owncloud.com>
Thu, 29 Jan 2015 13:23:14 +0000 (14:23 +0100)
apps/files_encryption/lib/util.php
apps/files_encryption/tests/share.php
lib/private/share/share.php

index b300999ff24e2ffa0af52064ea6fe353fc4c4753..14d0a0bc4b9ce2453d955dda8898f2ef679fae34 100644 (file)
@@ -1109,7 +1109,7 @@ class Util {
                        // Find out who, if anyone, is sharing the file
                        $result = \OCP\Share::getUsersSharingFile($ownerPath, $owner);
                        $userIds = \array_merge($userIds, $result['users']);
-                       if ($result['public']) {
+                       if ($result['public'] || $result['remote']) {
                                $userIds[] = $this->publicShareKeyId;
                        }
 
index 8ecdbabed3912cb1ec2c2c28d168a887af1471a0..5632607319b08b95d555a51ed2f94a4da48bc1f3 100755 (executable)
@@ -89,6 +89,8 @@ class Share extends TestCase {
 
                // login as first user
                self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1);
+
+               $this->createMocks();
        }
 
        protected function tearDown() {
@@ -99,6 +101,8 @@ class Share extends TestCase {
                        \OC_App::disable('files_trashbin');
                }
 
+               $this->restoreHttpHelper();
+
                parent::tearDown();
        }
 
@@ -115,18 +119,43 @@ class Share extends TestCase {
                parent::tearDownAfterClass();
        }
 
-       /**
-        * @medium
-        */
-       function testDeclineServer2ServerShare() {
-
+       private function createMocks() {
                $config = $this->getMockBuilder('\OCP\IConfig')
                                ->disableOriginalConstructor()->getMock();
                $certificateManager = $this->getMock('\OCP\ICertificateManager');
                $httpHelperMock = $this->getMockBuilder('\OC\HTTPHelper')
                                ->setConstructorArgs(array($config, $certificateManager))
                                ->getMock();
-               $httpHelperMock->expects($this->once())->method('post')->with($this->anything())->will($this->returnValue(true));
+               $httpHelperMock->expects($this->any())->method('post')->with($this->anything())->will($this->returnValue(array('success' => true, 'result' => "{'ocs' : { 'meta' : { 'statuscode' : 100 }}}")));
+
+               $this->registerHttpHelper($httpHelperMock);
+       }
+
+       /**
+        * Register an http helper mock for testing purposes.
+        * @param $httpHelper http helper mock
+        */
+       private function registerHttpHelper($httpHelper) {
+               $this->oldHttpHelper = \OC::$server->query('HTTPHelper');
+               \OC::$server->registerService('HTTPHelper', function ($c) use ($httpHelper) {
+                       return $httpHelper;
+               });
+       }
+
+       /**
+        * Restore the original http helper
+        */
+       private function restoreHttpHelper() {
+               $oldHttpHelper = $this->oldHttpHelper;
+               \OC::$server->registerService('HTTPHelper', function ($c) use ($oldHttpHelper) {
+                       return $oldHttpHelper;
+               });
+       }
+
+       /**
+        * @medium
+        */
+       function testDeclineServer2ServerShare() {
 
                self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1);
 
@@ -167,11 +196,9 @@ class Share extends TestCase {
 
                $share = $query->fetch();
 
-               $this->registerHttpHelper($httpHelperMock);
                $_POST['token'] = $token;
                $s2s = new \OCA\Files_Sharing\API\Server2Server();
                $s2s->declineShare(array('id' => $share['id']));
-               $this->restoreHttpHelper();
 
                $this->assertFalse($this->view->file_exists(
                        '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/'
@@ -179,28 +206,6 @@ class Share extends TestCase {
 
        }
 
-
-       /**
-        * Register an http helper mock for testing purposes.
-        * @param $httpHelper http helper mock
-        */
-       private function registerHttpHelper($httpHelper) {
-               $this->oldHttpHelper = \OC::$server->query('HTTPHelper');
-               \OC::$server->registerService('HTTPHelper', function ($c) use ($httpHelper) {
-                       return $httpHelper;
-               });
-       }
-
-       /**
-        * Restore the original http helper
-        */
-       private function restoreHttpHelper() {
-               $oldHttpHelper = $this->oldHttpHelper;
-               \OC::$server->registerService('HTTPHelper', function ($c) use ($oldHttpHelper) {
-                       return $oldHttpHelper;
-               });
-       }
-
        /**
         * @medium
         * @param bool $withTeardown
@@ -607,7 +612,63 @@ class Share extends TestCase {
        }
 
 
-       function testPublicShareFile() {
+       function testRemoteShareFile() {
+               // login as admin
+               //self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1);
+
+               // save file with content
+               $cryptedFile = file_put_contents('crypt:///' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files/'  . $this->filename, $this->dataShort);
+
+               // test that data was successfully written
+               $this->assertTrue(is_int($cryptedFile));
+
+               // disable encryption proxy to prevent recursive calls
+               $proxyStatus = \OC_FileProxy::$enabled;
+               \OC_FileProxy::$enabled = false;
+
+               // get the file info from previous created file
+               $fileInfo = $this->view->getFileInfo(
+                       '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files/' . $this->filename);
+
+               // check if we have a valid file info
+               $this->assertTrue($fileInfo instanceof \OC\Files\FileInfo);
+
+               // check if the unencrypted file size is stored
+               $this->assertGreaterThan(0, $fileInfo['unencrypted_size']);
+
+               // re-enable the file proxy
+               \OC_FileProxy::$enabled = $proxyStatus;
+
+               // share the file
+               \OCP\Share::shareItem('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_REMOTE, 'user1@server1', \OCP\Constants::PERMISSION_ALL);
+
+               $publicShareKeyId = \OC::$server->getAppConfig()->getValue('files_encryption', 'publicShareKeyId');
+
+               // check if share key for public exists
+               $this->assertTrue($this->view->file_exists(
+                       '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/'
+                       . $this->filename . '/' . $publicShareKeyId . '.shareKey'));
+
+               // unshare the file
+               \OCP\Share::unshare('file', $fileInfo['fileid'], \OCP\Share::SHARE_TYPE_REMOTE, 'user1@server1');
+
+               // check if share key not exists
+               $this->assertFalse($this->view->file_exists(
+                       '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/'
+                       . $this->filename . '/' . $publicShareKeyId . '.shareKey'));
+
+               // cleanup
+               $this->view->chroot('/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files/');
+               $this->view->unlink($this->filename);
+               $this->view->chroot('/');
+
+               // check if share key not exists
+               $this->assertFalse($this->view->file_exists(
+                       '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '/files_encryption/keys/'
+                       . $this->filename . '/' . self::TEST_ENCRYPTION_SHARE_USER1 . '.shareKey'));
+       }
+
+               function testPublicShareFile() {
                // login as admin
                self::loginHelper(self::TEST_ENCRYPTION_SHARE_USER1);
 
index c9f9654203ee891c6de31d5d9b79e0e623288473..6901e1cfecfd86f6517f4f0169c449bb8d61a9bb 100644 (file)
@@ -103,6 +103,7 @@ class Share extends \OC\Share\Constants {
 
                $shares = $sharePaths = $fileTargets = array();
                $publicShare = false;
+               $remoteShare = false;
                $source = -1;
                $cache = false;
 
@@ -170,18 +171,16 @@ class Share extends \OC\Share\Constants {
 
                        //check for public link shares
                        if (!$publicShare) {
-                               $query = \OC_DB::prepare(
-                                       'SELECT `share_with`
-                                       FROM
-                                       `*PREFIX*share`
-                                       WHERE
-                                       `item_source` = ? AND `share_type` = ? AND `item_type` IN (\'file\', \'folder\')'
+                               $query = \OC_DB::prepare('
+                                       SELECT `share_with`
+                                       FROM `*PREFIX*share`
+                                       WHERE `item_source` = ? AND `share_type` = ? AND `item_type` IN (\'file\', \'folder\')', 1
                                );
 
                                $result = $query->execute(array($source, self::SHARE_TYPE_LINK));
 
                                if (\OCP\DB::isError($result)) {
-                                       \OCP\Util::writeLog('OCP\Share', \OC_DB::getErrorMessage($result), \OC_Log::ERROR);
+                                       \OCP\Util::writeLog('OCP\Share', \OC_DB::getErrorMessage($result), \OCP\Util::ERROR);
                                } else {
                                        if ($result->fetchRow()) {
                                                $publicShare = true;
@@ -189,6 +188,25 @@ class Share extends \OC\Share\Constants {
                                }
                        }
 
+                       //check for remote share
+                       if (!$remoteShare) {
+                               $query = \OC_DB::prepare('
+                                       SELECT `share_with`
+                                       FROM `*PREFIX*share`
+                                       WHERE `item_source` = ? AND `share_type` = ? AND `item_type` IN (\'file\', \'folder\')', 1
+                               );
+
+                               $result = $query->execute(array($source, self::SHARE_TYPE_REMOTE));
+
+                               if (\OCP\DB::isError($result)) {
+                                       \OCP\Util::writeLog('OCP\Share', \OC_DB::getErrorMessage($result), \OCP\Util::ERROR);
+                               } else {
+                                       if ($result->fetchRow()) {
+                                               $remoteShare = true;
+                                       }
+                               }
+                       }
+
                        // let's get the parent for the next round
                        $meta = $cache->get((int)$source);
                        if($meta !== false) {
@@ -234,7 +252,7 @@ class Share extends \OC\Share\Constants {
                        return $sharePaths;
                }
 
-               return array("users" => array_unique($shares), "public" => $publicShare);
+               return array('users' => array_unique($shares), 'public' => $publicShare, 'remote' => $remoteShare);
        }
 
        /**
@@ -2280,7 +2298,7 @@ class Share extends \OC\Share\Constants {
                if ($user && $remote) {
                        $url = $remote . self::BASE_PATH_TO_SHARE_API . '?format=' . self::RESPONSE_FORMAT;
 
-                       $local = \OC::$server->getURLGenerator()->getAbsoluteURL('');
+                       $local = \OC::$server->getURLGenerator()->getAbsoluteURL('/');
 
                        $fields = array(
                                'shareWith' => $user,