Display error details even with dev.debug set to false

It makes more sense to display the error even if it's unexpected.
Only for logged in users.

Fixes #1606
This commit is contained in:
ArthurHoaro 2020-11-05 19:45:41 +01:00
parent 48df9f45b8
commit cfdd209440
5 changed files with 58 additions and 10 deletions

View file

@ -26,8 +26,14 @@ public function __invoke(Request $request, Response $response, \Throwable $throw
$response = $response->withStatus($throwable->getCode()); $response = $response->withStatus($throwable->getCode());
} else { } else {
// Internal error (any other Throwable) // Internal error (any other Throwable)
if ($this->container->conf->get('dev.debug', false)) { if ($this->container->conf->get('dev.debug', false) || $this->container->loginManager->isLoggedIn()) {
$this->assignView('message', $throwable->getMessage()); $this->assignView('message', t('Error: ') . $throwable->getMessage());
$this->assignView(
'text',
'<a href="https://github.com/shaarli/Shaarli/issues/new">'
. t('Please report it on Github.')
. '</a>'
);
$this->assignView('stacktrace', exception2text($throwable)); $this->assignView('stacktrace', exception2text($throwable));
} else { } else {
$this->assignView('message', t('An unexpected error occurred.')); $this->assignView('message', t('An unexpected error occurred.'));
@ -36,7 +42,6 @@ public function __invoke(Request $request, Response $response, \Throwable $throw
$response = $response->withStatus(500); $response = $response->withStatus(500);
} }
return $response->write($this->render('error')); return $response->write($this->render('error'));
} }
} }

View file

@ -1266,11 +1266,15 @@ form {
margin: 70px 0 25px; margin: 70px 0 25px;
} }
a {
color: var(--main-color);
}
pre { pre {
margin: 0 20%; margin: 0 20%;
padding: 20px 0; padding: 20px 0;
text-align: left; text-align: left;
line-height: .7em; line-height: 1em;
} }
} }

View file

@ -1,8 +1,8 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: Shaarli\n" "Project-Id-Version: Shaarli\n"
"POT-Creation-Date: 2020-11-05 16:47+0100\n" "POT-Creation-Date: 2020-11-05 19:43+0100\n"
"PO-Revision-Date: 2020-11-05 16:48+0100\n" "PO-Revision-Date: 2020-11-05 19:44+0100\n"
"Last-Translator: \n" "Last-Translator: \n"
"Language-Team: Shaarli\n" "Language-Team: Shaarli\n"
"Language: fr_FR\n" "Language: fr_FR\n"
@ -501,7 +501,15 @@ msgstr "mois"
msgid "Monthly" msgid "Monthly"
msgstr "Mensuel" msgstr "Mensuel"
#: application/front/controller/visitor/ErrorController.php:33 #: application/front/controller/visitor/ErrorController.php:30
msgid "Error: "
msgstr "Erreur : "
#: application/front/controller/visitor/ErrorController.php:34
msgid "Please report it on Github."
msgstr "Merci de la rapporter sur Github."
#: application/front/controller/visitor/ErrorController.php:39
msgid "An unexpected error occurred." msgid "An unexpected error occurred."
msgstr "Une erreur inattendue s'est produite." msgstr "Une erreur inattendue s'est produite."

View file

@ -50,7 +50,31 @@ public function testDisplayFrontExceptionError(): void
} }
/** /**
* Test displaying error with any exception (no debug): only display an error occurred with HTTP 500. * Test displaying error with any exception (no debug) while logged in:
* display full error details
*/
public function testDisplayAnyExceptionErrorNoDebugLoggedIn(): void
{
$request = $this->createMock(Request::class);
$response = new Response();
// Save RainTPL assigned variables
$assignedVariables = [];
$this->assignTemplateVars($assignedVariables);
$this->container->loginManager->method('isLoggedIn')->willReturn(true);
$result = ($this->controller)($request, $response, new \Exception('abc'));
static::assertSame(500, $result->getStatusCode());
static::assertSame('Error: abc', $assignedVariables['message']);
static::assertContainsPolyfill('Please report it on Github', $assignedVariables['text']);
static::assertArrayHasKey('stacktrace', $assignedVariables);
}
/**
* Test displaying error with any exception (no debug) while logged out:
* display standard error without detail
*/ */
public function testDisplayAnyExceptionErrorNoDebug(): void public function testDisplayAnyExceptionErrorNoDebug(): void
{ {
@ -61,10 +85,13 @@ public function testDisplayAnyExceptionErrorNoDebug(): void
$assignedVariables = []; $assignedVariables = [];
$this->assignTemplateVars($assignedVariables); $this->assignTemplateVars($assignedVariables);
$this->container->loginManager->method('isLoggedIn')->willReturn(false);
$result = ($this->controller)($request, $response, new \Exception('abc')); $result = ($this->controller)($request, $response, new \Exception('abc'));
static::assertSame(500, $result->getStatusCode()); static::assertSame(500, $result->getStatusCode());
static::assertSame('An unexpected error occurred.', $assignedVariables['message']); static::assertSame('An unexpected error occurred.', $assignedVariables['message']);
static::assertArrayNotHasKey('text', $assignedVariables);
static::assertArrayNotHasKey('stacktrace', $assignedVariables); static::assertArrayNotHasKey('stacktrace', $assignedVariables);
} }
} }

View file

@ -9,13 +9,17 @@
<div id="pageError" class="page-error-container center"> <div id="pageError" class="page-error-container center">
<h2>{$message}</h2> <h2>{$message}</h2>
<img src="{$asset_path}/img/sad_star.png#" alt="">
{if="!empty($text)"}
<p>{$text}</p>
{/if}
{if="!empty($stacktrace)"} {if="!empty($stacktrace)"}
<pre> <pre>
{$stacktrace} {$stacktrace}
</pre> </pre>
{/if} {/if}
<img src="{$asset_path}/img/sad_star.png#" alt="">
</div> </div>
{include="page.footer"} {include="page.footer"}
</body> </body>