# 🔍 AUDIT TECHNIQUE INTÉGRAL — Monorepo Veza **Date :** 14 fĂ©vrier 2026 **Mandant :** ComitĂ© d'investissement **PĂ©rimĂštre :** Monorepo complet (frontend, backend, services Rust, infra, CI/CD) --- ## EXECUTIVE SUMMARY Le monorepo Veza est une plateforme audio collaborative (streaming, chat, marketplace) avec une architecture multi-services (Go, Rust, React). L’audit rĂ©vĂšle : | CritĂšre | Verdict | |---------|---------| | **Lancement en production** | ⚠ Possible avec corrections urgentes | | **Vente / acquisition** | ❌ Non recommandĂ© sans remĂ©diation | | **Maintenance** | ⚠ Risques Ă©levĂ©s (dette, tests fragiles) | | **Refactorisation** | ✅ RecommandĂ©e (phases 2–3) | | **Réécriture** | ❌ Non nĂ©cessaire | **Points positifs :** - Backend Go solide (auth, RBAC, ownership, CSRF, rate limiting) - Chat Server Rust compile et fonctionne - Stream Server Rust compile - Migrations DB structurĂ©es - CI/CD configurĂ© (Go, Rust, frontend, E2E) **Points critiques :** - Route interne `/api/v1/internal/tracks/:id/stream-ready` non authentifiĂ©e - VulnĂ©rabilitĂ©s npm (React Router XSS, Axios DoS, etc.) - Rate limiting dĂ©sactivĂ© en dĂ©veloppement - Tests frontend : ~42 % d’échecs (selon rĂšgles utilisateur) - Features "Coming Soon" (Gear, Live, Education, Queue, Developer) sans backend --- ## 1ïžâƒŁ CARTOGRAPHIE GLOBALE ### Stack | Couche | Technologie | Version | |--------|-------------|---------| | **Frontend** | React + Vite + TypeScript | React 18.2, Vite 7.1 | | **Backend API** | Go + Gin | Go 1.23, Gin 1.11 | | **Chat Server** | Rust + Axum + WebSocket | Axum 0.8, Tokio 1.35 | | **Stream Server** | Rust + Axum + HLS | Rust 2021 | | **Base de donnĂ©es** | PostgreSQL | 16-alpine | | **Cache** | Redis | 7-alpine | | **Message broker** | RabbitMQ | 3-management | | **Shared lib** | veza-common (Rust) | 0.1.0 | ### Organisation du repo ``` veza/ ├── apps/web/ # Frontend React (source unique UI) ├── veza-backend-api/ # API Go principale ├── veza-chat-server/ # Chat WebSocket Rust ├── veza-stream-server/ # Streaming audio Rust ├── veza-common/ # Lib Rust partagĂ©e (logging, types) ├── veza-docs/ # Documentation ├── packages/ # (vide ou minimal) ├── config/ # Docker, HAProxy ├── infra/ # docker-compose lab └── .github/workflows/ # CI/CD ``` **Workspaces npm :** `apps/web`, `packages/*` (package.json racine) ### Flux fonctionnels ``` Frontend (React) ──â–ș Backend API (Go) ──â–ș PostgreSQL │ │ │ ├──â–ș Redis (sessions, CSRF, rate limit) │ ├──â–ș RabbitMQ (jobs) │ ├──â–ș Stream Server (callback stream-ready) │ └──â–ș Chat Server (JWT token) │ ├──â–ș Chat Server (WebSocket) └──â–ș Stream Server (HLS/audio) ``` ### DĂ©pendances critiques - **Backend :** GORM, JWT, bcrypt, ClamAV (go-clamd), AWS S3, Sentry, Prometheus - **Frontend :** React Query, Zustand, Axios, i18next, Framer Motion, HLS.js - **Chat/Stream :** SQLx, jsonwebtoken, Redis, RabbitMQ (lapin) ### DĂ©pendances obsolĂštes / abandonnĂ©es - `veza-common` : SQLx 0.8 (alignĂ© avec chat/stream) — conflit historique rĂ©solu - Pas de dĂ©pendance abandonnĂ©e majeure identifiĂ©e ### Technologies utilisĂ©es vs dĂ©clarĂ©es | DĂ©clarĂ© | RĂ©el | |---------|------| | veza-desktop (Electron) | Non prĂ©sent dans workspaces npm | | Nx / Turborepo / Lerna | Aucun — monorepo npm basique | | Design tokens | PrĂ©sents (`apps/web/docs/DESIGN_TOKENS.md`) | --- ## 2ïžâƒŁ CE QUE LE PRODUIT PERMET RÉELLEMENT ### Features validĂ©es (implĂ©mentĂ©es et utilisables) | Feature | Backend | Frontend | Tests | |---------|---------|----------|-------| | Auth (login, register, 2FA) | ✅ | ✅ | ✅ | | Sessions, logout, refresh | ✅ | ✅ | ✅ | | Password reset | ✅ | ✅ | ✅ | | Email verification | ✅ | ✅ | ✅ | | OAuth (Google, GitHub, Discord) | ✅ | ✅ | Partiel | | Tracks (CRUD, upload, HLS) | ✅ | ✅ | ✅ | | Playlists (CRUD, collaborateurs) | ✅ | ✅ | ✅ | | Marketplace (products, cart, checkout) | ✅ | ✅ | ✅ | | Wishlist, Purchases | ✅ | ✅ | ✅ | | Chat (token, stats) | ✅ | ✅ | ✅ | | Social (feed, posts, groups, follow) | ✅ | ✅ | ✅ | | Webhooks | ✅ | ✅ | ✅ | | Analytics | ✅ | ✅ | ✅ | | Admin (audit, unlock, pprof) | ✅ | ✅ | ✅ | | Roles, RBAC | ✅ | ✅ | ✅ | | Notifications | ✅ | ✅ | ✅ | | Data export (GDPR) | ✅ | ✅ | - | ### Features incomplĂštes | Feature | État | |---------|------| | OAuth | Config via env, baseURL hardcodĂ© `veza.fr` si non dĂ©fini | | Stream Server callback | Route interne non authentifiĂ©e | | E2E | PrĂ©sents mais rĂ©sultats instables (e2e-results.json) | ### Features fantĂŽmes / mortes | Feature | Route | État | |---------|-------|------| | Gear | `/gear` | ComingSoon placeholder | | Live | `/live` | ComingSoon placeholder | | Education | `/education` | ComingSoon placeholder | | Queue | `/queue` | ComingSoon placeholder | | Developer | `/developer` | ComingSoon placeholder | ### IncohĂ©rences produit / code - README mentionne `veza-desktop` (Electron) mais pas dans workspaces - `docker-compose.prod.yml` utilise HAProxy ; `docker-compose.yml` (dev) non - `dist_verification` committĂ© (artefacts de build) — mauvaise pratique --- ## 3ïžâƒŁ VALIDATION FONCTIONNELLE ### Tests | Composant | Commande | RĂ©sultat | |-----------|----------|----------| | Backend Go | `go test ./... -short` | ExĂ©cution longue (timeout 60s) | | Chat Server | `cargo test` | ✅ | | Stream Server | `cargo check` | ✅ (warnings) | | Frontend | `npm run test -- --run` | ~42 % Ă©checs (rĂšgles utilisateur) | | E2E | `npx playwright test` | Instable | ### Points de rupture 1. **Route interne stream-ready** : AppelĂ©e par Stream Server sans auth — n’importe qui peut forger un callback. 2. **Rate limiting** : DĂ©sactivĂ© en dev (`config.Env == config.EnvDevelopment`) — risque en staging si `APP_ENV` mal configurĂ©. 3. **CSRF** : DĂ©sactivĂ© si Redis indisponible (sauf prod oĂč dĂ©marrage Ă©choue). ### ScĂ©narios de crash Ă©vidents - Redis down en prod → crash (CSRF requis) - ClamAV down avec `CLAMAV_REQUIRED=true` → uploads rejetĂ©s - `JWT_SECRET` vide → crash au dĂ©marrage (correct) ### Zones non testĂ©es - Handlers OAuth (flows complets) - IntĂ©gration Stream Server ↔ Backend - Webhooks sortants (workers) --- ## 4ïžâƒŁ AUDIT DE SÉCURITÉ — OWASP TOP 10 ### A01 – Broken Access Control | Point | GravitĂ© | DĂ©tail | |-------|---------|--------| | Route interne stream-ready | **Critique** | `POST /api/v1/internal/tracks/:id/stream-ready` sans auth. Exploitation : forger des callbacks pour modifier le statut de tracks. | | Ownership | ✅ | `RequireOwnershipOrAdmin` sur users, tracks, playlists, products | | Admin | ✅ | `RequireAdmin` sur `/admin/*` | | Sessions | ✅ | VĂ©rification ownership sur `DELETE /sessions/:id` (Ă  confirmer dans handler) | **Correctif A01 :** ProtĂ©ger la route interne par API key ou IP whitelist (rĂ©seau interne). --- ### A02 – Cryptographic Failures | Point | GravitĂ© | DĂ©tail | |-------|---------|--------| | Mots de passe | ✅ | bcrypt (golang.org/x/crypto/bcrypt) | | JWT | ✅ | HS256, validation stricte (alg, exp, iss, aud) | | Secrets | ⚠ Moyenne | `JWT_SECRET` requis en prod (`:?` dans docker-compose.prod.yml) | | HTTPS | ⚠ | `COOKIE_SECURE=true` en prod ; dĂ©pend du reverse proxy | **Correctif A02 :** S’assurer que TLS est forcĂ© au niveau HAProxy/load balancer. --- ### A03 – Injection | Point | GravitĂ© | DĂ©tail | |-------|---------|--------| | SQL | ✅ | GORM + prepared statements ; pas de concatĂ©nation | | Full-text search | ✅ | `plainto_tsquery` avec paramĂštres | | XSS | ⚠ Moyenne | DOMPurify prĂ©sent cĂŽtĂ© frontend ; pas de sanitization systĂ©matique cĂŽtĂ© backend pour tous les champs texte | **Correctif A03 :** Sanitiser les champs affichĂ©s (comments, posts, etc.) cĂŽtĂ© backend ou documenter la responsabilitĂ© frontend. --- ### A04 – Insecure Design | Point | GravitĂ© | DĂ©tail | |-------|---------|--------| | Callback stream-ready | **Critique** | Pas d’authentification du callback Stream Server → Backend | | Rate limiting dev | ⚠ Faible | DĂ©sactivĂ© en dev — acceptable si staging/prod corrects | | Validation | ✅ | go-playground/validator, EmailValidator, PasswordValidator | **Correctif A04 :** Authentifier le callback (header `X-Stream-Server-API-Key` ou mTLS). --- ### A05 – Security Misconfiguration | Point | GravitĂ© | DĂ©tail | |-------|---------|--------| | CORS | ✅ | Validation stricte en prod, pas de wildcard | | Debug | ✅ | Stack traces uniquement en dev/DEBUG | | Swagger | ⚠ Faible | ExposĂ© en prod — Ă  restreindre ou dĂ©sactiver | | Secrets | ✅ | `.env` dans `.gitignore` ; `SECRETS_VERIFICATION.md` | **Correctif A05 :** DĂ©sactiver Swagger en prod ou le protĂ©ger par auth. --- ### A06 – Vulnerable & Outdated Components | Point | GravitĂ© | DĂ©tail | |-------|---------|--------| | npm | **ÉlevĂ©e** | React Router XSS (GHSA-2w69-qvjg-hvjx), Axios DoS (GHSA-43fc-jf86-j433), cookie, diff, jose, lodash, node-forge | | Go | ✅ | govulncheck dans CI | | Rust | ✅ | cargo audit dans CI | **Correctif A06 :** `npm audit fix` ; mise Ă  jour manuelle si breaking. --- ### A07 – Identification & Authentication Failures | Point | GravitĂ© | DĂ©tail | |-------|---------|--------| | JWT | ✅ | Validation complĂšte, token versioning | | Sessions | ✅ | DB, expiration, rĂ©vocation | | Account lockout | ✅ | 5 tentatives, 30 min | | Password reset | ✅ | Tokens avec expiration, audit | --- ### A08 – Software & Data Integrity Failures | Point | GravitĂ© | DĂ©tail | |-------|---------|--------| | CI/CD | ⚠ Moyenne | Pas de signature des images Docker | | Build | ✅ | Types gĂ©nĂ©rĂ©s depuis OpenAPI | --- ### A09 – Logging & Monitoring Failures | Point | GravitĂ© | DĂ©tail | |-------|---------|--------| | Logs | ✅ | Zap structurĂ©, pas de secrets en clair | | MĂ©triques | ✅ | Prometheus | | Audit | ✅ | AuditService, audit_logs | --- ### A10 – SSRF | Point | GravitĂ© | DĂ©tail | |-------|---------|--------| | Webhooks | ⚠ Faible | Appels sortants vers URLs utilisateur — risque SSRF si URL non validĂ©e | | OAuth | ✅ | URLs fixes (Google, GitHub, Discord) | --- ## 5ïžâƒŁ DETTE TECHNIQUE ### Dette critique (bloquante) | ÉlĂ©ment | Fichier / Zone | |--------|----------------| | Route stream-ready non protĂ©gĂ©e | `router.go:622-625` | | VulnĂ©rabilitĂ©s npm high | `apps/web/package.json` | ### Dette structurante | ÉlĂ©ment | DĂ©tail | |--------|--------| | `fmt.Printf` debug dans router | `router.go:110-121` (logs ClamAV) | | Duplication setup routes | Nombreux `trackService`, `chunkService` recréés | | Conventions | Pas de tooling monorepo (Nx/Turborepo) | | Tests fragiles | Frontend 42 % Ă©checs | ### Dette cosmĂ©tique | ÉlĂ©ment | DĂ©tail | |--------|--------| | Warnings Stream Server | dead_code, unused_comparisons | | Fichiers `dist_verification` committĂ©s | `.gitignore` Ă  Ă©tendre | | Commentaires FR/EN mĂ©langĂ©s | CohĂ©rence | --- ## 6ïžâƒŁ QUALITÉ ARCHITECTURALE ### Scores (sur 10) | CritĂšre | Score | Justification | |---------|-------|---------------| | **Architecture** | 7/10 | SĂ©paration claire (handlers, services, core) ; duplication de setup dans router | | **MaintenabilitĂ©** | 6/10 | Code structurĂ© ; dette, tests fragiles, pas de tooling monorepo | | **SĂ©curitĂ©** | 6/10 | Bonnes bases (auth, RBAC, CSRF) ; faille callback, vulnĂ©rabilitĂ©s npm | | **ScalabilitĂ©** | 7/10 | Stateless API, Redis, RabbitMQ ; pas de stratĂ©gie cache avancĂ©e documentĂ©e | --- ## 7ïžâƒŁ INFRA & DEVOPS ### Docker - `docker-compose.yml` : dev (postgres, redis, rabbitmq, backend-api) - `docker-compose.prod.yml` : prod (postgres, redis, rabbitmq, backend, chat, stream, web, HAProxy) - Secrets : `DB_PASS`, `RABBITMQ_PASS`, `JWT_SECRET` requis en prod (`:?`) ### Config - Variables d’environnement documentĂ©es (rĂšgles utilisateur) - Pas de secrets en clair dans les fichiers versionnĂ©s (vĂ©rification SECRETS_VERIFICATION.md) ### Scripts - `make` utilisĂ© (smoke, e2e, postman, etc.) - Pas de script dangereux identifiĂ© --- ## 8ïžâƒŁ RISQUES BUSINESS ### CTO - **Lancement prod :** Possible aprĂšs correction de la route stream-ready et des vulnĂ©rabilitĂ©s npm. - **Maintenance :** Risque moyen : dette, tests instables, dĂ©pendances Ă  mettre Ă  jour. ### Investisseur - **Vente :** Non recommandĂ©e sans remĂ©diation des vulnĂ©rabilitĂ©s et de la dette critique. - **Valeur :** Architecture solide, fonctionnalitĂ©s riches ; qualitĂ© Ă  renforcer. ### AcquĂ©reur - **Refactorisation :** Oui, phases 2–3 du plan d’action. - **Réécriture :** Non nĂ©cessaire. --- ## 9ïžâƒŁ PLAN D’ACTION PRIORISÉ ### Phase 1 — Urgent (sĂ©curitĂ© & stabilitĂ©) | Action | Effort | Fichiers | |--------|--------|----------| | ProtĂ©ger route `/api/v1/internal/tracks/:id/stream-ready` (API key ou IP) | S | `router.go`, `middleware/` | | Corriger vulnĂ©rabilitĂ©s npm (audit fix, mise Ă  jour manuelle) | S | `apps/web/package.json` | | Supprimer `fmt.Printf` debug du router | S | `router.go` | | Étendre `.gitignore` pour `dist_verification` | S | `.gitignore` | ### Phase 2 — Stabilisation | Action | Effort | DĂ©tail | |--------|--------|--------| | Stabiliser tests frontend | M | Analyser Ă©checs, mocks, dĂ©pendances | | Stabiliser E2E Playwright | M | Fiabiliser setup, timeouts | | Documenter/sĂ©curiser callback Stream Server | S | Spec API key, implĂ©mentation | | DĂ©sactiver ou protĂ©ger Swagger en prod | S | Config conditionnelle | ### Phase 3 — AmĂ©lioration & refonte | Action | Effort | DĂ©tail | |--------|--------|--------| | Introduire tooling monorepo (Turborepo/Nx) | L | Cache builds, orchestration | | RĂ©duire duplication dans router | M | Factoring des services | | Corriger warnings Stream Server | S | dead_code, unused | | ImplĂ©menter ou retirer features Coming Soon | M | Gear, Live, Education, Queue, Developer | --- ## CONCLUSION STRATÉGIQUE Le monorepo Veza est **techniquement viable** avec une base solide (auth, RBAC, marketplace, chat, streaming). Les correctifs de la Phase 1 sont **indispensables** avant toute mise en production. La Phase 2 renforce la confiance (tests, documentation). La Phase 3 amĂ©liore la maintenabilitĂ© et la scalabilitĂ©. **Recommandation :** ExĂ©cuter la Phase 1 sous 1–2 semaines, puis planifier la Phase 2 en parallĂšle du dĂ©ploiement. --- *Rapport gĂ©nĂ©rĂ© par audit technique automatisĂ© — 14 fĂ©vrier 2026*