diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php index c17d9d7ad2..3121687a6e 100644 --- a/app/Exceptions/Handler.php +++ b/app/Exceptions/Handler.php @@ -2,52 +2,94 @@ namespace FireflyIII\Exceptions; +use ErrorException; use Exception; +use FireflyIII\Jobs\MailError; use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler; +use Request; + class Handler extends ExceptionHandler { - /** - * A list of the exception types that are not reported. - * - * @var array - */ - protected $dontReport = [ - // - ]; - /** * A list of the inputs that are never flashed for validation exceptions. * * @var array */ - protected $dontFlash = [ - 'password', - 'password_confirmation', - ]; + protected $dontFlash + = [ + 'password', + 'password_confirmation', + ]; + /** + * A list of the exception types that are not reported. + * + * @var array + */ + protected $dontReport + = [ + // + ]; + + /** + * Render an exception into an HTTP response. + * + * @param \Illuminate\Http\Request $request + * @param \Exception $exception + * + * @return \Illuminate\Http\Response + */ + public function render($request, Exception $exception) + { + if ($exception instanceof FireflyException || $exception instanceof ErrorException) { + + $isDebug = env('APP_DEBUG', false); + + return response()->view('errors.FireflyException', ['exception' => $exception, 'debug' => $isDebug], 500); + } + + return parent::render($request, $exception); + } /** * Report or log an exception. * * This is a great spot to send exceptions to Sentry, Bugsnag, etc. * - * @param \Exception $exception + * @param \Exception $exception + * * @return void */ public function report(Exception $exception) { + $doMailError = env('SEND_ERROR_MESSAGE', true); + if (($exception instanceof FireflyException || $exception instanceof ErrorException) && $doMailError) { + $userData = [ + 'id' => 0, + 'email' => 'unknown@example.com', + ]; + if (auth()->check()) { + $userData['id'] = auth()->user()->id; + $userData['email'] = auth()->user()->email; + } + $data = [ + 'class' => get_class($exception), + 'errorMessage' => $exception->getMessage(), + 'time' => date('r'), + 'stackTrace' => $exception->getTraceAsString(), + 'file' => $exception->getFile(), + 'line' => $exception->getLine(), + 'code' => $exception->getCode(), + 'version' => config('firefly.version'), + ]; + + // create job that will mail. + $ipAddress = Request::ip() ?? '0.0.0.0'; + $job = new MailError($userData, env('SITE_OWNER', ''), $ipAddress, $data); + dispatch($job); + } + + parent::report($exception); } - - /** - * Render an exception into an HTTP response. - * - * @param \Illuminate\Http\Request $request - * @param \Exception $exception - * @return \Illuminate\Http\Response - */ - public function render($request, Exception $exception) - { - return parent::render($request, $exception); - } }