75d1ce87fc35cc2e9f5160e5f2130268a9e4b7c3
`--trust-reverse-proxy` était un drapeau creux : il n'était lu que dans `ServerConfig::validate()` pour exiger sa propre présence. Le serveur n'a jamais vérifié qui se connectait ni ce que le proxy annonçait. Ce lot lui donne un effet. - `trusted_proxies: Vec<TrustedProxy>` dans `ServerConfig` + `--trusted-proxy` (répétable, IP ou CIDR v4/v6). `validate()` refuse désormais au démarrage un bind non-loopback en mode remote sans au moins un proxy autorisé. - Guard runtime sur les trois surfaces (statique, `/api/*`, `/api/ws`) : le `peer_addr` réel est vérifié AVANT toute confiance accordée aux headers. Sur bind loopback, seul un pair loopback est accepté ; sinon le pair doit tomber dans un `--trusted-proxy`. - `X-Forwarded-Proto: https` obligatoire en mode proxy, avec un message de refus actionnable (la commande nginx exacte à ajouter). - `X-Forwarded-For` n'autorise jamais rien : il n'est que journalisé. Un header ne donne aucun droit, seul le pair TCP en donne. - Diagnostics : `UntrustedProxyPeer`, `ForwardedProtoRejected`, `ForwardedHostMismatch`. B0 — même bug de port que celui corrigé dans #68 B1, sur le chemin CLI cette fois : `run_server` construisait son `ServerState` AVANT le bind, donc `idea-serve --listen 127.0.0.1:0` comparait l'origine à `http://127.0.0.1:0` et rejetait tout en 403. La réconciliation du port effectif est factorisée dans `config_with_effective_listen`, partagée avec le chemin embarqué. `X-Forwarded-Host` ne provoque PAS de rejet : Architect l'a jugé redondant avec la vérification stricte d'`Origin`, et il cassait nginx en configuration par défaut. Il reste un warning de diagnostic. La vérification d'accès stricte demeure l'égalité d'`Origin` contre `--public-origin`. CHANGEMENT DE COMPORTEMENT ASSUMÉ — ce lot casse volontairement les configurations existantes : un bind non-loopback distant sans `--trusted-proxy` est désormais refusé au démarrage. C'est le prix d'un drapeau qui ne mentait plus. Le message d'erreur dit quoi ajouter. Origine du ticket : #72 est né d'une trouvaille de l'agent Git à la revue de la doc de #65 — c'est en vérifiant une phrase de sécurité qu'il a établi que `--trust-reverse-proxy` n'avait aucun effet runtime. QA ré-exécutée par Git HORS SANDBOX avant merge (DevBackend et QA sont tous deux bloqués par EPERM sur `TcpListener::bind` ; un vert sandboxé ne vaut rien ici, on s'est déjà fait avoir sur #68 B1) : `cargo test -p web-server` 66 passed, 0 échec · `-p backend` · `-p app-tauri` verts. Revue de sécurité par Git : guard câblé sur les 3 routes, chemin de production propageant toujours le vrai `peer_addr` (le repli `listen.ip()` est `#[cfg(test)]`, inatteignable en production), CIDR correct y compris `prefix 0`. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The file is empty.
Description
Languages
Rust
80.5%
TypeScript
19.4%