Properly expose read only public shares as read only

This commit is contained in:
Robin Appelman 2014-06-12 17:53:56 +02:00 committed by Bjoern Schiessle
parent 87e311b996
commit e7b58ed2bd
5 changed files with 102 additions and 0 deletions

View File

@ -33,6 +33,13 @@ $linkItem = $data['linkItem'];
// Load the files
$path = $data['realPath'];
$isWritable = $linkItem['permissions'] & \OCP\PERMISSION_CREATE;
if (!$isWritable) {
\OC\Files\Filesystem::addStorageWrapper('readonly', function ($mountPoint, $storage) {
return new \OCA\Files_Sharing\ReadOnlyWrapper(array('storage' => $storage));
});
}
$rootInfo = \OC\Files\Filesystem::getFileInfo($path);
$rootView = new \OC\Files\View('');

View File

@ -14,6 +14,10 @@ class Scanner extends \OC\Files\Cache\Scanner {
*/
protected $storage;
public function scan($path, $recursive = self::SCAN_RECURSIVE, $reuse = -1) {
$this->scanAll();
}
public function scanAll() {
$remote = $this->storage->getRemote();
$token = $this->storage->getToken();

View File

@ -0,0 +1,27 @@
<?php
/**
* Copyright (c) 2014 Robin Appelman <icewind@owncloud.com>
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/
namespace OCA\Files_Sharing;
use OC\Files\Cache\Cache;
class ReadOnlyCache extends Cache {
public function get($path) {
$data = parent::get($path);
$data['permissions'] &= (\OCP\PERMISSION_READ | \OCP\PERMISSION_SHARE);
return $data;
}
public function getFolderContents($path) {
$content = parent::getFolderContents($path);
foreach ($content as &$data) {
$data['permissions'] &= (\OCP\PERMISSION_READ | \OCP\PERMISSION_SHARE);
}
return $content;
}
}

View File

@ -0,0 +1,56 @@
<?php
/**
* Copyright (c) 2014 Robin Appelman <icewind@owncloud.com>
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
*/
namespace OCA\Files_Sharing;
use OC\Files\Storage\Wrapper\Wrapper;
class ReadOnlyWrapper extends Wrapper {
public function isUpdatable($path) {
return false;
}
public function isCreatable($path) {
return false;
}
public function isDeletable($path) {
return false;
}
public function getPermissions($path) {
return $this->storage->getPermissions($path) & (\OCP\PERMISSION_READ | \OCP\PERMISSION_SHARE);
}
public function rename($path1, $path2) {
return false;
}
public function touch($path, $mtime = null) {
return false;
}
public function mkdir($path) {
return false;
}
public function rmdir($path) {
return false;
}
public function unlink($path) {
return false;
}
public function getCache($path = '', $storage = null) {
if (!$storage) {
$storage = $this;
}
return new ReadOnlyCache($storage);
}
}

View File

@ -37,7 +37,15 @@ $server->addPlugin(new OC_Connector_Sabre_ExceptionLoggerPlugin('webdav'));
$server->subscribeEvent('beforeMethod', function () use ($server, $objectTree, $authBackend) {
$share = $authBackend->getShare();
$owner = $share['uid_owner'];
$isWritable = $share['permissions'];
$fileId = $share['file_source'];
if (!$isWritable) {
\OC\Files\Filesystem::addStorageWrapper('readonly', function ($mountPoint, $storage) {
return new \OCA\Files_Sharing\ReadOnlyWrapper(array('storage' => $storage));
});
}
OC_Util::setupFS($owner);
$ownerView = \OC\Files\Filesystem::getView();
$path = $ownerView->getPath($fileId);