Merge branch 'develop' into dane/restore-backups
This commit is contained in:
commit
663143de0b
575 changed files with 6080 additions and 6864 deletions
|
@ -11,10 +11,10 @@ use Prologue\Alerts\AlertsMessageBag;
|
|||
|
||||
class DisplayException extends PterodactylException
|
||||
{
|
||||
const LEVEL_DEBUG = 'debug';
|
||||
const LEVEL_INFO = 'info';
|
||||
const LEVEL_WARNING = 'warning';
|
||||
const LEVEL_ERROR = 'error';
|
||||
public const LEVEL_DEBUG = 'debug';
|
||||
public const LEVEL_INFO = 'info';
|
||||
public const LEVEL_WARNING = 'warning';
|
||||
public const LEVEL_ERROR = 'error';
|
||||
|
||||
/**
|
||||
* @var string
|
||||
|
@ -25,9 +25,8 @@ class DisplayException extends PterodactylException
|
|||
* Exception constructor.
|
||||
*
|
||||
* @param string $message
|
||||
* @param Throwable|null $previous
|
||||
* @param string $level
|
||||
* @param int $code
|
||||
* @param int $code
|
||||
*/
|
||||
public function __construct($message, Throwable $previous = null, $level = self::LEVEL_ERROR, $code = 0)
|
||||
{
|
||||
|
@ -58,6 +57,7 @@ class DisplayException extends PterodactylException
|
|||
* request originated from an API hit, return the error in JSONAPI spec format.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
*
|
||||
* @return \Illuminate\Http\JsonResponse|\Illuminate\Http\RedirectResponse
|
||||
*/
|
||||
public function render($request)
|
||||
|
@ -83,7 +83,7 @@ class DisplayException extends PterodactylException
|
|||
*/
|
||||
public function report()
|
||||
{
|
||||
if (! $this->getPrevious() instanceof Exception || ! Handler::isReportable($this->getPrevious())) {
|
||||
if (!$this->getPrevious() instanceof Exception || !Handler::isReportable($this->getPrevious())) {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
|
|
@ -5,10 +5,14 @@ namespace Pterodactyl\Exceptions;
|
|||
use Exception;
|
||||
use Throwable;
|
||||
use PDOException;
|
||||
use Psr\Log\LoggerInterface;
|
||||
use Illuminate\Support\Arr;
|
||||
use Illuminate\Support\Str;
|
||||
use Swift_TransportException;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Support\Collection;
|
||||
use Illuminate\Container\Container;
|
||||
use Illuminate\Database\Connection;
|
||||
use Illuminate\Foundation\Application;
|
||||
use Illuminate\Auth\AuthenticationException;
|
||||
use Illuminate\Session\TokenMismatchException;
|
||||
use Illuminate\Validation\ValidationException;
|
||||
|
@ -43,17 +47,6 @@ class Handler extends ExceptionHandler
|
|||
ValidationException::class,
|
||||
];
|
||||
|
||||
/**
|
||||
* A list of exceptions that should be logged with cleaned stack
|
||||
* traces to avoid exposing credentials or other sensitive information.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $cleanStacks = [
|
||||
PDOException::class,
|
||||
Swift_TransportException::class,
|
||||
];
|
||||
|
||||
/**
|
||||
* A list of the inputs that are never flashed for validation exceptions.
|
||||
*
|
||||
|
@ -67,56 +60,40 @@ class Handler extends ExceptionHandler
|
|||
];
|
||||
|
||||
/**
|
||||
* Report or log an exception. Skips Laravel's internal reporter since we
|
||||
* don't need or want the user information in our logs by default.
|
||||
* Registers the exception handling callbacks for the application. This
|
||||
* will capture specific exception types that we do not want to include
|
||||
* the detailed stack traces for since they could reveal credentials to
|
||||
* whoever can read the logs.
|
||||
*
|
||||
* If you want to implement logging in a different format to integrate with
|
||||
* services such as AWS Cloudwatch or other monitoring you can replace the
|
||||
* contents of this function with a call to the parent reporter.
|
||||
*
|
||||
* @param \Throwable $exception
|
||||
* @return mixed
|
||||
*
|
||||
* @throws \Throwable
|
||||
* @noinspection PhpUnusedLocalVariableInspection
|
||||
*/
|
||||
public function report(Throwable $exception)
|
||||
public function register()
|
||||
{
|
||||
if (! config('app.exceptions.report_all', false) && $this->shouldntReport($exception)) {
|
||||
return null;
|
||||
if (config('app.exceptions.report_all', false)) {
|
||||
$this->dontReport = [];
|
||||
}
|
||||
|
||||
if (method_exists($exception, 'report')) {
|
||||
return $exception->report();
|
||||
}
|
||||
$this->reportable(function (PDOException $ex) {
|
||||
$ex = $this->generateCleanedExceptionStack($ex);
|
||||
});
|
||||
|
||||
try {
|
||||
$logger = $this->container->make(LoggerInterface::class);
|
||||
} catch (Exception $ex) {
|
||||
throw $exception;
|
||||
}
|
||||
|
||||
foreach ($this->cleanStacks as $class) {
|
||||
if ($exception instanceof $class) {
|
||||
$exception = $this->generateCleanedExceptionStack($exception);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return $logger->error($exception);
|
||||
$this->reportable(function (Swift_TransportException $ex) {
|
||||
$ex = $this->generateCleanedExceptionStack($ex);
|
||||
});
|
||||
}
|
||||
|
||||
private function generateCleanedExceptionStack(Throwable $exception)
|
||||
private function generateCleanedExceptionStack(Throwable $exception): string
|
||||
{
|
||||
$cleanedStack = '';
|
||||
foreach ($exception->getTrace() as $index => $item) {
|
||||
$cleanedStack .= sprintf(
|
||||
"#%d %s(%d): %s%s%s\n",
|
||||
$index,
|
||||
array_get($item, 'file'),
|
||||
array_get($item, 'line'),
|
||||
array_get($item, 'class'),
|
||||
array_get($item, 'type'),
|
||||
array_get($item, 'function')
|
||||
Arr::get($item, 'file'),
|
||||
Arr::get($item, 'line'),
|
||||
Arr::get($item, 'class'),
|
||||
Arr::get($item, 'type'),
|
||||
Arr::get($item, 'function')
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -135,14 +112,14 @@ class Handler extends ExceptionHandler
|
|||
* Render an exception into an HTTP response.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param \Throwable $exception
|
||||
*
|
||||
* @return \Symfony\Component\HttpFoundation\Response
|
||||
*
|
||||
* @throws \Throwable
|
||||
*/
|
||||
public function render($request, Throwable $exception)
|
||||
{
|
||||
$connections = Container::getInstance()->make(Connection::class);
|
||||
$connections = $this->container->make(Connection::class);
|
||||
|
||||
// If we are currently wrapped up inside a transaction, we will roll all the way
|
||||
// back to the beginning. This needs to happen, otherwise session data does not
|
||||
|
@ -165,27 +142,28 @@ class Handler extends ExceptionHandler
|
|||
* calls to the API.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param \Illuminate\Validation\ValidationException $exception
|
||||
*
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function invalidJson($request, ValidationException $exception)
|
||||
{
|
||||
$codes = collect($exception->validator->failed())->mapWithKeys(function ($reasons, $field) {
|
||||
$codes = Collection::make($exception->validator->failed())->mapWithKeys(function ($reasons, $field) {
|
||||
$cleaned = [];
|
||||
foreach ($reasons as $reason => $attrs) {
|
||||
$cleaned[] = snake_case($reason);
|
||||
$cleaned[] = Str::snake($reason);
|
||||
}
|
||||
|
||||
return [str_replace('.', '_', $field) => $cleaned];
|
||||
})->toArray();
|
||||
|
||||
$errors = collect($exception->errors())->map(function ($errors, $field) use ($codes, $exception) {
|
||||
$errors = Collection::make($exception->errors())->map(function ($errors, $field) use ($codes, $exception) {
|
||||
$response = [];
|
||||
foreach ($errors as $key => $error) {
|
||||
$meta = [
|
||||
'source_field' => $field,
|
||||
'rule' => str_replace(self::PTERODACTYL_RULE_STRING, 'p_', array_get(
|
||||
$codes, str_replace('.', '_', $field) . '.' . $key
|
||||
'rule' => str_replace(self::PTERODACTYL_RULE_STRING, 'p_', Arr::get(
|
||||
$codes,
|
||||
str_replace('.', '_', $field) . '.' . $key
|
||||
)),
|
||||
];
|
||||
|
||||
|
@ -206,10 +184,6 @@ class Handler extends ExceptionHandler
|
|||
|
||||
/**
|
||||
* Return the exception as a JSONAPI representation for use on API requests.
|
||||
*
|
||||
* @param \Throwable $exception
|
||||
* @param array $override
|
||||
* @return array
|
||||
*/
|
||||
public static function convertToArray(Throwable $exception, array $override = []): array
|
||||
{
|
||||
|
@ -235,7 +209,7 @@ class Handler extends ExceptionHandler
|
|||
'detail' => $exception->getMessage(),
|
||||
'source' => [
|
||||
'line' => $exception->getLine(),
|
||||
'file' => str_replace(base_path(), '', $exception->getFile()),
|
||||
'file' => str_replace(Application::getInstance()->basePath(), '', $exception->getFile()),
|
||||
],
|
||||
'meta' => [
|
||||
'trace' => explode("\n", $exception->getTraceAsString()),
|
||||
|
@ -248,9 +222,6 @@ class Handler extends ExceptionHandler
|
|||
|
||||
/**
|
||||
* Return an array of exceptions that should not be reported.
|
||||
*
|
||||
* @param \Exception $exception
|
||||
* @return bool
|
||||
*/
|
||||
public static function isReportable(Exception $exception): bool
|
||||
{
|
||||
|
@ -261,23 +232,22 @@ class Handler extends ExceptionHandler
|
|||
* Convert an authentication exception into an unauthenticated response.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param \Illuminate\Auth\AuthenticationException $exception
|
||||
* @return \Illuminate\Http\Response
|
||||
*
|
||||
* @return \Illuminate\Http\JsonResponse|\Illuminate\Http\RedirectResponse
|
||||
*/
|
||||
protected function unauthenticated($request, AuthenticationException $exception)
|
||||
{
|
||||
if ($request->expectsJson()) {
|
||||
return response()->json(self::convertToArray($exception), 401);
|
||||
return new JsonResponse(self::convertToArray($exception), JsonResponse::HTTP_UNAUTHORIZED);
|
||||
}
|
||||
|
||||
return redirect()->guest(route('auth.login'));
|
||||
return $this->container->make('redirect')->guest('/auth/login');
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts an exception into an array to render in the response. Overrides
|
||||
* Laravel's built-in converter to output as a JSONAPI spec compliant object.
|
||||
*
|
||||
* @param \Throwable $exception
|
||||
* @return array
|
||||
*/
|
||||
protected function convertExceptionToArray(Throwable $exception)
|
||||
|
|
|
@ -29,9 +29,6 @@ class DaemonConnectionException extends DisplayException
|
|||
|
||||
/**
|
||||
* Throw a displayable exception caused by a daemon connection error.
|
||||
*
|
||||
* @param \GuzzleHttp\Exception\GuzzleException $previous
|
||||
* @param bool $useStatusCode
|
||||
*/
|
||||
public function __construct(GuzzleException $previous, bool $useStatusCode = true)
|
||||
{
|
||||
|
|
|
@ -9,9 +9,6 @@ class HttpForbiddenException extends HttpException
|
|||
{
|
||||
/**
|
||||
* HttpForbiddenException constructor.
|
||||
*
|
||||
* @param string|null $message
|
||||
* @param \Throwable|null $previous
|
||||
*/
|
||||
public function __construct(string $message = null, \Throwable $previous = null)
|
||||
{
|
||||
|
|
|
@ -11,11 +11,9 @@ class TwoFactorAuthRequiredException extends HttpException implements HttpExcept
|
|||
{
|
||||
/**
|
||||
* TwoFactorAuthRequiredException constructor.
|
||||
*
|
||||
* @param \Throwable|null $previous
|
||||
*/
|
||||
public function __construct(Throwable $previous = null)
|
||||
{
|
||||
parent::__construct(Response::HTTP_BAD_REQUEST, "Two-factor authentication is required on this account in order to access this endpoint.", $previous);
|
||||
parent::__construct(Response::HTTP_BAD_REQUEST, 'Two-factor authentication is required on this account in order to access this endpoint.', $previous);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,8 +18,6 @@ class DataValidationException extends PterodactylException implements HttpExcept
|
|||
|
||||
/**
|
||||
* DataValidationException constructor.
|
||||
*
|
||||
* @param \Illuminate\Contracts\Validation\Validator $validator
|
||||
*/
|
||||
public function __construct(Validator $validator)
|
||||
{
|
||||
|
|
|
@ -8,8 +8,6 @@ class TooManyBackupsException extends DisplayException
|
|||
{
|
||||
/**
|
||||
* TooManyBackupsException constructor.
|
||||
*
|
||||
* @param int $backupLimit
|
||||
*/
|
||||
public function __construct(int $backupLimit)
|
||||
{
|
||||
|
|
|
@ -10,9 +10,6 @@ class ServiceLimitExceededException extends DisplayException
|
|||
/**
|
||||
* Exception thrown when something goes over a defined limit, such as allocated
|
||||
* ports, tasks, databases, etc.
|
||||
*
|
||||
* @param string $message
|
||||
* @param \Throwable|null $previous
|
||||
*/
|
||||
public function __construct(string $message, Throwable $previous = null)
|
||||
{
|
||||
|
|
Reference in a new issue