Paillasse/portail/app/Http/Controllers/WebdavAuthController.php

59 lines
1.7 KiB
PHP
Raw Permalink Normal View History

<?php
namespace App\Http\Controllers;
use App\Models\Eleve;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Support\Facades\Storage;
/**
* Sous-requête interne de Nginx (auth_request, bloc C, WebDAV des élèves) :
* mêmes identifiants que la connexion, jamais de session, jamais appelable
* directement depuis l'extérieur (location « internal » de Nginx, voir
* ansible/roles/portail/templates/nginx-portail.conf.j2). Répond 200 avec
* l'id de l'élève en en-tête (le sous-dossier auquel Nginx le limite), ou
* 401 sinon.
*/
class WebdavAuthController extends Controller
{
public function verifier(Request $request): Response
{
$identifiant = $request->getUser();
$code = $request->getPassword();
if ($identifiant === null || $code === null) {
return $this->refuser();
}
$cle = 'webdav:'.$identifiant.'|'.$request->ip();
if (RateLimiter::tooManyAttempts($cle, 5)) {
return $this->refuser();
}
$succes = Auth::guard('eleve')->once(['identifiant' => $identifiant, 'password' => $code]);
if (! $succes) {
RateLimiter::hit($cle, 300);
return $this->refuser();
}
RateLimiter::clear($cle);
/** @var Eleve $eleve */
$eleve = Auth::guard('eleve')->user();
Storage::disk('webdav')->makeDirectory((string) $eleve->id);
return response('', 200)->withHeaders(['X-Eleve-Dossier' => (string) $eleve->id]);
}
private function refuser(): Response
{
return response('', 401);
}
}