]> source.dussan.org Git - nextcloud-server.git/commitdiff
Properly expose read only public shares as read only
authorRobin Appelman <icewind@owncloud.com>
Thu, 12 Jun 2014 15:53:56 +0000 (17:53 +0200)
committerBjoern Schiessle <schiessle@owncloud.com>
Sat, 14 Jun 2014 08:14:08 +0000 (10:14 +0200)
apps/files_sharing/ajax/shareinfo.php
apps/files_sharing/lib/external/scanner.php
apps/files_sharing/lib/readonlycache.php [new file with mode: 0644]
apps/files_sharing/lib/readonlywrapper.php [new file with mode: 0644]
apps/files_sharing/publicwebdav.php

index 4aefdbe7b15e1db79150b3e635643cb383961016..c5764867d56be83e2b373a86f2c5e17aba3777f0 100644 (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('');
 
index 1f32d79b14956230d8dc68f8ea3a95e968f55c89..8fb8683ed922361768f351a97589020f89abc264 100644 (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();
diff --git a/apps/files_sharing/lib/readonlycache.php b/apps/files_sharing/lib/readonlycache.php
new file mode 100644 (file)
index 0000000..f129ca4
--- /dev/null
@@ -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;
+       }
+}
diff --git a/apps/files_sharing/lib/readonlywrapper.php b/apps/files_sharing/lib/readonlywrapper.php
new file mode 100644 (file)
index 0000000..45ed3fd
--- /dev/null
@@ -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);
+       }
+}
index b4f56eed89cb6993c40692ac5bf363b7ecf8e756..f33b920bc54e2a5f5320cc38f724e300d769bc80 100644 (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);