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 
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
application/front/controller/visitor
assets/default/scss
inc/languages/fr/LC_MESSAGES
tests/front/controller/visitor
tpl/default

View file

@ -26,8 +26,14 @@ class ErrorController extends ShaarliVisitorController
$response = $response->withStatus($throwable->getCode());
} else {
// Internal error (any other Throwable)
if ($this->container->conf->get('dev.debug', false)) {
$this->assignView('message', $throwable->getMessage());
if ($this->container->conf->get('dev.debug', false) || $this->container->loginManager->isLoggedIn()) {
$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));
} else {
$this->assignView('message', t('An unexpected error occurred.'));
@ -36,7 +42,6 @@ class ErrorController extends ShaarliVisitorController
$response = $response->withStatus(500);
}
return $response->write($this->render('error'));
}
}

View file

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

View file

@ -1,8 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: Shaarli\n"
"POT-Creation-Date: 2020-11-05 16:47+0100\n"
"PO-Revision-Date: 2020-11-05 16:48+0100\n"
"POT-Creation-Date: 2020-11-05 19:43+0100\n"
"PO-Revision-Date: 2020-11-05 19:44+0100\n"
"Last-Translator: \n"
"Language-Team: Shaarli\n"
"Language: fr_FR\n"
@ -501,7 +501,15 @@ msgstr "mois"
msgid "Monthly"
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."
msgstr "Une erreur inattendue s'est produite."

View file

@ -50,7 +50,31 @@ class ErrorControllerTest extends TestCase
}
/**
* 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
{
@ -61,10 +85,13 @@ class ErrorControllerTest extends TestCase
$assignedVariables = [];
$this->assignTemplateVars($assignedVariables);
$this->container->loginManager->method('isLoggedIn')->willReturn(false);
$result = ($this->controller)($request, $response, new \Exception('abc'));
static::assertSame(500, $result->getStatusCode());
static::assertSame('An unexpected error occurred.', $assignedVariables['message']);
static::assertArrayNotHasKey('text', $assignedVariables);
static::assertArrayNotHasKey('stacktrace', $assignedVariables);
}
}

View file

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