# 🔍 AUDIT EXHAUSTIF - VEZA CHAT SERVER ## Module: `veza-chat-server` (Rust) **Date**: 2025-01-27 **Auditeur**: Auto (Cursor AI) **Version analysĂ©e**: 0.2.0 **Statut compilation**: ❌ **ÉCHEC** (conflit de dĂ©pendances SQLx) --- # PHASE A — CARTOGRAPHIE DU MODULE ## 1. But du module **RĂŽle**: Serveur de chat temps rĂ©el avec WebSocket pour la plateforme Veza. **FonctionnalitĂ©s principales**: - Communication WebSocket bidirectionnelle (Axum + tokio-tungstenite) - Gestion de conversations (directes, groupes, channels) - Messages avec Ă©dition/suppression - Read receipts et delivered status - Typing indicators - Recherche et synchronisation d'historique - Authentification JWT avec refresh tokens - Permissions RBAC (admin, moderator, member) - Event Bus RabbitMQ (optionnel) - MĂ©triques Prometheus ## 2. EntrĂ©es / Sorties ### APIs exposĂ©es **HTTP REST** (port 8081 par dĂ©faut): - `GET /health` - Health check - `GET /healthz` - Health check (alias) - `GET /readyz` - Readiness check (DB + RabbitMQ) - `GET /metrics` - MĂ©triques Prometheus - `GET /api/messages/stats` - Statistiques serveur - `GET /api/messages/{conversation_id}` - RĂ©cupĂ©ration messages (authentifiĂ©) - `POST /api/messages` - Envoi message (authentifiĂ©) **WebSocket** (port 8081): - `GET /ws?token=` - Connexion WebSocket **Formats**: - JSON pour HTTP REST - JSON pour WebSocket (messages structurĂ©s) - Protobuf pour gRPC (prĂ©sent mais non utilisĂ© dans main.rs) ### Events WebSocket **Incoming** (`IncomingMessage`): - `SendMessage`, `JoinConversation`, `LeaveConversation` - `MarkAsRead`, `Typing`, `Delivered` - `EditMessage`, `DeleteMessage` - `FetchHistory`, `SearchMessages`, `SyncMessages` - `Ping` **Outgoing** (`OutgoingMessage`): - `NewMessage`, `MessageRead`, `MessageDelivered` - `UserTyping`, `MessageEdited`, `MessageDeleted` - `HistoryChunk`, `SearchResults`, `SyncChunk` - `ActionConfirmed`, `Error`, `Pong` ## 3. DĂ©pendances internes - `veza-common` (path: `../veza-common`) - Types partagĂ©s - Modules internes: `config`, `database`, `error`, `jwt_manager`, `repository`, `security`, `services`, `websocket` ## 4. DĂ©pendances externes **Base de donnĂ©es**: - PostgreSQL (via SQLx 0.8.6) - Migrations SQL dans `migrations/` **Cache** (optionnel): - Redis (via `redis` crate, feature `redis-cache`) **Message Broker** (optionnel): - RabbitMQ (via `lapin` 2.3) **Monitoring**: - Prometheus (via `metrics-exporter-prometheus`) ## 5. ExĂ©cution ### Build ```bash cargo build --release ``` ### Run ```bash ./target/release/chat-server ``` ### Variables d'environnement critiques - `DATABASE_URL` (requis) - PostgreSQL connection string - `JWT_SECRET` (requis, min 32 chars) - Secret pour JWT - `CHAT_SERVER_PORT` (dĂ©faut: 8081) - `CHAT_SERVER_HOST` (dĂ©faut: 0.0.0.0) - `RABBITMQ_URL` (optionnel) - `RABBITMQ_ENABLE` (dĂ©faut: true) ### Docker - `Dockerfile` prĂ©sent (multi-stage, Alpine) - `docker-compose.yml` prĂ©sent - Healthcheck configurĂ© (`/health`) ## 6. Points d'intĂ©gration **Backend Go**: - JWT tokens partagĂ©s (audience: `veza-chat`, issuer: `veza-backend`) - SchĂ©ma DB partagĂ© (UUID pour users, conversations, messages) **Frontend React**: - WebSocket: `ws://:8081/ws?token=` - REST API: `http://:8081/api/*` - Headers: `Authorization: Bearer ` **Auth**: - JWT HS256 (configurable) - Claims: `sub` (user_id UUID), `username`, `role`, `aud`, `iss`, `exp`, `iat`, `jti` --- # PHASE B — SANTÉ TECHNIQUE ## Build Status ### ❌ **P0 - BUILD CASSÉ** **Erreur**: Conflit de dĂ©pendances SQLx ``` error: failed to select a version for `libsqlite3-sys`. package `libsqlite3-sys v0.30.1` (sqlx 0.8.6) conflicts with `libsqlite3-sys v0.26.0` (sqlx 0.7.0 via veza-common) ``` **Fichiers concernĂ©s**: - `Cargo.toml` ligne 43: `sqlx = "0.8.6"` - `veza-common` (externe): `sqlx = "^0.7"` **Impact**: **Impossible de compiler le projet** **Fix minimal**: Aligner les versions SQLx entre `chat_server` et `veza-common`, ou exclure SQLite de `veza-common` si non utilisĂ©. ## Tests ### Couverture - Tests unitaires prĂ©sents dans plusieurs modules - Tests d'intĂ©gration avec `#[ignore]` (nĂ©cessitent DB) - Tests JWT prĂ©sents (`jwt_manager.rs`) - Tests permissions partiels ### ProblĂšmes dĂ©tectĂ©s - Beaucoup de tests ignorĂ©s (`#[ignore]`) car nĂ©cessitent DB - Pas de tests E2E WebSocket - Tests de sĂ©curitĂ© manquants (injection, rate limiting) ## Gestion des erreurs ### ✅ Points positifs - Type `ChatError` exhaustif avec `thiserror` - Helpers pour crĂ©ation d'erreurs (`ChatError::not_found`, etc.) - Mapping HTTP status codes appropriĂ© - Logging structurĂ© avec `tracing` ### ⚠ Points d'attention - **169 occurrences de `unwrap()` / `expect()` / `panic!`** dĂ©tectĂ©es - Certains `unwrap()` dans code de production (ex: `src/config.rs:21`, `src/main.rs:489`) - Panics possibles dans `SecurityConfig::default()` (ligne 192) si appelĂ© hors test ## Linters / QualitĂ© ### Clippy - Non exĂ©cutĂ© dans l'audit (nĂ©cessite build) - Recommandation: `cargo clippy --all-targets --all-features -- -D warnings` ### Conventions - ✅ Structure modulaire claire - ✅ Documentation rustdoc prĂ©sente - ⚠ Mix de noms français/anglais (ex: `conversation_id` vs `room_id`) - ⚠ Code mort potentiel (`security_legacy.rs`, `simple_message_store.rs`) --- # PHASE C — SÉCURITÉ ## Top 10 Risques Critiques ### **P0-001: Conflit de dĂ©pendances SQLx (Build cassĂ©)** - **Impact**: Impossible de dĂ©ployer - **Fichier**: `Cargo.toml:43` vs `veza-common` - **Fix**: Aligner versions ou exclure SQLite - **Effort**: S (1h) ### **P0-002: JWT Secret faible par dĂ©faut** - **Impact**: Tokens compromis si secret faible - **Fichier**: `src/main.rs:158`, `env.example:20` - **Preuve**: `JWT_SECRET=your-super-secret-jwt-key-change-this-in-production` - **Fix**: Validation stricte min 64 chars, gĂ©nĂ©ration alĂ©atoire au dĂ©marrage si absent - **Effort**: S (30min) ### **P0-003: Panics dans code de production** - **Impact**: Crash serveur - **Fichiers**: - `src/main.rs:489` - `expect("failed to install Ctrl+C handler")` - `src/config.rs:192` - `panic!` dans `SecurityConfig::default()` - `src/env.rs:30,61` - `panic!` dans helpers - **Fix**: Remplacer par `Result` et gestion d'erreurs - **Effort**: M (2h) ### **P0-004: Validation JWT incomplĂšte** - **Impact**: Tokens expirĂ©s ou invalides acceptĂ©s - **Fichier**: `src/jwt_manager.rs:266-303` - **Preuve**: VĂ©rification `exp` manuelle aprĂšs dĂ©codage (ligne 290-293), mais pas de vĂ©rification `nbf` (not before) - **Fix**: Ajouter validation `nbf`, vĂ©rifier `iss`/`aud` strictement - **Effort**: S (1h) ### **P1-005: SQL Injection potentielle dans recherche** - **Impact**: ExĂ©cution de requĂȘtes SQL arbitraires - **Fichier**: `src/repository/message_repository.rs:563` - **Preuve**: `format!("%{}%", query)` - si `query` contient `%` ou `_`, comportement inattendu - **Fix**: Échapper caractĂšres spĂ©ciaux ou utiliser `ILIKE` avec paramĂštre bindĂ© - **Effort**: S (30min) ### **P1-006: Rate limiting non implĂ©mentĂ©** - **Impact**: DoS possible, spam - **Fichier**: `src/security/mod.rs:94` - TODO comment - **Preuve**: `// TODO: ImplĂ©menter le Rate Limiting rĂ©el via Redis ou mĂ©moire partagĂ©e` - **Fix**: ImplĂ©menter rate limiter avec Redis ou in-memory (DashMap) - **Effort**: M (4h) ### **P1-007: CORS non configurĂ©** - **Impact**: XSS via requĂȘtes cross-origin - **Fichier**: `src/main.rs` - Pas de middleware CORS - **Preuve**: Aucune configuration CORS dans Axum router - **Fix**: Ajouter middleware CORS avec origines whitelistĂ©es - **Effort**: S (1h) ### **P1-008: Secrets dans logs** - **Impact**: Fuite de secrets en production - **Fichier**: `src/config.rs:55` - Logging de `database_url` potentiellement - **Preuve**: `info!("Initializing database connection pool with config: {:?}", config)` - peut logger credentials - **Fix**: Masquer credentials dans logs (remplacer par `***`) - **Effort**: S (30min) ### **P1-009: WebSocket sans rate limiting** - **Impact**: Spam de messages, DoS - **Fichier**: `src/websocket/handler.rs:200-894` - **Preuve**: Aucune limite sur frĂ©quence de messages WebSocket - **Fix**: Ajouter rate limiter par client (ex: max 100 messages/sec) - **Effort**: M (3h) ### **P1-010: Blacklist JWT en mĂ©moire (non persistant)** - **Impact**: Tokens rĂ©voquĂ©s revalidĂ©s aprĂšs redĂ©marrage - **Fichier**: `src/jwt_manager.rs:142` - **Preuve**: `revoked_tokens: Arc>>` - perdu au redĂ©marrage - **Fix**: Persister blacklist dans Redis ou DB - **Effort**: M (2h) ## Autres Risques (P2/P3) ### P2-011: Validation de contenu basique - **Fichier**: `src/security_legacy.rs` - Regex patterns, mais module "legacy" - **Fix**: Utiliser `ammonia` (dĂ©jĂ  dans deps) pour sanitization HTML ### P2-012: Pas de protection CSRF pour REST API - **Fichier**: `src/security/csrf.rs` existe mais non utilisĂ© dans `main.rs` - **Fix**: Activer middleware CSRF pour routes POST/PUT/DELETE ### P2-013: Heartbeat WebSocket fixe (60s) - **Fichier**: `src/websocket/handler.rs:121` - **Preuve**: `keepalive_timeout = Duration::from_secs(60)` - hardcodĂ© - **Fix**: Configurable via env var ### P2-014: Pas de validation de taille de message - **Fichier**: `src/websocket/handler.rs:214` - Pas de check `content.len()` - **Fix**: Valider `MAX_MESSAGE_LENGTH` (dĂ©fini dans `env.example:57` mais non utilisĂ©) ### P3-015: Logs verbeux en production - **Fichier**: `src/main.rs:84-101` - Logs avec `debug`/`info` mĂȘme en prod - **Fix**: Utiliser `RUST_LOG` avec niveaux appropriĂ©s --- # PHASE D — ROBUSTESSE & OBSERVABILITÉ ## Logs structurĂ©s ### ✅ Points positifs - `tracing` avec `tracing-subscriber` configurĂ© - Format JSON en production (`main.rs:92`) - Format dĂ©taillĂ© en dev (`main.rs:95-100`) - Champs structurĂ©s (`user_id = %user_id`, `conversation_id = %conversation_id`) ### ⚠ Gaps - **Pas de `request_id` / `trace_id`** pour corrĂ©lation - **Pas de log rotation** configurĂ© (mentionnĂ© dans `env.example:83` mais non implĂ©mentĂ©) - **Secrets potentiellement loggĂ©s** (voir P1-008) ## MĂ©triques ### ✅ PrĂ©sent - Prometheus exporter (`/metrics`) - `ChatMetrics` avec compteurs/gauges - MĂ©triques systĂšme (CPU, mĂ©moire) via `sysinfo` ### ⚠ Manquants - **Latence P50/P95/P99** pour requĂȘtes DB - **Taux d'erreur par endpoint** - **Connexions WebSocket actives** (compteur) - **Taille de la blacklist JWT** ## Healthchecks ### ✅ PrĂ©sent - `/health` - Basic health check - `/readyz` - Readiness (DB + RabbitMQ) ### ⚠ AmĂ©liorations - **Liveness check** sĂ©parĂ© (actuellement `/health` fait DB check aussi) - **Timeout configurable** pour healthchecks - **Circuit breaker** pour DB/RabbitMQ ## Timeouts & Retries ### ✅ PrĂ©sent - Timeout WebSocket inactivitĂ© (60s) - Retry RabbitMQ (`max_retries`, `retry_interval_secs`) ### ⚠ Manquants - **Timeout pour requĂȘtes DB** (seulement `acquire_timeout` dans pool) - **Retry avec backoff exponentiel** pour DB - **Circuit breaker** pour services externes ## Gestion de charge ### ✅ PrĂ©sent - Pool DB configurĂ© (max 20, min 5) - Limite messages (100 max dans `fetch_history`) ### ⚠ Gaps - **Pas de backpressure** pour WebSocket (clients peuvent spam) - **Pas de limite de connexions WebSocket simultanĂ©es** - **Pas de queue pour messages en attente** ## Migrations ### ✅ PrĂ©sent - Migrations SQL dans `migrations/` - SQLx migrate supportĂ© ### ⚠ ProblĂšmes - **16 fichiers de migration** - risque de confusion - **Migrations archivĂ©es** dans `migrations/archive/` - Ă  nettoyer - **Pas de rollback** automatique en cas d'Ă©chec --- # PHASE E — PERFORMANCE & SCALABILITÉ ## Hotspots identifiĂ©s ### 1. Broadcast WebSocket inefficace **Fichier**: `src/websocket/mod.rs:228-244` **ProblĂšme**: ItĂ©ration sur tous les clients pour chaque broadcast ```rust for client in clients.iter() { let conversations = client.conversations.read().await; if conversations.contains(&conversation_id) { let _ = client.send_message(message.clone()).await; } } ``` **Impact**: O(n) oĂč n = nombre total de clients, mĂȘme si seulement quelques-uns sont dans la conversation **Fix**: Index inversĂ© `conversation_id -> Vec` pour O(1) lookup **Effort**: M (3h) ### 2. Clonage de messages pour broadcast **Fichier**: `src/websocket/mod.rs:239` **ProblĂšme**: `message.clone()` pour chaque client **Impact**: Allocations inutiles pour gros messages **Fix**: Utiliser `Arc` ou sĂ©rialiser une fois, cloner bytes **Effort**: S (1h) ### 3. RequĂȘtes DB N+1 potentielles **Fichier**: `src/repository/message_repository.rs:82-144` **ProblĂšme**: Pas de batch loading pour conversations multiples **Impact**: Latence Ă©levĂ©e si plusieurs conversations chargĂ©es **Fix**: Ajouter mĂ©thode `get_multiple_conversations_messages` **Effort**: M (2h) ### 4. Blacklist JWT en mĂ©moire (HashSet) **Fichier**: `src/jwt_manager.rs:142` **ProblĂšme**: `HashSet` - recherche O(1) mais mĂ©moire illimitĂ©e **Impact**: Fuite mĂ©moire si beaucoup de tokens rĂ©voquĂ©s **Fix**: LRU cache ou TTL-based cleanup (dĂ©jĂ  partiellement implĂ©mentĂ© ligne 473) **Effort**: S (1h) ### 5. Parsing JSON rĂ©pĂ©tĂ© **Fichier**: `src/websocket/handler.rs:210` **ProblĂšme**: `serde_json::from_str(text)` Ă  chaque message **Impact**: CPU overhead pour gros payloads **Fix**: Cache de schĂ©mas JSON ou validation prĂ©-compilĂ©e **Effort**: P3 (optimisation future) ## Streaming & I/O ### WebSocket - ✅ Utilisation de `tokio-tungstenite` (async) - ⚠ Pas de compression WebSocket (per-message deflate) - ⚠ Pas de fragmentation pour gros messages ### Base de donnĂ©es - ✅ Pool de connexions configurĂ© - ⚠ Pas de prepared statements caching explicite (SQLx le fait mais non configurĂ©) - ⚠ Pas de connection pooling metrics exposĂ©es ## Async Runtime ### ✅ Points positifs - Tokio avec features "full" - Pas de blocking dans async (sauf `sysinfo` potentiellement) ### ⚠ Points d'attention - **Pas de configuration de worker threads** (utilise par dĂ©faut) - **Pas de metrics Tokio** (task spawns, park/unpark) --- # PHASE F — LISTE EXHAUSTIVE DES PROBLÈMES ## P0 - CRITIQUES (Build / SĂ©curitĂ© / Crash) | ID | Titre | Impact | Fichier | Fix minimal | Validation | Effort | |---|---|---|---|---|---|---| | **MOD-P0-001** | Conflit dĂ©pendances SQLx (build cassĂ©) | Impossible de compiler | `Cargo.toml:43` | Aligner versions SQLx (0.8.6 partout) ou exclure SQLite de veza-common | `cargo check` passe | S (1h) | | **MOD-P0-002** | JWT Secret faible par dĂ©faut | Tokens compromis | `src/main.rs:158`, `env.example:20` | Validation min 64 chars, gĂ©nĂ©ration alĂ©atoire si absent | Test: secret < 64 chars rejetĂ© | S (30min) | | **MOD-P0-003** | Panics dans code production | Crash serveur | `src/main.rs:489`, `src/config.rs:192`, `src/env.rs:30,61` | Remplacer `expect/panic` par `Result` | Tests: pas de panic sur erreurs attendues | M (2h) | | **MOD-P0-004** | Validation JWT incomplĂšte | Tokens invalides acceptĂ©s | `src/jwt_manager.rs:266-303` | Ajouter validation `nbf`, vĂ©rifier `iss/aud` strictement | Test: token avec `nbf` futur rejetĂ© | S (1h) | ## P1 - HAUTE PRIORITÉ (Bugs frĂ©quents / Dette bloquante) | ID | Titre | Impact | Fichier | Fix minimal | Validation | Effort | |---|---|---|---|---|---|---| | **MOD-P1-005** | SQL Injection potentielle recherche | ExĂ©cution SQL arbitraire | `src/repository/message_repository.rs:563` | Échapper `%` et `_` ou utiliser paramĂštre bindĂ© | Test: query avec `%` ne match pas littĂ©ralement | S (30min) | | **MOD-P1-006** | Rate limiting non implĂ©mentĂ© | DoS, spam | `src/security/mod.rs:94` | ImplĂ©menter avec Redis ou DashMap | Test: 1000 req/sec rejetĂ©es | M (4h) | | **MOD-P1-007** | CORS non configurĂ© | XSS cross-origin | `src/main.rs:246` | Ajouter middleware CORS Axum | Test: requĂȘte cross-origin rejetĂ©e sans header | S (1h) | | **MOD-P1-008** | Secrets dans logs | Fuite credentials | `src/config.rs:264` | Masquer credentials (remplacer par `***`) | Test: logs ne contiennent pas `password=` | S (30min) | | **MOD-P1-009** | WebSocket sans rate limiting | Spam messages, DoS | `src/websocket/handler.rs:200` | Rate limiter par client (100 msg/sec) | Test: client spammant rejetĂ© | M (3h) | | **MOD-P1-010** | Blacklist JWT non persistant | Tokens rĂ©voquĂ©s revalidĂ©s | `src/jwt_manager.rs:142` | Persister dans Redis ou DB | Test: token rĂ©voquĂ© reste rĂ©voquĂ© aprĂšs restart | M (2h) | | **MOD-P1-011** | Pas de validation taille message | Messages trop longs | `src/websocket/handler.rs:214` | Valider `MAX_MESSAGE_LENGTH` (2000 chars) | Test: message > 2000 chars rejetĂ© | S (30min) | | **MOD-P1-012** | Broadcast WebSocket O(n) | Performance dĂ©gradĂ©e | `src/websocket/mod.rs:228` | Index inversĂ© conversation -> clients | Test: broadcast Ă  1000 clients < 10ms | M (3h) | | **MOD-P1-013** | Pas de limite connexions WS | DoS par connexions | `src/websocket/manager.rs:209` | Limiter max connexions (ex: 10000) | Test: 10001Ăšme connexion rejetĂ©e | S (1h) | | **MOD-P1-014** | Healthcheck timeout non configurĂ© | Healthcheck bloque | `src/main.rs:298` | Timeout configurable (ex: 5s) | Test: DB lent retourne 503 | S (30min) | ## P2 - MOYENNE PRIORITÉ (QualitĂ© / MaintenabilitĂ©) | ID | Titre | Impact | Fichier | Fix minimal | Validation | Effort | |---|---|---|---|---|---|---| | **MOD-P2-015** | Pas de request_id/trace_id | Debug difficile | `src/main.rs:82` | Ajouter middleware tracing avec `request_id` | Test: logs contiennent `request_id` | M (2h) | | **MOD-P2-016** | Log rotation non implĂ©mentĂ© | Disque plein | `env.example:83` | ImplĂ©menter avec `tracing-appender` | Test: logs rotent aprĂšs 100MB | M (2h) | | **MOD-P2-017** | MĂ©triques latence manquantes | Monitoring incomplet | `src/monitoring.rs` | Ajouter histogrammes P50/P95/P99 | Test: mĂ©triques exposĂ©es sur `/metrics` | M (2h) | | **MOD-P2-018** | Circuit breaker manquant | Cascading failures | N/A | ImplĂ©menter avec `tower` ou custom | Test: DB down -> circuit ouvert | M (4h) | | **MOD-P2-019** | Migrations multiples confuses | Risque d'erreur | `migrations/` (16 fichiers) | Nettoyer migrations archivĂ©es | Test: migrations appliquent dans ordre | S (1h) | | **MOD-P2-020** | Code mort (security_legacy) | Maintenance inutile | `src/security_legacy.rs` | Supprimer ou documenter usage | Test: build sans ce fichier | S (30min) | | **MOD-P2-021** | CSRF non activĂ© | CSRF attacks | `src/security/csrf.rs` | Activer middleware CSRF | Test: requĂȘte sans token CSRF rejetĂ©e | M (2h) | | **MOD-P2-022** | Heartbeat WebSocket hardcodĂ© | Non configurable | `src/websocket/handler.rs:121` | Configurable via env var | Test: heartbeat = 30s fonctionne | S (30min) | | **MOD-P2-023** | Clonage messages broadcast | Allocations inutiles | `src/websocket/mod.rs:239` | Utiliser `Arc` | Test: broadcast 100 clients < 5ms | S (1h) | | **MOD-P2-024** | RequĂȘtes N+1 potentielles | Latence Ă©levĂ©e | `src/repository/message_repository.rs` | Batch loading conversations | Test: 10 conversations < 100ms | M (2h) | ## P3 - BASSE PRIORITÉ (CosmĂ©tique / Refactors) | ID | Titre | Impact | Fichier | Fix minimal | Validation | Effort | |---|---|---|---|---|---|---| | **MOD-P3-025** | Mix français/anglais | Confusion | Multiple | Standardiser sur anglais | Review code | L (8h) | | **MOD-P3-026** | Logs verbeux en production | Bruit | `src/main.rs:84` | Utiliser `RUST_LOG` appropriĂ© | Test: prod logs = info seulement | S (30min) | | **MOD-P3-027** | Pas de compression WebSocket | Bande passante | `src/websocket/handler.rs:47` | Activer per-message deflate | Test: messages compressĂ©s | M (2h) | | **MOD-P3-028** | Tests ignorĂ©s nombreux | Couverture faible | Multiple `#[ignore]` | Setup DB de test ou mocks | Test: tous tests passent | L (8h) | | **MOD-P3-029** | Documentation rustdoc incomplĂšte | DX | Multiple | ComplĂ©ter doc comments | Test: `cargo doc` sans warnings | M (4h) | | **MOD-P3-030** | Pas de benchmarks | Performance non mesurĂ©e | N/A | Ajouter `criterion` benchmarks | Test: benchmarks passent | M (4h) | --- # PHASE G — PLAN D'EXÉCUTION ## Checklist P0 (Ordre strict) 1. ✅ **MOD-P0-001**: Fix conflit SQLx - Modifier `veza-common/Cargo.toml` pour utiliser `sqlx = "0.8.6"` OU exclure SQLite - VĂ©rifier: `cargo check` passe - **PR**: `fix: align sqlx versions to 0.8.6` 2. ✅ **MOD-P0-002**: Validation JWT Secret - Modifier `src/env.rs` pour valider min 64 chars - GĂ©nĂ©rer secret alĂ©atoire si absent (dev seulement) - **PR**: `security: enforce strong JWT secret (min 64 chars)` 3. ✅ **MOD-P0-003**: Remplacer panics - `src/main.rs:489` -> `Result` pour signal handlers - `src/config.rs:192` -> Supprimer `panic!` ou rendre test-only - `src/env.rs:30,61` -> Retourner `Result` au lieu de `panic!` - **PR**: `fix: replace panics with Result types` 4. ✅ **MOD-P0-004**: Validation JWT complĂšte - Ajouter validation `nbf` dans `validate_access_token` - VĂ©rifier `iss`/`aud` strictement (dĂ©jĂ  fait partiellement) - **PR**: `security: add nbf validation to JWT tokens` ## Checklist P1 (Par lots) ### Lot 1: SĂ©curitĂ© WebSocket (1 sprint) - **MOD-P1-009**: Rate limiting WebSocket - **MOD-P1-011**: Validation taille message - **MOD-P1-013**: Limite connexions WS - **PR**: `security: add rate limiting and validation for WebSocket` ### Lot 2: SĂ©curitĂ© REST (1 sprint) - **MOD-P1-006**: Rate limiting REST - **MOD-P1-007**: CORS middleware - **MOD-P1-008**: Masquer secrets dans logs - **PR**: `security: add rate limiting, CORS, and secure logging` ### Lot 3: Persistance & Robustesse (1 sprint) - **MOD-P1-010**: Blacklist JWT persistant - **MOD-P1-014**: Healthcheck timeout - **MOD-P2-015**: Request ID tracing - **PR**: `feat: persistent JWT blacklist, configurable healthcheck, request tracing` ### Lot 4: Performance WebSocket (1 sprint) - **MOD-P1-012**: Index inversĂ© broadcast - **MOD-P2-023**: Arc pour messages - **PR**: `perf: optimize WebSocket broadcast with index and Arc` ### Lot 5: Base de donnĂ©es (1 sprint) - **MOD-P1-005**: Fix SQL injection recherche - **MOD-P2-024**: Batch loading conversations - **PR**: `fix: SQL injection in search, add batch loading` ## Quick Wins (≀ 1h chacun) 1. **MOD-P2-022**: Heartbeat configurable (30min) 2. **MOD-P2-020**: Supprimer code mort (30min) 3. **MOD-P3-026**: Logs production (30min) 4. **MOD-P2-019**: Nettoyer migrations (1h) ## Tests Ă  ajouter en prioritĂ© ### Tests de sĂ©curitĂ© - [ ] Test: JWT secret < 64 chars rejetĂ© - [ ] Test: Token avec `nbf` futur rejetĂ© - [ ] Test: Recherche avec `%` ne match pas littĂ©ralement - [ ] Test: Rate limiting (1000 req/sec rejetĂ©es) - [ ] Test: CORS sans header rejetĂ© - [ ] Test: Message > 2000 chars rejetĂ© ### Tests de robustesse - [ ] Test: DB down -> healthcheck 503 - [ ] Test: Token rĂ©voquĂ© reste rĂ©voquĂ© aprĂšs restart - [ ] Test: Broadcast 1000 clients < 10ms - [ ] Test: 10001Ăšme connexion WS rejetĂ©e ### Tests E2E - [ ] Test: Connexion WebSocket complĂšte (join, send, leave) - [ ] Test: Édition/suppression message - [ ] Test: Read receipts et delivered status - [ ] Test: Recherche et synchronisation ## PR Plan (DĂ©coupe proposĂ©e) 1. **`fix: resolve sqlx dependency conflict`** (P0-001) 2. **`security: enforce strong JWT secret and validation`** (P0-002, P0-004) 3. **`fix: replace panics with Result types`** (P0-003) 4. **`security: add rate limiting and validation for WebSocket`** (P1-009, P1-011, P1-013) 5. **`security: add rate limiting, CORS, and secure logging`** (P1-006, P1-007, P1-008) 6. **`feat: persistent JWT blacklist and request tracing`** (P1-010, P1-014, P2-015) 7. **`perf: optimize WebSocket broadcast`** (P1-012, P2-023) 8. **`fix: SQL injection and batch loading`** (P1-005, P2-024) 9. **`chore: cleanup migrations and dead code`** (P2-019, P2-020) 10. **`feat: add observability improvements`** (P2-016, P2-017, P2-018) --- # RÉSUMÉ EXÉCUTIF ## Statut global: 🔮 **NON PRODUCTION-READY** ### Bloqueurs (P0): 4 - Build cassĂ© (conflit SQLx) - SĂ©curitĂ© JWT faible - Panics en production - Validation JWT incomplĂšte ### Critiques (P1): 10 - SQL injection potentielle - Rate limiting manquant - CORS non configurĂ© - Secrets dans logs - Performance WebSocket ### AmĂ©liorations (P2): 10 - ObservabilitĂ© incomplĂšte - Robustesse (circuit breakers, timeouts) - Code mort ### CosmĂ©tiques (P3): 6 - Documentation - Tests - Refactors ## Estimation totale - **P0**: 4.5h (1 sprint) - **P1**: 20h (2-3 sprints) - **P2**: 18h (2 sprints) - **P3**: 24h (3 sprints) **Total**: ~66.5h (~8-9 jours de travail) ## Recommandation **PrioritĂ© immĂ©diate**: Fixer P0 (build + sĂ©curitĂ©) avant toute autre chose. **Roadmap suggĂ©rĂ©e**: 1. **Sprint 1**: P0 complet (build + sĂ©curitĂ© critique) 2. **Sprint 2-3**: P1 sĂ©curitĂ© (rate limiting, CORS, validation) 3. **Sprint 4-5**: P1 performance + P2 observabilitĂ© 4. **Sprint 6+**: P2 robustesse + P3 refactors --- **Fin du rapport d'audit**