Un gabarit Heat généré depuis chaque lab.yaml, une stack par session de lab (création à l'admission, suppression à l'expiration via des jobs Redis et un worker systemd dédié). Passage du compte de service à une authentification par mot de passe : Heat refuse de créer un trust à partir d'un jeton d'application credential (voir ADR 0002). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
44 lines
1.6 KiB
PHP
44 lines
1.6 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Models\LabSession;
|
|
use App\Models\LabSessionMachine;
|
|
use App\Models\Seance;
|
|
use App\Services\OpenStack\JetonConsole;
|
|
use Illuminate\Http\JsonResponse;
|
|
use Illuminate\Support\Facades\Auth;
|
|
|
|
/**
|
|
* Émet des jetons de console série à usage court (étape 9) : le navigateur
|
|
* ne reçoit jamais l'adresse de nova-serialproxy, seulement un jeton Redis
|
|
* valable 5 minutes. L'élève peut écrire dans ses propres VM ; le prof ne
|
|
* peut que regarder celles d'un élève de sa classe (étape 10 : une session
|
|
* de lab a plusieurs machines, voir LabSessionMachine).
|
|
*/
|
|
class ConsoleController extends Controller
|
|
{
|
|
public function __construct(private readonly JetonConsole $jetons) {}
|
|
|
|
public function pourEleve(LabSession $labSession, LabSessionMachine $labSessionMachine): JsonResponse
|
|
{
|
|
$eleve = Auth::guard('eleve')->user();
|
|
abort_if($labSession->eleve_id !== $eleve->id, 403);
|
|
abort_if($labSessionMachine->lab_session_id !== $labSession->id, 404);
|
|
|
|
return response()->json([
|
|
'jeton' => $this->jetons->pourEcriture($labSessionMachine->instance_id),
|
|
]);
|
|
}
|
|
|
|
public function pourProf(Seance $seance, LabSession $labSession, LabSessionMachine $labSessionMachine): JsonResponse
|
|
{
|
|
abort_if($seance->classe->user_id !== Auth::guard('web')->id(), 403);
|
|
abort_if($labSession->seance_id !== $seance->id, 404);
|
|
abort_if($labSessionMachine->lab_session_id !== $labSession->id, 404);
|
|
|
|
return response()->json([
|
|
'jeton' => $this->jetons->pourLecture($labSessionMachine->instance_id),
|
|
]);
|
|
}
|
|
}
|