V1.22.23 Passage à Claude Code et création du BackOffice

This commit is contained in:
2026-09-11 13:38:34 +00:00
parent a9af2a5213
commit 05df1c5a28
28 changed files with 2660 additions and 670 deletions
+97
View File
@@ -0,0 +1,97 @@
<?php
/**
* ASPIC — espaces.php
*
* Endpoint du BackOffice (11 septembre 2026) — vérification/administration
* des espaces disque privés (voir espace_utilisateur.php). Construit pour
* répondre à un besoin explicite de Jean-Marc : pouvoir toujours retrouver,
* en un clic, le dossier réel d'un utilisateur — l'opacité des noms de
* dossiers protège contre un visiteur extérieur, jamais contre lui.
*
* GET : pour chaque ligne de MIR_Users, le chemin résolu (calculé, jamais
* deviné), s'il existe déjà sur disque, et sa taille.
* POST { "action": "provisionner", "MIR_Code": "JMP" } : force la création
* immédiate du dossier (au lieu d'attendre un premier besoin réel).
*/
session_start();
header('Content-Type: application/json; charset=utf-8');
require __DIR__ . '/db.php';
require __DIR__ . '/espace_utilisateur.php';
if (empty($_SESSION['USR_Code'])) {
http_response_code(401);
echo json_encode(['error' => 'Non identifié — veuillez vous connecter.']);
exit;
}
try {
$pdoRouter = getRouterConnection();
} catch (PDOException $e) {
http_response_code(500);
echo json_encode(['error' => 'Connexion à MIRADOR impossible']);
exit;
}
function tailleDossier(string $chemin): int
{
if (!is_dir($chemin)) return 0;
$total = 0;
$iterateur = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($chemin, FilesystemIterator::SKIP_DOTS));
foreach ($iterateur as $fichier) {
if ($fichier->isFile()) $total += $fichier->getSize();
}
return $total;
}
$method = $_SERVER['REQUEST_METHOD'];
if ($method === 'GET') {
$lignes = $pdoRouter->query('SELECT MIR_Email, MIR_Code, MIR_ServeurHost, MIR_BaseNom, MIR_Espace FROM MIR_Users ORDER BY MIR_Email')->fetchAll();
$resultat = [];
foreach ($lignes as $l) {
$dossierRelatif = cheminTenant($l['MIR_ServeurHost'], $l['MIR_BaseNom']) . '/' . ($l['MIR_Espace'] ?: '(pas encore créé)');
$cheminAbsolu = RACINE_ESPACES . '/' . $dossierRelatif;
$existe = $l['MIR_Espace'] && is_dir($cheminAbsolu);
$resultat[] = [
'MIR_Email' => $l['MIR_Email'],
'MIR_Code' => $l['MIR_Code'],
'MIR_BaseNom' => $l['MIR_BaseNom'],
'dossier_relatif' => $dossierRelatif,
'existe' => $existe,
'taille_octets' => $existe ? tailleDossier($cheminAbsolu) : 0,
];
}
echo json_encode(['espaces' => $resultat]);
exit;
}
if ($method === 'POST') {
$data = json_decode(file_get_contents('php://input'), true) ?? [];
$action = (string) ($data['action'] ?? '');
$mirEmail = trim((string) ($data['MIR_Email'] ?? ''));
if ($action !== 'provisionner' || $mirEmail === '') {
http_response_code(400);
echo json_encode(['error' => 'Requête invalide']);
exit;
}
// Clé MIR_Email, jamais MIR_Code — voir commentaire de jetonUtilisateur()
// dans espace_utilisateur.php (MIR_Code n'est pas unique dans MIR_Users).
$stmt = $pdoRouter->prepare('SELECT MIR_ServeurHost, MIR_BaseNom FROM MIR_Users WHERE MIR_Email = ? LIMIT 1');
$stmt->execute([$mirEmail]);
$ligne = $stmt->fetch();
if (!$ligne) {
http_response_code(404);
echo json_encode(['error' => 'Utilisateur introuvable dans MIRADOR']);
exit;
}
$chemin = resoudreEspaceUtilisateur($pdoRouter, $mirEmail, $ligne['MIR_ServeurHost'], $ligne['MIR_BaseNom']);
echo json_encode(['success' => true, 'chemin' => $chemin]);
exit;
}
http_response_code(405);
echo json_encode(['error' => 'Méthode non autorisée']);