Add server<->server sharing backend
This commit is contained in:
parent
4a26219ecf
commit
65f3b2fad2
|
@ -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
|
||||
*/
|
||||
|
|
|
@ -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');
|
||||
|
|
|
@ -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
|
||||
*/
|
||||
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']
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue