diff --git a/dist/app/Attributes/IgnorePermissionCheck.php b/dist/app/Attributes/IgnorePermissionCheck.php new file mode 100644 index 0000000..9e5ea14 --- /dev/null +++ b/dist/app/Attributes/IgnorePermissionCheck.php @@ -0,0 +1,8 @@ +can(Permissions::VIEW_USERS->value)) - abort(403, 'No Permission to view this Page'); - $searchString = $request->input('search'); $query = User::orderBy('last_known_username'); @@ -67,6 +65,9 @@ public function details(User $user) public function edit(User $user, EditUserRequest $request) { + if(!Auth::user()->can(Permissions::EDIT_USERS->value)) + abort(403); + $playerData = $user->playerData(); $playerData->currency_a = $request->currencyA; @@ -94,10 +95,12 @@ public function edit(User $user, EditUserRequest $request) return redirect()->back(); } + #[IgnorePermissionCheck] public function getUsersForDropdown(Request $request) { - if(!Auth::check() && Auth::user()->can(Permissions::VIEW_USERS->value)) - abort(403, 'No Permission to get this Data'); + // only allow the retrieval of the dropdown if we have the view users permission or inbox mailer because there we need it. + if(!Auth::check() || !(Auth::user()->can(Permissions::VIEW_USERS->value) || Auth::user()->can(Permissions::INBOX_MAILER->value))) + abort(403); $searchTerm = $request->input('term'); @@ -131,10 +134,8 @@ public function getUsersForDropdown(Request $request) public function reset(User $user) { - $canReset = Auth::check() && Auth::user()->can(Permissions::EDIT_USERS->value); - - if(!$canReset) - abort(403, 'You dont have enough permissions for this action.'); + if(!Auth::user()->can(Permissions::EDIT_USERS->value)) + abort(403); $user->playerData()->delete(); return redirect()->back(); @@ -142,8 +143,8 @@ public function reset(User $user) public function bans(User $user) { - if(!Auth::user()->can(Permissions::EDIT_USERS->value)) - abort(403, 'You are not allowed to edit Bans of a User.'); + if(!Auth::user()->can(Permissions::USER_BANS->value)) + abort(403); $bans = $user->bans; $this->overrideTitle('Bans for User: '.$user->id.'('.$user->last_known_username.')'); @@ -172,8 +173,8 @@ public function banPost(User $user, Ban $ban, BanPostRequest $request) { } public function createBan(User $user) { - if(!Auth::user()->can(Permissions::EDIT_USERS->value)) - abort(403, 'No Permission to create a Ban.'); + if(!Auth::user()->can(Permissions::USER_BANS->value)) + abort(403); $newBan = new Ban(); $newBan->ban_reason = 'Placeholder'; diff --git a/dist/app/Http/Middleware/AdminPermissionCheck.php b/dist/app/Http/Middleware/AdminPermissionCheck.php new file mode 100644 index 0000000..71e3e66 --- /dev/null +++ b/dist/app/Http/Middleware/AdminPermissionCheck.php @@ -0,0 +1,43 @@ + $currentControllerClass */ + $currentControllerClass = Route::getCurrentRoute()->getControllerClass(); + + if(!class_exists($currentControllerClass) || !is_subclass_of($currentControllerClass, AdminToolController::class)) + return $next($request); + + $currentMethod = Route::getCurrentRoute()->getActionMethod(); + $reflector = new ReflectionClass($currentControllerClass); + + // Skip permission check if the attribute exists on this function + if(count($reflector->getMethod($currentMethod)->getAttributes(IgnorePermissionCheck::class)) > 0) + return $next($request); + + if(!Auth::user()->can($currentControllerClass::getNeededPermission())) + abort(403); + + return $next($request); + } +} diff --git a/dist/app/Http/Requests/Api/Admin/Tools/BanPostRequest.php b/dist/app/Http/Requests/Api/Admin/Tools/BanPostRequest.php index 8113d15..e3df5a7 100644 --- a/dist/app/Http/Requests/Api/Admin/Tools/BanPostRequest.php +++ b/dist/app/Http/Requests/Api/Admin/Tools/BanPostRequest.php @@ -24,7 +24,7 @@ class BanPostRequest extends FormRequest */ public function authorize(): bool { - return Auth::user()?->can(Permissions::EDIT_USERS->value); + return Auth::user()?->can(Permissions::USER_BANS->value); } /** diff --git a/dist/app/Http/Requests/Api/Admin/Tools/HandleModerationRequest.php b/dist/app/Http/Requests/Api/Admin/Tools/HandleModerationRequest.php index 2c06848..f2c8d3e 100644 --- a/dist/app/Http/Requests/Api/Admin/Tools/HandleModerationRequest.php +++ b/dist/app/Http/Requests/Api/Admin/Tools/HandleModerationRequest.php @@ -12,7 +12,7 @@ class HandleModerationRequest extends FormRequest public function authorize(): bool { - return Auth::check() && Auth::user()->can(Permissions::VIEW_USERS->value); + return Auth::check(); } public function rules(): array diff --git a/dist/app/Providers/RouteServiceProvider.php b/dist/app/Providers/RouteServiceProvider.php index 561a706..626fb9b 100644 --- a/dist/app/Providers/RouteServiceProvider.php +++ b/dist/app/Providers/RouteServiceProvider.php @@ -2,6 +2,7 @@ namespace App\Providers; +use App\Http\Middleware\AdminPermissionCheck; use Illuminate\Cache\RateLimiting\Limit; use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider; use Illuminate\Http\Request; @@ -52,7 +53,7 @@ public function boot(): void Route::middleware(['api', 'api.session']) ->group(base_path('routes/messages.php')); - Route::middleware(['web', 'auth']) + Route::middleware(['web', 'auth', AdminPermissionCheck::class]) ->prefix('admin') ->group(base_path('routes/admin.php')); }); diff --git a/dist/database/seeders/RolesAndPermissionsSeeder.php b/dist/database/seeders/RolesAndPermissionsSeeder.php index b3fa0e0..e0f3d2f 100644 --- a/dist/database/seeders/RolesAndPermissionsSeeder.php +++ b/dist/database/seeders/RolesAndPermissionsSeeder.php @@ -3,6 +3,7 @@ namespace Database\Seeders; use App\Enums\Auth\Permissions; +use App\Enums\Auth\Roles; use Illuminate\Database\Seeder; use Spatie\Permission\Models\Permission; use Spatie\Permission\Models\Role; @@ -15,25 +16,43 @@ class RolesAndPermissionsSeeder extends Seeder public function run(): void { // Create default Roles and Permissions - $adminRole = Role::findOrCreate(\App\Enums\Auth\Roles::ADMIN->value); + $adminRole = Role::findOrCreate(Roles::Admin->value); + $moderatorRole = Role::findOrCreate(Roles::Moderator->value); + $viewAdminAreaPerm = Permission::findOrCreate(Permissions::ADMIN_AREA->value); $viewLogPerm = Permission::findOrCreate(Permissions::VIEW_LOG->value); $fileUploadPerm = Permission::findOrCreate(Permissions::FILE_UPLOAD->value); $gameNewsPerm = Permission::findOrCreate(Permissions::GAME_NEWS->value); $userReadPerm = Permission::findOrCreate(Permissions::VIEW_USERS->value); $userEditPerm = Permission::findOrCreate(Permissions::EDIT_USERS->value); + $userBansPerm = Permission::findOrCreate(Permissions::USER_BANS->value); $viewMaintenanceMode = Permission::findOrCreate(Permissions::VIEW_MAINTENANCE->value); $inboxMailerPerm = Permission::findOrCreate(Permissions::INBOX_MAILER->value); + $chatReportsPerm = Permission::findOrCreate(Permissions::CHAT_REPORTS->value); + $playerReportsPerm = Permission::findOrCreate(Permissions::PLAYER_REPORTS->value); $adminRole->givePermissionTo( $viewAdminAreaPerm, $viewLogPerm, + $fileUploadPerm, $gameNewsPerm, $userReadPerm, $userEditPerm, - $fileUploadPerm, + $userBansPerm, $viewMaintenanceMode, $inboxMailerPerm, + $chatReportsPerm, + $playerReportsPerm, + )->save(); + + $moderatorRole->givePermissionTo( + $viewAdminAreaPerm, + $userReadPerm, + $gameNewsPerm, + $inboxMailerPerm, + $userBansPerm, + $chatReportsPerm, + $playerReportsPerm, )->save(); } }