Browse Source

Add server<->server sharing backend

tags/v7.0.0alpha2
Robin Appelman 10 years ago
parent
commit
65f3b2fad2

+ 7
- 7
apps/files_external/lib/webdav.php View 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
*/

+ 9
- 0
apps/files_sharing/appinfo/app.php View 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');

+ 83
- 0
apps/files_sharing/appinfo/database.xml View 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
apps/files_sharing/appinfo/version View File

@@ -1 +1 @@
0.5
0.5.1

+ 47
- 0
apps/files_sharing/lib/external/cache.php View File

@@ -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;
}
}

+ 90
- 0
apps/files_sharing/lib/external/manager.php View File

@@ -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 . '/');
}
}

+ 91
- 0
apps/files_sharing/lib/external/storage.php View File

@@ -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;
}
}
}

+ 13
- 0
apps/files_sharing/lib/isharedstorage.php View File

@@ -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{

}

+ 2
- 1
lib/private/connector/sabre/directory.php View 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']

+ 1
- 1
lib/private/connector/sabre/objecttree.php View 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;
}


+ 5
- 5
lib/private/files/cache/cache.php View 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

+ 1
- 1
lib/private/helper.php View 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();

+ 1
- 1
lib/private/share/share.php View 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);

Loading…
Cancel
Save