diff --git a/app/Http/Controllers/Api/ApiV2Controller.php b/app/Http/Controllers/Api/ApiV2Controller.php index 5a96e2d76..57fb34865 100644 --- a/app/Http/Controllers/Api/ApiV2Controller.php +++ b/app/Http/Controllers/Api/ApiV2Controller.php @@ -225,6 +225,7 @@ class ApiV2Controller extends Controller ]); $user = $request->user(); + abort_if($user->has_roles && ! UserRoleService::can('can-post', $user->id), 403, 'Invalid permissions for this action'); if ($user->last_active_at == null) { return []; diff --git a/tests/Feature/Api/V2MediaRoleCheckTest.php b/tests/Feature/Api/V2MediaRoleCheckTest.php new file mode 100644 index 000000000..1b553153e --- /dev/null +++ b/tests/Feature/Api/V2MediaRoleCheckTest.php @@ -0,0 +1,74 @@ +create([ + 'has_roles' => true, + 'last_active_at' => now(), + ]); + $user->refresh(); + + UserRoles::create([ + 'profile_id' => $user->profile_id, + 'user_id' => $user->id, + 'roles' => $roles, + ]); + + return $user; +} + +beforeEach(function () { + Storage::fake(config('filesystems.default')); + config(['pixelfed.enforce_account_limit' => false]); +}); + +it('rejects a can-post=false user on POST /api/v1/media with 403', function () { + $user = restrictedRoleUser(['can-post' => false]); + Passport::actingAs($user, ['write']); + + $this->postJson('/api/v1/media', [ + 'file' => UploadedFile::fake()->image('test.jpg', 100, 100), + ])->assertStatus(403); +}); + +it('rejects a can-post=false user on POST /api/v2/media with 403', function () { + $user = restrictedRoleUser(['can-post' => false]); + Passport::actingAs($user, ['write']); + + $this->postJson('/api/v2/media', [ + 'file' => UploadedFile::fake()->image('test.jpg', 100, 100), + ])->assertStatus(403); +}); + +it('allows a can-post=true user on POST /api/v2/media', function () { + $user = restrictedRoleUser(['can-post' => true]); + Passport::actingAs($user, ['write']); + + $this->postJson('/api/v2/media', [ + 'file' => UploadedFile::fake()->image('test.jpg', 100, 100), + 'description' => 'test image', + ]) + ->assertAccepted() + ->assertJsonStructure(['id', 'type', 'url', 'preview_url']); +});