-
-
Notifications
You must be signed in to change notification settings - Fork 4.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[stable25] fix(dav): Always respond custom error page on exceptions #48304
Changes from all commits
beb31be
1522ecd
aff1f4b
af57c1b
fc6ab73
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
This file was deleted.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,127 @@ | ||
<?php | ||
/** | ||
* @copyright Copyright (c) 2016, ownCloud, Inc. | ||
* | ||
* @author Arthur Schiwon <blizzz@arthur-schiwon.de> | ||
* @author Christoph Wurst <christoph@winzerhof-wurst.at> | ||
* @author Lukas Reschke <lukas@statuscode.ch> | ||
* @author Thomas Müller <thomas.mueller@tmit.eu> | ||
* | ||
* @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\DAV\Files; | ||
|
||
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 ErrorPagePlugin extends ServerPlugin { | ||
private ?Server $server = null; | ||
private IRequest $request; | ||
private IConfig $config; | ||
|
||
public function __construct( | ||
IRequest $request, | ||
IConfig $config | ||
) { | ||
$this->request = $request; | ||
$this->config = $config; | ||
} | ||
|
||
/** | ||
* This initializes the plugin. | ||
* | ||
* This function is called by Sabre\DAV\Server, after | ||
* addPlugin is called. | ||
* | ||
* This method should set up the required event subscriptions. | ||
*/ | ||
public function initialize(Server $server): void { | ||
$this->server = $server; | ||
$server->on('exception', [$this, 'logException'], 1000); | ||
} | ||
|
||
public function logException(\Throwable $ex): void { | ||
if ($ex instanceof Exception) { | ||
$httpCode = $ex->getHTTPCode(); | ||
$headers = $ex->getHTTPHeaders($this->server); | ||
} else { | ||
$httpCode = 500; | ||
$headers = []; | ||
} | ||
$this->server->httpResponse->addHeaders($headers); | ||
Check notice Code scanning / Psalm PossiblyNullPropertyFetch Note
Cannot get property on possibly null variable $this->server of type Sabre\DAV\Server|null
Check notice Code scanning / Psalm PossiblyNullReference Note
Cannot call method addHeaders on possibly null value
|
||
$this->server->httpResponse->setStatus($httpCode); | ||
$body = $this->generateBody($ex, $httpCode); | ||
$this->server->httpResponse->setBody($body); | ||
|
||
$csp = new ContentSecurityPolicy(); | ||
$this->server->httpResponse->addHeader('Content-Security-Policy', $csp->buildPolicy()); | ||
$this->sendResponse(); | ||
} | ||
|
||
/** | ||
* @codeCoverageIgnore | ||
* @return string | ||
*/ | ||
public function generateBody(\Throwable $ex, int $httpCode) { | ||
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'); | ||
Check notice Code scanning / Psalm PossiblyNullPropertyFetch Note
Cannot get property on possibly null variable $this->server of type Sabre\DAV\Server|null
Check notice Code scanning / Psalm PossiblyNullReference Note
Cannot call method setHeader on possibly null value
|
||
} | ||
|
||
$debug = $this->config->getSystemValueBool('debug', false); | ||
|
||
$content = new OC_Template('core', $templateName, $renderAs); | ||
Check notice Code scanning / Psalm PossiblyNullArgument Note
Argument 3 of OC_Template::__construct cannot be null, possibly null value provided
|
||
$content->assign('title', $this->server->httpResponse->getStatusText()); | ||
Check notice Code scanning / Psalm PossiblyNullPropertyFetch Note
Cannot get property on possibly null variable $this->server of type Sabre\DAV\Server|null
Check notice Code scanning / Psalm PossiblyNullReference Note
Cannot call method getStatusText on possibly null value
|
||
$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(); | ||
} | ||
|
||
/** | ||
* @codeCoverageIgnore | ||
*/ | ||
public function sendResponse() { | ||
Check notice Code scanning / Psalm MissingReturnType Note
Method OCA\DAV\Files\ErrorPagePlugin::sendResponse does not have a return type, expecting void
|
||
$this->server->sapi->sendResponse($this->server->httpResponse); | ||
Check notice Code scanning / Psalm PossiblyNullPropertyFetch Note
Cannot get property on possibly null variable $this->server of type Sabre\DAV\Server|null
Check notice Code scanning / Psalm PossiblyNullReference Note
Cannot call method sendResponse on possibly null value
Check notice Code scanning / Psalm PossiblyNullPropertyFetch Note
Cannot get property on possibly null variable $this->server of type Sabre\DAV\Server|null
Check notice Code scanning / Psalm PossiblyNullArgument Note
Argument 1 of Sabre\HTTP\Sapi::sendResponse cannot be null, possibly null value provided
|
||
} | ||
|
||
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; | ||
} | ||
} |
Check notice
Code scanning / Psalm
PossiblyNullArgument Note