From 1d983f3ff496d4dcc6a8b34d210c311c1a871b56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Munsch?= Date: Wed, 15 Jun 2022 13:05:30 +0200 Subject: [PATCH] Api MIse au propre --- .../Controllers/API/LDCNetworksController.php | 25 +++------ .../API/StatusCheckerController.php | 48 +++++------------ app/Http/Kernel.php | 1 + .../ApiCheckCredentialMiddleware.php | 23 +++++++++ app/Http/Middleware/Authenticate.php | 3 +- app/Http/Middleware/LDCNetwork.php | 13 +++-- .../Middleware/RedirectIfAuthenticated.php | 6 +-- .../Api/UpdateProjectStatusRequest.php | 51 +++++++++++++++++++ app/Http/Resources/LDCNetworkResource.php | 31 +++++++++++ app/Models/ProjectsStatusChecker.php | 20 ++++++++ config/api.php | 5 ++ routes/api.php | 6 ++- 12 files changed, 170 insertions(+), 62 deletions(-) create mode 100644 app/Http/Middleware/ApiCheckCredentialMiddleware.php create mode 100644 app/Http/Requests/Api/UpdateProjectStatusRequest.php create mode 100644 app/Http/Resources/LDCNetworkResource.php create mode 100644 config/api.php diff --git a/app/Http/Controllers/API/LDCNetworksController.php b/app/Http/Controllers/API/LDCNetworksController.php index e80369a..b6d78a2 100644 --- a/app/Http/Controllers/API/LDCNetworksController.php +++ b/app/Http/Controllers/API/LDCNetworksController.php @@ -3,30 +3,21 @@ namespace App\Http\Controllers\API; use App\Http\Controllers\Controller; +use App\Http\Resources\Api\V2\LDCNetworkResource; use App\Models\LDCNetwork; -use Illuminate\Http\Request; class LDCNetworksController extends Controller { - public function index(Request $request) + /** + * Api LDC Networks + * + * @return \Illuminate\Http\Response|\Illuminate\Contracts\Routing\ResponseFactory + */ + public function index() { - $token = $request->token; - - if ($token !== 'CE8S52Qq7stf5k8frF4T') { - return response('Unauthorized', 401); - } - $ips = []; $networks = LDCNetwork::all(); - foreach ($networks as $network) { - $infos = explode('.', $network->first_ip); - $min = $infos[3]; - $max = explode('.', $network->last_ip)[3]; - for ($i = $min; $i <= $max; $i++) { - $ips[] = "$infos[0].$infos[1].$infos[2].$i"; - } - } - return response($ips); + return \response()->json(new LDCNetworkResource($networks)); } } diff --git a/app/Http/Controllers/API/StatusCheckerController.php b/app/Http/Controllers/API/StatusCheckerController.php index 3101460..ff514be 100644 --- a/app/Http/Controllers/API/StatusCheckerController.php +++ b/app/Http/Controllers/API/StatusCheckerController.php @@ -3,46 +3,24 @@ namespace App\Http\Controllers\API; use App\Http\Controllers\Controller; -use App\Models\Project; +use App\Http\Requests\Api\UpdateProjectStatusRequest; use App\Models\ProjectsStatusChecker; -use Illuminate\Http\Request; class StatusCheckerController extends Controller { - public function index(Request $request) + /** + * Undocumented function + * + * @param \App\Http\Requests\Api\UpdateProjectStatusRequest $request + * @return \Illuminate\Http\Response|\Illuminate\Contracts\Routing\ResponseFactory + */ + public function index(UpdateProjectStatusRequest $request) { - $token = $request->token; - $datas = $request->datas; + /** @var \App\Models\ProjectsStatusChecker */ + $project_sc = ProjectsStatusChecker::where('project_uuid', '=', $request->uuid) + ->firstOrNew(); - if ($token !== 'CE8S52Qq7stf5k8frF4T') { - return response('Unauthorized', 401); - } - - $oDatas = json_decode($datas); - - $app_uuid = $oDatas->uuid; - $sitemap = $oDatas->sitemap; - $robots = $oDatas->robots; - $code = json_encode($oDatas->code); - $logs = $oDatas->logs; - - $project_sc = ProjectsStatusChecker::where('project_uuid', '=', $app_uuid)->first(); - if (!$project_sc) { - $project = Project::where('uuid', '=', $app_uuid)->first(); - if (!$project) { - return response('Unknown', 404); - } - $project_sc = new ProjectsStatusChecker(); - $project_sc->project_uuid = $app_uuid; - } - - $project_sc->code = $code; - $project_sc->sitemap = $sitemap; - $project_sc->robots = $robots; - $project_sc->logs = $logs; - $project_sc->updated_at = NOW(); - $project_sc->save(); - - return response('OK'); + $project_sc->fill($request->validated()); + return $project_sc->save() ? response('OK') : response('KO'); } } diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index ff1a327..8de15bc 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -72,6 +72,7 @@ class Kernel extends HttpKernel 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, 'htmlsanitize' => \App\Http\Middleware\HtmlSanitizer::class, + 'apiCheck' => \App\Http\Middleware\ApiCheckCredentialMiddleware::class ]; /** diff --git a/app/Http/Middleware/ApiCheckCredentialMiddleware.php b/app/Http/Middleware/ApiCheckCredentialMiddleware.php new file mode 100644 index 0000000..7e069f7 --- /dev/null +++ b/app/Http/Middleware/ApiCheckCredentialMiddleware.php @@ -0,0 +1,23 @@ +token !== \config('api.key')) { + return response('Unauthorized', 401); + } + + /** @var \Illuminate\Http\Request $request */ + return $next($request); + } +} diff --git a/app/Http/Middleware/Authenticate.php b/app/Http/Middleware/Authenticate.php index 8a003b2..632e4da 100644 --- a/app/Http/Middleware/Authenticate.php +++ b/app/Http/Middleware/Authenticate.php @@ -10,11 +10,12 @@ class Authenticate extends Middleware /** * Get the path the user should be redirected to when they are not authenticated. * - * @param \Illuminate\Http\Request $request + * @param mixed $request * @return string|null */ protected function redirectTo($request) { + /** @var \Illuminate\Http\Request $request */ if (!$request->expectsJson()) { session(['redirectURL' => URL::full()]); return route('saml2_login', 'ldc'); diff --git a/app/Http/Middleware/LDCNetwork.php b/app/Http/Middleware/LDCNetwork.php index 58526c7..a0476b0 100644 --- a/app/Http/Middleware/LDCNetwork.php +++ b/app/Http/Middleware/LDCNetwork.php @@ -9,14 +9,19 @@ class LDCNetwork /** * Handle an incoming request. * - * @param \Illuminate\Http\Request $request - * @param \Closure $next + * @param mixed $request + * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { - // IpUtils::checkIp(); - // https://github.com/symfony/http-foundation/blob/master/IpUtils.php#L36 + /** + * IpUtils::checkIp(); + */ + + // * https://github.com/symfony/http-foundation/blob/master/IpUtils.php#L36 . + + /** @var \Illuminate\Http\Request $request */ return $next($request); } } diff --git a/app/Http/Middleware/RedirectIfAuthenticated.php b/app/Http/Middleware/RedirectIfAuthenticated.php index 535f485..fb8ed99 100644 --- a/app/Http/Middleware/RedirectIfAuthenticated.php +++ b/app/Http/Middleware/RedirectIfAuthenticated.php @@ -5,6 +5,7 @@ namespace App\Http\Middleware; use Aacotroneo\Saml2\Saml2Auth; use App\Providers\RouteServiceProvider; use Closure; +use Illuminate\Http\Request; use Illuminate\Support\Facades\URL; class RedirectIfAuthenticated @@ -14,14 +15,13 @@ class RedirectIfAuthenticated * * @param \Illuminate\Http\Request $request * @param \Closure $next - * @param string|null $guard * @return mixed */ - public function handle($request, Closure $next, $guard = null) + public function handle(Request $request, Closure $next) { if ($request->ajax()) { + // Or, return a response that causes client side js to redirect to '/routesPrefix/myIdp1/login' . return response('Unauthorized.', 401); -// Or, return a response that causes client side js to redirect to '/routesPrefix/myIdp1/login' } else { $saml2Auth = new Saml2Auth(Saml2Auth::loadOneLoginAuthFromIpdConfig('ldc')); session(['redirectURL' => URL::full()]); diff --git a/app/Http/Requests/Api/UpdateProjectStatusRequest.php b/app/Http/Requests/Api/UpdateProjectStatusRequest.php new file mode 100644 index 0000000..83033e6 --- /dev/null +++ b/app/Http/Requests/Api/UpdateProjectStatusRequest.php @@ -0,0 +1,51 @@ +token === \config('api.key'); + } + + /** + * Prepare the data for validation. + * + * @return void + */ + protected function prepareForValidation() + { + $data = \json_decode($this->datas, true); + $this->merge([ + 'project_uuid' => collect($data)->get('uuid'), + 'sitemap' => collect($data)->get('sitemap'), + 'robots' => collect($data)->get('robots'), + 'code' => collect($data)->get('code'), + 'logs' => collect($data)->get('logs') + ]); + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules() + { + return [ + 'project_uuid' => 'required|exists:projects,uuid', + 'sitemap' => 'required|boolean', + 'robots' => 'required|boolean', + 'code' => 'required|json', + 'logs' => 'required|numeric', + ]; + } +} diff --git a/app/Http/Resources/LDCNetworkResource.php b/app/Http/Resources/LDCNetworkResource.php new file mode 100644 index 0000000..8ca06eb --- /dev/null +++ b/app/Http/Resources/LDCNetworkResource.php @@ -0,0 +1,31 @@ +collection->map(function (LDCNetwork $network) { + $infos = collect(explode('.', strval($network->first_ip))); + $min = intval($infos->get(3)); + $max = collect(explode('.', strval($network->last_ip)))->get(3); + for ($i = $min; $i <= $max; $i++) { + $ips[] = $infos->get(0) . '.' . + $infos->get(1) . '.' . + $infos->get(2) . ".$i"; + } + return $ips; + }); + } +} diff --git a/app/Models/ProjectsStatusChecker.php b/app/Models/ProjectsStatusChecker.php index b0e83c3..e274af0 100644 --- a/app/Models/ProjectsStatusChecker.php +++ b/app/Models/ProjectsStatusChecker.php @@ -12,4 +12,24 @@ class ProjectsStatusChecker extends Model * @var string */ protected $table = 'projects_status_checker'; + + /** + * The attributes that should be cast. + * + * @var array + */ + protected $casts = [ + 'code' => 'array', + 'sitemap' => 'boolean', + 'robots' => 'boolean' + ]; + + /** + * The attributes that are mass assignable. + * + * @var array + */ + protected $fillable = [ + 'project_uuid', 'code', 'sitemap', 'robots' + ]; } diff --git a/config/api.php b/config/api.php new file mode 100644 index 0000000..9c563fc --- /dev/null +++ b/config/api.php @@ -0,0 +1,5 @@ + 'CE8S52Qq7stf5k8frF4T' +]; diff --git a/routes/api.php b/routes/api.php index 23312d7..9bcdf2f 100644 --- a/routes/api.php +++ b/routes/api.php @@ -3,5 +3,7 @@ use App\Http\Controllers\API\StatusCheckerController; use Illuminate\Support\Facades\Route; -Route::post('/status-checker', [StatusCheckerController::class, 'index']); -Route::get('/ldc-networks', [StatusCheckerController::class, 'index']); +Route::middleware('apiCheck')->group(function () { + Route::post('/status-checker', [StatusCheckerController::class, 'index']); + Route::get('/ldc-networks', [LDCNetworksController::class, 'index']); +});