From: Vincent Petry Date: Thu, 26 Mar 2015 18:24:37 +0000 (+0100) Subject: Make sure mountOptions keep their data type X-Git-Tag: v8.1.0alpha1~149^2 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=58b4c2c0e53ff5ef6e261426ecb2b94d9791da71;p=nextcloud-server.git Make sure mountOptions keep their data type str_replace for $user substitution was converting the data type of mountOptions to string. This fix prevents this to happen by making sure only strings are processed by substitution. Also added a int conversion when reading the watcher policy --- diff --git a/apps/files_external/lib/config.php b/apps/files_external/lib/config.php index 85a93a779ae..d72955fc472 100644 --- a/apps/files_external/lib/config.php +++ b/apps/files_external/lib/config.php @@ -146,8 +146,6 @@ class OC_Mount_Config { public static function getAbsoluteMountPoints($user) { $mountPoints = array(); - $datadir = \OC_Config::getValue("datadirectory", \OC::$SERVERROOT . "/data"); - $backends = self::getBackends(); // Load system mount points @@ -277,12 +275,21 @@ class OC_Mount_Config { /** * fill in the correct values for $user * - * @param string $user - * @param string $input + * @param string $user user value + * @param string|array $input * @return string */ private static function setUserVars($user, $input) { - return str_replace('$user', $user, $input); + if (is_array($input)) { + foreach ($input as &$value) { + if (is_string($value)) { + $value = str_replace('$user', $user, $value); + } + } + } else { + $input = str_replace('$user', $user, $input); + } + return $input; } diff --git a/apps/files_external/tests/mountconfig.php b/apps/files_external/tests/mountconfig.php index 645f0c64e11..4bc8429db23 100644 --- a/apps/files_external/tests/mountconfig.php +++ b/apps/files_external/tests/mountconfig.php @@ -120,7 +120,6 @@ class Test_Mount_Config extends \Test\TestCase { private $dataDir; private $userHome; private $oldAllowedBackends; - private $allBackends; const TEST_USER1 = 'user1'; const TEST_USER2 = 'user2'; @@ -210,6 +209,11 @@ class Test_Mount_Config extends \Test\TestCase { return json_decode(file_get_contents($configFile), true); } + private function writeGlobalConfig($config) { + $configFile = $this->dataDir . '/mount.json'; + file_put_contents($configFile, json_encode($config)); + } + /** * Reads the user config, for checking */ @@ -627,6 +631,51 @@ class Test_Mount_Config extends \Test\TestCase { $this->assertEquals($mountConfig, $savedMountConfig); } + public function testVariableSubstitution() { + $legacyBackendOptions = [ + 'user' => 'someuser', + 'password' => 'somepassword', + 'replacethis' => '$user', + ]; + $legacyBackendOptions = \OC_Mount_Config::encryptPasswords($legacyBackendOptions); + + $legacyConfig = [ + 'class' => '\OC\Files\Storage\SMB', + 'options' => $legacyBackendOptions, + 'mountOptions' => ['preview' => false, 'int' => 1], + ]; + // different mount options + $legacyConfig2 = [ + 'class' => '\OC\Files\Storage\SMB', + 'options' => $legacyBackendOptions, + 'mountOptions' => ['preview' => true, 'string' => 'abc'], + ]; + + $json = [ + 'user' => [ + self::TEST_USER1 => [ + '/$user/files/somemount' => $legacyConfig, + '/$user/files/anothermount' => $legacyConfig2, + ], + ], + ]; + + $this->writeGlobalConfig($json); + + // re-read config, password was read correctly + $config = OC_Mount_Config::getAbsoluteMountPoints(self::TEST_USER1); + + $config1 = $config['/' . self::TEST_USER1 . '/files/somemount']; + $config2 = $config['/' . self::TEST_USER1 . '/files/anothermount']; + + $this->assertSame(self::TEST_USER1, $config1['options']['replacethis']); + $this->assertSame(self::TEST_USER1, $config1['options']['replacethis']); + $this->assertSame(1, $config1['mountOptions']['int']); + $this->assertSame(true, $config2['mountOptions']['preview']); + $this->assertSame('abc', $config2['mountOptions']['string']); + } + + public function mountDataProvider() { return array( // Tests for visible mount points diff --git a/lib/private/files/storage/common.php b/lib/private/files/storage/common.php index 11cf3405fd9..10abf87f151 100644 --- a/lib/private/files/storage/common.php +++ b/lib/private/files/storage/common.php @@ -333,7 +333,7 @@ abstract class Common implements \OC\Files\Storage\Storage { if (!isset($this->watcher)) { $this->watcher = new Watcher($storage); $globalPolicy = \OC::$server->getConfig()->getSystemValue('filesystem_check_changes', Watcher::CHECK_ONCE); - $this->watcher->setPolicy($this->getMountOption('filesystem_check_changes', $globalPolicy)); + $this->watcher->setPolicy((int)$this->getMountOption('filesystem_check_changes', $globalPolicy)); } return $this->watcher; }