diff --git a/Changelog b/Changelog index cc255a5d3..68eb1eac1 100755 --- a/Changelog +++ b/Changelog @@ -1,4 +1,5 @@ 2018-08-05 DariusIII + * Chg: Add custom permission error handling * Chg: Update handling of permissions 2018-08-04 DariusIII * Fix: Fix role-edit template diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php index 7e2563a8c..7ddf19098 100644 --- a/app/Exceptions/Handler.php +++ b/app/Exceptions/Handler.php @@ -48,6 +48,9 @@ class Handler extends ExceptionHandler */ public function render($request, Exception $exception) { + if ($exception instanceof \Spatie\Permission\Exceptions\UnauthorizedException) { + abort(401); + } return parent::render($request, $exception); } } diff --git a/app/Http/Middleware/ClearanceMiddleware.php b/app/Http/Middleware/ClearanceMiddleware.php new file mode 100644 index 000000000..80a2e73c2 --- /dev/null +++ b/app/Http/Middleware/ClearanceMiddleware.php @@ -0,0 +1,75 @@ +hasRole(['Admin']) || ($user->hasRole(['Moderator']) && (!$request->is('Admin') || !$request->is('Admin/*')))) { + return $next($request); + } + + if ($request->is('Movies') || $request->is('browse/Movies') || $request->is('browse/Movies/*')) { + if (!$user->hasDirectPermission('view movies') || !$user->hasPermissionTo('view movies')) { + abort(401); + } else { + return $next($request); + } + } + + if ($request->is('Console') || $request->is('browse/Console') || $request->is('browse/Console/*')) { + if (!$user->hasDirectPermission('view console') || !$user->hasPermissionTo('view console')) { + abort(401); + } else { + return $next($request); + } + } + + if ($request->is('Books') || $request->is('browse/Books') || $request->is('browse/Books/*')) { + if (!$user->hasDirectPermission('view books') || !$user->hasPermissionTo('view books')) { + abort(401); + } else { + return $next($request); + } + } + + if ($request->is('Audio') || $request->is('browse/Audio') || $request->is('browse/Audio/*')) { + if (!$user->hasDirectPermission('view audio') || !$user->hasPermissionTo('view audio')) { + abort(401); + } else { + return $next($request); + } + } + + if ($request->is('XXX') || $request->is('browse/XXX') || $request->is('browse/XXX/*')) { + if (!$user->hasDirectPermission('view adult') || !$user->hasPermissionTo('view adult')) { + abort(401); + } else { + return $next($request); + } + } + + if ($request->is('Games') || $request->is('browse/PC') || $request->is('browse/PC/*')) { + if (!$user->hasDirectPermission('view pc') || !$user->hasPermissionTo('view pc')) { + abort(401); + } else { + return $next($request); + } + } + + return $next($request); + } +} diff --git a/resources/views/errors/401.blade.php b/resources/views/errors/401.blade.php new file mode 100644 index 000000000..e69de29bb