diff --git a/apply-production-fixes.js b/apply-production-fixes.js new file mode 100644 index 0000000..8dd93ab --- /dev/null +++ b/apply-production-fixes.js @@ -0,0 +1,146 @@ +#!/usr/bin/env node + +/** + * Script pour appliquer les corrections 403 employés sur votre serveur de production privé + * Ce script documente les changements à effectuer manuellement sur votre serveur + */ + +console.log('🔧 === CORRECTIONS À APPLIQUER SUR VOTRE SERVEUR DE PRODUCTION ===\n'); + +console.log('📝 FICHIERS À MODIFIER SUR VOTRE SERVEUR PRIVÉ:'); +console.log('================================================\n'); + +console.log('1️⃣ FICHIER: shared/permissions.ts'); +console.log('-----------------------------------'); +console.log('LIGNE À MODIFIER (environ ligne 84-91):'); +console.log(''); +console.log('// REMPLACER:'); +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\'] // ← PROBLÈME ICI'); +console.log('}'); +console.log(''); +console.log('// PAR:'); +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('}'); +console.log('\n'); + +console.log('2️⃣ FICHIER: server/routes.ts'); +console.log('-----------------------------'); +console.log('CORRECTIONS MULTIPLES À EFFECTUER:\n'); + +console.log('A) Route GET /api/suppliers (environ ligne 188-194):'); +console.log('// REMPLACER:'); +console.log('if (!user || (user.role !== \'admin\' && user.role !== \'manager\')) {'); +console.log(' return res.status(403).json({ message: "Insufficient permissions" });'); +console.log('}'); +console.log(''); +console.log('// PAR:'); +console.log('if (!user || (user.role !== \'admin\' && user.role !== \'manager\' && user.role !== \'directeur\' && user.role !== \'employee\')) {'); +console.log(' return res.status(403).json({ message: "Insufficient permissions" });'); +console.log('}'); +console.log('\n'); + +console.log('B) Route POST /api/suppliers (environ ligne 240-242):'); +console.log('// REMPLACER:'); +console.log('if (user.role !== \'admin\' && user.role !== \'manager\') {'); +console.log(' console.error(\'❌ Insufficient permissions:\', { userRole: user.role, required: [\'admin\', \'manager\'] });'); +console.log(' return res.status(403).json({ message: "Insufficient permissions" });'); +console.log('}'); +console.log(''); +console.log('// PAR:'); +console.log('if (user.role !== \'admin\' && user.role !== \'manager\' && user.role !== \'directeur\') {'); +console.log(' console.error(\'❌ Insufficient permissions:\', { userRole: user.role, required: [\'admin\', \'manager\', \'directeur\'] });'); +console.log(' return res.status(403).json({ message: "Insufficient permissions" });'); +console.log('}'); +console.log('\n'); + +console.log('C) Route PUT /api/suppliers/:id (environ ligne 281-283):'); +console.log('// REMPLACER:'); +console.log('if (!user || (user.role !== \'admin\' && user.role !== \'manager\')) {'); +console.log(' return res.status(403).json({ message: "Insufficient permissions" });'); +console.log('}'); +console.log(''); +console.log('// PAR:'); +console.log('if (!user || (user.role !== \'admin\' && user.role !== \'manager\' && user.role !== \'directeur\')) {'); +console.log(' return res.status(403).json({ message: "Insufficient permissions" });'); +console.log('}'); +console.log('\n'); + +console.log('D) Route DELETE /api/suppliers/:id (environ ligne 298-300):'); +console.log('// REMPLACER:'); +console.log('if (!user || (user.role !== \'admin\' && user.role !== \'manager\')) {'); +console.log(' return res.status(403).json({ message: "Insufficient permissions" });'); +console.log('}'); +console.log(''); +console.log('// PAR:'); +console.log('if (!user || (user.role !== \'admin\' && user.role !== \'directeur\')) {'); +console.log(' return res.status(403).json({ message: "Insufficient permissions" });'); +console.log('}'); +console.log('\n'); + +console.log('E) Route POST /api/dlc-products/:id/validate (environ ligne 2332-2334):'); +console.log('// REMPLACER:'); +console.log('if (!user || ![\'admin\', \'manager\'].includes(user.role)) {'); +console.log(' return res.status(403).json({ message: "Insufficient permissions to validate products" });'); +console.log('}'); +console.log(''); +console.log('// PAR:'); +console.log('if (!user || ![\'admin\', \'manager\', \'directeur\'].includes(user.role)) {'); +console.log(' return res.status(403).json({ message: "Insufficient permissions to validate products" });'); +console.log('}'); +console.log('\n'); + +console.log('📋 ÉTAPES D\'APPLICATION:'); +console.log('========================'); +console.log('1. Connectez-vous à votre serveur de production'); +console.log('2. Sauvegardez les fichiers originaux:'); +console.log(' cp shared/permissions.ts shared/permissions.ts.backup'); +console.log(' cp server/routes.ts server/routes.ts.backup'); +console.log('3. Ouvrez shared/permissions.ts et effectuez la correction 1️⃣'); +console.log('4. Ouvrez server/routes.ts et effectuez les corrections 2️⃣A à 2️⃣E'); +console.log('5. Redémarrez votre serveur Node.js'); +console.log('6. Testez avec un compte employé'); +console.log('\n'); + +console.log('🧪 COMMANDES DE TEST POST-CORRECTION:'); +console.log('===================================='); +console.log('# Test rapide des fournisseurs pour employé:'); +console.log('curl -X GET "https://votre-serveur.com/api/suppliers" \\'); +console.log(' -H "Cookie: session=TOKEN_SESSION_EMPLOYE"'); +console.log(''); +console.log('# Test création tâche pour employé:'); +console.log('curl -X POST "https://votre-serveur.com/api/tasks" \\'); +console.log(' -H "Content-Type: application/json" \\'); +console.log(' -H "Cookie: session=TOKEN_SESSION_EMPLOYE" \\'); +console.log(' -d \'{"title":"Test","description":"Test employé","priority":"medium","status":"pending","groupId":1}\''); +console.log('\n'); + +console.log('✅ RÉSULTAT ATTENDU APRÈS CORRECTIONS:'); +console.log('======================================'); +console.log('- Employés peuvent accéder aux fournisseurs (modules Commandes Client et DLC)'); +console.log('- Employés peuvent créer des tâches dans leurs magasins assignés'); +console.log('- Directeurs peuvent valider les produits DLC'); +console.log('- Plus d\'erreurs 403 pour les actions autorisées'); +console.log('\n'); + +console.log('⚠️ REMARQUES IMPORTANTES:'); +console.log('=========================='); +console.log('- Ces corrections doivent être appliquées sur votre serveur de production'); +console.log('- Testez d\'abord sur un environnement de staging si possible'); +console.log('- Gardez les sauvegardes des fichiers originaux'); +console.log('- Redémarrez le serveur après les modifications'); +console.log('- Surveillez les logs après les changements'); +console.log('\n'); + +console.log('🎯 Ces corrections résolvent spécifiquement:'); +console.log('- Erreurs 403 sur /api/suppliers pour employés'); +console.log('- Erreurs 403 sur /api/tasks POST pour employés'); +console.log('- Erreurs 403 sur /api/dlc-products/:id/validate pour directeurs'); +console.log('- Permissions incohérentes entre frontend et backend'); \ No newline at end of file diff --git a/production-patch-employee-403.patch b/production-patch-employee-403.patch new file mode 100644 index 0000000..32184ac --- /dev/null +++ b/production-patch-employee-403.patch @@ -0,0 +1,63 @@ +diff --git a/shared/permissions.ts b/shared/permissions.ts +index 1234567..abcdefg 100644 +--- a/shared/permissions.ts ++++ b/shared/permissions.ts +@@ -84,7 +84,7 @@ export const PERMISSIONS: Record> = { + tasks: { + admin: ['view', 'create', 'edit', 'delete', 'validate'], + directeur: ['view', 'create', 'edit', 'delete', 'validate'], + manager: ['view', 'validate'], +- employee: ['view'] ++ employee: ['view', 'create'] + } + }; + +diff --git a/server/routes.ts b/server/routes.ts +index 1234567..abcdefg 100644 +--- a/server/routes.ts ++++ b/server/routes.ts +@@ -188,7 +188,7 @@ export function createRoutes(app: Express, storage: IStorage, isAuthenticated: + app.get('/api/suppliers', isAuthenticated, async (req: any, res) => { + try { + const user = await storage.getUser(req.user.claims ? req.user.claims.sub : req.user.id); +- if (!user || (user.role !== 'admin' && user.role !== 'manager')) { ++ if (!user || (user.role !== 'admin' && user.role !== 'manager' && user.role !== 'directeur' && user.role !== 'employee')) { + return res.status(403).json({ message: "Insufficient permissions" }); + } + +@@ -240,7 +240,7 @@ export function createRoutes(app: Express, storage: IStorage, isAuthenticated: + console.log('✅ User found:', { username: user.username, role: user.role }); + + // Vérifier les permissions +- if (user.role !== 'admin' && user.role !== 'manager') { ++ if (user.role !== 'admin' && user.role !== 'manager' && user.role !== 'directeur') { +- console.error('❌ Insufficient permissions:', { userRole: user.role, required: ['admin', 'manager'] }); ++ console.error('❌ Insufficient permissions:', { userRole: user.role, required: ['admin', 'manager', 'directeur'] }); + return res.status(403).json({ message: "Insufficient permissions" }); + } + +@@ -281,7 +281,7 @@ export function createRoutes(app: Express, storage: IStorage, isAuthenticated: + app.put('/api/suppliers/:id', isAuthenticated, async (req: any, res) => { + try { + const user = await storage.getUser(req.user.claims ? req.user.claims.sub : req.user.id); +- if (!user || (user.role !== 'admin' && user.role !== 'manager')) { ++ if (!user || (user.role !== 'admin' && user.role !== 'manager' && user.role !== 'directeur')) { + return res.status(403).json({ message: "Insufficient permissions" }); + } + +@@ -298,7 +298,7 @@ export function createRoutes(app: Express, storage: IStorage, isAuthenticated: + app.delete('/api/suppliers/:id', isAuthenticated, async (req: any, res) => { + try { + const user = await storage.getUser(req.user.claims ? req.user.claims.sub : req.user.id); +- if (!user || (user.role !== 'admin' && user.role !== 'manager')) { ++ if (!user || (user.role !== 'admin' && user.role !== 'directeur')) { + return res.status(403).json({ message: "Insufficient permissions" }); + } + +@@ -2332,7 +2332,7 @@ export function createRoutes(app: Express, storage: IStorage, isAuthenticated: + const user = await storage.getUser(userId); + +- if (!user || !['admin', 'manager'].includes(user.role)) { ++ if (!user || !['admin', 'manager', 'directeur'].includes(user.role)) { + return res.status(403).json({ message: "Insufficient permissions to validate products" }); + } \ No newline at end of file