Files
LogiFlow/debug-employee-403-production.js
T
michaelschal 072ad60ec1 Grant employees access to system features and tasks
Adjust permissions for employee role to access tasks and supplier data, and allow directors to validate DLC products.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: b163d4c0-de5e-4f4e-a9c0-aed4c7049718
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/1957c339-2757-4d1f-8e92-e9f71a1ce58e/b163d4c0-de5e-4f4e-a9c0-aed4c7049718/69xEJ3P
2025-08-12 08:56:22 +00:00

192 lines
7.3 KiB
JavaScript

#!/usr/bin/env node
/**
* Script de débogage pour identifier les erreurs 403 des employés en production
* Analyse les routes et permissions pour diagnostiquer les problèmes d'accès
*/
const https = require('https');
// Configuration pour le serveur de production
const PRODUCTION_URL = process.env.PRODUCTION_URL || 'https://votre-serveur-production.com';
const TEST_EMPLOYEE_CREDENTIALS = {
username: process.env.TEST_EMPLOYEE_USERNAME || 'test_employee',
password: process.env.TEST_EMPLOYEE_PASSWORD || 'password123'
};
console.log('🐛 === DÉBOGAGE ERREURS 403 EMPLOYÉS EN PRODUCTION ===\n');
// Routes susceptibles de poser problème pour les employés
const ROUTES_TO_TEST = [
{ path: '/api/tasks', method: 'GET', description: 'Liste des tâches' },
{ path: '/api/tasks', method: 'POST', description: 'Création de tâche', data: { title: 'Test', description: 'Test', priority: 'medium', status: 'pending', groupId: 1 } },
{ path: '/api/suppliers', method: 'GET', description: 'Liste des fournisseurs' },
{ path: '/api/suppliers?dlc=true', method: 'GET', description: 'Fournisseurs DLC' },
{ path: '/api/groups', method: 'GET', description: 'Liste des groupes/magasins' },
{ path: '/api/customer-orders', method: 'GET', description: 'Commandes client' },
{ path: '/api/dlc-products', method: 'GET', description: 'Produits DLC' },
{ path: '/api/user', method: 'GET', description: 'Profil utilisateur' }
];
async function makeRequest(path, method = 'GET', data = null, cookies = '') {
return new Promise((resolve, reject) => {
const url = new URL(path, PRODUCTION_URL);
const options = {
hostname: url.hostname,
port: url.port || (url.protocol === 'https:' ? 443 : 80),
path: url.pathname + url.search,
method: method,
headers: {
'Content-Type': 'application/json',
'User-Agent': 'LogiFlow-Debug-Script/1.0',
...(cookies ? { 'Cookie': cookies } : {}),
...(data ? { 'Content-Length': Buffer.byteLength(JSON.stringify(data)) } : {})
}
};
const req = https.request(options, (res) => {
let body = '';
res.on('data', (chunk) => body += chunk);
res.on('end', () => {
try {
const parsed = JSON.parse(body);
resolve({
status: res.statusCode,
headers: res.headers,
data: parsed
});
} catch (e) {
resolve({
status: res.statusCode,
headers: res.headers,
data: body
});
}
});
});
req.on('error', reject);
if (data) {
req.write(JSON.stringify(data));
}
req.end();
});
}
async function debugEmployee403Errors() {
try {
console.log('1️⃣ Connexion avec compte employé...');
// Connexion employé
const loginResponse = await makeRequest('/api/login', 'POST', TEST_EMPLOYEE_CREDENTIALS);
if (loginResponse.status !== 200) {
console.error('❌ Échec de connexion employé');
console.error(` Status: ${loginResponse.status}`);
console.error(` Response: ${JSON.stringify(loginResponse.data, null, 2)}`);
return;
}
console.log('✅ Connexion employé réussie\n');
// Extraire les cookies de session
const setCookieHeaders = loginResponse.headers['set-cookie'] || [];
const cookies = setCookieHeaders.join('; ');
console.log('2️⃣ Test des routes susceptibles de générer des erreurs 403...\n');
const results = [];
// Tester chaque route
for (const route of ROUTES_TO_TEST) {
console.log(`🔍 Test: ${route.method} ${route.path} - ${route.description}`);
try {
const response = await makeRequest(route.path, route.method, route.data, cookies);
const status = response.status;
const statusIcon = status === 200 ? '✅' : status === 403 ? '❌' : '⚠️';
console.log(` ${statusIcon} Status: ${status}`);
if (status === 403) {
console.log(` 🚫 ERREUR 403: ${JSON.stringify(response.data, null, 2)}`);
results.push({ route, status, error: response.data, success: false });
} else if (status === 200) {
const dataSize = Array.isArray(response.data) ? response.data.length : 'N/A';
console.log(` 📊 Données retournées: ${dataSize} éléments`);
results.push({ route, status, success: true });
} else {
console.log(` ⚠️ Status inattendu: ${JSON.stringify(response.data, null, 2)}`);
results.push({ route, status, error: response.data, success: false });
}
} catch (error) {
console.log(` 💥 Erreur réseau: ${error.message}`);
results.push({ route, status: 'ERROR', error: error.message, success: false });
}
console.log(''); // Ligne vide entre les tests
}
// Résumé des résultats
console.log('📊 === RÉSUMÉ DES TESTS ===');
console.log('==========================\n');
const successfulRoutes = results.filter(r => r.success);
const forbiddenRoutes = results.filter(r => r.status === 403);
const errorRoutes = results.filter(r => !r.success && r.status !== 403);
console.log(`✅ Routes accessibles: ${successfulRoutes.length}/${results.length}`);
console.log(`❌ Erreurs 403: ${forbiddenRoutes.length}/${results.length}`);
console.log(`⚠️ Autres erreurs: ${errorRoutes.length}/${results.length}\n`);
if (forbiddenRoutes.length > 0) {
console.log('🚫 ROUTES BLOQUÉES (403):');
forbiddenRoutes.forEach(result => {
console.log(` • ${result.route.method} ${result.route.path} - ${result.route.description}`);
console.log(` Erreur: ${result.error?.message || 'Permission refusée'}`);
});
console.log('');
}
if (errorRoutes.length > 0) {
console.log('⚠️ AUTRES ERREURS:');
errorRoutes.forEach(result => {
console.log(` • ${result.route.method} ${result.route.path} - Status: ${result.status}`);
console.log(` Erreur: ${result.error?.message || result.error}`);
});
console.log('');
}
console.log('💡 RECOMMANDATIONS:');
if (forbiddenRoutes.length === 0) {
console.log(' 🎉 Aucune erreur 403 détectée - les permissions semblent correctes !');
} else {
console.log(' 1. Vérifiez les permissions dans shared/permissions.ts');
console.log(' 2. Vérifiez les middlewares de permission dans server/permissions.ts');
console.log(' 3. Vérifiez l\'assignation de groupes/magasins à l\'employé');
console.log(' 4. Examinez les logs serveur pendant l\'exécution des requêtes');
}
} catch (error) {
console.error('💥 Erreur lors du débogage:', error.message);
}
}
// Instructions d'utilisation
console.log('📋 Instructions:');
console.log('1. Configurez les variables d\'environnement:');
console.log(' - PRODUCTION_URL=https://votre-serveur.com');
console.log(' - TEST_EMPLOYEE_USERNAME=nom_utilisateur_employe');
console.log(' - TEST_EMPLOYEE_PASSWORD=mot_de_passe');
console.log('2. Exécutez: node debug-employee-403-production.js\n');
// Exécuter le debug si le script est appelé directement
if (require.main === module) {
debugEmployee403Errors().catch(console.error);
}
module.exports = { debugEmployee403Errors };