mirror of
https://github.com/R0m1k3/LogiFlow.git
synced 2026-10-17 04:06:44 +02:00
- Serveur Rust (server-rs/, axum + sqlx) : les 148 adresses de l'API, l'interface, les migrations de démarrage et les tâches de fond ; même comportement que Node (banc : 2027 cas, 0 écart hors écarts déclarés USERS-02, RAPPRO-21, R4, R5). - Node retiré : server/, dépendances serveur, image Docker sans Node (51 Mo), docker-compose à un seul service applicatif. - R4 : écritures d'un autre site refusées (Sec-Fetch-Site / Origin). - R5 : « aujourd'hui » et sauvegarde automatique à l'heure de Paris. - R6 : mainteneur dans .github/CODEOWNERS. - Menu latéral : Accueil puis Calendrier en tête. - Plan et état : docs/PLAN-MIGRATION-RUST.md. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Ke2qyS8rgacP3ap5iezDbM
67 lines
2.2 KiB
TypeScript
67 lines
2.2 KiB
TypeScript
import type { ReadCase, WriteScenario } from "../types";
|
|
|
|
export const reads: ReadCase[] = [
|
|
{ module: "socle", path: "/", accounts: ["anonyme"] },
|
|
{ module: "socle", path: "/deliveries", accounts: ["anonyme", "manager"] },
|
|
{ module: "socle", path: "/favicon.ico", accounts: ["anonyme"] },
|
|
{ module: "socle", path: "/api/health", accounts: ["anonyme"] },
|
|
{ module: "socle", path: "/api/adresse-inconnue", accounts: ["anonyme", "admin"] },
|
|
{ module: "auth", path: "/api/user" },
|
|
{ module: "auth", path: "/api/default-credentials-check" },
|
|
];
|
|
|
|
export const writes: WriteScenario[] = [
|
|
{
|
|
module: "auth",
|
|
name: "déconnexion puis lecture de l'utilisateur",
|
|
steps: [
|
|
{ method: "POST", path: "/api/logout" },
|
|
{ method: "GET", path: "/api/user" },
|
|
],
|
|
tables: [],
|
|
},
|
|
{
|
|
module: "auth",
|
|
name: "connexion refusée",
|
|
accounts: ["anonyme"],
|
|
steps: [
|
|
{ method: "POST", path: "/api/login", body: { username: "manager", password: "mauvais" } },
|
|
{ method: "POST", path: "/api/login", body: { username: "inconnu", password: "x" } },
|
|
{ method: "POST", path: "/api/login", body: {} },
|
|
],
|
|
tables: ["users"],
|
|
},
|
|
// ---------- Requêtes d'écriture d'un autre site (décision R4) ----------
|
|
{
|
|
module: "socle",
|
|
name: "écriture d'un autre site refusée",
|
|
accounts: ["manager"],
|
|
steps: [
|
|
{
|
|
method: "POST",
|
|
path: "/api/logout",
|
|
headers: { origin: "https://site-tiers.example", "sec-fetch-site": "cross-site" },
|
|
},
|
|
{ method: "POST", path: "/api/logout", headers: { origin: "null" } },
|
|
// La session est toujours ouverte côté Rust
|
|
{ method: "GET", path: "/api/user" },
|
|
],
|
|
tables: [],
|
|
deviation: {
|
|
fields: ["status", "headers", "body"],
|
|
reason:
|
|
"R4 : une requête /api qui n'est pas une lecture est refusée (403) quand le navigateur indique qu'elle vient d'un autre site (Sec-Fetch-Site, sinon Origin)",
|
|
},
|
|
},
|
|
{
|
|
module: "socle",
|
|
name: "écriture du même site acceptée",
|
|
accounts: ["manager"],
|
|
steps: [
|
|
{ method: "POST", path: "/api/logout", headers: { "sec-fetch-site": "same-origin" } },
|
|
{ method: "GET", path: "/api/user" },
|
|
],
|
|
tables: [],
|
|
},
|
|
];
|