summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--apps/files/tests/ajax_rename.php2
-rw-r--r--apps/files/tests/helper.php3
-rw-r--r--apps/files_external/lib/config/configadapter.php5
-rw-r--r--apps/files_trashbin/lib/helper.php6
-rw-r--r--lib/private/connector/sabre/directory.php2
-rw-r--r--lib/private/connector/sabre/objecttree.php6
-rw-r--r--lib/private/files/fileinfo.php21
-rw-r--r--lib/private/files/mount/mountpoint.php33
-rw-r--r--lib/private/files/node/node.php4
-rw-r--r--lib/private/files/view.php43
-rw-r--r--lib/private/preview.php5
-rw-r--r--lib/public/files/fileinfo.php7
-rw-r--r--lib/public/files/mount/imountpoint.php9
-rw-r--r--tests/lib/connector/sabre/file.php16
-rw-r--r--tests/lib/connector/sabre/objecttree.php2
-rw-r--r--tests/lib/files/node/file.php2
-rw-r--r--tests/lib/files/node/folder.php2
-rw-r--r--tests/lib/files/node/node.php2
-rw-r--r--tests/lib/files/node/root.php2
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() {