From 11c31e94fe6afaaba7c94a009cc931a5515d77a1 Mon Sep 17 00:00:00 2001 From: Morris Jobke Date: Tue, 26 Sep 2017 11:21:39 +0200 Subject: [PATCH] Improve exception handling If there is an exception in the template handling then a white page is shown. This improves the handling of this and shows text only about the internal error. To test this just setup redis as cache and then disable the php-redis module. Signed-off-by: Morris Jobke --- index.php | 11 ++++++++++- lib/private/Log.php | 3 +++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/index.php b/index.php index cd95b0c796..f45b67811f 100644 --- a/index.php +++ b/index.php @@ -47,7 +47,16 @@ try { OC_Template::printExceptionErrorPage($ex); } catch (\OC\HintException $ex) { OC_Response::setStatus(OC_Response::STATUS_SERVICE_UNAVAILABLE); - OC_Template::printErrorPage($ex->getMessage(), $ex->getHint()); + try { + OC_Template::printErrorPage($ex->getMessage(), $ex->getHint()); + } catch (Exception $ex2) { + \OC::$server->getLogger()->logException($ex, array('app' => 'index')); + \OC::$server->getLogger()->logException($ex2, array('app' => 'index')); + + //show the user a detailed error page + OC_Response::setStatus(OC_Response::STATUS_INTERNAL_SERVER_ERROR); + OC_Template::printExceptionErrorPage($ex); + } } catch (\OC\User\LoginException $ex) { OC_Response::setStatus(OC_Response::STATUS_FORBIDDEN); OC_Template::printErrorPage($ex->getMessage(), $ex->getMessage()); diff --git a/lib/private/Log.php b/lib/private/Log.php index d93b29414e..39577d2387 100644 --- a/lib/private/Log.php +++ b/lib/private/Log.php @@ -331,6 +331,9 @@ class Log implements ILogger { 'Line' => $exception->getLine(), ); $data['Trace'] = preg_replace('!(' . implode('|', $this->methodsWithSensitiveParameters) . ')\(.*\)!', '$1(*** sensitive parameters replaced ***)', $data['Trace']); + if ($exception instanceof HintException) { + $data['Hint'] = $exception->getHint(); + } $msg = isset($context['message']) ? $context['message'] : 'Exception'; $msg .= ': ' . json_encode($data); $this->log($level, $msg, $context);