diff --git a/app/Http/Controllers/Api/ApiV2Controller.php b/app/Http/Controllers/Api/ApiV2Controller.php index 632ec31fe..2147d5920 100644 --- a/app/Http/Controllers/Api/ApiV2Controller.php +++ b/app/Http/Controllers/Api/ApiV2Controller.php @@ -18,6 +18,7 @@ use Illuminate\Http\JsonResponse; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\Support\Carbon; +use Illuminate\Support\Facades\Validator; class ApiV2Controller extends BasePageController { @@ -187,6 +188,9 @@ class ApiV2Controller extends BasePageController } $releases = new Releases(); $user = User::query()->where('api_token', $request->input('api_token'))->first(); + if ($user === null) { + return response()->json(['error' => 'Invalid API Token'], 403); + } $catExclusions = User::getCategoryExclusionForApi($request); $minSize = $request->has('minsize') && $request->input('minsize') > 0 ? $request->input('minsize') : 0; $this->api->verifyEmptyParameter($request, 'id'); @@ -261,6 +265,9 @@ class ApiV2Controller extends BasePageController return response()->json(['error' => 'Missing parameter (api_token)'], 403); } $user = User::query()->where('api_token', $request->input('api_token'))->first(); + if ($user === null) { + return response()->json(['error' => 'Invalid API Token'], 403); + } event(new UserAccessedApi($user)); UserRequest::addApiRequest($request->input('api_token'), $request->getRequestUri()); $relData = Release::checkGuidForApi($request->input('id')); @@ -273,16 +280,22 @@ class ApiV2Controller extends BasePageController public function details(Request $request): JsonResponse { + if ($request->missing('api_token') || $request->isNotFilled('api_token')) { + return response()->json(['error' => 'Missing parameter (api_token)'], 403); + } if ($request->missing('id')) { return response()->json(['error' => 'Missing parameter (guid is required for single release details)'], 400); } UserRequest::addApiRequest($request->input('api_token'), $request->getRequestUri()); - $userData = User::query()->where('api_token', $request->input('api_token'))->first(); - event(new UserAccessedApi($userData)); + $user = User::query()->where('api_token', $request->input('api_token'))->first(); + if ($user === null) { + return response()->json(['error' => 'Invalid API Token'], 403); + } + event(new UserAccessedApi($user)); $relData = Release::getByGuid($request->input('id')); - $relData = fractal($relData, new DetailsTransformer($userData)); + $relData = fractal($relData, new DetailsTransformer($user)); return response()->json($relData); } diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index cd76e8f8e..5d1f25639 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -19,6 +19,7 @@ class Kernel extends HttpKernel Middleware\TrimStrings::class, \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, \Monicahq\Cloudflare\Http\Middleware\TrustProxies::class, + Middleware\ForceJsonOnAPI::class, ]; /** diff --git a/app/Http/Middleware/ForceJsonOnAPI.php b/app/Http/Middleware/ForceJsonOnAPI.php new file mode 100644 index 000000000..6f89bcd5a --- /dev/null +++ b/app/Http/Middleware/ForceJsonOnAPI.php @@ -0,0 +1,26 @@ +is('api/*') && !Str::contains($request->header('accept'), ['/json', '+json'])) { + $request->headers->set('accept', 'application/json,' . $request->header('accept')); + } + + return $next($request); + } +}