summaryrefslogtreecommitdiffstats
path: root/apps/files_sharing
diff options
context:
space:
mode:
authorRobin Appelman <icewind@owncloud.com>2014-04-29 15:14:48 +0200
committerBjoern Schiessle <schiessle@owncloud.com>2014-06-14 10:10:37 +0200
commit65f3b2fad235417d3f653c9e11aa8d72e8944d28 (patch)
treefa863ea6c687bd42343e001be6dc975325a91c75 /apps/files_sharing
parent4a26219ecf3abe9c1b18d434b8e70a6f9878199c (diff)
downloadnextcloud-server-65f3b2fad235417d3f653c9e11aa8d72e8944d28.tar.gz
nextcloud-server-65f3b2fad235417d3f653c9e11aa8d72e8944d28.zip
Add server<->server sharing backend
Diffstat (limited to 'apps/files_sharing')
-rw-r--r--apps/files_sharing/appinfo/app.php9
-rw-r--r--apps/files_sharing/appinfo/database.xml83
-rw-r--r--apps/files_sharing/appinfo/version2
-rw-r--r--apps/files_sharing/lib/external/cache.php47
-rw-r--r--apps/files_sharing/lib/external/manager.php90
-rw-r--r--apps/files_sharing/lib/external/storage.php91
-rw-r--r--apps/files_sharing/lib/isharedstorage.php13
7 files changed, 334 insertions, 1 deletions
diff --git a/apps/files_sharing/appinfo/app.php b/apps/files_sharing/appinfo/app.php
index 6b40ba921cc..9ea969f4cf3 100644
--- a/apps/files_sharing/appinfo/app.php
+++ b/apps/files_sharing/appinfo/app.php
@@ -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
index 00000000000..b9c0d881fc6
--- /dev/null
+++ b/apps/files_sharing/appinfo/database.xml
@@ -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>
diff --git a/apps/files_sharing/appinfo/version b/apps/files_sharing/appinfo/version
index 2eb3c4fe4ee..4b9fcbec101 100644
--- a/apps/files_sharing/appinfo/version
+++ b/apps/files_sharing/appinfo/version
@@ -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
index 00000000000..cd06bfb1272
--- /dev/null
+++ b/apps/files_sharing/lib/external/cache.php
@@ -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
index 00000000000..ffb673723aa
--- /dev/null
+++ b/apps/files_sharing/lib/external/manager.php
@@ -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
index 00000000000..2683a6a6902
--- /dev/null
+++ b/apps/files_sharing/lib/external/storage.php
@@ -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
index 00000000000..75e0afef394
--- /dev/null
+++ b/apps/files_sharing/lib/isharedstorage.php
@@ -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{
+
+}