]> source.dussan.org Git - nextcloud-server.git/commitdiff
Add server<->server sharing backend
authorRobin Appelman <icewind@owncloud.com>
Tue, 29 Apr 2014 13:14:48 +0000 (15:14 +0200)
committerBjoern Schiessle <schiessle@owncloud.com>
Sat, 14 Jun 2014 08:10:37 +0000 (10:10 +0200)
13 files changed:
apps/files_external/lib/webdav.php
apps/files_sharing/appinfo/app.php
apps/files_sharing/appinfo/database.xml [new file with mode: 0644]
apps/files_sharing/appinfo/version
apps/files_sharing/lib/external/cache.php [new file with mode: 0644]
apps/files_sharing/lib/external/manager.php [new file with mode: 0644]
apps/files_sharing/lib/external/storage.php [new file with mode: 0644]
apps/files_sharing/lib/isharedstorage.php [new file with mode: 0644]
lib/private/connector/sabre/directory.php
lib/private/connector/sabre/objecttree.php
lib/private/files/cache/cache.php
lib/private/helper.php
lib/private/share/share.php

index 525f41c127651469e1d1a29b9fcaf0f6a2e598e0..3614b05e9793813bf6de486bc42daf6f152b5345 100644 (file)
@@ -9,13 +9,13 @@
 namespace OC\Files\Storage;
 
 class DAV extends \OC\Files\Storage\Common {
-       private $password;
-       private $user;
-       private $host;
-       private $secure;
-       private $root;
-       private $certPath;
-       private $ready;
+       protected $password;
+       protected $user;
+       protected $host;
+       protected $secure;
+       protected $root;
+       protected $certPath;
+       protected $ready;
        /**
         * @var \Sabre\DAV\Client
         */
index 6b40ba921ccc4211889b524a69a6f7279633a78d..9ea969f4cf36244cb7f8e27463594f55a69fcebe 100644 (file)
@@ -11,6 +11,15 @@ OC::$CLASSPATH['OC\Files\Cache\Shared_Watcher'] = 'files_sharing/lib/watcher.php
 OC::$CLASSPATH['OCA\Files\Share\Api'] = 'files_sharing/lib/api.php';
 OC::$CLASSPATH['OCA\Files\Share\Maintainer'] = 'files_sharing/lib/maintainer.php';
 OC::$CLASSPATH['OCA\Files\Share\Proxy'] = 'files_sharing/lib/proxy.php';
+
+$externalManager = new \OCA\Files_Sharing\External\Manager(
+       \OC::$server->getDatabaseConnection(),
+       \OC\Files\Filesystem::getMountManager(),
+       \OC\Files\Filesystem::getLoader(),
+       \OC::$server->getUserSession()
+);
+$externalManager->setup();
+
 OCP\Util::connectHook('OC_Filesystem', 'setup', '\OC\Files\Storage\Shared', 'setup');
 OCP\Share::registerBackend('file', 'OC_Share_Backend_File');
 OCP\Share::registerBackend('folder', 'OC_Share_Backend_Folder', 'file');
diff --git a/apps/files_sharing/appinfo/database.xml b/apps/files_sharing/appinfo/database.xml
new file mode 100644 (file)
index 0000000..b9c0d88
--- /dev/null
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<database>
+       <name>*dbname*</name>
+       <create>true</create>
+       <overwrite>false</overwrite>
+       <charset>utf8</charset>
+       <table>
+               <name>*dbprefix*share_external</name>
+               <declaration>
+                       <field>
+                               <name>id</name>
+                               <type>integer</type>
+                               <default>0</default>
+                               <notnull>true</notnull>
+                               <autoincrement>1</autoincrement>
+                               <length>4</length>
+                       </field>
+                       <field>
+                               <name>remote</name>
+                               <type>text</type>
+                               <notnull>true</notnull>
+                               <length>128</length>
+                       </field>
+                       <field>
+                               <name>token</name>
+                               <type>text</type>
+                               <notnull>true</notnull>
+                               <length>64</length>
+                       </field>
+                       <field>
+                               <name>password</name>
+                               <type>text</type>
+                               <notnull>true</notnull>
+                               <length>64</length>
+                       </field>
+                       <field>
+                               <name>name</name>
+                               <type>text</type>
+                               <notnull>true</notnull>
+                               <length>64</length>
+                       </field>
+                       <field>
+                               <name>owner</name>
+                               <type>text</type>
+                               <notnull>true</notnull>
+                               <length>64</length>
+                       </field>
+                       <field>
+                               <name>user</name>
+                               <type>text</type>
+                               <notnull>true</notnull>
+                               <length>64</length>
+                       </field>
+                       <field>
+                               <name>mountpoint</name>
+                               <type>text</type>
+                               <notnull>true</notnull>
+                               <length>512</length>
+                       </field>
+                       <field>
+                               <name>mountpoint_hash</name>
+                               <type>text</type>
+                               <notnull>true</notnull>
+                               <length>32</length>
+                       </field>
+                       <index>
+                               <name>sh_external_user</name>
+                               <field>
+                                       <name>user</name>
+                                       <sorting>ascending</sorting>
+                               </field>
+                       </index>
+                       <index>
+                               <name>sh_external_mp</name>
+                               <unique>true</unique>
+                               <field>
+                                       <name>mountpoint_hash</name>
+                                       <sorting>ascending</sorting>
+                               </field>
+                       </index>
+               </declaration>
+       </table>
+</database>
index 2eb3c4fe4eebcdea3da0790cc0ba74cb286ec4f4..4b9fcbec101a6ff8ec68e0f95131ccda4861407f 100644 (file)
@@ -1 +1 @@
-0.5
+0.5.1
diff --git a/apps/files_sharing/lib/external/cache.php b/apps/files_sharing/lib/external/cache.php
new file mode 100644 (file)
index 0000000..cd06bfb
--- /dev/null
@@ -0,0 +1,47 @@
+<?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\External;
+
+class Cache extends \OC\Files\Cache\Cache {
+       private $remote;
+       private $remoteUser;
+       private $storage;
+
+       /**
+        * @param \OCA\Files_Sharing\External\Storage $storage
+        * @param string $remote
+        * @param string $remoteUser
+        */
+       public function __construct($storage, $remote, $remoteUser) {
+               $this->storage = $storage;
+               list(, $remote) = explode('://', $remote, 2);
+               $this->remote = $remote;
+               $this->remoteUser = $remoteUser;
+               parent::__construct($storage);
+       }
+
+       public function get($file) {
+               $result = parent::get($file);
+               $result['displayname_owner'] = $this->remoteUser . '@' . $this->remote;
+               if (!$file || $file === '') {
+                       $result['is_share_mount_point'] = true;
+                       $mountPoint = rtrim($this->storage->getMountPoint());
+                       $result['name'] = basename($mountPoint);
+               }
+               return $result;
+       }
+
+       public function getFolderContentsById($id) {
+               $results = parent::getFolderContentsById($id);
+               foreach ($results as &$file) {
+                       $file['displayname_owner'] = $this->remoteUser . '@' . $this->remote;
+               }
+               return $results;
+       }
+}
diff --git a/apps/files_sharing/lib/external/manager.php b/apps/files_sharing/lib/external/manager.php
new file mode 100644 (file)
index 0000000..ffb6737
--- /dev/null
@@ -0,0 +1,90 @@
+<?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\External;
+
+use OC\Files\Mount\Mount;
+
+class Manager {
+       const STORAGE = '\OCA\Files_Sharing\External\Storage';
+
+       /**
+        * @var \OCP\IDBConnection
+        */
+       private $connection;
+
+       /**
+        * @var \OC\Files\Mount\Manager
+        */
+       private $mountManager;
+
+       /**
+        * @var \OC\Files\Storage\Loader
+        */
+       private $storageLoader;
+
+       /**
+        * @var \OC\User\Session
+        */
+       private $userSession;
+
+       /**
+        * @param \OCP\IDBConnection $connection
+        * @param \OC\Files\Mount\Manager $mountManager
+        * @param \OC\User\Session $userSession
+        * @param \OC\Files\Storage\Loader $storageLoader
+        */
+       public function __construct(\OCP\IDBConnection $connection, \OC\Files\Mount\Manager $mountManager,
+                                                               \OC\Files\Storage\Loader $storageLoader, \OC\User\Session $userSession) {
+               $this->connection = $connection;
+               $this->mountManager = $mountManager;
+               $this->userSession = $userSession;
+               $this->storageLoader = $storageLoader;
+       }
+
+       public function setup() {
+               $user = $this->userSession->getUser();
+               if ($user) {
+                       $query = $this->connection->prepare('SELECT `remote`, `token`, `password`, `mountpoint`, `owner`
+                       FROM *PREFIX*share_external WHERE `user` = ?');
+                       $query->execute(array($user->getUID()));
+
+                       while ($row = $query->fetch()) {
+                               $row['manager'] = $this;
+                               $mount = new Mount(self::STORAGE, $row['mountpoint'], $row, $this->storageLoader);
+                               $this->mountManager->addMount($mount);
+                       }
+               }
+       }
+
+       /**
+        * @return \OC\Files\Mount\Manager
+        */
+       public function getMountManager() {
+               return $this->mountManager;
+       }
+
+       /**
+        * @param string $source
+        * @param string $target
+        * @return bool
+        */
+       public function setMountPoint($source, $target) {
+               $sourceHash = md5($source);
+               $targetHash = md5($target);
+
+               $query = $this->connection->prepare('UPDATE *PREFIX*share_external SET
+                       `mountpoint` = ?, `mountpoint_hash` = ? WHERE `mountpoint_hash` = ?');
+               $query->execute(array($target, $targetHash, $sourceHash));
+
+               $mount = $this->mountManager->find($source);
+               $mount->setMountPoint($target . '/');
+               $this->mountManager->addMount($mount);
+               $this->mountManager->removeMount($source . '/');
+       }
+}
diff --git a/apps/files_sharing/lib/external/storage.php b/apps/files_sharing/lib/external/storage.php
new file mode 100644 (file)
index 0000000..2683a6a
--- /dev/null
@@ -0,0 +1,91 @@
+<?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\External;
+
+use OC\Files\Filesystem;
+use OCA\Files_Sharing\ISharedStorage;
+
+class Storage extends \OC\Files\Storage\DAV implements ISharedStorage {
+       /**
+        * @var string
+        */
+       private $remoteUser;
+
+       /**
+        * @var string
+        */
+       private $remote;
+
+       /**
+        * @var string
+        */
+       private $mountPoint;
+
+       /**
+        * @var \OCA\Files_Sharing\External\Manager
+        */
+       private $manager;
+
+       public function __construct($options) {
+               $this->remote = $options['remote'];
+               $this->remoteUser = $options['owner'];
+               $this->manager = $options['manager'];
+               list($protocol, $remote) = explode('://', $this->remote);
+               list($host, $root) = explode('/', $remote);
+               $secure = $protocol === 'https';
+               $root .= '/public.php/webdav';
+               $this->mountPoint = $options['mountpoint'];
+               parent::__construct(array(
+                       'secure' => $secure,
+                       'host' => $host,
+                       'root' => $root,
+                       'user' => $options['token'],
+                       'password' => $options['password']
+               ));
+       }
+
+       public function getRemoteUser() {
+               return $this->remoteUser;
+       }
+
+       public function getRemote() {
+               return $this->remote;
+       }
+
+       public function getMountPoint() {
+               return $this->mountPoint;
+       }
+
+       /**
+        * @brief get id of the mount point
+        * @return string
+        */
+       public function getId() {
+               return 'shared::' . md5($this->user . '@' . $this->remote);
+       }
+
+       public function getCache($path = '') {
+               if (!isset($this->cache)) {
+                       $this->cache = new Cache($this, $this->remote, $this->remoteUser);
+               }
+               return $this->cache;
+       }
+
+       public function rename($path1, $path2) {
+               // if we renamed the mount point we need to adjust the mountpoint in the database
+               if (Filesystem::normalizePath($this->mountPoint) === Filesystem::normalizePath($path1)) {
+                       $this->manager->setMountPoint($path1, $path2);
+                       $this->mountPoint = $path2;
+                       return true;
+               } else {
+                       // read only shares
+                       return false;
+               }
+       }
+}
diff --git a/apps/files_sharing/lib/isharedstorage.php b/apps/files_sharing/lib/isharedstorage.php
new file mode 100644 (file)
index 0000000..75e0afe
--- /dev/null
@@ -0,0 +1,13 @@
+<?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;
+
+interface ISharedStorage{
+
+}
index aa467cec535d1c01673a3d9502fcb5b5aa48f49d..9904c3525c4058d94c52642db0858550ee3f2085 100644 (file)
@@ -202,7 +202,8 @@ class OC_Connector_Sabre_Directory extends OC_Connector_Sabre_Node
         * @return array
         */
        public function getQuotaInfo() {
-               $storageInfo = OC_Helper::getStorageInfo($this->path);
+               $path = \OC\Files\Filesystem::getView()->getRelativePath($this->info->getPath());
+               $storageInfo = OC_Helper::getStorageInfo($path);
                return array(
                        $storageInfo['used'],
                        $storageInfo['free']
index c55a392bca0c31f7b86cd9942f2bd0bad0c5102a..2cadb5af52007016baad94919cb4d84eeeeb1f07 100644 (file)
@@ -117,7 +117,7 @@ class ObjectTree extends \Sabre\DAV\ObjectTree {
 
                $isShareMountPoint = false;
                list($storage, $internalPath) = \OC\Files\Filesystem::resolvePath( '/' . \OCP\User::getUser() . '/files/' . $sourcePath);
-               if ($storage instanceof \OC\Files\Storage\Shared && !$internalPath) {
+               if ($storage instanceof \OCA\Files_Sharing\ISharedStorage && !$internalPath) {
                        $isShareMountPoint = true;
                }
 
index bfd280a91a16af79817b82cf7e8b83bc28ea5640..48c57e2e439dd7e59c5968f8938d735866e01acf 100644 (file)
@@ -22,20 +22,20 @@ class Cache {
        /**
         * @var array partial data for the cache
         */
-       private $partial = array();
+       protected $partial = array();
 
        /**
         * @var string
         */
-       private $storageId;
+       protected $storageId;
 
        /**
         * @var Storage $storageCache
         */
-       private $storageCache;
+       protected $storageCache;
 
-       private static $mimetypeIds = array();
-       private static $mimetypes = array();
+       protected static $mimetypeIds = array();
+       protected static $mimetypes = array();
 
        /**
         * @param \OC\Files\Storage\Storage|string $storage
index 3e2c1db79da47cbe9559695c4dd38e2b800e9afe..243baa46948d24ae29afc687f727e5ebcbd1528f 100644 (file)
@@ -940,7 +940,7 @@ class OC_Helper {
                // return storage info without adding mount points
                $includeExtStorage = \OC_Config::getValue('quota_include_external_storage', false);
 
-               if (is_null($rootInfo)) {
+               if (!$rootInfo) {
                        $rootInfo = \OC\Files\Filesystem::getFileInfo($path, false);
                }
                $used = $rootInfo->getSize();
index a3de8ebc0efa4646daf5cbfaefd31f165ee79154..0a4d9a913e239080c45628abffe7c7d81b3d79c7 100644 (file)
@@ -510,7 +510,7 @@ class Share extends \OC\Share\Constants {
                        $mountManager = \OC\Files\Filesystem::getMountManager();
                        $mounts = $mountManager->getAll();
                        foreach ($mounts as $mountPoint => $mount) {
-                               if ($mount->getStorage() instanceof \OC\Files\Storage\Shared && strpos($mountPoint, $path) === 0) {
+                               if ($mount->getStorage() instanceof \OCA\Files_Sharing\ISharedStorage && strpos($mountPoint, $path) === 0) {
                                        $message = 'Sharing "' . $itemSourceName . '" failed, because it contains files shared with you!';
                                        \OC_Log::write('OCP\Share', $message, \OC_Log::ERROR);
                                        throw new \Exception($message);