Skip to content

Commit 0fa33e0

Browse files
committed
Mark a request as being stateful if a cookie for the session is provided at all
This accounts for poorly configured API clients that try to use cookies for authentication purposes. Treat everything with a session cookie as being a stateful request from the front-end.
1 parent 33bafe9 commit 0fa33e0

File tree

3 files changed

+61
-4
lines changed

3 files changed

+61
-4
lines changed

app/Exceptions/Handler.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -179,9 +179,9 @@ public function invalidJson($request, ValidationException $exception)
179179
)),
180180
];
181181

182-
$converted = self::convertToArray($exception)['errors'][0];
182+
$converted = $this->convertExceptionToArray($exception)['errors'][0];
183183
$converted['detail'] = $error;
184-
$converted['meta'] = is_array($converted['meta'] ?? null) ? array_merge($converted['meta'], $meta) : $meta;
184+
$converted['meta'] = array_merge($converted['meta'] ?? [], $meta);
185185

186186
$response[] = $converted;
187187
}

app/Http/Kernel.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
use Illuminate\Session\Middleware\AuthenticateSession;
2020
use Illuminate\View\Middleware\ShareErrorsFromSession;
2121
use Pterodactyl\Http\Middleware\MaintenanceMiddleware;
22+
use Pterodactyl\Http\Middleware\EnsureStatefulRequests;
2223
use Pterodactyl\Http\Middleware\RedirectIfAuthenticated;
2324
use Illuminate\Auth\Middleware\AuthenticateWithBasicAuth;
2425
use Pterodactyl\Http\Middleware\Api\AuthenticateIPAccess;
@@ -29,7 +30,6 @@
2930
use Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode;
3031
use Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull;
3132
use Pterodactyl\Http\Middleware\Api\Client\SubstituteClientBindings;
32-
use Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful;
3333
use Pterodactyl\Http\Middleware\Api\Application\AuthenticateApplicationUser;
3434

3535
class Kernel extends HttpKernel
@@ -66,7 +66,7 @@ class Kernel extends HttpKernel
6666
],
6767
'api' => [
6868
IsValidJson::class,
69-
EnsureFrontendRequestsAreStateful::class,
69+
EnsureStatefulRequests::class,
7070
'auth:sanctum',
7171
RequireTwoFactorAuthentication::class,
7272
AuthenticateIPAccess::class,
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
<?php
2+
3+
namespace Pterodactyl\Http\Middleware;
4+
5+
use Illuminate\Http\Request;
6+
use Illuminate\Routing\Pipeline;
7+
use Illuminate\Session\Middleware\StartSession;
8+
use Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse;
9+
use Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful;
10+
11+
class EnsureStatefulRequests extends EnsureFrontendRequestsAreStateful
12+
{
13+
/**
14+
* {@inheritDoc}
15+
*/
16+
public function handle($request, $next)
17+
{
18+
$this->configureSecureCookieSessions();
19+
20+
return (new Pipeline(app()))
21+
->send($request)
22+
->through($this->isStateful($request) ? $this->statefulMiddleware() : [])
23+
->then(fn ($request) => $next($request));
24+
}
25+
26+
/**
27+
* Determines if a request is stateful or not. This is determined using the default
28+
* Sanctum "fromFrontend" helper method. However, we also check if the request includes
29+
* a cookie value for the Pterodactyl session. If so, we assume this is a stateful
30+
* request.
31+
*
32+
* We don't want to support API usage using the cookies, except for requests stemming
33+
* from the front-end we control.
34+
*/
35+
protected function isStateful(Request $request): bool
36+
{
37+
return static::fromFrontend($request) || $request->hasCookie(config('session.cookie'));
38+
}
39+
40+
/**
41+
* Returns the middleware to be applied to a stateful request to the API.
42+
*/
43+
protected function statefulMiddleware(): array
44+
{
45+
return [
46+
function ($request, $next) {
47+
$request->attributes->set('sanctum', true);
48+
49+
return $next($request);
50+
},
51+
config('sanctum.middleware.encrypt_cookies', EncryptCookies::class),
52+
AddQueuedCookiesToResponse::class,
53+
StartSession::class,
54+
config('sanctum.middleware.verify_csrf_token', VerifyCsrfToken::class),
55+
];
56+
}
57+
}

0 commit comments

Comments
 (0)