GCTC-NTGC /
TalentCloud
| 1 | <?php |
||||
| 2 | |||||
| 3 | namespace App\Exceptions; |
||||
| 4 | |||||
| 5 | use Illuminate\Auth\Access\AuthorizationException; |
||||
| 6 | use Illuminate\Auth\AuthenticationException; |
||||
| 7 | use Illuminate\Database\Eloquent\ModelNotFoundException; |
||||
| 8 | use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler; |
||||
| 9 | use Illuminate\Http\Exceptions\HttpResponseException; |
||||
| 10 | use Illuminate\Session\TokenMismatchException; |
||||
| 11 | use Illuminate\Support\Facades\Auth; |
||||
| 12 | use Illuminate\Support\Facades\Lang; |
||||
| 13 | use Illuminate\Support\Facades\Log; |
||||
| 14 | use Illuminate\Support\Facades\Request; |
||||
| 15 | use Illuminate\Validation\ValidationException; |
||||
| 16 | use Symfony\Component\HttpKernel\Exception\HttpException; |
||||
| 17 | use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface; |
||||
| 18 | use Throwable; |
||||
| 19 | |||||
| 20 | class Handler extends ExceptionHandler |
||||
| 21 | { |
||||
| 22 | /** |
||||
| 23 | * A list of the exception types that are not reported. |
||||
| 24 | * |
||||
| 25 | * @var array |
||||
| 26 | */ |
||||
| 27 | protected $dontReport = []; |
||||
| 28 | |||||
| 29 | /** |
||||
| 30 | * A list of the inputs that are never flashed for validation exceptions. |
||||
| 31 | * |
||||
| 32 | * @var array |
||||
| 33 | */ |
||||
| 34 | protected $dontFlash = [ |
||||
| 35 | 'password', |
||||
| 36 | 'password_confirmation', |
||||
| 37 | 'current_password', |
||||
| 38 | 'new_password', |
||||
| 39 | 'new_password_confirmation', |
||||
| 40 | ]; |
||||
| 41 | 11 | ||||
| 42 | /** |
||||
| 43 | 11 | * OVERRIDE |
|||
| 44 | 11 | * A list of the internal exception types that should not be reported. |
|||
| 45 | * |
||||
| 46 | * @var array |
||||
| 47 | */ |
||||
| 48 | protected $internalDontReport = [ |
||||
| 49 | AuthenticationException::class, |
||||
| 50 | AuthorizationException::class, |
||||
| 51 | HttpResponseException::class, |
||||
| 52 | ModelNotFoundException::class, |
||||
| 53 | 11 | ValidationException::class, |
|||
| 54 | ]; |
||||
| 55 | 11 | ||||
| 56 | /** |
||||
| 57 | * Report or log an exception. |
||||
| 58 | 11 | * |
|||
| 59 | * This is a great spot to send exceptions to Flare, Sentry, Bugsnag, etc. |
||||
| 60 | * |
||||
| 61 | * @param \Throwable $exception |
||||
| 62 | * @return void |
||||
| 63 | */ |
||||
| 64 | public function report(Throwable $exception) |
||||
| 65 | { |
||||
| 66 | if ($exception instanceof TokenMismatchException) { |
||||
| 67 | $logData = [ |
||||
| 68 | 1 | 'requestToken' => request()->header('x-csrf-token'), |
|||
|
0 ignored issues
–
show
Bug
introduced
by
Loading history...
|
|||||
| 69 | 'sessionToken' => session()->token(), |
||||
|
0 ignored issues
–
show
The function
session was not found. Maybe you did not declare it correctly or list all dependencies?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
Loading history...
|
|||||
| 70 | 1 | 'session' => session()->all(), |
|||
| 71 | 'user' => request()->user(), |
||||
| 72 | 'requestUrl' => request()->url() |
||||
| 73 | 1 | ]; |
|||
| 74 | $message = '419 CSRF Token Mismatch. ' . collect($logData)->toJson(); |
||||
|
0 ignored issues
–
show
The function
collect was not found. Maybe you did not declare it correctly or list all dependencies?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
Loading history...
|
|||||
| 75 | Log::debug($message); |
||||
| 76 | 1 | } |
|||
| 77 | |||||
| 78 | 1 | parent::report($exception); |
|||
| 79 | } |
||||
| 80 | |||||
| 81 | /** |
||||
| 82 | * OVERRIDE |
||||
| 83 | * Get the default context variables for logging. |
||||
| 84 | * |
||||
| 85 | * @return array |
||||
| 86 | */ |
||||
| 87 | protected function context() |
||||
| 88 | 2 | { |
|||
| 89 | try { |
||||
| 90 | 2 | return array_filter([ |
|||
| 91 | 2 | 'userId' => Auth::id(), |
|||
| 92 | 2 | 'url' => Request::path(), |
|||
| 93 | 2 | 'method' => Request::method(), |
|||
| 94 | 2 | 'referer' => Request::header('referer', '') |
|||
| 95 | ]); |
||||
| 96 | } catch (\Throwable $e) { |
||||
| 97 | return []; |
||||
| 98 | 2 | } |
|||
| 99 | } |
||||
| 100 | |||||
| 101 | /** |
||||
| 102 | * Render an exception into an HTTP response. |
||||
| 103 | * |
||||
| 104 | * @param \Illuminate\Http\Request $request |
||||
| 105 | * @param Throwable $exception |
||||
| 106 | * @return \Illuminate\Http\Response |
||||
| 107 | * |
||||
| 108 | * @throws Throwable |
||||
| 109 | */ |
||||
| 110 | public function render($request, Throwable $exception) |
||||
| 111 | { |
||||
| 112 | // Redirect upper case URLs to lower case route. |
||||
| 113 | $url = $request->url(); |
||||
| 114 | $loweredCaseUrl = strtolower($url); |
||||
| 115 | if ($exception instanceof \Symfony\Component\HttpKernel\Exception\NotFoundHttpException && $url !== $loweredCaseUrl) { |
||||
| 116 | return redirect($loweredCaseUrl); |
||||
|
0 ignored issues
–
show
The function
redirect was not found. Maybe you did not declare it correctly or list all dependencies?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
Loading history...
|
|||||
| 117 | } |
||||
| 118 | |||||
| 119 | // Laravel will render out the error page by default even for JSON |
||||
| 120 | // requests... this will return a standardized JSON response with a 403 |
||||
| 121 | // if unauthorized. |
||||
| 122 | if ($exception instanceof AuthorizationException && $request->wantsJson()) { |
||||
| 123 | return response()->json(['message' => $exception->getMessage()], 403); |
||||
|
0 ignored issues
–
show
The function
response was not found. Maybe you did not declare it correctly or list all dependencies?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
Loading history...
|
|||||
| 124 | } |
||||
| 125 | if ($exception instanceof AdminException) { |
||||
| 126 | return $exception->render($request); |
||||
| 127 | } |
||||
| 128 | if ($exception instanceof TwoFactorRequiredException) { |
||||
| 129 | return $exception->render($request); |
||||
| 130 | } |
||||
| 131 | if ($exception instanceof TokenMismatchException) { |
||||
| 132 | $newMessage = $exception->getMessage() . ' ' . Lang::get('errors.refresh_page'); |
||||
| 133 | $modifiedException = new TokenMismatchException($newMessage, $exception->getCode(), $exception); |
||||
| 134 | return parent::render($request, $modifiedException); |
||||
| 135 | } |
||||
| 136 | if ($exception instanceof StateMachineException) { |
||||
| 137 | return parent::render($request, new HttpException(400, $exception->getMessage())); |
||||
| 138 | } |
||||
| 139 | if ($exception instanceof SendEmailException) { |
||||
| 140 | return parent::render($request, new HttpException(400, $exception->getMessage())); |
||||
| 141 | } |
||||
| 142 | return parent::render($request, $exception); |
||||
| 143 | } |
||||
| 144 | |||||
| 145 | /** |
||||
| 146 | * Convert an authentication exception into an unauthenticated response. |
||||
| 147 | * |
||||
| 148 | * @param \Illuminate\Http\Request $request |
||||
| 149 | * @param \Illuminate\Auth\AuthenticationException $exception |
||||
| 150 | * @return \Illuminate\Http\Response |
||||
| 151 | */ |
||||
| 152 | protected function unauthenticated($request, AuthenticationException $exception) |
||||
| 153 | { |
||||
| 154 | if ($request->expectsJson()) { |
||||
| 155 | return response()->json(['error' => 'Unauthenticated.'], 401); |
||||
|
0 ignored issues
–
show
The function
response was not found. Maybe you did not declare it correctly or list all dependencies?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
Loading history...
|
|||||
| 156 | } |
||||
| 157 | $loginRoute = ($exception->redirectTo() !== null && $exception->redirectTo() !== '') |
||||
| 158 | ? $exception->redirectTo() |
||||
| 159 | : route('login'); |
||||
|
0 ignored issues
–
show
The function
route was not found. Maybe you did not declare it correctly or list all dependencies?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
Loading history...
|
|||||
| 160 | return redirect()->guest($loginRoute); |
||||
|
0 ignored issues
–
show
The function
redirect was not found. Maybe you did not declare it correctly or list all dependencies?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
Loading history...
|
|||||
| 161 | } |
||||
| 162 | |||||
| 163 | /** |
||||
| 164 | * OVERRIDE |
||||
| 165 | * Render the given HttpException. |
||||
| 166 | * |
||||
| 167 | * @param \Symfony\Component\HttpKernel\Exception\HttpExceptionInterface $e |
||||
| 168 | * @return \Symfony\Component\HttpFoundation\Response |
||||
| 169 | */ |
||||
| 170 | protected function renderHttpException(HttpExceptionInterface $e) |
||||
| 171 | { |
||||
| 172 | if (!view()->exists("errors.{$e->getStatusCode()}")) { |
||||
|
0 ignored issues
–
show
The function
view was not found. Maybe you did not declare it correctly or list all dependencies?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
Loading history...
|
|||||
| 173 | return response()->view('errors.default', [ |
||||
|
0 ignored issues
–
show
The function
response was not found. Maybe you did not declare it correctly or list all dependencies?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
Loading history...
|
|||||
| 174 | 'exception' => $e, |
||||
| 175 | 'goc' => Lang::get('common/goc'), |
||||
| 176 | 'alert' => Lang::get('common/alert'), |
||||
| 177 | 'error' => Lang::get('errors')['default'], |
||||
| 178 | ], $e->getStatusCode(), $e->getHeaders()); |
||||
| 179 | } |
||||
| 180 | return parent::renderHttpException($e); |
||||
| 181 | } |
||||
| 182 | } |
||||
| 183 |