diff options
author | Ferdinand Thiessen <opensource@fthiessen.de> | 2024-09-09 00:21:50 +0200 |
---|---|---|
committer | Ferdinand Thiessen <opensource@fthiessen.de> | 2024-10-28 15:52:27 +0100 |
commit | c84c256261cc3e518594286fc334797bc99245cc (patch) | |
tree | ddc2dd1001197c129ef134aa867b954a07076823 /apps/files_sharing/tests | |
parent | 988b6002ed8ed87aa2c4cfa060e20fff91d23190 (diff) | |
download | nextcloud-server-c84c256261cc3e518594286fc334797bc99245cc.tar.gz nextcloud-server-c84c256261cc3e518594286fc334797bc99245cc.zip |
fix: Adjust preview for view-only sharesfix/view-only-preview
Previously there was a different behavior for public shares (link-shares) and internal shares,
if the user disabled the view permission.
The legacy UI for public shares simply "disabled" the context menu and hided all download actions.
With Nextcloud 31 all share types use the consistent permissions attributes,
which simplifies code, but caused a regression: Images can no longer been viewed.
Because on 30 and before the attribute was not set, previews for view-only files
were still allowed. Now with 31 we need a new way to allow "viewing" shares.
So this is allowing previews for those files, but only for internal usage.
This is done by settin a special header, which only works with custom requests,
and not by opening the URL directly.
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
Diffstat (limited to 'apps/files_sharing/tests')
-rw-r--r-- | apps/files_sharing/tests/Controller/PublicPreviewControllerTest.php | 121 |
1 files changed, 111 insertions, 10 deletions
diff --git a/apps/files_sharing/tests/Controller/PublicPreviewControllerTest.php b/apps/files_sharing/tests/Controller/PublicPreviewControllerTest.php index 700406c97ba..bd64cfc60b4 100644 --- a/apps/files_sharing/tests/Controller/PublicPreviewControllerTest.php +++ b/apps/files_sharing/tests/Controller/PublicPreviewControllerTest.php @@ -19,6 +19,7 @@ use OCP\IPreview; use OCP\IRequest; use OCP\ISession; use OCP\Share\Exceptions\ShareNotFound; +use OCP\Share\IAttributes; use OCP\Share\IManager; use OCP\Share\IShare; use PHPUnit\Framework\MockObject\MockObject; @@ -26,15 +27,12 @@ use Test\TestCase; class PublicPreviewControllerTest extends TestCase { - /** @var IPreview|\PHPUnit\Framework\MockObject\MockObject */ - private $previewManager; - /** @var IManager|\PHPUnit\Framework\MockObject\MockObject */ - private $shareManager; - /** @var ITimeFactory|MockObject */ - private $timeFactory; + private IPreview&MockObject $previewManager; + private IManager&MockObject $shareManager; + private ITimeFactory&MockObject $timeFactory; + private IRequest&MockObject $request; - /** @var PublicPreviewController */ - private $controller; + private PublicPreviewController $controller; protected function setUp(): void { parent::setUp(); @@ -42,6 +40,7 @@ class PublicPreviewControllerTest extends TestCase { $this->previewManager = $this->createMock(IPreview::class); $this->shareManager = $this->createMock(IManager::class); $this->timeFactory = $this->createMock(ITimeFactory::class); + $this->request = $this->createMock(IRequest::class); $this->timeFactory->method('getTime') ->willReturn(1337); @@ -50,7 +49,7 @@ class PublicPreviewControllerTest extends TestCase { $this->controller = new PublicPreviewController( 'files_sharing', - $this->createMock(IRequest::class), + $this->request, $this->shareManager, $this->createMock(ISession::class), $this->previewManager @@ -104,7 +103,109 @@ class PublicPreviewControllerTest extends TestCase { $this->assertEquals($expected, $res); } - public function testPreviewFile(): void { + public function testShareNoDownload() { + $share = $this->createMock(IShare::class); + $this->shareManager->method('getShareByToken') + ->with($this->equalTo('token')) + ->willReturn($share); + + $share->method('getPermissions') + ->willReturn(Constants::PERMISSION_READ); + + $attributes = $this->createMock(IAttributes::class); + $attributes->method('getAttribute') + ->with('permissions', 'download') + ->willReturn(false); + $share->method('getAttributes') + ->willReturn($attributes); + + $res = $this->controller->getPreview('token', 'file', 10, 10); + $expected = new DataResponse([], Http::STATUS_FORBIDDEN); + + $this->assertEquals($expected, $res); + } + + public function testShareNoDownloadButPreviewHeader() { + $share = $this->createMock(IShare::class); + $this->shareManager->method('getShareByToken') + ->with($this->equalTo('token')) + ->willReturn($share); + + $share->method('getPermissions') + ->willReturn(Constants::PERMISSION_READ); + + $attributes = $this->createMock(IAttributes::class); + $attributes->method('getAttribute') + ->with('permissions', 'download') + ->willReturn(false); + $share->method('getAttributes') + ->willReturn($attributes); + + $this->request->method('getHeader') + ->with('X-NC-Preview') + ->willReturn('true'); + + $file = $this->createMock(File::class); + $share->method('getNode') + ->willReturn($file); + + $preview = $this->createMock(ISimpleFile::class); + $preview->method('getName')->willReturn('name'); + $preview->method('getMTime')->willReturn(42); + $this->previewManager->method('getPreview') + ->with($this->equalTo($file), 10, 10, false) + ->willReturn($preview); + + $preview->method('getMimeType') + ->willReturn('myMime'); + + $res = $this->controller->getPreview('token', 'file', 10, 10, true); + $expected = new FileDisplayResponse($preview, Http::STATUS_OK, ['Content-Type' => 'myMime']); + $expected->cacheFor(15 * 60); + $this->assertEquals($expected, $res); + } + + public function testShareWithAttributes() { + $share = $this->createMock(IShare::class); + $this->shareManager->method('getShareByToken') + ->with($this->equalTo('token')) + ->willReturn($share); + + $share->method('getPermissions') + ->willReturn(Constants::PERMISSION_READ); + + $attributes = $this->createMock(IAttributes::class); + $attributes->method('getAttribute') + ->with('permissions', 'download') + ->willReturn(true); + $share->method('getAttributes') + ->willReturn($attributes); + + $this->request->method('getHeader') + ->with('X-NC-Preview') + ->willReturn('true'); + + $file = $this->createMock(File::class); + $share->method('getNode') + ->willReturn($file); + + $preview = $this->createMock(ISimpleFile::class); + $preview->method('getName')->willReturn('name'); + $preview->method('getMTime')->willReturn(42); + $this->previewManager->method('getPreview') + ->with($this->equalTo($file), 10, 10, false) + ->willReturn($preview); + + $preview->method('getMimeType') + ->willReturn('myMime'); + + $res = $this->controller->getPreview('token', 'file', 10, 10, true); + $expected = new FileDisplayResponse($preview, Http::STATUS_OK, ['Content-Type' => 'myMime']); + $expected->cacheFor(3600 * 24); + $this->assertEquals($expected, $res); + } + + public function testPreviewFile() { $share = $this->createMock(IShare::class); $this->shareManager->method('getShareByToken') ->with($this->equalTo('token')) |