| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  | <?php | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-11 02:31:09 +08:00
										 |  |  | namespace BookStack\Exceptions; | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | use Exception; | 
					
						
							| 
									
										
										
										
											2017-01-26 03:35:40 +08:00
										 |  |  | use Illuminate\Auth\AuthenticationException; | 
					
						
							| 
									
										
										
										
											2017-12-28 21:19:02 +08:00
										 |  |  | use Illuminate\Http\Request; | 
					
						
							|  |  |  | use Illuminate\Pipeline\Pipeline; | 
					
						
							| 
									
										
										
										
											2017-01-26 03:35:40 +08:00
										 |  |  | use Illuminate\Validation\ValidationException; | 
					
						
							| 
									
										
										
										
											2016-01-10 03:23:35 +08:00
										 |  |  | use Illuminate\Database\Eloquent\ModelNotFoundException; | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  | use Symfony\Component\HttpKernel\Exception\HttpException; | 
					
						
							|  |  |  | use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler; | 
					
						
							| 
									
										
										
										
											2016-01-10 03:23:35 +08:00
										 |  |  | use Illuminate\Auth\Access\AuthorizationException; | 
					
						
							| 
									
										
										
										
											2017-12-28 21:19:02 +08:00
										 |  |  | use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | class Handler extends ExceptionHandler | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * A list of the exception types that should not be reported. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @var array | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     protected $dontReport = [ | 
					
						
							| 
									
										
										
										
											2016-01-10 03:23:35 +08:00
										 |  |  |         AuthorizationException::class, | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  |         HttpException::class, | 
					
						
							| 
									
										
										
										
											2016-01-10 03:23:35 +08:00
										 |  |  |         ModelNotFoundException::class, | 
					
						
							|  |  |  |         ValidationException::class, | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  |     ]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Report or log an exception. | 
					
						
							|  |  |  |      * This is a great spot to send exceptions to Sentry, Bugsnag, etc. | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2015-09-05 00:16:58 +08:00
										 |  |  |      * @param  \Exception $e | 
					
						
							| 
									
										
										
										
											2017-12-05 01:59:53 +08:00
										 |  |  |      * @return mixed | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  |      */ | 
					
						
							|  |  |  |     public function report(Exception $e) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return parent::report($e); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Render an exception into an HTTP response. | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2016-02-04 04:52:25 +08:00
										 |  |  |      * @param  \Illuminate\Http\Request $request | 
					
						
							|  |  |  |      * @param  \Exception $e | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  |      * @return \Illuminate\Http\Response | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function render($request, Exception $e) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2016-02-04 04:52:25 +08:00
										 |  |  |         // Handle notify exceptions which will redirect to the
 | 
					
						
							|  |  |  |         // specified location then show a notification message.
 | 
					
						
							| 
									
										
										
										
											2016-09-03 19:08:58 +08:00
										 |  |  |         if ($this->isExceptionType($e, NotifyException::class)) { | 
					
						
							|  |  |  |             session()->flash('error', $this->getOriginalMessage($e)); | 
					
						
							| 
									
										
										
										
											2016-08-14 19:29:35 +08:00
										 |  |  |             return redirect($e->redirectLocation); | 
					
						
							| 
									
										
										
										
											2015-09-05 00:16:58 +08:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-04 04:52:25 +08:00
										 |  |  |         // Handle pretty exceptions which will show a friendly application-fitting page
 | 
					
						
							|  |  |  |         // Which will include the basic message to point the user roughly to the cause.
 | 
					
						
							| 
									
										
										
										
											2016-09-03 19:08:58 +08:00
										 |  |  |         if ($this->isExceptionType($e, PrettyException::class)  && !config('app.debug')) { | 
					
						
							|  |  |  |             $message = $this->getOriginalMessage($e); | 
					
						
							| 
									
										
										
										
											2016-03-06 02:09:21 +08:00
										 |  |  |             $code = ($e->getCode() === 0) ? 500 : $e->getCode(); | 
					
						
							|  |  |  |             return response()->view('errors/' . $code, ['message' => $message], $code); | 
					
						
							| 
									
										
										
										
											2016-02-04 04:52:25 +08:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-28 21:19:02 +08:00
										 |  |  |         // Handle 404 errors with a loaded session to enable showing user-specific information
 | 
					
						
							|  |  |  |         if ($this->isExceptionType($e, NotFoundHttpException::class)) { | 
					
						
							|  |  |  |             return $this->loadErrorMiddleware($request, function ($request) use ($e) { | 
					
						
							|  |  |  |                 $message = $e->getMessage() ?: trans('errors.404_page_not_found'); | 
					
						
							|  |  |  |                 return response()->view('errors/404', ['message' => $message], 404); | 
					
						
							|  |  |  |             }); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  |         return parent::render($request, $e); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-09-03 19:08:58 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-28 21:19:02 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Load the middleware required to show state/session-enabled error pages. | 
					
						
							|  |  |  |      * @param Request $request | 
					
						
							|  |  |  |      * @param $callback | 
					
						
							|  |  |  |      * @return mixed | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     protected function loadErrorMiddleware(Request $request, $callback) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $middleware = (\Route::getMiddlewareGroups()['web_errors']); | 
					
						
							|  |  |  |         return (new Pipeline($this->container)) | 
					
						
							|  |  |  |             ->send($request) | 
					
						
							|  |  |  |             ->through($middleware) | 
					
						
							|  |  |  |             ->then($callback); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-03 19:08:58 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Check the exception chain to compare against the original exception type. | 
					
						
							|  |  |  |      * @param Exception $e | 
					
						
							|  |  |  |      * @param $type | 
					
						
							|  |  |  |      * @return bool | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2018-01-29 00:58:52 +08:00
										 |  |  |     protected function isExceptionType(Exception $e, $type) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2016-09-03 19:08:58 +08:00
										 |  |  |         do { | 
					
						
							| 
									
										
										
										
											2018-01-29 00:58:52 +08:00
										 |  |  |             if (is_a($e, $type)) { | 
					
						
							|  |  |  |                 return true; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2016-09-03 19:08:58 +08:00
										 |  |  |         } while ($e = $e->getPrevious()); | 
					
						
							|  |  |  |         return false; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Get original exception message. | 
					
						
							|  |  |  |      * @param Exception $e | 
					
						
							|  |  |  |      * @return string | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2018-01-29 00:58:52 +08:00
										 |  |  |     protected function getOriginalMessage(Exception $e) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2016-09-03 19:08:58 +08:00
										 |  |  |         do { | 
					
						
							|  |  |  |             $message = $e->getMessage(); | 
					
						
							|  |  |  |         } while ($e = $e->getPrevious()); | 
					
						
							|  |  |  |         return $message; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2016-09-18 01:22:04 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Convert an authentication exception into an unauthenticated response. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param  \Illuminate\Http\Request  $request | 
					
						
							|  |  |  |      * @param  \Illuminate\Auth\AuthenticationException  $exception | 
					
						
							|  |  |  |      * @return \Illuminate\Http\Response | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     protected function unauthenticated($request, AuthenticationException $exception) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if ($request->expectsJson()) { | 
					
						
							|  |  |  |             return response()->json(['error' => 'Unauthenticated.'], 401); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return redirect()->guest('login'); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-11-19 23:56:06 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Convert a validation exception into a JSON response. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param  \Illuminate\Http\Request  $request | 
					
						
							|  |  |  |      * @param  \Illuminate\Validation\ValidationException  $exception | 
					
						
							|  |  |  |      * @return \Illuminate\Http\JsonResponse | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     protected function invalidJson($request, ValidationException $exception) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         return response()->json($exception->errors(), $exception->status); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-07-13 03:01:42 +08:00
										 |  |  | } |