diff options
-rw-r--r-- | apps/files/tests/ajax_rename.php | 2 | ||||
-rw-r--r-- | apps/files/tests/helper.php | 3 | ||||
-rw-r--r-- | apps/files_external/lib/config/configadapter.php | 5 | ||||
-rw-r--r-- | apps/files_trashbin/lib/helper.php | 6 | ||||
-rw-r--r-- | lib/private/connector/sabre/directory.php | 2 | ||||
-rw-r--r-- | lib/private/connector/sabre/objecttree.php | 6 | ||||
-rw-r--r-- | lib/private/files/fileinfo.php | 21 | ||||
-rw-r--r-- | lib/private/files/mount/mountpoint.php | 33 | ||||
-rw-r--r-- | lib/private/files/node/node.php | 4 | ||||
-rw-r--r-- | lib/private/files/view.php | 43 | ||||
-rw-r--r-- | lib/private/preview.php | 5 | ||||
-rw-r--r-- | lib/public/files/fileinfo.php | 7 | ||||
-rw-r--r-- | lib/public/files/mount/imountpoint.php | 9 | ||||
-rw-r--r-- | tests/lib/connector/sabre/file.php | 16 | ||||
-rw-r--r-- | tests/lib/connector/sabre/objecttree.php | 2 | ||||
-rw-r--r-- | tests/lib/files/node/file.php | 2 | ||||
-rw-r--r-- | tests/lib/files/node/folder.php | 2 | ||||
-rw-r--r-- | tests/lib/files/node/node.php | 2 | ||||
-rw-r--r-- | tests/lib/files/node/root.php | 2 |
19 files changed, 134 insertions, 38 deletions
diff --git a/apps/files/tests/ajax_rename.php b/apps/files/tests/ajax_rename.php index 48aed05823b..1cfecf9e58c 100644 --- a/apps/files/tests/ajax_rename.php +++ b/apps/files/tests/ajax_rename.php @@ -107,7 +107,7 @@ class Test_OC_Files_App_Rename extends \Test\TestCase { 'etag' => 'abcdef', 'directory' => '/', 'name' => 'new_name', - )))); + ), null))); $result = $this->files->rename($dir, $oldname, $newname); diff --git a/apps/files/tests/helper.php b/apps/files/tests/helper.php index 1b7c8eef43a..ea96e41d1d1 100644 --- a/apps/files/tests/helper.php +++ b/apps/files/tests/helper.php @@ -24,7 +24,8 @@ class Test_Files_Helper extends \Test\TestCase { 'mtime' => $mtime, 'type' => $isDir ? 'dir' : 'file', 'mimetype' => $isDir ? 'httpd/unix-directory' : 'application/octet-stream' - ) + ), + null ); } diff --git a/apps/files_external/lib/config/configadapter.php b/apps/files_external/lib/config/configadapter.php index 6294e27a774..de484a44698 100644 --- a/apps/files_external/lib/config/configadapter.php +++ b/apps/files_external/lib/config/configadapter.php @@ -33,10 +33,11 @@ class ConfigAdapter implements IMountProvider { $objectClass = $options['options']['objectstore']['class']; $options['options']['objectstore'] = new $objectClass($options['options']['objectstore']); } + $mountOptions = isset($options['mountOptions']) ? $options['mountOptions'] : []; if (isset($options['personal']) && $options['personal']) { - $mounts[] = new PersonalMount($options['class'], $mountPoint, $options['options'], $loader); + $mounts[] = new PersonalMount($options['class'], $mountPoint, $options['options'], $loader, $mountOptions); } else { - $mounts[] = new MountPoint($options['class'], $mountPoint, $options['options'], $loader); + $mounts[] = new MountPoint($options['class'], $mountPoint, $options['options'], $loader, $mountOptions); } } return $mounts; diff --git a/apps/files_trashbin/lib/helper.php b/apps/files_trashbin/lib/helper.php index c99662480df..d9e69b71aa0 100644 --- a/apps/files_trashbin/lib/helper.php +++ b/apps/files_trashbin/lib/helper.php @@ -31,8 +31,10 @@ class Helper return $result; } - list($storage, $internalPath) = $view->resolvePath($dir); + $mount = $view->getMount($dir); + $storage = $mount->getStorage(); $absoluteDir = $view->getAbsolutePath($dir); + $internalPath = $mount->getInternalPath($absoluteDir); if (is_resource($dirContent)) { $originalLocations = \OCA\Files_Trashbin\Trashbin::getLocations($user); @@ -65,7 +67,7 @@ class Helper if ($originalPath) { $i['extraData'] = $originalPath.'/'.$id; } - $result[] = new FileInfo($absoluteDir . '/' . $i['name'], $storage, $internalPath . '/' . $i['name'], $i); + $result[] = new FileInfo($absoluteDir . '/' . $i['name'], $storage, $internalPath . '/' . $i['name'], $i, $mount); } } closedir($dirContent); diff --git a/lib/private/connector/sabre/directory.php b/lib/private/connector/sabre/directory.php index ec5f82f9daa..bbe0f3452a7 100644 --- a/lib/private/connector/sabre/directory.php +++ b/lib/private/connector/sabre/directory.php @@ -72,7 +72,7 @@ class OC_Connector_Sabre_Directory extends OC_Connector_Sabre_Node $path = $this->fileView->getAbsolutePath($this->path) . '/' . $name; // using a dummy FileInfo is acceptable here since it will be refreshed after the put is complete - $info = new \OC\Files\FileInfo($path, null, null, array()); + $info = new \OC\Files\FileInfo($path, null, null, array(), null); $node = new OC_Connector_Sabre_File($this->fileView, $info); return $node->put($data); } catch (\OCP\Files\StorageNotAvailableException $e) { diff --git a/lib/private/connector/sabre/objecttree.php b/lib/private/connector/sabre/objecttree.php index 14a55b5cada..d2759d7a3ba 100644 --- a/lib/private/connector/sabre/objecttree.php +++ b/lib/private/connector/sabre/objecttree.php @@ -71,7 +71,9 @@ class ObjectTree extends \Sabre\DAV\ObjectTree { if (pathinfo($path, PATHINFO_EXTENSION) === 'part') { // read from storage $absPath = $this->fileView->getAbsolutePath($path); - list($storage, $internalPath) = Filesystem::resolvePath('/' . $absPath); + $mount = $this->fileView->getMount($path); + $storage = $mount->getStorage(); + $internalPath = $mount->getInternalPath($absPath); if ($storage) { /** * @var \OC\Files\Storage\Storage $storage @@ -79,7 +81,7 @@ class ObjectTree extends \Sabre\DAV\ObjectTree { $scanner = $storage->getScanner($internalPath); // get data directly $data = $scanner->getData($internalPath); - $info = new FileInfo($absPath, $storage, $internalPath, $data); + $info = new FileInfo($absPath, $storage, $internalPath, $data, $mount); } else { $info = null; } diff --git a/lib/private/files/fileinfo.php b/lib/private/files/fileinfo.php index 8bab51f0737..e4a397dcca2 100644 --- a/lib/private/files/fileinfo.php +++ b/lib/private/files/fileinfo.php @@ -30,14 +30,23 @@ class FileInfo implements \OCP\Files\FileInfo, \ArrayAccess { private $internalPath; /** + * @var \OCP\Files\Mount\IMountPoint + */ + private $mount; + + /** * @param string|boolean $path * @param Storage\Storage $storage + * @param string $internalPath + * @param array $data + * @param \OCP\Files\Mount\IMountPoint $mount */ - public function __construct($path, $storage, $internalPath, $data) { + public function __construct($path, $storage, $internalPath, $data, $mount) { $this->path = $path; $this->storage = $storage; $this->internalPath = $internalPath; $this->data = $data; + $this->mount = $mount; } public function offsetSet($offset, $value) { @@ -208,6 +217,7 @@ class FileInfo implements \OCP\Files\FileInfo, \ArrayAccess { /** * Check if a file or folder is shared + * * @return bool */ public function isShared() { @@ -229,4 +239,13 @@ class FileInfo implements \OCP\Files\FileInfo, \ArrayAccess { return false; } + + /** + * Get the mountpoint the file belongs to + * + * @return \OCP\Files\Mount\IMountPoint + */ + public function getMountPoint() { + return $this->mount; + } } diff --git a/lib/private/files/mount/mountpoint.php b/lib/private/files/mount/mountpoint.php index b2c50f9d881..77a51a17020 100644 --- a/lib/private/files/mount/mountpoint.php +++ b/lib/private/files/mount/mountpoint.php @@ -20,10 +20,23 @@ class MountPoint implements IMountPoint { protected $storage = null; protected $class; protected $storageId; + + /** + * Configuration options for the storage backend + * + * @var array + */ protected $arguments = array(); protected $mountPoint; /** + * Mount specific options + * + * @var array + */ + protected $mountOptions = array(); + + /** * @var \OC\Files\Storage\StorageFactory $loader */ private $loader; @@ -31,10 +44,11 @@ class MountPoint implements IMountPoint { /** * @param string|\OC\Files\Storage\Storage $storage * @param string $mountpoint - * @param array $arguments (optional)\ + * @param array $arguments (optional) configuration for the storage backend * @param \OCP\Files\Storage\IStorageFactory $loader + * @param array $mountOptions mount specific options */ - public function __construct($storage, $mountpoint, $arguments = null, $loader = null) { + public function __construct($storage, $mountpoint, $arguments = null, $loader = null, $mountOptions = null) { if (is_null($arguments)) { $arguments = array(); } @@ -44,6 +58,10 @@ class MountPoint implements IMountPoint { $this->loader = $loader; } + if (!is_null($mountOptions)) { + $this->mountOptions = $mountOptions; + } + $mountpoint = $this->formatPath($mountpoint); if ($storage instanceof Storage) { $this->class = get_class($storage); @@ -161,4 +179,15 @@ class MountPoint implements IMountPoint { public function wrapStorage($wrapper) { $this->storage = $wrapper($this->mountPoint, $this->getStorage()); } + + /** + * Get a mount option + * + * @param string $name Name of the mount option to get + * @param mixed $default Default value for the mount option + * @return mixed + */ + public function getOption($name, $default) { + return isset($this->mountOptions[$name]) ? $this->mountOptions[$name] : $default; + } } diff --git a/lib/private/files/node/node.php b/lib/private/files/node/node.php index 87d4a4b9156..17907a53044 100644 --- a/lib/private/files/node/node.php +++ b/lib/private/files/node/node.php @@ -288,4 +288,8 @@ class Node implements \OCP\Files\Node, FileInfo { public function isEncrypted() { return $this->getFileInfo()->isEncrypted(); } + + public function getMountPoint() { + return $this->getFileInfo()->getMountPoint(); + } } diff --git a/lib/private/files/view.php b/lib/private/files/view.php index c21ec88ae0c..f1c15e197d9 100644 --- a/lib/private/files/view.php +++ b/lib/private/files/view.php @@ -113,6 +113,19 @@ class View { } /** + * get the mountpoint of the storage object for a path + * ( note: because a storage is not always mounted inside the fakeroot, the + * returned mountpoint is relative to the absolute root of the filesystem + * and doesn't take the chroot into account ) + * + * @param string $path + * @return \OCP\Files\Mount\IMountPoint + */ + public function getMount($path) { + return Filesystem::getMountManager()->find($this->getAbsolutePath($path)); + } + + /** * resolve a path to a storage and internal path * * @param string $path @@ -943,7 +956,7 @@ class View { $data = \OC_FileProxy::runPostProxies('getFileInfo', $path, $data); - return new FileInfo($path, $storage, $internalPath, $data); + return new FileInfo($path, $storage, $internalPath, $data, $mount); } /** @@ -960,8 +973,10 @@ class View { return $result; } $path = $this->getAbsolutePath($directory); - /** @var \OC\Files\Storage\Storage $storage */ - list($storage, $internalPath) = $this->resolvePath($directory); + $path = Filesystem::normalizePath($path); + $mount = $this->getMount($directory); + $storage = $mount->getStorage(); + $internalPath = $mount->getInternalPath($path); if ($storage) { $cache = $storage->getCache($internalPath); $user = \OC_User::getUser(); @@ -995,7 +1010,7 @@ class View { if (\OCP\Util::isSharingDisabledForUser()) { $content['permissions'] = $content['permissions'] & ~\OCP\Constants::PERMISSION_SHARE; } - $files[] = new FileInfo($path . '/' . $content['name'], $storage, $content['path'], $content); + $files[] = new FileInfo($path . '/' . $content['name'], $storage, $content['path'], $content, $mount); } //add a folder for any mountpoint in this directory and add the sizes of other mountpoints to the folders @@ -1003,7 +1018,7 @@ class View { $dirLength = strlen($path); foreach ($mounts as $mount) { $mountPoint = $mount->getMountPoint(); - $subStorage = Filesystem::getStorage($mountPoint); + $subStorage = $mount->getStorage(); if ($subStorage) { $subCache = $subStorage->getCache(''); @@ -1049,7 +1064,7 @@ class View { $content['permissions'] = $content['permissions'] & ~\OCP\Constants::PERMISSION_SHARE; } - $files[] = new FileInfo($path . '/' . $rootEntry['name'], $subStorage, '', $rootEntry); + $files[] = new FileInfo($path . '/' . $rootEntry['name'], $subStorage, '', $rootEntry, $mount); } } } @@ -1159,8 +1174,9 @@ class View { $files = array(); $rootLength = strlen($this->fakeRoot); - $mountPoint = Filesystem::getMountPoint($this->fakeRoot); - $storage = Filesystem::getStorage($mountPoint); + $mount = $this->getMount(''); + $mountPoint = $mount->getMountPoint(); + $storage = $mount->getStorage(); if ($storage) { $cache = $storage->getCache(''); @@ -1170,13 +1186,14 @@ class View { $internalPath = $result['path']; $path = $mountPoint . $result['path']; $result['path'] = substr($mountPoint . $result['path'], $rootLength); - $files[] = new FileInfo($path, $storage, $internalPath, $result); + $files[] = new FileInfo($path, $storage, $internalPath, $result, $mount); } } - $mountPoints = Filesystem::getMountPoints($this->fakeRoot); - foreach ($mountPoints as $mountPoint) { - $storage = Filesystem::getStorage($mountPoint); + $mounts = Filesystem::getMountManager()->findIn($this->fakeRoot); + foreach ($mounts as $mount) { + $mountPoint = $mount->getMountPoint(); + $storage = $mount->getStorage(); if ($storage) { $cache = $storage->getCache(''); @@ -1187,7 +1204,7 @@ class View { $internalPath = $result['path']; $result['path'] = rtrim($relativeMountPoint . $result['path'], '/'); $path = rtrim($mountPoint . $internalPath, '/'); - $files[] = new FileInfo($path, $storage, $internalPath, $result); + $files[] = new FileInfo($path, $storage, $internalPath, $result, $mount); } } } diff --git a/lib/private/preview.php b/lib/private/preview.php index 7305bf1cc0e..a586c94fd11 100644 --- a/lib/private/preview.php +++ b/lib/private/preview.php @@ -922,6 +922,11 @@ class Preview { return false; } + $mount = $file->getMountPoint(); + if ($mount and !$mount->getOption('previews', true)){ + return false; + } + //check if there are preview backends if (empty(self::$providers)) { self::initProviders(); diff --git a/lib/public/files/fileinfo.php b/lib/public/files/fileinfo.php index 3a407ed67ca..ec68ed475c5 100644 --- a/lib/public/files/fileinfo.php +++ b/lib/public/files/fileinfo.php @@ -169,4 +169,11 @@ interface FileInfo { * @return bool */ public function isMounted(); + + /** + * Get the mountpoint the file belongs to + * + * @return \OCP\Files\Mount\IMountPoint + */ + public function getMountPoint(); } diff --git a/lib/public/files/mount/imountpoint.php b/lib/public/files/mount/imountpoint.php index dac634bae4c..af7819ae160 100644 --- a/lib/public/files/mount/imountpoint.php +++ b/lib/public/files/mount/imountpoint.php @@ -55,4 +55,13 @@ interface IMountPoint { * @param callable $wrapper */ public function wrapStorage($wrapper); + + /** + * Get a mount option + * + * @param string $name Name of the mount option to get + * @param mixed $default Default value for the mount option + * @return mixed + */ + public function getOption($name, $default); } diff --git a/tests/lib/connector/sabre/file.php b/tests/lib/connector/sabre/file.php index b4fdd91f512..6bb1b4e75d1 100644 --- a/tests/lib/connector/sabre/file.php +++ b/tests/lib/connector/sabre/file.php @@ -24,7 +24,7 @@ class Test_OC_Connector_Sabre_File extends \Test\TestCase { $info = new \OC\Files\FileInfo('/test.txt', null, null, array( 'permissions'=>\OCP\Constants::PERMISSION_ALL - )); + ), null); $file = new OC_Connector_Sabre_File($view, $info); @@ -59,7 +59,7 @@ class Test_OC_Connector_Sabre_File extends \Test\TestCase { $info = new \OC\Files\FileInfo('/test.txt', null, null, array( 'permissions' => \OCP\Constants::PERMISSION_ALL - )); + ), null); $file = new OC_Connector_Sabre_File($view, $info); @@ -83,7 +83,7 @@ class Test_OC_Connector_Sabre_File extends \Test\TestCase { $info = new \OC\Files\FileInfo('/super*star.txt', null, null, array( 'permissions' => \OCP\Constants::PERMISSION_ALL - )); + ), null); $file = new OC_Connector_Sabre_File($view, $info); // action @@ -104,7 +104,7 @@ class Test_OC_Connector_Sabre_File extends \Test\TestCase { $info = new \OC\Files\FileInfo('/super*star.txt', null, null, array( 'permissions' => \OCP\Constants::PERMISSION_ALL - )); + ), null); $file = new OC_Connector_Sabre_File($view, $info); $file->setName('/super*star.txt'); } @@ -136,7 +136,7 @@ class Test_OC_Connector_Sabre_File extends \Test\TestCase { $info = new \OC\Files\FileInfo('/test.txt', null, null, array( 'permissions' => \OCP\Constants::PERMISSION_ALL - )); + ), null); $file = new OC_Connector_Sabre_File($view, $info); @@ -158,7 +158,7 @@ class Test_OC_Connector_Sabre_File extends \Test\TestCase { $info = new \OC\Files\FileInfo('/test.txt', null, null, array( 'permissions' => \OCP\Constants::PERMISSION_ALL - )); + ), null); $file = new OC_Connector_Sabre_File($view, $info); @@ -176,7 +176,7 @@ class Test_OC_Connector_Sabre_File extends \Test\TestCase { $info = new \OC\Files\FileInfo('/test.txt', null, null, array( 'permissions' => 0 - )); + ), null); $file = new OC_Connector_Sabre_File($view, $info); @@ -199,7 +199,7 @@ class Test_OC_Connector_Sabre_File extends \Test\TestCase { $info = new \OC\Files\FileInfo('/test.txt', null, null, array( 'permissions' => \OCP\Constants::PERMISSION_ALL - )); + ), null); $file = new OC_Connector_Sabre_File($view, $info); diff --git a/tests/lib/connector/sabre/objecttree.php b/tests/lib/connector/sabre/objecttree.php index d1de46d2ee7..2548066214b 100644 --- a/tests/lib/connector/sabre/objecttree.php +++ b/tests/lib/connector/sabre/objecttree.php @@ -101,7 +101,7 @@ class ObjectTree extends \Test\TestCase { private function moveTest($source, $dest, $updatables, $deletables) { $view = new TestDoubleFileView($updatables, $deletables); - $info = new FileInfo('', null, null, array()); + $info = new FileInfo('', null, null, array(), null); $rootDir = new OC_Connector_Sabre_Directory($view, $info); $objectTree = $this->getMock('\OC\Connector\Sabre\ObjectTree', diff --git a/tests/lib/files/node/file.php b/tests/lib/files/node/file.php index a1d2266edf7..e3b8019b4ca 100644 --- a/tests/lib/files/node/file.php +++ b/tests/lib/files/node/file.php @@ -22,7 +22,7 @@ class File extends \Test\TestCase { } protected function getFileInfo($data) { - return new FileInfo('', null, '', $data); + return new FileInfo('', null, '', $data, null); } public function testDelete() { diff --git a/tests/lib/files/node/folder.php b/tests/lib/files/node/folder.php index e69a2776979..bcd9cc93b5e 100644 --- a/tests/lib/files/node/folder.php +++ b/tests/lib/files/node/folder.php @@ -25,7 +25,7 @@ class Folder extends \Test\TestCase { } protected function getFileInfo($data) { - return new FileInfo('', null, '', $data); + return new FileInfo('', null, '', $data, null); } public function testDelete() { diff --git a/tests/lib/files/node/node.php b/tests/lib/files/node/node.php index 4697479ba95..49a2006c767 100644 --- a/tests/lib/files/node/node.php +++ b/tests/lib/files/node/node.php @@ -19,7 +19,7 @@ class Node extends \Test\TestCase { } protected function getFileInfo($data) { - return new FileInfo('', null, '', $data); + return new FileInfo('', null, '', $data, null); } public function testStat() { diff --git a/tests/lib/files/node/root.php b/tests/lib/files/node/root.php index 35bd462157e..a763428209c 100644 --- a/tests/lib/files/node/root.php +++ b/tests/lib/files/node/root.php @@ -21,7 +21,7 @@ class Root extends \Test\TestCase { } protected function getFileInfo($data) { - return new FileInfo('', null, '', $data); + return new FileInfo('', null, '', $data, null); } public function testGet() { |