summaryrefslogtreecommitdiffstats
path: root/apps/files_sharing
diff options
context:
space:
mode:
authorVincent Petry <pvince81@owncloud.com>2016-05-23 09:52:13 +0200
committerVincent Petry <pvince81@owncloud.com>2016-05-23 09:52:13 +0200
commit5ba1add03ccd3c4f72a72e5e31f986af42acc8de (patch)
treea4dd71aa2822367ee584055613e1922c327345b0 /apps/files_sharing
parentc78bb2ab340472c682add8bbe86c25379ef5740c (diff)
parent20852fd8c071b949962406d7ffb3b6e173eb171b (diff)
downloadnextcloud-server-5ba1add03ccd3c4f72a72e5e31f986af42acc8de.tar.gz
nextcloud-server-5ba1add03ccd3c4f72a72e5e31f986af42acc8de.zip
Merge pull request #24603 from owncloud/federated_reshare
flat federated re-share
Diffstat (limited to 'apps/files_sharing')
-rw-r--r--apps/files_sharing/api/server2server.php325
-rw-r--r--apps/files_sharing/api/share20ocs.php12
-rw-r--r--apps/files_sharing/appinfo/app.php12
-rw-r--r--apps/files_sharing/lib/external/manager.php36
-rw-r--r--apps/files_sharing/lib/notifier.php87
-rw-r--r--apps/files_sharing/tests/api/share20ocstest.php2
-rw-r--r--apps/files_sharing/tests/server2server.php263
7 files changed, 47 insertions, 690 deletions
diff --git a/apps/files_sharing/api/server2server.php b/apps/files_sharing/api/server2server.php
deleted file mode 100644
index 034ec5105e4..00000000000
--- a/apps/files_sharing/api/server2server.php
+++ /dev/null
@@ -1,325 +0,0 @@
-<?php
-/**
- * @author Arthur Schiwon <blizzz@owncloud.com>
- * @author Björn Schießle <schiessle@owncloud.com>
- * @author Joas Schilling <nickvergessen@owncloud.com>
- * @author Lukas Reschke <lukas@owncloud.com>
- * @author Morris Jobke <hey@morrisjobke.de>
- *
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program 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, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
- */
-
-namespace OCA\Files_Sharing\API;
-
-use OCA\FederatedFileSharing\DiscoveryManager;
-use OCA\FederatedFileSharing\FederatedShareProvider;
-use OCA\Files_Sharing\Activity;
-use OCP\Files\NotFoundException;
-
-class Server2Server {
-
- /** @var FederatedShareProvider */
- private $federatedShareProvider;
-
-
- /**
- * Server2Server constructor.
- *
- * @param FederatedShareProvider $federatedShareProvider
- */
- public function __construct(FederatedShareProvider $federatedShareProvider) {
- $this->federatedShareProvider = $federatedShareProvider;
- }
-
- /**
- * create a new share
- *
- * @param array $params
- * @return \OC_OCS_Result
- */
- public function createShare($params) {
-
- if (!$this->isS2SEnabled(true)) {
- return new \OC_OCS_Result(null, 503, 'Server does not support federated cloud 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['remoteId']) ? (int)$_POST['remoteId'] : 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.');
- }
-
- // FIXME this should be a method in the user management instead
- \OCP\Util::writeLog('files_sharing', 'shareWith before, ' . $shareWith, \OCP\Util::DEBUG);
- \OCP\Util::emitHook(
- '\OCA\Files_Sharing\API\Server2Server',
- 'preLoginNameUsedAsUserName',
- array('uid' => &$shareWith)
- );
- \OCP\Util::writeLog('files_sharing', 'shareWith after, ' . $shareWith, \OCP\Util::DEBUG);
-
- if (!\OCP\User::userExists($shareWith)) {
- return new \OC_OCS_Result(null, 400, 'User does not exists');
- }
-
- \OC_Util::setupFS($shareWith);
-
- $discoveryManager = new DiscoveryManager(
- \OC::$server->getMemCacheFactory(),
- \OC::$server->getHTTPClientService()
- );
- $externalManager = new \OCA\Files_Sharing\External\Manager(
- \OC::$server->getDatabaseConnection(),
- \OC\Files\Filesystem::getMountManager(),
- \OC\Files\Filesystem::getLoader(),
- \OC::$server->getHTTPHelper(),
- \OC::$server->getNotificationManager(),
- $discoveryManager,
- $shareWith
- );
-
- try {
- $externalManager->addShare($remote, $token, '', $name, $owner, false, $shareWith, $remoteId);
- $shareId = \OC::$server->getDatabaseConnection()->lastInsertId('*PREFIX*share_external');
-
- $user = $owner . '@' . $this->cleanupRemote($remote);
-
- \OC::$server->getActivityManager()->publishActivity(
- Activity::FILES_SHARING_APP, Activity::SUBJECT_REMOTE_SHARE_RECEIVED, array($user, trim($name, '/')), '', array(),
- '', '', $shareWith, Activity::TYPE_REMOTE_SHARE, Activity::PRIORITY_LOW);
-
- $urlGenerator = \OC::$server->getURLGenerator();
-
- $notificationManager = \OC::$server->getNotificationManager();
- $notification = $notificationManager->createNotification();
- $notification->setApp('files_sharing')
- ->setUser($shareWith)
- ->setDateTime(new \DateTime())
- ->setObject('remote_share', $shareId)
- ->setSubject('remote_share', [$user, trim($name, '/')]);
-
- $declineAction = $notification->createAction();
- $declineAction->setLabel('decline')
- ->setLink($urlGenerator->getAbsoluteURL($urlGenerator->linkTo('', 'ocs/v1.php/apps/files_sharing/api/v1/remote_shares/pending/' . $shareId)), 'DELETE');
- $notification->addAction($declineAction);
-
- $acceptAction = $notification->createAction();
- $acceptAction->setLabel('accept')
- ->setLink($urlGenerator->getAbsoluteURL($urlGenerator->linkTo('', 'ocs/v1.php/apps/files_sharing/api/v1/remote_shares/pending/' . $shareId)), 'POST');
- $notification->addAction($acceptAction);
-
- $notificationManager->notify($notification);
-
- return new \OC_OCS_Result();
- } catch (\Exception $e) {
- \OCP\Util::writeLog('files_sharing', 'server can not add remote share, ' . $e->getMessage(), \OCP\Util::ERROR);
- return new \OC_OCS_Result(null, 500, 'internal server error, was not able to add share from ' . $remote);
- }
- }
-
- 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 new \OC_OCS_Result(null, 503, 'Server does not support federated cloud 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']);
-
- $event = \OC::$server->getActivityManager()->generateEvent();
- $event->setApp(Activity::FILES_SHARING_APP)
- ->setType(Activity::TYPE_REMOTE_SHARE)
- ->setAffectedUser($share['uid_owner'])
- ->setSubject(Activity::SUBJECT_REMOTE_SHARE_ACCEPTED, [$share['share_with'], basename($file)])
- ->setObject('files', $share['file_source'], $file)
- ->setLink($link);
- \OC::$server->getActivityManager()->publish($event);
- }
-
- 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 new \OC_OCS_Result(null, 503, 'Server does not support federated cloud 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'], $share['share_with'], $share['uid_owner']);
-
- list($file, $link) = $this->getFile($share['uid_owner'], $share['file_source']);
-
- $event = \OC::$server->getActivityManager()->generateEvent();
- $event->setApp(Activity::FILES_SHARING_APP)
- ->setType(Activity::TYPE_REMOTE_SHARE)
- ->setAffectedUser($share['uid_owner'])
- ->setSubject(Activity::SUBJECT_REMOTE_SHARE_DECLINED, [$share['share_with'], basename($file)])
- ->setObject('files', $share['file_source'], $file)
- ->setLink($link);
- \OC::$server->getActivityManager()->publish($event);
- }
-
- 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 new \OC_OCS_Result(null, 503, 'Server does not support federated cloud 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)) {
-
- $remote = $this->cleanupRemote($share['remote']);
-
- $owner = $share['owner'] . '@' . $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));
-
- if ($share['accepted']) {
- $path = trim($mountpoint, '/');
- } else {
- $path = trim($share['name'], '/');
- }
-
- $notificationManager = \OC::$server->getNotificationManager();
- $notification = $notificationManager->createNotification();
- $notification->setApp('files_sharing')
- ->setUser($share['user'])
- ->setObject('remote_share', (int) $share['id']);
- $notificationManager->markProcessed($notification);
-
- \OC::$server->getActivityManager()->publishActivity(
- Activity::FILES_SHARING_APP, Activity::SUBJECT_REMOTE_SHARE_UNSHARED, array($owner, $path), '', array(),
- '', '', $user, Activity::TYPE_REMOTE_SHARE, Activity::PRIORITY_MEDIUM);
- }
-
- return new \OC_OCS_Result();
- }
-
- private function cleanupRemote($remote) {
- $remote = substr($remote, strpos($remote, '://') + 3);
-
- return rtrim($remote, '/');
- }
-
- /**
- * 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);
-
- try {
- $file = \OC\Files\Filesystem::getPath($fileSource);
- } catch (NotFoundException $e) {
- $file = null;
- }
- $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 && $this->federatedShareProvider->isIncomingServer2serverShareEnabled();
- } else {
- $result = $result && $this->federatedShareProvider->isOutgoingServer2serverShareEnabled();
- }
-
- return $result;
- }
-
-}
diff --git a/apps/files_sharing/api/share20ocs.php b/apps/files_sharing/api/share20ocs.php
index af762845326..28166b943b8 100644
--- a/apps/files_sharing/api/share20ocs.php
+++ b/apps/files_sharing/api/share20ocs.php
@@ -99,7 +99,15 @@ class Share20OCS {
*/
protected function formatShare(\OCP\Share\IShare $share) {
$sharedBy = $this->userManager->get($share->getSharedBy());
- $shareOwner = $this->userManager->get($share->getShareOwner());
+ // for federated shares the owner can be a remote user, in this
+ // case we use the initiator
+ if ($this->userManager->userExists($share->getShareOwner())) {
+ $shareOwner = $this->userManager->get($share->getShareOwner());
+ $localUser = $share->getShareOwner();
+ } else {
+ $shareOwner = $this->userManager->get($share->getSharedBy());
+ $localUser = $share->getSharedBy();
+ }
$result = [
'id' => $share->getId(),
'share_type' => $share->getShareType(),
@@ -115,7 +123,7 @@ class Share20OCS {
];
$node = $share->getNode();
- $result['path'] = $this->rootFolder->getUserFolder($share->getShareOwner())->getRelativePath($node->getPath());
+ $result['path'] = $this->rootFolder->getUserFolder($localUser)->getRelativePath($node->getPath());
if ($node instanceOf \OCP\Files\Folder) {
$result['item_type'] = 'folder';
} else {
diff --git a/apps/files_sharing/appinfo/app.php b/apps/files_sharing/appinfo/app.php
index da573d11ec5..32eee9b6c9c 100644
--- a/apps/files_sharing/appinfo/app.php
+++ b/apps/files_sharing/appinfo/app.php
@@ -103,15 +103,3 @@ if ($config->getAppValue('core', 'shareapi_enabled', 'yes') === 'yes') {
}
}
}
-
-$manager = \OC::$server->getNotificationManager();
-$manager->registerNotifier(function() {
- return new \OCA\Files_Sharing\Notifier(
- \OC::$server->getL10NFactory()
- );
-}, function() use ($l) {
- return [
- 'id' => 'files_sharing',
- 'name' => $l->t('Federated sharing'),
- ];
-});
diff --git a/apps/files_sharing/lib/external/manager.php b/apps/files_sharing/lib/external/manager.php
index 7dc9f66f114..5b7a13f1eb1 100644
--- a/apps/files_sharing/lib/external/manager.php
+++ b/apps/files_sharing/lib/external/manager.php
@@ -325,6 +325,10 @@ class Manager {
}
public function removeShare($mountPoint) {
+
+ $mountPointObj = $this->mountManager->find($mountPoint);
+ $id = $mountPointObj->getStorage()->getCache()->getId();
+
$mountPoint = $this->stripPath($mountPoint);
$hash = md5($mountPoint);
@@ -338,13 +342,43 @@ class Manager {
$share = $getShare->fetch();
$this->sendFeedbackToRemote($share['remote'], $share['share_token'], $share['remote_id'], 'decline');
}
+ $getShare->closeCursor();
$query = $this->connection->prepare('
DELETE FROM `*PREFIX*share_external`
WHERE `mountpoint_hash` = ?
AND `user` = ?
');
- return (bool)$query->execute(array($hash, $this->uid));
+ $result = (bool)$query->execute(array($hash, $this->uid));
+
+ if($result) {
+ $this->removeReShares($id);
+ }
+
+ return $result;
+ }
+
+ /**
+ * remove re-shares from share table and mapping in the federated_reshares table
+ *
+ * @param $mountPointId
+ */
+ protected function removeReShares($mountPointId) {
+ $selectQuery = $this->connection->getQueryBuilder();
+ $query = $this->connection->getQueryBuilder();
+ $selectQuery->select('id')->from('share')
+ ->where($selectQuery->expr()->eq('file_source', $query->createNamedParameter($mountPointId)));
+ $select = $selectQuery->getSQL();
+
+
+ $query->delete('federated_reshares')
+ ->where($query->expr()->in('share_id', $query->createFunction('(' . $select . ')')));
+ $query->execute();
+
+ $deleteReShares = $this->connection->getQueryBuilder();
+ $deleteReShares->delete('share')
+ ->where($deleteReShares->expr()->eq('file_source', $deleteReShares->createNamedParameter($mountPointId)));
+ $deleteReShares->execute();
}
/**
diff --git a/apps/files_sharing/lib/notifier.php b/apps/files_sharing/lib/notifier.php
deleted file mode 100644
index 27e4e2565f2..00000000000
--- a/apps/files_sharing/lib/notifier.php
+++ /dev/null
@@ -1,87 +0,0 @@
-<?php
-/**
- * @author Joas Schilling <nickvergessen@owncloud.com>
- *
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program 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, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
- */
-
-namespace OCA\Files_Sharing;
-
-
-use OCP\Notification\INotification;
-use OCP\Notification\INotifier;
-
-class Notifier implements INotifier {
- /** @var \OCP\L10N\IFactory */
- protected $factory;
-
- /**
- * @param \OCP\L10N\IFactory $factory
- */
- public function __construct(\OCP\L10N\IFactory $factory) {
- $this->factory = $factory;
- }
-
- /**
- * @param INotification $notification
- * @param string $languageCode The code of the language that should be used to prepare the notification
- * @return INotification
- */
- public function prepare(INotification $notification, $languageCode) {
- if ($notification->getApp() !== 'files_sharing') {
- // Not my app => throw
- throw new \InvalidArgumentException();
- }
-
- // Read the language from the notification
- $l = $this->factory->get('files_sharing', $languageCode);
-
- switch ($notification->getSubject()) {
- // Deal with known subjects
- case 'remote_share':
- $params = $notification->getSubjectParameters();
- $notification->setParsedSubject(
- (string) $l->t('You received "/%2$s" as a remote share from %1$s', $params)
- );
-
- // Deal with the actions for a known subject
- foreach ($notification->getActions() as $action) {
- switch ($action->getLabel()) {
- case 'accept':
- $action->setParsedLabel(
- (string) $l->t('Accept')
- )
- ->setPrimary(true);
- break;
-
- case 'decline':
- $action->setParsedLabel(
- (string) $l->t('Decline')
- );
- break;
- }
-
- $notification->addParsedAction($action);
- }
- return $notification;
-
- default:
- // Unknown subject => Unknown notification => throw
- throw new \InvalidArgumentException();
- }
- }
-}
diff --git a/apps/files_sharing/tests/api/share20ocstest.php b/apps/files_sharing/tests/api/share20ocstest.php
index ffb74da2af7..96ce34f963c 100644
--- a/apps/files_sharing/tests/api/share20ocstest.php
+++ b/apps/files_sharing/tests/api/share20ocstest.php
@@ -82,6 +82,8 @@ class Share20OCSTest extends \Test\TestCase {
$this->currentUser = $this->getMock('OCP\IUser');
$this->currentUser->method('getUID')->willReturn('currentUser');
+ $this->userManager->expects($this->any())->method('userExists')->willReturn(true);
+
$this->l = $this->getMock('\OCP\IL10N');
$this->l->method('t')
->will($this->returnCallback(function($text, $parameters = []) {
diff --git a/apps/files_sharing/tests/server2server.php b/apps/files_sharing/tests/server2server.php
deleted file mode 100644
index 1c8b5ed7a17..00000000000
--- a/apps/files_sharing/tests/server2server.php
+++ /dev/null
@@ -1,263 +0,0 @@
-<?php
-/**
- * @author Björn Schießle <schiessle@owncloud.com>
- * @author Joas Schilling <nickvergessen@owncloud.com>
- * @author Lukas Reschke <lukas@owncloud.com>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- *
- * @copyright Copyright (c) 2016, ownCloud, Inc.
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program 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, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
- */
-
-use OCA\Files_Sharing\Tests\TestCase;
-
-/**
- * Class Test_Files_Sharing_Api
- *
- * @group DB
- */
-class Test_Files_Sharing_S2S_OCS_API extends TestCase {
-
- const TEST_FOLDER_NAME = '/folder_share_api_test';
-
- /**
- * @var \OCP\IDBConnection
- */
- private $connection;
-
- /**
- * @var \OCA\Files_Sharing\API\Server2Server
- */
- private $s2s;
-
- /** @var \OCA\FederatedFileSharing\FederatedShareProvider | PHPUnit_Framework_MockObject_MockObject */
- private $federatedShareProvider;
-
- protected function setUp() {
- parent::setUp();
-
- self::loginHelper(self::TEST_FILES_SHARING_API_USER1);
- \OCP\Share::registerBackend('test', 'Test\Share\Backend');
-
- $config = $this->getMockBuilder('\OCP\IConfig')
- ->disableOriginalConstructor()->getMock();
- $clientService = $this->getMock('\OCP\Http\Client\IClientService');
- $httpHelperMock = $this->getMockBuilder('\OC\HTTPHelper')
- ->setConstructorArgs([$config, $clientService])
- ->getMock();
- $httpHelperMock->expects($this->any())->method('post')->with($this->anything())->will($this->returnValue(true));
- $this->federatedShareProvider = $this->getMockBuilder('OCA\FederatedFileSharing\FederatedShareProvider')
- ->disableOriginalConstructor()->getMock();
- $this->federatedShareProvider->expects($this->any())
- ->method('isOutgoingServer2serverShareEnabled')->willReturn(true);
- $this->federatedShareProvider->expects($this->any())
- ->method('isIncomingServer2serverShareEnabled')->willReturn(true);
-
- $this->registerHttpHelper($httpHelperMock);
-
- $this->s2s = new \OCA\Files_Sharing\API\Server2Server($this->federatedShareProvider);
-
- $this->connection = \OC::$server->getDatabaseConnection();
- }
-
- protected function tearDown() {
- $query = \OCP\DB::prepare('DELETE FROM `*PREFIX*share_external`');
- $query->execute();
-
- $this->restoreHttpHelper();
-
- parent::tearDown();
- }
-
- /**
- * Register an http helper mock for testing purposes.
- * @param $httpHelper http helper mock
- */
- private function registerHttpHelper($httpHelper) {
- $this->oldHttpHelper = \OC::$server->query('HTTPHelper');
- \OC::$server->registerService('HTTPHelper', function ($c) use ($httpHelper) {
- return $httpHelper;
- });
- }
-
- /**
- * Restore the original http helper
- */
- private function restoreHttpHelper() {
- $oldHttpHelper = $this->oldHttpHelper;
- \OC::$server->registerService('HTTPHelper', function ($c) use ($oldHttpHelper) {
- return $oldHttpHelper;
- });
- }
-
- /**
- * @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['remoteId'] = 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`, `share_with`)
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
- ');
- $dummy->execute(array(\OCP\Share::SHARE_TYPE_REMOTE, self::TEST_FILES_SHARING_API_USER1, 'test', '1', '/1', '1', '/test.txt', '1', time(), 'token', 'foo@bar'));
-
- $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);
- }
-
- function testDeclineShareMultiple() {
- $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`, `share_with`)
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
- ');
- $dummy->execute(array(\OCP\Share::SHARE_TYPE_REMOTE, self::TEST_FILES_SHARING_API_USER1, 'test', '1', '/1', '1', '/test.txt', '1', time(), 'token1', 'foo@bar'));
- $dummy->execute(array(\OCP\Share::SHARE_TYPE_REMOTE, self::TEST_FILES_SHARING_API_USER1, 'test', '1', '/1', '1', '/test.txt', '1', time(), 'token2', 'bar@bar'));
-
- $verify = \OCP\DB::prepare('SELECT * FROM `*PREFIX*share`');
- $result = $verify->execute();
- $data = $result->fetchAll();
- $this->assertCount(2, $data);
-
- $_POST['token'] = 'token1';
- $this->s2s->declineShare(array('id' => $data[0]['id']));
-
- $verify = \OCP\DB::prepare('SELECT * FROM `*PREFIX*share`');
- $result = $verify->execute();
- $data = $result->fetchAll();
- $this->assertCount(1, $data);
- $this->assertEquals('bar@bar', $data[0]['share_with']);
-
- $_POST['token'] = 'token2';
- $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);
- }
-
- /**
- * @dataProvider dataTestDeleteUser
- */
- function testDeleteUser($toDelete, $expected, $remainingUsers) {
- $this->createDummyS2SShares();
-
- $discoveryManager = new \OCA\FederatedFileSharing\DiscoveryManager(
- \OC::$server->getMemCacheFactory(),
- \OC::$server->getHTTPClientService()
- );
- $manager = new OCA\Files_Sharing\External\Manager(
- \OC::$server->getDatabaseConnection(),
- \OC\Files\Filesystem::getMountManager(),
- \OC\Files\Filesystem::getLoader(),
- \OC::$server->getHTTPHelper(),
- \OC::$server->getNotificationManager(),
- $discoveryManager,
- $toDelete
- );
-
- $manager->removeUserShares($toDelete);
-
- $query = $this->connection->prepare('SELECT `user` FROM `*PREFIX*share_external`');
- $query->execute();
- $result = $query->fetchAll();
-
- foreach ($result as $r) {
- $remainingShares[$r['user']] = isset($remainingShares[$r['user']]) ? $remainingShares[$r['user']] + 1 : 1;
- }
-
- $this->assertSame($remainingUsers, count($remainingShares));
-
- foreach ($expected as $key => $value) {
- if ($key === $toDelete) {
- $this->assertArrayNotHasKey($key, $remainingShares);
- } else {
- $this->assertSame($value, $remainingShares[$key]);
- }
- }
-
- }
-
- function dataTestDeleteUser() {
- return array(
- array('user1', array('user1' => 0, 'user2' => 3, 'user3' => 3), 2),
- array('user2', array('user1' => 4, 'user2' => 0, 'user3' => 3), 2),
- array('user3', array('user1' => 4, 'user2' => 3, 'user3' => 0), 2),
- array('user4', array('user1' => 4, 'user2' => 3, 'user3' => 3), 3),
- );
- }
-
- private function createDummyS2SShares() {
- $query = $this->connection->prepare('
- INSERT INTO `*PREFIX*share_external`
- (`remote`, `share_token`, `password`, `name`, `owner`, `user`, `mountpoint`, `mountpoint_hash`, `remote_id`, `accepted`)
- VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
- ');
-
- $users = array('user1', 'user2', 'user3');
-
- for ($i = 0; $i < 10; $i++) {
- $user = $users[$i%3];
- $query->execute(array('remote', 'token', 'password', 'name', 'owner', $user, 'mount point', $i, $i, 0));
- }
-
- $query = $this->connection->prepare('SELECT `id` FROM `*PREFIX*share_external`');
- $query->execute();
- $dummyEntries = $query->fetchAll();
-
- $this->assertSame(10, count($dummyEntries));
- }
-
-}