From 83fcb68527d9951a64a4bbe7c686a669be12c769 Mon Sep 17 00:00:00 2001 From: Daniel Kesselberg Date: Sun, 22 Dec 2024 17:18:28 +0100 Subject: [PATCH 1/4] Revert "fix: Re-throwing the TypeError to prevent exposing the installation path" This reverts commit ca3733de234e03e384c7f1de22ff241e21bb1931. Signed-off-by: Daniel Kesselberg --- apps/dav/lib/Connector/Sabre/Server.php | 92 ------------------------- 1 file changed, 92 deletions(-) diff --git a/apps/dav/lib/Connector/Sabre/Server.php b/apps/dav/lib/Connector/Sabre/Server.php index a7314d812dceb..b7ca8a0a1c0fe 100644 --- a/apps/dav/lib/Connector/Sabre/Server.php +++ b/apps/dav/lib/Connector/Sabre/Server.php @@ -7,9 +7,6 @@ */ namespace OCA\DAV\Connector\Sabre; -use Sabre\DAV\Exception; -use Sabre\DAV\Version; - /** * Class \OCA\DAV\Connector\Sabre\Server * @@ -28,93 +25,4 @@ public function __construct($treeOrNode = null) { self::$exposeVersion = false; $this->enablePropfindDepthInfinity = true; } - - /** - * - * @return void - */ - public function start() { - try { - // If nginx (pre-1.2) is used as a proxy server, and SabreDAV as an - // origin, we must make sure we send back HTTP/1.0 if this was - // requested. - // This is mainly because nginx doesn't support Chunked Transfer - // Encoding, and this forces the webserver SabreDAV is running on, - // to buffer entire responses to calculate Content-Length. - $this->httpResponse->setHTTPVersion($this->httpRequest->getHTTPVersion()); - - // Setting the base url - $this->httpRequest->setBaseUrl($this->getBaseUri()); - $this->invokeMethod($this->httpRequest, $this->httpResponse); - } catch (\Throwable $e) { - if ($e instanceof \TypeError) { - /* - * The TypeError includes the file path where the error occurred, - * potentially revealing the installation directory. - * - * By re-throwing the exception, we ensure that the - * default exception handler processes it. - */ - throw $e; - } - - try { - $this->emit('exception', [$e]); - } catch (\Exception $ignore) { - } - - $DOM = new \DOMDocument('1.0', 'utf-8'); - $DOM->formatOutput = true; - - $error = $DOM->createElementNS('DAV:', 'd:error'); - $error->setAttribute('xmlns:s', self::NS_SABREDAV); - $DOM->appendChild($error); - - $h = function ($v) { - return htmlspecialchars((string)$v, ENT_NOQUOTES, 'UTF-8'); - }; - - if (self::$exposeVersion) { - $error->appendChild($DOM->createElement('s:sabredav-version', $h(Version::VERSION))); - } - - $error->appendChild($DOM->createElement('s:exception', $h(get_class($e)))); - $error->appendChild($DOM->createElement('s:message', $h($e->getMessage()))); - if ($this->debugExceptions) { - $error->appendChild($DOM->createElement('s:file', $h($e->getFile()))); - $error->appendChild($DOM->createElement('s:line', $h($e->getLine()))); - $error->appendChild($DOM->createElement('s:code', $h($e->getCode()))); - $error->appendChild($DOM->createElement('s:stacktrace', $h($e->getTraceAsString()))); - } - - if ($this->debugExceptions) { - $previous = $e; - while ($previous = $previous->getPrevious()) { - $xPrevious = $DOM->createElement('s:previous-exception'); - $xPrevious->appendChild($DOM->createElement('s:exception', $h(get_class($previous)))); - $xPrevious->appendChild($DOM->createElement('s:message', $h($previous->getMessage()))); - $xPrevious->appendChild($DOM->createElement('s:file', $h($previous->getFile()))); - $xPrevious->appendChild($DOM->createElement('s:line', $h($previous->getLine()))); - $xPrevious->appendChild($DOM->createElement('s:code', $h($previous->getCode()))); - $xPrevious->appendChild($DOM->createElement('s:stacktrace', $h($previous->getTraceAsString()))); - $error->appendChild($xPrevious); - } - } - - if ($e instanceof Exception) { - $httpCode = $e->getHTTPCode(); - $e->serialize($this, $error); - $headers = $e->getHTTPHeaders($this); - } else { - $httpCode = 500; - $headers = []; - } - $headers['Content-Type'] = 'application/xml; charset=utf-8'; - - $this->httpResponse->setStatus($httpCode); - $this->httpResponse->setHeaders($headers); - $this->httpResponse->setBody($DOM->saveXML()); - $this->sapi->sendResponse($this->httpResponse); - } - } } From b1717bf2f440569b24d358c84e02eebd4afa927c Mon Sep 17 00:00:00 2001 From: Daniel Kesselberg Date: Sun, 22 Dec 2024 17:18:46 +0100 Subject: [PATCH 2/4] fix(dav): Always respond custom error page on exceptions This reverts commit 6b383faf418dc7d748197cf30c65e5220dfd2def. Signed-off-by: Daniel Kesselberg --- .../composer/composer/autoload_classmap.php | 2 +- .../dav/composer/composer/autoload_static.php | 2 +- .../dav/lib/Connector/Sabre/ServerFactory.php | 6 +- ...rrorPagePlugin.php => ErrorPagePlugin.php} | 82 ++++++++++--------- apps/dav/lib/Server.php | 6 +- .../caldavtest/tests/CalDAV/sync-report.xml | 2 +- ...PluginTest.php => ErrorPagePluginTest.php} | 8 +- build/integration/dav_features/caldav.feature | 18 ++-- .../integration/dav_features/carddav.feature | 15 ++-- 9 files changed, 66 insertions(+), 75 deletions(-) rename apps/dav/lib/Files/{BrowserErrorPagePlugin.php => ErrorPagePlugin.php} (50%) rename apps/dav/tests/unit/DAV/{BrowserErrorPagePluginTest.php => ErrorPagePluginTest.php} (81%) diff --git a/apps/dav/composer/composer/autoload_classmap.php b/apps/dav/composer/composer/autoload_classmap.php index a70aba9f84218..1bba8ce5f4bc7 100644 --- a/apps/dav/composer/composer/autoload_classmap.php +++ b/apps/dav/composer/composer/autoload_classmap.php @@ -277,7 +277,7 @@ 'OCA\\DAV\\Events\\SubscriptionUpdatedEvent' => $baseDir . '/../lib/Events/SubscriptionUpdatedEvent.php', 'OCA\\DAV\\Exception\\ServerMaintenanceMode' => $baseDir . '/../lib/Exception/ServerMaintenanceMode.php', 'OCA\\DAV\\Exception\\UnsupportedLimitOnInitialSyncException' => $baseDir . '/../lib/Exception/UnsupportedLimitOnInitialSyncException.php', - 'OCA\\DAV\\Files\\BrowserErrorPagePlugin' => $baseDir . '/../lib/Files/BrowserErrorPagePlugin.php', + 'OCA\\DAV\\Files\\ErrorPagePlugin' => $baseDir . '/../lib/Files/ErrorPagePlugin.php', 'OCA\\DAV\\Files\\FileSearchBackend' => $baseDir . '/../lib/Files/FileSearchBackend.php', 'OCA\\DAV\\Files\\FilesHome' => $baseDir . '/../lib/Files/FilesHome.php', 'OCA\\DAV\\Files\\LazySearchBackend' => $baseDir . '/../lib/Files/LazySearchBackend.php', diff --git a/apps/dav/composer/composer/autoload_static.php b/apps/dav/composer/composer/autoload_static.php index 2d00105b54892..8a5626463ccc4 100644 --- a/apps/dav/composer/composer/autoload_static.php +++ b/apps/dav/composer/composer/autoload_static.php @@ -292,7 +292,7 @@ class ComposerStaticInitDAV 'OCA\\DAV\\Events\\SubscriptionUpdatedEvent' => __DIR__ . '/..' . '/../lib/Events/SubscriptionUpdatedEvent.php', 'OCA\\DAV\\Exception\\ServerMaintenanceMode' => __DIR__ . '/..' . '/../lib/Exception/ServerMaintenanceMode.php', 'OCA\\DAV\\Exception\\UnsupportedLimitOnInitialSyncException' => __DIR__ . '/..' . '/../lib/Exception/UnsupportedLimitOnInitialSyncException.php', - 'OCA\\DAV\\Files\\BrowserErrorPagePlugin' => __DIR__ . '/..' . '/../lib/Files/BrowserErrorPagePlugin.php', + 'OCA\\DAV\\Files\\ErrorPagePlugin' => __DIR__ . '/..' . '/../lib/Files/ErrorPagePlugin.php', 'OCA\\DAV\\Files\\FileSearchBackend' => __DIR__ . '/..' . '/../lib/Files/FileSearchBackend.php', 'OCA\\DAV\\Files\\FilesHome' => __DIR__ . '/..' . '/../lib/Files/FilesHome.php', 'OCA\\DAV\\Files\\LazySearchBackend' => __DIR__ . '/..' . '/../lib/Files/LazySearchBackend.php', diff --git a/apps/dav/lib/Connector/Sabre/ServerFactory.php b/apps/dav/lib/Connector/Sabre/ServerFactory.php index dc6384daefe46..adaa1eb38d9cc 100644 --- a/apps/dav/lib/Connector/Sabre/ServerFactory.php +++ b/apps/dav/lib/Connector/Sabre/ServerFactory.php @@ -12,7 +12,7 @@ use OCA\DAV\CalDAV\DefaultCalendarValidator; use OCA\DAV\DAV\CustomPropertiesBackend; use OCA\DAV\DAV\ViewOnlyPlugin; -use OCA\DAV\Files\BrowserErrorPagePlugin; +use OCA\DAV\Files\ErrorPagePlugin; use OCA\Theming\ThemingDefaults; use OCP\EventDispatcher\IEventDispatcher; use OCP\Files\Folder; @@ -90,9 +90,7 @@ public function createServer(string $baseUri, $server->addPlugin(new FakeLockerPlugin()); } - if (BrowserErrorPagePlugin::isBrowserRequest($this->request)) { - $server->addPlugin(new BrowserErrorPagePlugin()); - } + $server->addPlugin(new ErrorPagePlugin($this->request, $this->config)); // wait with registering these until auth is handled and the filesystem is setup $server->on('beforeMethod:*', function () use ($server, $objectTree, $viewCallBack): void { diff --git a/apps/dav/lib/Files/BrowserErrorPagePlugin.php b/apps/dav/lib/Files/ErrorPagePlugin.php similarity index 50% rename from apps/dav/lib/Files/BrowserErrorPagePlugin.php rename to apps/dav/lib/Files/ErrorPagePlugin.php index 46598db2040c4..ddf04d0f7632e 100644 --- a/apps/dav/lib/Files/BrowserErrorPagePlugin.php +++ b/apps/dav/lib/Files/ErrorPagePlugin.php @@ -7,17 +7,22 @@ */ namespace OCA\DAV\Files; -use OC\AppFramework\Http\Request; use OC_Template; use OCP\AppFramework\Http\ContentSecurityPolicy; +use OCP\IConfig; use OCP\IRequest; use Sabre\DAV\Exception; use Sabre\DAV\Server; use Sabre\DAV\ServerPlugin; -class BrowserErrorPagePlugin extends ServerPlugin { - /** @var Server */ - private $server; +class ErrorPagePlugin extends ServerPlugin { + private ?Server $server = null; + + public function __construct( + private IRequest $request, + private IConfig $config, + ) { + } /** * This initializes the plugin. @@ -26,35 +31,12 @@ class BrowserErrorPagePlugin extends ServerPlugin { * addPlugin is called. * * This method should set up the required event subscriptions. - * - * @param Server $server - * @return void */ - public function initialize(Server $server) { + public function initialize(Server $server): void { $this->server = $server; $server->on('exception', [$this, 'logException'], 1000); } - /** - * @param IRequest $request - * @return bool - */ - public static function isBrowserRequest(IRequest $request) { - if ($request->getMethod() !== 'GET') { - return false; - } - return $request->isUserAgent([ - Request::USER_AGENT_IE, - Request::USER_AGENT_MS_EDGE, - Request::USER_AGENT_CHROME, - Request::USER_AGENT_FIREFOX, - Request::USER_AGENT_SAFARI, - ]); - } - - /** - * @param \Throwable $ex - */ public function logException(\Throwable $ex): void { if ($ex instanceof Exception) { $httpCode = $ex->getHTTPCode(); @@ -65,7 +47,7 @@ public function logException(\Throwable $ex): void { } $this->server->httpResponse->addHeaders($headers); $this->server->httpResponse->setStatus($httpCode); - $body = $this->generateBody($httpCode); + $body = $this->generateBody($ex, $httpCode); $this->server->httpResponse->setBody($body); $csp = new ContentSecurityPolicy(); $this->server->httpResponse->addHeader('Content-Security-Policy', $csp->buildPolicy()); @@ -76,18 +58,32 @@ public function logException(\Throwable $ex): void { * @codeCoverageIgnore * @return bool|string */ - public function generateBody(int $httpCode) { - $request = \OC::$server->getRequest(); - - $templateName = 'exception'; - if ($httpCode === 403 || $httpCode === 404) { - $templateName = (string)$httpCode; + public function generateBody(\Throwable $ex, int $httpCode): mixed { + if ($this->acceptHtml()) { + $templateName = 'exception'; + $renderAs = 'guest'; + if ($httpCode === 403 || $httpCode === 404) { + $templateName = (string)$httpCode; + } + } else { + $templateName = 'xml_exception'; + $renderAs = null; + $this->server->httpResponse->setHeader('Content-Type', 'application/xml; charset=utf-8'); } - $content = new OC_Template('core', $templateName, 'guest'); + $debug = $this->config->getSystemValueBool('debug', false); + + $content = new OC_Template('core', $templateName, $renderAs); $content->assign('title', $this->server->httpResponse->getStatusText()); - $content->assign('remoteAddr', $request->getRemoteAddress()); - $content->assign('requestID', $request->getId()); + $content->assign('remoteAddr', $this->request->getRemoteAddress()); + $content->assign('requestID', $this->request->getId()); + $content->assign('debugMode', $debug); + $content->assign('errorClass', get_class($ex)); + $content->assign('errorMsg', $ex->getMessage()); + $content->assign('errorCode', $ex->getCode()); + $content->assign('file', $ex->getFile()); + $content->assign('line', $ex->getLine()); + $content->assign('exception', $ex); return $content->fetchPage(); } @@ -98,4 +94,14 @@ public function sendResponse() { $this->server->sapi->sendResponse($this->server->httpResponse); exit(); } + + private function acceptHtml(): bool { + foreach (explode(',', $this->request->getHeader('Accept')) as $part) { + $subparts = explode(';', $part); + if (str_ends_with($subparts[0], '/html')) { + return true; + } + } + return false; + } } diff --git a/apps/dav/lib/Server.php b/apps/dav/lib/Server.php index f07927ff0f95b..7dad981346092 100644 --- a/apps/dav/lib/Server.php +++ b/apps/dav/lib/Server.php @@ -54,7 +54,7 @@ use OCA\DAV\DAV\ViewOnlyPlugin; use OCA\DAV\Events\SabrePluginAddEvent; use OCA\DAV\Events\SabrePluginAuthInitEvent; -use OCA\DAV\Files\BrowserErrorPagePlugin; +use OCA\DAV\Files\ErrorPagePlugin; use OCA\DAV\Files\FileSearchBackend; use OCA\DAV\Files\LazySearchBackend; use OCA\DAV\Paginate\PaginatePlugin; @@ -246,9 +246,7 @@ public function __construct( $this->server->addPlugin(new FakeLockerPlugin()); } - if (BrowserErrorPagePlugin::isBrowserRequest($request)) { - $this->server->addPlugin(new BrowserErrorPagePlugin()); - } + $this->server->addPlugin(new ErrorPagePlugin($this->request, \OC::$server->getConfig())); $lazySearchBackend = new LazySearchBackend(); $this->server->addPlugin(new SearchPlugin($lazySearchBackend)); diff --git a/apps/dav/tests/testsuits/caldavtest/tests/CalDAV/sync-report.xml b/apps/dav/tests/testsuits/caldavtest/tests/CalDAV/sync-report.xml index fda5a5f3fe69a..ff4c0c170cd3d 100644 --- a/apps/dav/tests/testsuits/caldavtest/tests/CalDAV/sync-report.xml +++ b/apps/dav/tests/testsuits/caldavtest/tests/CalDAV/sync-report.xml @@ -2701,7 +2701,7 @@ prepostcondition error - {DAV:}valid-sync-token + {http://sabredav.org/ns}exception ignoreextras diff --git a/apps/dav/tests/unit/DAV/BrowserErrorPagePluginTest.php b/apps/dav/tests/unit/DAV/ErrorPagePluginTest.php similarity index 81% rename from apps/dav/tests/unit/DAV/BrowserErrorPagePluginTest.php rename to apps/dav/tests/unit/DAV/ErrorPagePluginTest.php index 088330cecff82..a3569f34bd76c 100644 --- a/apps/dav/tests/unit/DAV/BrowserErrorPagePluginTest.php +++ b/apps/dav/tests/unit/DAV/ErrorPagePluginTest.php @@ -7,11 +7,11 @@ */ namespace OCA\DAV\Tests\unit\DAV; -use OCA\DAV\Files\BrowserErrorPagePlugin; +use OCA\DAV\Files\ErrorPagePlugin; use Sabre\DAV\Exception\NotFound; use Sabre\HTTP\Response; -class BrowserErrorPagePluginTest extends \Test\TestCase { +class ErrorPagePluginTest extends \Test\TestCase { /** * @dataProvider providesExceptions @@ -19,8 +19,8 @@ class BrowserErrorPagePluginTest extends \Test\TestCase { * @param $exception */ public function test($expectedCode, $exception): void { - /** @var BrowserErrorPagePlugin | \PHPUnit\Framework\MockObject\MockObject $plugin */ - $plugin = $this->getMockBuilder(BrowserErrorPagePlugin::class)->setMethods(['sendResponse', 'generateBody'])->getMock(); + /** @var ErrorPagePlugin | \PHPUnit\Framework\MockObject\MockObject $plugin */ + $plugin = $this->getMockBuilder(ErrorPagePlugin::class)->disableOriginalConstructor()->setMethods(['sendResponse', 'generateBody'])->getMock(); $plugin->expects($this->once())->method('generateBody')->willReturn(':boom:'); $plugin->expects($this->once())->method('sendResponse'); /** @var \Sabre\DAV\Server | \PHPUnit\Framework\MockObject\MockObject $server */ diff --git a/build/integration/dav_features/caldav.feature b/build/integration/dav_features/caldav.feature index 031685b580dff..aa1e3f6bde840 100644 --- a/build/integration/dav_features/caldav.feature +++ b/build/integration/dav_features/caldav.feature @@ -5,8 +5,7 @@ Feature: caldav Given user "user0" exists When "admin" requests calendar "user0/MyCalendar" on the endpoint "/remote.php/dav/calendars/" Then The CalDAV HTTP status code should be "404" - And The exception is "Sabre\DAV\Exception\NotFound" - And The error message is "Node with name 'MyCalendar' could not be found" + And The exception is "Internal Server Error" Scenario: Accessing a not shared calendar of another user Given user "user0" exists @@ -14,8 +13,7 @@ Feature: caldav Given The CalDAV HTTP status code should be "201" When "user0" requests calendar "admin/MyCalendar" on the endpoint "/remote.php/dav/calendars/" Then The CalDAV HTTP status code should be "404" - And The exception is "Sabre\DAV\Exception\NotFound" - And The error message is "Calendar with name 'MyCalendar' could not be found" + And The exception is "Internal Server Error" Scenario: Accessing a not shared calendar of another user via the legacy endpoint Given user "user0" exists @@ -30,8 +28,7 @@ Feature: caldav Given user "user0" exists When "user0" requests calendar "admin/MyCalendar" on the endpoint "/remote.php/dav/calendars/" Then The CalDAV HTTP status code should be "404" - And The exception is "Sabre\DAV\Exception\NotFound" - And The error message is "Node with name 'MyCalendar' could not be found" + And The exception is "Internal Server Error" Scenario: Accessing a not existing calendar of another user via the legacy endpoint Given user "user0" exists @@ -44,8 +41,7 @@ Feature: caldav Given user "user0" exists When "user0" requests calendar "admin/MyCalendar" on the endpoint "/remote.php/dav/calendars/" Then The CalDAV HTTP status code should be "404" - And The exception is "Sabre\DAV\Exception\NotFound" - And The error message is "Node with name 'MyCalendar' could not be found" + And The exception is "Internal Server Error" Scenario: Creating a new calendar When "admin" creates a calendar named "MyCalendar" @@ -66,8 +62,7 @@ Feature: caldav Given user "user0" exists When "user0" sends a create calendar request to "admin/MyCalendar2" on the endpoint "/remote.php/dav/calendars/" Then The CalDAV HTTP status code should be "404" - And The exception is "Sabre\DAV\Exception\NotFound" - And The error message is "Node with name 'admin' could not be found" + And The exception is "Internal Server Error" Scenario: Create calendar request for existing calendar of another user Given user "user0" exists @@ -75,8 +70,7 @@ Feature: caldav Then The CalDAV HTTP status code should be "201" When "user0" sends a create calendar request to "admin/MyCalendar2" on the endpoint "/remote.php/dav/calendars/" Then The CalDAV HTTP status code should be "404" - And The exception is "Sabre\DAV\Exception\NotFound" - And The error message is "Node with name 'admin' could not be found" + And The exception is "Internal Server Error" Scenario: Update a principal's schedule-default-calendar-URL Given user "user0" exists diff --git a/build/integration/dav_features/carddav.feature b/build/integration/dav_features/carddav.feature index ffee11a284f49..5b285dba2f84a 100644 --- a/build/integration/dav_features/carddav.feature +++ b/build/integration/dav_features/carddav.feature @@ -4,15 +4,13 @@ Feature: carddav Scenario: Accessing a not existing addressbook of another user Given user "user0" exists When "admin" requests addressbook "user0/MyAddressbook" with statuscode "404" on the endpoint "/remote.php/dav/addressbooks/users/" - And The CardDAV exception is "Sabre\DAV\Exception\NotFound" - And The CardDAV error message is "Addressbook with name 'MyAddressbook' could not be found" + And The CardDAV exception is "Internal Server Error" Scenario: Accessing a not shared addressbook of another user Given user "user0" exists Given "admin" creates an addressbook named "MyAddressbook" with statuscode "201" When "user0" requests addressbook "admin/MyAddressbook" with statuscode "404" on the endpoint "/remote.php/dav/addressbooks/users/" - And The CardDAV exception is "Sabre\DAV\Exception\NotFound" - And The CardDAV error message is "Addressbook with name 'MyAddressbook' could not be found" + And The CardDAV exception is "Internal Server Error" Scenario: Accessing a not existing addressbook of another user via legacy endpoint Given user "user0" exists @@ -30,8 +28,7 @@ Feature: carddav Scenario: Accessing a not existing addressbook of myself Given user "user0" exists When "user0" requests addressbook "admin/MyAddressbook" with statuscode "404" on the endpoint "/remote.php/dav/addressbooks/users/" - And The CardDAV exception is "Sabre\DAV\Exception\NotFound" - And The CardDAV error message is "Addressbook with name 'MyAddressbook' could not be found" + And The CardDAV exception is "Internal Server Error" Scenario: Creating a new addressbook When "admin" creates an addressbook named "MyAddressbook" with statuscode "201" @@ -69,13 +66,11 @@ Feature: carddav Given user "user0" exists When "user0" sends a create addressbook request to "admin/MyAddressbook2" on the endpoint "/remote.php/dav/addressbooks/" Then The CardDAV HTTP status code should be "404" - And The CardDAV exception is "Sabre\DAV\Exception\NotFound" - And The CardDAV error message is "File not found: admin in 'addressbooks'" + And The CardDAV exception is "Internal Server Error" Scenario: Create addressbook request for existing addressbook of another user Given user "user0" exists When "admin" creates an addressbook named "MyAddressbook2" with statuscode "201" When "user0" sends a create addressbook request to "admin/MyAddressbook2" on the endpoint "/remote.php/dav/addressbooks/" Then The CardDAV HTTP status code should be "404" - And The CardDAV exception is "Sabre\DAV\Exception\NotFound" - And The CardDAV error message is "File not found: admin in 'addressbooks'" + And The CardDAV exception is "Internal Server Error" From ba5a04d86b1f83b44d1d369360ea6bd98de3fd74 Mon Sep 17 00:00:00 2001 From: Daniel Kesselberg Date: Sun, 22 Dec 2024 17:18:55 +0100 Subject: [PATCH 3/4] fix: Drop unnecessary exit This reverts commit 3c3b7f9edab8b87183d2d41fa9500f4cbb403484. Signed-off-by: Daniel Kesselberg --- apps/dav/lib/Files/ErrorPagePlugin.php | 1 - 1 file changed, 1 deletion(-) diff --git a/apps/dav/lib/Files/ErrorPagePlugin.php b/apps/dav/lib/Files/ErrorPagePlugin.php index ddf04d0f7632e..2b93f0e7a49ac 100644 --- a/apps/dav/lib/Files/ErrorPagePlugin.php +++ b/apps/dav/lib/Files/ErrorPagePlugin.php @@ -92,7 +92,6 @@ public function generateBody(\Throwable $ex, int $httpCode): mixed { */ public function sendResponse() { $this->server->sapi->sendResponse($this->server->httpResponse); - exit(); } private function acceptHtml(): bool { From 545c967a381ceffa6c841a25ee202999460d68a3 Mon Sep 17 00:00:00 2001 From: Daniel Kesselberg Date: Sun, 22 Dec 2024 17:19:03 +0100 Subject: [PATCH 4/4] fix: Override start method of \Sabre\DAV\Server to remove exception output This reverts commit cb6840fea567d724baa4e3838a6551fa5ae52383. Signed-off-by: Daniel Kesselberg --- apps/dav/lib/Connector/Sabre/Server.php | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/apps/dav/lib/Connector/Sabre/Server.php b/apps/dav/lib/Connector/Sabre/Server.php index b7ca8a0a1c0fe..610c79d56613e 100644 --- a/apps/dav/lib/Connector/Sabre/Server.php +++ b/apps/dav/lib/Connector/Sabre/Server.php @@ -25,4 +25,27 @@ public function __construct($treeOrNode = null) { self::$exposeVersion = false; $this->enablePropfindDepthInfinity = true; } + + // Copied from 3rdparty/sabre/dav/lib/DAV/Server.php + // Should be them exact same without the exception output. + public function start(): void { + try { + // If nginx (pre-1.2) is used as a proxy server, and SabreDAV as an + // origin, we must make sure we send back HTTP/1.0 if this was + // requested. + // This is mainly because nginx doesn't support Chunked Transfer + // Encoding, and this forces the webserver SabreDAV is running on, + // to buffer entire responses to calculate Content-Length. + $this->httpResponse->setHTTPVersion($this->httpRequest->getHTTPVersion()); + + // Setting the base url + $this->httpRequest->setBaseUrl($this->getBaseUri()); + $this->invokeMethod($this->httpRequest, $this->httpResponse); + } catch (\Throwable $e) { + try { + $this->emit('exception', [$e]); + } catch (\Exception $ignore) { + } + } + } }