From cf31d4276ccd851e23006927fc4c8a1667caa012 Mon Sep 17 00:00:00 2001 From: Dane Everitt Date: Sun, 3 Mar 2019 13:42:32 -0800 Subject: [PATCH] Fix a bug causing DataIntegrityExceptions to not be caught correctly and cause a second exception... whoops. --- CHANGELOG.md | 2 ++ app/Exceptions/Handler.php | 21 +++++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index af079ff9d..7d4361d3e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,8 @@ This project follows [Semantic Versioning](http://semver.org) guidelines. * Fixes the redis password not saving correctly when setting up the environment from the command line. * Fixes a bug with transaction handling in many areas of the application that would cause validation error messages and other session data to not be persisted properly when using the database as the session driver. +* Fix a bug introduced at some point in the past that causes internal data integrity exceptions to not bubble up to +the user correctly, leading to extraneous and confusing exception messages. ### Changed * `allocation_limit` for servers now defaults to a null value, and is not required in PATCH/POST requests when adding diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php index b74a71ea7..14cef0764 100644 --- a/app/Exceptions/Handler.php +++ b/app/Exceptions/Handler.php @@ -15,6 +15,7 @@ use Illuminate\Database\Eloquent\ModelNotFoundException; use Symfony\Component\HttpKernel\Exception\HttpException; use Pterodactyl\Exceptions\Repository\RecordNotFoundException; use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler; +use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface; class Handler extends ExceptionHandler { @@ -153,6 +154,26 @@ class Handler extends ExceptionHandler $connections->rollBack(0); } + // Because of some breaking change snuck into a Laravel update that didn't get caught + // by any of the tests, exceptions implementing the HttpExceptionInterface get marked + // as being HttpExceptions, but aren't actually implementing the HttpException abstract. + // + // This is incredibly annoying because we can't just temporarily override the handler to + // allow these (at least without taking on a high maintenance cost). Laravel 5.8 fixes this, + // so when we update (or have updated) this code can be removed. + // + // @see https://github.com/laravel/framework/pull/25975 + // @todo remove this code when upgrading to Laravel 5.8 + if ($exception instanceof HttpExceptionInterface && ! $exception instanceof HttpException) { + $exception = new HttpException( + $exception->getStatusCode(), + $exception->getMessage(), + $exception, + $exception->getHeaders(), + $exception->getCode() + ); + } + return parent::render($request, $exception); }