[ { "id": "FRONT-001", "type": "SECURITY", "severity": "CRITICAL", "blocking_production": true, "file": "vite.config.ts", "line": 64, "description": "CSP contient 'unsafe-inline' et 'unsafe-eval' dans script-src, permettant l'injection de scripts malveillants", "fix_recommendation": "Supprimer 'unsafe-inline' et 'unsafe-eval', utiliser des nonces CSP stricts pour tous les scripts inline" }, { "id": "FRONT-002", "type": "SECURITY", "severity": "CRITICAL", "blocking_production": true, "file": "src/services/tokenStorage.ts", "line": 21, "description": "Tokens JWT stockés dans localStorage, vulnérables au vol via XSS", "fix_recommendation": "Migrer vers httpOnly cookies (nécessite backend) ou utiliser sessionStorage avec rotation fréquente des tokens" }, { "id": "FRONT-003", "type": "SECURITY", "severity": "HIGH", "blocking_production": false, "file": "src/features/chat/components/ChatMessages.tsx", "line": 102, "description": "Utilisation de dangerouslySetInnerHTML pour afficher les messages de chat, risque XSS si sanitisation échoue", "fix_recommendation": "Vérifier que sanitizeChatMessage est robuste, considérer une alternative comme un parser markdown sécurisé" }, { "id": "FRONT-004", "type": "SECURITY", "severity": "HIGH", "blocking_production": false, "file": "src/features/chat/components/VirtualizedChatMessages.tsx", "line": 79, "description": "Utilisation de dangerouslySetInnerHTML pour afficher les messages de chat, risque XSS si sanitisation échoue", "fix_recommendation": "Vérifier que sanitizeChatMessage est robuste, considérer une alternative comme un parser markdown sécurisé" }, { "id": "FRONT-005", "type": "BUG", "severity": "HIGH", "blocking_production": false, "file": "src/services/api.ts", "line": 19, "description": "Hardcoding de 'http://localhost:8080/api/v1' comme fallback, risque de build de production avec URLs de développement", "fix_recommendation": "Supprimer le fallback localhost, forcer l'utilisation de variables d'environnement en production" }, { "id": "FRONT-006", "type": "BUG", "severity": "HIGH", "blocking_production": false, "file": "src/services/websocket.ts", "line": 47, "description": "Hardcoding de 'ws://localhost:8081/ws' comme fallback, risque de build de production avec URLs de développement", "fix_recommendation": "Supprimer le fallback localhost, forcer l'utilisation de variables d'environnement en production" }, { "id": "FRONT-007", "type": "BUG", "severity": "HIGH", "blocking_production": false, "file": "src/services/secure-auth.ts", "line": 53, "description": "Hardcoding de 'http://localhost:8080/api/v1' comme fallback, risque de build de production avec URLs de développement", "fix_recommendation": "Supprimer le fallback localhost, forcer l'utilisation de variables d'environnement en production" }, { "id": "FRONT-008", "type": "BUG", "severity": "HIGH", "blocking_production": false, "file": "src/services/tokenRefresh.ts", "line": 11, "description": "Hardcoding de 'http://localhost:8080/api/v1' comme fallback, risque de build de production avec URLs de développement", "fix_recommendation": "Supprimer le fallback localhost, forcer l'utilisation de variables d'environnement en production" }, { "id": "FRONT-009", "type": "UI_UX", "severity": "HIGH", "blocking_production": false, "file": "src/features/auth/components/LoginForm.tsx", "line": 47, "description": "Erreur de login loggée dans console.error mais pas toujours affichée à l'utilisateur de manière visible", "fix_recommendation": "S'assurer que toutes les erreurs sont affichées via un système de toast/notification visible" }, { "id": "FRONT-010", "type": "UI_UX", "severity": "HIGH", "blocking_production": false, "file": "src/features/auth/components/RegisterForm.tsx", "line": 58, "description": "Erreur d'inscription loggée dans console.error mais pas toujours affichée à l'utilisateur de manière visible", "fix_recommendation": "S'assurer que toutes les erreurs sont affichées via un système de toast/notification visible" }, { "id": "FRONT-011", "type": "TYPESCRIPT", "severity": "MEDIUM", "blocking_production": false, "file": "src/utils/csp.ts", "line": 157, "description": "Utilisation de 'any' pour les paramètres de middleware, perte de sécurité de type", "fix_recommendation": "Typer correctement les paramètres req, res, next avec les types Express/Node appropriés" }, { "id": "FRONT-012", "type": "TYPESCRIPT", "severity": "MEDIUM", "blocking_production": false, "file": "src/types/api.ts", "line": 70, "description": "Utilisation excessive de 'any' dans les types API, perte de sécurité de type", "fix_recommendation": "Définir des interfaces strictes pour tous les types de données API" }, { "id": "FRONT-013", "type": "PERFORMANCE", "severity": "MEDIUM", "blocking_production": false, "file": "src/features/chat/hooks/useChat.ts", "line": 34, "description": "console.log dans le code de production, pollution des logs", "fix_recommendation": "Remplacer par un logger conditionnel basé sur import.meta.env.DEV" }, { "id": "FRONT-014", "type": "PERFORMANCE", "severity": "MEDIUM", "blocking_production": false, "file": "src/features/chat/hooks/useChat.ts", "line": 62, "description": "console.log dans le code de production, pollution des logs", "fix_recommendation": "Remplacer par un logger conditionnel basé sur import.meta.env.DEV" }, { "id": "FRONT-015", "type": "PERFORMANCE", "severity": "MEDIUM", "blocking_production": false, "file": "src/features/chat/hooks/useChat.ts", "line": 68, "description": "console.error dans le code de production, pollution des logs", "fix_recommendation": "Remplacer par un logger conditionnel basé sur import.meta.env.DEV" }, { "id": "FRONT-016", "type": "PERFORMANCE", "severity": "MEDIUM", "blocking_production": false, "file": "src/features/chat/hooks/useChat.ts", "line": 99, "description": "console.warn dans le code de production, pollution des logs", "fix_recommendation": "Remplacer par un logger conditionnel basé sur import.meta.env.DEV" }, { "id": "FRONT-017", "type": "PERFORMANCE", "severity": "MEDIUM", "blocking_production": false, "file": "src/features/chat/hooks/useChat.ts", "line": 133, "description": "console.error dans le code de production, pollution des logs", "fix_recommendation": "Remplacer par un logger conditionnel basé sur import.meta.env.DEV" }, { "id": "FRONT-018", "type": "UI_UX", "severity": "MEDIUM", "blocking_production": false, "file": "src/features/chat/hooks/useChat.ts", "line": 124, "description": "TODO: Add fetchHistory function - fonctionnalité manquante", "fix_recommendation": "Implémenter la fonction fetchHistory ou documenter pourquoi elle n'est pas nécessaire" }, { "id": "FRONT-019", "type": "UI_UX", "severity": "MEDIUM", "blocking_production": false, "file": "src/features/chat/components/ChatSidebar.tsx", "line": 110, "description": "TODO: Button to create new conversation - fonctionnalité manquante", "fix_recommendation": "Implémenter le bouton de création de conversation ou le retirer du code" }, { "id": "FRONT-020", "type": "UI_UX", "severity": "MEDIUM", "blocking_production": false, "file": "src/services/websocket.ts", "line": 191, "description": "TODO: Implement removal for other event types if needed - code incomplet", "fix_recommendation": "Implémenter la logique complète ou documenter pourquoi elle n'est pas nécessaire" }, { "id": "FRONT-021", "type": "UI_UX", "severity": "MEDIUM", "blocking_production": false, "file": "src/features/tracks/components/TrackSearchResults.tsx", "line": 128, "description": "TODO: Implement play functionality - fonctionnalité manquante", "fix_recommendation": "Implémenter la fonctionnalité de lecture ou retirer le code" }, { "id": "FRONT-022", "type": "UI_UX", "severity": "MEDIUM", "blocking_production": false, "file": "src/features/profile/components/FollowButton.tsx", "line": 29, "description": "TODO: Call API to follow/unfollow - fonctionnalité manquante", "fix_recommendation": "Implémenter l'appel API pour suivre/ne plus suivre un utilisateur" }, { "id": "FRONT-023", "type": "UI_UX", "severity": "MEDIUM", "blocking_production": false, "file": "src/features/playlists/services/playlistService.ts", "line": 198, "description": "TODO: Replace with actual API call when backend is ready - code mock", "fix_recommendation": "Remplacer par l'appel API réel ou documenter le statut du backend" }, { "id": "FRONT-024", "type": "UI_UX", "severity": "MEDIUM", "blocking_production": false, "file": "src/features/playlists/components/PlaylistAnalytics.tsx", "line": 60, "description": "TODO: T0491 - Remplacer par l'appel API réel une fois le backend implémenté", "fix_recommendation": "Implémenter l'appel API réel ou documenter le statut" }, { "id": "FRONT-025", "type": "UI_UX", "severity": "MEDIUM", "blocking_production": false, "file": "src/features/library/pages/LibraryPage.tsx", "line": 40, "description": "TODO: Show toast success - feedback utilisateur manquant", "fix_recommendation": "Ajouter un toast de succès pour informer l'utilisateur" }, { "id": "FRONT-026", "type": "UI_UX", "severity": "MEDIUM", "blocking_production": false, "file": "src/features/library/pages/LibraryPage.tsx", "line": 43, "description": "TODO: Show toast error - feedback utilisateur manquant", "fix_recommendation": "Ajouter un toast d'erreur pour informer l'utilisateur" }, { "id": "FRONT-027", "type": "UI_UX", "severity": "MEDIUM", "blocking_production": false, "file": "src/features/library/components/LibraryManager.tsx", "line": 257, "description": "isLiked={() => false} // Todo - fonctionnalité incomplète", "fix_recommendation": "Implémenter la logique de vérification du statut 'liked'" }, { "id": "FRONT-028", "type": "UI_UX", "severity": "MEDIUM", "blocking_production": false, "file": "src/features/chat/components/ChatInterface.tsx", "line": 9, "description": "TODO: wsService should be replaced with websocketService or a proper chat service", "fix_recommendation": "Refactoriser pour utiliser le service WebSocket approprié" }, { "id": "FRONT-029", "type": "PERFORMANCE", "severity": "LOW", "blocking_production": false, "file": "src/features/library/components/LibraryManager.tsx", "line": 112, "description": "console.log('Edit track', originalTrack); // Temporary - code temporaire à supprimer", "fix_recommendation": "Supprimer ce console.log temporaire ou implémenter la fonctionnalité d'édition" }, { "id": "FRONT-030", "type": "PERFORMANCE", "severity": "LOW", "blocking_production": false, "file": "src/config/env.ts", "line": 37, "description": "console.error dans le code de production, devrait utiliser un logger", "fix_recommendation": "Remplacer par un logger conditionnel basé sur import.meta.env.DEV" }, { "id": "FRONT-031", "type": "PERFORMANCE", "severity": "LOW", "blocking_production": false, "file": "src/components/ErrorBoundary.tsx", "line": 40, "description": "console.error dans le code de production, acceptable pour ErrorBoundary mais devrait être conditionnel", "fix_recommendation": "Garder pour ErrorBoundary mais considérer un service de logging externe en production" }, { "id": "FRONT-032", "type": "PERFORMANCE", "severity": "LOW", "blocking_production": false, "file": "src/stores/auth.ts", "line": 87, "description": "console.error dans le code de production, pollution des logs", "fix_recommendation": "Remplacer par un logger conditionnel basé sur import.meta.env.DEV" }, { "id": "FRONT-033", "type": "PERFORMANCE", "severity": "LOW", "blocking_production": false, "file": "src/services/api/auth.ts", "line": 138, "description": "console.warn dans le code de production, pollution des logs", "fix_recommendation": "Remplacer par un logger conditionnel basé sur import.meta.env.DEV" }, { "id": "FRONT-034", "type": "PERFORMANCE", "severity": "LOW", "blocking_production": false, "file": "src/features/player/hooks/useStreamSync.ts", "line": 66, "description": "console.log dans le code de production, pollution des logs", "fix_recommendation": "Remplacer par un logger conditionnel basé sur import.meta.env.DEV" }, { "id": "FRONT-035", "type": "PERFORMANCE", "severity": "LOW", "blocking_production": false, "file": "src/features/player/hooks/useStreamSync.ts", "line": 82, "description": "console.error dans le code de production, pollution des logs", "fix_recommendation": "Remplacer par un logger conditionnel basé sur import.meta.env.DEV" }, { "id": "FRONT-036", "type": "PERFORMANCE", "severity": "LOW", "blocking_production": false, "file": "src/services/api.ts", "line": 414, "description": "console.error dans le code de production, pollution des logs", "fix_recommendation": "Remplacer par un logger conditionnel basé sur import.meta.env.DEV" }, { "id": "FRONT-037", "type": "PERFORMANCE", "severity": "LOW", "blocking_production": false, "file": "src/services/secure-auth.ts", "line": 89, "description": "console.debug dans le code de production, pollution des logs", "fix_recommendation": "Remplacer par un logger conditionnel basé sur import.meta.env.DEV" }, { "id": "FRONT-038", "type": "PERFORMANCE", "severity": "LOW", "blocking_production": false, "file": "src/services/secure-auth.ts", "line": 94, "description": "console.warn dans le code de production, pollution des logs", "fix_recommendation": "Remplacer par un logger conditionnel basé sur import.meta.env.DEV" }, { "id": "FRONT-039", "type": "PERFORMANCE", "severity": "LOW", "blocking_production": false, "file": "src/services/secure-auth.ts", "line": 139, "description": "console.debug dans le code de production, pollution des logs", "fix_recommendation": "Remplacer par un logger conditionnel basé sur import.meta.env.DEV" }, { "id": "FRONT-040", "type": "PERFORMANCE", "severity": "LOW", "blocking_production": false, "file": "src/services/secure-auth.ts", "line": 142, "description": "console.error dans le code de production, pollution des logs", "fix_recommendation": "Remplacer par un logger conditionnel basé sur import.meta.env.DEV" }, { "id": "FRONT-041", "type": "PERFORMANCE", "severity": "LOW", "blocking_production": false, "file": "src/services/secure-auth.ts", "line": 183, "description": "console.debug dans le code de production, pollution des logs", "fix_recommendation": "Remplacer par un logger conditionnel basé sur import.meta.env.DEV" }, { "id": "FRONT-042", "type": "PERFORMANCE", "severity": "LOW", "blocking_production": false, "file": "src/services/secure-auth.ts", "line": 186, "description": "console.error dans le code de production, pollution des logs", "fix_recommendation": "Remplacer par un logger conditionnel basé sur import.meta.env.DEV" }, { "id": "FRONT-043", "type": "PERFORMANCE", "severity": "LOW", "blocking_production": false, "file": "src/services/secure-auth.ts", "line": 206, "description": "console.warn dans le code de production, pollution des logs", "fix_recommendation": "Remplacer par un logger conditionnel basé sur import.meta.env.DEV" }, { "id": "FRONT-044", "type": "PERFORMANCE", "severity": "LOW", "blocking_production": false, "file": "src/services/secure-auth.ts", "line": 236, "description": "console.warn dans le code de production, pollution des logs", "fix_recommendation": "Remplacer par un logger conditionnel basé sur import.meta.env.DEV" }, { "id": "FRONT-045", "type": "PERFORMANCE", "severity": "LOW", "blocking_production": false, "file": "src/services/secure-auth.ts", "line": 269, "description": "console.error dans le code de production, pollution des logs", "fix_recommendation": "Remplacer par un logger conditionnel basé sur import.meta.env.DEV" }, { "id": "FRONT-046", "type": "BUG", "severity": "MEDIUM", "blocking_production": false, "file": "src/config/constants.ts", "line": 7, "description": "Fallback hardcodé vers 127.0.0.1, devrait utiliser uniquement les variables d'environnement en production", "fix_recommendation": "Supprimer les fallbacks localhost/127.0.0.1 ou les rendre conditionnels (dev uniquement)" }, { "id": "FRONT-047", "type": "BUG", "severity": "MEDIUM", "blocking_production": false, "file": "src/config/env.ts", "line": 6, "description": "Fallback hardcodé vers 127.0.0.1, devrait utiliser uniquement les variables d'environnement en production", "fix_recommendation": "Supprimer les fallbacks localhost/127.0.0.1 ou les rendre conditionnels (dev uniquement)" }, { "id": "FRONT-048", "type": "UI_UX", "severity": "MEDIUM", "blocking_production": false, "file": "src/stores/chat.ts", "line": 248, "description": "Erreur lors du chargement des conversations loggée mais pas affichée à l'utilisateur", "fix_recommendation": "Afficher un toast/notification d'erreur à l'utilisateur" }, { "id": "FRONT-049", "type": "UI_UX", "severity": "MEDIUM", "blocking_production": false, "file": "src/stores/chat.ts", "line": 269, "description": "Erreur lors de la création de conversation loggée mais pas affichée à l'utilisateur", "fix_recommendation": "Afficher un toast/notification d'erreur à l'utilisateur" }, { "id": "FRONT-050", "type": "UI_UX", "severity": "MEDIUM", "blocking_production": false, "file": "src/features/streaming/hooks/usePlaybackRealtime.ts", "line": 147, "description": "Hardcoding de 'http://localhost:8080' comme fallback pour l'URL API", "fix_recommendation": "Supprimer le fallback localhost, forcer l'utilisation de variables d'environnement" } ]