Merge pull request #12452 from owncloud/server2server-ng-ocs

OCS API for server-to-server sharing
This commit is contained in:
Morris Jobke 2014-12-08 14:12:03 +01:00
commit 1362c0b67a
14 changed files with 612 additions and 55 deletions

View File

@ -1,6 +1,6 @@
<?php <?php
/** /**
* ownCloud * ownCloud - OCS API for local shares
* *
* @author Bjoern Schiessle * @author Bjoern Schiessle
* @copyright 2013 Bjoern Schiessle schiessle@owncloud.com * @copyright 2013 Bjoern Schiessle schiessle@owncloud.com
@ -20,9 +20,9 @@
* *
*/ */
namespace OCA\Files\Share; namespace OCA\Files_Sharing\API;
class Api { class Local {
/** /**
* get all shares * get all shares

View File

@ -0,0 +1,224 @@
<?php
/**
* ownCloud - OCS API for server-to-server shares
*
* @copyright (C) 2014 ownCloud, Inc.
*
* @author Bjoern Schiessle <schiessle@owncloud.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
*
* You should have received a copy of the GNU Affero General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OCA\Files_Sharing\API;
class Server2Server {
/**
* create a new share
*
* @param array $params
* @return \OC_OCS_Result
*/
public function createShare($params) {
if (!$this->isS2SEnabled(true)) {
return \OC_OCS_Result(null, 503, 'Server does not support server-to-server sharing');
}
$remote = isset($_POST['remote']) ? $_POST['remote'] : null;
$token = isset($_POST['token']) ? $_POST['token'] : null;
$name = isset($_POST['name']) ? $_POST['name'] : null;
$owner = isset($_POST['owner']) ? $_POST['owner'] : null;
$shareWith = isset($_POST['shareWith']) ? $_POST['shareWith'] : null;
$remoteId = isset($_POST['remote_id']) ? (int)$_POST['remote_id'] : null;
if ($remote && $token && $name && $owner && $remoteId && $shareWith) {
if(!\OCP\Util::isValidFileName($name)) {
return new \OC_OCS_Result(null, 400, 'The mountpoint name contains invalid characters.');
}
if (!\OCP\User::userExists($shareWith)) {
return new \OC_OCS_Result(null, 400, 'User does not exists');
}
\OC_Util::setupFS($shareWith);
$mountPoint = \OC\Files\Filesystem::normalizePath('/' . $name);
$name = \OCP\Files::buildNotExistingFileName('/', $name);
try {
\OCA\Files_Sharing\Helper::addServer2ServerShare($remote, $token, $name, $mountPoint, $owner, $shareWith, '', $remoteId);
\OC::$server->getActivityManager()->publishActivity(
'files_sharing', \OCA\Files_Sharing\Activity::SUBJECT_REMOTE_SHARE_RECEIVED, array($owner), '', array(),
'', '', $shareWith, \OCA\Files_Sharing\Activity::TYPE_REMOTE_SHARE, \OCA\Files_Sharing\Activity::PRIORITY_LOW);
return new \OC_OCS_Result();
} catch (\Exception $e) {
return new \OC_OCS_Result(null, 500, 'server can not add remote share, ' . $e->getMessage());
}
}
return new \OC_OCS_Result(null, 400, 'server can not add remote share, missing parameter');
}
/**
* accept server-to-server share
*
* @param array $params
* @return \OC_OCS_Result
*/
public function acceptShare($params) {
if (!$this->isS2SEnabled()) {
return \OC_OCS_Result(null, 503, 'Server does not support server-to-server sharing');
}
$id = $params['id'];
$token = isset($_POST['token']) ? $_POST['token'] : null;
$share = self::getShare($id, $token);
if ($share) {
list($file, $link) = self::getFile($share['uid_owner'], $share['file_source']);
\OC::$server->getActivityManager()->publishActivity(
'files_sharing', \OCA\Files_Sharing\Activity::SUBJECT_REMOTE_SHARE_ACCEPTED, array($share['share_with'], basename($file)), '', array(),
$file, $link, $share['uid_owner'], \OCA\Files_Sharing\Activity::TYPE_REMOTE_SHARE, \OCA\Files_Sharing\Activity::PRIORITY_LOW);
}
return new \OC_OCS_Result();
}
/**
* decline server-to-server share
*
* @param array $params
* @return \OC_OCS_Result
*/
public function declineShare($params) {
if (!$this->isS2SEnabled()) {
return \OC_OCS_Result(null, 503, 'Server does not support server-to-server sharing');
}
$id = $params['id'];
$token = isset($_POST['token']) ? $_POST['token'] : null;
$share = $this->getShare($id, $token);
if ($share) {
// userId must be set to the user who unshares
\OCP\Share::unshare($share['item_type'], $share['item_source'], $share['share_type'], null, $share['uid_owner']);
list($file, $link) = $this->getFile($share['uid_owner'], $share['file_source']);
\OC::$server->getActivityManager()->publishActivity(
'files_sharing', \OCA\Files_Sharing\Activity::SUBJECT_REMOTE_SHARE_DECLINED, array($share['share_with'], basename($file)), '', array(),
$file, $link, $share['uid_owner'], \OCA\Files_Sharing\Activity::TYPE_REMOTE_SHARE, \OCA\Files_Sharing\Activity::PRIORITY_LOW);
}
return new \OC_OCS_Result();
}
/**
* remove server-to-server share if it was unshared by the owner
*
* @param array $params
* @return \OC_OCS_Result
*/
public function unshare($params) {
if (!$this->isS2SEnabled()) {
return \OC_OCS_Result(null, 503, 'Server does not support server-to-server sharing');
}
$id = $params['id'];
$token = isset($_POST['token']) ? $_POST['token'] : null;
$query = \OCP\DB::prepare('SELECT * FROM `*PREFIX*share_external` WHERE `remote_id` = ? AND `share_token` = ?');
$query->execute(array($id, $token));
$share = $query->fetchRow();
if ($token && $id && !empty($share)) {
$owner = $share['owner'] . '@' . $share['remote'];
$mountpoint = $share['mountpoint'];
$user = $share['user'];
$query = \OCP\DB::prepare('DELETE FROM `*PREFIX*share_external` WHERE `remote_id` = ? AND `share_token` = ?');
$query->execute(array($id, $token));
\OC::$server->getActivityManager()->publishActivity(
'files_sharing', \OCA\Files_Sharing\Activity::SUBJECT_REMOTE_SHARE_DECLINED, array($owner, $mountpoint), '', array(),
'', '', $user, \OCA\Files_Sharing\Activity::TYPE_REMOTE_SHARE, \OCA\Files_Sharing\Activity::PRIORITY_MEDIUM);
}
return new \OC_OCS_Result();
}
/**
* get share
*
* @param int $id
* @param string $token
* @return array
*/
private function getShare($id, $token) {
$query = \OCP\DB::prepare('SELECT * FROM `*PREFIX*share` WHERE `id` = ? AND `token` = ? AND `share_type` = ?');
$query->execute(array($id, $token, \OCP\Share::SHARE_TYPE_REMOTE));
$share = $query->fetchRow();
return $share;
}
/**
* get file
*
* @param string $user
* @param int $fileSource
* @return array with internal path of the file and a absolute link to it
*/
private function getFile($user, $fileSource) {
\OC_Util::setupFS($user);
$file = \OC\Files\Filesystem::getPath($fileSource);
$args = \OC\Files\Filesystem::is_dir($file) ? array('dir' => $file) : array('dir' => dirname($file), 'scrollto' => $file);
$link = \OCP\Util::linkToAbsolute('files', 'index.php', $args);
return array($file, $link);
}
/**
* check if server-to-server sharing is enabled
*
* @param bool $incoming
* @return bool
*/
private function isS2SEnabled($incoming = false) {
$result = \OCP\App::isEnabled('files_sharing');
if ($incoming) {
$result = $result && \OCA\Files_Sharing\Helper::isIncomingServer2serverShareEnabled();
} else {
$result = $result && \OCA\Files_Sharing\Helper::isOutgoingServer2serverShareEnabled();
}
return $result;
}
}

View File

@ -8,7 +8,6 @@ OC::$CLASSPATH['OC\Files\Cache\Shared_Cache'] = 'files_sharing/lib/cache.php';
OC::$CLASSPATH['OC\Files\Cache\Shared_Permissions'] = 'files_sharing/lib/permissions.php'; OC::$CLASSPATH['OC\Files\Cache\Shared_Permissions'] = 'files_sharing/lib/permissions.php';
OC::$CLASSPATH['OC\Files\Cache\Shared_Updater'] = 'files_sharing/lib/updater.php'; OC::$CLASSPATH['OC\Files\Cache\Shared_Updater'] = 'files_sharing/lib/updater.php';
OC::$CLASSPATH['OC\Files\Cache\Shared_Watcher'] = 'files_sharing/lib/watcher.php'; 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\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';
@ -28,6 +27,10 @@ OCP\Util::addScript('files_sharing', 'external');
OC_FileProxy::register(new OCA\Files\Share\Proxy()); OC_FileProxy::register(new OCA\Files\Share\Proxy());
\OC::$server->getActivityManager()->registerExtension(function() {
return new \OCA\Files_Sharing\Activity();
});
$config = \OC::$server->getConfig(); $config = \OC::$server->getConfig();
if ($config->getAppValue('core', 'shareapi_enabled', 'yes') === 'yes') { if ($config->getAppValue('core', 'shareapi_enabled', 'yes') === 'yes') {

View File

@ -22,6 +22,12 @@
<length>512</length> <length>512</length>
<comments>Url of the remove owncloud instance</comments> <comments>Url of the remove owncloud instance</comments>
</field> </field>
<field>
<name>remote_id</name>
<type>integer</type>
<notnull>true</notnull>
<length>4</length>
</field>
<field> <field>
<name>share_token</name> <name>share_token</name>
<type>text</type> <type>text</type>
@ -32,7 +38,7 @@
<field> <field>
<name>password</name> <name>password</name>
<type>text</type> <type>text</type>
<notnull>true</notnull> <notnull>false</notnull>
<length>64</length> <length>64</length>
<comments>Optional password for the public share</comments> <comments>Optional password for the public share</comments>
</field> </field>
@ -71,6 +77,13 @@
<length>32</length> <length>32</length>
<comments>md5 hash of the mountpoint</comments> <comments>md5 hash of the mountpoint</comments>
</field> </field>
<field>
<name>accepted</name>
<type>integer</type>
<default>0</default>
<notnull>true</notnull>
<length>4</length>
</field>
<index> <index>
<name>sh_external_user</name> <name>sh_external_user</name>
<field> <field>

View File

@ -22,25 +22,25 @@ $this->create('sharing_external_test_remote', '/testremote')
OC_API::register('get', OC_API::register('get',
'/apps/files_sharing/api/v1/shares', '/apps/files_sharing/api/v1/shares',
array('\OCA\Files\Share\Api', 'getAllShares'), array('\OCA\Files_Sharing\API\Local', 'getAllShares'),
'files_sharing'); 'files_sharing');
OC_API::register('post', OC_API::register('post',
'/apps/files_sharing/api/v1/shares', '/apps/files_sharing/api/v1/shares',
array('\OCA\Files\Share\Api', 'createShare'), array('\OCA\Files_Sharing\API\Local', 'createShare'),
'files_sharing'); 'files_sharing');
OC_API::register('get', OC_API::register('get',
'/apps/files_sharing/api/v1/shares/{id}', '/apps/files_sharing/api/v1/shares/{id}',
array('\OCA\Files\Share\Api', 'getShare'), array('\OCA\Files_Sharing\API\Local', 'getShare'),
'files_sharing'); 'files_sharing');
OC_API::register('put', OC_API::register('put',
'/apps/files_sharing/api/v1/shares/{id}', '/apps/files_sharing/api/v1/shares/{id}',
array('\OCA\Files\Share\Api', 'updateShare'), array('\OCA\Files_Sharing\API\Local', 'updateShare'),
'files_sharing'); 'files_sharing');
OC_API::register('delete', OC_API::register('delete',
'/apps/files_sharing/api/v1/shares/{id}', '/apps/files_sharing/api/v1/shares/{id}',
array('\OCA\Files\Share\Api', 'deleteShare'), array('\OCA\Files_Sharing\API\Local', 'deleteShare'),
'files_sharing'); 'files_sharing');

View File

@ -1 +1 @@
0.5.3 0.5.4

View File

@ -0,0 +1,165 @@
<?php
/**
* ownCloud - publish activities
*
* @copyright (c) 2014, ownCloud Inc.
*
* @author Bjoern Schiessle <schiessle@owncloud.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
*
* You should have received a copy of the GNU Affero General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*/
namespace OCA\Files_Sharing;
class Activity implements \OCP\Activity\IExtension {
const TYPE_REMOTE_SHARE = 'remote_share';
const SUBJECT_REMOTE_SHARE_RECEIVED = 'remote_share_received';
const SUBJECT_REMOTE_SHARE_ACCEPTED = 'remote_share_accepted';
const SUBJECT_REMOTE_SHARE_DECLINED = 'remote_share_declined';
const SUBJECT_REMOTE_SHARE_UNSHARED = 'remote_share_unshared';
/**
* The extension can return an array of additional notification types.
* If no additional types are to be added false is to be returned
*
* @param string $languageCode
* @return array|false
*/
public function getNotificationTypes($languageCode) {
$l = \OC::$server->getL10N('files_sharing', $languageCode);
return array(self::TYPE_REMOTE_SHARE => $l->t('A file or folder was shared from <strong>another server</strong>'));
}
/**
* The extension can filter the types based on the filter if required.
* In case no filter is to be applied false is to be returned unchanged.
*
* @param array $types
* @param string $filter
* @return array|false
*/
public function filterNotificationTypes($types, $filter) {
return $types;
}
/**
* For a given method additional types to be displayed in the settings can be returned.
* In case no additional types are to be added false is to be returned.
*
* @param string $method
* @return array|false
*/
public function getDefaultTypes($method) {
if ($method === 'stream') {
return array(self::TYPE_REMOTE_SHARE);
}
return false;
}
/**
* The extension can translate a given message to the requested languages.
* If no translation is available false is to be returned.
*
* @param string $app
* @param string $text
* @param array $params
* @param boolean $stripPath
* @param boolean $highlightParams
* @param string $languageCode
* @return string|false
*/
public function translate($app, $text, $params, $stripPath, $highlightParams, $languageCode) {
$l = \OC::$server->getL10N('files_sharing', $languageCode);
if (!$text) {
return '';
}
if ($app === 'files_sharing') {
switch ($text) {
case self::SUBJECT_REMOTE_SHARE_RECEIVED:
return $l->t('You received a new remote share from %s', $params)->__toString();
case self::SUBJECT_REMOTE_SHARE_ACCEPTED:
return $l->t('%1$s accepted remote share <strong>%2$s</strong>', $params)->__toString();
case self::SUBJECT_REMOTE_SHARE_DECLINED:
return $l->t('%1$s declined remote share <strong>%2$s</strong>', $params)->__toString();
case self::SUBJECT_REMOTE_SHARE_UNSHARED:
return $l->t('%1$s unshared <strong>%2$s</strong>', $params)->__toString();
}
}
}
/**
* A string naming the css class for the icon to be used can be returned.
* If no icon is known for the given type false is to be returned.
*
* @param string $type
* @return string|false
*/
public function getTypeIcon($type) {
return 'icon-share';
}
/**
* The extension can define the parameter grouping by returning the index as integer.
* In case no grouping is required false is to be returned.
*
* @param array $activity
* @return integer|false
*/
public function getGroupParameter($activity) {
return false;
}
/**
* The extension can define additional navigation entries. The array returned has to contain two keys 'top'
* and 'apps' which hold arrays with the relevant entries.
* If no further entries are to be added false is no be returned.
*
* @return array|false
*/
public function getNavigation() {
return false;
}
/**
* The extension can check if a customer filter (given by a query string like filter=abc) is valid or not.
*
* @param string $filterValue
* @return boolean
*/
public function isFilterValid($filterValue) {
return false;
}
/**
* For a given filter the extension can specify the sql query conditions including parameters for that query.
* In case the extension does not know the filter false is to be returned.
* The query condition and the parameters are to be returned as array with two elements.
* E.g. return array('`app` = ? and `message` like ?', array('mail', 'ownCloud%'));
*
* @param string $filter
* @return array|false
*/
public function getQueryForFilter($filter) {
if ($filter === 'shares') {
return array('`app` = ? and `type` = ?', array('files_sharing', self::TYPE_REMOTE_SHARE));
}
return false;
}
}

View File

@ -50,14 +50,8 @@ class Manager {
public function addShare($remote, $token, $password, $name, $owner) { public function addShare($remote, $token, $password, $name, $owner) {
$user = $this->userSession->getUser(); $user = $this->userSession->getUser();
if ($user) { if ($user) {
$query = $this->connection->prepare('
INSERT INTO `*PREFIX*share_external`
(`remote`, `share_token`, `password`, `name`, `owner`, `user`, `mountpoint`, `mountpoint_hash`)
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
');
$mountPoint = Filesystem::normalizePath('/' . $name); $mountPoint = Filesystem::normalizePath('/' . $name);
$hash = md5($mountPoint); \OCA\Files_Sharing\Helper::addServer2ServerShare($remote, $token, $name, $mountPoint, $owner, $user->getUID(), $password, -1, true);
$query->execute(array($remote, $token, $password, $name, $owner, $user->getUID(), $mountPoint, $hash));
$options = array( $options = array(
'remote' => $remote, 'remote' => $remote,
@ -81,9 +75,9 @@ class Manager {
$query = $this->connection->prepare(' $query = $this->connection->prepare('
SELECT `remote`, `share_token`, `password`, `mountpoint`, `owner` SELECT `remote`, `share_token`, `password`, `mountpoint`, `owner`
FROM `*PREFIX*share_external` FROM `*PREFIX*share_external`
WHERE `user` = ? WHERE `user` = ? AND `accepted` = ?
'); ');
$query->execute(array($user->getUID())); $query->execute(array($user->getUID(), 1));
while ($row = $query->fetch()) { while ($row = $query->fetch()) {
$row['manager'] = $this; $row['manager'] = $this;

View File

@ -20,6 +20,30 @@ class Helper {
\OCP\Util::connectHook('OCP\Share', 'post_unshareFromSelf', '\OC\Files\Cache\Shared_Updater', 'postUnshareFromSelfHook'); \OCP\Util::connectHook('OCP\Share', 'post_unshareFromSelf', '\OC\Files\Cache\Shared_Updater', 'postUnshareFromSelfHook');
} }
/**
* add server-to-server share to database
*
* @param string $remote
* @param string $token
* @param string $name
* @param string $mountPoint
* @param string $owner
* @param string $user
* @param string $password
* @param int $remoteId
* @param bool $accepted
*/
public static function addServer2ServerShare($remote, $token, $name, $mountPoint, $owner, $user, $password='', $remoteId=-1, $accepted = false) {
$accepted = $accepted ? 1 : 0;
$query = \OCP\DB::prepare('
INSERT INTO `*PREFIX*share_external`
(`remote`, `share_token`, `password`, `name`, `owner`, `user`, `mountpoint`, `mountpoint_hash`, `accepted`, `remote_id`)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
');
$hash = md5($mountPoint);
$query->execute(array($remote, $token, $password, $name, $owner, $user, $mountPoint, $hash, $accepted, $remoteId));
}
/** /**
* Sets up the filesystem and user for public sharing * Sets up the filesystem and user for public sharing
* @param string $token string share token * @param string $token string share token

View File

@ -76,7 +76,7 @@ class Test_Files_Sharing_Api extends TestCase {
$_POST['shareWith'] = \Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2; $_POST['shareWith'] = \Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2;
$_POST['shareType'] = \OCP\Share::SHARE_TYPE_USER; $_POST['shareType'] = \OCP\Share::SHARE_TYPE_USER;
$result = Share\Api::createShare(array()); $result = \OCA\Files_Sharing\API\Local::createShare(array());
$this->assertTrue($result->succeeded()); $this->assertTrue($result->succeeded());
$data = $result->getData(); $data = $result->getData();
@ -93,7 +93,7 @@ class Test_Files_Sharing_Api extends TestCase {
$_POST['path'] = $this->folder; $_POST['path'] = $this->folder;
$_POST['shareType'] = \OCP\Share::SHARE_TYPE_LINK; $_POST['shareType'] = \OCP\Share::SHARE_TYPE_LINK;
$result = Share\Api::createShare(array()); $result = \OCA\Files_Sharing\API\Local::createShare(array());
// check if API call was successful // check if API call was successful
$this->assertTrue($result->succeeded()); $this->assertTrue($result->succeeded());
@ -129,7 +129,7 @@ class Test_Files_Sharing_Api extends TestCase {
$_POST['shareType'] = \OCP\Share::SHARE_TYPE_LINK; $_POST['shareType'] = \OCP\Share::SHARE_TYPE_LINK;
$result = Share\Api::createShare(array()); $result = \OCA\Files_Sharing\API\Local::createShare(array());
$this->assertFalse($result->succeeded()); $this->assertFalse($result->succeeded());
@ -138,7 +138,7 @@ class Test_Files_Sharing_Api extends TestCase {
$_POST['shareType'] = \OCP\Share::SHARE_TYPE_LINK; $_POST['shareType'] = \OCP\Share::SHARE_TYPE_LINK;
$_POST['password'] = ''; $_POST['password'] = '';
$result = Share\Api::createShare(array()); $result = \OCA\Files_Sharing\API\Local::createShare(array());
$this->assertFalse($result->succeeded()); $this->assertFalse($result->succeeded());
// share with password should succeed // share with password should succeed
@ -146,7 +146,7 @@ class Test_Files_Sharing_Api extends TestCase {
$_POST['shareType'] = \OCP\Share::SHARE_TYPE_LINK; $_POST['shareType'] = \OCP\Share::SHARE_TYPE_LINK;
$_POST['password'] = 'foo'; $_POST['password'] = 'foo';
$result = Share\Api::createShare(array()); $result = \OCA\Files_Sharing\API\Local::createShare(array());
$this->assertTrue($result->succeeded()); $this->assertTrue($result->succeeded());
$data = $result->getData(); $data = $result->getData();
@ -157,7 +157,7 @@ class Test_Files_Sharing_Api extends TestCase {
$params['_put'] = array(); $params['_put'] = array();
$params['_put']['password'] = 'bar'; $params['_put']['password'] = 'bar';
$result = Share\Api::updateShare($params); $result = \OCA\Files_Sharing\API\Local::updateShare($params);
$this->assertTrue($result->succeeded()); $this->assertTrue($result->succeeded());
// removing password should fail // removing password should fail
@ -166,7 +166,7 @@ class Test_Files_Sharing_Api extends TestCase {
$params['_put'] = array(); $params['_put'] = array();
$params['_put']['password'] = ''; $params['_put']['password'] = '';
$result = Share\Api::updateShare($params); $result = \OCA\Files_Sharing\API\Local::updateShare($params);
$this->assertFalse($result->succeeded()); $this->assertFalse($result->succeeded());
// cleanup // cleanup
@ -187,7 +187,7 @@ class Test_Files_Sharing_Api extends TestCase {
$_POST['shareWith'] = \Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2; $_POST['shareWith'] = \Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2;
$_POST['shareType'] = \OCP\Share::SHARE_TYPE_USER; $_POST['shareType'] = \OCP\Share::SHARE_TYPE_USER;
$result = Share\Api::createShare(array()); $result = \OCA\Files_Sharing\API\Local::createShare(array());
$this->assertTrue($result->succeeded()); $this->assertTrue($result->succeeded());
$data = $result->getData(); $data = $result->getData();
@ -213,7 +213,7 @@ class Test_Files_Sharing_Api extends TestCase {
$_POST['shareWith'] = \Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2; $_POST['shareWith'] = \Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2;
$_POST['shareType'] = \OCP\Share::SHARE_TYPE_USER; $_POST['shareType'] = \OCP\Share::SHARE_TYPE_USER;
$result = Share\Api::createShare(array()); $result = \OCA\Files_Sharing\API\Local::createShare(array());
$this->assertTrue($result->succeeded()); $this->assertTrue($result->succeeded());
$data = $result->getData(); $data = $result->getData();
@ -238,7 +238,7 @@ class Test_Files_Sharing_Api extends TestCase {
$_POST['shareWith'] = \Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2; $_POST['shareWith'] = \Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2;
$_POST['shareType'] = \OCP\Share::SHARE_TYPE_USER; $_POST['shareType'] = \OCP\Share::SHARE_TYPE_USER;
$result = Share\Api::createShare(array()); $result = \OCA\Files_Sharing\API\Local::createShare(array());
$this->assertFalse($result->succeeded()); $this->assertFalse($result->succeeded());
@ -259,7 +259,7 @@ class Test_Files_Sharing_Api extends TestCase {
\OCP\Share::shareItem('file', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_USER, \OCP\Share::shareItem('file', $fileinfo['fileid'], \OCP\Share::SHARE_TYPE_USER,
\Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2, 31); \Test_Files_Sharing_Api::TEST_FILES_SHARING_API_USER2, 31);
$result = Share\Api::getAllShares(array()); $result = \OCA\Files_Sharing\API\Local::getAllShares(array());
$this->assertTrue($result->succeeded()); $this->assertTrue($result->succeeded());
@ -286,7 +286,7 @@ class Test_Files_Sharing_Api extends TestCase {
$_GET['path'] = $this->filename; $_GET['path'] = $this->filename;
$result = Share\Api::getAllShares(array()); $result = \OCA\Files_Sharing\API\Local::getAllShares(array());
$this->assertTrue($result->succeeded()); $this->assertTrue($result->succeeded());
@ -323,7 +323,7 @@ class Test_Files_Sharing_Api extends TestCase {
$_GET['path'] = $this->filename; $_GET['path'] = $this->filename;
$result = Share\Api::getAllShares(array()); $result = \OCA\Files_Sharing\API\Local::getAllShares(array());
$this->assertTrue($result->succeeded()); $this->assertTrue($result->succeeded());
@ -333,7 +333,7 @@ class Test_Files_Sharing_Api extends TestCase {
// now also ask for the reshares // now also ask for the reshares
$_GET['reshares'] = 'true'; $_GET['reshares'] = 'true';
$result = Share\Api::getAllShares(array()); $result = \OCA\Files_Sharing\API\Local::getAllShares(array());
$this->assertTrue($result->succeeded()); $this->assertTrue($result->succeeded());
@ -378,7 +378,7 @@ class Test_Files_Sharing_Api extends TestCase {
// call getShare() with share ID // call getShare() with share ID
$params = array('id' => $share['id']); $params = array('id' => $share['id']);
$result = Share\Api::getShare($params); $result = \OCA\Files_Sharing\API\Local::getShare($params);
$this->assertTrue($result->succeeded()); $this->assertTrue($result->succeeded());
@ -413,7 +413,7 @@ class Test_Files_Sharing_Api extends TestCase {
$_GET['path'] = $this->folder; $_GET['path'] = $this->folder;
$_GET['subfiles'] = 'true'; $_GET['subfiles'] = 'true';
$result = Share\Api::getAllShares(array()); $result = \OCA\Files_Sharing\API\Local::getAllShares(array());
$this->assertTrue($result->succeeded()); $this->assertTrue($result->succeeded());
@ -470,7 +470,7 @@ class Test_Files_Sharing_Api extends TestCase {
$_GET['path'] = $value['query']; $_GET['path'] = $value['query'];
$_GET['subfiles'] = 'true'; $_GET['subfiles'] = 'true';
$result = Share\Api::getAllShares(array()); $result = \OCA\Files_Sharing\API\Local::getAllShares(array());
$this->assertTrue($result->succeeded()); $this->assertTrue($result->succeeded());
@ -521,7 +521,7 @@ class Test_Files_Sharing_Api extends TestCase {
$_GET['path'] = '/'; $_GET['path'] = '/';
$_GET['subfiles'] = 'true'; $_GET['subfiles'] = 'true';
$result = Share\Api::getAllShares(array()); $result = \OCA\Files_Sharing\API\Local::getAllShares(array());
$this->assertTrue($result->succeeded()); $this->assertTrue($result->succeeded());
@ -583,7 +583,7 @@ class Test_Files_Sharing_Api extends TestCase {
$_GET['path'] = '/'; $_GET['path'] = '/';
$_GET['subfiles'] = 'true'; $_GET['subfiles'] = 'true';
$result = Share\Api::getAllShares(array()); $result = \OCA\Files_Sharing\API\Local::getAllShares(array());
$this->assertTrue($result->succeeded()); $this->assertTrue($result->succeeded());
@ -652,7 +652,7 @@ class Test_Files_Sharing_Api extends TestCase {
$expectedPath1 = $this->subfolder; $expectedPath1 = $this->subfolder;
$_GET['path'] = $expectedPath1; $_GET['path'] = $expectedPath1;
$result1 = Share\Api::getAllShares(array()); $result1 = \OCA\Files_Sharing\API\Local::getAllShares(array());
$this->assertTrue($result1->succeeded()); $this->assertTrue($result1->succeeded());
@ -664,7 +664,7 @@ class Test_Files_Sharing_Api extends TestCase {
$expectedPath2 = $this->folder . $this->subfolder; $expectedPath2 = $this->folder . $this->subfolder;
$_GET['path'] = $expectedPath2; $_GET['path'] = $expectedPath2;
$result2 = Share\Api::getAllShares(array()); $result2 = \OCA\Files_Sharing\API\Local::getAllShares(array());
$this->assertTrue($result2->succeeded()); $this->assertTrue($result2->succeeded());
@ -734,7 +734,7 @@ class Test_Files_Sharing_Api extends TestCase {
$_GET['path'] = '/'; $_GET['path'] = '/';
$_GET['subfiles'] = 'true'; $_GET['subfiles'] = 'true';
$result = Share\Api::getAllShares(array()); $result = \OCA\Files_Sharing\API\Local::getAllShares(array());
$this->assertTrue($result->succeeded()); $this->assertTrue($result->succeeded());
@ -771,7 +771,7 @@ class Test_Files_Sharing_Api extends TestCase {
$params = array('id' => 0); $params = array('id' => 0);
$result = Share\Api::getShare($params); $result = \OCA\Files_Sharing\API\Local::getShare($params);
$this->assertEquals(404, $result->getStatusCode()); $this->assertEquals(404, $result->getStatusCode());
$meta = $result->getMeta(); $meta = $result->getMeta();
@ -831,7 +831,7 @@ class Test_Files_Sharing_Api extends TestCase {
$params['_put'] = array(); $params['_put'] = array();
$params['_put']['permissions'] = 1; $params['_put']['permissions'] = 1;
$result = Share\Api::updateShare($params); $result = \OCA\Files_Sharing\API\Local::updateShare($params);
$meta = $result->getMeta(); $meta = $result->getMeta();
$this->assertTrue($result->succeeded(), $meta['message']); $this->assertTrue($result->succeeded(), $meta['message']);
@ -859,7 +859,7 @@ class Test_Files_Sharing_Api extends TestCase {
$params['_put'] = array(); $params['_put'] = array();
$params['_put']['password'] = 'foo'; $params['_put']['password'] = 'foo';
$result = Share\Api::updateShare($params); $result = \OCA\Files_Sharing\API\Local::updateShare($params);
$this->assertTrue($result->succeeded()); $this->assertTrue($result->succeeded());
@ -919,7 +919,7 @@ class Test_Files_Sharing_Api extends TestCase {
$params['_put'] = array(); $params['_put'] = array();
$params['_put']['publicUpload'] = 'true'; $params['_put']['publicUpload'] = 'true';
$result = Share\Api::updateShare($params); $result = \OCA\Files_Sharing\API\Local::updateShare($params);
$this->assertTrue($result->succeeded()); $this->assertTrue($result->succeeded());
@ -977,7 +977,7 @@ class Test_Files_Sharing_Api extends TestCase {
$params['_put'] = array(); $params['_put'] = array();
$params['_put']['expireDate'] = $dateWithinRange->format('Y-m-d'); $params['_put']['expireDate'] = $dateWithinRange->format('Y-m-d');
$result = Share\Api::updateShare($params); $result = \OCA\Files_Sharing\API\Local::updateShare($params);
$this->assertTrue($result->succeeded()); $this->assertTrue($result->succeeded());
@ -995,7 +995,7 @@ class Test_Files_Sharing_Api extends TestCase {
$params['_put'] = array(); $params['_put'] = array();
$params['_put']['expireDate'] = $dateOutOfRange->format('Y-m-d'); $params['_put']['expireDate'] = $dateOutOfRange->format('Y-m-d');
$result = Share\Api::updateShare($params); $result = \OCA\Files_Sharing\API\Local::updateShare($params);
$this->assertFalse($result->succeeded()); $this->assertFalse($result->succeeded());
@ -1033,7 +1033,7 @@ class Test_Files_Sharing_Api extends TestCase {
$this->assertEquals(2, count($items)); $this->assertEquals(2, count($items));
foreach ($items as $item) { foreach ($items as $item) {
$result = Share\Api::deleteShare(array('id' => $item['id'])); $result = \OCA\Files_Sharing\API\Local::deleteShare(array('id' => $item['id']));
$this->assertTrue($result->succeeded()); $this->assertTrue($result->succeeded());
} }
@ -1072,7 +1072,7 @@ class Test_Files_Sharing_Api extends TestCase {
$this->assertEquals(1, count($items)); $this->assertEquals(1, count($items));
$item = reset($items); $item = reset($items);
$result3 = Share\Api::deleteShare(array('id' => $item['id'])); $result3 = \OCA\Files_Sharing\API\Local::deleteShare(array('id' => $item['id']));
$this->assertTrue($result3->succeeded()); $this->assertTrue($result3->succeeded());

View File

@ -0,0 +1,102 @@
<?php
/**
* ownCloud - test server-to-server OCS API
*
* @copyright (c) ownCloud, Inc.
*
* @author Bjoern Schiessle <schiessle@owncloud.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
* License as published by the Free Software Foundation; either
* version 3 of the License, or any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU AFFERO GENERAL PUBLIC LICENSE for more details.
*
* You should have received a copy of the GNU Affero General Public
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
*
*/
use OCA\Files_Sharing\Tests\TestCase;
/**
* Class Test_Files_Sharing_Api
*/
class Test_Files_Sharing_S2S_OCS_API extends TestCase {
const TEST_FOLDER_NAME = '/folder_share_api_test';
private $s2s;
protected function setUp() {
parent::setUp();
self::loginHelper(self::TEST_FILES_SHARING_API_USER1);
\OCP\Share::registerBackend('test', 'Test_Share_Backend');
$this->s2s = new \OCA\Files_Sharing\API\Server2Server();
}
protected function tearDown() {
$query = \OCP\DB::prepare('DELETE FROM `*PREFIX*share_external`');
$query->execute();
parent::tearDown();
}
/**
* @medium
*/
function testCreateShare() {
// simulate a post request
$_POST['remote'] = 'localhost';
$_POST['token'] = 'token';
$_POST['name'] = 'name';
$_POST['owner'] = 'owner';
$_POST['shareWith'] = self::TEST_FILES_SHARING_API_USER2;
$_POST['remote_id'] = 1;
$result = $this->s2s->createShare(null);
$this->assertTrue($result->succeeded());
$query = \OCP\DB::prepare('SELECT * FROM `*PREFIX*share_external` WHERE `remote_id` = ?');
$result = $query->execute(array('1'));
$data = $result->fetchRow();
$this->assertSame('localhost', $data['remote']);
$this->assertSame('token', $data['share_token']);
$this->assertSame('/name', $data['name']);
$this->assertSame('owner', $data['owner']);
$this->assertSame(self::TEST_FILES_SHARING_API_USER2, $data['user']);
$this->assertSame(1, (int)$data['remote_id']);
$this->assertSame(0, (int)$data['accepted']);
}
function testDeclineShare() {
$dummy = \OCP\DB::prepare('
INSERT INTO `*PREFIX*share`
(`share_type`, `uid_owner`, `item_type`, `item_source`, `item_target`, `file_source`, `file_target`, `permissions`, `stime`, `token`)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
');
$dummy->execute(array(\OCP\Share::SHARE_TYPE_REMOTE, self::TEST_FILES_SHARING_API_USER1, 'test', '1', '/1', '1', '/test.txt', '1', time(), 'token'));
$verify = \OCP\DB::prepare('SELECT * FROM `*PREFIX*share`');
$result = $verify->execute();
$data = $result->fetchAll();
$this->assertSame(1, count($data));
$_POST['token'] = 'token';
$this->s2s->declineShare(array('id' => $data[0]['id']));
$verify = \OCP\DB::prepare('SELECT * FROM `*PREFIX*share`');
$result = $verify->execute();
$data = $result->fetchAll();
$this->assertEmpty($data);
}
}

View File

@ -699,18 +699,19 @@ class Share extends \OC\Share\Constants {
* @param string $itemSource * @param string $itemSource
* @param int $shareType SHARE_TYPE_USER, SHARE_TYPE_GROUP, or SHARE_TYPE_LINK * @param int $shareType SHARE_TYPE_USER, SHARE_TYPE_GROUP, or SHARE_TYPE_LINK
* @param string $shareWith User or group the item is being shared with * @param string $shareWith User or group the item is being shared with
* @param string $owner owner of the share, if null the current user is used
* @return boolean true on success or false on failure * @return boolean true on success or false on failure
*/ */
public static function unshare($itemType, $itemSource, $shareType, $shareWith) { public static function unshare($itemType, $itemSource, $shareType, $shareWith, $owner = null) {
// check if it is a valid itemType // check if it is a valid itemType
self::getBackend($itemType); self::getBackend($itemType);
$items = self::getItemSharedWithUser($itemType, $itemSource, $shareWith, null, $shareType); $items = self::getItemSharedWithUser($itemType, $itemSource, $shareWith, $owner, $shareType);
$toDelete = array(); $toDelete = array();
$newParent = null; $newParent = null;
$currentUser = \OC_User::getUser(); $currentUser = $owner ? $owner : \OC_User::getUser();
foreach ($items as $item) { foreach ($items as $item) {
// delete the item with the expected share_type and owner // delete the item with the expected share_type and owner
if ((int)$item['share_type'] === (int)$shareType && $item['uid_owner'] === $currentUser) { if ((int)$item['share_type'] === (int)$shareType && $item['uid_owner'] === $currentUser) {

View File

@ -242,10 +242,11 @@ class Share extends \OC\Share\Constants {
* @param string $itemSource * @param string $itemSource
* @param int $shareType SHARE_TYPE_USER, SHARE_TYPE_GROUP, or SHARE_TYPE_LINK * @param int $shareType SHARE_TYPE_USER, SHARE_TYPE_GROUP, or SHARE_TYPE_LINK
* @param string $shareWith User or group the item is being shared with * @param string $shareWith User or group the item is being shared with
* @param string $owner owner of the share, if null the current user is used
* @return boolean true on success or false on failure * @return boolean true on success or false on failure
*/ */
public static function unshare($itemType, $itemSource, $shareType, $shareWith) { public static function unshare($itemType, $itemSource, $shareType, $shareWith, $owner = null) {
return \OC\Share\Share::unshare($itemType, $itemSource, $shareType, $shareWith); return \OC\Share\Share::unshare($itemType, $itemSource, $shareType, $shareWith, $owner);
} }
/** /**

View File

@ -81,3 +81,33 @@ OC_API::register(
'core', 'core',
OC_API::USER_AUTH OC_API::USER_AUTH
); );
// Server-to-Server Sharing
$s2s = new \OCA\Files_Sharing\API\Server2Server();
OC_API::register('post',
'/cloud/shares',
array($s2s, 'createShare'),
'files_sharing',
OC_API::GUEST_AUTH
);
OC_API::register('post',
'/cloud/shares/{id}/accept',
array($s2s, 'acceptShare'),
'files_sharing',
OC_API::GUEST_AUTH
);
OC_API::register('post',
'/cloud/shares/{id}/decline',
array($s2s, 'declineShare'),
'files_sharing',
OC_API::GUEST_AUTH
);
OC_API::register('post',
'/cloud/shares/{id}/unshare',
array($s2s, 'unshare'),
'files_sharing',
OC_API::GUEST_AUTH
);