Skip to content

Commit 5dda35e

Browse files
authored
[5.x] Harden OrderBys (#14421)
1 parent 7e37196 commit 5dda35e

11 files changed

Lines changed: 80 additions & 9 deletions

File tree

src/Fieldtypes/Entries.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
use Statamic\Facades\User;
2020
use Statamic\Http\Resources\CP\Entries\EntriesFieldtypeEntries;
2121
use Statamic\Http\Resources\CP\Entries\EntriesFieldtypeEntry as EntryResource;
22+
use Statamic\Query\OrderBy;
2223
use Statamic\Query\OrderedQueryBuilder;
2324
use Statamic\Query\Scopes\Filter;
2425
use Statamic\Query\Scopes\Filters\Concerns\QueriesFilters;
@@ -215,7 +216,7 @@ protected function getFirstCollectionFromRequest($request)
215216

216217
public function getSortColumn($request)
217218
{
218-
$column = $request->sort ?? 'title';
219+
$column = OrderBy::column($request->sort, 'title');
219220

220221
if (! $request->sort && ! $request->search && count($this->getConfiguredCollections()) < 2) {
221222
$column = $this->getFirstCollectionFromRequest($request)->sortField();

src/Fieldtypes/Relationship.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
use Statamic\CP\Column;
99
use Statamic\Facades\Scope;
1010
use Statamic\Fields\Fieldtype;
11+
use Statamic\Query\OrderBy;
1112

1213
abstract class Relationship extends Fieldtype
1314
{
@@ -307,7 +308,7 @@ public function filterExcludedItems($items, $exclusions)
307308

308309
public function getSortColumn($request)
309310
{
310-
return $request->get('sort');
311+
return OrderBy::column($request->get('sort'));
311312
}
312313

313314
public function getSortDirection($request)

src/Fieldtypes/Terms.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
use Statamic\Facades\User;
2222
use Statamic\GraphQL\Types\TermInterface;
2323
use Statamic\Http\Resources\CP\Taxonomies\TermsFieldtypeTerms as TermsResource;
24+
use Statamic\Query\OrderBy;
2425
use Statamic\Query\OrderedQueryBuilder;
2526
use Statamic\Query\Scopes\Filter;
2627
use Statamic\Query\Scopes\Filters\Fields\Terms as TermsFilter;
@@ -311,7 +312,7 @@ protected function getFirstTaxonomyFromRequest($request)
311312

312313
public function getSortColumn($request)
313314
{
314-
$column = $request->get('sort');
315+
$column = OrderBy::column($request->get('sort'));
315316

316317
if (! $column && ! $request->search) {
317318
$column = 'title'; // todo: get from taxonomy or config

src/Http/Controllers/API/ApiController.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
use Statamic\Facades\Scope;
99
use Statamic\Facades\Site;
1010
use Statamic\Http\Controllers\Controller;
11+
use Statamic\Query\OrderBy;
1112
use Statamic\Support\Arr;
1213
use Statamic\Support\Str;
1314
use Statamic\Tags\Concerns\QueriesConditions;
@@ -259,7 +260,9 @@ protected function sort($query)
259260
$order = 'desc';
260261
}
261262

262-
$query->orderBy($sort, $order);
263+
if ($sort = OrderBy::column($sort)) {
264+
$query->orderBy($sort, $order);
265+
}
263266
});
264267

265268
return $this;

src/Http/Controllers/CP/Collections/EntriesController.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
use Statamic\Http\Requests\FilteredRequest;
2020
use Statamic\Http\Resources\CP\Entries\Entries;
2121
use Statamic\Http\Resources\CP\Entries\Entry as EntryResource;
22+
use Statamic\Query\OrderBy;
2223
use Statamic\Query\Scopes\Filters\Concerns\QueriesFilters;
2324
use Statamic\Support\Arr;
2425
use Statamic\Support\Str;
@@ -39,7 +40,7 @@ public function index(FilteredRequest $request, $collection)
3940
'blueprints' => $collection->entryBlueprints()->map->handle(),
4041
]);
4142

42-
$sortField = request('sort');
43+
$sortField = OrderBy::column(request('sort'));
4344
$sortDirection = request('order', 'asc');
4445

4546
if (! $sortField && ! request('search')) {

src/Http/Controllers/CP/Forms/FormSubmissionsController.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
use Statamic\Http\Controllers\CP\CpController;
77
use Statamic\Http\Requests\FilteredRequest;
88
use Statamic\Http\Resources\CP\Submissions\Submissions;
9+
use Statamic\Query\OrderBy;
910
use Statamic\Query\Scopes\Filters\Concerns\QueriesFilters;
1011

1112
class FormSubmissionsController extends CpController
@@ -26,7 +27,7 @@ public function index(FilteredRequest $request, $form)
2627
'form' => $form->handle(),
2728
]);
2829

29-
$sortField = request('sort', 'date');
30+
$sortField = OrderBy::column(request('sort'), 'date');
3031
$sortDirection = request('order', $sortField === 'date' ? 'desc' : 'asc');
3132

3233
if ($sortField) {

src/Http/Controllers/CP/Taxonomies/TermsController.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use Statamic\Http\Requests\FilteredRequest;
1515
use Statamic\Http\Resources\CP\Taxonomies\Term as TermResource;
1616
use Statamic\Http\Resources\CP\Taxonomies\Terms;
17+
use Statamic\Query\OrderBy;
1718
use Statamic\Query\Scopes\Filters\Concerns\QueriesFilters;
1819
use Statamic\Rules\Slug;
1920
use Statamic\Rules\UniqueTermValue;
@@ -34,7 +35,7 @@ public function index(FilteredRequest $request, $taxonomy)
3435
'blueprints' => $taxonomy->termBlueprints()->map->handle(),
3536
]);
3637

37-
$sortField = request('sort');
38+
$sortField = OrderBy::column(request('sort'));
3839
$sortDirection = request('order', 'asc');
3940

4041
if (! $sortField && ! request('search')) {

src/Http/Controllers/CP/Users/UsersController.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
use Statamic\Http\Requests\FilteredRequest;
1717
use Statamic\Http\Resources\CP\Users\Users;
1818
use Statamic\Notifications\ActivateAccount;
19+
use Statamic\Query\OrderBy;
1920
use Statamic\Query\Scopes\Filters\Concerns\QueriesFilters;
2021
use Statamic\Rules\UniqueUserValue;
2122
use Statamic\Search\Result;
@@ -71,7 +72,7 @@ protected function json($request)
7172
'blueprints' => ['user'],
7273
]);
7374

74-
$sortField = request('sort');
75+
$sortField = OrderBy::column(request('sort'));
7576
$sortDirection = request('order', 'asc');
7677

7778
if (! $sortField && ! request('search')) {

src/Query/OrderBy.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,15 @@ public function __construct(string $sort, string $direction)
2222
$this->direction = $direction;
2323
}
2424

25+
public static function column(?string $value, ?string $default = null): ?string
26+
{
27+
if ($value && preg_match('/^[\w]+((\->|[.])[\w]+)*$/', $value)) {
28+
return $value;
29+
}
30+
31+
return $default;
32+
}
33+
2534
/**
2635
* Instantiate order by object.
2736
*

src/Tags/Concerns/QueriesOrderBys.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ protected function parseOrderBys()
3232

3333
return collect(explode('|', $piped ?? ''))->filter()->map(function ($orderBy) {
3434
return OrderBy::parse($orderBy);
35-
});
35+
})->filter(fn ($orderBy) => OrderBy::column($orderBy->sort));
3636
}
3737

3838
protected function preParsedOrderBys()

0 commit comments

Comments
 (0)