Add server<->server sharing backend
This commit is contained in:
parent
4a26219ecf
commit
65f3b2fad2
|
@ -9,13 +9,13 @@
|
||||||
namespace OC\Files\Storage;
|
namespace OC\Files\Storage;
|
||||||
|
|
||||||
class DAV extends \OC\Files\Storage\Common {
|
class DAV extends \OC\Files\Storage\Common {
|
||||||
private $password;
|
protected $password;
|
||||||
private $user;
|
protected $user;
|
||||||
private $host;
|
protected $host;
|
||||||
private $secure;
|
protected $secure;
|
||||||
private $root;
|
protected $root;
|
||||||
private $certPath;
|
protected $certPath;
|
||||||
private $ready;
|
protected $ready;
|
||||||
/**
|
/**
|
||||||
* @var \Sabre\DAV\Client
|
* @var \Sabre\DAV\Client
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -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\Api'] = 'files_sharing/lib/api.php';
|
||||||
OC::$CLASSPATH['OCA\Files\Share\Maintainer'] = 'files_sharing/lib/maintainer.php';
|
OC::$CLASSPATH['OCA\Files\Share\Maintainer'] = 'files_sharing/lib/maintainer.php';
|
||||||
OC::$CLASSPATH['OCA\Files\Share\Proxy'] = 'files_sharing/lib/proxy.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\Util::connectHook('OC_Filesystem', 'setup', '\OC\Files\Storage\Shared', 'setup');
|
||||||
OCP\Share::registerBackend('file', 'OC_Share_Backend_File');
|
OCP\Share::registerBackend('file', 'OC_Share_Backend_File');
|
||||||
OCP\Share::registerBackend('folder', 'OC_Share_Backend_Folder', 'file');
|
OCP\Share::registerBackend('folder', 'OC_Share_Backend_Folder', 'file');
|
||||||
|
|
|
@ -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>
|
|
@ -1 +1 @@
|
||||||
0.5
|
0.5.1
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -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 . '/');
|
||||||
|
}
|
||||||
|
}
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -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{
|
||||||
|
|
||||||
|
}
|
|
@ -202,7 +202,8 @@ class OC_Connector_Sabre_Directory extends OC_Connector_Sabre_Node
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
public function getQuotaInfo() {
|
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(
|
return array(
|
||||||
$storageInfo['used'],
|
$storageInfo['used'],
|
||||||
$storageInfo['free']
|
$storageInfo['free']
|
||||||
|
|
|
@ -117,7 +117,7 @@ class ObjectTree extends \Sabre\DAV\ObjectTree {
|
||||||
|
|
||||||
$isShareMountPoint = false;
|
$isShareMountPoint = false;
|
||||||
list($storage, $internalPath) = \OC\Files\Filesystem::resolvePath( '/' . \OCP\User::getUser() . '/files/' . $sourcePath);
|
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;
|
$isShareMountPoint = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,20 +22,20 @@ class Cache {
|
||||||
/**
|
/**
|
||||||
* @var array partial data for the cache
|
* @var array partial data for the cache
|
||||||
*/
|
*/
|
||||||
private $partial = array();
|
protected $partial = array();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
private $storageId;
|
protected $storageId;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var Storage $storageCache
|
* @var Storage $storageCache
|
||||||
*/
|
*/
|
||||||
private $storageCache;
|
protected $storageCache;
|
||||||
|
|
||||||
private static $mimetypeIds = array();
|
protected static $mimetypeIds = array();
|
||||||
private static $mimetypes = array();
|
protected static $mimetypes = array();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param \OC\Files\Storage\Storage|string $storage
|
* @param \OC\Files\Storage\Storage|string $storage
|
||||||
|
|
|
@ -940,7 +940,7 @@ class OC_Helper {
|
||||||
// return storage info without adding mount points
|
// return storage info without adding mount points
|
||||||
$includeExtStorage = \OC_Config::getValue('quota_include_external_storage', false);
|
$includeExtStorage = \OC_Config::getValue('quota_include_external_storage', false);
|
||||||
|
|
||||||
if (is_null($rootInfo)) {
|
if (!$rootInfo) {
|
||||||
$rootInfo = \OC\Files\Filesystem::getFileInfo($path, false);
|
$rootInfo = \OC\Files\Filesystem::getFileInfo($path, false);
|
||||||
}
|
}
|
||||||
$used = $rootInfo->getSize();
|
$used = $rootInfo->getSize();
|
||||||
|
|
|
@ -510,7 +510,7 @@ class Share extends \OC\Share\Constants {
|
||||||
$mountManager = \OC\Files\Filesystem::getMountManager();
|
$mountManager = \OC\Files\Filesystem::getMountManager();
|
||||||
$mounts = $mountManager->getAll();
|
$mounts = $mountManager->getAll();
|
||||||
foreach ($mounts as $mountPoint => $mount) {
|
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!';
|
$message = 'Sharing "' . $itemSourceName . '" failed, because it contains files shared with you!';
|
||||||
\OC_Log::write('OCP\Share', $message, \OC_Log::ERROR);
|
\OC_Log::write('OCP\Share', $message, \OC_Log::ERROR);
|
||||||
throw new \Exception($message);
|
throw new \Exception($message);
|
||||||
|
|
Loading…
Reference in New Issue