mirror of https://github.com/nextcloud/server.git
Add server<->server sharing backend
parent
4a26219ecf
commit
65f3b2fad2
@ -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{
|
||||
|
||||
}
|
Loading…
Reference in New Issue