From 43cd3d110889cdee5220ce4adac6878ed8ae0634 Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Tue, 22 Jun 2021 18:33:27 +0200 Subject: [PATCH] Redirect public view to public calendar ics endpoint if requested with Accept: 'text/calendar' The server already does the request with the following header `Accept: 'text/calendar, application/calendar+json, application/calendar+xml'`. `text/calendar` isn't a MIME type requested by common browsers. Closes https://github.com/nextcloud/server/issues/17746 Signed-off-by: Thomas Citharel --- lib/Controller/PublicViewController.php | 10 ++++++++-- .../php/unit/Controller/PublicViewControllerTest.php | 11 +++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/lib/Controller/PublicViewController.php b/lib/Controller/PublicViewController.php index 0e5271b98..d40cd9b2e 100644 --- a/lib/Controller/PublicViewController.php +++ b/lib/Controller/PublicViewController.php @@ -25,6 +25,8 @@ namespace OCA\Calendar\Controller; use OCP\AppFramework\Controller; use OCP\AppFramework\Http\ContentSecurityPolicy; +use OCP\AppFramework\Http\RedirectResponse; +use OCP\AppFramework\Http\Response; use OCP\AppFramework\Http\TemplateResponse; use OCP\IConfig; use OCP\IInitialStateService; @@ -79,9 +81,13 @@ class PublicViewController extends Controller { * @NoCSRFRequired * * @param string $token - * @return TemplateResponse + * @return Response */ - public function publicIndexWithBranding(string $token):TemplateResponse { + public function publicIndexWithBranding(string $token):Response { + $acceptHeader = $this->request->getHeader('Accept'); + if (strpos($acceptHeader, 'text/calendar') !== false) { + return new RedirectResponse($this->urlGenerator->linkTo('', 'remote.php') . '/dav/public-calendars/' . $token . '/?export'); + } return $this->publicIndex($token, 'public'); } diff --git a/tests/php/unit/Controller/PublicViewControllerTest.php b/tests/php/unit/Controller/PublicViewControllerTest.php index f74575c60..17dd2b502 100644 --- a/tests/php/unit/Controller/PublicViewControllerTest.php +++ b/tests/php/unit/Controller/PublicViewControllerTest.php @@ -23,6 +23,7 @@ declare(strict_types=1); */ namespace OCA\Calendar\Controller; +use OCP\AppFramework\Http\RedirectResponse; use OCP\AppFramework\Http\TemplateResponse; use OCP\IConfig; use OCP\IInitialStateService; @@ -129,6 +130,16 @@ class PublicViewControllerTest extends TestCase { $this->assertEquals('main', $response->getTemplateName()); } + public function testRedirectionIfRequestedWithAcceptCalendarHeader(): void { + $endpoint = 'https://somewhere.net/remote.php'; + + $this->request->expects(self::once())->method('getHeader')->with('Accept')->willReturn('text/calendar'); + $this->urlGenerator->expects(self::once())->method('linkTo')->with('', 'remote.php')->willReturn($endpoint); + $response = $this->controller->publicIndexWithBranding('some-token'); + self::assertInstanceOf(RedirectResponse::class, $response); + self::assertEquals($endpoint . '/dav/public-calendars/some-token/?export', $response->getRedirectURL()); + } + public function testPublicIndexForEmbedding():void { $this->config->expects(self::any()) ->method('getAppValue')