Skip to content

Commit 33a96cd

Browse files
duncanmccleanclaude
andcommitted
Authorize relationship fieldtype data
Add authorization checks to Runway's relationship fieldtypes to align with Statamic CMS PRs #14718 and #14719. Users without view permission for a resource will now see an empty picker and invalid placeholders for existing selections they can't access. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent 1391cc7 commit 33a96cd

5 files changed

Lines changed: 35 additions & 1 deletion

File tree

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646
"pixelfear/composer-dist-plugin": "^0.1.5",
4747
"spatie/error-solutions": "^1.0 || ^2.0",
4848
"spatie/invade": "^2.1",
49-
"statamic/cms": "^6.17",
49+
"statamic/cms": "^6.20",
5050
"stillat/proteus": "^4.2.1"
5151
},
5252
"require-dev": {

src/Fieldtypes/BaseFieldtype.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
use Statamic\Facades\Blink;
1414
use Statamic\Facades\Scope;
1515
use Statamic\Facades\Search;
16+
use Statamic\Facades\User;
1617
use Statamic\Fieldtypes\Relationship;
1718
use Statamic\Http\Requests\FilteredRequest;
1819
use Statamic\Query\OrderBy;
@@ -187,6 +188,10 @@ public function process($data)
187188

188189
public function getIndexItems($request)
189190
{
191+
if (! User::current()?->can('view', $this->resource())) {
192+
return collect();
193+
}
194+
190195
$query = $this->getIndexQuery($request);
191196

192197
$this->applyOrderingToIndexQuery($query, $request);
@@ -383,6 +388,11 @@ protected function getColumns()
383388
->values();
384389
}
385390

391+
protected function authorizeItemData($id): bool
392+
{
393+
return (bool) User::current()?->can('view', $this->resource());
394+
}
395+
386396
protected function toItemArray($id)
387397
{
388398
$resource = Runway::findResource($this->config('resource'));

tests/Fieldtypes/BelongsToFieldtypeTest.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
use Illuminate\Support\Facades\Config;
99
use PHPUnit\Framework\Attributes\Test;
1010
use Statamic\Facades\Blink;
11+
use Statamic\Facades\User;
1112
use Statamic\Fields\Field;
1213
use Statamic\Http\Requests\FilteredRequest;
1314
use StatamicRadPack\Runway\Fieldtypes\BelongsToFieldtype;
@@ -26,6 +27,8 @@ protected function setUp(): void
2627
{
2728
parent::setUp();
2829

30+
$this->actingAs(User::make()->makeSuper()->save());
31+
2932
$this->fieldtype = tap(new BelongsToFieldtype)
3033
->setField(new Field('author', [
3134
'max_items' => 1,

tests/Fieldtypes/HasManyFieldtypeTest.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use PHPUnit\Framework\Attributes\Test;
1111
use Statamic\Facades\Blink;
1212
use Statamic\Facades\Entry;
13+
use Statamic\Facades\User;
1314
use Statamic\Fields\Field;
1415
use Statamic\Http\Requests\FilteredRequest;
1516
use Statamic\Testing\Concerns\PreventsSavingStacheItemsToDisk;
@@ -29,6 +30,8 @@ protected function setUp(): void
2930
{
3031
parent::setUp();
3132

33+
$this->actingAs(User::make()->makeSuper()->save());
34+
3235
$this->fieldtype = tap(new HasManyFieldtype)
3336
->setField(new Field('posts', [
3437
'mode' => 'stack',
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
action: unpublish
2+
date: 1779782016
3+
user: b59044c1-59a0-47d9-87ff-beb4d95deffe
4+
message: 'Live live live!'
5+
attributes:
6+
id: 1
7+
published: false
8+
data:
9+
title: 'ut ut quod non vel inventore'
10+
slug: ut-ut-quod-non-vel-inventore
11+
body: 'Consequuntur ut debitis sint numquam ipsum. Consequatur omnis voluptatum ut sapiente sint consectetur. Dolore quos in molestiae earum perferendis dolorum. Magnam quasi maxime qui deleniti. Voluptas voluptatem laudantium mollitia vel omnis. Aut voluptatem dolorem placeat quia eum alias inventore. Cumque vel voluptatem sunt et. Ut maxime quis omnis ut libero. Eaque qui explicabo pariatur exercitationem in aut soluta. Ratione voluptates temporibus ut et facilis necessitatibus. Rerum dolorem sit commodi est minima. Quam minus quia porro consequatur. Veritatis ad ea aliquid tempore asperiores. Ea reiciendis omnis consectetur impedit. Distinctio vero autem necessitatibus tempore voluptatum ad eos. Voluptas sint quae et ea suscipit cumque. Et vel hic nihil. Perferendis debitis non est voluptatem corrupti. Doloribus vel nostrum consequatur quas sint et ipsa. Dolore aliquam enim voluptatem vel omnis ducimus nulla quos. Voluptatem voluptates quas ducimus iusto. Qui ut ea autem facere accusamus est non. Ut iste nisi vel consequatur sit voluptas necessitatibus non. Numquam officia dolores quod blanditiis. Nam temporibus cum ut optio. Voluptas occaecati minus consequatur iusto. Ipsa aliquam sed qui. Veritatis nihil dolores officia vitae. Aliquid velit sed est dolores itaque omnis dolorem. Earum minus quas voluptas repudiandae adipisci. Autem est dolores nemo ut. Alias quos corrupti corporis magnam adipisci quaerat. Nemo id exercitationem voluptatem aliquid consequuntur necessitatibus vero. Fuga non velit architecto consequatur. Ut quam magnam qui perspiciatis rem soluta et consequatur.'
12+
excerpt: 'This is an excerpt.'
13+
author_id: 1
14+
start_date: '2026-05-26 07:53:36'
15+
end_date: null
16+
membership_status: null
17+
values: null
18+
external_links: null

0 commit comments

Comments
 (0)