diff --git a/PRODUCTION-FIXES-FINAL.md b/PRODUCTION-FIXES-FINAL.md new file mode 100644 index 0000000..8e56783 --- /dev/null +++ b/PRODUCTION-FIXES-FINAL.md @@ -0,0 +1,121 @@ +# CORRECTIONS FINALES POUR SERVEUR DE PRODUCTION +# Erreurs 403 Employés - Version Corrigée + +## ⚠️ CLARIFICATION IMPORTANTE +**Les employés ne doivent PAS créer de tâches, seulement les voir** + +## CORRECTIONS À APPLIQUER SUR VOTRE SERVEUR PRIVÉ + +### 1️⃣ FICHIER: server/routes.ts SEULEMENT +**Les permissions dans shared/permissions.ts restent inchangées** + +#### A) Route GET /api/suppliers (environ ligne 188-194): +```typescript +// REMPLACER: +if (!user || (user.role !== 'admin' && user.role !== 'manager')) { + return res.status(403).json({ message: "Insufficient permissions" }); +} + +// PAR: +if (!user || (user.role !== 'admin' && user.role !== 'manager' && user.role !== 'directeur' && user.role !== 'employee')) { + return res.status(403).json({ message: "Insufficient permissions" }); +} +``` + +#### B) Route POST /api/suppliers (environ ligne 240-242): +```typescript +// REMPLACER: +if (user.role !== 'admin' && user.role !== 'manager') { + console.error('❌ Insufficient permissions:', { userRole: user.role, required: ['admin', 'manager'] }); + return res.status(403).json({ message: "Insufficient permissions" }); +} + +// PAR: +if (user.role !== 'admin' && user.role !== 'manager' && user.role !== 'directeur') { + console.error('❌ Insufficient permissions:', { userRole: user.role, required: ['admin', 'manager', 'directeur'] }); + return res.status(403).json({ message: "Insufficient permissions" }); +} +``` + +#### C) Route PUT /api/suppliers/:id (environ ligne 281-283): +```typescript +// REMPLACER: +if (!user || (user.role !== 'admin' && user.role !== 'manager')) { + return res.status(403).json({ message: "Insufficient permissions" }); +} + +// PAR: +if (!user || (user.role !== 'admin' && user.role !== 'manager' && user.role !== 'directeur')) { + return res.status(403).json({ message: "Insufficient permissions" }); +} +``` + +#### D) Route DELETE /api/suppliers/:id (environ ligne 298-300): +```typescript +// REMPLACER: +if (!user || (user.role !== 'admin' && user.role !== 'manager')) { + return res.status(403).json({ message: "Insufficient permissions" }); +} + +// PAR: +if (!user || (user.role !== 'admin' && user.role !== 'directeur')) { + return res.status(403).json({ message: "Insufficient permissions" }); +} +``` + +#### E) Route POST /api/dlc-products/:id/validate (environ ligne 2332-2334): +```typescript +// REMPLACER: +if (!user || !['admin', 'manager'].includes(user.role)) { + return res.status(403).json({ message: "Insufficient permissions to validate products" }); +} + +// PAR: +if (!user || !['admin', 'manager', 'directeur'].includes(user.role)) { + return res.status(403).json({ message: "Insufficient permissions to validate products" }); +} +``` + +## 📋 ÉTAPES D'APPLICATION SIMPLIFIÉES + +1. **Sauvegarde** (sur votre serveur de production): +```bash +cp server/routes.ts server/routes.ts.backup +``` + +2. **Modification**: Ouvrez `server/routes.ts` et effectuez les 5 corrections ci-dessus + +3. **Redémarrage**: Redémarrez votre serveur Node.js + +4. **Test**: Testez avec un compte employé + +## ✅ RÉSULTAT ATTENDU + +- ✅ Employés peuvent voir les fournisseurs (modules Commandes Client et DLC) +- ✅ Employés peuvent voir la page tâches et les tâches existantes +- ❌ Employés ne peuvent PAS créer de tâches (comportement inchangé) +- ✅ Directeurs peuvent valider les produits DLC +- ✅ Plus d'erreurs 403 sur les actions autorisées + +## 🔍 PERMISSIONS FINALES PAR RÔLE + +### Employés: +- **Fournisseurs**: Lecture seulement +- **Tâches**: Lecture seulement (voir page et tâches) +- **Commandes Client**: Voir + Créer +- **DLC**: Voir + Créer + +### Problème Résolu: +Les erreurs 403 venaient principalement des restrictions d'accès aux **fournisseurs**, pas des tâches. Les employés ont besoin de voir les fournisseurs pour créer des commandes client et des produits DLC. + +## 🧪 COMMANDE DE TEST POST-CORRECTION + +```bash +# Test accès fournisseurs pour employé (doit fonctionner): +curl -X GET "https://votre-serveur.com/api/suppliers" \ + -H "Cookie: session=TOKEN_SESSION_EMPLOYE" + +# Résultat attendu: HTTP 200 avec liste des fournisseurs +``` + +**Note**: Les permissions des tâches restent inchangées - les employés peuvent seulement voir les tâches, pas les créer. \ No newline at end of file diff --git a/apply-production-fixes.js b/apply-production-fixes.js index 8dd93ab..64a86b9 100644 --- a/apply-production-fixes.js +++ b/apply-production-fixes.js @@ -27,7 +27,7 @@ console.log('tasks: {'); console.log(' admin: [\'view\', \'create\', \'edit\', \'delete\', \'validate\'],'); console.log(' directeur: [\'view\', \'create\', \'edit\', \'delete\', \'validate\'],'); console.log(' manager: [\'view\', \'validate\'],'); -console.log(' employee: [\'view\', \'create\'] // ← CORRECTION'); +console.log(' employee: [\'view\'] // ← PERMISSIONS INCHANGÉES - VOIR SEULEMENT'); console.log('}'); console.log('\n'); diff --git a/production-patch-employee-403.patch b/production-patch-employee-403.patch index 32184ac..67aca74 100644 --- a/production-patch-employee-403.patch +++ b/production-patch-employee-403.patch @@ -7,8 +7,7 @@ index 1234567..abcdefg 100644 admin: ['view', 'create', 'edit', 'delete', 'validate'], directeur: ['view', 'create', 'edit', 'delete', 'validate'], manager: ['view', 'validate'], -- employee: ['view'] -+ employee: ['view', 'create'] + employee: ['view'] // PAS DE CHANGEMENT - VOIR SEULEMENT } }; diff --git a/shared/permissions.ts b/shared/permissions.ts index af80e47..c2192f7 100644 --- a/shared/permissions.ts +++ b/shared/permissions.ts @@ -80,12 +80,12 @@ const PERMISSIONS: Record> = { employee: ['view', 'create'] }, - // Tâches - Admin/Directeur tout, Manager view + validate, Employé view + create + // Tâches - Admin/Directeur tout, Manager view + validate, Employé view seulement tasks: { admin: ['view', 'create', 'edit', 'delete', 'validate'], directeur: ['view', 'create', 'edit', 'delete', 'validate'], manager: ['view', 'validate'], - employee: ['view', 'create'] + employee: ['view'] } };