Skip to content

Commit

Permalink
Adding new Symfony events for zipfile download and public link share
Browse files Browse the repository at this point in the history
Adding new Symfony events, to check, if creating
shares or downloading zips are blocked by any
apps or not.

Signed-off-by: Sujith H <[email protected]>
  • Loading branch information
sharidas committed Dec 21, 2017
1 parent 22f5f1e commit 738162e
Show file tree
Hide file tree
Showing 4 changed files with 83 additions and 0 deletions.
15 changes: 15 additions & 0 deletions apps/files_sharing/lib/API/Share20OCS.php
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
use OCP\Share\Exceptions\ShareNotFound;
use OCP\Share\IManager;
use OCP\Share\IShare;
use Symfony\Component\EventDispatcher\GenericEvent;

/**
* Class Share20OCS
Expand Down Expand Up @@ -69,6 +70,9 @@ class Share20OCS {
*/
private $additionalInfoField;

/** @var \Symfony\Component\EventDispatcher\EventDispatcherInterface */
private $eventDispatcher;

/**
* Share20OCS constructor.
*
Expand Down Expand Up @@ -103,6 +107,7 @@ public function __construct(
$this->l = $l10n;
$this->config = $config;
$this->additionalInfoField = $this->config->getAppValue('core', 'user_additional_info_field', '');
$this->eventDispatcher = \OC::$server->getEventDispatcher();
}

/**
Expand Down Expand Up @@ -272,6 +277,7 @@ public function deleteShare($id) {
* @return \OC\OCS\Result
*/
public function createShare() {
$event = new GenericEvent(null);
$share = $this->shareManager->newShare();

if (!$this->shareManager->shareApiEnabled()) {
Expand All @@ -287,6 +293,15 @@ public function createShare() {
}

$userFolder = $this->rootFolder->getUserFolder($this->currentUser->getUID());
$event->setArgument('userFolder', $userFolder);
$event->setArgument('path', $path);
$event->setArgument('name', $name);
$event->setArgument('run', true);
//Dispatch an event to see if creating shares is blocked by any app
$this->eventDispatcher->dispatch('file.beforecreateShare', $event);
if ($event->getArgument('run') === false) {
return new \OC\OCS\Result(null, 404, $this->l->t('No permission to create share'));
}
try {
$path = $userFolder->get($path);
} catch (NotFoundException $e) {
Expand Down
45 changes: 45 additions & 0 deletions apps/files_sharing/tests/API/Share20OCSTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
use OCP\IUserManager;
use OCP\Lock\LockedException;
use OCP\Share;
use Symfony\Component\EventDispatcher\GenericEvent;
use Test\TestCase;

/**
Expand Down Expand Up @@ -2822,4 +2823,48 @@ public function testGetShareAdditionalInfo($configValue, $expectedInfo) {

$this->assertEquals($expectedInfo, $result['share_with_additional_info']);
}

public function testCreateShareNotAllowed() {

$share = $this->newShare();
$this->shareManager->method('newShare')->willReturn($share);

$this->request
->method('getParam')
->will($this->returnValueMap([
['path', null, 'valid-path'],
['permissions', null, \OCP\Constants::PERMISSION_ALL],
['shareType', $this->any(), Share::SHARE_TYPE_USER],
['shareWith', $this->any(), 'invalidUser'],
]));

$userFolder = $this->createMock('\OCP\Files\Folder');
$this->rootFolder->expects($this->once())
->method('getUserFolder')
->with('currentUser')
->willReturn($userFolder);

$path = $this->createMock('\OCP\Files\File');
$storage = $this->createMock('OCP\Files\Storage');
$storage->method('instanceOfStorage')
->with('OCA\Files_Sharing\External\Storage')
->willReturn(false);
$path->method('getStorage')->willReturn($storage);

$expected = new \OC\OCS\Result(null, 404, 'No permission to create share');

$calledCreateEvent = [];
\OC::$server->getEventDispatcher()->addListener('file.beforecreateShare', function (GenericEvent $event) use (&$calledCreateEvent) {
$calledCreateEvent[] = "file.beforecreateShare";
$event->setArgument('run', false);
$calledCreateEvent[] = $event;
});
$result = $this->ocs->createShare();

$this->assertEquals($expected->getMeta(), $result->getMeta());
$this->assertEquals($expected->getData(), $result->getData());
$this->assertEquals('file.beforecreateShare', $calledCreateEvent[0]);
$this->assertInstanceOf(GenericEvent::class, $calledCreateEvent[1]);
$this->assertArrayHasKey('run', $calledCreateEvent[1]);
}
}
13 changes: 13 additions & 0 deletions apps/files_sharing/tests/ApiTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
use OCP\IL10N;
use OCP\IRequest;
use OCP\Share;
use Symfony\Component\EventDispatcher\GenericEvent;

/**
* Class ApiTest
Expand Down Expand Up @@ -115,6 +116,10 @@ private function createOCS($request, $userId) {
return vsprintf($text, $parameters);
}));

\OC::$server->getEventDispatcher()->addListener('file.beforecreateShare', function (GenericEvent $event) {
$event->setArgument('run', true);
});

return new \OCA\Files_Sharing\API\Share20OCS(
$this->shareManager,
\OC::$server->getGroupManager(),
Expand All @@ -137,10 +142,18 @@ function testCreateShareUserFile() {
$data['shareWith'] = self::TEST_FILES_SHARING_API_USER2;
$data['shareType'] = Share::SHARE_TYPE_USER;

$calledBeforeCreate = [];
\OC::$server->getEventDispatcher()->addListener('file.beforecreateShare', function (GenericEvent $event) use (&$calledBeforeCreate) {
$calledBeforeCreate[] = 'file.beforecreateShare';
$calledBeforeCreate[] = $event;
});
$request = $this->createRequest($data);
$ocs = $this->createOCS($request, self::TEST_FILES_SHARING_API_USER1);
$result = $ocs->createShare();

$this->assertEquals('file.beforecreateShare', $calledBeforeCreate[0]);
$this->assertInstanceOf(GenericEvent::class, $calledBeforeCreate[1]);
$this->assertTrue($calledBeforeCreate[1]->getArgument('run'));
$this->assertTrue($result->succeeded());
$data = $result->getData();
$this->assertEquals(19, $data['permissions']);
Expand Down
10 changes: 10 additions & 0 deletions lib/private/legacy/files.php
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,13 @@ public static function get($dir, $files, $params = null) {
}
}

//Dispatch an event to see if any apps have problem with download
$event = new \Symfony\Component\EventDispatcher\GenericEvent(null, ['files' => $files]);
OC::$server->getEventDispatcher()->dispatch('file.beforecreatezip', $event);
if ($event->hasArgument('run') and ($event->getArgument('run') === false) and ($event->hasArgument('message'))) {
throw new Exception();
}

$streamer = new Streamer();
OC_Util::obEnd();

Expand Down Expand Up @@ -183,6 +190,9 @@ public static function get($dir, $files, $params = null) {
OC::$server->getLogger()->logException($ex);
$l = \OC::$server->getL10N('core');
$hint = method_exists($ex, 'getHint') ? $ex->getHint() : '';
if ($event->hasArgument('message')) {
$hint .= ' ' . $event->getArgument('message');
}
\OC_Template::printErrorPage($l->t('File cannot be read'), $hint);
}
}
Expand Down

0 comments on commit 738162e

Please sign in to comment.